From 9aee838862583e6a03472fc900925016ac9676fb Mon Sep 17 00:00:00 2001 From: Idris Bowman <34751375+V00D00-child@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:43:59 -0400 Subject: [PATCH 1/2] Add new permissionsProvider_getGrantedPermissions rpc --- .../gator-permissions-snap/snap.manifest.json | 2 +- packages/gator-permissions-snap/src/index.ts | 2 ++ .../src/rpc/permissions.ts | 1 + .../src/rpc/rpcHandler.ts | 20 +++++++++++++++++++ .../src/rpc/rpcMethod.ts | 5 +++++ .../snap.manifest.json | 2 +- 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/gator-permissions-snap/snap.manifest.json b/packages/gator-permissions-snap/snap.manifest.json index 4b6b2604..2b0b01e4 100644 --- a/packages/gator-permissions-snap/snap.manifest.json +++ b/packages/gator-permissions-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-7715-permissions.git" }, "source": { - "shasum": "tmWf9Cs6ZEvAWQ3dATmdBU8nIH8BjJsUHuJfaRcnsZs=", + "shasum": "74FNhiL21idAo8szQIIeG4ZS65ktMfgt9AXy8Dp2qQQ=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/gator-permissions-snap/src/index.ts b/packages/gator-permissions-snap/src/index.ts index 45f0e0d4..151b3e34 100644 --- a/packages/gator-permissions-snap/src/index.ts +++ b/packages/gator-permissions-snap/src/index.ts @@ -198,6 +198,8 @@ const boundRpcHandlers: { rpcHandler.grantPermission.bind(rpcHandler), [RpcMethod.PermissionProviderGetPermissionOffers]: rpcHandler.getPermissionOffers.bind(rpcHandler), + [RpcMethod.PermissionProviderGetGrantedPermissions]: + rpcHandler.getGrantedPermissions.bind(rpcHandler), }; /** diff --git a/packages/gator-permissions-snap/src/rpc/permissions.ts b/packages/gator-permissions-snap/src/rpc/permissions.ts index 77ae8161..780149d1 100644 --- a/packages/gator-permissions-snap/src/rpc/permissions.ts +++ b/packages/gator-permissions-snap/src/rpc/permissions.ts @@ -7,6 +7,7 @@ const allowedPermissionsByOrigin: { [origin: string]: string[] } = { RpcMethod.PermissionProviderGrantPermissions, RpcMethod.PermissionProviderGetPermissionOffers, ], + metamask: [RpcMethod.PermissionProviderGetGrantedPermissions], }; /** diff --git a/packages/gator-permissions-snap/src/rpc/rpcHandler.ts b/packages/gator-permissions-snap/src/rpc/rpcHandler.ts index c5b7cf0b..b3ffbdf3 100644 --- a/packages/gator-permissions-snap/src/rpc/rpcHandler.ts +++ b/packages/gator-permissions-snap/src/rpc/rpcHandler.ts @@ -24,6 +24,13 @@ export type RpcHandler = { * @returns The permission offers. */ getPermissionOffers(): Promise; + + /** + * Handles get granted permissions requests. + * + * @returns The granted permissions. + */ + getGrantedPermissions(): Promise; }; /** @@ -87,8 +94,21 @@ export function createRpcHandler(config: { return DEFAULT_GATOR_PERMISSION_TO_OFFER; }; + /** + * Handles get granted permissions requests. + * + * @returns The granted permissions. + */ + const getGrantedPermissions = async (): Promise => { + logger.debug('getGrantedPermissions()'); + const grantedPermission = + await profileSyncManager.getAllGrantedPermissions(); + return grantedPermission as Json[]; + }; + return { grantPermission, getPermissionOffers, + getGrantedPermissions, }; } diff --git a/packages/gator-permissions-snap/src/rpc/rpcMethod.ts b/packages/gator-permissions-snap/src/rpc/rpcMethod.ts index debeadae..6fc8196e 100644 --- a/packages/gator-permissions-snap/src/rpc/rpcMethod.ts +++ b/packages/gator-permissions-snap/src/rpc/rpcMethod.ts @@ -11,4 +11,9 @@ export enum RpcMethod { * This method is used by the kernel to request a permissions provider to grant attenuated permissions to a site. */ PermissionProviderGrantPermissions = 'permissionsProvider_grantPermissions', + + /** + * This method is used by the metamask to request a permissions provider to get the granted permissions for a all sites. + */ + PermissionProviderGetGrantedPermissions = 'permissionsProvider_getGrantedPermissions', } diff --git a/packages/permissions-kernel-snap/snap.manifest.json b/packages/permissions-kernel-snap/snap.manifest.json index ff07151d..7ebfbfab 100644 --- a/packages/permissions-kernel-snap/snap.manifest.json +++ b/packages/permissions-kernel-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-7715-permissions.git" }, "source": { - "shasum": "ZpujQu+1AUOtJI6gowQELom4JbpkxNlz69zL4Ar2We4=", + "shasum": "9fjQZdZPpXAzVHjej5S6QTNGi7UobI0vEu5H0diUyRY=", "location": { "npm": { "filePath": "dist/bundle.js", From 320847c752c9d3e6923d16a15b8d09e8e08063fb Mon Sep 17 00:00:00 2001 From: Idris Bowman <34751375+V00D00-child@users.noreply.github.com> Date: Fri, 11 Jul 2025 14:53:51 -0400 Subject: [PATCH 2/2] Add test coverage --- .../gator-permissions-snap/snap.manifest.json | 2 +- .../src/rpc/rpcMethod.ts | 2 +- .../test/rpc/rpcHandler.test.ts | 89 ++++++++++++++++++- .../snap.manifest.json | 2 +- 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/packages/gator-permissions-snap/snap.manifest.json b/packages/gator-permissions-snap/snap.manifest.json index 2b0b01e4..c302303d 100644 --- a/packages/gator-permissions-snap/snap.manifest.json +++ b/packages/gator-permissions-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-7715-permissions.git" }, "source": { - "shasum": "74FNhiL21idAo8szQIIeG4ZS65ktMfgt9AXy8Dp2qQQ=", + "shasum": "WYBuQxRaavOImSepGi1zkRQuLG09WMiQu5bh+AAmDuU=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/gator-permissions-snap/src/rpc/rpcMethod.ts b/packages/gator-permissions-snap/src/rpc/rpcMethod.ts index 6fc8196e..57dbe358 100644 --- a/packages/gator-permissions-snap/src/rpc/rpcMethod.ts +++ b/packages/gator-permissions-snap/src/rpc/rpcMethod.ts @@ -13,7 +13,7 @@ export enum RpcMethod { PermissionProviderGrantPermissions = 'permissionsProvider_grantPermissions', /** - * This method is used by the metamask to request a permissions provider to get the granted permissions for a all sites. + * This method is used by Metamask clients to retrieve granted permissions for all sites. */ PermissionProviderGetGrantedPermissions = 'permissionsProvider_getGrantedPermissions', } diff --git a/packages/gator-permissions-snap/test/rpc/rpcHandler.test.ts b/packages/gator-permissions-snap/test/rpc/rpcHandler.test.ts index 0a7279ae..5279fc22 100644 --- a/packages/gator-permissions-snap/test/rpc/rpcHandler.test.ts +++ b/packages/gator-permissions-snap/test/rpc/rpcHandler.test.ts @@ -63,6 +63,7 @@ describe('RpcHandler', () => { let handler: RpcHandler; let mockHandler: jest.Mocked; let mockHandlerFactory: jest.Mocked; + let mockProfileSyncManager: jest.Mocked; beforeEach(() => { mockHandler = { @@ -72,7 +73,7 @@ describe('RpcHandler', () => { mockHandlerFactory = { createPermissionHandler: jest.fn().mockReturnValue(mockHandler), } as unknown as jest.Mocked; - const mockProfileSyncManager = { + mockProfileSyncManager = { revokeGrantedPermission: jest.fn(), storeGrantedPermission: jest.fn(), storeGrantedPermissionBatch: jest.fn(), @@ -375,4 +376,90 @@ describe('RpcHandler', () => { ]); }); }); + + describe('getGrantedPermissions', () => { + it('should return all granted permissions successfully', async () => { + const mockGrantedPermissions = [ + { + permissionResponse: { + chainId: TEST_CHAIN_ID, + expiry: TEST_EXPIRY, + signer: { + type: 'account' as const, + data: { address: TEST_ADDRESS }, + }, + permission: { + type: 'test-permission', + data: { justification: 'Testing permission request' }, + }, + context: TEST_CONTEXT, + accountMeta: [], + signerMeta: { + delegationManager: TEST_ADDRESS, + }, + }, + siteOrigin: TEST_SITE_ORIGIN, + }, + { + permissionResponse: { + chainId: '0x2' as const, + expiry: TEST_EXPIRY + 1000, + signer: { + type: 'account' as const, + data: { + address: '0x0987654321098765432109876543210987654321' as const, + }, + }, + permission: { + type: 'different-permission', + data: { justification: 'Another permission' }, + }, + context: '0xefgh' as const, + accountMeta: [], + signerMeta: { + delegationManager: + '0x0987654321098765432109876543210987654321' as const, + }, + }, + siteOrigin: 'https://another-example.com', + }, + ]; + + mockProfileSyncManager.getAllGrantedPermissions.mockResolvedValue( + mockGrantedPermissions, + ); + + const result = await handler.getGrantedPermissions(); + + expect( + mockProfileSyncManager.getAllGrantedPermissions, + ).toHaveBeenCalledTimes(1); + expect(result).toStrictEqual(mockGrantedPermissions); + }); + + it('should return empty array when no permissions are granted', async () => { + mockProfileSyncManager.getAllGrantedPermissions.mockResolvedValue([]); + + const result = await handler.getGrantedPermissions(); + + expect( + mockProfileSyncManager.getAllGrantedPermissions, + ).toHaveBeenCalledTimes(1); + expect(result).toStrictEqual([]); + }); + + it('should handle errors from profile sync manager', async () => { + const errorMessage = 'Failed to retrieve granted permissions'; + mockProfileSyncManager.getAllGrantedPermissions.mockRejectedValue( + new Error(errorMessage), + ); + + await expect(handler.getGrantedPermissions()).rejects.toThrow( + errorMessage, + ); + expect( + mockProfileSyncManager.getAllGrantedPermissions, + ).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/packages/permissions-kernel-snap/snap.manifest.json b/packages/permissions-kernel-snap/snap.manifest.json index 7ebfbfab..ff07151d 100644 --- a/packages/permissions-kernel-snap/snap.manifest.json +++ b/packages/permissions-kernel-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-7715-permissions.git" }, "source": { - "shasum": "9fjQZdZPpXAzVHjej5S6QTNGi7UobI0vEu5H0diUyRY=", + "shasum": "ZpujQu+1AUOtJI6gowQELom4JbpkxNlz69zL4Ar2We4=", "location": { "npm": { "filePath": "dist/bundle.js",