From 093f707afd62edb079b5f64d165ee128f912e71f Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 15 Jul 2013 18:50:19 +0200 Subject: [PATCH] tidied up devnull management and prepared functions for coming "dynamic devnull" feature --- src/chanserv.c | 3 +- src/nickserv.c | 2 +- src/opserv.c | 397 +++++++++++++++++++++++++----------------------- src/opserv.h | 49 +++--- src/proto-p10.c | 56 +++---- 5 files changed, 264 insertions(+), 243 deletions(-) diff --git a/src/chanserv.c b/src/chanserv.c index ec4a485..771b616 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -3287,8 +3287,7 @@ static CHANSERV_FUNC(cmd_opme) return 0; } - struct devnull_class *devnull; - if(user->handle_info->devnull && (devnull = devnull_get(user->handle_info->devnull)) && (devnull->modes & DEVNULL_MODE_OPME)) + if(devnull_user_has_priv(user->handle_info, DEVNULL_MODE_OPME)) { change.args[0].mode = MODE_CHANOP; errmsg = "CSMSG_ALREADY_OPPED"; diff --git a/src/nickserv.c b/src/nickserv.c index 25c2a43..17f9a15 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -2661,7 +2661,7 @@ static OPTION_FUNC(opt_devnull) hi->devnull = NULL; } else { devnull = unsplit_string(argv+1, argc-1, NULL); - if(devnull_check(devnull) == 1) { + if(devnull_check_name(devnull)) { if(hi->devnull) free(hi->devnull); hi->devnull = strdup(devnull); diff --git a/src/opserv.c b/src/opserv.c index 0ce4884..92abb8d 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -330,6 +330,8 @@ const char *devnull_modes = DEVNULL_MODES; static char *level_strings[1001]; static char devnull_inverse_modes[256]; +void *devnull_check_priv_func = NULL; + static struct { struct chanNode *debug_channel; struct chanNode *alert_channel; @@ -4308,74 +4310,74 @@ static MODCMD_FUNC(cmd_listdevnull) struct devnull_class *th = iter_data(it); tbl.contents[++ii] = malloc(tbl.width * sizeof(tbl.contents[0][0])); tbl.contents[ii][0] = th->name; - if(DEVNULL_FLAGGED(th, MODE_A)) { + if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) { tbl.contents[ii][1] = strtab(th->maxchan); } else { tbl.contents[ii][1] = off; } - if(DEVNULL_FLAGGED(th, MODE_B)) { + if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) { tbl.contents[ii][2] = on; } else { tbl.contents[ii][2] = off; } - if(DEVNULL_FLAGGED(th, MODE_D)) { + if(DEVNULL_HAS_PRIV(th, NOFLOOD)) { tbl.contents[ii][3] = on; - } else if(DEVNULL_FLAGGED(th, MODE_C)) { + } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) { tbl.contents[ii][3] = half; } else { tbl.contents[ii][3] = off; } - if(DEVNULL_FLAGGED(th, MODE_E)) { + if(DEVNULL_HAS_PRIV(th, CHANHIDE)) { tbl.contents[ii][4] = on; } else { tbl.contents[ii][4] = off; } - if(DEVNULL_FLAGGED(th, MODE_F)) { + if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) { tbl.contents[ii][5] = on; } else { tbl.contents[ii][5] = off; } - if(DEVNULL_FLAGGED(th, MODE_J)) { + if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) { tbl.contents[ii][6] = on; } else { tbl.contents[ii][6] = off; } - if(DEVNULL_FLAGGED(th, MODE_K)) { + if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) { tbl.contents[ii][7] = on; } else { tbl.contents[ii][7] = off; } - if(DEVNULL_FLAGGED(th, MODE_L)) { + if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) { tbl.contents[ii][8] = on; } else { tbl.contents[ii][8] = off; } - if(DEVNULL_FLAGGED(th, MODE_M)) { + if(DEVNULL_HAS_PRIV(th, SEEIDLE)) { tbl.contents[ii][9] = on; } else { tbl.contents[ii][9] = off; } - if(DEVNULL_FLAGGED(th, MODE_G)) { + if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) { tbl.contents[ii][10] = on; } else { tbl.contents[ii][10] = off; } - if(DEVNULL_FLAGGED(th, MODE_I)) { + if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) { tbl.contents[ii][11] = on; } else { tbl.contents[ii][11] = off; } - if(DEVNULL_FLAGGED(th, MODE_H)) { + if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) { tbl.contents[ii][12] = on; } else { tbl.contents[ii][12] = off; } - if(DEVNULL_FLAGGED(th, MODE_N)) { + if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) { tbl.contents[ii][13] = on; } else { tbl.contents[ii][13] = off; } - if(DEVNULL_FLAGGED(th, MODE_OPME)) { + if(DEVNULL_HAS_PRIV(th, OPME)) { tbl.contents[ii][14] = on; } else { tbl.contents[ii][14] = off; @@ -4479,236 +4481,225 @@ static MODCMD_FUNC(cmd_setdevnull) argv[offset+2][ ii ] = toupper( argv[offset+2][ ii ] ); for( ii = 0; argv[offset+3][ ii ]; ii++) argv[offset+3][ ii ] = toupper( argv[offset+3][ ii ] ); + if(!strcmp("CHANLIMIT",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_A); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - DEVNULL_SET_FLAG(th, MODE_A); - th->maxchan = strtoul(argv[offset+3], NULL, 0); - reply("OSMSG_DEVNULL_SET_DONE"); - } - } - else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_B); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_B); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("FLOOD",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_C); - DEVNULL_CLEAR_FLAG(th, MODE_D); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_D); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_C); - DEVNULL_CLEAR_FLAG(th, MODE_D); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("CHANHIDE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_E); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_E); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("IDLEHIDE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_F); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_F); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("CHSERVMODE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_G); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_G); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("XTRAOPMODE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_H); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_H); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("NETSERVMODE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_I); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_I); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("SEEIDLE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_J); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_J); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_K); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_K); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("OVERRIDECC",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_L); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_L); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_M); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_M); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } - } - else if(!strcmp("MAXSENDQ",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_N); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - DEVNULL_SET_FLAG(th, MODE_N); - th->maxsendq = strtoul(argv[offset+3], NULL, 0); - reply("OSMSG_DEVNULL_SET_DONE"); - } + if (!strcmp("OFF",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, CHANLIMIT); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + DEVNULL_SET_PRIV(th, CHANLIMIT); + th->maxchan = strtoul(argv[offset+3], NULL, 0); + reply("OSMSG_DEVNULL_SET_DONE"); + } + } else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, UNLIMITTARGET); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, UNLIMITTARGET); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("FLOOD",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, HALFFLOOD); + DEVNULL_CLEAR_PRIV(th, NOFLOOD); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, NOFLOOD); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) { + DEVNULL_SET_PRIV(th, HALFFLOOD); + DEVNULL_CLEAR_PRIV(th, NOFLOOD); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("CHANHIDE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, CHANHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, CHANHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("IDLEHIDE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, IDLEHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, IDLEHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("CHSERVMODE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, CHSERVMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, CHSERVMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("XTRAOPMODE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, XTRAOPMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, XTRAOPMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("NETSERVMODE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, NETSERVMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, NETSERVMODE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("SEEIDLE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, SEEIDLE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, SEEIDLE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, FORCEIDLEHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, FORCEIDLEHIDE); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("OVERRIDECC",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, OVERRIDECC); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, OVERRIDECC); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, OVERRIDENOAMSG); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, OVERRIDENOAMSG); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } + } else if(!strcmp("MAXSENDQ",argv[offset+2])) { + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, MAXSENDQ); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + DEVNULL_SET_PRIV(th, MAXSENDQ); + th->maxsendq = strtoul(argv[offset+3], NULL, 0); + reply("OSMSG_DEVNULL_SET_DONE"); + } } else if(!strcmp("OPME",argv[offset+2])) { - if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { - DEVNULL_CLEAR_FLAG(th, MODE_OPME); - reply("OSMSG_DEVNULL_SET_DONE"); - } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { - DEVNULL_SET_FLAG(th, MODE_OPME); - reply("OSMSG_DEVNULL_SET_DONE"); - } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); - } + if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) { + DEVNULL_CLEAR_PRIV(th, OPME); + reply("OSMSG_DEVNULL_SET_DONE"); + } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) { + DEVNULL_SET_PRIV(th, OPME); + reply("OSMSG_DEVNULL_SET_DONE"); + } else { + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]); + } } else { - reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]); + reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]); } } else { reply("OSMSG_DEVNULL_SET", th->name); - if(DEVNULL_FLAGGED(th, MODE_A)) { + if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) { reply("OSMSG_DEVNULL_SET_A_i", th->maxchan); } else { reply("OSMSG_DEVNULL_SET_A", "off"); } - if(DEVNULL_FLAGGED(th, MODE_B)) { + if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) { reply("OSMSG_DEVNULL_SET_B", "on"); } else { reply("OSMSG_DEVNULL_SET_B", "off"); } - if(DEVNULL_FLAGGED(th, MODE_D)) { + if(DEVNULL_HAS_PRIV(th, NOFLOOD)) { reply("OSMSG_DEVNULL_SET_C", "on"); - } else if(DEVNULL_FLAGGED(th, MODE_C)) { + } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) { reply("OSMSG_DEVNULL_SET_C", "half"); } else { reply("OSMSG_DEVNULL_SET_C", "off"); } - if(DEVNULL_FLAGGED(th, MODE_E)) { + if(DEVNULL_HAS_PRIV(th, CHANHIDE)) { reply("OSMSG_DEVNULL_SET_E", "on"); } else { reply("OSMSG_DEVNULL_SET_E", "off"); } - if(DEVNULL_FLAGGED(th, MODE_F)) { + if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) { reply("OSMSG_DEVNULL_SET_F", "on"); } else { reply("OSMSG_DEVNULL_SET_F", "off"); } - if(DEVNULL_FLAGGED(th, MODE_G)) { + if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) { reply("OSMSG_DEVNULL_SET_G", "on"); } else { reply("OSMSG_DEVNULL_SET_G", "off"); } - if(DEVNULL_FLAGGED(th, MODE_H)) { + if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) { reply("OSMSG_DEVNULL_SET_H", "on"); } else { reply("OSMSG_DEVNULL_SET_H", "off"); } - if(DEVNULL_FLAGGED(th, MODE_I)) { + if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) { reply("OSMSG_DEVNULL_SET_I", "on"); } else { reply("OSMSG_DEVNULL_SET_I", "off"); } - if(DEVNULL_FLAGGED(th, MODE_J)) { + if(DEVNULL_HAS_PRIV(th, SEEIDLE)) { reply("OSMSG_DEVNULL_SET_J", "on"); } else { reply("OSMSG_DEVNULL_SET_J", "off"); } - if(DEVNULL_FLAGGED(th, MODE_K)) { + if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) { reply("OSMSG_DEVNULL_SET_K", "on"); } else { reply("OSMSG_DEVNULL_SET_K", "off"); } - if(DEVNULL_FLAGGED(th, MODE_L)) { + if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) { reply("OSMSG_DEVNULL_SET_L", "on"); } else { reply("OSMSG_DEVNULL_SET_L", "off"); } - if(DEVNULL_FLAGGED(th, MODE_M)) { + if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) { reply("OSMSG_DEVNULL_SET_M", "on"); } else { reply("OSMSG_DEVNULL_SET_M", "off"); } - if(DEVNULL_FLAGGED(th, MODE_N)) { + if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) { reply("OSMSG_DEVNULL_SET_N_i", th->maxsendq); } else { reply("OSMSG_DEVNULL_SET_N", "off"); } - if(DEVNULL_FLAGGED(th, MODE_OPME)) { + if(DEVNULL_HAS_PRIV(th, OPME)) { reply("OSMSG_DEVNULL_SET_OPME", "on"); } else { reply("OSMSG_DEVNULL_SET_OPME", "off"); @@ -4721,16 +4712,46 @@ static MODCMD_FUNC(cmd_setdevnull) return 1; } -int devnull_check(const char *name) { +int devnull_check_name(const char *name) { if (dict_find(opserv_devnull_classes, name, NULL)) { return 1; } return 0; } -struct devnull_class* - devnull_get(const char *name) { - return dict_find(opserv_devnull_classes, name, NULL); +int devnull_user_has_priv(struct handle_info *hi, int devnull_priv) { + if(devnull_check_priv_func) { + int ext_privs = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi, devnull_priv); + if((ext_privs & devnull_priv)) + return (ext_privs & devnull_priv); + } + + if(!hi->devnull) + return 0; + struct devnull_class *th; + if(!(th = dict_find(opserv_devnull_classes, hi->devnull, NULL))) + return 0; + + return (th->modes & devnull_priv); +} + +struct devnull_class devnull_user_get_class(struct handle_info *hi) { + struct devnull_class th; + th.name = NULL; + th.modes = 0; + + if(hi->devnull) { + struct devnull_class *thp; + if((thp = dict_find(opserv_devnull_classes, hi->devnull, NULL))) { + if(DEVNULL_HAS_PRIV(thp, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < thp->maxchan)) + th.maxchan = thp->maxchan; + if(DEVNULL_HAS_PRIV(thp, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < thp->maxsendq)) + th.maxsendq = thp->maxsendq; + th.modes |= thp->maxsendq; + th.name = thp->name; + } + } + return th; } void operpart(struct chanNode *chan, struct userNode *user) diff --git a/src/opserv.h b/src/opserv.h index 92b35ec..0ff315e 100644 --- a/src/opserv.h +++ b/src/opserv.h @@ -21,28 +21,28 @@ #ifndef _opserv_h #define _opserv_h -/* DEVNULL_MODE_* go into devnull_class.modes */ -#define DEVNULL_MODE_A 0x00000001 -#define DEVNULL_MODE_B 0x00000002 -#define DEVNULL_MODE_C 0x00000004 -#define DEVNULL_MODE_D 0x00000008 -#define DEVNULL_MODE_E 0x00000010 -#define DEVNULL_MODE_F 0x00000020 -#define DEVNULL_MODE_G 0x00000040 -#define DEVNULL_MODE_H 0x00000080 -#define DEVNULL_MODE_I 0x00000100 -#define DEVNULL_MODE_J 0x00000200 -#define DEVNULL_MODE_K 0x00000400 -#define DEVNULL_MODE_L 0x00000800 -#define DEVNULL_MODE_M 0x00001000 -#define DEVNULL_MODE_N 0x00002000 -#define DEVNULL_MODE_OPME 0x00004000 +/* DEVNULL_PRIV_* go into devnull_class.modes */ +#define DEVNULL_PRIV_CHANLIMIT 0x0001 +#define DEVNULL_PRIV_UNLIMITTARGET 0x0002 +#define DEVNULL_PRIV_HALFFLOOD 0x0004 +#define DEVNULL_PRIV_NOFLOOD 0x0008 +#define DEVNULL_PRIV_CHANHIDE 0x0010 +#define DEVNULL_PRIV_IDLEHIDE 0x0020 +#define DEVNULL_PRIV_CHSERVMODE 0x0040 +#define DEVNULL_PRIV_XTRAOPMODE 0x0080 +#define DEVNULL_PRIV_NETSERVMODE 0x0100 +#define DEVNULL_PRIV_SEEIDLE 0x0200 +#define DEVNULL_PRIV_FORCEIDLEHIDE 0x0400 +#define DEVNULL_PRIV_OVERRIDECC 0x0800 +#define DEVNULL_PRIV_OVERRIDENOAMSG 0x1000 +#define DEVNULL_PRIV_MAXSENDQ 0x2000 +#define DEVNULL_PRIV_OPME 0x4000 -#define DEVNULL_MODES "abcdefghijklmno" +#define DEVNULL_MODES "abcdefghijklmno" -#define DEVNULL_FLAGGED(hi, tok) ((hi)->modes & DEVNULL_##tok) -#define DEVNULL_SET_FLAG(hi, tok) ((hi)->modes |= DEVNULL_##tok) -#define DEVNULL_CLEAR_FLAG(hi, tok) ((hi)->modes &= ~DEVNULL_##tok) +#define DEVNULL_HAS_PRIV(cl, tok) ((cl)->modes & DEVNULL_##tok) +#define DEVNULL_SET_PRIV(cl, tok) ((cl)->modes |= DEVNULL_##tok) +#define DEVNULL_CLEAR_PRIV(cl, tok) ((cl)->modes &= ~DEVNULL_##tok) struct devnull_class { char *name; @@ -51,13 +51,14 @@ struct devnull_class { unsigned long maxsendq; }; +extern void *devnull_check_priv_func; + void init_opserv(const char *nick); unsigned int gag_create(const char *mask, const char *owner, const char *reason, unsigned long expires); int opserv_bad_channel(const char *name); -void devnull_delete(const char *auth); -void devnull_rename(const char *oldauth, const char *newauth); -int devnull_check(const char *name); -struct devnull_class* devnull_get(const char *name); +int devnull_check_name(const char *name); +int devnull_user_has_priv(struct handle_info *hi, int devnull_priv); +struct devnull_class devnull_user_get_class(struct handle_info *hi); struct userNode* GetOpServ(void); void operpart(struct chanNode *chan, struct userNode *user); void operadd(struct userNode *user); diff --git a/src/proto-p10.c b/src/proto-p10.c index dc0829d..91247e2 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -1786,41 +1786,41 @@ static CMD_FUNC(cmd_relay) //ok someone relayed something to us! if(strcmp("LQ", argv[2]) == 0) { //oooh thats exciting - we've got a LOC Query! :D - //LQ !ABADE pk910 80.153.5.212 server.zoelle1.de ~watchcat :test //ok let's check the login datas struct handle_info *hi; char tmp[MAXLEN], tmp2[MAXLEN]; sprintf(tmp, "%s@%s",argv[7],argv[6]); sprintf(tmp2, "%s@%s",argv[7],argv[5]); if((hi = checklogin(argv[4],argv[argc-1],&argv[3][1],tmp,tmp2))) { - //login ok - struct devnull_class *th; - char devnull[512]; - if(hi->devnull && (th = devnull_get(hi->devnull))) { - const char *devnull_modes = DEVNULL_MODES; - int ii, flen; - char flags[50]; - for (ii=flen=0; devnull_modes[ii]; ++ii) - if (th->modes & (1 << ii)) - flags[flen++] = devnull_modes[ii]; - flags[flen] = 0; - sprintf(devnull, "+%s %s %lu %lu",flags,th->name,th->maxchan,th->maxsendq); - } else { - devnull[0] = 0; - } - if(!HANDLE_FLAGGED(hi, AUTOHIDE)) { - sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull); - } else if(getfakehost(argv[4])) { - sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull); - } else { - extern const char *hidden_host_suffix; - sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull); - } - irc_relay(tmp); + //login ok + struct devnull_class th = devnull_user_get_class(hi); + char devnull[MAXLEN]; + + if(th.modes) { + const char *devnull_modes = DEVNULL_MODES; + int ii, flen = 0; + char flags[50]; + for (ii = 0; devnull_modes[ii]; ++ii) + if(th.modes & (1 << ii)) + flags[flen++] = devnull_modes[ii]; + flags[flen] = 0; + sprintf(devnull, "+%s %s %lu %lu", flags, (th.name ? th.name : "custom"), (DEVNULL_HAS_PRIV(&th, CHANLIMIT) ? th.maxchan : 0), (DEVNULL_HAS_PRIV(&th, MAXSENDQ) ? th.maxsendq : 0)); + } else + devnull[0] = 0; + + if(!HANDLE_FLAGGED(hi, AUTOHIDE)) + sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull); + else if(getfakehost(argv[4])) + sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull); + else { + extern const char *hidden_host_suffix; + sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull); + } + irc_relay(tmp); } else { - //login rejected - sprintf(tmp,"%s LR\n",argv[3]); - irc_relay(tmp); + //login rejected + sprintf(tmp,"%s LR\n",argv[3]); + irc_relay(tmp); } } else if(strcmp("UC", argv[2]) == 0) { char tmp[MAXLEN]; -- 2.20.1