mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-24 03:29:28 +01:00
relay: block /OJOIN in claim
This commit is contained in:
parent
ae94bec6b8
commit
1c4cb94a13
@ -873,6 +873,41 @@ def handle_join(irc, numeric, command, args):
|
|||||||
return
|
return
|
||||||
ts = args['ts']
|
ts = args['ts']
|
||||||
users = set(args['users'])
|
users = set(args['users'])
|
||||||
|
|
||||||
|
claim_passed = checkClaim(irc, channel, numeric)
|
||||||
|
current_chandata = irc.channels[channel]
|
||||||
|
chandata = args.get('chandata')
|
||||||
|
log.debug('(%s) relay.handle_join: claim for %s on %s: %s', irc.name, numeric, channel, claim_passed)
|
||||||
|
log.debug('(%s) relay.handle_join: old channel data %s', irc.name, chandata)
|
||||||
|
log.debug('(%s) relay.handle_join: current channel data %s', irc.name, current_chandata)
|
||||||
|
if chandata and not claim_passed:
|
||||||
|
# If the server we're receiving an SJOIN from isn't in the claim list, undo ALL attempts
|
||||||
|
# from it to burst modes.
|
||||||
|
# This option can prevent things like /OJOIN abuse or split riding with oper override, but
|
||||||
|
# has the side effect of causing all prefix modes on leaf links to be lost when networks
|
||||||
|
# split and rejoin.
|
||||||
|
modes = []
|
||||||
|
for user in users:
|
||||||
|
# XXX: Find the diff of the new and old mode lists of the channel. Not pretty, but I'd
|
||||||
|
# rather not change the 'users' format of SJOIN just for this. -GL
|
||||||
|
try:
|
||||||
|
oldmodes = set(chandata.getPrefixModes(user))
|
||||||
|
except KeyError:
|
||||||
|
# User was never in channel. Treat their mode list as empty.
|
||||||
|
oldmodes = set()
|
||||||
|
newmodes = set(current_chandata.getPrefixModes(user))
|
||||||
|
modediff = newmodes - oldmodes
|
||||||
|
log.debug('(%s) relay.handle_join: mode diff for %s on %s: %s oldmodes=%s newmodes=%s',
|
||||||
|
irc.name, user, channel, modediff, oldmodes, newmodes)
|
||||||
|
for modename in modediff:
|
||||||
|
modechar = irc.cmodes.get(modename)
|
||||||
|
if modechar:
|
||||||
|
modes.append(('-%s' % modechar, user))
|
||||||
|
|
||||||
|
if modes:
|
||||||
|
log.debug('(%s) relay.handle_join: reverting modes on BURST: %s', irc.name, irc.joinModes(modes))
|
||||||
|
irc.proto.mode(irc.sid, channel, modes)
|
||||||
|
|
||||||
relayJoins(irc, channel, users, ts, burst=False)
|
relayJoins(irc, channel, users, ts, burst=False)
|
||||||
utils.add_hook(handle_join, 'JOIN')
|
utils.add_hook(handle_join, 'JOIN')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user