]> jfr.im git - irc/freenode/solanum.git/commitdiff
Add general::hidden_caps
authorEd Kellett <redacted>
Sun, 8 Nov 2020 00:25:54 +0000 (00:25 +0000)
committerEd Kellett <redacted>
Sun, 8 Nov 2020 14:08:38 +0000 (14:08 +0000)
include/s_conf.h
ircd/newconf.c
ircd/s_conf.c
modules/m_cap.c

index be3a254da0586f3fa025a7e5747d60bc7a298fb3..f7681ce5c50d886f0a2c86a192f7347847432d5d 100644 (file)
@@ -235,6 +235,8 @@ struct config_file_entry
        int away_interval;
        int tls_ciphers_oper_only;
 
+       char **hidden_caps;
+
        int client_flood_max_lines;
        int client_flood_burst_rate;
        int client_flood_burst_max;
index b87c0134639e15eaf3a2751c05458423ceabb0b1..d6ae2eb20ddf00a46b0ee46adba806870c40d87c 100644 (file)
@@ -1665,6 +1665,30 @@ conf_set_general_oper_snomask(void *data)
        }
 }
 
+static void
+conf_set_general_hidden_caps(void *data)
+{
+       size_t n = 0;
+
+       for (conf_parm_t *arg = data; arg; arg = arg->next)
+               n += 1;
+
+       if (ConfigFileEntry.hidden_caps != NULL)
+       {
+               for (n = 0; ConfigFileEntry.hidden_caps[n] != NULL; n++)
+                       rb_free(ConfigFileEntry.hidden_caps[n]);
+               rb_free(ConfigFileEntry.hidden_caps);
+       }
+       ConfigFileEntry.hidden_caps = rb_malloc(sizeof *ConfigFileEntry.hidden_caps * (n + 1));
+
+       n = 0;
+       for (conf_parm_t *arg = data; arg; arg = arg->next)
+       {
+               ConfigFileEntry.hidden_caps[n++] = rb_strdup(arg->v.string);
+       }
+       ConfigFileEntry.hidden_caps[n] = NULL;
+}
+
 static void
 conf_set_serverhide_links_delay(void *data)
 {
@@ -2645,6 +2669,8 @@ static struct ConfEntry conf_general_table[] =
        { "non_redundant_klines",        CF_YESNO, NULL, 0, &ConfigFileEntry.non_redundant_klines },
        { "tkline_expire_notices",       CF_YESNO, NULL, 0, &ConfigFileEntry.tkline_expire_notices },
 
+       { "hidden_caps", CF_QSTRING | CF_FLIST, conf_set_general_hidden_caps, 0, NULL },
+
        { "anti_nick_flood",    CF_YESNO, NULL, 0, &ConfigFileEntry.anti_nick_flood     },
        { "burst_away",         CF_YESNO, NULL, 0, &ConfigFileEntry.burst_away          },
        { "caller_id_wait",     CF_TIME,  NULL, 0, &ConfigFileEntry.caller_id_wait      },
index b67d2388cfdb7bd6f0f7aa6e4d0142b5b409652f..8bd98aa05ed2187083a50fc1b64fd4a05c5d0ae4 100644 (file)
@@ -1535,6 +1535,14 @@ clear_out_old_conf(void)
        rb_free(ConfigFileEntry.sasl_service);
        ConfigFileEntry.sasl_service = NULL;
 
+       if (ConfigFileEntry.hidden_caps != NULL)
+       {
+               for (size_t i = 0; ConfigFileEntry.hidden_caps[i] != NULL; i++)
+                       rb_free(ConfigFileEntry.hidden_caps[i]);
+               rb_free(ConfigFileEntry.hidden_caps);
+       }
+       ConfigFileEntry.hidden_caps = NULL;
+
        /* clean out log */
        rb_free(ConfigFileEntry.fname_userlog);
        ConfigFileEntry.fname_userlog = NULL;
index d358a99c3dde6ee40d867c96e29b867d3a81d4bc..42e42ab11fd99b2e277a4eed0497e1dbc5e4d970 100644 (file)
@@ -187,6 +187,18 @@ clicap_generate(struct Client *source_p, const char *subcmd, int flags)
                else if (pass == 1 && HasCapabilityFlag(entry, CLICAP_FLAGS_PRIORITY))
                        continue;
 
+               if (!IsCapableEntry(source_p, entry) && ConfigFileEntry.hidden_caps != NULL)
+               {
+                       size_t i;
+                       for (i = 0; ConfigFileEntry.hidden_caps[i] != NULL; i++)
+                       {
+                               if (!rb_strcasecmp(entry->cap, ConfigFileEntry.hidden_caps[i]))
+                                       break;
+                       }
+                       if (ConfigFileEntry.hidden_caps[i] != NULL)
+                               continue;
+               }
+
                if (flags && !IsCapableEntry(source_p, entry))
                        continue;