From bb10433ec518f95151abda1cf179de69b12c61e4 Mon Sep 17 00:00:00 2001 From: Mike Quin Date: Sat, 12 Jun 2021 19:22:42 +0100 Subject: [PATCH] Port m_invex_regonly from ircd-seven (#178) Port m_invex_regonly from ircd-seven This module allows +I to be used to bypass +r (registered only) as well as +i (invite only). Co-authored-by: Doug Freed Co-authored-by: Ed Kellett --- extensions/Makefile.am | 1 + extensions/invex_regonly.c | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 extensions/invex_regonly.c diff --git a/extensions/Makefile.am b/extensions/Makefile.am index 1d3bcda8..850650fa 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -68,6 +68,7 @@ extension_LTLIBRARIES = \ drain.la \ identify_msg.la \ cap_realhost.la \ + invex_regonly.la \ example_module.la if HAVE_HYPERSCAN diff --git a/extensions/invex_regonly.c b/extensions/invex_regonly.c new file mode 100644 index 00000000..2cce04ab --- /dev/null +++ b/extensions/invex_regonly.c @@ -0,0 +1,46 @@ +/* + * invex_regonly.c Allow invite exemptions to bypass registered-only (+r) + */ +#include "stdinc.h" +#include "modules.h" +#include "hook.h" +#include "channel.h" +#include "s_conf.h" +#include "numeric.h" + +static void h_can_join(hook_data_channel *); + +mapi_hfn_list_av1 invex_regonly_hfnlist[] = { + { "can_join", (hookfn) h_can_join }, + { NULL, NULL } +}; + +DECLARE_MODULE_AV1(invex_regonly, NULL, NULL, NULL, NULL, invex_regonly_hfnlist, "$Revision$"); + +static void +h_can_join(hook_data_channel *data) +{ + struct Client *source_p = data->client; + struct Channel *chptr = data->chptr; + struct Ban *invex = NULL; + struct matchset ms; + rb_dlink_node *ptr; + + if(data->approved != ERR_NEEDREGGEDNICK) + return; + if(!ConfigChannel.use_invex) + return; + + matchset_for_client(source_p, &ms); + + RB_DLINK_FOREACH(ptr, chptr->invexlist.head) + { + invex = ptr->data; + if (matches_mask(&ms, invex->banstr) || + match_extban(invex->banstr, source_p, chptr, CHFL_INVEX)) + { + data->approved = 0; + break; + } + } +}