From dd3c4ac4f43dd9dd89e7f6ea9003dbc1b7fa11aa Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Sun, 21 Jun 2015 20:37:53 +0200 Subject: [PATCH] Insert an extra parameter in UmodeAdd and SnomaskAdd to indicate "unset this on de-oper". Safer and better than in XYZ places in the code. --- include/h.h | 3 - include/modules.h | 22 ++++--- include/struct.h | 4 +- src/modules/snomasks/dccreject.c | 2 +- src/modules/usermodes/bot.c | 2 +- src/modules/usermodes/censor.c | 2 +- src/modules/usermodes/noctcp.c | 2 +- src/modules/usermodes/nokick.c | 2 +- src/modules/usermodes/privacy.c | 2 +- src/modules/usermodes/regonlymsg.c | 2 +- src/modules/usermodes/servicebot.c | 2 +- src/modules/usermodes/showwhois.c | 2 +- src/umodes.c | 97 +++++++++++------------------- 13 files changed, 58 insertions(+), 86 deletions(-) diff --git a/include/h.h b/include/h.h index 50e4087a4..605e39755 100644 --- a/include/h.h +++ b/include/h.h @@ -325,11 +325,8 @@ extern int hunt_server(aClient *, aClient *, char *, int, int, char **); extern aClient *next_client(aClient *, char *); extern int m_server_estab(aClient *); extern void umode_init(void); -extern long umode_get(char, int, int (*)(aClient *, int)); #define UMODE_GLOBAL 1 #define UMODE_LOCAL 0 -#define umode_lget(x) umode_get(x, 0, 0); -#define umode_gget(x) umode_get(x, 1, 0); extern int umode_allow_all(aClient *sptr, int what); extern int umode_allow_opers(aClient *sptr, int what); extern int umode_allow_none(aClient *sptr, int what); diff --git a/include/modules.h b/include/modules.h index 624c0e035..f50ad3749 100644 --- a/include/modules.h +++ b/include/modules.h @@ -112,19 +112,21 @@ typedef struct { #define MOBJ_VALIDATOR 0x4000 typedef struct { - long mode; - char flag; - int (*allowed)(aClient *sptr, int what); - char unloaded; - Module *owner; + long mode; /**< Mode mask */ + char flag; /**< Mode character */ + int unset_on_deoper; /**< When set to 1 then this user mode will be unset on de-oper */ + int (*allowed)(aClient *sptr, int what); /**< The 'is this user allowed to set this mode?' routine */ + char unloaded; /**< Internal flag to indicate module is being unloaded */ + Module *owner; /**< Module that owns this user mode */ } Umode; typedef struct { - long mode; - char flag; - int (*allowed)(aClient *sptr, int what); - char unloaded; - Module *owner; + long mode; /**< Snomask mask */ + char flag; /**< Snomask character */ + int unset_on_deoper; /**< When set to 1 then this snomask will be unset on de-oper */ + int (*allowed)(aClient *sptr, int what); /**< The 'is this user allowed to set this snomask?' routine */ + char unloaded; /**< Internal flag to indicate module is being unloaded */ + Module *owner; /**< Module that owns this snomask */ } Snomask; typedef enum ModDataType { MODDATATYPE_CLIENT=1, MODDATATYPE_CHANNEL=2, MODDATATYPE_MEMBER=3, MODDATATYPE_MEMBERSHIP=4 } ModDataType; diff --git a/include/struct.h b/include/struct.h index 25254bd4e..fab540dbc 100644 --- a/include/struct.h +++ b/include/struct.h @@ -916,10 +916,10 @@ extern MODVAR short Snomask_highest; extern MODVAR Cmode *Channelmode_Table; extern MODVAR unsigned short Channelmode_highest; -extern Umode *UmodeAdd(Module *module, char ch, int options, int (*allowed)(aClient *sptr, int what), long *mode); +extern Umode *UmodeAdd(Module *module, char ch, int options, int unset_on_deoper, int (*allowed)(aClient *sptr, int what), long *mode); extern void UmodeDel(Umode *umode); -extern Snomask *SnomaskAdd(Module *module, char ch, int (*allowed)(aClient *sptr, int what), long *mode); +extern Snomask *SnomaskAdd(Module *module, char ch, int unset_on_deoper, int (*allowed)(aClient *sptr, int what), long *mode); extern void SnomaskDel(Snomask *sno); extern Cmode *CmodeAdd(Module *reserved, CmodeInfo req, Cmode_t *mode); diff --git a/src/modules/snomasks/dccreject.c b/src/modules/snomasks/dccreject.c index 37cde6a61..848e21a64 100644 --- a/src/modules/snomasks/dccreject.c +++ b/src/modules/snomasks/dccreject.c @@ -42,7 +42,7 @@ DLLFUNC int MOD_TEST(dccreject)(ModuleInfo *modinfo) DLLFUNC int MOD_INIT(dccreject)(ModuleInfo *modinfo) { - SnomaskAdd(modinfo->handle, 'D', umode_allow_opers, &SNO_DCCREJECT); + SnomaskAdd(modinfo->handle, 'D', 1, umode_allow_opers, &SNO_DCCREJECT); HookAddEx(modinfo->handle, HOOKTYPE_DCC_DENIED, dccreject_dcc_denied); diff --git a/src/modules/usermodes/bot.c b/src/modules/usermodes/bot.c index 30f4d4347..6689b52d8 100644 --- a/src/modules/usermodes/bot.c +++ b/src/modules/usermodes/bot.c @@ -48,7 +48,7 @@ DLLFUNC int MOD_TEST(bot)(ModuleInfo *modinfo) DLLFUNC int MOD_INIT(bot)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'B', UMODE_GLOBAL, NULL, &UMODE_BOT); + UmodeAdd(modinfo->handle, 'B', UMODE_GLOBAL, 0, NULL, &UMODE_BOT); HookAddEx(modinfo->handle, HOOKTYPE_WHOIS, bot_whois); HookAddEx(modinfo->handle, HOOKTYPE_WHO_STATUS, bot_who_status); diff --git a/src/modules/usermodes/censor.c b/src/modules/usermodes/censor.c index 7acb978b3..6635ae316 100644 --- a/src/modules/usermodes/censor.c +++ b/src/modules/usermodes/censor.c @@ -65,7 +65,7 @@ DLLFUNC int MOD_INIT(censor)(ModuleInfo *modinfo) MARK_AS_OFFICIAL_MODULE(modinfo); - UmodeAdd(modinfo->handle, 'G', UMODE_GLOBAL, NULL, &UMODE_CENSOR); + UmodeAdd(modinfo->handle, 'G', UMODE_GLOBAL, 0, NULL, &UMODE_CENSOR); HookAddPCharEx(modinfo->handle, HOOKTYPE_PRE_USERMSG, censor_pre_usermsg); diff --git a/src/modules/usermodes/noctcp.c b/src/modules/usermodes/noctcp.c index f11291027..978549320 100644 --- a/src/modules/usermodes/noctcp.c +++ b/src/modules/usermodes/noctcp.c @@ -65,7 +65,7 @@ DLLFUNC int MOD_INIT(noctcp)(ModuleInfo *modinfo) { CmodeInfo req; - UmodeAdd(modinfo->handle, 'T', UMODE_GLOBAL, NULL, &UMODE_NOCTCP); + UmodeAdd(modinfo->handle, 'T', UMODE_GLOBAL, 0, NULL, &UMODE_NOCTCP); HookAddPCharEx(modinfo->handle, HOOKTYPE_PRE_USERMSG, noctcp_preusermsg); diff --git a/src/modules/usermodes/nokick.c b/src/modules/usermodes/nokick.c index 5ffa262e3..14e1dc2c9 100644 --- a/src/modules/usermodes/nokick.c +++ b/src/modules/usermodes/nokick.c @@ -45,7 +45,7 @@ DLLFUNC int MOD_TEST(nokick)(ModuleInfo *modinfo) DLLFUNC int MOD_INIT(nokick)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'q', UMODE_GLOBAL, umode_allow_opers, &UMODE_NOKICK); // TODO: limit more!! + UmodeAdd(modinfo->handle, 'q', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_NOKICK); // TODO: limit more!! HookAddEx(modinfo->handle, HOOKTYPE_CAN_KICK, nokick_can_kick); diff --git a/src/modules/usermodes/privacy.c b/src/modules/usermodes/privacy.c index 97b617245..8b9fb8bf5 100644 --- a/src/modules/usermodes/privacy.c +++ b/src/modules/usermodes/privacy.c @@ -39,7 +39,7 @@ int privacy_see_channel_in_whois(aClient *sptr, aClient *target, aChannel *chptr DLLFUNC int MOD_INIT(privacy)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'p', UMODE_GLOBAL, umode_allow_all, &UMODE_PRIVACY); + UmodeAdd(modinfo->handle, 'p', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_PRIVACY); HookAddEx(modinfo->handle, HOOKTYPE_SEE_CHANNEL_IN_WHOIS, privacy_see_channel_in_whois); diff --git a/src/modules/usermodes/regonlymsg.c b/src/modules/usermodes/regonlymsg.c index 2c19123fc..affd3bced 100644 --- a/src/modules/usermodes/regonlymsg.c +++ b/src/modules/usermodes/regonlymsg.c @@ -39,7 +39,7 @@ char *regonlymsg_pre_usermsg(aClient *sptr, aClient *target, char *text, int not DLLFUNC int MOD_INIT(regonlymsg)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'R', UMODE_GLOBAL, umode_allow_all, &UMODE_REGONLYMSG); + UmodeAdd(modinfo->handle, 'R', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_REGONLYMSG); HookAddPCharEx(modinfo->handle, HOOKTYPE_PRE_USERMSG, regonlymsg_pre_usermsg); diff --git a/src/modules/usermodes/servicebot.c b/src/modules/usermodes/servicebot.c index 3a43b5deb..20a3df98b 100644 --- a/src/modules/usermodes/servicebot.c +++ b/src/modules/usermodes/servicebot.c @@ -52,7 +52,7 @@ DLLFUNC int MOD_TEST(servicebot)(ModuleInfo *modinfo) DLLFUNC int MOD_INIT(servicebot)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'S', UMODE_GLOBAL, umode_allow_none, &UMODE_SERVICEBOT); + UmodeAdd(modinfo->handle, 'S', UMODE_GLOBAL, 1, umode_allow_none, &UMODE_SERVICEBOT); HookAddEx(modinfo->handle, HOOKTYPE_CAN_KICK, servicebot_can_kick); HookAddEx(modinfo->handle, HOOKTYPE_MODE_DEOP, servicebot_mode_deop); diff --git a/src/modules/usermodes/showwhois.c b/src/modules/usermodes/showwhois.c index af19de0ce..4305fd1f6 100644 --- a/src/modules/usermodes/showwhois.c +++ b/src/modules/usermodes/showwhois.c @@ -44,7 +44,7 @@ DLLFUNC int MOD_TEST(showwhois)(ModuleInfo *modinfo) DLLFUNC int MOD_INIT(showwhois)(ModuleInfo *modinfo) { - UmodeAdd(modinfo->handle, 'W', UMODE_GLOBAL, umode_allow_opers, &UMODE_SHOWWHOIS); + UmodeAdd(modinfo->handle, 'W', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_SHOWWHOIS); HookAddEx(modinfo->handle, HOOKTYPE_WHOIS, showwhois_whois); diff --git a/src/umodes.c b/src/umodes.c index 9a04c6bdb..216226645 100644 --- a/src/umodes.c +++ b/src/umodes.c @@ -111,44 +111,37 @@ void umode_init(void) Snomask_highest = 0; /* Set up modes */ - /* 2004-02-11: note: TODO: 'umode_allow_opers' is in most cases - * not completely correct since even opers shouldn't be allowed - * to set most of these flags (eg locop trying to set +N), - * it is currently handled by the m_umode() routine however, - * but it would be better if we get rid of that and switch - * completely to this umode->allowed system :). -- Syzop. - */ - UmodeAdd(NULL, 'i', UMODE_GLOBAL, NULL, &UMODE_INVISIBLE); - UmodeAdd(NULL, 'o', UMODE_GLOBAL, umode_allow_opers, &UMODE_OPER); - UmodeAdd(NULL, 'w', UMODE_GLOBAL, NULL, &UMODE_WALLOP); - UmodeAdd(NULL, 'g', UMODE_GLOBAL, umode_allow_opers, &UMODE_FAILOP); - UmodeAdd(NULL, 'r', UMODE_GLOBAL, NULL, &UMODE_REGNICK); - UmodeAdd(NULL, 'a', UMODE_GLOBAL, umode_allow_opers, &UMODE_SADMIN); - UmodeAdd(NULL, 'A', UMODE_GLOBAL, umode_allow_opers, &UMODE_ADMIN); - UmodeAdd(NULL, 's', UMODE_LOCAL, NULL, &UMODE_SERVNOTICE); - UmodeAdd(NULL, 'O', UMODE_LOCAL, umode_allow_opers, &UMODE_LOCOP); - UmodeAdd(NULL, 'x', UMODE_GLOBAL, NULL, &UMODE_HIDE); - UmodeAdd(NULL, 'N', UMODE_GLOBAL, umode_allow_opers, &UMODE_NETADMIN); - UmodeAdd(NULL, 'C', UMODE_GLOBAL, umode_allow_opers, &UMODE_COADMIN); - UmodeAdd(NULL, 'z', UMODE_GLOBAL, NULL, &UMODE_SECURE); - UmodeAdd(NULL, 'd', UMODE_GLOBAL, NULL, &UMODE_DEAF); - UmodeAdd(NULL, 'H', UMODE_GLOBAL, umode_allow_opers, &UMODE_HIDEOPER); - UmodeAdd(NULL, 't', UMODE_GLOBAL, NULL, &UMODE_SETHOST); - UmodeAdd(NULL, 'I', UMODE_GLOBAL, umode_allow_opers, &UMODE_HIDLE); - SnomaskAdd(NULL, 'k', umode_allow_all, &SNO_KILLS); - SnomaskAdd(NULL, 'c', umode_allow_opers, &SNO_CLIENT); - SnomaskAdd(NULL, 'f', umode_allow_opers, &SNO_FLOOD); - SnomaskAdd(NULL, 'F', umode_allow_opers, &SNO_FCLIENT); - SnomaskAdd(NULL, 'j', umode_allow_opers, &SNO_JUNK); - SnomaskAdd(NULL, 'v', umode_allow_opers, &SNO_VHOST); - SnomaskAdd(NULL, 'e', umode_allow_opers, &SNO_EYES); - SnomaskAdd(NULL, 'G', umode_allow_opers, &SNO_TKL); - SnomaskAdd(NULL, 'n', umode_allow_opers, &SNO_NICKCHANGE); - SnomaskAdd(NULL, 'N', umode_allow_opers, &SNO_FNICKCHANGE); - SnomaskAdd(NULL, 'q', umode_allow_opers, &SNO_QLINE); - SnomaskAdd(NULL, 'S', umode_allow_opers, &SNO_SPAMF); - SnomaskAdd(NULL, 's', umode_allow_opers, &SNO_SNOTICE); - SnomaskAdd(NULL, 'o', umode_allow_opers, &SNO_OPER); + UmodeAdd(NULL, 'i', UMODE_GLOBAL, 0, NULL, &UMODE_INVISIBLE); + UmodeAdd(NULL, 'o', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_OPER); + UmodeAdd(NULL, 'w', UMODE_GLOBAL, 0, NULL, &UMODE_WALLOP); + UmodeAdd(NULL, 'g', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_FAILOP); + UmodeAdd(NULL, 'r', UMODE_GLOBAL, 0, NULL, &UMODE_REGNICK); + UmodeAdd(NULL, 'a', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_SADMIN); + UmodeAdd(NULL, 'A', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_ADMIN); + UmodeAdd(NULL, 's', UMODE_LOCAL, 0, NULL, &UMODE_SERVNOTICE); + UmodeAdd(NULL, 'O', UMODE_LOCAL, 1, umode_allow_opers, &UMODE_LOCOP); + UmodeAdd(NULL, 'x', UMODE_GLOBAL, 0, NULL, &UMODE_HIDE); + UmodeAdd(NULL, 'N', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_NETADMIN); + UmodeAdd(NULL, 'C', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_COADMIN); + UmodeAdd(NULL, 'z', UMODE_GLOBAL, 0, NULL, &UMODE_SECURE); + UmodeAdd(NULL, 'd', UMODE_GLOBAL, 0, NULL, &UMODE_DEAF); + UmodeAdd(NULL, 'H', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_HIDEOPER); + UmodeAdd(NULL, 't', UMODE_GLOBAL, 0, NULL, &UMODE_SETHOST); + UmodeAdd(NULL, 'I', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_HIDLE); + SnomaskAdd(NULL, 'k', 0, umode_allow_all, &SNO_KILLS); + SnomaskAdd(NULL, 'c', 1, umode_allow_opers, &SNO_CLIENT); + SnomaskAdd(NULL, 'f', 1, umode_allow_opers, &SNO_FLOOD); + SnomaskAdd(NULL, 'F', 1, umode_allow_opers, &SNO_FCLIENT); + SnomaskAdd(NULL, 'j', 1, umode_allow_opers, &SNO_JUNK); + SnomaskAdd(NULL, 'v', 1, umode_allow_opers, &SNO_VHOST); + SnomaskAdd(NULL, 'e', 1, umode_allow_opers, &SNO_EYES); + SnomaskAdd(NULL, 'G', 1, umode_allow_opers, &SNO_TKL); + SnomaskAdd(NULL, 'n', 1, umode_allow_opers, &SNO_NICKCHANGE); + SnomaskAdd(NULL, 'N', 1, umode_allow_opers, &SNO_FNICKCHANGE); + SnomaskAdd(NULL, 'q', 1, umode_allow_opers, &SNO_QLINE); + SnomaskAdd(NULL, 'S', 1, umode_allow_opers, &SNO_SPAMF); + SnomaskAdd(NULL, 's', 1, umode_allow_opers, &SNO_SNOTICE); + SnomaskAdd(NULL, 'o', 1, umode_allow_opers, &SNO_OPER); } void make_umodestr(void) @@ -169,7 +162,7 @@ void make_umodestr(void) * Add a usermode with character 'ch', if global is set to 1 the usermode is global * (sent to other servers) otherwise it's a local usermode */ -Umode *UmodeAdd(Module *module, char ch, int global, int (*allowed)(aClient *sptr, int what), long *mode) +Umode *UmodeAdd(Module *module, char ch, int global, int unset_on_deoper, int (*allowed)(aClient *sptr, int what), long *mode) { short i = 0; short j = 0; @@ -200,6 +193,7 @@ Umode *UmodeAdd(Module *module, char ch, int global, int (*allowed)(aClient *spt { Usermode_Table[i].flag = ch; Usermode_Table[i].allowed = allowed; + Usermode_Table[i].unset_on_deoper = unset_on_deoper; Debug((DEBUG_DEBUG, "umode_get(%c) returning %04x", ch, Usermode_Table[i].mode)); /* Update usermode table highest */ @@ -270,7 +264,7 @@ void UmodeDel(Umode *umode) return; } -Snomask *SnomaskAdd(Module *module, char ch, int (*allowed)(aClient *sptr, int what), long *mode) +Snomask *SnomaskAdd(Module *module, char ch, int unset_on_deoper, int (*allowed)(aClient *sptr, int what), long *mode) { short i = 0; short j = 0; @@ -301,6 +295,7 @@ Snomask *SnomaskAdd(Module *module, char ch, int (*allowed)(aClient *sptr, int w { Snomask_Table[i].flag = ch; Snomask_Table[i].allowed = allowed; + Snomask_Table[i].unset_on_deoper = unset_on_deoper; /* Update usermode table highest */ for (j = 0; j < UMODETABLESZ; j++) if (Snomask_Table[i].flag) @@ -450,28 +445,6 @@ void unload_all_unused_snomasks(void) } } -long umode_get(char ch, int options, int (*allowed)(aClient *sptr, int what)) -{ - long flag; - if (UmodeAdd(NULL, ch, options, allowed, &flag)) - return flag; - return 0; -} - -int umode_delete(char ch, long val) -{ - int i; - for (i = 0; i < UMODETABLESZ; i++) - { - if (Usermode_Table[i].flag == ch && Usermode_Table[i].mode == val) - { - UmodeDel(&Usermode_Table[i]); - return 1; - } - } - return -1; -} - /** * Simply non-perfect function to remove all oper-snomasks, * it's at least better than manually doing a .. &= ~SNO_BLAH everywhere.