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/channel_access.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/channel_access.py')
| -rw-r--r-- | src/core_modules/channel_access.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/core_modules/channel_access.py b/src/core_modules/channel_access.py new file mode 100644 index 00000000..5502db9f --- /dev/null +++ b/src/core_modules/channel_access.py @@ -0,0 +1,91 @@ +#--depends-on check_mode +#--depends-on commands +#--depends-on permissions + +from src import ModuleManager, utils + +class Module(ModuleManager.BaseModule): + _name = "ChanAccess" + + def _has_channel_access(self, target, user, require_access): + access = target.get_user_setting(user.get_id(), "access", []) + identified = self.exports.get_one("is-identified")(user) + + return (require_access in access or "*" in access) and identified + + def _command_check(self, event, target, require_access): + if event["is_channel"]: + if require_access: + if self._has_channel_access(target, event["user"], + require_access): + return utils.consts.PERMISSION_FORCE_SUCCESS, None + else: + return (utils.consts.PERMISSION_ERROR, + "You do not have permission to do this") + + @utils.hook("preprocess.command") + def preprocess_command(self, event): + require_access = event["hook"].get_kwarg("require_access") + if require_access: + return self._command_check(event, event["target"], require_access) + + @utils.hook("check.command.channel-access") + def check_command(self, event): + target = event["target"] + access = event["request_args"][0] + if len(event["request_args"]) > 1: + target = event["request_args"][0] + access = event["request_args"][1] + + return self._command_check(event, target, access) + + @utils.hook("received.command.access", min_args=1, channel_only=True) + def access(self, event): + """ + :help: Show/modify channel access for a user + :usage: list <nickname> + :usage: add <nickname> <permission1 permission2 ...> + :usage: remove <nickname> <permission1 permission2 ...> + :usage: set <nickname> <permission1 permission2 ...> + :require_mode: high + """ + subcommand = event["args_split"][0].lower() + target = event["server"].get_user(event["args_split"][1]) + access = event["target"].get_user_setting(target.get_id(), "access", []) + + if subcommand == "list": + event["stdout"].write("Access for %s: %s" % (target.nickname, + " ".join(access))) + elif subcommand == "set": + if not len(event["args_split"]) > 2: + raise utils.EventError("Please provide a list of permissions") + event["target"].set_user_setting(target.get_id(), "access", + event["args_split"][2:]) + elif subcommand == "add": + if not len(event["args_split"]) > 2: + raise utils.EventError("Please provide a list of permissions") + for acc in event["args_split"][2:]: + if acc in access: + raise utils.EventError("%s already has '%s' permission" % ( + target.nickname, acc)) + access.append(acc) + event["target"].set_user_setting(target.get_id(), "access", access) + event["stdout"].write("Added permission to %s: %s" % ( + target.nickname, " ".join(event["args_split"][2:]))) + elif subcommand == "remove": + if not len(event["args_split"]) > 2: + raise utils.EventError("Please provide a list of permissions") + for acc in event["args_split"][2:]: + if not acc in access: + raise utils.EventError("%s does not have '%s' permission" % + (target.nickname, acc)) + access.remove(acc) + if access: + event["target"].set_user_setting(target.get_id(), "access", + access) + else: + event["target"].del_user_setting(target.get_id(), "access") + event["stdout"].write("Removed permission from %s: %s" % ( + target.nickname, " ".join(event["args_split"][2:]))) + else: + event["stderr"].write("Unknown command '%s'" % subcommand) |
