]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/newconf.c
Backed out changeset 7f24e5f3fb86
[irc/rqf/shadowircd.git] / src / newconf.c
index 6e66204ef0ed78c803e206d9f059e561d0954e33..b8fcee13b1ca02f92366ec716a6595de617b4b8e 100644 (file)
@@ -28,6 +28,7 @@
 #include "snomask.h"
 #include "blacklist.h"
 #include "sslproc.h"
+#include "privilege.h"
 
 #define CF_TYPE(x) ((x) & CF_MTYPE)
 
@@ -53,6 +54,7 @@ static struct alias_entry *yy_alias = NULL;
 
 static char *yy_blacklist_host = NULL;
 static char *yy_blacklist_reason = NULL;
+static char *yy_privset_extends = NULL;
 
 static const char *
 conf_strtype(int type)
@@ -448,6 +450,60 @@ set_modes_from_table(int *modes, const char *whatis, struct mode_table *tab, con
        }
 }
 
+static void
+conf_set_privset_extends(void *data)
+{
+       yy_privset_extends = rb_strdup((char *) data);
+}
+
+static void
+conf_set_privset_privs(void *data)
+{
+       char *privs = NULL;
+       conf_parm_t *args = data;
+
+       for (; args; args = args->next)
+       {
+               if (privs == NULL)
+                       privs = rb_strdup(args->v.string);
+               else
+               {
+                       char *privs_old = privs;
+
+                       privs = rb_malloc(strlen(privs_old) + 1 + strlen(args->v.string) + 1);
+                       strcpy(privs, privs_old);
+                       strcat(privs, " ");
+                       strcat(privs, args->v.string);
+
+                       rb_free(privs_old);
+               }
+       }
+
+       if (privs)
+       {
+               if (yy_privset_extends)
+               {
+                       struct PrivilegeSet *set = privilegeset_get(yy_privset_extends);
+
+                       if (!set)
+                       {
+                               conf_report_error("Warning -- unknown parent privilege set %s for %s; assuming defaults", yy_privset_extends, conf_cur_block_name);
+
+                               set = privilegeset_get("default");
+                       }
+
+                       privilegeset_extend(set, conf_cur_block_name != NULL ? conf_cur_block_name : "<unknown>", privs, 0);
+
+                       rb_free(yy_privset_extends);
+                       yy_privset_extends = NULL;
+               }
+               else
+                       privilegeset_set_new(conf_cur_block_name != NULL ? conf_cur_block_name : "<unknown>", privs, 0);
+
+               rb_free(privs);
+       }
+}
+
 static int
 conf_begin_oper(struct TopConf *tc)
 {
@@ -521,6 +577,7 @@ conf_end_oper(struct TopConf *tc)
                yy_tmpoper->flags = yy_oper->flags;
                yy_tmpoper->umodes = yy_oper->umodes;
                yy_tmpoper->snomask = yy_oper->snomask;
+               yy_tmpoper->privset = yy_oper->privset;
 
 #ifdef HAVE_LIBCRYPTO
                if(yy_oper->rsa_pubkey_file)
@@ -569,6 +626,15 @@ conf_set_oper_flags(void *data)
        set_modes_from_table(&yy_oper->flags, "flag", oper_table, args);
 }
 
+static void
+conf_set_oper_privset(void *data)
+{
+       yy_oper->privset = privilegeset_get((char *) data);
+
+       if (!yy_oper->privset)
+               yy_oper->privset = privilegeset_get("default");
+}
+
 static void
 conf_set_oper_user(void *data)
 {
@@ -1967,12 +2033,20 @@ static struct ConfEntry conf_operator_table[] =
        { "rsa_public_key_file",  CF_QSTRING, conf_set_oper_rsa_public_key_file, 0, NULL },
        { "flags",      CF_STRING | CF_FLIST, conf_set_oper_flags,      0, NULL },
        { "umodes",     CF_STRING | CF_FLIST, conf_set_oper_umodes,     0, NULL },
+       { "privset",    CF_QSTRING, conf_set_oper_privset,      0, NULL },
        { "snomask",    CF_QSTRING, conf_set_oper_snomask,      0, NULL },
        { "user",       CF_QSTRING, conf_set_oper_user,         0, NULL },
        { "password",   CF_QSTRING, conf_set_oper_password,     0, NULL },
        { "\0", 0, NULL, 0, NULL }
 };
 
+static struct ConfEntry conf_privset_table[] =
+{
+       { "extends",    CF_QSTRING,             conf_set_privset_extends,       0, NULL },
+       { "privs",      CF_STRING | CF_FLIST,   conf_set_privset_privs,         0, NULL },
+       { "\0", 0, NULL, 0, NULL }
+};
+
 static struct ConfEntry conf_class_table[] =
 {
        { "ping_time",          CF_TIME, conf_set_class_ping_time,              0, NULL },
@@ -2134,6 +2208,7 @@ newconf_init()
        add_top_conf("log", NULL, NULL, conf_log_table);
        add_top_conf("operator", conf_begin_oper, conf_end_oper, conf_operator_table);
        add_top_conf("class", conf_begin_class, conf_end_class, conf_class_table);
+       add_top_conf("privset", NULL, NULL, conf_privset_table);
 
        add_top_conf("listen", conf_begin_listen, conf_end_listen, NULL);
        add_conf_item("listen", "port", CF_INT | CF_FLIST, conf_set_listen_port);