3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-01 01:09:22 +01:00

core: move isManipulatableClient, getHostmask to Irc

This commit is contained in:
James Lu 2016-04-30 16:44:37 -07:00
parent 201ae8b5fd
commit 78f8a2fc8d
10 changed files with 65 additions and 65 deletions

View File

@ -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',

View File

@ -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.

View File

@ -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

View File

@ -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))

View File

@ -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

View File

@ -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)

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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.