From: NurPech Date: Tue, 27 Aug 2013 19:09:35 +0000 (+0200) Subject: Merge branch 'master' into SpamServ X-Git-Url: http://git.pk910.de/?a=commitdiff_plain;h=5bbd945af96418ab4ced2e04cd98b07d6e3c9e71;hp=a6e170afa9f97346f5824a9b9fcfb153103b525d;p=srvx.git Merge branch 'master' into SpamServ --- diff --git a/src/chanserv.c b/src/chanserv.c index 19a5c57..37d6531 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -399,7 +399,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_LC_H_TITLE", "support helper" }, { "CSMSG_LAME_SMURF_TARGET", "%s is an IRC operator." }, { "CSMSG_MYACCESS_COUNT", "%s has access in $b%d$b channels and is owner of $b%d$b channel(s)." }, - { "CSMSG_MYACCESS_COUNT_1", "%s has access in $b%d$b channel and is owner of $b%d$b channel(s)." }, + { "CSMSG_MYACCESS_COUNT_1", "%s has access in $b%d$b channel and is owner of $b%d$b channel(s)." }, /* Seen information */ @@ -483,6 +483,7 @@ static const struct message_entry msgtab[] = { /* Toys */ { "CSMSG_UNF_RESPONSE", "I don't want to be part of your sick fantasies!" }, { "CSMSG_PING_RESPONSE", "Pong!" }, + { "CSMSG_PONG_RESPONSE", "Ping!" }, { "CSMSG_WUT_RESPONSE", "wut" }, { "CSMSG_BAD_NUMBER", "$b%s$b is an invalid number. Please use a number greater than 1 with this command." }, { "CSMSG_BAD_DIE_FORMAT", "I do not understand $b%s$b. Please use either a single number or standard 4d6+3 format." }, @@ -1523,7 +1524,7 @@ unregister_channel(struct chanData *channel, const char *reason) if(channel->expiry) timeq_del(channel->expiry, chanserv_expire_channel, channel, 0); channel->channel->channel_info = NULL; - + sprintf(msgbuf, "%s %s", channel->channel->name, reason); dict_delete(channel->notes); if(!IsSuspended(channel)) DelChannelUser(chanserv, channel->channel, msgbuf, 0); @@ -2168,7 +2169,6 @@ static CHANSERV_FUNC(cmd_register) struct handle_info *handle; struct chanData *cData; struct modeNode *mn; - char reason[MAXLEN]; char *chan_name; unsigned int new_channel, force=0; struct do_not_register *dnr; @@ -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_PRIV_OPME)) { change.args[0].mode = MODE_CHANOP; errmsg = "CSMSG_ALREADY_OPPED"; @@ -7130,6 +7129,20 @@ static CHANSERV_FUNC(cmd_ping) return 1; } +static CHANSERV_FUNC(cmd_pong) +{ + if(channel) + { + char response[MAXLEN]; + const char *fmt = user_find_message(user, "CSMSG_PONG_RESPONSE"); + sprintf(response, "%s: %s", user->nick, fmt); + irc_privmsg(cmd->parent->bot, channel->name, response); + } + else + reply("CSMSG_PONG_RESPONSE"); + return 1; +} + static CHANSERV_FUNC(cmd_wut) { if(channel) @@ -7988,7 +8001,7 @@ chanserv_conf_read(void) str = database_get_data(conf_node, "off_channel", RECDB_QSTRING); off_channel = str ? atoi(str) : 0; - str = database_get_data(conf_node, "oper_chan", RECDB_QSTRING); + str = database_get_data(conf_node, "oper_channel", RECDB_QSTRING); if(str) { chanserv_conf.oper_channel = AddChannel(str, now, "+tinms", NULL); @@ -8963,6 +8976,7 @@ init_chanserv(const char *nick) DEFINE_COMMAND(unf, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(ping, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); + DEFINE_COMMAND(pong, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(wut, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(8ball, 2, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(d, 2, 0, "flags", "+nolog,+toy,+acceptchan", NULL); diff --git a/src/mod-blacklist.c b/src/mod-blacklist.c index e202f73..61d0adf 100644 --- a/src/mod-blacklist.c +++ b/src/mod-blacklist.c @@ -53,9 +53,9 @@ static struct { } conf; #if defined(GCC_VARMACROS) -# define blacklist_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, ARGS); } while (0) +# define blacklist_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, ARGS); } while (0) #elif defined(C99_VARMACROS) -# define blacklist_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0) +# define blacklist_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0) #endif static void diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index ce8a374..24de72d 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -40,7 +40,7 @@ */ #include "chanserv.h" -#include "opserv.h" +#include "opserv.h" /* devnull management! */ #include "nickserv.h" #include "conf.h" #include "modcmd.h" @@ -52,6 +52,7 @@ #define KEY_MANAGERS "Manager" #define KEY_ASSIGNMENTS "Assignments" #define KEY_ACTIVE "active" +#define KEY_DEVNULL "devnull" #define HS_FAKEHOST_SPECIAL_CHARS "_-:;" /* alphanum already included */ @@ -79,6 +80,7 @@ static const struct message_entry msgtab[] = { { "HSMSG_UNKNOWN_FAKEHOST", "Fakehost $b%s.%s$b is unknown or you have no access to manage it." }, { "HSMSG_TOPLEVEL_FAKEHOSTS", "Fakehosts in group $b*.%s$b:" }, { "HSMSG_TOPLEVEL_FAKEHOST", " $b%s.%s$b assignments: %d managers: %d" }, + { "HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", " $b%s.%s$b assignments: %d managers: %d DevNull: %s" }, { "HSMSG_TOPLEVEL_INVALID", "The name of the group you entered is invalid ($b%s$b)" }, { "HSMSG_MANAGERS_TOPLEVEL", "Managers of group $b*.%s$b:" }, { "HSMSG_MANAGERS_FAKEHOST", "Managers of group $b%s.%s$b:" }, @@ -101,6 +103,8 @@ static const struct message_entry msgtab[] = { { "HSMSG_FAKEHOST_ASSIGN_SUCCESS", "Group $b%s.%s$b was assigned successfully." }, { "HSMSG_FAKEHOST_ASSIGNED", "Group $b%s.%s$b is already assigned to the user." }, { "HSMSG_FAKEHOST_UNASSIGN_SUCCESS", "Group $b%s.%s$b was unassigned successfully." }, + { "HSMSG_FAKEHOST_TLDEVNULL", "You can't assign a DevNull class to a toplevel fakehost." }, + { "HSMSG_DEVNULL_CLASS", "$b%s.%s$b DevNull Class: %s" }, { NULL, NULL } }; @@ -139,6 +143,7 @@ struct hs_secondlevel { struct hs_toplevel *toplevel; char *fakehost; struct hs_manager *managers; + int devnull_id; struct hs_assignment *assignments; struct hs_secondlevel *next; }; @@ -646,7 +651,11 @@ static void cmd_view_toplevel_information(UNUSED_ARG(struct userNode *user), UNU int assignments = 0; for(assignment = slfh->assignments; assignment; assignment = assignment->next) assignments++; - reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers); + struct devnull_class *th; + if(slfh->devnull_id && (th = devnull_find_id(slfh->devnull_id))) + reply("HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", slfh->fakehost, tlfh->fakehost, assignments, managers, th->name); + else + reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers); } reply("HSMSG_MANAGERS_TOPLEVEL", tlfh->fakehost); struct hs_manager *cmanager; @@ -1224,6 +1233,78 @@ static MODCMD_FUNC(cmd_oset) { } } +static MODCMD_FUNC(cmd_setdevnull) { + struct handle_info *hi; + if (!(hi = user->handle_info)) { + reply("NSMSG_MUST_AUTH"); + return 0; + } + struct hs_fakehost_info fhinfo = parse_fakehost_info(argv[1], 1); + if(fhinfo.parse_state == HS_FHPARSE_INVALID) { + reply("HSMSG_TOPLEVEL_INVALID", argv[1]); + return 0; + } + if(!fhinfo.have_secondlevel) { + reply("HSMSG_FAKEHOST_TLDEVNULL"); + return 0; + } else { + if(!fhinfo.tlfh) { + reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); + return 0; + } + if(!check_management_access(hi, NULL, NULL)) { + reply("HSMSG_ACCESS_DENIED"); + return 0; + } + char *fakehost_name; + if(!strcmp(argv[2], "*")) { + fhinfo.slfh->devnull_id = 0; + fakehost_name = "-"; + } else { + struct devnull_class *th = devnull_find_name(argv[2]); + if(!th) { + reply("OSMSG_DEVNULL_NOTFOUND", argv[2]); + return 0; + } + fhinfo.slfh->devnull_id = th->id; + fakehost_name = th->name; + } + reply("HSMSG_DEVNULL_CLASS", fhinfo.slfh_name, fhinfo.tlfh_name, fakehost_name); + } + return 1; +} + + +struct devnull_class hostserv_get_user_priv(struct handle_info *hi) { + struct devnull_class th; + memset(&th, 0, sizeof(th)); + + struct hs_user *huser = hs_get_user(hi, 0); + if(huser) { + struct hs_assignment *assignment; + struct hs_secondlevel *slfh; + struct devnull_class *devc; + for(assignment = huser->assignments; assignment; assignment = assignment->unext) { + slfh = assignment->secondlevel; + if(slfh->devnull_id) { + devc = devnull_find_id(slfh->devnull_id); + if(!devc) { + slfh->devnull_id = 0; + continue; + } + if(DEVNULL_HAS_PRIV(devc, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < devc->maxchan)) + th.maxchan = devc->maxchan; + if(DEVNULL_HAS_PRIV(devc, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < devc->maxsendq)) + th.maxsendq = devc->maxsendq; + th.modes |= devc->modes; + if(!th.name) + th.name = devc->name; + } + } + } + return th; +} + static void hostserv_conf_read(void) { dict_t conf_node; const char *str; @@ -1311,6 +1392,7 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ struct hs_manager *managerSL; struct hs_user *user; struct dict *object; + char *str; if (rd->type == RECDB_OBJECT) { dict_t db = GET_RECORD_OBJECT(rd); @@ -1318,6 +1400,10 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ slfh = hs_add_secondlevel(tlfh, name); + str = database_get_data(db, KEY_DEVNULL, RECDB_QSTRING); + if(str) + slfh->devnull_id = atoi(str); + if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) { for (it = dict_first(object); it; it = iter_next(it)) { user = hs_get_user(get_handle_info(iter_key(it)), 1); @@ -1392,6 +1478,9 @@ hostserv_saxdb_write(struct saxdb_context *ctx) for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) { saxdb_start_record(ctx, slfh->fakehost, 1); + if(slfh->devnull_id) + saxdb_write_int(ctx, KEY_DEVNULL, slfh->devnull_id); + saxdb_start_record(ctx, KEY_MANAGERS, 1); for(manager = slfh->managers; manager; manager = manager->next) { saxdb_start_record(ctx, manager->user->hi->handle, 0); @@ -1453,7 +1542,11 @@ int hostserv_init() { modcmd_register(hostserv_module, "delhost", cmd_delhost, 2, MODCMD_REQUIRE_AUTHED, NULL); modcmd_register(hostserv_module, "renamehost", cmd_renamehost, 3, MODCMD_REQUIRE_AUTHED, NULL); modcmd_register(hostserv_module, "oset", cmd_oset, 3, MODCMD_REQUIRE_AUTHED, NULL); + modcmd_register(hostserv_module, "setdevnull", cmd_setdevnull, 3, MODCMD_REQUIRE_AUTHED, NULL); message_register_table(msgtab); + + /* "register" own devnull privilege handler */ + devnull_check_priv_func = hostserv_get_user_priv; return 1; } diff --git a/src/mod-iauth_loc.c b/src/mod-iauth_loc.c index 78668c0..1eba722 100644 --- a/src/mod-iauth_loc.c +++ b/src/mod-iauth_loc.c @@ -32,9 +32,9 @@ static struct { } conf; #if defined(GCC_VARMACROS) -# define loc_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, ARGS); } while (0) +# define loc_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, ARGS); } while (0) #elif defined(C99_VARMACROS) -# define loc_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0) +# define loc_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0) #endif static void diff --git a/src/nickserv.c b/src/nickserv.c index 25c2a43..089cc93 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -491,7 +491,7 @@ register_handle(const char *handle, const char *passwd, unsigned long id) hi->id = id; hi->website = NULL; - hi->devnull = NULL; + hi->devnull_id = 0; dict_insert(nickserv_id_dict, strdup(id_base64), hi); return hi; @@ -578,7 +578,6 @@ free_handle_info(void *vhi) free(hi->infoline); free(hi->epithet); free(hi->fakehost); - free(hi->devnull); free(hi->website); free(hi->fakeident); if (hi->cookie) { @@ -1510,8 +1509,10 @@ static NICKSERV_FUNC(cmd_handleinfo) } reply("NSMSG_HANDLEINFO_INFOLINE", (hi->infoline ? hi->infoline : nsmsg_none)); - if ((oper_has_access(user, cmd->parent->bot, 200, 1)) || IsNetworkHelper(user)) - reply("NSMSG_HANDLEINFO_DEVNULL", (hi->devnull ? hi->devnull : nsmsg_none)); + if ((oper_has_access(user, cmd->parent->bot, 200, 1)) || IsNetworkHelper(user)) { + struct devnull_class *devnull_c = (hi->devnull_id ? devnull_find_id(hi->devnull_id) : NULL); + reply("NSMSG_HANDLEINFO_DEVNULL", (devnull_c ? devnull_c->name : nsmsg_none)); + } if (user->handle_info && HANDLE_FLAGGED(user->handle_info, BOT)) reply("NSMSG_HANDLEINFO_WEBSITE", (hi->website ? hi->website : nsmsg_none)); if(hi->opserv_level > 0 && user->handle_info && HANDLE_FLAGGED(user->handle_info, BOT)) @@ -2649,52 +2650,46 @@ static OPTION_FUNC(opt_info) static OPTION_FUNC(opt_devnull) { - const char *devnull; - + const char *devnull_name; + struct devnull_class *devnull_c; + if (argc > 1) { if (!override) { send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]); return 0; } if ((argv[1][0] == '*') && (argv[1][1] == 0)) { - free(hi->devnull); - hi->devnull = NULL; + hi->devnull_id = 0; } else { - devnull = unsplit_string(argv+1, argc-1, NULL); - if(devnull_check(devnull) == 1) { - if(hi->devnull) - free(hi->devnull); - hi->devnull = strdup(devnull); - } + devnull_name = unsplit_string(argv+1, argc-1, NULL); + devnull_c = devnull_find_name(devnull_name); + if(devnull_c) + hi->devnull_id = devnull_c->id; } } - devnull = hi->devnull ? hi->devnull : user_find_message(user, "MSG_NONE"); - send_message(user, nickserv, "NSMSG_SET_DEVNULL", devnull); - return 1; -} - -void nickserv_devnull_delete(char *name) { - dict_iterator_t it; - struct handle_info *hi; - - for (it = dict_first(nickserv_handle_dict); it; it = iter_next(it)) { - hi = iter_data(it); - if (hi->devnull && !irccasecmp(name, hi->devnull)) { - free(hi->devnull); - hi->devnull = NULL; + if(hi->devnull_id) { + devnull_c = devnull_find_id(hi->devnull_id); + if(devnull_c) + devnull_name = devnull_c->name; + else { + devnull_name = user_find_message(user, "MSG_NONE"); + hi->devnull_id = 0; } - } + } else + devnull_name = user_find_message(user, "MSG_NONE"); + send_message(user, nickserv, "NSMSG_SET_DEVNULL", devnull_name); + return 1; } -void nickserv_devnull_rename(char *oldname, char *newname) { +void nickserv_devnull_delete(unsigned int devnull_id) { dict_iterator_t it; struct handle_info *hi; for (it = dict_first(nickserv_handle_dict); it; it = iter_next(it)) { hi = iter_data(it); - if (hi->devnull && !irccasecmp(oldname, hi->devnull)) { - hi->devnull = strdup(newname); + if (hi->devnull_id == devnull_id) { + hi->devnull_id = 0; } } } @@ -3500,8 +3495,8 @@ nickserv_saxdb_write(struct saxdb_context *ctx) { saxdb_write_int(ctx, KEY_ID, hi->id); if (hi->infoline) saxdb_write_string(ctx, KEY_INFO, hi->infoline); - if (hi->devnull) - saxdb_write_string(ctx, KEY_DEVNULL, hi->devnull); + if (hi->devnull_id) + saxdb_write_int(ctx, KEY_DEVNULL, hi->devnull_id); if (hi->website) saxdb_write_string(ctx, KEY_WEBSITE, hi->website); if (hi->last_quit_host[0]) @@ -3730,9 +3725,10 @@ struct nickserv_discrim { const char *fakehostmask; const char *fakeidentmask; const char *website; - const char *devnullclass; const char *handlemask; const char *emailmask; + const char *devnull_name; + unsigned int devnull_id; }; typedef void (*discrim_search_func)(struct userNode *source, struct handle_info *hi, struct nickserv_discrim *discrim); @@ -3878,9 +3874,16 @@ nickserv_discrim_create(struct userNode *user, unsigned int argc, char *argv[]) } } else if (!irccasecmp(argv[i], "devnull")) { if (!irccasecmp(argv[++i], "*")) { - discrim->devnullclass = 0; + discrim->devnull_id = 0; + discrim->devnull_name = 0; } else { - discrim->devnullclass = argv[i]; + struct devnull_class *th = devnull_find_name(argv[i]); + if(!th) { + send_message(user, nickserv, "OSMSG_DEVNULL_NOTFOUND", argv[i]); + goto fail; + } + discrim->devnull_name = argv[i]; + discrim->devnull_id = th->id; } } else if (!irccasecmp(argv[i], "handlemask") || !irccasecmp(argv[i], "accountmask")) { if (!irccasecmp(argv[++i], "*")) { @@ -3959,7 +3962,7 @@ nickserv_discrim_match(struct nickserv_discrim *discrim, struct handle_info *hi) || (discrim->fakehostmask && (!hi->fakehost || !match_ircglob(hi->fakehost, discrim->fakehostmask))) || (discrim->fakeidentmask && (!hi->fakeident || !match_ircglob(hi->fakeident, discrim->fakeidentmask))) || (discrim->website && (!hi->website || !match_ircglob(hi->website, discrim->website))) - || (discrim->devnullclass && (!hi->devnull || !match_ircglob(hi->devnull, discrim->devnullclass))) + || (discrim->devnull_id && discrim->devnull_id != hi->devnull_id) || (discrim->emailmask && (!hi->email_addr || !match_ircglob(hi->email_addr, discrim->emailmask))) || (discrim->min_level > hi->opserv_level) || (discrim->max_level < hi->opserv_level) @@ -4043,9 +4046,14 @@ search_print_func(struct userNode *source, struct handle_info *match, struct nic discrim->output_table->contents[discrim->output_table_pos][i++] = (match->fakehost ? match->fakehost : "*"); if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_WEBSITE) discrim->output_table->contents[discrim->output_table_pos][i++] = (match->website ? match->website : "*"); - if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL) - discrim->output_table->contents[discrim->output_table_pos][i++] = (match->devnull ? match->devnull : "*"); - + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL) { + if(discrim->devnull_name) + discrim->output_table->contents[discrim->output_table_pos][i++] = discrim->devnull_name; + else { + struct devnull_class *devnull = devnull_find_id(match->devnull_id); + discrim->output_table->contents[discrim->output_table_pos][i++] = (devnull ? devnull->name : "*"); + } + } } } else send_message(source, nickserv, "NSMSG_SEARCH_MATCH", match->handle); @@ -4330,8 +4338,7 @@ nickserv_db_read_handle(const char *handle, dict_t obj) if (str) hi->website = strdup(str); str = database_get_data(obj, KEY_DEVNULL, RECDB_QSTRING); - if (str) - hi->devnull = strdup(str); + hi->devnull_id = str ? strtoul(str, NULL, 0) : 0; str = database_get_data(obj, KEY_REGISTER_ON, RECDB_QSTRING); hi->registered = str ? strtoul(str, NULL, 0) : now; str = database_get_data(obj, KEY_LAST_SEEN, RECDB_QSTRING); diff --git a/src/nickserv.h b/src/nickserv.h index 322170e..a37195f 100644 --- a/src/nickserv.h +++ b/src/nickserv.h @@ -109,13 +109,13 @@ struct handle_info { struct language *language; struct authlogEntry *authlog; char *website; - char *devnull; char *email_addr; char *epithet; char *infoline; char *handle; char *fakehost; char *fakeident; + unsigned int devnull_id; unsigned long id; unsigned long registered; unsigned long lastseen; @@ -158,8 +158,7 @@ int staff_has_access(struct userNode *user, struct userNode *bot, unsigned int m void nickserv_show_oper_accounts(struct userNode *user, struct svccmd *cmd); struct handle_info *checklogin(const char *user, const char *pass, const char *numeric, const char *hostmask, const char *ipmask); char *getfakehost(const char *user); -void nickserv_devnull_delete(char *name); -void nickserv_devnull_rename(char *oldname, char *newname); +void nickserv_devnull_delete(unsigned int devnull_id); char *generate_fakehost(struct handle_info *handle); char *generate_fakeident(struct handle_info *handle, struct userNode *user); void apply_fakehost(struct handle_info *handle, struct userNode *user); diff --git a/src/opserv.c b/src/opserv.c index 83eb310..6c6ac33 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 "devnull_id" +#define KEY_DEVNULL_ID "id" #define KEY_DEVNULL_NAME "class" #define KEY_DEVNULL_MODE "modes" #define KEY_DEVNULL_MAXCHAN "chanlimit" @@ -329,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; @@ -435,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, @@ -2814,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,14 +2848,18 @@ static int devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra)) { struct record_data *rd = data; - const char *nameb = name, *str; + const char *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) { @@ -2860,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; } @@ -2871,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); @@ -2900,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))) @@ -2972,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]; @@ -2989,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; @@ -4296,8 +4312,7 @@ static MODCMD_FUNC(cmd_listdevnull) tbl.contents[0][12] = "+X"; tbl.contents[0][13] = "MaxQ"; tbl.contents[0][14] = "OpMe"; - if(!count) - { + if(!count) { table_send(cmd->parent->bot, user->nick, 0, NULL, tbl); reply("MSG_NONE"); free(tbl.contents[0]); @@ -4308,82 +4323,84 @@ 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)) { - tbl.contents[ii][13] = on; + if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) { + char maxsenqbuf[MAXLEN]; + sprintf(maxsenqbuf, "%lu", th->maxsendq); + tbl.contents[ii][13] = strdup(maxsenqbuf); } else { - tbl.contents[ii][13] = off; + tbl.contents[ii][13] = strdup(off); } - if(DEVNULL_FLAGGED(th, MODE_OPME)) { + if(DEVNULL_HAS_PRIV(th, OPME)) { tbl.contents[ii][14] = on; } else { tbl.contents[ii][14] = off; } } table_send(cmd->parent->bot, user->nick, 0, NULL, tbl); - for(ii = 1; ii < tbl.length; ++ii) - { + for(ii = 1; ii < tbl.length; ++ii) { + free(tbl.contents[ii][13]); free(tbl.contents[ii]); } free(tbl.contents[0]); @@ -4428,7 +4445,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; } @@ -4442,7 +4459,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]); } @@ -4457,8 +4474,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 { @@ -4479,236 +4495,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 +4726,66 @@ 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_get(const char *name) { - return dict_find(opserv_devnull_classes, name, 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; +} + +int devnull_user_has_priv(struct handle_info *hi, int devnull_priv) { + if(devnull_check_priv_func) { + struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi); + if((ext_class.modes & devnull_priv)) + return (ext_class.modes & devnull_priv); + } + + if(!hi->devnull_id) + return 0; + struct devnull_class *th = devnull_find_id(hi->devnull_id); + if(!th) + return 0; + return (th->modes & devnull_priv); +} + +struct devnull_class devnull_user_get_class(struct handle_info *hi) { + struct devnull_class th; + memset(&th, 0, sizeof(th)); + + if(devnull_check_priv_func) { + struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi); + th.modes |= ext_class.modes; + if(ext_class.name) + th.name = ext_class.name; + if(DEVNULL_HAS_PRIV(&th, CHANLIMIT)) + th.maxchan = ext_class.maxchan; + if(DEVNULL_HAS_PRIV(&th, MAXSENDQ)) + th.maxsendq = ext_class.maxsendq; + } + + if(hi->devnull_id) { + struct devnull_class *thp; + if((thp = devnull_find_id(hi->devnull_id))) { + 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..169f432 100644 --- a/src/opserv.h +++ b/src/opserv.h @@ -21,43 +21,46 @@ #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_PRIV_##tok) +#define DEVNULL_SET_PRIV(cl, tok) ((cl)->modes |= DEVNULL_PRIV_##tok) +#define DEVNULL_CLEAR_PRIV(cl, tok) ((cl)->modes &= ~DEVNULL_PRIV_##tok) struct devnull_class { + unsigned int id; char *name; unsigned long modes; unsigned long maxchan; 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_user_has_priv(struct handle_info *hi, int devnull_priv); +struct devnull_class devnull_user_get_class(struct handle_info *hi); +struct devnull_class *devnull_find_id(unsigned int id); +struct devnull_class *devnull_find_name(const char *name); 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]; diff --git a/src/spamserv.c b/src/spamserv.c index c6d73cd..1788183 100644 --- a/src/spamserv.c +++ b/src/spamserv.c @@ -307,7 +307,8 @@ spamserv_cs_move_merge(struct userNode *user, struct chanNode *channel, struct c else snprintf(reason, sizeof(reason), "$X (channel %s) merged into %s by %s.", channel->name, target->name, user->handle_info->handle); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + /*global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);*/ + spamserv_oper_message("%s", reason); return 1; } @@ -343,7 +344,7 @@ spamserv_cs_unregister(struct userNode *user, struct chanNode *channel, enum cs_ spamserv_part_channel(channel, partmsg); spamserv_unregister_channel(cInfo); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, global); + spamserv_oper_message(SSMSG_CHANNEL_UNREGISTERED, spamserv->nick, channel->name, user->handle_info->handle); } } @@ -593,7 +594,11 @@ spamserv_user_join(struct modeNode *mNode) if(user->uplink->burst || !(cInfo = get_chanInfo(channel->name)) || !CHECK_JOINFLOOD(cInfo) || !(uInfo = get_userInfo(user->nick))) return 0; - + + if(IsOper(user)) + { + return; + } if(!CHECK_CHANOPS(cInfo)) { @@ -1098,7 +1103,6 @@ static SPAMSERV_FUNC(cmd_register) { struct chanInfo *cInfo; - char reason[MAXLEN]; if(!channel || !channel->channel_info) { @@ -1946,6 +1950,11 @@ spamserv_channel_message(struct chanNode *channel, struct userNode *user, char * if(!spamserv || quit_services || !GetUserMode(channel, spamserv) || !(cInfo = get_chanInfo(channel->name)) || !(uInfo = get_userInfo(user->nick))) return; + if(IsOper(user)) + { + return; + } + if(!CHECK_CHANOPS(cInfo)) { struct modeNode *mn = GetUserMode(channel, user);