@@ -24,7 +24,7 @@ const { Context } = require("../../util/context");
24
24
const { NodeInternalIDSelector, NodePathSelector } = require ( "../../filesystem/node/selectors" ) ;
25
25
const { TYPE_DIRECTORY } = require ( "../../filesystem/FSNodeContext" ) ;
26
26
const { LLRead } = require ( "../../filesystem/ll_operations/ll_read" ) ;
27
- const { Actor, UserActorType } = require ( "../../services/auth/Actor" ) ;
27
+ const { Actor, UserActorType, SiteActorType } = require ( "../../services/auth/Actor" ) ;
28
28
const APIError = require ( "../../api/APIError" ) ;
29
29
30
30
class PuterSiteMiddleware extends AdvancedBase {
@@ -145,14 +145,60 @@ class PuterSiteMiddleware extends AdvancedBase {
145
145
await target_node . get ( 'name' )
146
146
) ;
147
147
res . set ( 'Content-Type' , contentType ) ;
148
+
149
+ const acl_config = {
150
+ no_acl : true ,
151
+ actor : null ,
152
+ } ;
153
+
154
+ if ( site . protected ) {
155
+ const svc_auth = req . services . get ( 'auth' ) ;
156
+ const token = req . query [ 'puter.auth.token' ] ;
157
+
158
+ acl_config . no_acl = false ;
159
+
160
+ if ( ! token ) {
161
+ const e = APIError . create ( 'token_missing' ) ;
162
+ return this . respond_error_ ( { req, res, e } ) ;
163
+ }
164
+
165
+ const app_actor =
166
+ await svc_auth . authenticate_from_token ( token ) ;
167
+
168
+ const user_actor =
169
+ app_actor . get_related_actor ( UserActorType ) ;
170
+
171
+ const svc_permission = req . services . get ( 'permission' ) ;
172
+ const perm = await ( async ( ) => {
173
+ if ( user_actor . type . user . id === site . user_id ) {
174
+ return { } ;
175
+ }
176
+
177
+ return await svc_permission . check (
178
+ user_actor , `site:uid#${ site . uuid } :access`
179
+ ) ;
180
+ } ) ( ) ;
181
+
182
+ if ( ! perm ) {
183
+ const e = APIError . create ( 'forbidden' ) ;
184
+ return this . respond_error_ ( { req, res, e } ) ;
185
+ }
186
+
187
+ const site_actor = await Actor . create ( SiteActorType , { site } ) ;
188
+ acl_config . actor = site_actor ;
189
+
190
+ console . log ( 'THE SITE ACTOR?' , site_actor ) ;
191
+
192
+ Object . freeze ( acl_config ) ;
193
+ }
148
194
149
195
const ll_read = new LLRead ( ) ;
196
+ // const actor = Actor.adapt(req.user);
197
+ console . log ( 'what user?' , req . user ) ;
198
+ console . log ( 'what actor?' , acl_config . actor ) ;
150
199
const stream = await ll_read . run ( {
151
- no_acl : true ,
152
- actor : new Actor ( {
153
- user_uid : req . user ? req . user . uuid : null ,
154
- type : new UserActorType ( { user : req . user } ) ,
155
- } ) ,
200
+ no_acl : acl_config . no_acl ,
201
+ actor : acl_config . actor ,
156
202
fsNode : target_node ,
157
203
} ) ;
158
204
@@ -189,6 +235,19 @@ class PuterSiteMiddleware extends AdvancedBase {
189
235
190
236
return res . end ( ) ;
191
237
}
238
+
239
+ respond_error_ ( { req, res, e } ) {
240
+ if ( ! ( e instanceof APIError ) ) {
241
+ // TODO: alarm here
242
+ e = APIError . create ( 'unknown_error' ) ;
243
+ }
244
+
245
+ res . redirect ( `${ config . origin } ?${ e . querystringize ( {
246
+ ...( req . query [ 'puter.app_instance_id' ] ? {
247
+ [ 'error_from_within_iframe' ] : true ,
248
+ } : { } )
249
+ } ) } `) ;
250
+ }
192
251
}
193
252
194
253
module . exports = app => {
0 commit comments