mirror of
				https://github.com/jlu5/PyLink.git
				synced 2025-11-04 00:47:21 +01:00 
			
		
		
		
	core: move isManipulatableClient, getHostmask to Irc
This commit is contained in:
		
							parent
							
								
									201ae8b5fd
								
							
						
					
					
						commit
						78f8a2fc8d
					
				
							
								
								
									
										43
									
								
								classes.py
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								classes.py
									
									
									
									
									
								
							@ -463,9 +463,9 @@ class Irc():
 | 
			
		||||
        cmd_args = cmd_args[1:]
 | 
			
		||||
        if cmd not in world.commands:
 | 
			
		||||
            self.msg(self.called_by or source, 'Error: Unknown command %r.' % cmd)
 | 
			
		||||
            log.info('(%s) Received unknown command %r from %s', self.name, cmd, utils.getHostmask(self, source))
 | 
			
		||||
            log.info('(%s) Received unknown command %r from %s', self.name, cmd, self.getHostmask(source))
 | 
			
		||||
            return
 | 
			
		||||
        log.info('(%s) Calling command %r for %s', self.name, cmd, utils.getHostmask(self, source))
 | 
			
		||||
        log.info('(%s) Calling command %r for %s', self.name, cmd, self.getHostmask(source))
 | 
			
		||||
        for func in world.commands[cmd]:
 | 
			
		||||
            try:
 | 
			
		||||
                func(self, source, cmd_args)
 | 
			
		||||
@ -809,6 +809,45 @@ class Irc():
 | 
			
		||||
            if numeric in self.servers[server].users:
 | 
			
		||||
                return server
 | 
			
		||||
 | 
			
		||||
    def isManipulatableClient(self, uid):
 | 
			
		||||
        """
 | 
			
		||||
        Returns whether the given user is marked as an internal, manipulatable
 | 
			
		||||
        client. Usually, automatically spawned services clients should have this
 | 
			
		||||
        set True to prevent interactions with opers (like mode changes) from
 | 
			
		||||
        causing desyncs.
 | 
			
		||||
        """
 | 
			
		||||
        return self.isInternalClient(uid) and self.users[uid].manipulatable
 | 
			
		||||
 | 
			
		||||
    def getHostmask(self, user, realhost=False, ip=False):
 | 
			
		||||
        """
 | 
			
		||||
        Returns the hostmask of the given user, if present. If the realhost option
 | 
			
		||||
        is given, return the real host of the user instead of the displayed host.
 | 
			
		||||
        If the ip option is given, return the IP address of the user (this overrides
 | 
			
		||||
        realhost)."""
 | 
			
		||||
        userobj = self.users.get(user)
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            nick = userobj.nick
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            nick = '<unknown-nick>'
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            ident = userobj.ident
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            ident = '<unknown-ident>'
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            if ip:
 | 
			
		||||
                host = userobj.ip
 | 
			
		||||
            elif realhost:
 | 
			
		||||
                host = userobj.realhost
 | 
			
		||||
            else:
 | 
			
		||||
                host = userobj.host
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            host = '<unknown-host>'
 | 
			
		||||
 | 
			
		||||
        return '%s!%s@%s' % (nick, ident, host)
 | 
			
		||||
 | 
			
		||||
class IrcUser():
 | 
			
		||||
    """PyLink IRC user class."""
 | 
			
		||||
    def __init__(self, nick, ts, uid, ident='null', host='null',
 | 
			
		||||
 | 
			
		||||
@ -157,14 +157,14 @@ def handle_mode(irc, source, command, args):
 | 
			
		||||
    # If the sender is not a PyLink client, and the target IS a protected
 | 
			
		||||
    # client, revert any forced deoper attempts.
 | 
			
		||||
    if irc.isInternalClient(target) and not irc.isInternalClient(source):
 | 
			
		||||
        if ('-o', None) in modes and (target == irc.pseudoclient.uid or not utils.isManipulatableClient(irc, target)):
 | 
			
		||||
        if ('-o', None) in modes and (target == irc.pseudoclient.uid or not irc.isManipulatableClient(target)):
 | 
			
		||||
            irc.proto.mode(irc.sid, target, {('+o', None)})
 | 
			
		||||
utils.add_hook(handle_mode, 'MODE')
 | 
			
		||||
 | 
			
		||||
def handle_operup(irc, source, command, args):
 | 
			
		||||
    """Logs successful oper-ups on networks."""
 | 
			
		||||
    otype = args.get('text', 'IRC Operator')
 | 
			
		||||
    log.debug("(%s) Successful oper-up (opertype %r) from %s", irc.name, otype, utils.getHostmask(irc, source))
 | 
			
		||||
    log.debug("(%s) Successful oper-up (opertype %r) from %s", irc.name, otype, irc.getHostmask(source))
 | 
			
		||||
    irc.users[source].opertype = otype
 | 
			
		||||
 | 
			
		||||
utils.add_hook(handle_operup, 'CLIENT_OPERED')
 | 
			
		||||
@ -209,12 +209,12 @@ def identify(irc, source, args):
 | 
			
		||||
        irc.users[source].identified = realuser
 | 
			
		||||
        irc.msg(source, 'Successfully logged in as %s.' % realuser)
 | 
			
		||||
        log.info("(%s) Successful login to %r by %s",
 | 
			
		||||
                 irc.name, username, utils.getHostmask(irc, source))
 | 
			
		||||
                 irc.name, username, irc.getHostmask(source))
 | 
			
		||||
    else:
 | 
			
		||||
        irc.msg(source, 'Error: Incorrect credentials.')
 | 
			
		||||
        u = irc.users[source]
 | 
			
		||||
        log.warning("(%s) Failed login to %r from %s",
 | 
			
		||||
                    irc.name, username, utils.getHostmask(irc, source))
 | 
			
		||||
                    irc.name, username, irc.getHostmask(source))
 | 
			
		||||
 | 
			
		||||
@utils.add_cmd
 | 
			
		||||
def shutdown(irc, source, args):
 | 
			
		||||
@ -242,7 +242,7 @@ def load(irc, source, args):
 | 
			
		||||
    if name in world.plugins:
 | 
			
		||||
        irc.reply("Error: %r is already loaded." % name)
 | 
			
		||||
        return
 | 
			
		||||
    log.info('(%s) Loading plugin %r for %s', irc.name, name, utils.getHostmask(irc, source))
 | 
			
		||||
    log.info('(%s) Loading plugin %r for %s', irc.name, name, irc.getHostmask(source))
 | 
			
		||||
    try:
 | 
			
		||||
        world.plugins[name] = pl = utils.loadModuleFromFolder(name, world.plugins_folder)
 | 
			
		||||
    except ImportError as e:
 | 
			
		||||
@ -269,7 +269,7 @@ def unload(irc, source, args):
 | 
			
		||||
        irc.reply("Error: Not enough arguments. Needs 1: plugin name.")
 | 
			
		||||
        return
 | 
			
		||||
    if name in world.plugins:
 | 
			
		||||
        log.info('(%s) Unloading plugin %r for %s', irc.name, name, utils.getHostmask(irc, source))
 | 
			
		||||
        log.info('(%s) Unloading plugin %r for %s', irc.name, name, irc.getHostmask(source))
 | 
			
		||||
        pl = world.plugins[name]
 | 
			
		||||
        log.debug('sys.getrefcount of plugin %s is %s', pl, sys.getrefcount(pl))
 | 
			
		||||
        # Remove any command functions set by the plugin.
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@ def quit(irc, source, args):
 | 
			
		||||
 | 
			
		||||
    quitmsg =  ' '.join(args[1:]) or 'Client Quit'
 | 
			
		||||
 | 
			
		||||
    if not utils.isManipulatableClient(irc, u):
 | 
			
		||||
    if not irc.isManipulatableClient(u):
 | 
			
		||||
        irc.reply("Error: Cannot force quit a protected PyLink services client.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@ -79,7 +79,7 @@ def joinclient(irc, source, args):
 | 
			
		||||
        irc.reply("Error: No valid channels given.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if not utils.isManipulatableClient(irc, u):
 | 
			
		||||
    if not irc.isManipulatableClient(u):
 | 
			
		||||
        irc.reply("Error: Cannot force join a protected PyLink services client.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@ -121,7 +121,7 @@ def nick(irc, source, args):
 | 
			
		||||
        irc.reply('Error: Invalid nickname %r.' % newnick)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    elif not utils.isManipulatableClient(irc, u):
 | 
			
		||||
    elif not irc.isManipulatableClient(u):
 | 
			
		||||
        irc.reply("Error: Cannot force nick changes for a protected PyLink services client.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@ -163,7 +163,7 @@ def part(irc, source, args):
 | 
			
		||||
        irc.reply("Error: No valid channels given.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if not utils.isManipulatableClient(irc, u):
 | 
			
		||||
    if not irc.isManipulatableClient(u):
 | 
			
		||||
        irc.reply("Error: Cannot force part a protected PyLink services client.")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ def _exec(irc, source, args):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    log.info('(%s) Executing %r for %s', irc.name, args,
 | 
			
		||||
             utils.getHostmask(irc, source))
 | 
			
		||||
             irc.getHostmask(source))
 | 
			
		||||
    exec(args, globals(), locals())
 | 
			
		||||
 | 
			
		||||
utils.add_cmd(_exec, 'exec')
 | 
			
		||||
@ -48,7 +48,7 @@ def _eval(irc, source, args):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    log.info('(%s) Evaluating %r for %s', irc.name, args,
 | 
			
		||||
             utils.getHostmask(irc, source))
 | 
			
		||||
             irc.getHostmask(source))
 | 
			
		||||
    irc.reply(eval(args))
 | 
			
		||||
utils.add_cmd(_eval, 'eval')
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ def raw(irc, source, args):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    log.info('(%s) Sending raw text %r to IRC for %s', irc.name, args,
 | 
			
		||||
             utils.getHostmask(irc, source))
 | 
			
		||||
             irc.getHostmask(source))
 | 
			
		||||
    irc.send(args)
 | 
			
		||||
 | 
			
		||||
    irc.reply("Done.")
 | 
			
		||||
@ -85,5 +85,5 @@ def inject(irc, source, args):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    log.info('(%s) Injecting raw text %r into protocol module for %s', irc.name,
 | 
			
		||||
             args, utils.getHostmask(irc, source))
 | 
			
		||||
             args, irc.getHostmask(source))
 | 
			
		||||
    irc.reply(irc.runline(args))
 | 
			
		||||
 | 
			
		||||
@ -50,7 +50,7 @@ def checkban(irc, source, args):
 | 
			
		||||
 | 
			
		||||
        results = 0
 | 
			
		||||
        for uid, userobj in irc.users.copy().items():
 | 
			
		||||
            targetmask = utils.getHostmask(irc, uid)
 | 
			
		||||
            targetmask = irc.getHostmask(uid)
 | 
			
		||||
            if ircmatch.match(casemapping, banmask, targetmask):
 | 
			
		||||
                if results < 50:  # XXX rather arbitrary limit
 | 
			
		||||
                    serverobj = irc.servers[irc.getServer(uid)]
 | 
			
		||||
@ -70,7 +70,7 @@ def checkban(irc, source, args):
 | 
			
		||||
        # Target can be both a nick (of an online user) or a hostmask.
 | 
			
		||||
        uid = irc.nickToUid(targetmask)
 | 
			
		||||
        if uid:
 | 
			
		||||
            targetmask = utils.getHostmask(irc, uid)
 | 
			
		||||
            targetmask = irc.getHostmask(uid)
 | 
			
		||||
        elif not utils.isHostmask(targetmask):
 | 
			
		||||
            irc.reply("Error: Invalid nick or hostmask '%s'." % targetmask)
 | 
			
		||||
            return
 | 
			
		||||
@ -92,7 +92,7 @@ def jupe(irc, source, args):
 | 
			
		||||
    try:
 | 
			
		||||
        servername = args[0]
 | 
			
		||||
        reason = ' '.join(args[1:]) or "No reason given"
 | 
			
		||||
        desc = "Juped by %s: [%s]" % (utils.getHostmask(irc, source), reason)
 | 
			
		||||
        desc = "Juped by %s: [%s]" % (irc.getHostmask(source), reason)
 | 
			
		||||
    except IndexError:
 | 
			
		||||
        irc.reply('Error: Not enough arguments. Needs 1-2: servername, reason (optional).')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@ -1244,7 +1244,7 @@ def create(irc, source, args):
 | 
			
		||||
        irc.reply('Error: Channel %r is already part of a relay.' % channel)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    creator = utils.getHostmask(irc, source)
 | 
			
		||||
    creator = irc.getHostmask(source)
 | 
			
		||||
    # Create the relay database entry with the (network name, channel name)
 | 
			
		||||
    # pair - this is just a dict with various keys.
 | 
			
		||||
    db[(irc.name, channel)] = {'claim': [irc.name], 'links': set(),
 | 
			
		||||
@ -1291,7 +1291,7 @@ def destroy(irc, source, args):
 | 
			
		||||
 | 
			
		||||
        del db[entry]
 | 
			
		||||
        log.info('(%s) relay: Channel %s destroyed by %s.', irc.name,
 | 
			
		||||
                 channel, utils.getHostmask(irc, source))
 | 
			
		||||
                 channel, irc.getHostmask(source))
 | 
			
		||||
        irc.reply('Done.')
 | 
			
		||||
    else:
 | 
			
		||||
        irc.reply('Error: No such relay %r exists.' % channel)
 | 
			
		||||
@ -1344,7 +1344,7 @@ def link(irc, source, args):
 | 
			
		||||
                return
 | 
			
		||||
        entry['links'].add((irc.name, localchan))
 | 
			
		||||
        log.info('(%s) relay: Channel %s linked to %s%s by %s.', irc.name,
 | 
			
		||||
                 localchan, remotenet, channel, utils.getHostmask(irc, source))
 | 
			
		||||
                 localchan, remotenet, channel, irc.getHostmask(source))
 | 
			
		||||
        initializeChannel(irc, localchan)
 | 
			
		||||
        irc.reply('Done.')
 | 
			
		||||
 | 
			
		||||
@ -1386,7 +1386,7 @@ def delink(irc, source, args):
 | 
			
		||||
            db[entry]['links'].remove((irc.name, channel))
 | 
			
		||||
        irc.reply('Done.')
 | 
			
		||||
        log.info('(%s) relay: Channel %s delinked from %s%s by %s.', irc.name,
 | 
			
		||||
                 channel, entry[0], entry[1], utils.getHostmask(irc, source))
 | 
			
		||||
                 channel, entry[0], entry[1], irc.getHostmask(source))
 | 
			
		||||
    else:
 | 
			
		||||
        irc.reply('Error: No such relay %r.' % channel)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -697,7 +697,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
 | 
			
		||||
        if self.irc.isInternalServer(target):
 | 
			
		||||
            # The target has to be one of our servers in order to work...
 | 
			
		||||
            uplink = self.irc.servers[target].uplink
 | 
			
		||||
            reason = 'Requested by %s' % utils.getHostmask(self.irc, numeric)
 | 
			
		||||
            reason = 'Requested by %s' % self.irc.getHostmask(numeric)
 | 
			
		||||
            self._send(uplink, 'SQUIT %s :%s' % (target, reason))
 | 
			
		||||
            return self.handle_squit(numeric, 'SQUIT', [target, reason])
 | 
			
		||||
        else:
 | 
			
		||||
 | 
			
		||||
@ -591,7 +591,7 @@ class P10Protocol(Protocol):
 | 
			
		||||
        if not self.irc.isInternalClient(numeric):
 | 
			
		||||
            raise LookupError('No such PyLink client exists.')
 | 
			
		||||
 | 
			
		||||
        sendername = utils.getHostmask(self.irc, numeric)
 | 
			
		||||
        sendername = self.irc.getHostmask(numeric)
 | 
			
		||||
 | 
			
		||||
        creationts = self.irc.channels[target].ts
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -294,7 +294,7 @@ class UnrealProtocol(TS6BaseProtocol):
 | 
			
		||||
        # <- :unreal.midnight.vpn NOTICE @#test :[Knock] by GL|!gl@hidden-1C620195 (test)
 | 
			
		||||
        assert utils.isChannel(target), "Can only knock on channels!"
 | 
			
		||||
        sender = self.irc.getServer(numeric)
 | 
			
		||||
        s = '[Knock] by %s (%s)' % (utils.getHostmask(self.irc, numeric), text)
 | 
			
		||||
        s = '[Knock] by %s (%s)' % (self.irc.getHostmask(numeric), text)
 | 
			
		||||
        self._send(sender, 'NOTICE @%s :%s' % (target, s))
 | 
			
		||||
 | 
			
		||||
    ### HANDLERS
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								utils.py
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								utils.py
									
									
									
									
									
								
							@ -159,45 +159,6 @@ def checkAuthenticated(irc, uid, allowAuthed=True, allowOper=True):
 | 
			
		||||
        raise NotAuthenticatedError("You are not authenticated!")
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def isManipulatableClient(irc, uid):
 | 
			
		||||
    """
 | 
			
		||||
    Returns whether the given user is marked as an internal, manipulatable
 | 
			
		||||
    client. Usually, automatically spawned services clients should have this
 | 
			
		||||
    set True to prevent interactions with opers (like mode changes) from
 | 
			
		||||
    causing desyncs.
 | 
			
		||||
    """
 | 
			
		||||
    return irc.isInternalClient(uid) and irc.users[uid].manipulatable
 | 
			
		||||
 | 
			
		||||
def getHostmask(irc, user, realhost=False, ip=False):
 | 
			
		||||
    """
 | 
			
		||||
    Returns the hostmask of the given user, if present. If the realhost option
 | 
			
		||||
    is given, return the real host of the user instead of the displayed host.
 | 
			
		||||
    If the ip option is given, return the IP address of the user (this overrides
 | 
			
		||||
    realhost)."""
 | 
			
		||||
    userobj = irc.users.get(user)
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        nick = userobj.nick
 | 
			
		||||
    except AttributeError:
 | 
			
		||||
        nick = '<unknown-nick>'
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        ident = userobj.ident
 | 
			
		||||
    except AttributeError:
 | 
			
		||||
        ident = '<unknown-ident>'
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        if ip:
 | 
			
		||||
            host = userobj.ip
 | 
			
		||||
        elif realhost:
 | 
			
		||||
            host = userobj.realhost
 | 
			
		||||
        else:
 | 
			
		||||
            host = userobj.host
 | 
			
		||||
    except AttributeError:
 | 
			
		||||
        host = '<unknown-host>'
 | 
			
		||||
 | 
			
		||||
    return '%s!%s@%s' % (nick, ident, host)
 | 
			
		||||
 | 
			
		||||
def loadModuleFromFolder(name, folder):
 | 
			
		||||
    """
 | 
			
		||||
    Imports and returns a module, if existing, from a specific folder.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user