3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-27 21:19:31 +01:00

bots: limit most commands to non-protected internal PyLink clients

This commit is contained in:
James Lu 2015-09-17 19:07:16 -07:00
parent 069cd62865
commit 10f3cd1fb8

View File

@ -22,7 +22,7 @@ def spawnclient(irc, source, args):
except ValueError: except ValueError:
irc.msg(source, "Error: Not enough arguments. Needs 3: nick, user, host.") irc.msg(source, "Error: Not enough arguments. Needs 3: nick, user, host.")
return return
irc.proto.spawnClient(nick, ident, host) irc.proto.spawnClient(nick, ident, host, manipulatable=True)
@utils.add_cmd @utils.add_cmd
def quit(irc, source, args): def quit(irc, source, args):
@ -40,6 +40,9 @@ def quit(irc, source, args):
return return
u = utils.nickToUid(irc, nick) u = utils.nickToUid(irc, nick)
quitmsg = ' '.join(args[1:]) or 'Client Quit' quitmsg = ' '.join(args[1:]) or 'Client Quit'
if not utils.isManipulatableClient(irc, u):
irc.msg(source, "Error: Cannot force quit a protected PyLink services client.")
return
irc.proto.quitClient(u, quitmsg) irc.proto.quitClient(u, quitmsg)
irc.callHooks([u, 'PYLINK_BOTSPLUGIN_QUIT', {'text': quitmsg, 'parse_as': 'QUIT'}]) irc.callHooks([u, 'PYLINK_BOTSPLUGIN_QUIT', {'text': quitmsg, 'parse_as': 'QUIT'}])
@ -57,6 +60,9 @@ def joinclient(irc, source, args):
irc.msg(source, "Error: Not enough arguments. Needs 2: nick, comma separated list of channels.") irc.msg(source, "Error: Not enough arguments. Needs 2: nick, comma separated list of channels.")
return return
u = utils.nickToUid(irc, nick) u = utils.nickToUid(irc, nick)
if not utils.isManipulatableClient(irc, u):
irc.msg(source, "Error: Cannot force join a protected PyLink services client.")
return
for channel in clist: for channel in clist:
if not utils.isChannel(channel): if not utils.isChannel(channel):
irc.msg(source, "Error: Invalid channel name %r." % channel) irc.msg(source, "Error: Invalid channel name %r." % channel)
@ -85,6 +91,9 @@ def nick(irc, source, args):
elif not utils.isNick(newnick): elif not utils.isNick(newnick):
irc.msg(source, 'Error: Invalid nickname %r.' % newnick) irc.msg(source, 'Error: Invalid nickname %r.' % newnick)
return return
elif not utils.isManipulatableClient(irc, u):
irc.msg(source, "Error: Cannot force nick changes for a protected PyLink services client.")
return
irc.proto.nickClient(u, newnick) irc.proto.nickClient(u, newnick)
irc.callHooks([u, 'PYLINK_BOTSPLUGIN_NICK', {'newnick': newnick, 'oldnick': nick, 'parse_as': 'NICK'}]) irc.callHooks([u, 'PYLINK_BOTSPLUGIN_NICK', {'newnick': newnick, 'oldnick': nick, 'parse_as': 'NICK'}])
@ -102,6 +111,9 @@ def part(irc, source, args):
irc.msg(source, "Error: Not enough arguments. Needs 2: nick, comma separated list of channels.") irc.msg(source, "Error: Not enough arguments. Needs 2: nick, comma separated list of channels.")
return return
u = utils.nickToUid(irc, nick) u = utils.nickToUid(irc, nick)
if not utils.isManipulatableClient(irc, u):
irc.msg(source, "Error: Cannot force part a protected PyLink services client.")
return
for channel in clist: for channel in clist:
if not utils.isChannel(channel): if not utils.isChannel(channel):
irc.msg(source, "Error: Invalid channel name %r." % channel) irc.msg(source, "Error: Invalid channel name %r." % channel)
@ -148,19 +160,15 @@ def mode(irc, source, args):
target = utils.nickToUid(irc, target) or target target = utils.nickToUid(irc, target) or target
extclient = target in irc.users and not utils.isInternalClient(irc, target) extclient = target in irc.users and not utils.isInternalClient(irc, target)
parsedmodes = utils.parseModes(irc, target, modes) parsedmodes = utils.parseModes(irc, target, modes)
if not (target in irc.users or target in irc.channels): ischannel = target in irc.channels
if not (target in irc.users or ischannel):
irc.msg(source, "Error: Invalid channel or nick %r." % target) irc.msg(source, "Error: Invalid channel or nick %r." % target)
return return
elif not parsedmodes: elif not parsedmodes:
irc.msg(source, "Error: No valid modes were given.") irc.msg(source, "Error: No valid modes were given.")
return return
elif extclient and not irc.proto.allow_forceset_usermodes: elif not (ischannel or utils.isManipulatableClient(irc, target)):
irc.msg(source, "Error: this IRCd does not allow forcing user mode " irc.msg(source, "Error: Can only set modes on channels or non-protected PyLink clients.")
"changes on other servers' users!")
return
elif extclient and ("+o", None) in parsedmodes and not irc.proto.allow_forceoper:
irc.msg(source, "Error: this IRCd does not allow forcing an oper up "
"for other servers' users!")
return return
if utils.isInternalServer(irc, modesource): if utils.isInternalServer(irc, modesource):
# Setting modes from a server. # Setting modes from a server.