mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-26 12:49:24 +01:00
Fixed strictRfc appropriately.
This commit is contained in:
parent
ef5e7c8091
commit
8274d5dfb9
@ -143,10 +143,6 @@ if __name__ == '__main__':
|
||||
dest='allowEval',
|
||||
help='Determines whether the bot will '
|
||||
'allow the evaluation of arbitrary Python code.')
|
||||
parser.add_option('', '--strict-rfc', action='store_true',
|
||||
dest='strictRfc',
|
||||
help='Determines whether the bot will strictly follow '
|
||||
'RFC guidelines defining nicks and channels.')
|
||||
parser.add_option('', '--allow-root', action='store_true',
|
||||
dest='allowRoot',
|
||||
help='Determines whether the bot will be allowed to run'
|
||||
@ -345,8 +341,6 @@ if __name__ == '__main__':
|
||||
import callbacks
|
||||
import Owner
|
||||
|
||||
conf.strictRfc = bool(options.strictRfc)
|
||||
|
||||
irc = irclib.Irc(nick, user=user, ident=ident, password=password)
|
||||
callback = Owner.Class()
|
||||
irc.addCallback(callback)
|
||||
|
31
src/conf.py
31
src/conf.py
@ -65,12 +65,6 @@ daemonized = False
|
||||
###
|
||||
allowEval = False
|
||||
|
||||
###
|
||||
# strictRfc: Determines whether the bot will very strictly follow the RCE
|
||||
# or whether it will allow things like @ and . in nicks.
|
||||
###
|
||||
strictRfc = False
|
||||
|
||||
supybot = registry.Group()
|
||||
supybot.setName('supybot')
|
||||
|
||||
@ -505,4 +499,29 @@ variable."""))
|
||||
|
||||
supybot.register('plugins') # This will be used by plugins, but not here.
|
||||
|
||||
###
|
||||
# Protocol information.
|
||||
###
|
||||
class StrictRfc(registry.Boolean):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.originalIsNick = ircutils.isNick
|
||||
registry.Boolean.__init__(self, *args, **kwargs)
|
||||
|
||||
def setValue(self, v):
|
||||
registry.Boolean.setValue(self, v)
|
||||
# Now let's replace ircutils.isNick.
|
||||
if self.value:
|
||||
ircutils.isNick = self.originalIsNick
|
||||
else:
|
||||
def unstrictIsNick(s):
|
||||
return not ircutils.isChannel(s)
|
||||
ircutils.isNick = unstrictIsNick
|
||||
|
||||
registerGroup(supybot, 'protocols')
|
||||
registerGroup(supybot.protocols, 'irc')
|
||||
registerGlobalValue(supybot.protocols.irc, 'strictRfc',
|
||||
StrictRfc(False, """Determines whether the bot will strictly follow the RFC;
|
||||
currently this only affects what strings are considered to be nicks. If
|
||||
you're using a server or a network that requires you to message a nick such
|
||||
as services@this.network.server then you you should set this to False."""))
|
||||
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|
||||
|
@ -305,26 +305,26 @@ isUserHostmask = ircutils.isUserHostmask
|
||||
|
||||
def pong(payload, prefix=''):
|
||||
"""Takes a payload and returns the proper PONG IrcMsg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert payload, 'PONG requires a payload'
|
||||
return IrcMsg(prefix=prefix, command='PONG', args=(payload,))
|
||||
|
||||
def ping(payload, prefix=''):
|
||||
"""Takes a payload and returns the proper PING IrcMsg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert payload, 'PING requires a payload'
|
||||
return IrcMsg(prefix=prefix, command='PING', args=(payload,))
|
||||
|
||||
def op(channel, nick, prefix=''):
|
||||
"""Returns a MODE to op nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '+o', nick))
|
||||
|
||||
def ops(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to op each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks), nicks
|
||||
@ -333,14 +333,14 @@ def ops(channel, nicks, prefix=''):
|
||||
|
||||
def deop(channel, nick, prefix=''):
|
||||
"""Returns a MODE to deop nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '-o', nick))
|
||||
|
||||
def deops(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to deop each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks), nicks
|
||||
@ -349,14 +349,14 @@ def deops(channel, nicks, prefix=''):
|
||||
|
||||
def halfop(channel, nick, prefix=''):
|
||||
"""Returns a MODE to halfop nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '+h', nick))
|
||||
|
||||
def halfops(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to halfop each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks), nicks
|
||||
@ -366,14 +366,14 @@ def halfops(channel, nicks, prefix=''):
|
||||
|
||||
def dehalfop(channel, nick, prefix=''):
|
||||
"""Returns a MODE to dehalfop nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '-h', nick))
|
||||
|
||||
def dehalfops(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to dehalfop each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks), nicks
|
||||
@ -382,14 +382,14 @@ def dehalfops(channel, nicks, prefix=''):
|
||||
|
||||
def voice(channel, nick, prefix=''):
|
||||
"""Returns a MODE to voice nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '+v', nick))
|
||||
|
||||
def voices(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to voice each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks)
|
||||
@ -398,14 +398,14 @@ def voices(channel, nicks, prefix=''):
|
||||
|
||||
def devoice(channel, nick, prefix=''):
|
||||
"""Returns a MODE to devoice nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '-v', nick))
|
||||
|
||||
def devoices(channel, nicks, prefix=''):
|
||||
"""Returns a MODE to devoice each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert nicks, 'Nicks must not be empty.'
|
||||
assert all(isNick, nicks), nicks
|
||||
@ -414,7 +414,7 @@ def devoices(channel, nicks, prefix=''):
|
||||
|
||||
def ban(channel, hostmask, exception='', prefix=''):
|
||||
"""Returns a MODE to ban nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isUserHostmask(hostmask), repr(hostmask)
|
||||
modes = [('+b', hostmask)]
|
||||
@ -425,7 +425,7 @@ def ban(channel, hostmask, exception='', prefix=''):
|
||||
|
||||
def bans(channel, hostmasks, exceptions=(), prefix=''):
|
||||
"""Returns a MODE to ban each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert all(isUserHostmask, hostmasks), hostmasks
|
||||
modes = [('+b', s) for s in hostmasks] + [('+e', s) for s in exceptions]
|
||||
@ -434,14 +434,14 @@ def bans(channel, hostmasks, exceptions=(), prefix=''):
|
||||
|
||||
def unban(channel, hostmask, prefix=''):
|
||||
"""Returns a MODE to unban nick on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isUserHostmask(hostmask), repr(hostmask)
|
||||
return IrcMsg(prefix=prefix, command=MODE, args=(channel, '-b', hostmask))
|
||||
|
||||
def unbans(channel, hostmasks, prefix=''):
|
||||
"""Returns a MODE to unban each of nicks on channel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert all(isUserHostmask, hostmasks), hostmasks
|
||||
return IrcMsg(prefix=prefix, command=MODE,
|
||||
@ -449,7 +449,7 @@ def unbans(channel, hostmasks, prefix=''):
|
||||
|
||||
def kick(channel, nick, msg='', prefix=''):
|
||||
"""Returns a KICK to kick nick from channel with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert isNick(nick), repr(nick)
|
||||
if msg:
|
||||
@ -460,7 +460,7 @@ def kick(channel, nick, msg='', prefix=''):
|
||||
def kicks(channel, nicks, msg='', prefix=''):
|
||||
"""Returns a KICK to kick each of nicks from channel with the message msg.
|
||||
"""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
assert all(isNick, nicks), nicks
|
||||
if msg:
|
||||
@ -472,33 +472,33 @@ def kicks(channel, nicks, msg='', prefix=''):
|
||||
|
||||
def privmsg(recipient, msg, prefix=''):
|
||||
"""Returns a PRIVMSG to recipient with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert (isChannel(recipient) or isNick(recipient)), repr(recipient)
|
||||
assert msg, 'msg must not be empty.'
|
||||
return IrcMsg(prefix=prefix, command='PRIVMSG', args=(recipient, msg))
|
||||
|
||||
def action(recipient, msg, prefix=''):
|
||||
"""Returns a PRIVMSG ACTION to recipient with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert (isChannel(recipient) or isNick(recipient)), repr(recipient)
|
||||
return IrcMsg(prefix=prefix, command='PRIVMSG',
|
||||
args=(recipient,'\x01ACTION %s\x01'% msg))
|
||||
|
||||
def notice(recipient, msg, prefix=''):
|
||||
"""Returns a NOTICE to recipient with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert (isChannel(recipient) or isNick(recipient)), repr(recipient)
|
||||
assert msg, 'msg must not be empty.'
|
||||
return IrcMsg(prefix=prefix, command='NOTICE', args=(recipient, msg))
|
||||
|
||||
def join(channel, key=None, prefix=''):
|
||||
"""Returns a JOIN to a channel"""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
if key is None:
|
||||
return IrcMsg(prefix=prefix, command='JOIN', args=(channel,))
|
||||
else:
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert key.translate(string.ascii, string.ascii[128:]) == key and \
|
||||
'\x00' not in key and \
|
||||
'\r' not in key and \
|
||||
@ -511,7 +511,7 @@ def join(channel, key=None, prefix=''):
|
||||
|
||||
def joins(channels, keys=None, prefix=''):
|
||||
"""Returns a JOIN to each of channels."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert all(isChannel, channels), channels
|
||||
if keys is None:
|
||||
keys = []
|
||||
@ -522,7 +522,7 @@ def joins(channels, keys=None, prefix=''):
|
||||
args=(','.join(channels),))
|
||||
else:
|
||||
for key in keys:
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert key.translate(string.ascii,string.ascii[128:])==key and\
|
||||
'\x00' not in key and \
|
||||
'\r' not in key and \
|
||||
@ -537,7 +537,7 @@ def joins(channels, keys=None, prefix=''):
|
||||
|
||||
def part(channel, msg='', prefix=''):
|
||||
"""Returns a PART from channel with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
if msg:
|
||||
return IrcMsg(prefix=prefix, command='PART', args=(channel, msg))
|
||||
@ -546,7 +546,7 @@ def part(channel, msg='', prefix=''):
|
||||
|
||||
def parts(channels, msg='', prefix=''):
|
||||
"""Returns a PART from each of channels with the message msg."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert all(isChannel, channels), channels
|
||||
if msg:
|
||||
return IrcMsg(prefix=prefix, command='PART',
|
||||
@ -564,7 +564,7 @@ def quit(msg='', prefix=''):
|
||||
|
||||
def topic(channel, topic=None, prefix=''):
|
||||
"""Returns a TOPIC for channel with the topic topic."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(channel), repr(channel)
|
||||
if topic is None:
|
||||
return IrcMsg(prefix=prefix, command='TOPIC', args=(channel,))
|
||||
@ -573,13 +573,13 @@ def topic(channel, topic=None, prefix=''):
|
||||
|
||||
def nick(nick, prefix=''):
|
||||
"""Returns a NICK with nick nick."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command='NICK', args=(nick,))
|
||||
|
||||
def user(ident, user, prefix=''):
|
||||
"""Returns a USER with ident ident and user user."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert '\x00' not in ident and \
|
||||
'\r' not in ident and \
|
||||
'\n' not in ident and \
|
||||
@ -589,14 +589,14 @@ def user(ident, user, prefix=''):
|
||||
|
||||
def who(hostmaskOrChannel, prefix=''):
|
||||
"""Returns a WHO for the hostmask or channel hostmaskOrChannel."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isChannel(hostmaskOrChannel) or \
|
||||
isUserHostmask(hostmaskOrChannel), repr(hostmaskOrChannel)
|
||||
return IrcMsg(prefix=prefix, command='WHO', args=(hostmaskOrChannel,))
|
||||
|
||||
def whois(nick, mask='', prefix=''):
|
||||
"""Returns a WHOIS for nick."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command='WHOIS', args=(nick, mask))
|
||||
|
||||
@ -611,13 +611,13 @@ def mode(channel, args=None, prefix=''):
|
||||
|
||||
def invite(nick, channel, prefix=''):
|
||||
"""Returns an INVITE for nick."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert isNick(nick), repr(nick)
|
||||
return IrcMsg(prefix=prefix, command='INVITE', args=(nick, channel))
|
||||
|
||||
def password(password, prefix=''):
|
||||
"""Returns a PASS command for accessing a server."""
|
||||
if conf.strictRfc:
|
||||
if conf.supybot.protocols.irc.strictRfc():
|
||||
assert password, 'password must not be empty.'
|
||||
return IrcMsg(prefix=prefix, command='PASS', args=(password,))
|
||||
|
||||
|
@ -166,18 +166,25 @@ class FunctionsTestCase(SupyTestCase):
|
||||
self.assertEqual(colors, ircutils.safeArgument(colors))
|
||||
|
||||
def testIsNick(self):
|
||||
self.failUnless(ircutils.isNick('jemfinch'))
|
||||
self.failUnless(ircutils.isNick('jemfinch0'))
|
||||
self.failUnless(ircutils.isNick('[0]'))
|
||||
self.failUnless(ircutils.isNick('{jemfinch}'))
|
||||
self.failUnless(ircutils.isNick('[jemfinch]'))
|
||||
self.failUnless(ircutils.isNick('jem|finch'))
|
||||
self.failUnless(ircutils.isNick('\\```'))
|
||||
self.failUnless(ircutils.isNick('`'))
|
||||
self.failUnless(ircutils.isNick('A'))
|
||||
self.failIf(ircutils.isNick(''))
|
||||
self.failIf(ircutils.isNick('8foo'))
|
||||
self.failIf(ircutils.isNick('10'))
|
||||
try:
|
||||
original = conf.supybot.protocols.irc.strictRfc()
|
||||
conf.supybot.protocols.irc.strictRfc.setValue(True)
|
||||
self.failUnless(ircutils.isNick('jemfinch'))
|
||||
self.failUnless(ircutils.isNick('jemfinch0'))
|
||||
self.failUnless(ircutils.isNick('[0]'))
|
||||
self.failUnless(ircutils.isNick('{jemfinch}'))
|
||||
self.failUnless(ircutils.isNick('[jemfinch]'))
|
||||
self.failUnless(ircutils.isNick('jem|finch'))
|
||||
self.failUnless(ircutils.isNick('\\```'))
|
||||
self.failUnless(ircutils.isNick('`'))
|
||||
self.failUnless(ircutils.isNick('A'))
|
||||
self.failIf(ircutils.isNick(''))
|
||||
self.failIf(ircutils.isNick('8foo'))
|
||||
self.failIf(ircutils.isNick('10'))
|
||||
conf.supybot.protocols.irc.strictRfc.setValue(False)
|
||||
self.failUnless(ircutils.isNick('services@something.undernet.net'))
|
||||
finally:
|
||||
conf.supybot.protocols.irc.strictRfc.setValue(original)
|
||||
|
||||
def testBanmask(self):
|
||||
for msg in msgs:
|
||||
|
Loading…
Reference in New Issue
Block a user