Skip to content

Commit

Permalink
Merge pull request #213 from nyuszika7h/testing
Browse files Browse the repository at this point in the history
Add SASL support to core.
  • Loading branch information
progval committed Sep 18, 2011
2 parents 1344466 + 25dcadf commit e9697ff
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ def join(self, channel):
else:
return ircmsgs.join(channel)

def registerNetwork(name, password='', ssl=False):
def registerNetwork(name, password='', ssl=False, sasl_username=''):
network = registerGroup(supybot.networks, name)
registerGlobalValue(network, 'password', registry.String(password,
_("""Determines what password will be used on %s. Yes, we know that
Expand All @@ -277,6 +277,14 @@ def registerNetwork(name, password='', ssl=False):
registerChannelValue(network.channels, 'key', registry.String('',
_("""Determines what key (if any) will be used to join the
channel.""")))
sasl = registerGroup(network, 'sasl')
registerGlobalValue(sasl, 'username', registry.String(sasl_username,
_("""Determines what SASL username will be used on %s. This should
be the bot's account name. Due to the way SASL works, you can't use
any grouped nick.""") % name, private=False))
registerGlobalValue(sasl, 'password', registry.String(password,
_("""Determines what SASL password will be used on %s.""") \
% name, private=True))
return network

# Let's fill our networks.
Expand Down
26 changes: 26 additions & 0 deletions src/irclib.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import copy
import time
import random
import base64

import supybot.log as log
import supybot.conf as conf
Expand Down Expand Up @@ -862,6 +863,8 @@ def _setNonResettingVariables(self):
self.ident = conf.supybot.ident()
self.alternateNicks = conf.supybot.nick.alternates()[:]
self.password = conf.supybot.networks.get(self.network).password()
self.sasl_username = conf.supybot.networks.get(self.network).sasl.username()
self.sasl_password = conf.supybot.networks.get(self.network).sasl.password()
self.prefix = '%s!%s@%s' % (self.nick, self.ident, 'unset.domain')
# The rest.
self.lastTake = 0
Expand All @@ -875,6 +878,18 @@ def _queueConnectMessages(self):
self.driver.die()
self._reallyDie()
else:
if self.sasl_password:
if not self.sasl_username:
log.error('SASL username is not set, unable to identify.')
else:
auth_string = base64.b64encode('%s\x00%s\x00%s' % (self.sasl_username,
self.sasl_username, self.sasl_password))
log.debug('Sending CAP REQ command, requesting capability \'sasl\'.')
self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('REQ', 'sasl')))
log.debug('Sending AUTHENTICATE command, using mechanism PLAIN.')
self.queueMsg(ircmsgs.IrcMsg(command="AUTHENTICATE", args=('PLAIN',)))
log.info('Sending AUTHENTICATE command, not logging the password.')
self.queueMsg(ircmsgs.IrcMsg(command="AUTHENTICATE", args=(auth_string,)))
if self.password:
log.info('Sending PASS command, not logging the password.')
self.queueMsg(ircmsgs.password(self.password))
Expand All @@ -884,6 +899,17 @@ def _queueConnectMessages(self):
self.ident, self.user)
self.queueMsg(ircmsgs.user(self.ident, self.user))

def do903(self, msg):
log.info('%s: SASL authentication successful' % self.network)
log.debug('Sending CAP END command.')
self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',)))

def do904(self, msg):
log.warning('%s: SASL authentication failed' % self.network)
log.debug('Aborting authentication.')
log.debug('Sending CAP END command.')
self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',)))

def _getNextNick(self):
if self.alternateNicks:
nick = self.alternateNicks.pop(0)
Expand Down

0 comments on commit e9697ff

Please sign in to comment.