diff --git a/server.py b/server.py index 5c91348..2c2c046 100644 --- a/server.py +++ b/server.py @@ -25,7 +25,7 @@ motd_file = None ping_timeout = 255 restrict_ip = '' def isalphanumeric(text:str, channel=False): - alphanumericity = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+=-_[]{};$%^*\\|'\",.<>?/`~" + ("#" if channel else "")) + alphanumericity = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+-_[]^\\|<>?`" + ("$%*,./~'\"{};#=" if channel else "")) for i in text: if not i in alphanumericity: return False @@ -295,7 +295,7 @@ def session(connection, client, ip, isssl=False): if command == "NICK" and not finished: pending = text.split(" ")[1] if pending[0] == ":": pending = pending[1:] - if "!" in pending or ":" in pending or "#" in pending or "*" in pending: + if not isalphanumeric(pending): connection.sendall(bytes(f":{server} 432 * {pending} :Erroneus nickname\r\n","UTF-8")) pending = "*" elif pending.lower() in lower_nicks: @@ -415,36 +415,39 @@ def session(connection, client, ip, isssl=False): channels = channels[1:] for channelt in channels.split(","): channel = channelt.strip() - if channel.lower() in lower_chans: - channel = lower_chans[channel.lower()] - success = True - if channel in channels_list: - if pending in channels_list[channel]: - success=False - print(f"{pending} is already in {channel} , ignoring JOIN request.") - if success: - try: - if channel in channels_list: - channels_list[channel].append(pending) - else: - channels_list[channel] = [pending] - lower_chans[channel.lower()] = channel - topic_list[channel] = "Topic is not implemented." - except: - connection.sendall(bytes(f":{server} NOTICE * :*** Could not join {channel}\r\n","UTF-8")) - print(channels_list) - for i in channels_list[channel]: - try: - nickname_list[i].sendall(bytes(f":{pending}!{rident}@{hostname} JOIN {channel}\r\n","UTF-8")) - except: - pass - # Code re-used in the NAMES command - if channel in channels_list: + if isalphanumeric(channel, True): + if channel.lower() in lower_chans: + channel = lower_chans[channel.lower()] + success = True + if channel in channels_list: if pending in channels_list[channel]: - users = " ".join(channels_list[channel]) - connection.sendall(bytes(f":{server} 353 {pending} = {channel} :{users}\r\n","UTF-8")) - connection.sendall(bytes(f":{server} 366 {pending} {channel} :End of /NAMES list.\r\n","UTF-8")) - print("Successfully pre-loaded /NAMES list") + success=False + print(f"{pending} is already in {channel} , ignoring JOIN request.") + if success: + try: + if channel in channels_list: + channels_list[channel].append(pending) + else: + channels_list[channel] = [pending] + lower_chans[channel.lower()] = channel + topic_list[channel] = "Topic is not implemented." + except: + connection.sendall(bytes(f":{server} NOTICE * :*** Could not join {channel}\r\n","UTF-8")) + print(channels_list) + for i in channels_list[channel]: + try: + nickname_list[i].sendall(bytes(f":{pending}!{rident}@{hostname} JOIN {channel}\r\n","UTF-8")) + except: + pass + # Code re-used in the NAMES command + if channel in channels_list: + if pending in channels_list[channel]: + users = " ".join(channels_list[channel]) + connection.sendall(bytes(f":{server} 353 {pending} = {channel} :{users}\r\n","UTF-8")) + connection.sendall(bytes(f":{server} 366 {pending} {channel} :End of /NAMES list.\r\n","UTF-8")) + print("Successfully pre-loaded /NAMES list") + else: + connection.sendall(bytes(f":{server} 479 {pending} {channel} :Channel has erroneus characters\r\n","UTF-8")) elif command == "LIST": connection.sendall(bytes(f":{server} 321 {pending} Channel :Users Name\r\n","UTF-8")) for key, value in topic_list.items(): @@ -465,7 +468,7 @@ def session(connection, client, ip, isssl=False): else: pending2 = text.split(" ")[1] if pending2[0] == ":": pending2 = pending2[1:] - if "!" in pending2 or ":" in pending2 or "#" in pending2 or "*" in pending2: + if not isalphanumeric(pending2): connection.sendall(bytes(f":{server} 432 {pending} {pending2} :Erroneus nickname\r\n","UTF-8")) elif pending2.lower() in lower_nicks: connection.sendall(bytes(f":{server} 433 {pending} {pending2} :Nickname is already in use.\r\n","UTF-8"))