From e232ad5daec113b0e72ca36465589908fb9a4e3c Mon Sep 17 00:00:00 2001 From: Evelyn Date: Wed, 12 Jul 2017 10:00:27 +0100 Subject: Add IRCv3→SASL support for nickserv auth, added optional module whitelist, added server option for recording channel keys, increased flexibility for event raising in linehandler, probably other things too --- modules/nickserv.py | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'modules/nickserv.py') diff --git a/modules/nickserv.py b/modules/nickserv.py index 6f1b87b3..149dc961 100644 --- a/modules/nickserv.py +++ b/modules/nickserv.py @@ -1,18 +1,28 @@ - +import base64 class Module(object): def __init__(self, bot): + bot.events.on("new").on("server").hook(self.on_new_server) bot.events.on("received").on("numeric").on("001" ).hook(self.on_connect) bot.events.on("received").on("command").on("setnickserv" ).hook(self.set_nickserv, min_args=1, permission="setnickserv", help="Set bot's nickserv password", usage="", private_only=True) + bot.events.on("received").on("cap").hook(self.on_cap) + bot.events.on("received").on("authenticate").hook(self.on_authenticate) + for code in ["902", "903", "904", "905", "906", "907", "908"]: + bot.events.on("received").on("numeric").on(code).hook(self.on_90x) + + def on_new_server(self, event): + event["server"].attempted_auth = False + event["server"].sasl_success = False def on_connect(self, event): nickserv_password = event["server"].get_setting( "nickserv-password") - if nickserv_password: + if nickserv_password and not event["server"].sasl_success: + event["server"].attempted_auth = True event["server"].send_message("nickserv", "identify %s" % nickserv_password) @@ -20,3 +30,27 @@ class Module(object): nickserv_password = event["args"] event["server"].set_setting("nickserv-password", nickserv_password) event["stdout"].write("Nickserv password saved") + + def on_cap(self, event): + if event["subcommand"] == "NAK": + event["server"].send_capability_end() + elif event["subcommand"] == "ACK": + event["server"].send_authenticate("PLAIN") + else: + pass + + def on_authenticate(self, event): + if event["message"] != "+": + event["server"].send_authenticate("*") + else: + nick = event["server"].original_nickname + password = event["server"].get_setting("nickserv-password") + event["server"].attempted_auth = True + event["server"].send_authenticate( + base64.b64encode(("%s\0%s\0%s" % (nick, nick, password)).encode("utf8")).decode("utf8") + ) + + def on_90x(self, event): + if event["number"]=="903": + event["server"].sasl_success = True + event["server"].send_capability_end() -- cgit v1.3.1-10-gc9f91