From 9ecafe1159cd5357cc7109c35e9356e3995fc873 Mon Sep 17 00:00:00 2001 From: Forest Belton <65484+forestbelton@users.noreply.github.com> Date: Tue, 22 Jun 2021 17:11:01 -0400 Subject: [PATCH] Don't allow nicknames to be used more than once --- paircd/handler/nick.py | 8 ++++++++ paircd/reply.py | 1 + paircd/server.py | 5 ++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/paircd/handler/nick.py b/paircd/handler/nick.py index f0b319f..46620f6 100644 --- a/paircd/handler/nick.py +++ b/paircd/handler/nick.py @@ -1,6 +1,7 @@ from paircd.client import Client from paircd.command_handler import CommandHandler from paircd.message import Message +from paircd.reply import ERR_NICKNAMEINUSE from paircd.server import Server @@ -11,6 +12,13 @@ class NickHandler(CommandHandler): async def handle(self, server: Server, client: Client, msg: Message) -> None: nickname = msg.args[0] + existing_client = server.get_client_by_name(nickname) + if existing_client is not None: + if client != existing_client: + target = client.nickname if client.nickname else nickname + client.write_message(ERR_NICKNAMEINUSE(target, nickname)) + return + # Remove stale references if they exist if client.nickname: server.remove_client_by_name(client.nickname) diff --git a/paircd/reply.py b/paircd/reply.py index 461af08..07050a2 100644 --- a/paircd/reply.py +++ b/paircd/reply.py @@ -35,6 +35,7 @@ ERR_NOSUCHSERVER = reply_fn(402, "{0} :No such server") ERR_NOSUCHCHANNEL = reply_fn(403, "{0} :No such channel") ERR_CANNOTSENDTOCHAN = reply_fn(404, "{0} :Cannot send to channel") ERR_TOOMANYCHANNELS = reply_fn(405, "{0} :You have joined too many channels") +ERR_NICKNAMEINUSE = reply_fn(433, "{0} :Nickname is already in use") ERR_NOTEXTTOSEND = reply_fn(412, ":No text to send") ERR_NOTREGISTERED = reply_fn(451, ":You have not registered") diff --git a/paircd/server.py b/paircd/server.py index 394be59..db491d1 100644 --- a/paircd/server.py +++ b/paircd/server.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from datetime import datetime -from typing import Dict +from typing import Dict, Optional from paircd.client import Client from paircd.channel import Channel @@ -20,5 +20,8 @@ class Server: self.channels_by_name[name] = Channel(name=name) return self.channels_by_name[name] + def get_client_by_name(self, name: str) -> Optional[Client]: + return self.clients_by_nick.get(name) + def remove_client_by_name(self, name: str) -> None: del self.clients_by_nick[name]