fix authenticate
This commit is contained in:
@@ -608,8 +608,12 @@ static void handle_irc_line(int si, const char *raw) {
|
|||||||
if (strcmp(m.cmd,"CAP")==0) {
|
if (strcmp(m.cmd,"CAP")==0) {
|
||||||
char sub[16]="";
|
char sub[16]="";
|
||||||
if (m.nparams>=2) str_upper(sub, m.params[1], sizeof(sub));
|
if (m.nparams>=2) str_upper(sub, m.params[1], sizeof(sub));
|
||||||
if (strcmp(sub,"ACK")==0 && strstr(m.trail,"sasl")) {
|
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");
|
srv_send_raw(si, "AUTHENTICATE PLAIN");
|
||||||
|
}
|
||||||
} else if (strcmp(sub,"NAK")==0) {
|
} else if (strcmp(sub,"NAK")==0) {
|
||||||
ev_simple(EV_ERROR, si, NULL, NULL, "Server rejected SASL CAP.");
|
ev_simple(EV_ERROR, si, NULL, NULL, "Server rejected SASL CAP.");
|
||||||
srv_sendf(si, "NICK %s", s->nick);
|
srv_sendf(si, "NICK %s", s->nick);
|
||||||
@@ -617,12 +621,31 @@ static void handle_irc_line(int si, const char *raw) {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strcmp(m.cmd,"AUTHENTICATE")==0 && strcmp(m.trail,"+")==0) {
|
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];
|
char payload[512];
|
||||||
int plen=snprintf(payload,sizeof(payload),"%s%c%s%c%s",
|
int ulen = strlen(s->sasl_user);
|
||||||
s->sasl_user,0,s->sasl_user,0,s->sasl_pass);
|
int plen_pass = strlen(s->sasl_pass);
|
||||||
char enc[700]; base64_encode((unsigned char*)payload,plen,enc);
|
/* 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);
|
srv_sendf(si, "AUTHENTICATE %s", enc);
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strcmp(m.cmd,"903")==0) {
|
if (strcmp(m.cmd,"903")==0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user