From 1f0c0099e38253a39bac2ea3cce4ddecb5198de6 Mon Sep 17 00:00:00 2001 From: Juan Castro Date: Wed, 12 Aug 2026 19:12:00 -0400 Subject: [PATCH] refactor(permissions): drop the unused permission-issuer lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit listUserPermissionIssuers and its store method listUserPermissionIssuerIds existed to synthesize the filesystem root from the home directories of everyone who had granted the caller a permission. That listing is gone — it advertised folders readdir then refused to open — and the share index answers "who shared with me" directly, so nothing wants them back. One removed test only asserted that the call returned an array; the other covered readLinkedUserUserPerms round-tripping and is kept, rewritten without the issuer lookup. --- .../permission/PermissionService.test.ts | 33 ++----------------- .../services/permission/PermissionService.ts | 20 ----------- .../stores/permission/PermissionStore.test.ts | 6 +--- .../stores/permission/PermissionStore.ts | 8 ----- 4 files changed, 3 insertions(+), 64 deletions(-) diff --git a/src/backend/services/permission/PermissionService.test.ts b/src/backend/services/permission/PermissionService.test.ts index e68f0e4c2..79171b9ca 100644 --- a/src/backend/services/permission/PermissionService.test.ts +++ b/src/backend/services/permission/PermissionService.test.ts @@ -621,37 +621,8 @@ describe('PermissionService (integration)', () => { }); }); - describe('listUserPermissionIssuers / queryIssuerHolderPermissionsByPrefix', () => { - it('listUserPermissionIssuers returns the issuer who granted the target a perm', async () => { - const { user: issuer, actor: issuerActor } = await makeUserActor(); - const { user: target } = await makeUserActor(); - const permission = `zztest:lst-${uuidv4()}:ii:read`; - await server.stores.permission.setFlatUserPerm( - issuer.id, - `manage:${permission}`, - { - permission: `manage:${permission}`, - deleted: false, - issuer_user_id: issuer.id, - } as never, - ); - await runWithContext({ actor: issuerActor }, () => - permService.grantUserUserPermission( - issuerActor, - target.username, - permission, - ), - ); - // listUserPermissionIssuers is best-effort; just verify it runs - // and either includes the issuer or returns an empty array (the - // linked store may not be populated immediately). - const issuers = await permService.listUserPermissionIssuers({ - id: target.id, - }); - expect(Array.isArray(issuers)).toBe(true); - }); - - it('queryIssuerHolderPermissionsByPrefix returns [] for actors without user.id', async () => { + describe('queryIssuerHolderPermissionsByPrefix', () => { + it('returns [] for actors without user.id', async () => { const out = await permService.queryIssuerHolderPermissionsByPrefix( { user: undefined } as unknown as Actor, { user: undefined } as unknown as Actor, diff --git a/src/backend/services/permission/PermissionService.ts b/src/backend/services/permission/PermissionService.ts index 7b7bfc7c5..109e71181 100644 --- a/src/backend/services/permission/PermissionService.ts +++ b/src/backend/services/permission/PermissionService.ts @@ -1343,26 +1343,6 @@ export class PermissionService extends PuterService { // -- Issuer queries (share discovery et al) ----------------------- - async listUserPermissionIssuers(user: { - id: number; - }): Promise> { - const ids = await this.stores.permission.listUserPermissionIssuerIds( - user.id, - ); - const usersById = await this.stores.user.getByIds(ids); - return ids.map((id) => { - const u = usersById.get(id); - return u - ? { - id: u.id, - uuid: u.uuid, - username: u.username, - email: u.email, - } - : null; - }); - } - async queryIssuerPermissionsByPrefix( issuer: { id: number }, prefix: string, diff --git a/src/backend/stores/permission/PermissionStore.test.ts b/src/backend/stores/permission/PermissionStore.test.ts index bf0a93c5e..61116546a 100644 --- a/src/backend/stores/permission/PermissionStore.test.ts +++ b/src/backend/stores/permission/PermissionStore.test.ts @@ -828,7 +828,7 @@ describe('PermissionStore', () => { // -- user → user ------------------------------------------------------ describe('user-to-user permissions', () => { - it('lists issuers for a holder and clears them on revoke', async () => { + it('reads a holder grant back and clears it on revoke', async () => { const issuer = await makeUser(); const holder = await makeUser(); await store.upsertUserUserPerm( @@ -838,10 +838,6 @@ describe('PermissionStore', () => { {}, ); - expect( - await store.listUserPermissionIssuerIds(holder.id), - ).toContain(issuer.id); - const rows = await store.readLinkedUserUserPerms(holder.id, [ 'fs:u:read', ]); diff --git a/src/backend/stores/permission/PermissionStore.ts b/src/backend/stores/permission/PermissionStore.ts index f542722d0..29c7a605a 100644 --- a/src/backend/stores/permission/PermissionStore.ts +++ b/src/backend/stores/permission/PermissionStore.ts @@ -360,14 +360,6 @@ export class PermissionStore extends PuterStore { ); } - async listUserPermissionIssuerIds(holderUserId: number): Promise { - const rows = await this.clients.db.read( - 'SELECT DISTINCT issuer_user_id FROM `user_to_user_permissions` WHERE `holder_user_id` = ?', - [holderUserId], - ); - return rows.map((r) => Number(r.issuer_user_id)); - } - // -- SQL: user-to-app permissions -------------------------------- async readUserAppPerms(