X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/d3455e2c7e2f9040e1b7628d9cf52b26a24dcefc..b0e752b0f9572d4bdef62db949359a58a568d6f5:/modules/m_oper.c diff --git a/modules/m_oper.c b/modules/m_oper.c index 886da7c..b403b28 100644 --- a/modules/m_oper.c +++ b/modules/m_oper.c @@ -21,13 +21,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_oper.c 1483 2006-05-27 18:58:12Z jilles $ */ #include "stdinc.h" #include "client.h" #include "common.h" -#include "irc_string.h" +#include "match.h" #include "ircd.h" #include "numeric.h" #include "s_conf.h" @@ -52,11 +51,9 @@ mapi_clist_av1 oper_clist[] = { &oper_msgtab, NULL }; DECLARE_MODULE_AV1(oper, NULL, NULL, oper_clist, NULL, NULL, "$Revision: 1483 $"); static int match_oper_password(const char *password, struct oper_conf *oper_p); -extern char *crypt(); /* * m_oper - * parv[0] = sender prefix * parv[1] = oper name * parv[2] = oper password */ @@ -86,7 +83,7 @@ m_oper(struct Client *client_p, struct Client *source_p, int parc, const char *p 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)", name, source_p->name, source_p->username, source_p->host, source_p->sockhost); @@ -101,6 +98,41 @@ m_oper(struct Client *client_p, struct Client *source_p, int parc, const char *p return 0; } + if(IsOperConfNeedSSL(oper_p) && !IsSSLClient(source_p)) + { + sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST)); + ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s) -- requires SSL/TLS", + name, 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 - 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", + name, 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(match_oper_password(password, oper_p)) { oper_up(source_p, oper_p); @@ -156,7 +188,7 @@ match_oper_password(const char *password, struct oper_conf *oper_p) * the proper encrypted hash for comparison. */ if(!EmptyString(password)) - encr = crypt(password, oper_p->passwd); + encr = rb_crypt(password, oper_p->passwd); else encr = ""; }