@@ -20,9 +20,9 @@ function publisherTrustedApp (kb, doc, aclDoc, modesRequired, origin, docAuths)
20
20
// modesRequired.every(mode => appAuths.some(auth => kb.holds(auth, ACL('mode'), mode, aclDoc)))
21
21
}
22
22
23
- function accessDenied ( kb , doc , directory , aclDoc , agent , modesRequired , origin , trustedOrigins ) {
23
+ function accessDenied ( kb , doc , directory , aclDoc , agent , modesRequired , origin , trustedOrigins , originTrustedModes = [ ] ) {
24
24
log ( `accessDenied: checking access to ${ doc } by ${ agent } and origin ${ origin } ` )
25
- let modeURIorReasons = modesAllowed ( kb , doc , directory , aclDoc , agent , origin , trustedOrigins )
25
+ const modeURIorReasons = modesAllowed ( kb , doc , directory , aclDoc , agent , origin , trustedOrigins , originTrustedModes )
26
26
let ok = false
27
27
log ( 'accessDenied: modeURIorReasons: ' + JSON . stringify ( Array . from ( modeURIorReasons ) ) )
28
28
modesRequired . forEach ( mode => {
@@ -44,6 +44,36 @@ function accessDenied (kb, doc, directory, aclDoc, agent, modesRequired, origin,
44
44
return ok
45
45
}
46
46
47
+ async function getTrustedModesForOrigin ( kb , agent , origin ) {
48
+ if ( ! kb || ! origin ) {
49
+ return Promise . resolve ( { } )
50
+ }
51
+ const queryString = `
52
+ SELECT ?mode WHERE {
53
+ ${ agent } ${ ACL ( 'trustedApp' ) } ?trustedOrigin.
54
+ ?trustedOrigin ${ ACL ( 'origin' ) } ${ origin } ;
55
+ ${ ACL ( 'mode' ) } ?mode .
56
+ }`
57
+ const results = await query ( queryString , kb )
58
+ return results . map ( result => result [ '?mode' ] )
59
+ }
60
+
61
+ async function query ( queryString , store ) {
62
+ return new Promise ( ( resolve , reject ) => {
63
+ try {
64
+ const query = $rdf . SPARQLToQuery ( queryString , true , store )
65
+ const results = [ ]
66
+ store . query ( query , ( result ) => {
67
+ results . push ( result )
68
+ } , null , ( ) => {
69
+ resolve ( results )
70
+ } )
71
+ } catch ( err ) {
72
+ reject ( err )
73
+ }
74
+ } )
75
+ }
76
+
47
77
/* Function checkAccess
48
78
** @param kb A quadstore
49
79
** @param doc the resource (A named node) or directory for which ACL applies
@@ -52,7 +82,7 @@ function checkAccess (kb, doc, directory, aclDoc, agent, modesRequired, origin,
52
82
return ! accessDenied ( kb , doc , directory , aclDoc , agent , modesRequired , origin , trustedOrigins )
53
83
}
54
84
55
- function modesAllowed ( kb , doc , directory , aclDoc , agent , origin , trustedOrigins ) {
85
+ function modesAllowed ( kb , doc , directory , aclDoc , agent , origin , trustedOrigins , originTrustedModes = [ ] ) {
56
86
var auths
57
87
if ( ! directory ) { // Normal case, ACL for a file
58
88
auths = kb . each ( null , ACL ( 'accessTo' ) , doc , aclDoc )
@@ -62,7 +92,7 @@ function modesAllowed (kb, doc, directory, aclDoc, agent, origin, trustedOrigins
62
92
auths = auths . concat ( kb . each ( null , ACL ( 'defaultForNew' ) , directory , null ) ) // Deprecated but keep for ages
63
93
log ( ` ${ auths . length } default authentications about ${ directory } in ${ aclDoc } ` )
64
94
}
65
- if ( origin && trustedOrigins && trustedOriginsIncludeOrigin ( trustedOrigins , origin ) ) {
95
+ if ( origin && trustedOrigins && nodesIncludeNode ( trustedOrigins , origin ) ) {
66
96
log ( 'Origin ' + origin + ' is trusted' )
67
97
origin = null // stop worrying about origin
68
98
log ( ` modesAllowed: Origin ${ origin } is trusted.` )
@@ -108,6 +138,10 @@ function modesAllowed (kb, doc, directory, aclDoc, agent, origin, trustedOrigins
108
138
log ( ' Origin check not needed: no origin.' )
109
139
return false
110
140
}
141
+ if ( originTrustedModes && originTrustedModes . length > 0 ) {
142
+ log ( ` Origin might have access (${ originTrustedModes . join ( ', ' ) } )` )
143
+ return false
144
+ }
111
145
if ( originOK ( auth , origin ) ) {
112
146
log ( ' Origin check succeeded.' )
113
147
return false
@@ -125,6 +159,9 @@ function modesAllowed (kb, doc, directory, aclDoc, agent, origin, trustedOrigins
125
159
modeURIorReasons . add ( agentAndAppStatus )
126
160
} else {
127
161
let modes = kb . each ( auth , ACL ( 'mode' ) , null , aclDoc )
162
+ if ( originTrustedModes && originTrustedModes . length > 0 ) {
163
+ modes = modes . filter ( mode => nodesIncludeNode ( originTrustedModes , mode ) )
164
+ }
128
165
modes . forEach ( mode => {
129
166
log ( ' Mode allowed: ' + mode )
130
167
modeURIorReasons . add ( mode . uri )
@@ -134,9 +171,8 @@ function modesAllowed (kb, doc, directory, aclDoc, agent, origin, trustedOrigins
134
171
return modeURIorReasons
135
172
}
136
173
137
- function trustedOriginsIncludeOrigin ( trustedOrigins , origin ) {
138
- return trustedOrigins . filter (
139
- trustedOrigin => trustedOrigin . termType === origin . termType && trustedOrigin . value === origin . value ) . length > 0
174
+ function nodesIncludeNode ( nodes , node ) {
175
+ return nodes . some ( trustedOrigin => trustedOrigin . termType === node . termType && trustedOrigin . value === node . value )
140
176
}
141
177
142
178
function configureLogger ( logger ) {
@@ -147,9 +183,10 @@ function log (...msgs) {
147
183
return ( _logger || console . log ) . apply ( _logger , msgs )
148
184
}
149
185
186
+ module . exports . accessDenied = accessDenied
150
187
module . exports . checkAccess = checkAccess
151
188
module . exports . configureLogger = configureLogger
189
+ module . exports . getTrustedModesForOrigin = getTrustedModesForOrigin
152
190
module . exports . log = log
153
- module . exports . accessDenied = accessDenied
154
191
module . exports . modesAllowed = modesAllowed
155
192
module . exports . publisherTrustedApp = publisherTrustedApp
0 commit comments