From 0ba1da59101281fd8c6a91e068ba6dab1b9292dd Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Sun, 24 Jan 2021 05:13:03 -0800 Subject: [PATCH] Add +R channel mode module requiring services account to chat (#102) * Add +R channel mode module requiring services account to chat * Use void* in hook argument * move chm_regmsg from modules to extensions * generate error message when module fails to load --- extensions/Makefile.am | 1 + extensions/chm_regmsg.c | 92 +++++++++++++++++++++++++++++++++++++++++ include/messages.h | 1 + include/numeric.h | 2 +- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 extensions/chm_regmsg.c diff --git a/extensions/Makefile.am b/extensions/Makefile.am index 9b772207..83cdd0a7 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -15,6 +15,7 @@ extension_LTLIBRARIES = \ chm_insecure.la \ chm_nonotice.la \ chm_operpeace.la \ + chm_regmsg.la \ chm_sslonly.la \ createauthonly.la \ createoperonly.la \ diff --git a/extensions/chm_regmsg.c b/extensions/chm_regmsg.c new file mode 100644 index 00000000..9bf81523 --- /dev/null +++ b/extensions/chm_regmsg.c @@ -0,0 +1,92 @@ +/* + * Solanum: a slightly advanced ircd + * chm_regmsg: require identification to chat (+R mode). + * + * Copyright (c) 2020 Eric Mertens + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "stdinc.h" +#include "modules.h" +#include "hook.h" +#include "client.h" +#include "ircd.h" +#include "logger.h" +#include "send.h" +#include "s_conf.h" +#include "s_user.h" +#include "s_serv.h" +#include "numeric.h" +#include "chmode.h" +#include "inline/stringops.h" + +static const char chm_regmsg_desc[] = + "Adds channel mode +R, which blocks messagess from unregistered users"; + +static unsigned int mode_regmsg; + +static void chm_regmsg_process(void *); + +mapi_hfn_list_av1 chm_regmsg_hfnlist[] = { + { "privmsg_channel", (hookfn) chm_regmsg_process }, + { NULL, NULL } +}; + +static void +chm_regmsg_process(void *data_) +{ + hook_data_privmsg_channel *data = data_; + struct membership *msptr; + + /* message is already blocked, defer */ + if (data->approved) + return; + + /* user is identified, accept */ + if (!EmptyString(data->source_p->user->suser)) + return; + + /* voice and op override identification requirement, accept */ + msptr = find_channel_membership(data->chptr, data->source_p); + if (is_chanop_voiced(msptr)) + return; + + sendto_one_numeric(data->source_p, ERR_MSGNEEDREGGEDNICK, form_str(ERR_MSGNEEDREGGEDNICK), + data->source_p->name, data->chptr->chname); + data->approved = ERR_MSGNEEDREGGEDNICK; +} + +static int +_modinit(void) +{ + mode_regmsg = cflag_add('R', chm_simple); + if (mode_regmsg == 0) { + ierror("chm_regmsg: unable to allocate cmode slot for +R, unloading module"); + return -1; + } + + return 0; +} + +static void +_moddeinit(void) +{ + cflag_orphan('R'); +} + +DECLARE_MODULE_AV2(chm_regmsg, _modinit, _moddeinit, NULL, NULL, chm_regmsg_hfnlist, NULL, NULL, chm_regmsg_desc); diff --git a/include/messages.h b/include/messages.h index 60449841..080778ef 100644 --- a/include/messages.h +++ b/include/messages.h @@ -153,6 +153,7 @@ #define NUMERIC_STR_412 ":%s 412 %s :No text to send" #define NUMERIC_STR_413 "%s :No toplevel domain specified" #define NUMERIC_STR_414 "%s :Wildcard in toplevel Domain" +#define NUMERIC_STR_415 "%s %s :Cannot send message to channel (+R) - you need to be identified with services" #define NUMERIC_STR_416 ":%s 416 %s %s :output too large, truncated" #define NUMERIC_STR_421 ":%s 421 %s %s :Unknown command" #define NUMERIC_STR_422 ":%s 422 %s :MOTD File is missing" diff --git a/include/numeric.h b/include/numeric.h index 154ba98e..a6a3927e 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -230,7 +230,7 @@ #define ERR_NOTEXTTOSEND 412 #define ERR_NOTOPLEVEL 413 #define ERR_WILDTOPLEVEL 414 - +#define ERR_MSGNEEDREGGEDNICK 415 #define ERR_TOOMANYMATCHES 416 #define ERR_UNKNOWNCOMMAND 421