Merge supybot's master (will make future merges easier)

Conflicts:
	plugins/Misc/plugin.py
	plugins/String/plugin.py
	src/drivers/Socket.py
	src/irclib.py
	src/ircutils.py
This commit is contained in:
Valentin Lorentz 2012-04-03 16:55:29 +02:00
commit e92b8a62f5
6 changed files with 52 additions and 5 deletions

View File

@ -108,6 +108,33 @@ class Misc(callbacks.Plugin):
return return
# Now, for normal handling. # Now, for normal handling.
channel = msg.args[0] channel = msg.args[0]
# Only bother with the invaildCommand flood handling if it's actually
# enabled
if conf.supybot.abuse.flood.command.invalid():
# First, we check for invalidCommand floods. This is rightfully done
# here since this will be the last invalidCommand called, and thus it
# will only be called if this is *truly* an invalid command.
maximum = conf.supybot.abuse.flood.command.invalid.maximum()
banmasker = conf.supybot.protocols.irc.banmask.makeBanmask
self.invalidCommands.enqueue(msg)
if self.invalidCommands.len(msg) > maximum and \
not ircdb.checkCapability(msg.prefix, 'owner'):
penalty = conf.supybot.abuse.flood.command.invalid.punishment()
banmask = banmasker(msg.prefix)
self.log.info('Ignoring %s for %s seconds due to an apparent '
'invalid command flood.', banmask, penalty)
if tokens and tokens[0] == 'Error:':
self.log.warning('Apparent error loop with another Supybot '
'observed. Consider ignoring this bot '
'permanently.')
ircdb.ignores.add(banmask, time.time() + penalty)
if conf.supybot.abuse.flood.command.invalid.notify():
irc.reply('You\'ve given me %s invalid commands within '
'the last minute; I\'m now ignoring you for %s.' %
(maximum,
utils.timeElapsed(penalty, seconds=False)))
return
# Now, for normal handling.
if conf.get(conf.supybot.reply.whenNotCommand, channel): if conf.get(conf.supybot.reply.whenNotCommand, channel):
if len(tokens) >= 2: if len(tokens) >= 2:
cb = irc.getCallback(tokens[0]) cb = irc.getCallback(tokens[0])

View File

@ -87,7 +87,12 @@ class String(callbacks.Plugin):
<http://docs.python.org/library/codecs.html#standard-encodings>. <http://docs.python.org/library/codecs.html#standard-encodings>.
""" """
try: try:
irc.reply(text.decode(encoding)) s = text.decode(encoding)
# Not all encodings decode to a unicode object. Only encode those
# that do.
if isinstance(s, unicode):
s = s.encode('utf-8')
irc.reply(s)
except LookupError: except LookupError:
irc.errorInvalid(_('encoding'), encoding) irc.errorInvalid(_('encoding'), encoding)
except binascii.Error: except binascii.Error:

View File

@ -52,6 +52,13 @@ import supybot.drivers as drivers
import supybot.schedule as schedule import supybot.schedule as schedule
from supybot.utils.iter import imap from supybot.utils.iter import imap
try:
import ssl
except ImportError:
drivers.log.debug('ssl module is not available, '
'cannot connect to SSL servers.')
ssl = None
class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): class SocketDriver(drivers.IrcDriver, drivers.ServersMixin):
def __init__(self, irc): def __init__(self, irc):
self.irc = irc self.irc = irc
@ -176,6 +183,14 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin):
drivers.log.connect(self.currentServer) drivers.log.connect(self.currentServer)
try: try:
self.conn = utils.net.getSocket(server[0]) self.conn = utils.net.getSocket(server[0])
if self.networkGroup.get('ssl').value:
if ssl:
self.plainconn = self.conn
self.conn = ssl.wrap_socket(self.conn)
else:
drivers.log.error('ssl module not available, '
'cannot connect to SSL servers.')
return
vhost = conf.supybot.protocols.irc.vhost() vhost = conf.supybot.protocols.irc.vhost()
self.conn.bind((vhost, 0)) self.conn.bind((vhost, 0))
except socket.error, e: except socket.error, e:

View File

@ -972,7 +972,7 @@ class Irc(IrcCommandDispatcher):
if umodes[0] in '+-': if umodes[0] in '+-':
(addSub, umodes) = (umodes[0], umodes[1:]) (addSub, umodes) = (umodes[0], umodes[1:])
if supported: if supported:
umodes = filter(lambda m: m in supported, umodes) umodes = ''.join([m for m in umodes if m in supported])
umodes = ''.join([addSub, umodes]) umodes = ''.join([addSub, umodes])
log.info('Sending user modes to %s: %s', self.network, umodes) log.info('Sending user modes to %s: %s', self.network, umodes)
self.sendMsg(ircmsgs.mode(self.nick, umodes)) self.sendMsg(ircmsgs.mode(self.nick, umodes))

View File

@ -1,6 +1,6 @@
### ###
# Copyright (c) 2002-2005, Jeremiah Fincher # Copyright (c) 2002-2005, Jeremiah Fincher
# Copyright (c) 2011, James Vega # Copyright (c) 2009,2011, James Vega
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -458,7 +458,7 @@ def replyTo(msg):
return msg.nick return msg.nick
def dccIP(ip): def dccIP(ip):
"""Returns an IP in the proper for DCC.""" """Converts an IP string to the DCC integer form."""
assert utils.net.isIPV4(ip), \ assert utils.net.isIPV4(ip), \
'argument must be a string ip in xxx.yyy.zzz.www format.' 'argument must be a string ip in xxx.yyy.zzz.www format.'
i = 0 i = 0

View File

@ -1,3 +1,3 @@
"""stick the various versioning attributes in here, so we only have to change """stick the various versioning attributes in here, so we only have to change
them once.""" them once."""
version = '0.83.4.1+limnoria (2012-03-18T19:45:17+0000)' version = '0.83.4.1+limnoria (2012-04-03T14:55:29+0000)'