@@ -2,7 +2,7 @@ import { RDF } from '@solid/community-server';
22import { getLoggerFor } from 'global-logger-factory' ;
33import { DataFactory , Quad , Store } from 'n3' ;
44import { EyelingReasoner , ODRL , ODRLEngineMultipleSteps , ODRLEvaluator } from 'odrl-evaluator' ;
5- import { CLIENTID , WEBID } from '../../credentials/Claims' ;
5+ import { CLIENTID , PURPOSE , WEBID } from '../../credentials/Claims' ;
66import { ClaimSet } from '../../credentials/ClaimSet' ;
77import { basicPolicy } from '../../ucp/policy/ODRL' ;
88import { PrioritizeProhibitionStrategy } from '../../ucp/policy/PrioritizeProhibitionStrategy' ;
@@ -14,6 +14,11 @@ import { Authorizer } from './Authorizer';
1414
1515const { quad, namedNode, literal, blankNode } = DataFactory
1616
17+ const claimOperandMap : Record < string , string > = {
18+ [ CLIENTID ] : ODRL . deliveryChannel ,
19+ [ PURPOSE ] : ODRL . purpose ,
20+ } as const ;
21+
1722/**
1823 * Permission evaluation is performed as follows:
1924 *
@@ -70,15 +75,22 @@ export class OdrlAuthorizer implements Authorizer {
7075 ) ;
7176
7277 const subject = typeof claims [ WEBID ] === 'string' ? claims [ WEBID ] : 'urn:solidlab:uma:id:anonymous' ;
73- const clientQuads : Quad [ ] = [ ] ;
74- const clientSubject = blankNode ( ) ;
75- if ( typeof claims [ CLIENTID ] === 'string' ) {
76- clientQuads . push (
77- quad ( clientSubject , RDF . terms . type , ODRL . terms . Constraint ) ,
78- quad ( clientSubject , ODRL . terms . leftOperand , ODRL . terms . deliveryChannel ) ,
79- quad ( clientSubject , ODRL . terms . operator , ODRL . terms . eq ) ,
80- quad ( clientSubject , ODRL . terms . rightOperand , namedNode ( claims [ CLIENTID ] ) ) ,
81- ) ;
78+ const claimContextConstraints : { subject : ReturnType < typeof blankNode > ; quads : Quad [ ] } [ ] = [ ] ;
79+ for ( const [ claimKey , leftOperand ] of Object . entries ( claimOperandMap ) ) {
80+ const claimValue = claims [ claimKey ] ;
81+ if ( typeof claimValue !== 'string' ) {
82+ continue ;
83+ }
84+ const claimSubject = blankNode ( ) ;
85+ claimContextConstraints . push ( {
86+ subject : claimSubject ,
87+ quads : [
88+ quad ( claimSubject , RDF . terms . type , ODRL . terms . Constraint ) ,
89+ quad ( claimSubject , ODRL . terms . leftOperand , namedNode ( leftOperand ) ) ,
90+ quad ( claimSubject , ODRL . terms . operator , ODRL . terms . eq ) ,
91+ quad ( claimSubject , ODRL . terms . rightOperand , namedNode ( claimValue ) ) ,
92+ ] ,
93+ } ) ;
8294 }
8395
8496 for ( const { resource_id, resource_scopes } of query ) {
@@ -101,14 +113,13 @@ export class OdrlAuthorizer implements Authorizer {
101113 }
102114 const request = basicPolicy ( requestPolicy ) ;
103115 const requestStore = request . representation
104- // Adding context triples for the client identifier, if there is one
105- if ( clientQuads . length > 0 ) {
116+ for ( const contextConstraint of claimContextConstraints ) {
106117 requestStore . addQuad ( quad (
107118 namedNode ( request . ruleIRIs [ 0 ] ) ,
108119 namedNode ( 'https://w3id.org/force/sotw#context' ) ,
109- clientSubject ,
120+ contextConstraint . subject ,
110121 ) ) ;
111- requestStore . addQuads ( clientQuads ) ;
122+ requestStore . addQuads ( contextConstraint . quads ) ;
112123 }
113124
114125 // evaluate policies
0 commit comments