about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.guix-channel2
-rw-r--r--gn_libs/jobs/launcher.py2
-rw-r--r--gn_libs/privileges/__init__.py6
-rw-r--r--gn_libs/privileges/authspec.py (renamed from gn_libs/privileges.py)10
-rw-r--r--gn_libs/privileges/resources.py72
5 files changed, 90 insertions, 2 deletions
diff --git a/.guix-channel b/.guix-channel
index 63a4336..bfc31db 100644
--- a/.guix-channel
+++ b/.guix-channel
@@ -34,7 +34,7 @@
   (channel
    (name guix-bioinformatics)
    (url "https://git.genenetwork.org/guix-bioinformatics")
-   (commit "903465c85c9b2ae28480b236c3364da873ca8f51"))
+   (commit "9b0955f14ec725990abb1f6af3b9f171e4943f77"))
   (channel
    (name guix-past)
    (url "https://codeberg.org/guix-science/guix-past")
diff --git a/gn_libs/jobs/launcher.py b/gn_libs/jobs/launcher.py
index f915b81..fd171b8 100644
--- a/gn_libs/jobs/launcher.py
+++ b/gn_libs/jobs/launcher.py
@@ -41,7 +41,7 @@ def run_job(conn, job, outputs_directory: Path):
                 if bool(_job["metadata"].get("hangup_request")):
                     process.send_signal(signal.SIGHUP)
                     jobs.update_metadata(conn, job_id, "status", "stopped")
-                    break;
+                    break
                 jobs.push_to_stream(conn, job_id, "stdout", stdout_in.read())
                 jobs.push_to_stream(conn, job_id, "stderr", stderr_in.read())
                 time.sleep(1)
diff --git a/gn_libs/privileges/__init__.py b/gn_libs/privileges/__init__.py
new file mode 100644
index 0000000..0cab6b3
--- /dev/null
+++ b/gn_libs/privileges/__init__.py
@@ -0,0 +1,6 @@
+"""This package contains code useful for checking privileges."""
+from .authspec import (check,
+                       parse,
+                       SpecificationValueError,
+                       privileges_fulfill_specs)
+from . import resources
diff --git a/gn_libs/privileges.py b/gn_libs/privileges/authspec.py
index 32c943d..2ae154f 100644
--- a/gn_libs/privileges.py
+++ b/gn_libs/privileges/authspec.py
@@ -164,3 +164,13 @@ def check(spec: str, privileges: tuple[str, ...]) -> bool:
     """Check that the sequence of `privileges` satisfies `spec`."""
     _spec = parse(spec)
     return _OPERATOR_FUNCTION_[_spec[0]](privileges, *_spec[1:])
+
+
+def privileges_fulfill_specs(
+        queried_privileges: tuple[str, ...],
+        resource_spec: str,
+        system_spec: str
+) -> bool:
+    """Check whether a user's privileges fulfill the given specs."""
+    return (check(resource_spec, queried_privileges) or
+            check(system_spec, queried_privileges))
diff --git a/gn_libs/privileges/resources.py b/gn_libs/privileges/resources.py
new file mode 100644
index 0000000..07cad22
--- /dev/null
+++ b/gn_libs/privileges/resources.py
@@ -0,0 +1,72 @@
+"""Privilege checks for resources"""
+import logging
+from functools import partial
+
+from .authspec import privileges_fulfill_specs
+
+
+logger = logging.getLogger(__name__)
+
+
+can_view = partial(
+    privileges_fulfill_specs,
+    resource_spec=(
+        "(OR group:resource:view-resource system:resource:view "
+        "    system:inbredset:view-case-attribute)"),
+    system_spec="(OR system:system-wide:data:view system:resource:view)")
+
+
+can_edit = partial(
+    privileges_fulfill_specs,
+    resource_spec=(
+        "(OR "
+        "  (AND group:resource:view-resource group:resource:edit-resource) "
+        "  (AND system:resource:view system:resource:edit) "
+        "  (AND system:inbredset:view-case-attribute "
+        "       system:inbredset:edit-case-attribute))"),
+    system_spec=(
+        "(OR "
+        "  (AND system:system-wide:data:view system:system-wide:data:edit) "
+        "  (AND system:resource:view system:resource:edit))"))
+
+
+can_create = partial(
+    privileges_fulfill_specs,
+    resource_spec=("(OR group:resource:create-resource "
+                   "    system:inbredset:create-case-attribute)"),
+    system_spec="(OR system:system-wide:data:create)")
+
+
+can_delete = partial(
+    privileges_fulfill_specs,
+    resource_spec=(
+        "(OR "
+        "  (AND group:resource:view-resource "
+        "       group:resource:edit-resource group:resource:delete-resource) "
+        "  (AND system:inbredset:view-case-attribute "
+        "       system:inbredset:edit-case-attribute "
+        "       system:inbredset:delete-case-attribute) "
+        "  (AND system:resource:view system:resource:edit "
+        "       system:resource:delete))"),
+    system_spec=(
+        "(OR "
+        "  (AND system:system-wide:data:view system:system-wide:data:edit "
+        "       system:system-wide:data:delete) "
+        "  (AND system:resource:view system:resource:edit "
+        "       system:resource:delete))"))
+
+
+can_apply_or_reject_edit = partial(
+    privileges_fulfill_specs,
+    resource_spec=(
+        "(AND system:inbredset:view-case-attribute "
+        "     system:inbredset:edit-case-attribute "
+        "     system:inbredset:delete-case-attribute "
+        "     system:inbredset:apply-case-attribute-edit "
+        "     system:inbredset:reject-case-attribute-edit)"),
+    system_spec=(
+        "(AND system:system-wide:inbredset:view-case-attribute "
+        "     system:system-wide:inbredset:edit-case-attribute "
+        "     system:system-wide:inbredset:delete-case-attribute "
+        "     system:system-wide:inbredset:apply-case-attribute-edit "
+        "     system:system-wide:inbredset:reject-case-attribute-edit)"))