]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/opserv.c
sanity checkyng for jupe
[irc/evilnet/x3.git] / src / opserv.c
index 11d6a0d7363375ecb254456f95869e6b328e9470..4cd6886574710c2c93eabf13b14e13f1a25989e2 100644 (file)
@@ -29,6 +29,8 @@
 #include "saxdb.h"
 #include "shun.h"
 
+#include <regex.h>
+
 #ifdef HAVE_SYS_TIMES_H
 #include <sys/times.h>
 #endif
@@ -38,9 +40,7 @@
 #ifdef HAVE_ARPA_INET_H
 #include <arpa/inet.h>
 #endif
-#ifdef HAVE_REGEX_H
-#include <regex.h>
-#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; i<argc; i++) {
         if (irccasecmp(argv[i], "log") == 0) {
@@ -3380,6 +3398,18 @@ opserv_discrim_create(struct userNode *user, struct userNode *bot, unsigned int
             send_message(user, opserv, "MSG_INVALID_BINARY", argv[i]);
             goto fail;
         }
+    } else if (irccasecmp(argv[i], "silent") == 0) {
+        i++;
+        if(!oper_has_access(user, opserv, opserv_conf.silent_level, 0)) {
+            goto fail;
+        } else if (true_string(argv[i])) {
+            discrim->silent = 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);