Privileged service fixes
authorEntrope <entrope@clan-dk.org>
Sun, 29 Feb 2004 03:40:25 +0000 (03:40 +0000)
committerEntrope <entrope@clan-dk.org>
Sun, 29 Feb 2004 03:40:25 +0000 (03:40 +0000)
* Allow runtime control of privileged services.

* Make all oper commands default to having flags +oper.

* Add a "privileged" directive for OpServ in srvx.conf.example.
git-archimport-id: srvx@srvx.net--2004-srvx/srvx--devo--1.3--patch-13

src/helpfile.c
src/modcmd.c
src/opserv.c
srvx.conf.example

index 9aa6b943d07cb2d11de5ca006182c2eb71683827..de0b06bb210222f7c8015834cf1355646a5d7dc3 100644 (file)
@@ -223,9 +223,9 @@ static void language_read_all(void)
     /* Read into an in-memory list and sort so we are likely to load
      * parent languages before their children (de_DE sorts after de).
      */
-    slist = alloc_string_list(4);
     if (!(dir = opendir("languages")))
         return;
+    slist = alloc_string_list(4);
     while ((dirent = readdir(dir)))
         string_list_append(slist, strdup(dirent->d_name));
     closedir(dir);
index 01e392ba963c5e882bb5c053485d414ba20b90c5..24776ff390e8b66e0d378fb8bae915dc766a0bf3 100644 (file)
@@ -114,6 +114,7 @@ static const struct message_entry msgtab[] = {
     { "MCMSG_DUPLICATE_TRIGGER", "$b%s$b already uses trigger $b%c$b." },
     { "MCMSG_CURRENT_TRIGGER", "Trigger for $b%s$b is $b%c$b." },
     { "MCMSG_NEW_TRIGGER", "Changed trigger for $b%s$b to $b%c$b." },
+    { "MCMSG_SERVICE_PRIVILEGED", "Service $b%s$b privileged: $b%s$b." },
     { "MCMSG_SERVICE_REMOVED", "Service $b%s$b has been deleted." },
     { "MCMSG_FILE_NOT_OPENED", "Unable to open file $b%s$b for writing." },
     { "MCMSG_MESSAGES_DUMPED", "Messages written to $b%s$b." },
@@ -1519,7 +1520,8 @@ static MODCMD_FUNC(cmd_showcommands) {
 
     /* Find the matching commands. */
     svccmd_list_init(&commands);
-    if (cmd->parent->privileged) ignore_flags = MODCMD_REQUIRE_OPER;
+    if (cmd->parent->privileged)
+        ignore_flags = MODCMD_REQUIRE_OPER;
     for (it = dict_first(cmd->parent->commands); it; it = iter_next(it)) {
         svccmd = iter_data(it);
         if (strchr(svccmd->name, ' '))
@@ -1673,6 +1675,21 @@ static MODCMD_FUNC(cmd_service_trigger) {
     return 1;
 }
 
+static MODCMD_FUNC(cmd_service_privileged) {
+    struct service *service;
+    const char *newval;
+
+    if (!(service = service_find(argv[1]))) {
+        reply("MCMSG_UNKNOWN_SERVICE", argv[1]);
+        return 0;
+    }
+    if (argc >= 3)
+        service->privileged = true_string(argv[2]) || enabled_string(argv[2]);
+    newval = user_find_message(user, service->privileged ? "MSG_ON" : "MSG_OFF");
+    reply("MCMSG_SERVICE_PRIVILEGED", service->bot->nick, newval);
+    return 1;
+}
+
 static MODCMD_FUNC(cmd_service_remove) {
     char *name, *reason;
     struct service *service;
@@ -1811,6 +1828,8 @@ modcmd_saxdb_write(struct saxdb_context *ctx) {
             saxdb_write_string(ctx, "trigger", buff);
         }
         saxdb_write_string(ctx, "description", service->bot->info);
+        if (service->privileged)
+            saxdb_write_string(ctx, "privileged", "1");
         saxdb_end_record(ctx);
     }
     saxdb_end_record(ctx);
@@ -1911,8 +1930,12 @@ modcmd_load_bots(struct dict *db) {
         desc = database_get_data(rd->d.object, "description", RECDB_QSTRING);
         if (desc)
         {
+            struct service *svc;
             bot = AddService(nick, desc);
-            service_register(bot, trigger);
+            svc = service_register(bot, trigger);
+            desc = database_get_data(rd->d.object, "privileged", RECDB_QSTRING);
+            if (desc && (true_string(desc) || enabled_string(desc)))
+                svc->privileged = 1;
         }
     }
 }
@@ -1934,23 +1957,24 @@ modcmd_init(void) {
     conf_register_reload(modcmd_conf_read);
 
     modcmd_module = module_register("modcmd", MAIN_LOG, "modcmd.help", modcmd_expand);
-    bind_command = modcmd_register(modcmd_module, "bind", cmd_bind, 4, MODCMD_KEEP_BOUND, "level", "800", NULL);
+    bind_command = modcmd_register(modcmd_module, "bind", cmd_bind, 4, MODCMD_KEEP_BOUND, "oper_level", "800", NULL);
     help_command = modcmd_register(modcmd_module, "help", cmd_help, 1, 0, "flags", "+nolog", NULL);
     modcmd_register(modcmd_module, "command", cmd_command, 2, 0, "flags", "+nolog", NULL);
     modcmd_register(modcmd_module, "modcmd", cmd_modcmd, 4, MODCMD_KEEP_BOUND, "template", "bind", NULL);
     modcmd_register(modcmd_module, "god", cmd_god, 0, MODCMD_REQUIRE_AUTHED, "flags", "+oper,+networkhelper", NULL);
-    modcmd_register(modcmd_module, "readhelp", cmd_readhelp, 2, 0, "level", "650", NULL);
-    modcmd_register(modcmd_module, "timecmd", cmd_timecmd, 2, 0, "level", "1", NULL);
+    modcmd_register(modcmd_module, "readhelp", cmd_readhelp, 2, 0, "oper_level", "650", NULL);
+    modcmd_register(modcmd_module, "timecmd", cmd_timecmd, 2, 0, "oper_level", "1", NULL);
     modcmd_register(modcmd_module, "unbind", cmd_unbind, 3, 0, "template", "bind", NULL);
     modcmd_register(modcmd_module, "joiner", cmd_joiner, 1, 0, NULL);
-    modcmd_register(modcmd_module, "stats modules", cmd_stats_modules, 1, 0, "level", "0", NULL);
-    modcmd_register(modcmd_module, "stats services", cmd_stats_services, 1, 0, "level", "0", NULL);
+    modcmd_register(modcmd_module, "stats modules", cmd_stats_modules, 1, 0, "flags", "+oper", NULL);
+    modcmd_register(modcmd_module, "stats services", cmd_stats_services, 1, 0, "flags", "+oper", NULL);
     modcmd_register(modcmd_module, "showcommands", cmd_showcommands, 1, 0, "flags", "+acceptchan", NULL);
     modcmd_register(modcmd_module, "helpfiles", cmd_helpfiles, 2, 0, "template", "bind", NULL);
-    modcmd_register(modcmd_module, "service add", cmd_service_add, 3, 0, NULL);
-    modcmd_register(modcmd_module, "service rename", cmd_service_rename, 3, 0, NULL);
-    modcmd_register(modcmd_module, "service trigger", cmd_service_trigger, 2, 0, NULL);
-    modcmd_register(modcmd_module, "service remove", cmd_service_remove, 2, 0, NULL);
+    modcmd_register(modcmd_module, "service add", cmd_service_add, 3, 0, "flags", "+oper", NULL);
+    modcmd_register(modcmd_module, "service rename", cmd_service_rename, 3, 0, "flags", "+oper", NULL);
+    modcmd_register(modcmd_module, "service trigger", cmd_service_trigger, 2, 0, "flags", "+oper", NULL);
+    modcmd_register(modcmd_module, "service privileged", cmd_service_privileged, 2, 0, "flags", "+oper", NULL);
+    modcmd_register(modcmd_module, "service remove", cmd_service_remove, 2, 0, "flags", "+oper", NULL);
     modcmd_register(modcmd_module, "dumpmessages", cmd_dump_messages, 1, 0, "oper_level", "1000", NULL);
     version_command = modcmd_register(modcmd_module, "version", cmd_version, 1, 0, NULL);
     message_register_table(msgtab);
index 8c2a356d91cee7a3b5e8203c217f65b93be08014..e1467fa3dd28d5b57a6c4a75faeb3679f2bc3728 100644 (file)
@@ -2358,9 +2358,9 @@ opserv_define_func(const char *name, modcmd_func_t *func, int min_level, int req
     case 2: iflags = MODCMD_REQUIRE_CHANNEL; break;
     }
     if (flags) {
-        return modcmd_register(opserv_module, name, func, min_argc, iflags, "level", buf, "flags", flags, NULL);
+        return modcmd_register(opserv_module, name, func, min_argc, iflags, "level", buf, "flags", flags, "flags", "+oper", NULL);
     } else {
-        return modcmd_register(opserv_module, name, func, min_argc, iflags, "level", buf, NULL);
+        return modcmd_register(opserv_module, name, func, min_argc, iflags, "level", buf, "flags", "+oper", NULL);
     }
 }
 
index 6c0e8410fa1823e4e5641edbda0fbb168041617e..5c999030b8bdc5ce18471eea9feca57e3c94dfbc 100644 (file)
 
     "opserv" {
         "nick" "OpServ";
+        "privileged" "1";
         // what channel should opserv send debug output to?
         "debug_channel" "#opserv";
         "debug_channel_modes" "+tinms";