X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/4562c604897f18f08e1bee993d455d9c1774f9ad..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/m_challenge.c diff --git a/modules/m_challenge.c b/modules/m_challenge.c index ea7c1280..68070df7 100644 --- a/modules/m_challenge.c +++ b/modules/m_challenge.c @@ -100,7 +100,6 @@ cleanup_challenge(struct Client *target_p) /* * m_challenge - generate RSA challenge for wouldbe oper - * parv[0] = sender prefix * parv[1] = operator to challenge for, or +response * */ @@ -144,7 +143,8 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch 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)) @@ -173,8 +173,7 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch if(oper_p == NULL) { - sendto_one(source_p, form_str(ERR_NOOPERHOST), - me.name, source_p->name); + sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST)); ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s)", source_p->localClient->opername, source_p->name, source_p->username, source_p->host, @@ -205,7 +204,7 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch if(oper_p == NULL) { - sendto_one(source_p, form_str(ERR_NOOPERHOST), me.name, source_p->name); + sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST)); ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s)", parv[1], source_p->name, source_p->username, source_p->host, source_p->sockhost); @@ -223,6 +222,41 @@ m_challenge(struct Client *client_p, struct Client *source_p, int parc, const ch return 0; } + if(IsOperConfNeedSSL(oper_p) && !IsSSLClient(source_p)) + { + sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST)); + ilog(L_FOPER, "FAILED CHALLENGE (%s) by (%s!%s@%s) (%s) -- requires SSL/TLS", + parv[1], source_p->name, source_p->username, source_p->host, + source_p->sockhost); + + if(ConfigFileEntry.failed_oper_notice) + { + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "Failed CHALLENGE attempt - missing SSL/TLS by %s (%s@%s)", + source_p->name, source_p->username, source_p->host); + } + return 0; + } + + if (oper_p->certfp != NULL) + { + if (source_p->certfp == NULL || strcasecmp(source_p->certfp, oper_p->certfp)) + { + 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", + parv[1], source_p->name, + source_p->username, source_p->host, source_p->sockhost); + + if(ConfigFileEntry.failed_oper_notice) + { + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "Failed OPER attempt - client certificate fingerprint mismatch by %s (%s@%s)", + source_p->name, source_p->username, source_p->host); + } + return 0; + } + } + if(!generate_challenge(&challenge, &(source_p->localClient->challenge), oper_p->rsa_pubkey)) { char *chal = challenge;