]> jfr.im git - irc/atheme/atheme.git/commitdiff
make login failure NOTICEs opt-in
authorjesopo <redacted>
Fri, 30 Sep 2022 20:38:49 +0000 (20:38 +0000)
committerjesopo <redacted>
Fri, 30 Sep 2022 20:41:30 +0000 (20:41 +0000)
include/atheme/account.h
libathemecore/services.c
modules/nickserv/Makefile
modules/nickserv/set_loginfails.c [new file with mode: 0644]

index bf9469d4537ea59c7155c3cd54402121c49ba544..d21bcaa2756d8cbcd855b64ec1b4552d98765395 100644 (file)
@@ -92,6 +92,7 @@ struct myuser
 #define MU_NOOP         0x00000004U
 #define MU_WAITAUTH     0x00000008U
 #define MU_HIDEMAIL     0x00000010U
+#define MU_LOGINFAILS   0x00000020U
 #define MU_NOMEMO       0x00000040U
 #define MU_EMAILMEMOS   0x00000080U
 #define MU_CRYPTPASS    0x00000100U
index ef6196ba3dae3f11c0488f4e55440634f3b5c25b..26e0833e3fcb7203f940b94269692dbc478f5028 100644 (file)
@@ -883,7 +883,7 @@ bad_password(struct sourceinfo *si, struct myuser *mu)
        svs = si->service;
        if (svs == NULL)
                svs = service_find("nickserv");
-       if (svs != NULL)
+       if (svs != NULL && MU_LOGINFAILS & mu->flags)
        {
                myuser_notice(svs->me->nick, mu, "\2%s\2 failed to login to \2%s\2. There %s been \2%d\2 failed login %s since your last successful login.", mask, entity(mu)->name, count == 1 ? "has" : "have", count, count == 1 ? "attempt" : "attempts");
        }
index 2744c39fad448d6f5a26e004625253468880ad2c..ceff3f80a114afb60e087c3616dc9040dad7c853 100644 (file)
@@ -59,6 +59,7 @@ SRCS   =                    \
     set_hidelastlogin.c     \
     set_hidemail.c          \
     set_language.c          \
+    set_loginfails.c        \
     set_nevergroup.c        \
     set_neverop.c           \
     set_nogreet.c           \
diff --git a/modules/nickserv/set_loginfails.c b/modules/nickserv/set_loginfails.c
new file mode 100644 (file)
index 0000000..26de695
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * SPDX-License-Identifier: ISC
+ * SPDX-URL: https://spdx.org/licenses/ISC.html
+ *
+ * Copyright (C) 2022 Atheme Development Group (https://atheme.github.io/)
+ *
+ * This file contains routines to handle the NickServ SET LOGINFAILS command.
+ */
+
+#include <atheme.h>
+#include "list_common.h"
+#include "list.h"
+
+static mowgli_patricia_t **ns_set_cmdtree = NULL;
+
+static bool
+has_loginfails(const struct mynick *mn, const void *arg)
+{
+       struct myuser *mu = mn->owner;
+
+       return ( mu->flags & MU_LOGINFAILS ) == MU_LOGINFAILS;
+}
+
+// SET LOGINFAILS ON|OFF
+static void
+ns_cmd_set_loginfails(struct sourceinfo *si, int parc, char *parv[])
+{
+       char *params = parv[0];
+
+       if (!params)
+       {
+               command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET LOGINFAILS");
+               return;
+       }
+
+       if (!strcasecmp("ON", params))
+       {
+               if (MU_LOGINFAILS & si->smu->flags)
+               {
+                       command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "LOGINFAILS", entity(si->smu)->name);
+                       return;
+               }
+
+               logcommand(si, CMDLOG_SET, "SET:LOGINFAILS:ON");
+
+               si->smu->flags |= MU_LOGINFAILS;
+
+               command_success_nodata(si, _("The \2%s\2 flag has been set for \2%s\2."), "LOGINFAILS" ,entity(si->smu)->name);
+
+               return;
+       }
+       else if (!strcasecmp("OFF", params))
+       {
+               if (!(MU_LOGINFAILS & si->smu->flags))
+               {
+                       command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "LOGINFAILS", entity(si->smu)->name);
+                       return;
+               }
+
+               logcommand(si, CMDLOG_SET, "SET:LOGINFAILS:OFF");
+
+               si->smu->flags &= ~MU_LOGINFAILS;
+
+               command_success_nodata(si, _("The \2%s\2 flag has been removed for \2%s\2."), "LOGINFAILS", entity(si->smu)->name);
+
+               return;
+       }
+       else
+       {
+               command_fail(si, fault_badparams, STR_INVALID_PARAMS, "SET LOGINFAILS");
+               return;
+       }
+}
+
+static struct command ns_set_loginfails = {
+       .name           = "LOGINFAILS",
+       .desc           = N_("Hides information about you from other users."),
+       .access         = AC_NONE,
+       .maxparc        = 1,
+       .cmd            = &ns_cmd_set_loginfails,
+       .help           = { .path = "nickserv/set_loginfails" },
+};
+
+static void
+mod_init(struct module *const restrict m)
+{
+       MODULE_TRY_REQUEST_SYMBOL(m, ns_set_cmdtree, "nickserv/set_core", "ns_set_cmdtree")
+
+       use_nslist_main_symbols(m);
+
+       command_add(&ns_set_loginfails, *ns_set_cmdtree);
+
+       static struct list_param loginfails;
+       loginfails.opttype = OPT_BOOL;
+       loginfails.is_match = has_loginfails;
+
+       list_register("loginfails", &loginfails);
+}
+
+static void
+mod_deinit(const enum module_unload_intent ATHEME_VATTR_UNUSED intent)
+{
+       command_delete(&ns_set_loginfails, *ns_set_cmdtree);
+
+       list_unregister("loginfails");
+}
+
+SIMPLE_DECLARE_MODULE_V1("nickserv/set_loginfails", MODULE_UNLOAD_CAPABILITY_OK)