From f10a5b5dc01fcb8a3a46950653cef4715cddbe07 Mon Sep 17 00:00:00 2001
From: Mohammad Torkashvand <mohammad.torkashvand@geant.org>
Date: Mon, 8 Jan 2024 12:46:43 +0100
Subject: [PATCH] integrate GUI with our custom OPA server

---
 .env.local.example  |  1 +
 src/utils/policy.ts | 29 ++++++++++++++++++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/.env.local.example b/.env.local.example
index b85bcbc..063314a 100644
--- a/.env.local.example
+++ b/.env.local.example
@@ -15,6 +15,7 @@ REACT_APP_OAUTH2_ENABLED=False
 REACT_APP_OAUTH2_CLIENT_ID=
 REACT_APP_OAUTH2_OPENID_CONNECT_URL=
 REACT_APP_OAUTH2_SCOPE=
+REACT_APP_OPA_BUNDLE_URL="http://localhost:8080/opa/bundles/policy.wasm"
 
 # Needed because some libs misbehave
 GENERATE_SOURCEMAP=false
diff --git a/src/utils/policy.ts b/src/utils/policy.ts
index 8b43e9f..207dab5 100644
--- a/src/utils/policy.ts
+++ b/src/utils/policy.ts
@@ -1,10 +1,37 @@
+import { loadPolicy } from "@open-policy-agent/opa-wasm";
+
+
 export async function createPolicyCheck(user?: Partial<Oidc.Profile>) {
     if (!user) {
         return () => true;
     }
+
+    const opaBundletUrl = process.env.REACT_APP_OPA_BUNDLE_URL;
+
+    if (typeof opaBundletUrl === 'undefined') {
+        throw new Error('REACT_APP_OPA_BUNDLE_URL is not defined');
+    }
+
+    const policyResult = await fetch(opaBundletUrl);
+    const policyWasm = await policyResult.arrayBuffer();
     try {
+        const policy = await loadPolicy(policyWasm);
+
         function allowed(resource: string): boolean {
-            return true;
+            const input: any = {
+                resource: resource,
+                method: "GET",
+                ...user,
+            };
+
+            const resultSet = policy.evaluate(input);
+
+            if (resultSet == null || resultSet.length === 0) {
+                console.error("evaluation error", resultSet);
+                return false;
+            }
+
+            return resultSet[0].result;
         }
         return allowed;
     } catch {
-- 
GitLab