From 0ab44c32a1db516b7cbc83d598186fb5ca7c1d02 Mon Sep 17 00:00:00 2001 From: Egor Date: Tue, 3 May 2022 15:48:02 +0300 Subject: [PATCH] better nickname validation --- irc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/irc.c b/irc.c index e84c38e..17575e7 100644 --- a/irc.c +++ b/irc.c @@ -298,7 +298,7 @@ void newUser(struct client_data *client) { copy_strf(&databuf, ":%s 004 %s PatchyIRCD 0.0.1 i nt\n", hostname, client->nick); send_log(client->FD, databuf.buf, databuf.len, 0); // FIXME: output nicklen from the actual macro - copy_strf(&databuf, ":%s 005 %s CASEMAPPING=rfc1459 NICKLEN=31 :are supported by this server\n", hostname, client->nick); + copy_strf(&databuf, ":%s 005 %s CASEMAPPING=rfc1459 NICKLEN=31 CHANTYPES=# :are supported by this server\n", hostname, client->nick); send_log(client->FD, databuf.buf, databuf.len, 0); copy_strf(&databuf, ":%s 251 %s :This server exists\n", hostname, client->nick); send_log(client->FD, databuf.buf, databuf.len, 0); @@ -321,12 +321,18 @@ void sendMOTD(struct client_data *client) { void setNick(struct client_data *client, char* nickname) { // TODO: perform basic sanitization - char *bruh = strchr(nickname, ' '); - if (bruh || strlen(nickname) >= MAX_NICKLEN) { + if (strlen(nickname) >= MAX_NICKLEN || nickname[0] == '\0') { copy_strf(&databuf, ":%s 432 * %s :Erroneous nickname\n", hostname, nickname); send_log(client->FD, databuf.buf, databuf.len, 0); return; } + const char *forbidden = " ,*?!@$:#&."; + while (*forbidden) + if (strchr(nickname, *forbidden++)) { + copy_strf(&databuf, ":%s 432 * %s :Erroneous nickname\n", hostname, nickname); + send_log(client->FD, databuf.buf, databuf.len, 0); + return; + } char key[MAX_NICKLEN]; strcpy(key, nickname); -- 2.56.0