diff options
| author | 2019-06-03 12:44:04 +0100 | |
|---|---|---|
| committer | 2019-06-03 12:44:04 +0100 | |
| commit | 9a8b345c53e852d7092197cee084d0d3c02bc0ff (patch) | |
| tree | 408c6833c2f4de7198c354043c8ca265c0616901 /modules/ircv3_sts.py | |
| parent | Check from_self, not if target==is_own_nickname, use from_self when adding to (diff) | |
Prefix names for all IRCv3 modules with "ircv3_"
Diffstat (limited to 'modules/ircv3_sts.py')
| -rw-r--r-- | modules/ircv3_sts.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/modules/ircv3_sts.py b/modules/ircv3_sts.py new file mode 100644 index 00000000..09ecf523 --- /dev/null +++ b/modules/ircv3_sts.py @@ -0,0 +1,69 @@ +import time +from src import ModuleManager, utils + +CAP = utils.irc.Capability("sts", "draft/sts") + +class Module(ModuleManager.BaseModule): + def _get_policy(self, server): + return server.get_setting("sts-policy", None) + def _set_policy(self, server, policy): + self.log.info("Setting STS policy for '%s': %s", [str(server), policy]) + server.set_setting("sts-policy", policy) + def _remove_policy(self, server): + server.del_setting("sts-policy") + + def set_policy(self, server, port, duration): + expiration = None + self._set_policy(server, { + "port": port, + "from": time.time(), + "duration": duration}) + def change_duration(self, server, info): + duration = int(info["duration"]) + if duration == 0: + self._remove_policy(server) + else: + port = server.connection_params.port + if "port" in info: + port = int(info["port"]) + self.set_policy(server, port, duration) + + @utils.hook("received.cap.ls") + def on_cap_ls(self, event): + sts = CAP.available(event["capabilities"]) + if sts: + info = utils.parse.keyvalue(event["capabilities"][sts], + delimiter=",") + if not event["server"].connection_params.tls: + self.set_policy(event["server"], int(info["port"]), None) + event["server"].disconnect() + self.bot.reconnect(event["server"].id, + event["server"].connection_params) + else: + self.change_duration(event["server"], info) + + @utils.hook("received.cap.new") + def on_cap_new(self, event): + sts = self._get_sts(event["capabilities"]) + if sts and event["server"].connection_params.tls: + info = utils.parse.keyvalue(sts, delimiter=",") + self.change_duration(event["server"], info) + + @utils.hook("new.server") + def new_server(self, event): + sts_policy = self._get_policy(event["server"]) + if sts_policy: + if not event["server"].connection_params.tls: + if not sts_policy["duration"] or time.time() <= ( + sts_policy["from"]+sts_policy["duration"]): + self.log.info("Applying STS policy for '%s'", + [str(event["server"])]) + event["server"].connection_params.tls = True + event["server"].connection_params.port = sts_policy["port"] + + @utils.hook("server.disconnect") + def on_disconnect(self, event): + sts_policy = self._get_policy(event["server"]) + if sts_policy and sts_policy["duration"]: + sts_policy["from"] = time.time() + self._set_policy(event["server"], sts_policy) |
