}
}
+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)
{
{ "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 },
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;
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;