Skip to content

Commit 6f5736f

Browse files
committed
Backend updates to include multi-target policies
1 parent 6473dce commit 6f5736f

7 files changed

Lines changed: 601 additions & 37 deletions

File tree

package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"test": "yarn workspaces foreach --include 'packages/*' -A -pi -j unlimited run test",
5858
"start": "yarn workspaces foreach --include 'packages/*' -A -pi -j unlimited run start",
5959
"start:demo": "yarn workspaces foreach --include 'packages/*' -A -pi -j unlimited run demo",
60-
"script:demo": "yarn exec ts-node ./demo/flow.ts",
60+
"script:demo": "yarn exec tsx ./demo/flow.ts",
6161
"script:public": "yarn exec ts-node ./scripts/test-public.ts",
6262
"script:private": "yarn exec ts-node ./scripts/test-private.ts",
6363
"script:registration": "yarn exec ts-node ./scripts/test-registration.ts",
@@ -154,10 +154,14 @@
154154
"@digitalbazaar/ed25519-signature-2020": "^5.4.0",
155155
"@digitalbazaar/ed25519-verification-key-2020": "^4.2.0",
156156
"@digitalbazaar/vc": "^7.1.0",
157-
"@digitalcredentials/vc-data-model": "^1.1.1",
157+
"@digitalcredentials/ed25519-signature-2020": "^6.0.0",
158+
"@digitalcredentials/ed25519-verification-key-2020": "^4.0.0",
159+
"@digitalcredentials/vc": "^9.0.1",
160+
"@digitalcredentials/vc-data-model": "^2.0.0",
158161
"@inrupt/solid-client": "^2.0.1",
159162
"@inrupt/solid-client-authn-core": "^2.1.0",
160163
"chalk": "^5.4.1",
161-
"jsonld": "^8.3.3"
164+
"jsonld": "^8.3.3",
165+
"tsx": "^4.19.2"
162166
}
163167
}

packages/uma/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"koreografeye": "^0.4.8",
7474
"logform": "^2.6.0",
7575
"n3": "^1.17.2",
76+
"ts-node": "^10.9.2",
7677
"uuid": "^9.0.1",
7778
"winston": "^3.11.0"
7879
},

packages/uma/src/dialog/ContractNegotiator.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import { ForbiddenHttpError } from '@solid/community-server';
1818
import { ContractManager } from '../policies/contracts/ContractManager';
1919
import { Result, Success } from '../util/Result';
2020
import { AccessToken, Permission, Requirements } from '..';
21-
import { convertStringOrJsonLdIdentifierToString, ODRLContract, ODRLPermission } from '../views/Contract';
22-
import { PermissionMapping, processRequestPermission, ReversePermissionMapping } from '../util/rdf/RequestProcessing';
21+
import { convertStringOrJsonLdIdentifierToString, JsonLdIdentifier, ODRLContract, ODRLPermission, StringOrJsonLdIdentifier } from '../views/Contract';
22+
import { processRequestPermission, switchODRLandCSSPermission } from '../util/rdf/RequestProcessing';
2323

2424

2525
/**
@@ -112,10 +112,10 @@ export class ContractNegotiator implements Negotiator {
112112
// todo: set resource scopes according to contract!
113113
let permissions: Permission[] = contract.permission.map( (p: ODRLPermission) => {
114114
const perm : Permission = {
115-
resource_id: convertStringOrJsonLdIdentifierToString(p.target),
115+
// We do not accept AssetCollections as targets of an UMA access request formatted as an ODRL request!
116+
resource_id: convertStringOrJsonLdIdentifierToString(p.target as StringOrJsonLdIdentifier),
116117
resource_scopes: [ // mapping from ODRL to internal CSS read permission
117-
// ReversePermissionMapping[convertStringOrJsonLdIdentifierToString(p.action)]
118-
"urn:example:css:modes:read"
118+
switchODRLandCSSPermission(convertStringOrJsonLdIdentifierToString(p.action))
119119
]
120120
}
121121
return(perm)

packages/uma/src/policies/contracts/ContractManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DialogInput, Permission, Ticket } from "../.."
33
import { ContractStorage } from "./ContractStorage";
44
import { ODRLContract, ODRLConstraint, ODRLPermission } from "../../views/Contract";
55
import { randomUUID } from "crypto";
6-
import { ReversePermissionMapping } from "../../util/rdf/RequestProcessing";
6+
import { switchODRLandCSSPermission } from "../../util/rdf/RequestProcessing";
77

88

99
export class ContractManager {
@@ -38,7 +38,7 @@ export class ContractManager {
3838
"https://w3id.org/dpv#hasLegalBasis": { "@id": "https://w3id.org/dpv/legal/eu/gdpr#eu-gdpr:A9-2-a" },
3939
permission: [ {
4040
"@type": "Permission",
41-
action: ReversePermissionMapping[permission.resource_scopes[0]],
41+
action: switchODRLandCSSPermission(permission.resource_scopes[0]),
4242
target: permission.resource_id,
4343
assigner: 'http://localhost:3000/ruben/profile/card#me', // user WebID
4444
assignee: 'http://localhost:3000/alice/profile/card#me', // target WebID

packages/uma/src/util/rdf/RequestProcessing.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
import { ClaimSet } from "../../credentials/ClaimSet";
2-
import { convertStringOrJsonLdIdentifierToString, ODRLPermission } from "../../views/Contract";
2+
import { convertStringOrJsonLdIdentifierToString, ODRLPermission, StringOrJsonLdIdentifier } from "../../views/Contract";
33
import { Permission } from "../../views/Permission";
44

5-
export const PermissionMapping: any = {
6-
"https://w3id.org/oac#read": "urn:example:css:modes:read",
7-
"https://w3id.org/oac#write": "urn:example:css:modes:write",
8-
"https://w3id.org/oac#append": "urn:example:css:modes:append",
9-
"https://w3id.org/oac#delete": "urn:example:css:modes:delete",
10-
}
11-
export const ReversePermissionMapping: any = {
12-
"urn:example:css:modes:read": "https://w3id.org/oac#read",
13-
"urn:example:css:modes:write": "https://w3id.org/oac#write",
14-
"urn:example:css:modes:append": "https://w3id.org/oac#append",
15-
"urn:example:css:modes:delete": "https://w3id.org/oac#delete",
5+
export function switchODRLandCSSPermission(permission: string): string {
6+
if(permission.startsWith("urn:example:css:modes:")) {
7+
return permission.replace("urn:example:css:modes:", "https://w3id.org/oac#");
8+
} else if(permission.startsWith("https://w3id.org/oac#")) {
9+
return permission.replace("https://w3id.org/oac#", "urn:example:css:modes:");
10+
} else {
11+
throw new Error(`Permission ${permission} not recognized`)
12+
}
13+
1614
}
1715

1816
export function processRequestPermission(permission: ODRLPermission): Permission {
19-
20-
const resource_id = convertStringOrJsonLdIdentifierToString(permission.target)
17+
// We do not accept AssetCollections as targets of an UMA access request formatted as an ODRL request!
18+
const resource_id = convertStringOrJsonLdIdentifierToString(permission.target as StringOrJsonLdIdentifier)
2119
const action: any = convertStringOrJsonLdIdentifierToString(permission.action)
22-
const resource_scopes = [ PermissionMapping[action] ]
20+
const resource_scopes = [ switchODRLandCSSPermission(action) ]
2321

2422
return { resource_id, resource_scopes }
2523
}

packages/uma/src/views/Contract.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
import { ODRL } from "@solidlab/ucp";
12
import { Type, array, string, optional, any, union } from "../util/ReType";
23

34
export const JsonLdIdentifier = {
45
'@id': string
56
}
67

78
export const StringOrJsonLdIdentifier = union(string, JsonLdIdentifier)
9+
export const IdentifierSet = union(StringOrJsonLdIdentifier, array(StringOrJsonLdIdentifier))
10+
export const ODRLAssetCollection = {
11+
"@type": string,
12+
"source": string,
13+
}
14+
export const ODRLTargetOrAssetCollection = union(StringOrJsonLdIdentifier, ODRLAssetCollection)
15+
816

917
export const ODRLConstraint = {
1018
"@type": optional(string),
@@ -20,7 +28,7 @@ export const ODRLPermission = {
2028
"@id": optional(string),
2129
uid: optional(string),
2230
action: StringOrJsonLdIdentifier,
23-
target: StringOrJsonLdIdentifier, // resourceURL
31+
target: ODRLTargetOrAssetCollection, // resourceURL
2432
assigner: StringOrJsonLdIdentifier, // user WebID
2533
assignee: StringOrJsonLdIdentifier, // target WebID
2634
constraint: optional(array(ODRLConstraint))
@@ -41,9 +49,49 @@ export type ODRLPermission = Type<typeof ODRLPermission>;
4149
export type ODRLContract = Type<typeof ODRLContract>;
4250
export type JsonLdIdentifier = Type<typeof JsonLdIdentifier>;
4351
export type StringOrJsonLdIdentifier = Type<typeof StringOrJsonLdIdentifier>;
52+
export type IdentifierSet = Type<typeof IdentifierSet>;
53+
export type ODRLAssetCollection = Type<typeof ODRLAssetCollection>;
54+
export type ODRLTargetOrAssetCollection = Type<typeof ODRLTargetOrAssetCollection>;
4455

4556

4657
export function convertStringOrJsonLdIdentifierToString(x : StringOrJsonLdIdentifier) : string {
4758
const id = (x as JsonLdIdentifier)["@id"]
4859
return id ? id : x as string
60+
}
61+
62+
/**
63+
* Note: This check makes the assumption of slash-semantics based resource ordering!
64+
* @param url
65+
* @param policyTarget
66+
* @returns
67+
*/
68+
export function isPolicyTarget(url: string, policyTarget: ODRLTargetOrAssetCollection) {
69+
// AssetCollection
70+
const assetCollectionType = (policyTarget as ODRLAssetCollection)["@type"]
71+
if (assetCollectionType && assetCollectionType === ODRL.namespace + "AssetCollection") {
72+
return url.startsWith((policyTarget as ODRLAssetCollection).source)
73+
}
74+
75+
// @id identfier
76+
const id = (policyTarget as JsonLdIdentifier)["@id"]
77+
if (id && url === id) return true
78+
79+
// string
80+
return (policyTarget as string) === url
81+
82+
}
83+
84+
export function getPolicyTargets(policyTarget: ODRLTargetOrAssetCollection): string {
85+
// AssetCollection
86+
const assetCollectionType = (policyTarget as ODRLAssetCollection)["@type"]
87+
if (assetCollectionType && assetCollectionType === ODRL.namespace + "AssetCollection") {
88+
return (policyTarget as ODRLAssetCollection).source
89+
}
90+
91+
// @id identfier
92+
const id = (policyTarget as JsonLdIdentifier)["@id"]
93+
if (id) return id
94+
95+
// string
96+
return policyTarget as string
4997
}

0 commit comments

Comments
 (0)