Răsfoiți Sursa

fix: add permission implicator for file modes

KernelDeimos 11 luni în urmă
părinte
comite
e63ab3a67f
1 a modificat fișierele cu 35 adăugiri și 1 ștergeri
  1. 35 1
      packages/backend/src/filesystem/FilesystemService.js

+ 35 - 1
packages/backend/src/filesystem/FilesystemService.js

@@ -137,7 +137,7 @@ class FilesystemService extends AdvancedBase {
             matcher: permission => {
                 return permission.startsWith('fs:');
             },
-            checker: async (actor, permission) => {
+            checker: async ({ actor, permission }) => {
                 if ( !(actor.type instanceof UserActorType) ) {
                     return undefined;
                 }
@@ -162,6 +162,40 @@ class FilesystemService extends AdvancedBase {
                     return {};
                 }
 
+                return undefined;
+            },
+        }));
+        svc_permission.register_implicator(PermissionImplicator.create({
+            matcher: permission => {
+                return permission.startsWith('fs:');
+            },
+            checker: async ({ actor, permission, recurse }) => {
+                const parts = PermissionUtil.split(permission);
+                if ( parts.length < 3 ) return undefined;
+
+                const specified_mode = parts[2];
+                
+                const mode = {
+                    write: 'read',
+                    read: 'list',
+                    list: 'see',
+                }[specified_mode];
+                
+                if ( ! mode ) return undefined;
+
+                const perm = await recurse(actor,
+                    PermissionUtil.join(
+                        parts[0],
+                        parts[1],
+                        mode,
+                        ...parts.slice(3),
+                    )
+                )
+                if ( perm ) {
+                    console.log('RETURNING IT!', perm);
+                    return perm;
+                }
+                
                 return undefined;
             },
         }));