From 5c3227068dcfec70a70287c3f43eb9f7003c7d7f Mon Sep 17 00:00:00 2001 From: Maarten Zuidhoorn Date: Wed, 29 Nov 2023 13:43:16 +0100 Subject: [PATCH] Update LavaMoat policies and snap shasums --- .../packages/bip32/snap.manifest.json | 2 +- .../packages/bip44/snap.manifest.json | 2 +- .../packages/cronjobs/snap.manifest.json | 2 +- .../packages/dialogs/snap.manifest.json | 2 +- .../packages/ethers-js/snap.manifest.json | 2 +- .../packages/get-entropy/snap.manifest.json | 2 +- .../packages/home-page/snap.manifest.json | 2 +- .../packages/core-signer/snap.manifest.json | 2 +- .../lifecycle-hooks/snap.manifest.json | 2 +- .../packages/manage-state/snap.manifest.json | 2 +- .../packages/notifications/snap.manifest.json | 2 +- .../transaction-insights/snap.manifest.json | 2 +- .../lavamoat/browserify/iframe/policy.json | 11 ++++++ .../browserify/node-process/policy.json | 11 ++++++ .../browserify/node-thread/policy.json | 11 ++++++ .../lavamoat/browserify/offscreen/policy.json | 11 ++++++ .../browserify/worker-executor/policy.json | 11 ++++++ .../browserify/worker-pool/policy.json | 11 ++++++ packages/snaps-sdk/src/images.test.ts | 29 ++++++++++++---- packages/snaps-sdk/src/images.ts | 34 ++++++++----------- 20 files changed, 115 insertions(+), 38 deletions(-) diff --git a/packages/examples/packages/bip32/snap.manifest.json b/packages/examples/packages/bip32/snap.manifest.json index b0fbc4ba03..2c68593e67 100644 --- a/packages/examples/packages/bip32/snap.manifest.json +++ b/packages/examples/packages/bip32/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "8uciDR11gmEm8QDs/sHYPeICmkpHOE4qVe+7zF0O7Ew=", + "shasum": "+aU0ZDyw/q4LLCDTrRWiVJAJBaRhZo4/nQY96bIwesw=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/bip44/snap.manifest.json b/packages/examples/packages/bip44/snap.manifest.json index 7861497df0..438a139c8f 100644 --- a/packages/examples/packages/bip44/snap.manifest.json +++ b/packages/examples/packages/bip44/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "7WXzhl1UIxj91n9Ptv/Rf+nbsYUg3XSOP14sSwEcI2k=", + "shasum": "PPXEiZMIbN808I+0bFiweqfGZ4v2QOE8HkMT1Kk6q2k=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/cronjobs/snap.manifest.json b/packages/examples/packages/cronjobs/snap.manifest.json index aa3baecf32..f0d8218b62 100644 --- a/packages/examples/packages/cronjobs/snap.manifest.json +++ b/packages/examples/packages/cronjobs/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "CxqAZ3b6NadkqDJJDZnKKhXS8ecdcV+qIf/dOmMHzbk=", + "shasum": "/fp1treUsx5dvYmsLPZidPiM1KAj86lY7akAKo3QdeM=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/dialogs/snap.manifest.json b/packages/examples/packages/dialogs/snap.manifest.json index 109e750c2a..199a3e8795 100644 --- a/packages/examples/packages/dialogs/snap.manifest.json +++ b/packages/examples/packages/dialogs/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "BSNPuKt7cC0lEJaE8M6Y0/7tepS8HiC/+WpjZaOYwYM=", + "shasum": "YUV1vUoHg5JRPW7ZAEVyluDIuJTU/Yl23VwkVqXxKu0=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/ethers-js/snap.manifest.json b/packages/examples/packages/ethers-js/snap.manifest.json index 12eb15fe68..ce2dfebde6 100644 --- a/packages/examples/packages/ethers-js/snap.manifest.json +++ b/packages/examples/packages/ethers-js/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "FL7kREmDDwiAIHskdA1lbCYQ4NHv8p4UHR/1Tm2mKKA=", + "shasum": "33NadYhy7vGLIdXWTzypXzP8wwbjrRhl2+CZcnnLjdE=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/get-entropy/snap.manifest.json b/packages/examples/packages/get-entropy/snap.manifest.json index 87775bfae3..1b3cbab020 100644 --- a/packages/examples/packages/get-entropy/snap.manifest.json +++ b/packages/examples/packages/get-entropy/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "FzwUtEms+bZSRoUP/48CxTVoSkoQCLG+86oWSUZfueA=", + "shasum": "6ieqFDjg0xEweuwpmz3/PKeO10dUNjrvIEimgUpNBEA=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/home-page/snap.manifest.json b/packages/examples/packages/home-page/snap.manifest.json index 6c95fcdec3..d9d0169cf5 100644 --- a/packages/examples/packages/home-page/snap.manifest.json +++ b/packages/examples/packages/home-page/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "utXHOukgm1RlUl/sYsI2aNAgeVgEKL+310wUjEAMT9E=", + "shasum": "5K7IS6utL+vB7Z8N/+ZSi3k3ZE3akJxUNnOxa+8DCY8=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/invoke-snap/packages/core-signer/snap.manifest.json b/packages/examples/packages/invoke-snap/packages/core-signer/snap.manifest.json index 4c1709e978..ca33022383 100644 --- a/packages/examples/packages/invoke-snap/packages/core-signer/snap.manifest.json +++ b/packages/examples/packages/invoke-snap/packages/core-signer/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "dbIz1yLy7sqedSP6sb8cD5DJgDloM08zJERPa/e8N78=", + "shasum": "KXvL3yM3J10tD67tHJbhBesGt9xDCgPDaobR0IKR9VM=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/lifecycle-hooks/snap.manifest.json b/packages/examples/packages/lifecycle-hooks/snap.manifest.json index b93549fbb1..bb8d861080 100644 --- a/packages/examples/packages/lifecycle-hooks/snap.manifest.json +++ b/packages/examples/packages/lifecycle-hooks/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "Ve8xul91MklBaGJpiaLvCB/qIHIXZEj251XP+pIOOUQ=", + "shasum": "K6iuC3+SdeS+VbvtO97KnMyBrYYt+1ye8RHsNDVFztY=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/manage-state/snap.manifest.json b/packages/examples/packages/manage-state/snap.manifest.json index 21c1d2bb14..59d6b5b35c 100644 --- a/packages/examples/packages/manage-state/snap.manifest.json +++ b/packages/examples/packages/manage-state/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "ClCqeb7sknLcct1+EMSjDpNqockG+NVmKnBmfXRXPpM=", + "shasum": "4BePPBbW32wn3vGDlyJpKPZqraRO/yy1jozDJ/qd53Q=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/notifications/snap.manifest.json b/packages/examples/packages/notifications/snap.manifest.json index 05c0cc6365..4784625b26 100644 --- a/packages/examples/packages/notifications/snap.manifest.json +++ b/packages/examples/packages/notifications/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "cHCctempM7XrAWGixs2nkxELAqDEezV1/2JzBcVO4t0=", + "shasum": "iUVUwEFYztKjMAU71q0F6FA7L6Znhal5KXKL5/hPIXc=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/examples/packages/transaction-insights/snap.manifest.json b/packages/examples/packages/transaction-insights/snap.manifest.json index ca41a5c970..50064ed7f5 100644 --- a/packages/examples/packages/transaction-insights/snap.manifest.json +++ b/packages/examples/packages/transaction-insights/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "AVioFJ3NkshQl4HQhihpu+w+uq5I5QFn8uXZjgfFp8I=", + "shasum": "7X53hzeLexyHD7Xwnn3RS8kqHHw4/KKOUYolc26eQPE=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json index 5d1b4709e5..e976bb9a32 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json @@ -236,9 +236,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json index 5d65ea14d8..68ece45de9 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json @@ -293,9 +293,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json index 5d65ea14d8..68ece45de9 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json @@ -293,9 +293,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/offscreen/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/offscreen/policy.json index b71bf038ce..3554e3d8fa 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/offscreen/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/offscreen/policy.json @@ -137,9 +137,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json index 5d1b4709e5..e976bb9a32 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json @@ -236,9 +236,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/worker-pool/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/worker-pool/policy.json index b71bf038ce..3554e3d8fa 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/worker-pool/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/worker-pool/policy.json @@ -137,9 +137,20 @@ "external:../snaps-sdk/src/internals/index.ts": true } }, + "external:../snaps-sdk/src/images.ts": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/utils": true, + "external:../snaps-sdk/src/ui/index.ts": true + } + }, "external:../snaps-sdk/src/index.ts": { "packages": { + "@metamask/utils": true, "external:../snaps-sdk/src/errors.ts": true, + "external:../snaps-sdk/src/images.ts": true, "external:../snaps-sdk/src/internals/index.ts": true, "external:../snaps-sdk/src/types/index.ts": true, "external:../snaps-sdk/src/ui/index.ts": true diff --git a/packages/snaps-sdk/src/images.test.ts b/packages/snaps-sdk/src/images.test.ts index 11dc8e62e6..cbaff8cf4e 100644 --- a/packages/snaps-sdk/src/images.test.ts +++ b/packages/snaps-sdk/src/images.test.ts @@ -57,9 +57,23 @@ describe('getImageData', () => { 'Failed to fetch image data from "https://example.com/image.gif": 404 Not Found', ); }); + + it('throws if the Snap does not have the "endowment:network-access" permission', async () => { + const originalFetch = globalThis.fetch; + + // @ts-expect-error - `fetch` is not optional. + globalThis.fetch = undefined; + + await expect(getImageData('https://example.com/image.png')).rejects.toThrow( + 'Failed to fetch image data from "https://example.com/image.png": Using this function requires the "endowment:network-access" permission.', + ); + + // eslint-disable-next-line require-atomic-updates + globalThis.fetch = originalFetch; + }); }); -describe('getImage', () => { +describe('getImageComponent', () => { beforeEach(() => { fetchMock.resetMocks(); }); @@ -71,16 +85,20 @@ describe('getImage', () => { }, }); - const result = await getImageComponent('https://example.com/image.png'); + const result = await getImageComponent('https://example.com/image.png', { + width: 100, + height: 100, + }); + expect(result).toMatchInlineSnapshot(` { "type": "image", - "value": "", + "value": "", } `); }); - it('returns the image data as an image component with width and height', async () => { + it('returns the image data as an image component with only a width', async () => { fetchMock.mockResponse('image data', { headers: { 'Content-Type': 'image/png', @@ -89,13 +107,12 @@ describe('getImage', () => { const result = await getImageComponent('https://example.com/image.png', { width: 100, - height: 100, }); expect(result).toMatchInlineSnapshot(` { "type": "image", - "value": "", + "value": "", } `); }); diff --git a/packages/snaps-sdk/src/images.ts b/packages/snaps-sdk/src/images.ts index 87df60f7ef..208b9f0527 100644 --- a/packages/snaps-sdk/src/images.ts +++ b/packages/snaps-sdk/src/images.ts @@ -11,6 +11,12 @@ import { image } from './ui'; * @returns A promise that resolves to the image data as a blob. */ async function getRawImageData(url: string, options?: RequestInit) { + if (typeof fetch !== 'function') { + throw new Error( + `Failed to fetch image data from "${url}": Using this function requires the "endowment:network-access" permission.`, + ); + } + return fetch(url, options).then(async (response) => { if (!response.ok) { throw new Error( @@ -60,15 +66,14 @@ export async function getImageData(url: string, options?: RequestInit) { /** * Options for getting an SVG image element from a URL. * - * @property width - The width of the image. If this is not provided, the image - * will be rendered at its original width. + * @property width - The width of the image. * @property height - The height of the image. If this is not provided, the - * image will be rendered at its original height. + * width will be used as the height. * @property request - The options to use when fetching the image data. This is * passed directly to `fetch`. */ export type ImageOptions = { - width?: number; + width: number; height?: number; request?: RequestInit; }; @@ -94,32 +99,21 @@ export type ImageOptions = { * }); * @param url - The URL to get the image data from. * @param options - The options to use when fetching and rendering the image. - * @param options.width - The width of the image. If this is not provided, the - * image will be rendered at its original width. + * @param options.width - The width of the image. * @param options.height - The height of the image. If this is not provided, the - * image will be rendered at its original height. + * width will be used as the height. * @param options.request - The options to use when fetching the image data. * This is passed directly to `fetch`. * @returns A promise that resolves to the image data as an image component. */ export async function getImageComponent( url: string, - { width, height, request }: ImageOptions = {}, + { width, height = width, request }: ImageOptions, ) { const imageData = await getImageData(url, request); - - let size = ''; - if (width) { - assert(width > 0, 'Expected width to be greater than 0.'); - size += `width="${width}" `; - } - - if (height) { - assert(height > 0, 'Expected height to be greater than 0.'); - size += `height="${height}"`; - } + const size = `width="${width}" height="${height}"`; return image( - ``, + ``, ); }