|
@@ -0,0 +1,49 @@
|
|
|
|
+## 2024-10-14
|
|
|
|
+
|
|
|
|
+### Letting Puter Desktop Control Client FS Cache
|
|
|
|
+
|
|
|
|
+#### Move Context to `putility`
|
|
|
|
+
|
|
|
|
+The Filesystem module for puter.js will need to check `puter.env` to determine
|
|
|
|
+whether it's delegating client FS calls to Puter's API or Puter's Desktop via
|
|
|
|
+postMessage. `env` was already being passed to the Filesystem module via its
|
|
|
|
+constructor but the constructor had no reference to it; having only looked at
|
|
|
|
+the constructor itself and not where its initialized, I didn't realize this
|
|
|
|
+and started working on another way to pass it.
|
|
|
|
+
|
|
|
|
+I decided to add Context which will allow us to incrementally migrate all the
|
|
|
|
+modules to a situation where the things available to modules generally is one
|
|
|
|
+piece of information in the code, and doesn't need to be repeated for each
|
|
|
|
+constructor call manually.
|
|
|
|
+
|
|
|
|
+### What happens when apps make FS calls to Puter's desktop?
|
|
|
|
+
|
|
|
|
+I'm going to describe a problem that I overlooked before I started working on
|
|
|
|
+this. If `env` is `"app"`, then we delegate filesystem calls to Puter's desktop
|
|
|
|
+so that caching is centralized and all apps can benefit from the cache. Okay,
|
|
|
|
+that's great, but... **Puter Desktop has user privileges, not app privileges.**
|
|
|
|
+
|
|
|
|
+With this, I see a couple of options:
|
|
|
|
+- Puter desktop makes the call to check ACL
|
|
|
|
+ - we don't expose this yet
|
|
|
|
+ we need to ensure it doesn't expose the existence of files for which the
|
|
|
|
+ actor does not have "see" permission.
|
|
|
|
+- Apps maintain their own cache
|
|
|
|
+
|
|
|
|
+In either case, apps need to be able to subscribe to filesystem events for
|
|
|
|
+cache invalidation. This means the file/location relevant to the event needs
|
|
|
|
+an ACL check either way. It seems there is no choice but to allow Puter Desktop
|
|
|
|
+to expose ACL.
|
|
|
|
+
|
|
|
|
+I thought about adding this to `/stat` - i.e. Desktop can pass an app ID and
|
|
|
|
+get information about what kind of access the app has - but that would incur
|
|
|
|
+additional database calls for no reason, especially if Desktop really does
|
|
|
|
+have that entry cached already.
|
|
|
|
+
|
|
|
|
+This will require a new endpoint then: `/auth/check-app-acl`. I'll put it in
|
|
|
|
+PermissionAPIService for now. It seems a little out of place there but it
|
|
|
|
+also doesn't seem to make sense to create a new service for it.
|
|
|
|
+This method may eventually be deprecated if we find out apps need to be
|
|
|
|
+able to perform ACL checks on behalf of delegate apps, in which case we might
|
|
|
|
+create a more general-purpose `/auth/check-acl` endpoint that can cover
|
|
|
|
+both cases.
|