summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/handle.c b/handle.c
index e84f098..c595f06 100644
--- a/handle.c
+++ b/handle.c
@@ -16,6 +16,7 @@
 
 #include "ircd.h"
 
+#include <ctype.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
@@ -27,6 +28,7 @@ static int
 join(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
+	char *cp;
 
 	/* TODO: support comma separated list of channels, keys */
 	ensure(peer->type, reply(peer, 451), 0);
@@ -34,6 +36,12 @@ join(struct Message *msg, struct Peer *peer)
 	ensure(peer->channels_c != lengthof(peer->channels), reply(peer, 405, msg->params[0]), 0)
 	ensure(*msg->params[0] == '#', reply(peer, 403, msg->params[0]), 0);
 
+	for (cp = msg->params[0]; *cp; ++cp)
+		ensure(
+			*cp != '\a' && *cp != ',' && *cp != ':',
+			reply(peer, 403, msg->params[0])
+		);
+
 	for (i = 0; i < peer->channels_c; ++i)
 		ensure(strcmp(channels[i].name, msg->params[0]), (void)0, 0);
 
@@ -97,10 +105,29 @@ static int
 nick(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
+	char *cp;
 
 	ensure(msg->params[0] && msg->params[0], reply(peer, 431), 0);
 	ensure(!(peer->modes & RESTRICTED), reply(peer, 484), 0);
 
+	cp = msg->params[0];
+	ensure(
+		isupper(*cp) || islower(*cp)
+		|| 0x5b <= *cp && *cp <= 0x60
+		|| 0x7b <= *cp && *cp <= 0x7d,
+		reply(peer, 432, msg->params[0]),
+		0
+	);
+	for (++cp; *cp; ++cp)
+		ensure(
+			isupper(*cp) || islower(*cp) || isdigit(*cp)
+			|| 0x5b <= *cp && *cp <= 0x60
+			|| 0x7b <= *cp && *cp <= 0x7d
+			|| *cp == '-',
+			reply(peer, 432, msg->params[0]),
+			0
+		);
+
 	for (i = 0; i < peers_c; ++i)
 		if (peers[i].fd != peer->fd)
 			ensure(
@@ -257,11 +284,19 @@ static int
 user(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
+	char *cp;
 
 	ensure(!peer->type, reply(peer, 462), 0);
 	for (i = 0; i < 4; ++i)
 		ensure(msg->params[i] && *msg->params[i], reply(peer, 461), 0);
 
+	for (cp = msg->params[0]; *cp; ++cp)
+		if (*cp == '@')
+		{
+			*cp = 0;
+			break;
+		}
+
 	user_reg(peer, NULL, msg->params[0], msg->params[3], msg->params[1]);
 
 	return 0;