From 6145d85fd21ee8839de7177ce0488e658f6fd548 Mon Sep 17 00:00:00 2001 From: 3V3RYONE Date: Mon, 27 Mar 2023 19:37:24 +0530 Subject: [PATCH 1/4] added function to support WHOIS command --- fakenet/listeners/IRCListener.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fakenet/listeners/IRCListener.py b/fakenet/listeners/IRCListener.py index f2dcb98b..b875d5c3 100644 --- a/fakenet/listeners/IRCListener.py +++ b/fakenet/listeners/IRCListener.py @@ -159,6 +159,11 @@ def irc_DEFAULT(self, cmd, params): self.server.logger.info('Client issued an unknown command %s %s', cmd, params) self.irc_send_server("421", "%s :Unknown command" % cmd) + def irc_WHOIS(self, cmd, params): + output = f"ircname : {self.realname}\nhostname : {self.user}\nserver : {self.server}\nmodes : {self.mode}" + self.irc_send_server("001", f"{output}") + self.irc_send_server("001", "%s :End of WHOIS" % params) + def irc_NICK(self, cmd, params): self.nick = params From b690d45b3d2cf11538792fca7b07bf2f0305e0e4 Mon Sep 17 00:00:00 2001 From: 3V3RYONE Date: Fri, 19 May 2023 03:23:29 +0530 Subject: [PATCH 2/4] updated reply format to standard RPL_WHOISUSER format --- fakenet/listeners/IRCListener.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fakenet/listeners/IRCListener.py b/fakenet/listeners/IRCListener.py index b875d5c3..f1de820b 100644 --- a/fakenet/listeners/IRCListener.py +++ b/fakenet/listeners/IRCListener.py @@ -160,9 +160,9 @@ def irc_DEFAULT(self, cmd, params): self.irc_send_server("421", "%s :Unknown command" % cmd) def irc_WHOIS(self, cmd, params): - output = f"ircname : {self.realname}\nhostname : {self.user}\nserver : {self.server}\nmodes : {self.mode}" + output = f"{self.nick} {self.user} {self.servername} * :{self.realname}" self.irc_send_server("001", f"{output}") - self.irc_send_server("001", "%s :End of WHOIS" % params) + self.irc_send_server("001", "%s :End of /WHOIS list" % self.nick) def irc_NICK(self, cmd, params): From bde6148171f1c073266533e49cfa9683b6d04d5e Mon Sep 17 00:00:00 2001 From: 3V3RYONE Date: Mon, 22 May 2023 13:59:39 -0700 Subject: [PATCH 3/4] add test for whois command --- test/test.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/test.py b/test/test.py index fa433516..07b561c8 100644 --- a/test/test.py +++ b/test/test.py @@ -115,6 +115,7 @@ def __init__(self, hostname, port=6667): def _irc_evt_handler(self, srv, evt): """Check for each case and set the corresponding success flag.""" + import pdb;pdb.set_trace() if evt.type == 'join': if evt.target.startswith(self.join_chan): self.join_ok = True @@ -129,6 +130,9 @@ def _irc_evt_handler(self, srv, evt): if (evt.arguments[0].startswith(self.black_market) and evt.target == self.pub_chan): self.pubmsg_ok = True + elif evt.type == "whois": + if (evt.arguments[0].startswith(self.nick)): + self.whois_ok = True def _irc_script(self, srv): """Callback manages individual test cases for IRC.""" @@ -137,12 +141,14 @@ def _irc_script(self, srv): self.join_ok = False self.privmsg_ok = False self.pubmsg_ok = False + self.whois_ok = False # This handler should set the success flags in success cases srv.add_global_handler('join', self._irc_evt_handler) srv.add_global_handler('welcome', self._irc_evt_handler) srv.add_global_handler('privmsg', self._irc_evt_handler) srv.add_global_handler('pubmsg', self._irc_evt_handler) + srv.add_global_handler('whois', self._irc_evt_handler) # Issue all commands, indirectly invoking the event handler for each # flag @@ -156,6 +162,9 @@ def _irc_script(self, srv): srv.privmsg(self.clouseau, self.safehouse) srv.process_data() + srv.whois([self.clouseau]) + srv.process_data() + srv.quit() srv.process_data() @@ -171,11 +180,15 @@ def _irc_script(self, srv): if not self.pubmsg_ok: raise FakeNetTestException('pubmsg test failed') + if not self.whois_ok: + raise FakeNetTestException('whois test failed') + return all([ self.welcome_ok, self.join_ok, self.privmsg_ok, - self.pubmsg_ok + self.pubmsg_ok, + self.whois_ok ]) def _run_irc_script(self, nm, callback): From 2de78991e8dfd06609d12872f470d0bf75f5d6db Mon Sep 17 00:00:00 2001 From: 3V3RYONE Date: Mon, 29 May 2023 04:23:04 -0700 Subject: [PATCH 4/4] updated servername and server reply codes --- fakenet/listeners/IRCListener.py | 16 +++++++++++++--- test/test.py | 1 - 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/fakenet/listeners/IRCListener.py b/fakenet/listeners/IRCListener.py index f1de820b..825e2234 100644 --- a/fakenet/listeners/IRCListener.py +++ b/fakenet/listeners/IRCListener.py @@ -100,6 +100,15 @@ def start(self): self.server.config = self.config self.server.servername = self.config.get('servername', 'localhost') + if self.server.servername.startswith('!'): + self.server.servername = self.server.servername[1:] + if self.server.servername.lower() == "random": + self.server.servername = self.randomizeHostname() + elif self.server.servername.lower() == "gethostname": + self.server.servername = socket.gethostname() + else: + raise ValueError('ServerName config invalid escape: !%s' % (servername)) + self.server_thread = threading.Thread(target=self.server.serve_forever) self.server_thread.daemon = True self.server_thread.start() @@ -160,9 +169,10 @@ def irc_DEFAULT(self, cmd, params): self.irc_send_server("421", "%s :Unknown command" % cmd) def irc_WHOIS(self, cmd, params): - output = f"{self.nick} {self.user} {self.servername} * :{self.realname}" - self.irc_send_server("001", f"{output}") - self.irc_send_server("001", "%s :End of /WHOIS list" % self.nick) + output = f"{self.nick} {self.user} {self.server.servername} * {self.realname}" + self.irc_send_server("311", output) + self.server.logger.info("Client has issued WHOIS command: " + output) + self.irc_send_server("318", "%s :End of /WHOIS list" % self.nick) def irc_NICK(self, cmd, params): diff --git a/test/test.py b/test/test.py index 07b561c8..4678a7b4 100644 --- a/test/test.py +++ b/test/test.py @@ -115,7 +115,6 @@ def __init__(self, hostname, port=6667): def _irc_evt_handler(self, srv, evt): """Check for each case and set the corresponding success flag.""" - import pdb;pdb.set_trace() if evt.type == 'join': if evt.target.startswith(self.join_chan): self.join_ok = True