X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fopserv.c;h=c4844b7604a67c8b53cd0767445bb72a1d3db4c2;hb=992bf78ff2a935baa18354a40ab50ef442b4733f;hp=d358d57637b4c59f10a51e819e99ee32115d2e6c;hpb=52ad451848654edc3f544e7e52eb773b156da9ff;p=srvx.git diff --git a/src/opserv.c b/src/opserv.c index d358d57..c4844b7 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -79,6 +79,8 @@ #define KEY_ISSUER "issuer" #define KEY_ISSUED "issued" #define KEY_DEVNULL_CLASSES "classes" +#define KEY_DEVNULL_LASTID "lastid" +#define KEY_DEVNULL_ID "id" #define KEY_DEVNULL_NAME "class" #define KEY_DEVNULL_MODE "modes" #define KEY_DEVNULL_MAXCHAN "chanlimit" @@ -268,6 +270,8 @@ static const struct message_entry msgtab[] = { { "OSMSG_SVSNICKUSED", "$b%s$b is an already used nickname." }, { "OSMSG_SVSNICK", "You have renamed $b%s$b to $b%s$b." }, { "OSMSG_SVSJOIN", "$b%s$b joined $b%s$b." }, + { "OSMSG_SVSPART", "$b%s$b parted $b%s$b." }, + { "OSMSG_SVSKILL", "$b%s$b killed: $b%s$b." }, { "OSMSG_SVSMODE", "You have set mode $b%s$b for $b%s$b." }, { "OSMSG_SIMUL", "You have simuled $b%s$b: %s" }, { "OSMSG_DEVNULL_USER" , "[%s] %s %s" }, @@ -327,6 +331,9 @@ static unsigned int new_user_flood; const char *devnull_modes = DEVNULL_MODES; static char *level_strings[1001]; static char devnull_inverse_modes[256]; +unsigned int devnull_last_id = 1; + +void *devnull_check_priv_func = NULL; static struct { struct chanNode *debug_channel; @@ -433,13 +440,13 @@ opserv_free_user_alert(void *data) } #if defined(GCC_VARMACROS) -# define opserv_debug(ARGS...) do { if (opserv_conf.debug_channel) send_channel_notice(opserv_conf.debug_channel, opserv, ARGS); } while (0) -# define opserv_alert(ARGS...) do { if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, ARGS); } while (0) -# define opserv_custom_alert(CHAN, ARGS...) do { if (CHAN) send_target_message(4, (CHAN), opserv, ARGS); else if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, ARGS); } while (0) +# define opserv_debug(ARGS...) do { if (opserv_conf.debug_channel) send_channel_message(opserv_conf.debug_channel, opserv, ARGS); } while (0) +# define opserv_alert(ARGS...) do { if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, ARGS); } while (0) +# define opserv_custom_alert(CHAN, ARGS...) do { if (CHAN) send_target_message(5, (CHAN), opserv, ARGS); else if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, ARGS); } while (0) #elif defined(C99_VARMACROS) -# define opserv_debug(...) do { if (opserv_conf.debug_channel) send_channel_notice(opserv_conf.debug_channel, opserv, __VA_ARGS__); } while (0) -# define opserv_alert(...) do { if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0) -# define opserv_custom_alert(chan, ...) do { if (chan) send_target_message(4, chan, opserv, __VA_ARGS__); else if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0) +# define opserv_debug(...) do { if (opserv_conf.debug_channel) send_channel_message(opserv_conf.debug_channel, opserv, __VA_ARGS__); } while (0) +# define opserv_alert(...) do { if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0) +# define opserv_custom_alert(chan, ...) do { if (chan) send_target_message(5, chan, opserv, __VA_ARGS__); else if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0) #endif /* A lot of these commands are very similar to what ChanServ can do, @@ -2812,12 +2819,16 @@ trusted_host_read(const char *host, void *data, UNUSED_ARG(void *extra)) } static void -opserv_add_devnull_class(const char *name, unsigned long modes, unsigned long maxchan, unsigned long maxsendq) +opserv_add_devnull_class(const char *name, unsigned int id, unsigned long modes, unsigned long maxchan, unsigned long maxsendq) { struct devnull_class *th; th = calloc(1, sizeof(*th)); if (!th) return; + if(id) + th->id = id; + else + th->id = (++devnull_last_id); th->name = strdup(name); th->modes = modes; th->maxchan = maxchan; @@ -2839,12 +2850,16 @@ devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra)) struct record_data *rd = data; const char *nameb = name, *str; unsigned long modes, maxchan, maxsendq; - unsigned int ii; + unsigned int id, ii; if (rd->type == RECDB_OBJECT) { dict_t obj = GET_RECORD_OBJECT(rd); /* new style structure */ - nameb = database_get_data(obj, KEY_DEVNULL_NAME, RECDB_QSTRING); + str = database_get_data(obj, KEY_DEVNULL_ID, RECDB_QSTRING); + if(str) + id = atoi(str); + else + id = 0; str = database_get_data(obj, KEY_DEVNULL_MODE, RECDB_QSTRING); modes = 0; if (str) { @@ -2858,7 +2873,7 @@ devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra)) } else return 0; - opserv_add_devnull_class(nameb, modes, maxchan, maxsendq); + opserv_add_devnull_class(name, id, modes, maxchan, maxsendq); return 0; } @@ -2869,6 +2884,7 @@ opserv_saxdb_read(struct dict *conf_db) struct record_data *rd; dict_iterator_t it; unsigned int nn; + char *str; if ((object = database_get_data(conf_db, KEY_RESERVES, RECDB_OBJECT))) dict_foreach(object, add_reserved, opserv_reserved_nick_dict); @@ -2898,12 +2914,13 @@ opserv_saxdb_read(struct dict *conf_db) dict_insert(opserv_exempt_channels, strdup(rd->d.slist->list[nn]), NULL); } if ((object = database_get_data(conf_db, KEY_MAX_CLIENTS, RECDB_OBJECT))) { - char *str; if ((str = database_get_data(object, KEY_MAX, RECDB_QSTRING))) max_clients = atoi(str); if ((str = database_get_data(object, KEY_TIME, RECDB_QSTRING))) max_clients_time = atoi(str); } + if ((str = database_get_data(object, KEY_DEVNULL_LASTID, RECDB_QSTRING))) + devnull_last_id = atoi(str); if ((object = database_get_data(conf_db, KEY_TRUSTED_HOSTS, RECDB_OBJECT))) dict_foreach(object, trusted_host_read, opserv_trusted_hosts); if ((object = database_get_data(conf_db, KEY_DEVNULL_CLASSES, RECDB_OBJECT))) @@ -2970,8 +2987,8 @@ opserv_saxdb_write(struct saxdb_context *ctx) saxdb_start_record(ctx, KEY_DEVNULL_CLASSES, 1); for (it = dict_first(opserv_devnull_classes); it; it = iter_next(it)) { struct devnull_class *th = iter_data(it); - saxdb_start_record(ctx, iter_key(it), 0); - if (th->name) saxdb_write_string(ctx, KEY_DEVNULL_NAME, th->name); + saxdb_start_record(ctx, th->name, 0); + saxdb_write_int(ctx, KEY_DEVNULL_ID, th->id); if (th->modes) { int ii, flen; char flags[50]; @@ -2987,6 +3004,7 @@ opserv_saxdb_write(struct saxdb_context *ctx) } saxdb_end_record(ctx); } + saxdb_write_int(ctx, KEY_DEVNULL_LASTID, devnull_last_id); /* gags */ if (gagList) { struct gag_entry *gag; @@ -4306,74 +4324,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; @@ -4426,7 +4444,7 @@ static MODCMD_FUNC(cmd_adddevnull) return 0; } - opserv_add_devnull_class(argv[1], 0, 0, 0); + opserv_add_devnull_class(argv[1], (++devnull_last_id), 0, 0, 0); reply("OSMSG_DEVNULL_ADDED",argv[1]); return 1; } @@ -4440,7 +4458,7 @@ static MODCMD_FUNC(cmd_deldevnull) struct devnull_class *th = dict_find(opserv_devnull_classes, argv[n], NULL); if (!th) continue; - nickserv_devnull_delete(th->name); + nickserv_devnull_delete(th->id); dict_remove(opserv_devnull_classes, argv[n]); reply("OSMSG_DEVNULL_REMOVED",argv[n]); } @@ -4455,8 +4473,7 @@ static MODCMD_FUNC(cmd_renamedevnull) return 0; } if ((th = dict_find(opserv_devnull_classes, argv[1], NULL))) { - opserv_add_devnull_class(argv[2], th->modes, th->maxchan, th->maxsendq); - nickserv_devnull_rename(th->name,argv[2]); + opserv_add_devnull_class(argv[2], th->id, th->modes, th->maxchan, th->maxsendq); dict_remove(opserv_devnull_classes, argv[1]); reply("OSMSG_DEVNULL_RENAMED",argv[1],argv[2]); } else { @@ -4477,236 +4494,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"); @@ -4719,16 +4725,57 @@ static MODCMD_FUNC(cmd_setdevnull) return 1; } -int devnull_check(const char *name) { - if (dict_find(opserv_devnull_classes, name, NULL)) { - return 1; +struct devnull_class *devnull_find_id(unsigned int id) { + dict_iterator_t it; + for (it = dict_first(opserv_devnull_classes); it; it = iter_next(it)) { + struct devnull_class *th = iter_data(it); + if(th->id == id) + return th; } - return 0; + return NULL; +} + +struct devnull_class *devnull_find_name(const char *name) { + struct devnull_class *th; + if ((th = dict_find(opserv_devnull_classes, name, NULL))) { + return th; + } + return NULL; } -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) @@ -4772,6 +4819,34 @@ static MODCMD_FUNC(cmd_svsjoin) return 1; } +static MODCMD_FUNC(cmd_svspart) +{ + struct userNode *target; + if(!(target=GetUserH(argv[1]))) { + reply("OSMSG_SVSNONICK", argv[1]); + return 0; + } + if(!IsChannelName(argv[2])) + { + reply("MSG_NOT_CHANNEL_NAME"); + return 0; + } + irc_svspartchan(opserv,target,argv[2]); + reply("OSMSG_SVSPART",target->nick,argv[2]); + return 1; +} + +static MODCMD_FUNC(cmd_svskill) +{ + struct userNode *target; + if(!(target=GetUserH(argv[1]))) { + reply("OSMSG_SVSNONICK", argv[1]); + return 0; + } + DelUser(target, opserv, 1, argv[2]); + reply("OSMSG_SVSKILL",target->nick,argv[2]); + return 1; +} static MODCMD_FUNC(cmd_svsnick) { struct userNode *target; @@ -5085,10 +5160,12 @@ init_opserv(const char *nick) opserv_define_func("DEVNULL SET", cmd_setdevnull, 200, 0, 2); opserv_define_func("DEVNULL LIST", cmd_listdevnull, 200, 0, 0); opserv_define_func("SVSJOIN", cmd_svsjoin, 800, 0, 3); + opserv_define_func("SVSPART", cmd_svspart, 800, 0, 3); + opserv_define_func("SVSKILL", cmd_svskill, 800, 0, 3); opserv_define_func("SVSMODE", cmd_svsmode, 800, 0, 3); opserv_define_func("SVSNICK", cmd_svsnick, 800, 0, 3); opserv_define_func("RELAY", cmd_relay, 800, 0, 0); - opserv_define_func("SIMUL", cmd_simul, 999, 0, 2); + opserv_define_func("SIMUL", cmd_simul, 999, 0, 3); opserv_define_func("TRACE", cmd_trace, 100, 0, 3); opserv_define_func("TRACE PRINT", NULL, 0, 0, 0); opserv_define_func("TRACE COUNT", NULL, 0, 0, 0);