Skip to content

Commit b2c31c1

Browse files
Check compatibility in :get
1 parent 8abe43e commit b2c31c1

File tree

2 files changed

+84
-34
lines changed

2 files changed

+84
-34
lines changed

packages/snaps-controllers/src/snaps/registry/json.test.ts

Lines changed: 79 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,43 @@ const MOCK_EMPTY_SIGNATURE_FILE = {
8888
format: 'DER',
8989
};
9090

91+
const MOCK_DATABASE_COMPATIBILITY = {
92+
verifiedSnaps: {
93+
[MOCK_SNAP_ID]: {
94+
id: MOCK_SNAP_ID,
95+
metadata: {
96+
name: 'Mock Snap',
97+
},
98+
versions: {
99+
['1.0.0' as SemVerVersion]: {
100+
checksum: DEFAULT_SNAP_SHASUM,
101+
clientVersions: {
102+
extension: '>=13.9.0',
103+
},
104+
},
105+
['1.1.0' as SemVerVersion]: {
106+
checksum: DEFAULT_SNAP_SHASUM,
107+
clientVersions: {
108+
extension: '>=15.0.0',
109+
},
110+
},
111+
},
112+
},
113+
},
114+
blockedSnaps: [],
115+
};
116+
117+
/**
118+
* To regenerate the signature, repeat the instructions above but with MOCK_DATABASE_COMPATIBILITY
119+
*/
120+
const MOCK_COMPATIBILITY_SIGNATURE =
121+
'0x3045022100c0dd17483ac052b25a24c43a84de7b7b38194ac770cadb53a83ca950150631bd02204ed1f6b3359901199e2752d148079084cda13439150136055be5d4a3df205115';
122+
const MOCK_COMPATIBILITY_SIGNATURE_FILE = {
123+
signature: MOCK_COMPATIBILITY_SIGNATURE,
124+
curve: 'secp256k1',
125+
format: 'DER',
126+
};
127+
91128
describe('JsonSnapsRegistry', () => {
92129
fetchMock.enableMocks();
93130

@@ -244,6 +281,46 @@ describe('JsonSnapsRegistry', () => {
244281
});
245282
});
246283

284+
it('returns verified for compatible Snaps', async () => {
285+
fetchMock
286+
.mockResponseOnce(JSON.stringify(MOCK_DATABASE_COMPATIBILITY))
287+
.mockResponseOnce(JSON.stringify(MOCK_COMPATIBILITY_SIGNATURE_FILE));
288+
289+
const { messenger } = getRegistry();
290+
const result = await messenger.call('SnapsRegistry:get', {
291+
[MOCK_SNAP_ID]: {
292+
version: '1.0.0' as SemVerVersion,
293+
checksum: DEFAULT_SNAP_SHASUM,
294+
},
295+
});
296+
297+
expect(result).toStrictEqual({
298+
[MOCK_SNAP_ID]: {
299+
status: SnapsRegistryStatus.Verified,
300+
},
301+
});
302+
});
303+
304+
it('returns unverified for non compatible Snaps', async () => {
305+
fetchMock
306+
.mockResponseOnce(JSON.stringify(MOCK_DATABASE_COMPATIBILITY))
307+
.mockResponseOnce(JSON.stringify(MOCK_COMPATIBILITY_SIGNATURE_FILE));
308+
309+
const { messenger } = getRegistry();
310+
const result = await messenger.call('SnapsRegistry:get', {
311+
[MOCK_SNAP_ID]: {
312+
version: '1.1.0' as SemVerVersion,
313+
checksum: DEFAULT_SNAP_SHASUM,
314+
},
315+
});
316+
317+
expect(result).toStrictEqual({
318+
[MOCK_SNAP_ID]: {
319+
status: SnapsRegistryStatus.Unverified,
320+
},
321+
});
322+
});
323+
247324
it('uses existing state if registry is unavailable', async () => {
248325
fetchMock.mockResponse('', { status: 404 });
249326

@@ -378,39 +455,8 @@ describe('JsonSnapsRegistry', () => {
378455

379456
it('resolves to a compatible allowlisted version', async () => {
380457
fetchMock
381-
.mockResponseOnce(
382-
JSON.stringify({
383-
verifiedSnaps: {
384-
[MOCK_SNAP_ID]: {
385-
id: MOCK_SNAP_ID,
386-
metadata: {
387-
name: 'Mock Snap',
388-
},
389-
versions: {
390-
['1.0.0' as SemVerVersion]: {
391-
checksum: DEFAULT_SNAP_SHASUM,
392-
clientVersions: {
393-
extension: '>=13.9.0',
394-
},
395-
},
396-
['1.1.0' as SemVerVersion]: {
397-
checksum: DEFAULT_SNAP_SHASUM,
398-
clientVersions: {
399-
extension: '>=15.0.0',
400-
},
401-
},
402-
},
403-
},
404-
},
405-
}),
406-
)
407-
.mockResponseOnce(
408-
JSON.stringify({
409-
...MOCK_SIGNATURE_FILE,
410-
signature:
411-
'0x30440220337683880fa580d8eed89c37f9b6d5639a015d416d58afc50ff0602820ab8af3022008b6a5b37a028d8d632fb311ddd0e92fc2d98cff013da4e47b99a754638a8876',
412-
}),
413-
);
458+
.mockResponseOnce(JSON.stringify(MOCK_DATABASE_COMPATIBILITY))
459+
.mockResponseOnce(JSON.stringify(MOCK_COMPATIBILITY_SIGNATURE_FILE));
414460

415461
const { messenger } = getRegistry();
416462
const result = await messenger.call(

packages/snaps-controllers/src/snaps/registry/json.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,11 @@ export class JsonSnapsRegistry extends BaseController<
294294

295295
const verified = database?.verifiedSnaps[snapId];
296296
const version = verified?.versions?.[snapInfo.version];
297-
if (version && version.checksum === snapInfo.checksum) {
297+
const clientRange = version?.clientVersions?.[this.#clientConfig.type];
298+
const isCompatible =
299+
!clientRange ||
300+
satisfiesVersionRange(this.#clientConfig.version, clientRange);
301+
if (version && version.checksum === snapInfo.checksum && isCompatible) {
298302
return { status: SnapsRegistryStatus.Verified };
299303
}
300304
// For now, if we have an allowlist miss, we can refetch once and try again.

0 commit comments

Comments
 (0)