From ee57a288604f2d693ef3252970a235c906d3a148 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Mon, 18 Aug 2025 16:50:59 +0200 Subject: [PATCH 01/54] feat: added first version of the script to add policies and permissions --- scripts/cold-start.ts | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 scripts/cold-start.ts diff --git a/scripts/cold-start.ts b/scripts/cold-start.ts new file mode 100644 index 0000000..cb865fa --- /dev/null +++ b/scripts/cold-start.ts @@ -0,0 +1,52 @@ +/** + * This script serves to solve the cold start problem for LOAMA. + * It is equivalent to a series of configurable cURL requests being sent towards the UMA AMA server + * and thus entirely based on the examples provided in [the policy management endpoint documentation](https://github.com/SolidLabResearch/user-managed-access/blob/feat/policy-endpoint/documentation/policy-management.md) + */ + +async function main() { + // ask for user's webid + const webid = "https://solidweb.me/harrypodder/profile/card#me"; + + // collect input from user: + // - policy name + const policyName = "policy"; + // - permission name + const permissionName = "permission" + // - action + const action = "read"; + // - target + const target = "http://localhost:3000/harry/podder/resource.txt"; + // - assignee + const assignee = "https://example.pod.knows.idlab.ugent.be/profile/card#me"; + // - assigner is just the WebID of the user + const assigner = webid; + + const body = `@prefix ex: . + @prefix odrl: . + @prefix dct: . + + ex:${policyName} a odrl:Agreement . + ex:${policyName} odrl:permission ex:${permissionName} . + + ex:${permissionName} a odrl:Permission . + ex:${permissionName} odrl:action odrl:${action} . + ex:${permissionName} odrl:target <${target}> . + ex:${permissionName} odrl:assignee <${assignee}> . + ex:${permissionName} odrl:assigner <${assigner}> .` + + // setup fetch request + const response = await fetch('http://localhost:4000/uma/policies', { + method: 'POST', + headers: { + 'Authorization': webid, + 'Content-Type': 'text/turtle' + }, + body: body + }); + + // handle errors + console.log(response.ok); +} + +main(); From b40d8cf9908061d424441a86232cceb7e81e8df9 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 09:09:11 +0200 Subject: [PATCH 02/54] feat: setup cold start script --- scripts/cold-start.ts | 126 +++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 37 deletions(-) diff --git a/scripts/cold-start.ts b/scripts/cold-start.ts index cb865fa..6c6931d 100644 --- a/scripts/cold-start.ts +++ b/scripts/cold-start.ts @@ -4,49 +4,101 @@ * and thus entirely based on the examples provided in [the policy management endpoint documentation](https://github.com/SolidLabResearch/user-managed-access/blob/feat/policy-endpoint/documentation/policy-management.md) */ -async function main() { - // ask for user's webid - const webid = "https://solidweb.me/harrypodder/profile/card#me"; - - // collect input from user: - // - policy name - const policyName = "policy"; - // - permission name - const permissionName = "permission" - // - action - const action = "read"; - // - target - const target = "http://localhost:3000/harry/podder/resource.txt"; - // - assignee - const assignee = "https://example.pod.knows.idlab.ugent.be/profile/card#me"; - // - assigner is just the WebID of the user - const assigner = webid; - +import { Permission } from "../controller/dist/types"; +import * as readline from 'node:readline'; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const askBasicQuestion = (question: string) => { + return new Promise((resolve) => { + rl.question(question, (answer: string) => resolve(answer)); + }); +} + +const askWebId = () => askBasicQuestion('Please provide your own WebID for authorization: '); +const askPolicyName = () => askBasicQuestion('What do you want to name your policy? '); +const askRuleName = () => askBasicQuestion('What do you want your rule to be named? '); +const askTargetURL = () => askBasicQuestion('Please enter the URL to the resource: ') +const askAssigneeId = () => askBasicQuestion('Please provide the WebID for the assignee: '); + +const selectAction = () => { + return new Promise((resolve, reject) => { + rl.question( + 'What action do you want to associate? Choose one below: \n\t- read [1]\n\t- write [2]\n\t- append [3]\n\t- create [4]\n\t- control [5]\n', + (answer) => { + let choice = parseInt(answer, 10); + if (choice < 1 || choice > 5) reject("No valid option provided"); + + let permission: Permission; + + switch (choice) { + case 1 : { + permission = Permission.Read; + break; + } case 2 : { + permission = Permission.Write; + break; + } case 3 : { + permission = Permission.Append; + break; + } case 4 : { + permission = Permission.Create; + break; + } case 5 : { + permission = Permission.Control; + break; + } default : { + permission = Permission.Read; + break; + } + } + + resolve(permission.toLowerCase()); + } + ); + }); +} + +const main = async () => { + // ask user for webid, policy and rule names, target, associated action and assignee + const webid = await askWebId(); + const policy = await askPolicyName(); + const rule = await askRuleName(); + const action = await selectAction(); + const target = await askTargetURL(); + const assignee = await askAssigneeId(); + rl.close(); + + // make POST request to the API const body = `@prefix ex: . - @prefix odrl: . - @prefix dct: . - - ex:${policyName} a odrl:Agreement . - ex:${policyName} odrl:permission ex:${permissionName} . - - ex:${permissionName} a odrl:Permission . - ex:${permissionName} odrl:action odrl:${action} . - ex:${permissionName} odrl:target <${target}> . - ex:${permissionName} odrl:assignee <${assignee}> . - ex:${permissionName} odrl:assigner <${assigner}> .` - - // setup fetch request + @prefix odrl: . + @prefix dct: . + + ex:${policy} a odrl:Agreement . + ex:${policy} odrl:permission ex:${rule} . + ex:${rule} a odrl:Permission . + ex:${rule} odrl:action odrl:${action} . + ex:${rule} odrl:target <${target}> . + ex:${rule} odrl:assignee <${assignee}> . + ex:${rule} odrl:assigner <${webid}> .' + ` + const response = await fetch('http://localhost:4000/uma/policies', { method: 'POST', headers: { - 'Authorization': webid, + 'Authorization': `${webid}`, 'Content-Type': 'text/turtle' - }, - body: body + } }); - // handle errors - console.log(response.ok); + if (response.ok) { + console.log('Policy added succesfully'); + } else { + console.log('Something went wrong! Try again.'); + } } -main(); +main() From 63944acc83660fff41fb4275ea88c471ea3acdc5 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 09:42:06 +0200 Subject: [PATCH 03/54] fix: small bugs in cold start script + added npm script for easier running --- package.json | 6 ++++-- scripts/cold-start.ts | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b691e50..53c8867 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ ], "scripts": { "build": "nx run-many -t build", - "dev": "nx run-many --parallel=5 --exclude=doctorapp,mockbook -t dev" + "dev": "nx run-many --parallel=5 --exclude=doctorapp,mockbook -t dev", + "cold": "ts-node scripts/cold-start" }, "devDependencies": { "nx": "19.6.0" @@ -18,5 +19,6 @@ "dependencies": { "@solid/community-server": "^7.1.2", "rimraf": "^6.0.1" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/scripts/cold-start.ts b/scripts/cold-start.ts index 6c6931d..94a7045 100644 --- a/scripts/cold-start.ts +++ b/scripts/cold-start.ts @@ -73,7 +73,8 @@ const main = async () => { rl.close(); // make POST request to the API - const body = `@prefix ex: . + const body = ` + @prefix ex: . @prefix odrl: . @prefix dct: . @@ -83,21 +84,24 @@ const main = async () => { ex:${rule} odrl:action odrl:${action} . ex:${rule} odrl:target <${target}> . ex:${rule} odrl:assignee <${assignee}> . - ex:${rule} odrl:assigner <${webid}> .' + ex:${rule} odrl:assigner <${webid}> . ` + console.log(`\nPOST request with body\n${body}`); + const response = await fetch('http://localhost:4000/uma/policies', { method: 'POST', headers: { 'Authorization': `${webid}`, 'Content-Type': 'text/turtle' - } + }, + body: body }); if (response.ok) { console.log('Policy added succesfully'); } else { - console.log('Something went wrong! Try again.'); + console.log('Something went wrong! Try again.', response.status); } } From 14e16b96b64efd591172c9ba60cce92cceef0aea Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 09:42:19 +0200 Subject: [PATCH 04/54] docs: documented cold start problem and how to fix it --- documentation/cold-start.md | 38 +++++++++++++++++++++++++++++++++ documentation/loama_empty.png | Bin 0 -> 43129 bytes documentation/loama_policy.png | Bin 0 -> 80527 bytes 3 files changed, 38 insertions(+) create mode 100644 documentation/cold-start.md create mode 100644 documentation/loama_empty.png create mode 100644 documentation/loama_policy.png diff --git a/documentation/cold-start.md b/documentation/cold-start.md new file mode 100644 index 0000000..9a15b46 --- /dev/null +++ b/documentation/cold-start.md @@ -0,0 +1,38 @@ +# The Cold Start Problem + +LOAMA allows users to manage their own user-managed policies for content access. +It does this by communicating with the backend AS and adding rules or stripping them away from existing policies. +This approach introduces one problem: LOAMA cannot create new policies on new resources from its user interface. +We introduced a (temporary) script to help users quickly setup policies on new resources. This way, you don't have to manually use curl commands to setup your initial policies. + +The image below shows LOAMA's empty homepage. There is no option to create a new policy for a resource, as such we need [this script](../scripts/cold-start.ts) to populate the AS for new users. + +![LOAMA's empty home screen](loama_empty.png) + +The script is pretty straight forward in use. +See the example below: + +```shell-session +$ npm run cold + +> cold +> ts-node scripts/cold-start + +Please provide your own WebID for authorization: https://solidme.web/harrypodder/profile/card#me +What do you want to name your policy? policy +What do you want your rule to be named? permission +What action do you want to associate? Choose one below: + - read [1] + - write [2] + - append [3] + - create [4] + - control [5] +1 +Please enter the URL to the resource: http://localhost:3000/harry/podder/resource.txt +Please provide the WebID for the assignee: https://example.pod.knows.idlab.ugent.be/profile/card#me +Policy added succesfully +``` + +This will create the following result in LOAMA: + +![LOAMA's homescreen showing the added policy](loama_policy.png) diff --git a/documentation/loama_empty.png b/documentation/loama_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6480db069da51bf3318e1073381774e742d89c GIT binary patch literal 43129 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 HQ$iB}l2X_fA5-3)nXprLW7Bn~ncMZYa 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

-Qg2?-GO98xYB3zoB^ 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 literal 0 HcmV?d00001 From 4a35607a3ce206a649f9233d2b18d0fcceefe652 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 09:45:14 +0200 Subject: [PATCH 05/54] docs: updated example to reflect latest change in cold start script --- documentation/cold-start.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/documentation/cold-start.md b/documentation/cold-start.md index 9a15b46..8808976 100644 --- a/documentation/cold-start.md +++ b/documentation/cold-start.md @@ -18,18 +18,33 @@ $ npm run cold > cold > ts-node scripts/cold-start -Please provide your own WebID for authorization: https://solidme.web/harrypodder/profile/card#me +Please provide your own WebID for authorization: https://solidweb.me/harrypodder/profile/card#me What do you want to name your policy? policy What do you want your rule to be named? permission What action do you want to associate? Choose one below: - - read [1] - - write [2] - - append [3] - - create [4] - - control [5] + - read [1] + - write [2] + - append [3] + - create [4] + - control [5] 1 -Please enter the URL to the resource: http://localhost:3000/harry/podder/resource.txt +Please enter the URL to the resource: http://localhost:3000/harrypodder/resource.txt Please provide the WebID for the assignee: https://example.pod.knows.idlab.ugent.be/profile/card#me + +POST request with body + + @prefix ex: . + @prefix odrl: . + @prefix dct: . + + ex:policy a odrl:Agreement . + ex:policy odrl:permission ex:permission . + ex:permission a odrl:Permission . + ex:permission odrl:action odrl:read . + ex:permission odrl:target . + ex:permission odrl:assignee . + ex:permission odrl:assigner . + Policy added succesfully ``` From ce15ec52de3f35d44cad40cb26799846010433cf Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 10:11:50 +0200 Subject: [PATCH 06/54] feat: added more dynamic way to assign AS + documented this approach --- controller/environment.d.ts | 9 +++++++++ controller/src/classes/utils/PolicyService.ts | 4 ++-- controller/tsconfig.json | 3 ++- documentation/as-assignment.md | 13 +++++++++++++ loama/package.json | 1 + yarn.lock | 5 +++++ 6 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 controller/environment.d.ts create mode 100644 documentation/as-assignment.md diff --git a/controller/environment.d.ts b/controller/environment.d.ts new file mode 100644 index 0000000..b578018 --- /dev/null +++ b/controller/environment.d.ts @@ -0,0 +1,9 @@ +declare global { + namespace NodeJS { + interface ProcessEnv { + AS_URL: string; // declare the type of the AS_URL + } + } +} + +export {}; diff --git a/controller/src/classes/utils/PolicyService.ts b/controller/src/classes/utils/PolicyService.ts index bec43de..f9908d4 100644 --- a/controller/src/classes/utils/PolicyService.ts +++ b/controller/src/classes/utils/PolicyService.ts @@ -1,9 +1,9 @@ import { getDefaultSession } from "@inrupt/solid-client-authn-browser"; import { Permission } from "../../types"; import { ODRL, PolicyParser } from "./PolicyParser"; -import { DataFactory, Writer } from "n3" +import { DataFactory, Writer } from "n3"; const { namedNode } = DataFactory -export const UMA_URL = (encodedId: string = "") => `http://localhost:4000/uma/policies${encodedId}` +export const UMA_URL = (encodedId: string = "") => `${process.env.AS_URL}${encodedId}` export class PolicyService { constructor() { } diff --git a/controller/tsconfig.json b/controller/tsconfig.json index 14363b9..76409c1 100644 --- a/controller/tsconfig.json +++ b/controller/tsconfig.json @@ -102,6 +102,7 @@ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, "include": [ - "src/**/*" + "src/**/*", + "environment.d.ts", ] } diff --git a/documentation/as-assignment.md b/documentation/as-assignment.md new file mode 100644 index 0000000..7315397 --- /dev/null +++ b/documentation/as-assignment.md @@ -0,0 +1,13 @@ +# How to assign an AS + +Older versions of LOAMA had a hard-coded AS assignment in [the code](../loama/controller/src/classes/utils/PolicyService.ts). +In order to configure this easily, we introduced an environment variable `AS_URL`. +Once set, the code will fill this in automatically, so there is only one place you need to update this value if it changes. + +For example, a simple `.env` file is sufficient: + +```env +AS_URL="http://localhost:4000/uma/policies/" +``` + +Future expansions in the code could provide a more dynamic way of configuring the AS by allowing the user to switch from the UI to different servers with the one set in the environment variable as fallback option. diff --git a/loama/package.json b/loama/package.json index 17f2ba2..b0ac4c1 100644 --- a/loama/package.json +++ b/loama/package.json @@ -25,6 +25,7 @@ "@phosphor-icons/vue": "^2.2.1", "@primevue/themes": "^4.1.1", "@vueform/multiselect": "^2.6.9", + "dotenv": "^17.2.1", "loama-app": "^1.0.0", "loama-common": "^1.0.0", "loama-controller": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 0317155..535bbb8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4538,6 +4538,11 @@ dotenv@^16.4.4, dotenv@~16.4.5: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +dotenv@^17.2.1: + version "17.2.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.1.tgz#6f32e10faf014883515538dc922a0fb8765d9b32" + integrity sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ== + duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" From 19212cecbd8d6b77f3a1f347d8763fb0d0d81550 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 11:39:35 +0200 Subject: [PATCH 07/54] refactor: switch back to the static AS assignment and describe new idea in documentation --- controller/environment.d.ts | 9 -------- controller/src/classes/utils/PolicyService.ts | 2 +- controller/tsconfig.json | 1 - documentation/as-assignment.md | 23 +++++++++++-------- 4 files changed, 15 insertions(+), 20 deletions(-) delete mode 100644 controller/environment.d.ts diff --git a/controller/environment.d.ts b/controller/environment.d.ts deleted file mode 100644 index b578018..0000000 --- a/controller/environment.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare global { - namespace NodeJS { - interface ProcessEnv { - AS_URL: string; // declare the type of the AS_URL - } - } -} - -export {}; diff --git a/controller/src/classes/utils/PolicyService.ts b/controller/src/classes/utils/PolicyService.ts index f9908d4..a3c9e99 100644 --- a/controller/src/classes/utils/PolicyService.ts +++ b/controller/src/classes/utils/PolicyService.ts @@ -3,7 +3,7 @@ import { Permission } from "../../types"; import { ODRL, PolicyParser } from "./PolicyParser"; import { DataFactory, Writer } from "n3"; const { namedNode } = DataFactory -export const UMA_URL = (encodedId: string = "") => `${process.env.AS_URL}${encodedId}` +export const UMA_URL = (encodedId: string = "") => `http://localhost:4000/uma/policies/${encodedId}` export class PolicyService { constructor() { } diff --git a/controller/tsconfig.json b/controller/tsconfig.json index 76409c1..5320f06 100644 --- a/controller/tsconfig.json +++ b/controller/tsconfig.json @@ -103,6 +103,5 @@ }, "include": [ "src/**/*", - "environment.d.ts", ] } diff --git a/documentation/as-assignment.md b/documentation/as-assignment.md index 7315397..34ea053 100644 --- a/documentation/as-assignment.md +++ b/documentation/as-assignment.md @@ -1,13 +1,18 @@ -# How to assign an AS +# Dynamic assignment of Authorization Server -Older versions of LOAMA had a hard-coded AS assignment in [the code](../loama/controller/src/classes/utils/PolicyService.ts). -In order to configure this easily, we introduced an environment variable `AS_URL`. -Once set, the code will fill this in automatically, so there is only one place you need to update this value if it changes. +Currently, the application makes use of a hard-coded AS assignment in [PolicyService.ts](../controller/src/classes/utils/PolicyService.ts). +This approach is not ideal for users, as one user might have his WebID registered with several Authorization Servers. +The way LOAMA talks to these ASs is through Controllers. +These Controllers have to be configured in such a way that LOAMA has a single interface to talk with them, +while these Controllers translate the requests coming from LOAMA to the format of the AS (e.g.: UMA AMA backend, ODRL, Google Drive's own format...) -For example, a simple `.env` file is sufficient: +Future implementations should aim to define a Controller for each of the AS types LOAMA wants to be able to talk to. +Say LOAMA supports three different AS platforms. +When the application starts, LOAMA can choose to let the user enter the URL and type of their AS, just like it prompts for the WebID. +LOAMA sees the type of AS and can then choose the right Controller instance. +This way, LOAMA needs to start only just as many Controller instances as it supports different AS platforms. -```env -AS_URL="http://localhost:4000/uma/policies/" -``` +This is a reasonable trade-off between performance and decoupling. +Instead of creating a new Controller instance for each switch, LOAMA can simply switch the previous one out. -Future expansions in the code could provide a more dynamic way of configuring the AS by allowing the user to switch from the UI to different servers with the one set in the environment variable as fallback option. +This idea is implemented as example in [this repository](). From b89fa225b222425aee834033ae511a4d9b4e4d24 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 11:43:23 +0200 Subject: [PATCH 08/54] docs: link to proposal repositor --- documentation/as-assignment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/as-assignment.md b/documentation/as-assignment.md index 34ea053..9a777a5 100644 --- a/documentation/as-assignment.md +++ b/documentation/as-assignment.md @@ -15,4 +15,4 @@ This way, LOAMA needs to start only just as many Controller instances as it supp This is a reasonable trade-off between performance and decoupling. Instead of creating a new Controller instance for each switch, LOAMA can simply switch the previous one out. -This idea is implemented as example in [this repository](). +This idea is implemented as example in [this repository](https://github.com/bramcomyn/loama-as-assignment-proposal). From d781e628060071f9de108ad57620e4078d960020 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Tue, 19 Aug 2025 12:01:13 +0200 Subject: [PATCH 09/54] docs: minor error in documentation of as assignment proposal fixed --- documentation/as-assignment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/as-assignment.md b/documentation/as-assignment.md index 9a777a5..da38b5e 100644 --- a/documentation/as-assignment.md +++ b/documentation/as-assignment.md @@ -4,7 +4,7 @@ Currently, the application makes use of a hard-coded AS assignment in [PolicySer This approach is not ideal for users, as one user might have his WebID registered with several Authorization Servers. The way LOAMA talks to these ASs is through Controllers. These Controllers have to be configured in such a way that LOAMA has a single interface to talk with them, -while these Controllers translate the requests coming from LOAMA to the format of the AS (e.g.: UMA AMA backend, ODRL, Google Drive's own format...) +while these Controllers translate the requests coming from LOAMA to the format of the AS (e.g.: SOLID, ODRL, Google Drive's own format...) Future implementations should aim to define a Controller for each of the AS types LOAMA wants to be able to talk to. Say LOAMA supports three different AS platforms. From 3810302b6ec2e6840ac254bed5479575fbbeec64 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Wed, 20 Aug 2025 11:07:43 +0200 Subject: [PATCH 10/54] feat: introduced manual and automatic refresh in ResourceExplorer.vue --- .../components/explorer/ResourceExplorer.vue | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/loama/src/components/explorer/ResourceExplorer.vue b/loama/src/components/explorer/ResourceExplorer.vue index 451636d..20cd0dd 100644 --- a/loama/src/components/explorer/ResourceExplorer.vue +++ b/loama/src/components/explorer/ResourceExplorer.vue @@ -1,7 +1,8 @@ diff --git a/loama/src/components/inbox/RequestInbox.vue b/loama/src/components/inbox/RequestInbox.vue deleted file mode 100644 index ee3f77a..0000000 --- a/loama/src/components/inbox/RequestInbox.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/loama/src/components/inbox/RequestResponseMessage.vue b/loama/src/components/inbox/RequestResponseMessage.vue deleted file mode 100644 index e556251..0000000 --- a/loama/src/components/inbox/RequestResponseMessage.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - diff --git a/loama/src/components/inbox/ResponseInbox.vue b/loama/src/components/inbox/ResponseInbox.vue deleted file mode 100644 index ab8ca5f..0000000 --- a/loama/src/components/inbox/ResponseInbox.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/loama/src/components/layouts/HeaderLayout.vue b/loama/src/components/layouts/HeaderLayout.vue index a015c7c..510d7e1 100644 --- a/loama/src/components/layouts/HeaderLayout.vue +++ b/loama/src/components/layouts/HeaderLayout.vue @@ -1,14 +1,21 @@ + + + diff --git a/loama/src/router/index.ts b/loama/src/router/index.ts index afd145c..61db421 100644 --- a/loama/src/router/index.ts +++ b/loama/src/router/index.ts @@ -1,12 +1,12 @@ import { createRouter, createWebHistory } from 'vue-router' import HomeView from '@/views/HomeView.vue' import LoginView from '@/views/LoginView.vue' -import RequestView from '@/views/RequestView.vue' import { store } from 'loama-app' import { listPodUrls } from 'loama-common' import HeaderLayout from '@/components/layouts/HeaderLayout.vue' -import InboxView from '@/views/InboxView.vue' import { useControllerStore } from '@/stores/useControllerStore' +import AccessRequest from '@/components/access-requests/AccessRequest.vue' +import AccessGrant from '@/components/access-grants/AccessGrant.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -26,14 +26,14 @@ const router = createRouter({ component: HomeView }, { - path: "/request", - name: "request", - component: RequestView, + path: `/access-requests/`, + name: 'access-requests', + component: AccessRequest }, { - path: "/inbox", - name: "inbox", - component: InboxView, + path: '/access-grants/', + name: 'access-grants', + component: AccessGrant } ] } diff --git a/loama/src/views/RequestView.vue b/loama/src/views/RequestView.vue deleted file mode 100644 index 18a3564..0000000 --- a/loama/src/views/RequestView.vue +++ /dev/null @@ -1,157 +0,0 @@ - - - From b10da36357ea04dc1311938a48d02e6008561b65 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Sun, 7 Sep 2025 12:43:32 +0200 Subject: [PATCH 36/54] feat: instantiating new access requests-related components --- loama/src/components/access-grants/AccessGrant.vue | 7 +++++++ loama/src/components/access-requests/AccessRequest.vue | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 loama/src/components/access-grants/AccessGrant.vue create mode 100644 loama/src/components/access-requests/AccessRequest.vue diff --git a/loama/src/components/access-grants/AccessGrant.vue b/loama/src/components/access-grants/AccessGrant.vue new file mode 100644 index 0000000..a5b6024 --- /dev/null +++ b/loama/src/components/access-grants/AccessGrant.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/loama/src/components/access-requests/AccessRequest.vue b/loama/src/components/access-requests/AccessRequest.vue new file mode 100644 index 0000000..a582295 --- /dev/null +++ b/loama/src/components/access-requests/AccessRequest.vue @@ -0,0 +1,7 @@ + + + + + From 49809f3075381c4ca81f85d558923e02614f8ade Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Sun, 7 Sep 2025 12:51:35 +0200 Subject: [PATCH 37/54] fix: styling in panel container for resources tab was too high and wide --- loama/src/components/explorer/ResourceExplorer.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loama/src/components/explorer/ResourceExplorer.vue b/loama/src/components/explorer/ResourceExplorer.vue index 32fe16e..74737f7 100644 --- a/loama/src/components/explorer/ResourceExplorer.vue +++ b/loama/src/components/explorer/ResourceExplorer.vue @@ -90,8 +90,8 @@ i { .panel-container { display: flex; - height: calc(100vh - var(--base-unit)*13); - width: 100vw; + height: calc(100vh - var(--base-unit)*14); + width: 100%; } .left-panel, From 2c7f782bc11c023851a6d33d589d72924fccc81f Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Mon, 8 Sep 2025 09:19:25 +0200 Subject: [PATCH 38/54] feat: showcase request access component implemented --- .../components/access-grants/AccessGrant.vue | 1 - .../access-requests/AccessRequest.vue | 207 +++++++++++++++++- .../access-requests/AccessRequestEntry.vue | 85 +++++++ loama/src/components/access-requests/util.ts | 34 +++ 4 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 loama/src/components/access-requests/AccessRequestEntry.vue create mode 100644 loama/src/components/access-requests/util.ts diff --git a/loama/src/components/access-grants/AccessGrant.vue b/loama/src/components/access-grants/AccessGrant.vue index a5b6024..ebd06d8 100644 --- a/loama/src/components/access-grants/AccessGrant.vue +++ b/loama/src/components/access-grants/AccessGrant.vue @@ -1,7 +1,6 @@ diff --git a/loama/src/components/access-requests/AccessRequest.vue b/loama/src/components/access-requests/AccessRequest.vue index a582295..c376b19 100644 --- a/loama/src/components/access-requests/AccessRequest.vue +++ b/loama/src/components/access-requests/AccessRequest.vue @@ -1,7 +1,208 @@ - + - + diff --git a/loama/src/components/access-requests/AccessRequestEntry.vue b/loama/src/components/access-requests/AccessRequestEntry.vue new file mode 100644 index 0000000..82af3e8 --- /dev/null +++ b/loama/src/components/access-requests/AccessRequestEntry.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/loama/src/components/access-requests/util.ts b/loama/src/components/access-requests/util.ts new file mode 100644 index 0000000..68ef2f8 --- /dev/null +++ b/loama/src/components/access-requests/util.ts @@ -0,0 +1,34 @@ +export interface AccessRequest { + uid: string + target: string, + action: string, + requestingParty: string, + status: string, +} + +// TODO: create functions to transfer between `Store`s from n3js and the interface above +// TODO: make sure all code here is placed in the appropriate files + +export const request: AccessRequest = { + uid: "http://example.org/request", + target: "http://localhost:3000/resources/resource.txt", + action: "odrl:read", + requestingParty: "https://solidweb.me/harrypodder/profile/card#me", + status: "ex:requested" +} + +export const acceptedRequest: AccessRequest = { + uid: "http://example.org/acceptedRequest", + target: "http://localhost:3000/resources/accepted_resource.txt", + action: "odrl:read", + requestingParty: "https://solidweb.me/harrypodder/profile/card#me", + status: "ex:accepted" +} + +export const deniedRequest: AccessRequest = { + uid: "http://example.org/deniedRequest", + target: "http://localhost:3000/resources/denied_resource.txt", + action: "odrl:read", + requestingParty: "https://solidweb.me/harrypodder/profile/card#me", + status: "ex:denied" +} From 51e5f41274115f82599a784b6d3925ecd463b190 Mon Sep 17 00:00:00 2001 From: Bram Comyn Date: Mon, 8 Sep 2025 09:34:50 +0200 Subject: [PATCH 39/54] feat: showcase grant access component implemented --- .../components/access-grants/AccessGrant.vue | 108 +++++++++++++++++- .../access-requests/AccessRequestEntry.vue | 38 +++++- 2 files changed, 139 insertions(+), 7 deletions(-) diff --git a/loama/src/components/access-grants/AccessGrant.vue b/loama/src/components/access-grants/AccessGrant.vue index ebd06d8..782df42 100644 --- a/loama/src/components/access-grants/AccessGrant.vue +++ b/loama/src/components/access-grants/AccessGrant.vue @@ -1,6 +1,110 @@ - + - + diff --git a/loama/src/components/access-requests/AccessRequestEntry.vue b/loama/src/components/access-requests/AccessRequestEntry.vue index 82af3e8..f3ea9f2 100644 --- a/loama/src/components/access-requests/AccessRequestEntry.vue +++ b/loama/src/components/access-requests/AccessRequestEntry.vue @@ -12,7 +12,12 @@ const props = defineProps<{ {{ props.request.uid }} -

Target: {{ props.request.target }}

+
+ target: + {{ props.request.target }} + action: + {{ props.request.action }} +
Date: Tue, 9 Sep 2025 11:30:56 +0200 Subject: [PATCH 40/54] feat: tooltips and styling for access requests and grants and header tabs --- .../components/access-grants/AccessGrant.vue | 113 +++++++----- .../access-requests/AccessRequest.vue | 167 ++++++++---------- .../access-requests/AccessRequestEntry.vue | 20 +-- loama/src/components/access-requests/util.ts | 34 ---- loama/src/components/header/HeaderTab.vue | 64 ++++--- loama/src/components/layouts/HeaderLayout.vue | 6 +- loama/src/lib/utils.ts | 38 +++- 7 files changed, 237 insertions(+), 205 deletions(-) delete mode 100644 loama/src/components/access-requests/util.ts diff --git a/loama/src/components/access-grants/AccessGrant.vue b/loama/src/components/access-grants/AccessGrant.vue index 782df42..757b647 100644 --- a/loama/src/components/access-grants/AccessGrant.vue +++ b/loama/src/components/access-grants/AccessGrant.vue @@ -1,11 +1,8 @@ diff --git a/loama/src/components/layouts/HeaderLayout.vue b/loama/src/components/layouts/HeaderLayout.vue index 510d7e1..34734a0 100644 --- a/loama/src/components/layouts/HeaderLayout.vue +++ b/loama/src/components/layouts/HeaderLayout.vue @@ -1,9 +1,9 @@