]> jfr.im git - solanum.git/blobdiff - src/newconf.c
implement configurable channel modes (closes #31)
[solanum.git] / src / newconf.c
index 53c3067b57e2770abaf393fc8b52783cba1d5788..cf675727678165cf1c46f76f6bbdb264b69df9b1 100644 (file)
@@ -29,6 +29,7 @@
 #include "blacklist.h"
 #include "sslproc.h"
 #include "privilege.h"
+#include "chmode.h"
 
 #define CF_TYPE(x) ((x) & CF_MTYPE)
 
@@ -1644,6 +1645,24 @@ conf_set_general_oper_umodes(void *data)
        set_modes_from_table(&ConfigFileEntry.oper_umodes, "umode", umode_table, data);
 }
 
+static void
+conf_set_general_certfp_method(void *data)
+{
+       char *method = data;
+
+       if (!strcasecmp(method, "sha1"))
+               ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_SHA1;
+       else if (!strcasecmp(method, "sha256"))
+               ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_SHA256;
+       else if (!strcasecmp(method, "sha512"))
+               ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_SHA512;
+       else
+       {
+               ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_SHA1;
+               conf_report_error("Ignoring general::certfp_method -- bogus certfp method %s", method);
+       }
+}
+
 static void
 conf_set_general_oper_only_umodes(void *data)
 {
@@ -1779,6 +1798,42 @@ conf_set_alias_target(void *data)
        yy_alias->target = rb_strdup(data);
 }
 
+static void
+conf_set_channel_autochanmodes(void *data)
+{
+       char *pm;
+       int what = MODE_ADD;
+
+       ConfigChannel.autochanmodes = 0;
+       for (pm = (char *) data; *pm; pm++)
+       {
+               switch (*pm)
+               {
+               case '+':
+                       what = MODE_ADD;
+                       break;
+               case '-':
+                       what = MODE_DEL;
+                       break;
+
+               default:
+                       if (chmode_table[(unsigned char) *pm].set_func == chm_simple)
+                       {
+                               if (what == MODE_ADD)
+                                       ConfigChannel.autochanmodes |= chmode_table[(unsigned char) *pm].mode_type;
+                               else
+                                       ConfigChannel.autochanmodes &= ~chmode_table[(unsigned char) *pm].mode_type;
+                       }
+                       else
+                       {
+                               conf_report_error("channel::autochanmodes -- Invalid channel mode %c", pm);
+                               continue;
+                       }
+                       break;
+               }
+       }
+}
+
 /* XXX for below */
 static void conf_set_blacklist_reason(void *data);
 
@@ -2376,6 +2431,7 @@ static struct ConfEntry conf_general_table[] =
        { "client_flood_message_time",  CF_INT,   NULL, 0, &ConfigFileEntry.client_flood_message_time   },
        { "max_ratelimit_tokens",       CF_INT,   NULL, 0, &ConfigFileEntry.max_ratelimit_tokens        },
        { "away_interval",              CF_INT,   NULL, 0, &ConfigFileEntry.away_interval               },
+       { "certfp_method",      CF_STRING, conf_set_general_certfp_method, 0, NULL },
        { "\0",                 0,        NULL, 0, NULL }
 };
 
@@ -2400,6 +2456,7 @@ static struct ConfEntry conf_channel_table[] =
        { "resv_forcepart",     CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart        },
        { "channel_target_change", CF_YESNO, NULL, 0, &ConfigChannel.channel_target_change      },
        { "disable_local_channels", CF_YESNO, NULL, 0, &ConfigChannel.disable_local_channels },
+       { "autochanmodes",      CF_QSTRING, conf_set_channel_autochanmodes, 0, NULL     },
        { "\0",                 0,        NULL, 0, NULL }
 };