]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Implement user mode "b": block messages
authorDNS777 <dns@rbose.org>
Mon, 8 Oct 2012 10:11:04 +0000 (12:11 +0200)
committerAlexander Barton <alex@barton.de>
Mon, 8 Oct 2012 10:11:04 +0000 (12:11 +0200)
When a user has set mode "b", all private messages and notices to this
user are blocked if they don't originate from a registered user, an IRC Op,
server or service. The originator gets an error numeric sent back in this
case, ERR_CANNOTSENDTONICK_MSG(976), which is/was(?) used by KineIRCd, too.

This closes bug #144.

doc/Modes.txt
src/ngircd/defines.h
src/ngircd/irc-mode.c
src/ngircd/irc.c
src/ngircd/messages.h

index 8d7cdd70714d62d85844c68c28539615da33baef..aee7491c20783051d24d65705637c25ac3779cac 100644 (file)
@@ -22,6 +22,7 @@ channels he is using at the moment.
   mode since   description
 
   a    0.3.0   User is away.
+  b    20      User blocks private messages and notices.
   B    20      User is flagged as a "bot".
   c    17      IRC operator wants to receive connect/disconnect NOTICEs.
   C    19      Only users that share a channel are allowed to send messages.
index 37ca67640331d1aaef54181a7038e8f7b4cfa2ca..977bc74ed43e4416a4d3aa02161e64da0d996155 100644 (file)
 #endif
 
 /** Supported user modes. */
-#define USERMODES "aBcCioqrRswx"
+#define USERMODES "abBcCioqrRswx"
 
 /** Supported channel modes. */
 #define CHANMODES "abehiIklmMnoOPqQrRstvVz"
index c7d02c9101e224fe14d787ff2938e4cf165c0853..ce4044d0bf7b154401e10096af47abed1911550b 100644 (file)
@@ -215,6 +215,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                /* Validate modes */
                x[0] = '\0';
                switch (*mode_ptr) {
+               case 'b': /* Block private msgs */
                case 'C': /* Only messages from clients sharing a channel */
                case 'i': /* Invisible */
                case 's': /* Server messages */
index ceb649ecf350159d1db1bc969d0a5bb496372a2a..1a57bec16274e96a78077829126cd9c086a1e3e4 100644 (file)
@@ -500,6 +500,17 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                                Req->command = "PRIVMSG";
                        }
 #endif
+                       if (Client_HasMode(cl, 'b') &&
+                           !Client_HasMode(from, 'R') &&
+                           !Client_HasMode(from, 'o') &&
+                           !(Client_Type(from) == CLIENT_SERVER) &&
+                           !(Client_Type(from) == CLIENT_SERVICE)) {
+                               if (SendErrors && !IRC_WriteStrClient(from,
+                                               ERR_CANNOTSENDTONICK_MSG,
+                                               Client_ID(from), Client_ID(cl)))
+                                       return DISCONNECTED;
+                               goto send_next_target;
+                       }
 
                        if (Client_HasMode(cl, 'C')) {
                                cl2chan = Channel_FirstChannelOf(cl);
index ec7bb6fd495f78608a2ded2ec30a613580bd679c..59e9605d97f8b7a52a68fcdd863cefa0ef8c05e5 100644 (file)
 #define ERR_UMODEUNKNOWNFLAG2_MSG      "501 %s :Unknown mode \"%c%c\""
 #define ERR_USERSDONTMATCH_MSG         "502 %s :Can't set/get mode for other users"
 #define ERR_NOINVITE_MSG               "518 %s :Cannot invite to %s (+V)"
+#define ERR_CANNOTSENDTONICK_MSG       "976 %s :Cannot send to user (+b) -- Only registered users can message %s"
 
 #ifdef ZLIB
 # define RPL_STATSLINKINFOZIP_MSG      "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"