free(raw);
return;
}
- else /* We only have PLAIN at the moment so next message must be credentials */
+ else
{
char *raw = NULL;
size_t rawlen = 0;
char *r = NULL;
unsigned int i = 0, c = 0;
struct handle_info *hi = NULL;
+ struct handle_info *hii = NULL;
static char buffer[256];
base64_decode_alloc(session->buf, session->buflen, &raw, &rawlen);
}
else
{
- snprintf(buffer, sizeof(buffer), "%s "FMT_TIME_T, hi->handle, hi->registered);
- log_module(NS_LOG, LOG_DEBUG, "SASL: Valid credentials supplied");
- irc_sasl(session->source, session->uid, "L", buffer);
- irc_sasl(session->source, session->uid, "D", "S");
+ if (*authzid && irccasecmp(authzid, authcid) && HANDLE_FLAGGED(hi, IMPERSONATE))
+ {
+ hii = hi;
+ hi = get_handle_info(authzid);
+ }
+ if (hi)
+ {
+ if (hii)
+ {
+ log_module(NS_LOG, LOG_DEBUG, "SASL: %s is ipersonating %s", hii->handle, hi->handle);
+ snprintf(buffer, sizeof(buffer), "%s "FMT_TIME_T, hii->handle, hii->registered);
+ irc_sasl(session->source, session->uid, "I", buffer);
+ }
+ log_module(NS_LOG, LOG_DEBUG, "SASL: Valid credentials supplied");
+ snprintf(buffer, sizeof(buffer), "%s "FMT_TIME_T, hi->handle, hi->registered);
+ irc_sasl(session->source, session->uid, "L", buffer);
+ irc_sasl(session->source, session->uid, "D", "S");
+ }
+ else
+ {
+ log_module(NS_LOG, LOG_DEBUG, "SASL: Invalid credentials supplied");
+ irc_sasl(session->source, session->uid, "D", "F");
+ }
}
}
for (i=0; handle_flags[i]; i++) {
handle_inverse_flags[(unsigned char)handle_flags[i]] = i + 1;
flag_access_levels[i] = 0;
+ /* ensure flag I requires a minimum of 999 if not set in the config */
+ if ((unsigned char)handle_flags[i] == 'I')
+ flag_access_levels[i] = 999;
}
conf_register_reload(nickserv_conf_read);
#define HI_FLAG_NETWORK_HELPER 0x00000100
#define HI_FLAG_BOT 0x00000200
#define HI_FLAG_AUTOHIDE 0x00000400
-#define HI_FLAG_ADVANCED 0x00000800
+#define HI_FLAG_IMPERSONATE 0x00000800
+#define HI_FLAG_ADVANCED 0x00001000
/* Flag characters for the above. First char is LSB, etc. */
-#define HANDLE_FLAGS "SphgscfnHbx"
+#define HANDLE_FLAGS "SphgscfnHbxI"
/* HI_STYLE_* go into handle_info.userlist_style */
#define HI_STYLE_NORMAL 'n'