mirror of
				https://github.com/jlu5/PyLink.git
				synced 2025-11-04 08:57:25 +01:00 
			
		
		
		
	relay: switch to IRCParser in 'link' and add a --force option to skip TS checks
Closes #416.
This commit is contained in:
		
							parent
							
								
									bf702575be
								
							
						
					
					
						commit
						93c9b6289c
					
				@ -83,6 +83,7 @@ Remote versions of the `manage`, `list`, `sync`, and `clear` commands also exist
 | 
			
		||||
- `relay.linkacl` - Allows access to the `linkacl` command. **With the default permissions set, this is granted to all opers.**
 | 
			
		||||
- `relay.linkacl.view` - Allows access to the `view` command. **With the default permissions set, this is granted to all opers.**
 | 
			
		||||
- `relay.link` - Allows access to the `link` command. **With the default permissions set, this is granted to all opers.**
 | 
			
		||||
- `relay.link.force` - Allows access to the `--force` option in the `link` command (skip TS and target network is connected checks).
 | 
			
		||||
- `relay.linked` - Allows access to the `link` command. **With the default permissions set, this is granted to all users.**
 | 
			
		||||
- `relay.purge` - Allows access to the `purge` command.
 | 
			
		||||
- `relay.savedb` - Allows access to the `savedb` command.
 | 
			
		||||
 | 
			
		||||
@ -1668,24 +1668,25 @@ def purge(irc, source, args):
 | 
			
		||||
 | 
			
		||||
    irc.reply("Done. Purged %s entries involving the network %s." % (count, network))
 | 
			
		||||
 | 
			
		||||
link_parser = utils.IRCParser()
 | 
			
		||||
link_parser.add_argument('remotenet')
 | 
			
		||||
link_parser.add_argument('channel')
 | 
			
		||||
link_parser.add_argument('localchannel', nargs='?')
 | 
			
		||||
link_parser.add_argument("-f", "--force", action='store_true')
 | 
			
		||||
def link(irc, source, args):
 | 
			
		||||
    """<remotenet> <channel> [<local channel>]
 | 
			
		||||
    """<remotenet> <channel> [<local channel>] [-f/--force]
 | 
			
		||||
 | 
			
		||||
    Links the specified channel on \x02remotenet\x02 over PyLink Relay as \x02local channel\x02.
 | 
			
		||||
    If \x02local channel\x02 is not specified, it defaults to the same name as \x02channel\x02."""
 | 
			
		||||
    try:
 | 
			
		||||
        channel = irc.toLower(args[1])
 | 
			
		||||
        remotenet = args[0]
 | 
			
		||||
    except IndexError:
 | 
			
		||||
        irc.error("Not enough arguments. Needs 2-3: remote netname, channel, local channel name (optional).")
 | 
			
		||||
        return
 | 
			
		||||
    If \x02local channel\x02 is not specified, it defaults to the same name as \x02channel\x02.
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        localchan = irc.toLower(args[2])
 | 
			
		||||
    except IndexError:
 | 
			
		||||
        localchan = channel
 | 
			
		||||
    If the --force option is given, this command will bypass checks for TS and whether the target
 | 
			
		||||
    network is alive, and link the channel anyways."""
 | 
			
		||||
    args = link_parser.parse_args(args)
 | 
			
		||||
 | 
			
		||||
    for c in (channel, localchan):
 | 
			
		||||
    localchan = irc.toLower(args.localchannel or args.channel)
 | 
			
		||||
    remotenet = args.remotenet
 | 
			
		||||
 | 
			
		||||
    for c in (args.channel, localchan):
 | 
			
		||||
        if not utils.isChannel(c):
 | 
			
		||||
            irc.error('Invalid channel %r.' % c)
 | 
			
		||||
            return
 | 
			
		||||
@ -1725,9 +1726,9 @@ def link(irc, source, args):
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        with db_lock:
 | 
			
		||||
            entry = db[(remotenet, channel)]
 | 
			
		||||
            entry = db[(remotenet, args.channel)]
 | 
			
		||||
    except KeyError:
 | 
			
		||||
        irc.error('No such relay %r exists.' % channel)
 | 
			
		||||
        irc.error('No such relay %r exists.' % args.channel)
 | 
			
		||||
        return
 | 
			
		||||
    else:
 | 
			
		||||
        if irc.name in entry['blocked_nets']:
 | 
			
		||||
@ -1736,22 +1737,27 @@ def link(irc, source, args):
 | 
			
		||||
        for link in entry['links']:
 | 
			
		||||
            if link[0] == irc.name:
 | 
			
		||||
                irc.error("Remote channel '%s%s' is already linked here "
 | 
			
		||||
                          "as %r." % (remotenet, channel, link[1]))
 | 
			
		||||
                          "as %r." % (remotenet, args.channel, link[1]))
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        our_ts = irc.channels[localchan].ts
 | 
			
		||||
        their_ts = world.networkobjects[remotenet].channels[channel].ts
 | 
			
		||||
        if (our_ts < their_ts) and irc.protoname != 'clientbot':
 | 
			
		||||
            log.debug('(%s) relay: Blocking link request %s%s -> %s%s due to bad TS (%s < %s)', irc.name,
 | 
			
		||||
                      irc.name, localchan, remotenet, channel, our_ts, their_ts)
 | 
			
		||||
            irc.error("The channel creation date (TS) on %s (%s) is lower than the target "
 | 
			
		||||
                      "channel's (%s); refusing to link. You should clear the local channel %s first "
 | 
			
		||||
                      "before linking, or use a different local channel." % (localchan, our_ts, their_ts, localchan))
 | 
			
		||||
            return
 | 
			
		||||
        if args.force:
 | 
			
		||||
            permissions.checkPermissions(irc, source, ['relay.link.force'])
 | 
			
		||||
            log.info("(%s) relay: Forcing link %s%s -> %s%s", irc.name, irc.name, localchan, remotenet,
 | 
			
		||||
                     args.channel)
 | 
			
		||||
        else:
 | 
			
		||||
            our_ts = irc.channels[localchan].ts
 | 
			
		||||
            their_ts = world.networkobjects[remotenet].channels[args.channel].ts
 | 
			
		||||
            if (our_ts < their_ts) and irc.protoname != 'clientbot':
 | 
			
		||||
                log.debug('(%s) relay: Blocking link request %s%s -> %s%s due to bad TS (%s < %s)', irc.name,
 | 
			
		||||
                          irc.name, localchan, remotenet, args.channel, our_ts, their_ts)
 | 
			
		||||
                irc.error("The channel creation date (TS) on %s (%s) is lower than the target "
 | 
			
		||||
                          "channel's (%s); refusing to link. You should clear the local channel %s first "
 | 
			
		||||
                          "before linking, or use a different local channel." % (localchan, our_ts, their_ts, localchan))
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        entry['links'].add((irc.name, localchan))
 | 
			
		||||
        log.info('(%s) relay: Channel %s linked to %s%s by %s.', irc.name,
 | 
			
		||||
                 localchan, remotenet, channel, irc.getHostmask(source))
 | 
			
		||||
                 localchan, remotenet, args.channel, irc.getHostmask(source))
 | 
			
		||||
        initialize_channel(irc, localchan)
 | 
			
		||||
        irc.reply('Done.')
 | 
			
		||||
link = utils.add_cmd(link, featured=True)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user