]> jfr.im git - irc/freenode/solanum.git/commitdiff
Add +R channel mode module requiring services account to chat (#102)
authorEric Mertens <redacted>
Sun, 24 Jan 2021 13:13:03 +0000 (05:13 -0800)
committerGitHub <redacted>
Sun, 24 Jan 2021 13:13:03 +0000 (05:13 -0800)
* 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
extensions/chm_regmsg.c [new file with mode: 0644]
include/messages.h
include/numeric.h

index 9b77220753c6f14eb548af2c1a3083614a91302e..83cdd0a7680a2d22184e454f338b2ab61a48d94d 100644 (file)
@@ -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 (file)
index 0000000..9bf8152
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Solanum: a slightly advanced ircd
+ * chm_regmsg: require identification to chat (+R mode).
+ *
+ * Copyright (c) 2020 Eric Mertens <emertens@gmail.com>
+ *
+ * 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);
index 604498414d432524f201ee31b270e3175e76fc1e..080778ef65d2e47dfd644427f5f78d65c6455c73 100644 (file)
 #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"
index 154ba98e0242aeb172b004759d2a8e39425d5bc3..a6a3927e910c354d996a693ab534726754fd9586 100644 (file)
 #define ERR_NOTEXTTOSEND     412
 #define ERR_NOTOPLEVEL       413
 #define ERR_WILDTOPLEVEL     414
-
+#define ERR_MSGNEEDREGGEDNICK 415
 #define ERR_TOOMANYMATCHES   416
 
 #define ERR_UNKNOWNCOMMAND   421