]> PatchyGit - patchyircd.git/commitdiff
better nickname validation
authorEgor <egor@patchysicp.xyz>
Tue, 3 May 2022 12:48:02 +0000 (15:48 +0300)
committerEgor <egor@patchysicp.xyz>
Tue, 3 May 2022 12:48:02 +0000 (15:48 +0300)
irc.c

diff --git a/irc.c b/irc.c
index e84c38e..17575e7 100644 (file)
--- 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);