diff options
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 35 |
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; |