1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-06 09:53:12 +02:00

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.

This commit is contained in:
Bram Matthys
2015-06-21 20:37:53 +02:00
parent 329700f745
commit dd3c4ac4f4
13 changed files with 58 additions and 86 deletions
-3
View File
@@ -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);
+12 -10
View File
@@ -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;
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+35 -62
View File
@@ -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.