/************************************************************************ * IRC - Internet Relay Chat, modules/m_oper.c * * Copyright (C) 2000-2003 TR-IRCD Development * * Copyright (C) 1990 Jarkko Oikarinen and * University of Oulu, Co Center * * See file AUTHORS in IRC package for additional names of * the programmers. * * This program is free softwmare; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "struct.h" #include "common.h" #include "sys.h" #include "h.h" #include "msg.h" #include "numeric.h" #include "s_conf.h" #include "throttle.h" #include "usermode.h" static struct Message _msgtab[] = { {MSG_OPER, 0, MAXPARA, M_SLOW, 0L, m_unregistered, m_oper, m_oper, m_ignore, m_ignore} }; static int log_oper = -1; #ifndef STATIC_MODULES char *_version = "$Revision: 1.3 $"; void _modinit(void) { mod_add_cmd(_msgtab); log_oper = logevent_register("oper", LOG_ALWAYS, LOG_LOGFILE, LOG_NOTICE, "OPER (%s) (%s) by (%s!%s@%s)"); } void _moddeinit(void) { mod_del_cmd(_msgtab); logevent_unregister(log_oper); } #else void m_oper_init(void) { mod_add_cmd(_msgtab); log_oper = logevent_register("oper", LOG_ALWAYS, LOG_LOGFILE, LOG_NOTICE, "OPER (%s) (%s) by (%s!%s@%s)"); } #endif static void report_privileges(aClient *cptr) { int l = 0; if (OPCanDie(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /die command"); l++; } if (OPCanRestart(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /restart command"); l++; } if (OPIsAdmin(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the module interface"); l++; } if (OPIsSAdmin(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /samode command"); l++; } if (OPIsGKLine(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /kline, /unkline, /gline, /ungline commands"); l++; } if (OPIsOpKill(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /kill command"); l++; } if (OPIsOperdo(cptr)) { send_me_numeric(cptr, RPL_OPERPRIVILEGES, cptr->name, "Allowed to use the /operdo command"); l++; } if (l) send_me_numeric(cptr, RPL_ENDOFPRIVLIST); } /* * * m_oper * parv[0] = sender prefix * parv[1] = oper name * * parv[2] = oper password */ int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aConfItem *aconf; char *name, *password, encr[PASSWDLEN]; int equal = 0; dlink_node *ptr; name = parc > 1 ? parv[1] : (char *) NULL; password = parc > 2 ? parv[2] : (char *) NULL; if (BadPtr(name) || BadPtr(password)) { send_me_numeric(sptr, ERR_NEEDMOREPARAMS, MSG_OPER); return 0; } if (IsAnOper(sptr)) { send_me_numeric(sptr, RPL_YOUREOPER); return 0; } if (!(sptr->user && sptr->user->real_oper_host)) { if (!(aconf = find_conf_exact(name, sptr->username, sptr->sockhost, CONF_OPERATOR)) && !(aconf = find_conf_exact(name, sptr->username, cptr->hostip, CONF_OPERATOR))) { send_me_numeric(sptr, ERR_NOOPERHOST); sendto_ops("Failed OPER attempt by %^C using uid [%s] - No matching hostname", sptr, name); return 0; } } else { if (!(aconf = find_conf_exact(name, sptr->username, sptr->user->real_oper_host, CONF_OPERATOR)) && !(aconf = find_conf_exact(name, sptr->username, sptr->user->real_oper_ip, CONF_OPERATOR))) { send_me_numeric(sptr, ERR_NOOPERHOST); sendto_ops("Failed OPER attempt by %^C using uid [%s] - No matching hostname", sptr, name); return 0; } } equal = !strcmp(aconf->passwd, calcpass(password, encr)); if ((aconf->status & CONF_OPERATOR) && equal && !attach_conf(sptr, aconf)) { int old = (sptr->umode & SEND_UMODES); SetOper(sptr); ptr = make_dlink_node(); dlinkAdd(sptr, ptr, &locoper_list); throttle_remove(sptr->hostip); sptr->umode |= OPER_UMODES; if (IsOperFakehost(sptr)) sptr->umode &= ~UMODE_x; sptr->oflag = aconf->port; if (OPIsSeeHidden(sptr)) sptr->umode |= UMODE_H; if (OPIsSAdmin(sptr)) sptr->umode |= UMODE_a; if (OPIsAdmin(sptr)) sptr->umode |= UMODE_A; Count.oper++; sendto_ops ("%^C is now operator (O) using host [%s] with uid [%K]", sptr, aconf->host, aconf); sendto_serv_butone(NULL, &me, TOK1_GLOBOPS, ":%^C is now operator (O) using host [%s] with uid [%K]", sptr, aconf->host, aconf); send_umode_out(cptr, sptr, old); send_me_numeric(sptr, RPL_YOUREOPER); report_privileges(sptr); sptr->pingval = get_client_ping(sptr); logevent_call(log_oper, name, encr, parv[0], sptr->user->username, sptr->sockhost); } else { detach_conf(sptr, aconf); send_me_numeric(sptr, ERR_PASSWDMISMATCH); sendto_ops("Failed OPER attempt by %^C using uid [%s] - Incorrect password", sptr, name); } return 0; }