From ad4cb9561cb6f2b23ac2e73d84eb0a84ed6c4aab Mon Sep 17 00:00:00 2001 From: James Lu Date: Thu, 2 May 2019 17:27:48 -0700 Subject: [PATCH] inspircd: add FJOIN, IJOIN, KICK handling for InspIRCd 3 IJOIN is new. Strip membership IDs from incoming FJOIN and KICK for now. --- protocols/inspircd.py | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/protocols/inspircd.py b/protocols/inspircd.py index a3aaf72..648e2a8 100644 --- a/protocols/inspircd.py +++ b/protocols/inspircd.py @@ -30,9 +30,9 @@ class InspIRCdProtocol(TS6BaseProtocol): # non-standard names to our hook handlers, so command handlers' outputs # are called with the right hooks. self.hook_map = {'FJOIN': 'JOIN', 'RSQUIT': 'SQUIT', 'FMODE': 'MODE', - 'FTOPIC': 'TOPIC', 'OPERTYPE': 'MODE', 'FHOST': 'CHGHOST', - 'FIDENT': 'CHGIDENT', 'FNAME': 'CHGNAME', 'SVSTOPIC': 'TOPIC', - 'SAKICK': 'KICK'} + 'FTOPIC': 'TOPIC', 'OPERTYPE': 'MODE', 'FHOST': 'CHGHOST', + 'FIDENT': 'CHGIDENT', 'FNAME': 'CHGNAME', 'SVSTOPIC': 'TOPIC', + 'SAKICK': 'KICK', 'IJOIN': 'JOIN'} ircd_target = self.serverdata.get('target_version', self.DEFAULT_IRCD).lower() if ircd_target == 'insp20': @@ -605,6 +605,16 @@ class InspIRCdProtocol(TS6BaseProtocol): # <- CAPAB MODSUPPORT :m_alltime.so m_check.so m_chghost.so m_chgident.so m_chgname.so m_fullversion.so m_gecosban.so m_knock.so m_muteban.so m_nicklock.so m_nopartmsg.so m_opmoderated.so m_sajoin.so m_sanick.so m_sapart.so m_serverban.so m_services_account.so m_showwhois.so m_silence.so m_swhois.so m_uninvite.so m_watch.so self._modsupport |= set(args[-1].split()) + def handle_kick(self, source, command, args): + """Handles incoming KICKs.""" + # InspIRCD 3 adds membership IDs to KICK messages when forwarding across servers + # <- :3INAAAAAA KICK #endlessvoid 3INAAAAAA :test (local) + # <- :3INAAAAAA KICK #endlessvoid 7PYAAAAAA 0 :test (remote) + if self.remote_proto_ver >= 1205 and len(args) > 3: + del args[2] + + return super().handle_kick(source, command, args) + def handle_ping(self, source, command, args): """Handles incoming PING commands, so we don't time out.""" # <- :70M PING 70M 0AL @@ -616,7 +626,10 @@ class InspIRCdProtocol(TS6BaseProtocol): def handle_fjoin(self, servernumeric, command, args): """Handles incoming FJOIN commands (InspIRCd equivalent of JOIN/SJOIN).""" - # :70M FJOIN #chat 1423790411 +AFPfjnt 6:5 7:5 9:5 :o,1SRAABIT4 v,1IOAAF53R <...> + # insp2: + # <- :70M FJOIN #chat 1423790411 +AFPfjnt 6:5 7:5 9:5 :o,1SRAABIT4 v,1IOAAF53R <...> + # insp3: + # <- :3IN FJOIN #test 1556842195 +nt :o,3INAAAAAA:4 channel = args[0] chandata = self._channels[channel].deepcopy() # InspIRCd sends each channel's users in the form of 'modeprefix(es),UID' @@ -632,6 +645,10 @@ class InspIRCdProtocol(TS6BaseProtocol): for user in userlist: modeprefix, user = user.split(',', 1) + if self.remote_proto_ver >= 1205: + # XXX: we don't handle membership IDs yet + user = user.split(':', 1)[0] + # Don't crash when we get an invalid UID. if user not in self.users: log.debug('(%s) handle_fjoin: tried to introduce user %s not in our user list, ignoring...', @@ -659,6 +676,18 @@ class InspIRCdProtocol(TS6BaseProtocol): return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts, 'channeldata': chandata} + def handle_ijoin(self, source, command, args): + """Handles InspIRCd 3 joins with membership ID.""" + # insp3: + # <- :3INAAAAAA IJOIN #valhalla 6 + # For now we don't care about the membership ID + channel = args[0] + self.users[source].channels.add(channel) + self._channels[channel].users.add(source) + + return {'channel': channel, 'users': [source], 'modes': + self._channels[channel].modes} + def handle_uid(self, numeric, command, args): """Handles incoming UID commands (user introduction).""" # :70M UID 70MAAAAAB 1429934638 GL 0::1 hidden-7j810p.9mdf.lrek.0000.0000.IP gl 0::1 1429934638 +Wioswx +ACGKNOQXacfgklnoqvx :realname