diff options
| author | 2019-12-10 05:27:35 +0000 | |
|---|---|---|
| committer | 2019-12-10 05:27:35 +0000 | |
| commit | 638eee0d685c06d258cb55287204ca97bca7c344 (patch) | |
| tree | 33442439317ae2846f1efb7674b7a3758c8990a1 /src/core_modules/ircv3_sts.py | |
| parent | move sys.exit() codes to an enum in utils.consts (diff) | |
| signature | ||
move core modules to src/core_modules, make them uneffected by white/black list
Diffstat (limited to 'src/core_modules/ircv3_sts.py')
| -rw-r--r-- | src/core_modules/ircv3_sts.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/core_modules/ircv3_sts.py b/src/core_modules/ircv3_sts.py new file mode 100644 index 00000000..aeeac1f1 --- /dev/null +++ b/src/core_modules/ircv3_sts.py @@ -0,0 +1,70 @@ +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: + if "port" in info: + 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): + if CAP.available(event["capabilities"] + ) 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) |
