From f445f7baef33daae775a52c4cc716116b1b64943 Mon Sep 17 00:00:00 2001 From: James Lu Date: Sat, 25 Jun 2016 11:28:51 -0700 Subject: [PATCH] relay: be more tolerant to users sending messages to channels they're not in This extends the routing of messages from servers across the relay via the main PyLink client to users too. This allows atheme's GameServ, various commit announcers, etc. to work over relay regardless of whether +n is set. --- plugins/relay.py | 56 ++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/plugins/relay.py b/plugins/relay.py index 1bf99cb..a324721 100644 --- a/plugins/relay.py +++ b/plugins/relay.py @@ -898,22 +898,11 @@ def handle_messages(irc, numeric, command, args): # but whatever). return - elif numeric in irc.servers: - # Sender is a server? This shouldn't be allowed, except for some truly - # special cases... We'll route these through the main PyLink client, - # tagging the message with the sender name. - text = '[from %s] %s' % (irc.servers[numeric].name, text) - numeric = irc.pseudoclient.uid - - elif numeric not in irc.users: - # Sender didn't pass the check above, AND isn't a user. - log.debug('(%s) relay.handle_messages: Unknown message sender %s.', irc.name, numeric) - return - relay = getRelay((irc.name, target)) remoteusers = relayusers[(irc.name, numeric)] - # HACK: Don't break on sending to @#channel or similar. + # HACK: Don't break on sending to @#channel or similar. TODO: This should really + # be handled more neatly in core. try: prefix, target = target.split('#', 1) except ValueError: @@ -921,16 +910,6 @@ def handle_messages(irc, numeric, command, args): else: target = '#' + target - log.debug('(%s) relay.handle_messages: prefix is %r, target is %r', irc.name, prefix, target) - if utils.isChannel(target) and relay and numeric not in irc.channels[target].users: - # The sender must be in the target channel to send messages over the relay; - # it's the only way we can make sure they have a spawned client on ALL - # of the linked networks. This affects -n channels too; see - # https://github.com/GLolol/PyLink/issues/91 for an explanation of why. - irc.msg(numeric, 'Error: You must be in %r in order to send ' - 'messages over the relay.' % target, notice=True) - return - if utils.isChannel(target): for name, remoteirc in world.networkobjects.copy().items(): real_target = getRemoteChan(irc, remoteirc, target) @@ -942,14 +921,31 @@ def handle_messages(irc, numeric, command, args): continue user = getRemoteUser(irc, remoteirc, numeric, spawnIfMissing=False) - if user: # If the user doesn't exist, drop the message. - real_target = prefix + real_target - log.debug('(%s) relay.handle_messages: sending message to %s from %s on behalf of %s', - irc.name, real_target, user, numeric) - if notice: - remoteirc.proto.notice(user, real_target, text) + + if not user: + # No relay clone exists for the sender; route the message through our + # main client. + if numeric in irc.servers: + displayedname = irc.servers[numeric].name else: - remoteirc.proto.message(user, real_target, text) + displayedname = irc.users[numeric].nick + + real_text = '[from %s/%s] %s' % (displayedname, irc.name, text) + try: + user = remoteirc.pseudoclient.uid + except AttributeError: + # Remote main client hasn't spawned yet. Drop the message. + continue + else: + real_text = text + + real_target = prefix + real_target + log.debug('(%s) relay.handle_messages: sending message to %s from %s on behalf of %s', + irc.name, real_target, user, numeric) + if notice: + remoteirc.proto.notice(user, real_target, real_text) + else: + remoteirc.proto.message(user, real_target, real_text) else: # Get the real user that the PM was meant for