helpops: fix umode handling

construct_umodebuf() can change the char->flag mapping (to restore an
orphaned mode). I don't love the use of a fake constant, so I think the
cleanest solution here is just to index user_modes with a macro for the
umode letter.
This commit is contained in:
Ed Kellett 2019-08-03 05:13:49 +01:00
parent 9ac0390734
commit 6c639159b0
No known key found for this signature in database
GPG key ID: CB9986DEF342FABC

View file

@ -39,7 +39,7 @@ mapi_hfn_list_av1 helpops_hfnlist[] = {
{ NULL, NULL } { NULL, NULL }
}; };
static int UMODE_HELPOPS = 0; #define UMODECHAR_HELPOPS 'H'
struct Message dehelper_msgtab = { struct Message dehelper_msgtab = {
"DEHELPER", 0, 0, 0, 0, "DEHELPER", 0, 0, 0, 0,
@ -92,7 +92,7 @@ do_dehelper(struct Client *source_p, struct Client *target_p)
{ {
const char *fakeparv[4]; const char *fakeparv[4];
if(!(target_p->umodes & UMODE_HELPOPS)) if(!(target_p->umodes & user_modes[UMODECHAR_HELPOPS]))
return; return;
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s is using DEHELPER on %s", sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s is using DEHELPER on %s",
@ -108,8 +108,7 @@ do_dehelper(struct Client *source_p, struct Client *target_p)
static int static int
_modinit(void) _modinit(void)
{ {
/* add the usermode to the available slot */ user_modes[UMODECHAR_HELPOPS] = find_umode_slot();
user_modes['H'] = UMODE_HELPOPS = find_umode_slot();
construct_umodebuf(); construct_umodebuf();
return 0; return 0;
@ -118,8 +117,7 @@ _modinit(void)
static void static void
_moddeinit(void) _moddeinit(void)
{ {
/* disable the umode and remove it from the available list */ user_modes[UMODECHAR_HELPOPS] = 0;
user_modes['H'] = UMODE_HELPOPS = 0;
construct_umodebuf(); construct_umodebuf();
} }
@ -172,7 +170,7 @@ helper_delete(struct Client *client_p)
static void static void
h_hdl_new_remote_user(struct Client *client_p) h_hdl_new_remote_user(struct Client *client_p)
{ {
if (client_p->umodes & UMODE_HELPOPS) if (client_p->umodes & user_modes[UMODECHAR_HELPOPS])
helper_add(client_p); helper_add(client_p);
} }
@ -181,7 +179,7 @@ recurse_client_exit(struct Client *client_p)
{ {
if (IsPerson(client_p)) if (IsPerson(client_p))
{ {
if (client_p->umodes & UMODE_HELPOPS) if (client_p->umodes & user_modes[UMODECHAR_HELPOPS])
helper_delete(client_p); helper_delete(client_p);
} }
else if (IsServer(client_p)) else if (IsServer(client_p))
@ -208,21 +206,21 @@ h_hdl_umode_changed(hook_data_umode_changed *hdata)
struct Client *source_p = hdata->client; struct Client *source_p = hdata->client;
/* didn't change +H umode, we don't need to do anything */ /* didn't change +H umode, we don't need to do anything */
if (!((hdata->oldumodes ^ source_p->umodes) & UMODE_HELPOPS)) if (!((hdata->oldumodes ^ source_p->umodes) & user_modes[UMODECHAR_HELPOPS]))
return; return;
if (source_p->umodes & UMODE_HELPOPS) if (source_p->umodes & user_modes[UMODECHAR_HELPOPS])
{ {
if (MyClient(source_p) && !HasPrivilege(source_p, "usermode:helpops")) if (MyClient(source_p) && !HasPrivilege(source_p, "usermode:helpops"))
{ {
source_p->umodes &= ~UMODE_HELPOPS; source_p->umodes &= ~user_modes[UMODECHAR_HELPOPS];
sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "usermode:helpops"); sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "usermode:helpops");
return; return;
} }
helper_add(source_p); helper_add(source_p);
} }
else if (!(source_p->umodes & UMODE_HELPOPS)) else if (!(source_p->umodes & user_modes[UMODECHAR_HELPOPS]))
helper_delete(source_p); helper_delete(source_p);
} }
@ -232,7 +230,7 @@ h_hdl_whois(hook_data_client *hdata)
struct Client *source_p = hdata->client; struct Client *source_p = hdata->client;
struct Client *target_p = hdata->target; struct Client *target_p = hdata->target;
if ((target_p->umodes & UMODE_HELPOPS) && EmptyString(target_p->user->away)) if ((target_p->umodes & user_modes[UMODECHAR_HELPOPS]) && EmptyString(target_p->user->away))
{ {
sendto_one_numeric(source_p, RPL_WHOISHELPOP, form_str(RPL_WHOISHELPOP), target_p->name); sendto_one_numeric(source_p, RPL_WHOISHELPOP, form_str(RPL_WHOISHELPOP), target_p->name);
} }