summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/anope.example.conf1
-rw-r--r--data/nickserv.example.conf6
-rw-r--r--modules/nickserv/nickserv.cpp3
-rw-r--r--modules/nickserv/ns_drop.cpp6
4 files changed, 16 insertions, 0 deletions
diff --git a/data/anope.example.conf b/data/anope.example.conf
index 4d8220d2e..4abaff3e3 100644
--- a/data/anope.example.conf
+++ b/data/anope.example.conf
@@ -746,6 +746,7 @@ log
* nickserv/cert - Can modify other users certificate lists
* nickserv/confirm - Can confirm other users nicknames
* nickserv/drop - Can drop other users nicks
+ * nickserv/drop/display - Allows dropping display nicks when preservedisplay is enabled
* nickserv/drop/override - Allows dropping nicks without using a confirmation code
* nickserv/recover - Can recover other users nicks
* operserv/config - Can modify services's configuration
diff --git a/data/nickserv.example.conf b/data/nickserv.example.conf
index 31e1a2d50..8d24cde57 100644
--- a/data/nickserv.example.conf
+++ b/data/nickserv.example.conf
@@ -219,6 +219,12 @@ module
* This directive is optional. If not set it defaults to 50.
*/
maxpasslen = 50
+
+ /*
+ * Whether all of the secondary nicks of a nick group have to expire or be
+ dropped before the display nick can expire or be dropped.
+ */
+ preservedisplay = no
}
/*
diff --git a/modules/nickserv/nickserv.cpp b/modules/nickserv/nickserv.cpp
index a8ffa51e6..fc02ff50d 100644
--- a/modules/nickserv/nickserv.cpp
+++ b/modules/nickserv/nickserv.cpp
@@ -536,6 +536,9 @@ public:
if (nickserv_expire && Anope::CurTime - na->last_seen >= nickserv_expire)
expire = true;
+ if (na->nc->na == na && na->nc->aliases->size() > 1 && Config->GetModule("nickserv")->Get<bool>("preservedisplay"))
+ expire = false;
+
FOREACH_MOD(OnPreNickExpire, (na, expire));
if (expire)
diff --git a/modules/nickserv/ns_drop.cpp b/modules/nickserv/ns_drop.cpp
index c35792060..6042bf326 100644
--- a/modules/nickserv/ns_drop.cpp
+++ b/modules/nickserv/ns_drop.cpp
@@ -57,6 +57,12 @@ public:
return;
}
+ if (na->nc->na == na && na->nc->aliases->size() > 1 && Config->GetModule("nickserv")->Get<bool>("preservedisplay") && !source.HasPriv("nickserv/drop/display"))
+ {
+ source.Reply(_("You may not drop \002%s\002 as it is the display nick for the account."), na->nick.c_str());
+ return;
+ }
+
auto *code = dropcode.Get(na);
if (params.size() < 2 || ((!code || !code->equals_ci(params[1])) && (!source.HasPriv("nickserv/drop/override") || params[1] != "OVERRIDE")))
{