X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/428ca87b01ad6c0487b424ce478f775cb7d94519..460e7932744e7d48795875270a1a610a6a8dfa31:/modules/m_grant.c diff --git a/modules/m_grant.c b/modules/m_grant.c index d65db2e1..4681ee21 100644 --- a/modules/m_grant.c +++ b/modules/m_grant.c @@ -1,8 +1,6 @@ /* * Copyright (C) 2006 Jilles Tjoelker * Copyright (C) 2006 Stephen Bennett - * - * $Id$ */ #include "stdinc.h" @@ -15,22 +13,25 @@ #include "s_serv.h" #include "s_conf.h" #include "s_newconf.h" +#include "msgbuf.h" -static int mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]); -static int me_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]); +static void mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]); +static void me_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]); static int do_grant(struct Client *source_p, struct Client *target_p, const char *new_privset); struct Message grant_msgtab = { - "GRANT", 0, 0, 0, MFLG_SLOW, + "GRANT", 0, 0, 0, 0, { mg_ignore, mg_not_oper, mg_ignore, mg_ignore, {me_grant, 3}, {mo_grant, 3}} }; mapi_clist_av1 grant_clist[] = { &grant_msgtab, NULL }; -DECLARE_MODULE_AV1(grant, NULL, NULL, grant_clist, NULL, NULL, "$Revision$"); +static const char grant_desc[] = "Allows operators to set or remove operator privileges on other users"; -static int +DECLARE_MODULE_AV2(grant, NULL, NULL, grant_clist, NULL, NULL, NULL, NULL, grant_desc); + +static void mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; @@ -38,7 +39,7 @@ mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source if(!HasPrivilege(source_p, "oper:grant")) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "grant"); - return 0; + return; } target_p = find_named_person(parv[1]); @@ -46,7 +47,7 @@ mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); - return 0; + return; } if (MyClient(target_p)) @@ -59,11 +60,10 @@ mo_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source get_id(source_p, target_p), target_p->servptr->name, get_id(target_p, target_p), parv[2]); } - - return 0; } -static int me_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +static void +me_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; @@ -72,36 +72,31 @@ static int me_grant(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Cli { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); - return 0; - } - - if(!find_shared_conf(source_p->username, source_p->host, - source_p->servptr->name, SHARED_GRANT)) - { - sendto_one(source_p, ":%s NOTICE %s :You don't have an appropriate shared" - "block to grant privilege on this server.", me.name, source_p->name); - return 0; + return; } do_grant(source_p, target_p, parv[2]); - - return 0; } static int do_grant(struct Client *source_p, struct Client *target_p, const char *new_privset) { int dooper = 0, dodeoper = 0; - struct PrivilegeSet *privset = 0; + struct PrivilegeSet *privset = NULL, *old_privset = NULL; + + if (!IsPerson(source_p)) + { + /* This can only happen if a broken server sends us nonsense, so ignore it */ + return 0; + } - if (!strcmp(new_privset, "deoper")) + if (!strcasecmp(new_privset, "deoper")) { if (!IsOper(target_p)) { sendto_one_notice(source_p, ":You can't deoper someone who isn't an oper."); return 0; } - new_privset = "default"; dodeoper = 1; sendto_one_notice(target_p, ":%s is deopering you.", source_p->name); @@ -115,9 +110,15 @@ static int do_grant(struct Client *source_p, struct Client *target_p, const char return 0; } - if (privset == target_p->localClient->privset) + if (privset == target_p->user->privset) + { + sendto_one_notice(source_p, ":%s already has privilege set %s.", target_p->name, target_p->user->privset->name); + return 0; + } + + if (ConfigFileEntry.oper_secure_only && !IsSecureClient(target_p)) { - sendto_one_notice(source_p, ":%s already has privilege set %s.", target_p->name, target_p->localClient->privset->name); + sendto_one_notice(source_p, ":Cannot GRANT %s, opers must be using secure connections.", target_p->name); return 0; } } @@ -135,6 +136,11 @@ static int do_grant(struct Client *source_p, struct Client *target_p, const char sendto_one_notice(target_p, ":%s is changing your privilege set to %s", source_p->name, privset->name); sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s is changing the privilege set of %s to %s", get_oper_name(source_p), target_p->name, privset->name); } + + if (!IsOper(target_p)) + { + dooper = 1; + } } if (dodeoper) @@ -144,25 +150,43 @@ static int do_grant(struct Client *source_p, struct Client *target_p, const char modeparv[2] = "-o"; modeparv[3] = NULL; user_mode(target_p, target_p, 3, modeparv); + + return 0; } if (dooper) { - struct oper_conf oper; + struct oper_conf oper = {0}; oper.name = ""; - oper.umodes = 0; - oper.snomask = 0; oper.privset = privset; oper_up(target_p, &oper); } + else + { + if (privset != NULL) + privilegeset_ref(privset); + + if (target_p->user->privset != NULL) + old_privset = target_p->user->privset; - target_p->localClient->privset = privset; - const char *modeparv[4]; - modeparv[0] = modeparv[1] = target_p->name; - modeparv[2] = "+"; - modeparv[3] = NULL; - user_mode(target_p, target_p, 3, modeparv); + target_p->user->privset = privset; + + if (privset != NULL) + sendto_server(NULL, NULL, CAP_TS6, NOCAPS, ":%s OPER %s %s", + use_id(target_p), target_p->user->opername, privset->name); + + report_priv_change(target_p, old_privset, privset); + + if (old_privset != NULL) + privilegeset_unref(old_privset); + + const char *modeparv[4]; + modeparv[0] = modeparv[1] = target_p->name; + modeparv[2] = "+"; + modeparv[3] = NULL; + user_mode(target_p, target_p, 3, modeparv); + } return 0; }