From 3b80802d1a7cdacfb78d24ce6e3f3b9c2cc7fcdb Mon Sep 17 00:00:00 2001 From: James Lu Date: Tue, 5 Jul 2016 13:27:31 -0700 Subject: [PATCH] protocols: rewrite encapsulated commands implicitly Closes #182. --- protocols/inspircd.py | 29 ++++++----------------------- protocols/ts6.py | 25 ++++++++++--------------- protocols/ts6_common.py | 7 +++++++ 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/protocols/inspircd.py b/protocols/inspircd.py index 5eb4e52..1baba5e 100644 --- a/protocols/inspircd.py +++ b/protocols/inspircd.py @@ -644,29 +644,12 @@ class InspIRCdProtocol(TS6BaseProtocol): # We don't actually need to process this; just send the hook so plugins can use it return {'target': target, 'channel': channel} - def handle_encap(self, numeric, command, args): - """Handles incoming encapsulated commands (ENCAP). Hook arguments - returned by this should have a parse_as field, that sets the correct - hook name for the message. - - For InspIRCd, the only ENCAP command we handle right now is KNOCK.""" - # <- :70MAAAAAA ENCAP * KNOCK #blah :agsdfas - # From charybdis TS6 docs: https://github.com/grawity/irc-docs/blob/03ba884a54f1cef2193cd62b6a86803d89c1ac41/server/ts6.txt - - # ENCAP - # source: any - # parameters: target server mask, subcommand, opt. parameters... - - # Sends a command to matching servers. Propagation is independent of - # understanding the subcommand. - - targetmask = args[0] - real_command = args[1] - if targetmask == '*' and real_command == 'KNOCK': - channel = self.irc.toLower(args[2]) - text = args[3] - return {'parse_as': real_command, 'channel': channel, - 'text': text} + def handle_knock(self, numeric, command, args): + """Handles channel KNOCKs.""" + # <- :70MAAAAAA ENCAP * KNOCK #blah :abcdefg + channel = self.irc.toLower(args[0]) + text = args[1] + return {'channel': channel, 'text': text} def handle_opertype(self, target, command, args): """Handles incoming OPERTYPE, which is used to denote an oper up. diff --git a/protocols/ts6.py b/protocols/ts6.py index 6651130..cbbbb71 100644 --- a/protocols/ts6.py +++ b/protocols/ts6.py @@ -666,23 +666,18 @@ class TS6Protocol(TS6BaseProtocol): 'your IRCd configuration.', self.irc.name, setter, badmode, charlist[badmode]) - def handle_encap(self, numeric, command, args): + def handle_su(self, numeric, command, args): """ - Handles the ENCAP command - encapsulated TS6 commands with a variety of - subcommands used for different purposes. + Handles SU, which is used for setting login information """ - commandname = args[1] + # <- :00A ENCAP * SU 42XAAAAAC :GLolol + # <- :00A ENCAP * SU 42XAAAAAC + try: + account = args[1] # Account name is being set + except IndexError: + account = '' # No account name means a logout - if commandname == 'SU': - # Handles SU, which is used for setting login information - # <- :00A ENCAP * SU 42XAAAAAC :GLolol - # <- :00A ENCAP * SU 42XAAAAAC - try: - account = args[3] # Account name is being set - except IndexError: - account = '' # No account name means a logout - - uid = args[2] - self.irc.callHooks([uid, 'CLIENT_SERVICES_LOGIN', {'text': account}]) + uid = args[0] + self.irc.callHooks([uid, 'CLIENT_SERVICES_LOGIN', {'text': account}]) Class = TS6Protocol diff --git a/protocols/ts6_common.py b/protocols/ts6_common.py index de759bf..683e63c 100644 --- a/protocols/ts6_common.py +++ b/protocols/ts6_common.py @@ -330,6 +330,13 @@ class TS6BaseProtocol(IRCS2SProtocol): command = args[0] args = args[1:] + if command == 'ENCAP': + # Special case for encapsulated commands (ENCAP), in forms like this: + # <- :00A ENCAP * SU 42XAAAAAC :GLolol + command = args[1] + args = args[2:] + log.debug("(%s) Rewriting incoming ENCAP to command %s (args: %s)", self.irc.name, command, args) + try: func = getattr(self, 'handle_'+command.lower()) except AttributeError: # unhandled command