aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules/channel_access.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-12-10 05:27:35 +0000
committerGravatar jesopo2019-12-10 05:27:35 +0000
commit638eee0d685c06d258cb55287204ca97bca7c344 (patch)
tree33442439317ae2846f1efb7674b7a3758c8990a1 /src/core_modules/channel_access.py
parentmove 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.py91
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)