// User now registered
if (!args[0]) // FIXME: error message
return 0;
- setNick(client, args[0], 32);
- printf("USER SET NICKNAME %s\n", client->nick);
+ setNick(client, args[0]);
+ if (client->nick)
+ printf("USER SET NICKNAME %s\n", client->nick);
fflush(stdout);
} else if(strcmp(command, "USER") == 0) {
// Send welcome
// Send welcome
sendMOTD(client);
} else if(strcmp(command, "JOIN") == 0) {
+ if (!client->nick) // FIXME: error message
+ return 0;
if (!args[0]) // FIXME: error message
return 0;
for (char *p = args[0]; *p; p++) // TODO: multiple channels
copy_strf(&databuf, ":%s 366 %s :End of /NAMES list\n", hostname, client->nick);
send_log(client->FD, databuf.buf, databuf.len, 0);
} else if(strcmp(command, "PRIVMSG") == 0) {
+ if (!client->nick) // FIXME: error message
+ return 0;
if (argc < 2) // FIXME: error message
return 0;
copy_strf(&databuf, ":%s PRIVMSG %s :%s\n", client->nick, args[0], args[1]);
} else if(strcmp(command, "PONG") == 0) {
// Do nothing
} else if(strcmp(command, "MODE") == 0) {
+ if (!client->nick) // FIXME: error message
+ return 0;
if (argc == 0) // FIXME: error message
return 0;
char *nick = args[0];
}
} else if(strcmp(command, "NAMES") == 0) {
// TODO: actual channel support
+ if (!client->nick) // FIXME: error message
+ return 0;
if (argc == 0) // FIXME: error message
return 0;
struct trie_find *f;
copy_strf(&databuf, ":%s 366 %s :End of /NAMES list\n", hostname, client->nick);
send_log(client->FD, databuf.buf, databuf.len, 0);
} else if(strcmp(command, "USERHOST") == 0) {
+ if (!client->nick) // FIXME: error message
+ return 0;
if (argc == 0) // FIXME: error message
return 0;
// TODO: actual host
copy_strf(&databuf, ":%s 302 %s :%s=+user@~localhost\n", hostname, client->nick, args[0]);
send_log(client->FD, databuf.buf, databuf.len, 0);
} else if(strcmp(command, "WHO") == 0) {
+ if (!client->nick) // FIXME: error message
+ return 0;
if (argc == 0) // FIXME: error message
return 0;
// TODO: actual host info
send_log(client->FD, databuf.buf, databuf.len, 0);
}
-void setNick(struct client_data *client, char* nickname, size_t size) {
+void setNick(struct client_data *client, char* nickname) {
// TODO: perform basic sanitization
- char *bruh = strchr(nickname, ' '); // FIXME: we should reject those tbh
- if (bruh)
- *bruh = 0;
+ char *bruh = strchr(nickname, ' ');
+ if (bruh || strlen(nickname) >= MAX_NICKLEN) {
+ copy_strf(&databuf, ":%s 432 * %s :Erroneous nickname\n", hostname, nickname);
+ send_log(client->FD, databuf.buf, databuf.len, 0);
+ return;
+ }
char *key = mystrdup(nickname);
if (!key) abort();
}
// Update nickname
- if(client->nickLen) {
+ if(client->nick) {
copy_strf(&databuf, ":%s NICK %s\n", client->nick, nickname);
send_log(client->FD, databuf.buf, databuf.len, 0);
sendall_log(client->FD, databuf.buf, databuf.len, 0);
trie_set(&client_map, client->key, NULL, NULL);
+ free(client->nick);
}
- strncpy(client->nick, nickname, size);
+ client->nick = mystrdup(nickname);
+ if (!client->nick)
+ abort();
if (trie_set(&client_map, client->key = key, client, 0) == -1)
abort();
- // Null term just incase
- client->nick[size-1] = 0;
- // Set length
- client->nickLen = strlen(client->nick);
return;
}
struct client_data *findClient(const char *nickname)
#endif
// Start GitHub Copilot
if(!byChoice) {
- databuf.len = 0;
- append_str(&databuf, ":");
- append_str(&databuf, cl->nick);
- append_str(&databuf, " QUIT :");
- append_str(&databuf, "Has left the building (Forced)\n");
+ copy_strf(&databuf, ":%s QUIT :Has left the building (Forced)\n", cl->nick);
sendall_log(cl->FD, databuf.buf, databuf.len, 0);
}
// Send error to client informing them that they will be disconnected
// ERROR :Closing Link: NICK ()
- databuf.len = 0;
- append_str(&databuf, "ERROR :Closing Link: ");
- append_str(&databuf, cl->nick);
- append_str(&databuf, " ()\n");
+ copy_strf(&databuf, "ERROR :Closing Link: %s ()\n", cl->nick);
send_log(cl->FD, databuf.buf, databuf.len, 0);
// End GitHub Copilot
shutdown(cl->FD, SHUT_RDWR);
closesocket(cl->FD);
if (cl->key)
trie_set(&client_map, cl->key, NULL, NULL);
+ free(cl->nick);
free(cl->key);
free(cl);
}