Skip to content

Commit 6893677

Browse files
committed
feat: Update ODRL evaluator
1 parent 2e0b7ad commit 6893677

3 files changed

Lines changed: 113 additions & 23 deletions

File tree

packages/uma/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"koreografeye": "^0.4.8",
7474
"logform": "^2.6.0",
7575
"n3": "^1.17.2",
76-
"odrl-evaluator": "^0.1.1",
76+
"odrl-evaluator": "^0.3.0",
7777
"ts-node": "^10.9.2",
7878
"uri-template-lite": "^23.4.0",
7979
"winston": "^3.11.0"

packages/uma/src/policies/authorizers/OdrlAuthorizer.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createVocabulary, DC, getLoggerFor, RDF } from '@solid/community-server';
22
import { basicPolicy, ODRL, UCPPolicy, UCRulesStorage } from '@solidlab/ucp';
3-
import { DataFactory, Literal, NamedNode, Quad_Subject, Store } from 'n3';
3+
import { DataFactory, Literal, NamedNode, Quad_Subject, Store, Writer } from 'n3';
44
import { EyeReasoner, ODRLEngineMultipleSteps, ODRLEvaluator } from 'odrl-evaluator'
55
import { WEBID } from '../../credentials/Claims';
66
import { ClaimSet } from '../../credentials/ClaimSet';
@@ -35,13 +35,14 @@ export class OdrlAuthorizer implements Authorizer {
3535
*
3636
*
3737
* @param policies - A store containing the ODRL policy rules.
38+
* @param eyePath - The path to run the local EYE reasoner, if there is one.
3839
*/
3940
constructor(
4041
private readonly policies: UCRulesStorage,
41-
private readonly eyePath?: string,
42+
eyePath?: string,
4243
) {
4344
const engine = eyePath ?
44-
new ODRLEngineMultipleSteps(new EyeReasoner(eyePath, ["--quiet", "--nope", "--pass-only-new"])) :
45+
new ODRLEngineMultipleSteps({reasoner: new EyeReasoner(eyePath, ["--quiet", "--nope", "--pass-only-new"])}) :
4546
new ODRLEngineMultipleSteps();
4647
this.odrlEvaluator = new ODRLEvaluator(engine);
4748
}
@@ -100,8 +101,9 @@ export class OdrlAuthorizer implements Authorizer {
100101
const PolicyReportNodes = reportStore.getSubjects(RDF.type, CR.PolicyReport, null);
101102
for (const policyReportNode of PolicyReportNodes) {
102103
const policyReport = parseComplianceReport(policyReportNode, reportStore)
103-
if (policyReport.ruleReport[0].activationState === ActivationState.Active &&
104-
policyReport.ruleReport[0].type === RuleReportType.PermissionReport) {
104+
const activeReports = policyReport.ruleReport.filter(
105+
(report) => report.activationState === ActivationState.Active);
106+
if (activeReports.length > 0 && activeReports[0].type === RuleReportType.PermissionReport) {
105107
grantedPermissions[resource_id].push(action);
106108
}
107109
}
@@ -182,25 +184,25 @@ type PremiseReport = {
182184
// is it possible to just use CR.namespace + "term"?
183185
// https://github.com/microsoft/TypeScript/issues/40793
184186
enum RuleReportType {
185-
PermissionReport= 'http://example.com/report/temp/PermissionReport',
186-
ProhibitionReport= 'http://example.com/report/temp/ProhibitionReport',
187-
ObligationReport= 'http://example.com/report/temp/ObligationReport',
187+
PermissionReport= 'https://w3id.org/force/compliance-report#PermissionReport',
188+
ProhibitionReport= 'https://w3id.org/force/compliance-report#ProhibitionReport',
189+
ObligationReport= 'https://w3id.org/force/compliance-report#ObligationReport',
188190
}
189191
enum SatisfactionState {
190-
Satisfied= 'http://example.com/report/temp/Satisfied',
191-
Unsatisfied= 'http://example.com/report/temp/Unsatisfied',
192+
Satisfied= 'https://w3id.org/force/compliance-report#Satisfied',
193+
Unsatisfied= 'https://w3id.org/force/compliance-report#Unsatisfied',
192194
}
193195

194196
enum PremiseReportType {
195-
ConstraintReport = 'http://example.com/report/temp/ConstraintReport',
196-
PartyReport = 'http://example.com/report/temp/PartyReport',
197-
TargetReport = 'http://example.com/report/temp/TargetReport',
198-
ActionReport = 'http://example.com/report/temp/ActionReport',
197+
ConstraintReport = 'https://w3id.org/force/compliance-report#ConstraintReport',
198+
PartyReport = 'https://w3id.org/force/compliance-report#PartyReport',
199+
TargetReport = 'https://w3id.org/force/compliance-report#TargetReport',
200+
ActionReport = 'https://w3id.org/force/compliance-report#ActionReport',
199201
}
200202

201203
enum ActivationState {
202-
Active= 'http://example.com/report/temp/Active',
203-
Inactive= 'http://example.com/report/temp/Inactive',
204+
Active= 'https://w3id.org/force/compliance-report#Active',
205+
Inactive= 'https://w3id.org/force/compliance-report#Inactive',
204206
}
205207

206208
/**
@@ -254,7 +256,7 @@ function parsePremiseReport(identifier: Quad_Subject, store: Store): PremiseRepo
254256
satisfactionState: store.getObjects(identifier, CR.satisfactionState, null)[0].value as SatisfactionState
255257
}
256258
}
257-
const CR = createVocabulary('http://example.com/report/temp/',
259+
const CR = createVocabulary('https://w3id.org/force/compliance-report#',
258260
'PolicyReport',
259261
'RuleReport',
260262
'PermissionReport',

yarn.lock

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4096,6 +4096,15 @@ __metadata:
40964096
languageName: node
40974097
linkType: hard
40984098

4099+
"@rdfjs/types@npm:^2.0.0, @rdfjs/types@npm:^2.0.1":
4100+
version: 2.0.1
4101+
resolution: "@rdfjs/types@npm:2.0.1"
4102+
dependencies:
4103+
"@types/node": "npm:*"
4104+
checksum: 10c0/81012b02e28737e15dfc27068664bbab7b989cc2ff82e0a6a341df492d9d97210b5e462d85bfb7882aa0ef5bf84e2c5e95647fb779b67b7b1910b1837d79c500
4105+
languageName: node
4106+
linkType: hard
4107+
40994108
"@rubensworks/saxes@npm:^6.0.1":
41004109
version: 6.0.1
41014110
resolution: "@rubensworks/saxes@npm:6.0.1"
@@ -4325,7 +4334,7 @@ __metadata:
43254334
koreografeye: "npm:^0.4.8"
43264335
logform: "npm:^2.6.0"
43274336
n3: "npm:^1.17.2"
4328-
odrl-evaluator: "npm:^0.1.1"
4337+
odrl-evaluator: "npm:^0.3.0"
43294338
ts-node: "npm:^10.9.2"
43304339
uri-template-lite: "npm:^23.4.0"
43314340
winston: "npm:^3.11.0"
@@ -4440,6 +4449,18 @@ __metadata:
44404449
languageName: node
44414450
linkType: hard
44424451

4452+
"@treecg/types@npm:^0.4.6":
4453+
version: 0.4.6
4454+
resolution: "@treecg/types@npm:0.4.6"
4455+
dependencies:
4456+
"@rdfjs/types": "npm:*"
4457+
loglevel: "npm:^1.8.1"
4458+
loglevel-plugin-prefix: "npm:^0.8.4"
4459+
rdf-data-factory: "npm:^1.1.0"
4460+
checksum: 10c0/956dfc34dbbcad4ef3099431be55bd1f5c8b1f5fca71f0bc90ca5823017ba25c70f6db1a066691541c900a59e1ad7522f041965162f66627e19e20c99bce5cf9
4461+
languageName: node
4462+
linkType: hard
4463+
44434464
"@tsconfig/node10@npm:^1.0.7":
44444465
version: 1.0.9
44454466
resolution: "@tsconfig/node10@npm:1.0.9"
@@ -4842,6 +4863,16 @@ __metadata:
48424863
languageName: node
48434864
linkType: hard
48444865

4866+
"@types/n3@npm:^1.21.1":
4867+
version: 1.24.2
4868+
resolution: "@types/n3@npm:1.24.2"
4869+
dependencies:
4870+
"@rdfjs/types": "npm:*"
4871+
"@types/node": "npm:*"
4872+
checksum: 10c0/4d9fceea390134a1e4c3da63d493b841ffea8ef581264fdd6b764809403f99e94517770799fa53bfc01000b88a2627385502b20df7c0e7461869e694bb667b0a
4873+
languageName: node
4874+
linkType: hard
4875+
48454876
"@types/node@npm:^20.11.25":
48464877
version: 20.17.17
48474878
resolution: "@types/node@npm:20.17.17"
@@ -9139,6 +9170,20 @@ __metadata:
91399170
languageName: node
91409171
linkType: hard
91419172

9173+
"loglevel-plugin-prefix@npm:^0.8.4":
9174+
version: 0.8.4
9175+
resolution: "loglevel-plugin-prefix@npm:0.8.4"
9176+
checksum: 10c0/357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec
9177+
languageName: node
9178+
linkType: hard
9179+
9180+
"loglevel@npm:^1.8.1":
9181+
version: 1.9.2
9182+
resolution: "loglevel@npm:1.9.2"
9183+
checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7
9184+
languageName: node
9185+
linkType: hard
9186+
91429187
"lowercase-keys@npm:^3.0.0":
91439188
version: 3.0.0
91449189
resolution: "lowercase-keys@npm:3.0.0"
@@ -9535,6 +9580,16 @@ __metadata:
95359580
languageName: node
95369581
linkType: hard
95379582

9583+
"n3@npm:^1.23.1":
9584+
version: 1.25.2
9585+
resolution: "n3@npm:1.25.2"
9586+
dependencies:
9587+
buffer: "npm:^6.0.3"
9588+
readable-stream: "npm:^4.0.0"
9589+
checksum: 10c0/47cb03555ddceb98be9c5ed10d67c9a045afe13d1a4225fe2ace9a63dcf8e1b6afe6019d72cb03e320c2c1d2fb6942c18ec92cdf3673e792a2084d5b1b5e089f
9590+
languageName: node
9591+
linkType: hard
9592+
95389593
"nanoid@npm:^5.0.4":
95399594
version: 5.0.4
95409595
resolution: "nanoid@npm:5.0.4"
@@ -9743,21 +9798,23 @@ __metadata:
97439798
languageName: node
97449799
linkType: hard
97459800

9746-
"odrl-evaluator@npm:^0.1.1":
9747-
version: 0.1.1
9748-
resolution: "odrl-evaluator@npm:0.1.1"
9801+
"odrl-evaluator@npm:^0.3.0":
9802+
version: 0.3.0
9803+
resolution: "odrl-evaluator@npm:0.3.0"
97499804
dependencies:
97509805
"@rdfjs/types": "npm:^1.1.0"
97519806
"@types/n3": "npm:^1.16.3"
97529807
eyereasoner: "npm:^16.18.4"
97539808
n3: "npm:^1.20.4"
97549809
rdf-isomorphic: "npm:^1.3.1"
9810+
rdf-lens: "npm:^1.3.5"
97559811
rdf-parse: "npm:^3.0.0"
97569812
rdf-store-stream: "npm:^2.0.1"
9813+
rdf-vocabulary: "npm:^1.0.1"
97579814
streamify-string: "npm:^1.0.1"
97589815
tmp: "npm:^0.2.3"
97599816
uuidv4: "npm:^6.2.13"
9760-
checksum: 10c0/5091b4402b2def1fb6bf8e7749d7f2b89a1817da59abfa6ae9f1a0db2fd3ae50222eebc578fba21f9d0f455cb5b515a067ac13584c43e3ba98f50454ccf30e16
9817+
checksum: 10c0/a42fd82a48012ffbd8ff7165883bce10bce1a31fd5d8f82ba951cf67a9b438bbcf5d4fc6eb5ac52635ebc7c2411613509267cecf41ed3169ae5a5fe88da261f3
97619818
languageName: node
97629819
linkType: hard
97639820

@@ -10230,6 +10287,15 @@ __metadata:
1023010287
languageName: node
1023110288
linkType: hard
1023210289

10290+
"rdf-data-factory@npm:^2.0.2":
10291+
version: 2.0.2
10292+
resolution: "rdf-data-factory@npm:2.0.2"
10293+
dependencies:
10294+
"@rdfjs/types": "npm:^2.0.0"
10295+
checksum: 10c0/5c72ebc22f4910fd35bf3efb1e1def10785aca6f8d22dd8cee34c9ffb764225698ebdfeaf09a2afba6c25e17733940ab52cefd5c751cc2720b29b5ee56ef32ee
10296+
languageName: node
10297+
linkType: hard
10298+
1023310299
"rdf-dereference@npm:^2.2.0":
1023410300
version: 2.2.0
1023510301
resolution: "rdf-dereference@npm:2.2.0"
@@ -10293,6 +10359,19 @@ __metadata:
1029310359
languageName: node
1029410360
linkType: hard
1029510361

10362+
"rdf-lens@npm:^1.3.5":
10363+
version: 1.3.5
10364+
resolution: "rdf-lens@npm:1.3.5"
10365+
dependencies:
10366+
"@rdfjs/types": "npm:^2.0.1"
10367+
"@treecg/types": "npm:^0.4.6"
10368+
"@types/n3": "npm:^1.21.1"
10369+
n3: "npm:^1.23.1"
10370+
rdf-data-factory: "npm:^2.0.2"
10371+
checksum: 10c0/28522512d32569e913cefc37ee125f47942943a67e2daf407195162ba000b0b46317599ed78ec3432cbdf67118ba0a1b70126a116a8d023d2f99fac7f935b822
10372+
languageName: node
10373+
linkType: hard
10374+
1029610375
"rdf-literal@npm:^1.2.0, rdf-literal@npm:^1.3.0":
1029710376
version: 1.3.1
1029810377
resolution: "rdf-literal@npm:1.3.1"
@@ -10506,6 +10585,15 @@ __metadata:
1050610585
languageName: node
1050710586
linkType: hard
1050810587

10588+
"rdf-vocabulary@npm:^1.0.1":
10589+
version: 1.0.1
10590+
resolution: "rdf-vocabulary@npm:1.0.1"
10591+
dependencies:
10592+
"@rdfjs/types": "npm:*"
10593+
checksum: 10c0/5f9f9a7c2dea9084b57a26b03989b24b00c2d606eefe18f8a12adf5425da11329f01e132ed3ce0363a399a854cacad38226865426ecab92dd0719846c6eea34e
10594+
languageName: node
10595+
linkType: hard
10596+
1050910597
"rdfa-streaming-parser@npm:^2.0.1":
1051010598
version: 2.0.1
1051110599
resolution: "rdfa-streaming-parser@npm:2.0.1"

0 commit comments

Comments
 (0)