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:
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user