aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremmett1 <me@emmett1.my>2026-04-06 22:41:48 +0800
committeremmett1 <me@emmett1.my>2026-04-06 22:41:48 +0800
commitf52d54ccc7383af9d029fb75efb91b7e20540c5f (patch)
tree92df4a135b7ca330b08bba4bcd3fdae80fc3d56a
parentde7d2508625dba686351375fdd956ffc690d35aa (diff)
fix authenticate
-rw-r--r--sirc.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/sirc.c b/sirc.c
index 37aa12c..7b7489f 100644
--- a/sirc.c
+++ b/sirc.c
@@ -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) {