X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/63c95a478af1b51ad021abef19f630de189f0229..df5f60703c6305ca3e034aef009b235ac62a9347:/src/opserv.c?ds=sidebyside diff --git a/src/opserv.c b/src/opserv.c index 11d6a0d..4cd6886 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -29,6 +29,8 @@ #include "saxdb.h" #include "shun.h" +#include + #ifdef HAVE_SYS_TIMES_H #include #endif @@ -38,9 +40,7 @@ #ifdef HAVE_ARPA_INET_H #include #endif -#ifdef HAVE_REGEX_H -#include -#endif + #define OPSERV_CONF_NAME "services/opserv" @@ -84,6 +84,7 @@ #define KEY_ISSUER "issuer" #define KEY_ISSUED "issued" #define KEY_ADMIN_LEVEL "admin_level" +#define KEY_SILENT_LEVEL "silent_level" #define IDENT_FORMAT "%s [%s@%s/%s]" #define IDENT_DATA(user) user->nick, user->ident, user->hostname, irc_ntoa(&user->ip) @@ -256,6 +257,8 @@ static const struct message_entry msgtab[] = { { "OSMSG_NAME_COLLIDE", "That name is already in use." }, { "OSMSG_SRV_CREATE_FAILED", "Server creation failed -- check log files." }, { "OSMSG_SERVER_JUPED", "Added new jupe server %s." }, + { "OSMSG_INVALID_NUMERIC", "Invalid numeric" }, + { "OSMSG_INVALID_SERVERNAME", "Server name must contain a '.'." }, { "OSMSG_SERVER_NOT_JUPE", "That server is not a juped server." }, { "OSMSG_SERVER_UNJUPED", "Server jupe removed." }, /* @@ -332,6 +335,7 @@ static struct { unsigned long join_flood_moderate; unsigned long join_flood_moderate_threshold; unsigned long admin_level; + unsigned long silent_level; } opserv_conf; struct trusted_host { @@ -381,6 +385,7 @@ typedef struct opservDiscrim { int authed : 2, info_space : 2; unsigned int intra_scmp : 2, intra_dcmp : 2; unsigned int use_regex : 1; + unsigned int silent : 1; } *discrim_t; struct discrim_and_source { @@ -399,7 +404,7 @@ static int ungag_helper_func(struct userNode *match, void *extra); typedef enum { REACT_NOTICE, REACT_KILL, - REACT_SILENT, +// REACT_SILENT, REACT_GLINE, REACT_TRACK, REACT_SHUN @@ -772,6 +777,10 @@ static MODCMD_FUNC(cmd_jupe) char numeric[COMBO_NUMERIC_LEN+1], srvdesc[SERVERDESCRIPTMAX+1]; num = atoi(argv[2]); + if(num == 0) { + reply("OSMSG_INVALID_NUMERIC"); + return 0; + } if ((num < 64) && !force_n2k) { inttobase64(numeric, num, 1); inttobase64(numeric+1, 64*64-1, 2); @@ -790,6 +799,10 @@ static MODCMD_FUNC(cmd_jupe) return 0; } snprintf(srvdesc, sizeof(srvdesc), "JUPE %s", unsplit_string(argv+3, argc-3, NULL)); + if(!strchr(argv[1], '.')) { + reply("OSMSG_INVALID_SERVERNAME"); + return 0; + } newsrv = AddServer(self, argv[1], 1, now, now, numeric, srvdesc); if (!newsrv) { reply("OSMSG_SRV_CREATE_FAILED"); @@ -1827,7 +1840,7 @@ static MODCMD_FUNC(cmd_stats_alerts) { switch (alert->reaction) { case REACT_NOTICE: reaction = "notice"; break; case REACT_KILL: reaction = "kill"; break; - case REACT_SILENT: reaction = "silent"; break; +// case REACT_SILENT: reaction = "silent"; break; case REACT_GLINE: reaction = "gline"; break; case REACT_TRACK: reaction = "track"; break; case REACT_SHUN: reaction = "shun"; break; @@ -2803,6 +2816,7 @@ foreach_matching_user(const char *hostmask, discrim_search_func func, void *extr discrim->intra_scmp = 0; discrim->intra_dcmp = 0; discrim->use_regex = 0; + discrim->silent = 0; dupmask = strdup(hostmask); if (split_ircmask(dupmask, &discrim->mask_nick, &discrim->mask_ident, &discrim->mask_host)) { if (!irc_pton(&discrim->ip_mask, &discrim->ip_mask_bits, discrim->mask_host)) @@ -2960,8 +2974,10 @@ add_user_alert(const char *key, void *data, UNUSED_ARG(void *extra)) reaction = REACT_NOTICE; else if (!irccasecmp(react, "kill")) reaction = REACT_KILL; + /* else if (!irccasecmp(react, "silent")) reaction = REACT_SILENT; + */ else if (!irccasecmp(react, "gline")) reaction = REACT_GLINE; else if (!irccasecmp(react, "track")) @@ -3154,7 +3170,7 @@ opserv_saxdb_write(struct saxdb_context *ctx) switch (alert->reaction) { case REACT_NOTICE: reaction = "notice"; break; case REACT_KILL: reaction = "kill"; break; - case REACT_SILENT: reaction = "silent"; break; +// case REACT_SILENT: reaction = "silent"; break; case REACT_GLINE: reaction = "gline"; break; case REACT_TRACK: reaction = "track"; break; case REACT_SHUN: reaction = "shun"; break; @@ -3274,6 +3290,8 @@ opserv_discrim_create(struct userNode *user, struct userNode *bot, unsigned int discrim->info_space = -1; discrim->intra_dcmp = 0; discrim->intra_scmp = 0; + discrim->use_regex = 0; + discrim->silent = 0; for (i=0; isilent = 1; + } else if (false_string(argv[i])) { + discrim->silent = 0; + } else { + send_message(user, opserv, "MSG_INVALID_BINARY", argv[i]); + goto fail; + } } else if (irccasecmp(argv[i], "duration") == 0) { discrim->duration = ParseInterval(argv[++i]); } else if (irccasecmp(argv[i], "channel") == 0) { @@ -3755,7 +3785,7 @@ trace_gline_func(struct userNode *match, void *extra) struct discrim_and_source *das = extra; if (is_oper_victim(das->source, match, das->discrim->match_opers)) { - opserv_block(match, das->source->handle_info->handle, das->discrim->reason, das->discrim->duration, 0); + opserv_block(match, das->source->handle_info->handle, das->discrim->reason, das->discrim->duration, das->discrim->silent); } return 0; @@ -4397,11 +4427,13 @@ alert_check_user(const char *key, void *data, void *extra) case REACT_KILL: DelUser(user, opserv, 1, alert->discrim->reason); return 1; +/* case REACT_SILENT: opserv_block(user, alert->owner, alert->discrim->reason, alert->discrim->duration, 1); return 1; +*/ case REACT_GLINE: - opserv_block(user, alert->owner, alert->discrim->reason, alert->discrim->duration, 0); + opserv_block(user, alert->owner, alert->discrim->reason, alert->discrim->duration, alert->discrim->silent); return 1; case REACT_SHUN: opserv_shun(user, alert->owner, alert->discrim->reason, alert->discrim->duration); @@ -4575,8 +4607,10 @@ static MODCMD_FUNC(cmd_addalert) reaction = REACT_NOTICE; else if (!irccasecmp(argv[2], "kill")) reaction = REACT_KILL; +/* else if (!irccasecmp(argv[2], "silent")) reaction = REACT_SILENT; +*/ else if (!irccasecmp(argv[2], "gline")) reaction = REACT_GLINE; else if (!irccasecmp(argv[2], "track")) { @@ -4664,6 +4698,9 @@ opserv_conf_read(void) str = database_get_data(conf_node, KEY_ADMIN_LEVEL, RECDB_QSTRING); opserv_conf.admin_level = str ? strtoul(str, NULL, 0): 800; + str = database_get_data(conf_node, KEY_SILENT_LEVEL, RECDB_QSTRING); + opserv_conf.silent_level = str ? strtoul(str, NULL, 0): 700; + str = database_get_data(conf_node, KEY_UNTRUSTED_MAX, RECDB_QSTRING); opserv_conf.untrusted_max = str ? strtoul(str, NULL, 0) : 5; str = database_get_data(conf_node, KEY_PURGE_LOCK_DELAY, RECDB_QSTRING);