@@ -153,41 +153,100 @@ class PuterSiteMiddleware extends AdvancedBase {
153
153
154
154
if ( site . protected ) {
155
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
156
165
- const app_actor =
166
- await svc_auth . authenticate_from_token ( token ) ;
157
+ const get_site_actor_from_token = async ( ) => {
158
+ const site_token = req . cookies [ 'puter.site.token' ] ;
159
+ if ( ! site_token ) return ;
160
+
161
+ let failed = false ;
162
+ let site_actor ;
163
+ try {
164
+ site_actor =
165
+ await svc_auth . authenticate_from_token ( site_token ) ;
166
+ } catch ( e ) {
167
+ failed = true ;
168
+ }
169
+
170
+ if ( failed ) return ;
171
+
172
+ if ( ! site_actor ) return ;
173
+
174
+ // security measure: if 'puter.site.token' is set
175
+ // to a different actor type, someone is likely
176
+ // trying to exploit the system.
177
+ if ( ! ( site_actor . type instanceof SiteActorType ) ) {
178
+ return ;
179
+ }
180
+
181
+ acl_config . actor = site_actor ;
182
+
183
+ // Refresh the token if it's been 30 seconds since
184
+ // the last request
185
+ if (
186
+ ( Date . now ( ) - site_actor . type . iat * 1000 )
187
+ >
188
+ 1000 * 30
189
+ ) {
190
+ const site_token = svc_auth . get_site_app_token ( {
191
+ site_uid : site . uuid ,
192
+ } ) ;
193
+ res . cookie ( 'puter.site.token' , site_token ) ;
194
+ }
167
195
168
- const user_actor =
169
- app_actor . get_related_actor ( UserActorType ) ;
196
+ return true ;
197
+ } ;
170
198
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 { } ;
199
+ const make_site_actor_from_app_token = async ( ) => {
200
+ const token = req . query [ 'puter.auth.token' ] ;
201
+
202
+ acl_config . no_acl = false ;
203
+
204
+ if ( ! token ) {
205
+ const e = APIError . create ( 'token_missing' ) ;
206
+ return this . respond_error_ ( { req, res, e } ) ;
175
207
}
208
+
209
+ const app_actor =
210
+ await svc_auth . authenticate_from_token ( token ) ;
176
211
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 } ) ;
212
+ const user_actor =
213
+ app_actor . get_related_actor ( UserActorType ) ;
214
+
215
+ const svc_permission = req . services . get ( 'permission' ) ;
216
+ const perm = await ( async ( ) => {
217
+ if ( user_actor . type . user . id === site . user_id ) {
218
+ return { } ;
219
+ }
220
+
221
+ return await svc_permission . check (
222
+ user_actor , `site:uid#${ site . uuid } :access`
223
+ ) ;
224
+ } ) ( ) ;
225
+
226
+ if ( ! perm ) {
227
+ const e = APIError . create ( 'forbidden' ) ;
228
+ this . respond_error_ ( { req, res, e } ) ;
229
+ return false ;
230
+ }
231
+
232
+ const site_actor = await Actor . create ( SiteActorType , { site } ) ;
233
+ acl_config . actor = site_actor ;
234
+
235
+ // This subdomain is allowed to keep the site actor token,
236
+ // so we send it here as a cookie so other html files can
237
+ // also load.
238
+ const site_token = svc_auth . get_site_app_token ( {
239
+ site_uid : site . uuid ,
240
+ } ) ;
241
+ res . cookie ( 'puter.site.token' , site_token ) ;
242
+ return true ;
185
243
}
186
244
187
- const site_actor = await Actor . create ( SiteActorType , { site } ) ;
188
- acl_config . actor = site_actor ;
189
-
190
- console . log ( 'THE SITE ACTOR?' , site_actor ) ;
245
+ let ok = await get_site_actor_from_token ( ) ;
246
+ if ( ! ok ) {
247
+ ok = await make_site_actor_from_app_token ( ) ;
248
+ }
249
+ if ( ! ok ) return ;
191
250
192
251
Object . freeze ( acl_config ) ;
193
252
}
0 commit comments