From b7466327dbe21fea69861bf40460c33b4a559c6b Mon Sep 17 00:00:00 2001 From: James Lu Date: Fri, 7 Jul 2017 20:13:52 -0700 Subject: [PATCH] protocols: move S2S_BUFSIZE definition into a class variable --- classes.py | 4 +++- protocols/ngircd.py | 6 ++---- protocols/p10.py | 10 ++++------ protocols/ts6.py | 6 ++---- protocols/unreal.py | 16 ++++++++-------- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/classes.py b/classes.py index 8619b25..3bfc26a 100644 --- a/classes.py +++ b/classes.py @@ -1103,6 +1103,8 @@ class PyLinkNetworkCoreWithUtils(PyLinkNetworkCore): _apply() class IRCNetwork(PyLinkNetworkCoreWithUtils): + S2S_BUFSIZE = 510 + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1347,7 +1349,7 @@ class IRCNetwork(PyLinkNetworkCoreWithUtils): # Safeguard against newlines in input!! Otherwise, each line gets # treated as a separate command, which is particularly nasty. data = data.replace('\n', ' ') - encoded_data = data.encode(self.encoding, 'replace')[:510] + b"\r\n" + encoded_data = data.encode(self.encoding, 'replace')[:self.S2S_BUFSIZE] + b"\r\n" log.debug("(%s) -> %s", self.name, data) diff --git a/protocols/ngircd.py b/protocols/ngircd.py index db680af..f1b956c 100644 --- a/protocols/ngircd.py +++ b/protocols/ngircd.py @@ -15,8 +15,6 @@ from pylinkirc.classes import * from pylinkirc.log import log from pylinkirc.protocols.ircs2s_common import * -S2S_BUFSIZE = 510 - class NgIRCdProtocol(IRCS2SProtocol): def __init__(self, irc): super().__init__(irc) @@ -189,7 +187,7 @@ class NgIRCdProtocol(IRCS2SProtocol): if utils.isChannel(target): msgprefix = ':%s MODE %s ' % (self._expandPUID(source), target) - bufsize = S2S_BUFSIZE - len(msgprefix) + bufsize = self.S2S_BUFSIZE - len(msgprefix) # Expand PUIDs when sending outgoing prefix modes. for idx, mode in enumerate(modes): @@ -239,7 +237,7 @@ class NgIRCdProtocol(IRCS2SProtocol): self._expandPUID(userpair[1])) for userpair in users] # Use 13 args max per line: this is equal to the max of 15 minus the command name and target channel. - for message in utils.wrapArguments(njoin_prefix, nicks_to_send, S2S_BUFSIZE, separator=',', max_args_per_line=13): + for message in utils.wrapArguments(njoin_prefix, nicks_to_send, self.S2S_BUFSIZE, separator=',', max_args_per_line=13): self.send(message) # Add the affected users to our state. diff --git a/protocols/p10.py b/protocols/p10.py index b182b42..383d595 100644 --- a/protocols/p10.py +++ b/protocols/p10.py @@ -12,8 +12,6 @@ from pylinkirc.classes import * from pylinkirc.log import log from pylinkirc.protocols.ircs2s_common import * -S2S_BUFSIZE = 510 - class P10UIDGenerator(utils.IncrementalUIDGenerator): """Implements an incremental P10 UID Generator.""" @@ -416,7 +414,7 @@ class P10Protocol(IRCS2SProtocol): # Wrap modes: start with max bufsize and subtract the lengths of the source, target, # mode command, and whitespace. - bufsize = S2S_BUFSIZE - len(numeric) - 4 - len(target) - len(str(ts)) + bufsize = self.S2S_BUFSIZE - len(numeric) - 4 - len(target) - len(str(ts)) real_target = target else: @@ -577,7 +575,7 @@ class P10Protocol(IRCS2SProtocol): # Wrap all users and send them to prevent cutoff. Subtract 4 off the maximum # buf size to account for user prefix data that may be re-added (e.g. ":ohv") for linenum, wrapped_msg in \ - enumerate(utils.wrapArguments(msgprefix, namelist, S2S_BUFSIZE-1-len(self.prefixmodes), + enumerate(utils.wrapArguments(msgprefix, namelist, self.S2S_BUFSIZE-1-len(self.prefixmodes), separator=',')): if linenum: # Implies "if linenum > 0" # XXX: Ugh, this postprocessing sucks, but we have to make sure that mode prefixes are accounted @@ -612,12 +610,12 @@ class P10Protocol(IRCS2SProtocol): if bans or exempts: msgprefix += ':%' # Ban string starts with a % if there is anything if bans: - for wrapped_msg in utils.wrapArguments(msgprefix, bans, S2S_BUFSIZE): + for wrapped_msg in utils.wrapArguments(msgprefix, bans, self.S2S_BUFSIZE): self.send(wrapped_msg) if exempts: # Now add exempts, which are separated from the ban list by a single argument "~". msgprefix += ' ~ ' - for wrapped_msg in utils.wrapArguments(msgprefix, exempts, S2S_BUFSIZE): + for wrapped_msg in utils.wrapArguments(msgprefix, exempts, self.S2S_BUFSIZE): self.send(wrapped_msg) self.updateTS(server, channel, ts, changedmodes) diff --git a/protocols/ts6.py b/protocols/ts6.py index 5fea708..560b557 100644 --- a/protocols/ts6.py +++ b/protocols/ts6.py @@ -10,8 +10,6 @@ from pylinkirc.classes import * from pylinkirc.log import log from pylinkirc.protocols.ts6_common import * -S2S_BUFSIZE = 510 - class TS6Protocol(TS6BaseProtocol): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -162,7 +160,7 @@ class TS6Protocol(TS6BaseProtocol): msgprefix = ':{sid} BMASK {ts} {channel} {bmode} :'.format(sid=server, ts=ts, channel=channel, bmode=bmode) # Actually, we cut off at 17 arguments/line, since the prefix and command name don't count. - for msg in utils.wrapArguments(msgprefix, bans, S2S_BUFSIZE, max_args_per_line=17): + for msg in utils.wrapArguments(msgprefix, bans, self.S2S_BUFSIZE, max_args_per_line=17): self.send(msg) self.updateTS(server, channel, ts, changedmodes) @@ -187,7 +185,7 @@ class TS6Protocol(TS6BaseProtocol): # On output, at most ten cmode parameters should be sent; if there are more, # multiple TMODE messages should be sent. msgprefix = ':%s TMODE %s %s ' % (numeric, ts, target) - bufsize = S2S_BUFSIZE - len(msgprefix) + bufsize = self.S2S_BUFSIZE - len(msgprefix) for modestr in self.wrap_modes(modes, bufsize, max_modes_per_msg=10): self.send(msgprefix + modestr) diff --git a/protocols/unreal.py b/protocols/unreal.py index bb12850..962244e 100644 --- a/protocols/unreal.py +++ b/protocols/unreal.py @@ -14,13 +14,13 @@ from pylinkirc.protocols.ts6_common import * SJOIN_PREFIXES = {'q': '*', 'a': '~', 'o': '@', 'h': '%', 'v': '+', 'b': '&', 'e': '"', 'I': "'"} -# I'm not sure what the real limit is, but the text posted at -# https://github.com/GLolol/PyLink/issues/378 suggests 427 characters. -# https://github.com/unrealircd/unrealircd/blob/4cad9cb/src/modules/m_server.c#L1260 may -# also help. (but why BUFSIZE-*80*?) -GL -S2S_BUFSIZE = 427 - class UnrealProtocol(TS6BaseProtocol): + # I'm not sure what the real limit is, but the text posted at + # https://github.com/GLolol/PyLink/issues/378 suggests 427 characters. + # https://github.com/unrealircd/unrealircd/blob/4cad9cb/src/modules/m_server.c#L1260 may + # also help. (but why BUFSIZE-*80*?) -GL + S2S_BUFSIZE = 427 + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.protocol_caps |= {'slash-in-nicks', 'underscore-in-hosts'} @@ -181,7 +181,7 @@ class UnrealProtocol(TS6BaseProtocol): sjoin_prefix += " :" # Wrap arguments to the max supported S2S line length to prevent cutoff # (https://github.com/GLolol/PyLink/issues/378) - for line in utils.wrapArguments(sjoin_prefix, itemlist, S2S_BUFSIZE): + for line in utils.wrapArguments(sjoin_prefix, itemlist, self.S2S_BUFSIZE): self.send(line) self.channels[channel].users.update(uids) @@ -223,7 +223,7 @@ class UnrealProtocol(TS6BaseProtocol): # 7 characters for "MODE", the space between MODE and the target, the space between the # target and mode list, and the space between the mode list and TS. - bufsize = S2S_BUFSIZE - 7 + bufsize = self.S2S_BUFSIZE - 7 # Subtract the length of the TS and channel arguments bufsize -= len(str(ts))