diff options
| author | emmett1 <me@emmett1.my> | 2026-04-06 22:41:48 +0800 |
|---|---|---|
| committer | emmett1 <me@emmett1.my> | 2026-04-06 22:41:48 +0800 |
| commit | f52d54ccc7383af9d029fb75efb91b7e20540c5f (patch) | |
| tree | 92df4a135b7ca330b08bba4bcd3fdae80fc3d56a | |
| parent | de7d2508625dba686351375fdd956ffc690d35aa (diff) | |
fix authenticate
| -rw-r--r-- | sirc.c | 39 |
1 files changed, 31 insertions, 8 deletions
@@ -608,8 +608,12 @@ static void handle_irc_line(int si, const char *raw) { if (strcmp(m.cmd,"CAP")==0) { char sub[16]=""; if (m.nparams>=2) str_upper(sub, m.params[1], sizeof(sub)); - if (strcmp(sub,"ACK")==0 && strstr(m.trail,"sasl")) { - srv_send_raw(si, "AUTHENTICATE PLAIN"); + if (strcmp(sub,"ACK")==0) { + /* trail or last param may contain "sasl" */ + const char *caps = m.trail[0] ? m.trail : m.params[m.nparams-1]; + if (strstr(caps,"sasl")) { + srv_send_raw(si, "AUTHENTICATE PLAIN"); + } } else if (strcmp(sub,"NAK")==0) { ev_simple(EV_ERROR, si, NULL, NULL, "Server rejected SASL CAP."); srv_sendf(si, "NICK %s", s->nick); @@ -617,12 +621,31 @@ static void handle_irc_line(int si, const char *raw) { } return; } - if (strcmp(m.cmd,"AUTHENTICATE")==0 && strcmp(m.trail,"+")==0) { - char payload[512]; - int plen=snprintf(payload,sizeof(payload),"%s%c%s%c%s", - s->sasl_user,0,s->sasl_user,0,s->sasl_pass); - char enc[700]; base64_encode((unsigned char*)payload,plen,enc); - srv_sendf(si, "AUTHENTICATE %s", enc); + if (strcmp(m.cmd,"AUTHENTICATE")==0) { + /* server sends AUTHENTICATE + (trail or param) to prompt us */ + const char *challenge = m.trail[0] ? m.trail : + (m.nparams>0 ? m.params[0] : ""); + if (strcmp(challenge,"+")==0) { + /* build PLAIN payload: authzid\0authcid\0passwd + must use memcpy — sasl_user/pass may not contain \0 + but we need to embed \0 separators manually */ + char payload[512]; + int ulen = strlen(s->sasl_user); + int plen_pass = strlen(s->sasl_pass); + /* layout: [sasl_user]\0[sasl_user]\0[sasl_pass] */ + int total = ulen + 1 + ulen + 1 + plen_pass; + if (total < (int)sizeof(payload)) { + int pos = 0; + memcpy(payload + pos, s->sasl_user, ulen); pos += ulen; + payload[pos++] = '\0'; + memcpy(payload + pos, s->sasl_user, ulen); pos += ulen; + payload[pos++] = '\0'; + memcpy(payload + pos, s->sasl_pass, plen_pass); pos += plen_pass; + char enc[700]; + base64_encode((unsigned char*)payload, total, enc); + srv_sendf(si, "AUTHENTICATE %s", enc); + } + } return; } if (strcmp(m.cmd,"903")==0) { |
