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

Modularize adminonly (+A)

This commit is contained in:
Travis McArthur
2014-06-07 20:35:19 -07:00
parent 5924674c3f
commit 5e657e5985
7 changed files with 136 additions and 21 deletions
-1
View File
@@ -1629,7 +1629,6 @@ struct liststruct {
#define MODE_RGSTR 0x8000
#define MODE_RGSTRONLY 0x10000
#define MODE_NOCOLOR 0x40000
#define MODE_ADMONLY 0x100000
#define MODE_NOKICKS 0x200000
#define MODE_STRIP 0x400000
#define MODE_MODREG 0x4000000
+1
View File
@@ -123,6 +123,7 @@ loadmodule "modules/chanmodes/delayjoin"; /* +D */
loadmodule "modules/chanmodes/noknock"; /* +K */
loadmodule "modules/chanmodes/noinvite"; /* +V */
loadmodule "modules/chanmodes/operonly"; /* +O */
loadmodule "modules/chanmodes/adminonly"; /* +A */
/*** User modes ***/
loadmodule "modules/usermodes/noctcp"; /* +T */
-1
View File
@@ -88,7 +88,6 @@ aCtab cFlagTab[] = {
{MODE_RGSTRONLY, 'R', 0, 0},
{MODE_CHANPROT, 'a', 0, 1},
{MODE_CHANOWNER, 'q', 0, 1},
{MODE_ADMONLY, 'A', 0, 0},
{MODE_NOKICKS, 'Q', 0, 0},
{MODE_BAN, 'b', 1, 1},
{MODE_EXCEPT, 'e', 1, 0}, /* exception ban */
+7 -2
View File
@@ -31,7 +31,8 @@ INCLUDES = ../../include/auth.h ../../include/channel.h \
R_MODULES= \
nocolor.so stripcolor.so issecure.so permanent.so jointhrottle.so floodprot.so \
noctcp.so link.so censor.so delayjoin.so noknock.so noinvite.so operonly.so
noctcp.so link.so censor.so delayjoin.so noknock.so noinvite.so operonly.so \
adminonly.so
MODULES=$(R_MODULES)
MODULEFLAGS=@MODULEFLAGS@
@@ -103,4 +104,8 @@ noinvite.so: noinvite.c $(INCLUDES)
operonly.so: operonly.c $(INCLUDES)
$(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
-o operonly.so operonly.c
-o operonly.so operonly.c
adminonly.so: adminonly.c $(INCLUDES)
$(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
-o adminonly.so adminonly.c
+128
View File
@@ -0,0 +1,128 @@
/*
* Disallow knocks UnrealIRCd Module (Channel Mode +K)
* (C) Copyright 2014 Travis McArthur (Heero) and the UnrealIRCd team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "config.h"
#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "proto.h"
#include "channel.h"
#include <time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <io.h>
#endif
#include <fcntl.h>
#include "h.h"
#ifdef _WIN32
#include "version.h"
#endif
DLLFUNC CMD_FUNC(adminonly);
ModuleHeader MOD_HEADER(adminonly)
= {
"chanmodes/adminonly",
"$Id$",
"Channel Mode +V",
"3.2-b8-1",
NULL
};
Cmode_t EXTCMODE_ADMINONLY;
#define IsAdminOnly(chptr) (chptr->mode.extmode & EXTCMODE_ADMINONLY)
DLLFUNC int adminonly_check (aClient *cptr, aChannel *chptr, char *key, char *parv[]);
DLLFUNC int adminonly_topic_allow (aClient *sptr, aChannel *chptr);
DLLFUNC int adminonly_check_ban(aClient *cptr, aChannel *chptr);
DLLFUNC int MOD_TEST(adminonly)(ModuleInfo *modinfo)
{
return MOD_SUCCESS;
}
DLLFUNC int MOD_INIT(adminonly)(ModuleInfo *modinfo)
{
CmodeInfo req;
memset(&req, 0, sizeof(req));
req.paracount = 0;
req.flag = 'A';
req.is_ok = adminonly_require_oper;
CmodeAdd(modinfo->handle, req, &EXTCMODE_ADMINONLY);
HookAddEx(modinfo->handle, HOOKTYPE_CAN_JOIN, adminonly_check);
HookAddEx(modinfo->handle, HOOKTYPE_OPER_INVITE_BAN, adminonly_check_ban);
HookAddEx(modinfo->handle, HOOKTYPE_VIEW_TOPIC_OUTSIDE_CHANNEl, adminonly_topic_allow);
MARK_AS_OFFICIAL_MODULE(modinfo);
return MOD_SUCCESS;
}
DLLFUNC int MOD_LOAD(noctcp)(int module_load)
{
return MOD_SUCCESS;
}
DLLFUNC int MOD_UNLOAD(noctcp)(int module_unload)
{
return MOD_SUCCESS;
}
DLLFUNC int adminonly_check (aClient *cptr, aChannel *chptr, char *key, char *parv[])
{
if ((chptr->mode.extmode & EXTCMODE_ADMINONLY) && !IsSkoAdmin(cptr))
return ERR_ADMONLY;
return 0;
}
DLLFUNC int adminonly_check_ban(aClient *cptr, aChannel *chptr)
{
if ((chptr->mode.extmode & EXTCMODE_ADMINONLY) && IsAnOper(cptr) && !IsNetAdmin(cptr) && !IsSAdmin(cptr))
return HOOK_DENY;
return HOOK_CONTINUE;
}
DLLFUNC int adminonly_topic_allow (aClient *sptr, aChannel *chptr)
{
if (chptr->mode.extmode & EXTCMODE_ADMINONLY && !IsAdmin(sptr))
return HOOK_DENY;
return HOOK_CONTINUE;
}
DLLFUNC int adminonly_require_oper(aClient *cptr, aChannel *chptr, char mode, char *para, int checkt, int what)
{
if (!IsSkoAdmin(cptr) && !IsServer(cptr)
&& !IsULine(cptr))
return EX_ALLOW;
return EX_DENY;
}
-9
View File
@@ -128,10 +128,6 @@ int i,j;
return (ERR_SECUREONLYCHAN);
}
if ((chptr->mode.mode & MODE_ADMONLY) && !IsSkoAdmin(sptr))
return (ERR_ADMONLY);
for (h = Hooks[HOOKTYPE_OPER_INVITE_BAN]; h; h = h->next)
{
j = (*(h->func.intfunc))(sptr,chptr);
@@ -144,11 +140,6 @@ int i,j;
if (banned && j == HOOK_DENY)
return (ERR_BANNEDFROMCHAN);
/* Only NetAdmin/SAdmin can walk +b in +A */
if (banned && (chptr->mode.mode & MODE_ADMONLY) &&
IsAnOper(sptr) && !IsNetAdmin(sptr) && !IsSAdmin(sptr))
return (ERR_BANNEDFROMCHAN);
for (lp = sptr->user->invited; lp; lp = lp->next)
if (lp->value.chptr == chptr)
return 0;
-8
View File
@@ -817,14 +817,6 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param,
}
switch (modetype)
{
case MODE_ADMONLY:
if (!IsSkoAdmin(cptr) && !IsServer(cptr)
&& !IsULine(cptr))
{
sendto_one(cptr, err_str(ERR_NOPRIVILEGES), me.name, cptr->name);
break;
}
goto setthephuckingmode;
case MODE_RGSTR:
if (!IsServer(cptr) && !IsULine(cptr))
{