@metamask/snaps-rpc-methods
Version:
MetaMask Snaps JSON-RPC method implementations
1 lines • 4.53 kB
Source Map (JSON)
{"version":3,"file":"permissions.mjs","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,wBAAwB;AAE9C,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC5B,+BAAqB;AACtB,OAAO,EACL,aAAa,EACb,kCAAkC,EACnC,+BAAqB;AACtB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACpC,kBAAmC;IAEnC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAE,EAAE;QACpE,IAAI,WAAW,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,WAAW,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAClE,OAAO;gBACL,iBAAiB;gBACjB,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC;aACjD,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,OAAO;YACL,iBAAiB;YACjB,KAA8C;SAC/C,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,kBAA4B,EAC5B,EAAE,CACF,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAE/C,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,oBAAoB,EAAE,EAAE,EAAE;IAC5D,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,iBAAiB,CAAC,UAAU,CAAC,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;AAET,MAAM,CAAC,MAAM,uCAAuC,GAAG,CACrD,mBAA6B,EAC7B,KAA8B,EAC9B,EAAE,CACF,MAAM,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAEtD,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,EAAE,EAAE;IACtE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,cAAc,CAAC,UAAU,CAAC,GAAG,oBAAoB,CAAC;YAChD,iDAAiD;YACjD,WAAW,EAAE,WAAW,CACtB,KAAK,EACL,WAAW,CACoC;SAClD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,EAAE,EAAE,CAAC,CAAC","sourcesContent":["import type {\n PermissionConstraint,\n PermissionSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport type { SnapPermissions } from '@metamask/snaps-utils';\nimport { hasProperty } from '@metamask/utils';\n\nimport {\n endowmentCaveatMappers,\n endowmentPermissionBuilders,\n} from './endowments';\nimport {\n caveatMappers,\n restrictedMethodPermissionBuilders,\n} from './restricted';\nimport { selectHooks } from './utils';\n\n/**\n * Map initial permissions as defined in a Snap manifest to something that can\n * be processed by the PermissionsController. Each caveat mapping function\n * should return a valid permission caveat value.\n *\n * This function does not validate the caveat values, since that is done by\n * the PermissionsController itself, upon requesting the permissions.\n *\n * @param initialPermissions - The initial permissions to process.\n * @returns The processed permissions.\n */\nexport function processSnapPermissions(\n initialPermissions: SnapPermissions,\n): Record<string, Pick<PermissionConstraint, 'caveats'>> {\n return Object.fromEntries(\n Object.entries(initialPermissions).map(([initialPermission, value]) => {\n if (hasProperty(caveatMappers, initialPermission)) {\n return [initialPermission, caveatMappers[initialPermission](value)];\n } else if (hasProperty(endowmentCaveatMappers, initialPermission)) {\n return [\n initialPermission,\n endowmentCaveatMappers[initialPermission](value),\n ];\n }\n\n // If we have no mapping, this may be a non-snap permission, return as-is\n return [\n initialPermission,\n value as Pick<PermissionConstraint, 'caveats'>,\n ];\n }),\n );\n}\n\nexport const buildSnapEndowmentSpecifications = (\n excludedEndowments: string[],\n) =>\n Object.values(endowmentPermissionBuilders).reduce<\n Record<string, PermissionSpecificationConstraint>\n >((allSpecifications, { targetName, specificationBuilder }) => {\n if (!excludedEndowments.includes(targetName)) {\n allSpecifications[targetName] = specificationBuilder({});\n }\n return allSpecifications;\n }, {});\n\nexport const buildSnapRestrictedMethodSpecifications = (\n excludedPermissions: string[],\n hooks: Record<string, unknown>,\n) =>\n Object.values(restrictedMethodPermissionBuilders).reduce<\n Record<string, PermissionSpecificationConstraint>\n >((specifications, { targetName, specificationBuilder, methodHooks }) => {\n if (!excludedPermissions.includes(targetName)) {\n specifications[targetName] = specificationBuilder({\n // @ts-expect-error The selectHooks type is wonky\n methodHooks: selectHooks<typeof hooks, keyof typeof methodHooks>(\n hooks,\n methodHooks,\n ) as Pick<typeof hooks, keyof typeof methodHooks>,\n });\n }\n return specifications;\n }, {});\n"]}