X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/ed8b3d69acafe81decd6eeb0b93bac445425ec2e..fc939ca58f179a59fda915a9041e0fc1970cedab:/modules/m_challenge.c diff --git a/modules/m_challenge.c b/modules/m_challenge.c index 9a00607a..51b4fa4e 100644 --- a/modules/m_challenge.c +++ b/modules/m_challenge.c @@ -20,8 +20,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id: m_challenge.c 3161 2007-01-25 07:23:01Z nenolod $ */ #include "stdinc.h" @@ -60,7 +58,7 @@ static int challenge_load(void) { #ifndef STATIC_MODULES - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_ALL, "Challenge module not loaded because OpenSSL is not available."); ilog(L_MAIN, "Challenge module not loaded because OpenSSL is not available."); return -1; @@ -69,19 +67,26 @@ static int challenge_load(void) #endif } -DECLARE_MODULE_AV1(challenge, challenge_load, NULL, NULL, NULL, NULL, "$Revision: 3161 $"); +static const char challenge_desc[] = "Does nothing as OpenSSL was not enabled."; + +DECLARE_MODULE_AV2(challenge, challenge_load, NULL, NULL, NULL, NULL, NULL, NULL, challenge_desc); #else -static int m_challenge(struct Client *, struct Client *, int, const char **); +static int m_challenge(struct MsgBuf *, struct Client *, struct Client *, int, const char **); /* We have openssl support, so include /CHALLENGE */ struct Message challenge_msgtab = { - "CHALLENGE", 0, 0, 0, MFLG_SLOW, + "CHALLENGE", 0, 0, 0, 0, {mg_unreg, {m_challenge, 2}, mg_ignore, mg_ignore, mg_ignore, {m_challenge, 2}} }; mapi_clist_av1 challenge_clist[] = { &challenge_msgtab, NULL }; -DECLARE_MODULE_AV1(challenge, NULL, NULL, challenge_clist, NULL, NULL, "$Revision: 3161 $"); + +static const char challenge_desc[] = + "Provides the challenge-response facility used for becoming an IRC operator"; + + +DECLARE_MODULE_AV2(challenge, NULL, NULL, challenge_clist, NULL, NULL, NULL, NULL, challenge_desc); static int generate_challenge(char **r_challenge, char **r_response, RSA * key); @@ -90,7 +95,7 @@ cleanup_challenge(struct Client *target_p) { if(target_p->localClient == NULL) return; - + rb_free(target_p->localClient->challenge); rb_free(target_p->localClient->opername); target_p->localClient->challenge = NULL; @@ -101,14 +106,13 @@ cleanup_challenge(struct Client *target_p) /* * m_challenge - generate RSA challenge for wouldbe oper * parv[1] = operator to challenge for, or +response - * */ static int -m_challenge(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +m_challenge(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct oper_conf *oper_p; char *challenge = NULL; /* to placate gcc */ - char chal_line[CHALLENGE_WIDTH]; + char chal_line[CHALLENGE_WIDTH]; unsigned char *b_response; size_t cnt; int len = 0; @@ -140,10 +144,11 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch source_p->name, source_p->username, source_p->host); cleanup_challenge(source_p); - return 0; + return 0; } - b_response = rb_base64_decode((const unsigned char *)++parv[1], strlen(parv[1]), &len); + parv[1]++; + b_response = rb_base64_decode((const unsigned char *)parv[1], strlen(parv[1]), &len); if(len != SHA_DIGEST_LENGTH || memcmp(source_p->localClient->challenge, b_response, SHA_DIGEST_LENGTH)) @@ -166,8 +171,8 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch rb_free(b_response); - oper_p = find_oper_conf(source_p->username, source_p->orighost, - source_p->sockhost, + oper_p = find_oper_conf(source_p->username, source_p->orighost, + source_p->sockhost, source_p->localClient->opername); if(oper_p == NULL) @@ -191,14 +196,14 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch oper_up(source_p, oper_p); ilog(L_OPERED, "OPER %s by %s!%s@%s (%s)", - source_p->localClient->opername, source_p->name, + source_p->localClient->opername, source_p->name, source_p->username, source_p->host, source_p->sockhost); return 0; } cleanup_challenge(source_p); - oper_p = find_oper_conf(source_p->username, source_p->orighost, + oper_p = find_oper_conf(source_p->username, source_p->orighost, source_p->sockhost, parv[1]); if(oper_p == NULL) @@ -243,7 +248,7 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch { sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST)); ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s) -- client certificate fingerprint mismatch", - name, source_p->name, + parv[1], source_p->name, source_p->username, source_p->host, source_p->sockhost); if(ConfigFileEntry.failed_oper_notice) @@ -268,9 +273,9 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch chal += CHALLENGE_WIDTH - 1; else break; - + } - sendto_one(source_p, form_str(RPL_ENDOFRSACHALLENGE2), + sendto_one(source_p, form_str(RPL_ENDOFRSACHALLENGE2), me.name, source_p->name); rb_free(challenge); source_p->localClient->opername = rb_strdup(oper_p->name);