about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/defines.h2
-rw-r--r--src/ngircd/irc-mode.c1
-rw-r--r--src/ngircd/irc.c11
-rw-r--r--src/ngircd/messages.h1
4 files changed, 14 insertions, 1 deletions
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index 37ca6764..977bc74e 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -161,7 +161,7 @@
 #endif
 
 /** Supported user modes. */
-#define USERMODES "aBcCioqrRswx"
+#define USERMODES "abBcCioqrRswx"
 
 /** Supported channel modes. */
 #define CHANMODES "abehiIklmMnoOPqQrRstvVz"
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index c7d02c91..ce4044d0 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -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 */
diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c
index ceb649ec..1a57bec1 100644
--- a/src/ngircd/irc.c
+++ b/src/ngircd/irc.c
@@ -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);
diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h
index ec7bb6fd..59e9605d 100644
--- a/src/ngircd/messages.h
+++ b/src/ngircd/messages.h
@@ -151,6 +151,7 @@
 #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"