Skip to content

Commit b7dc178

Browse files
Add preinstalled and removable flags
1 parent b4264d5 commit b7dc178

File tree

5 files changed

+60
-10
lines changed

5 files changed

+60
-10
lines changed
+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 89.83,
3-
"functions": 96.4,
2+
"branches": 89.86,
3+
"functions": 96.41,
44
"lines": 97.36,
5-
"statements": 97.04
5+
"statements": 97.05
66
}

packages/snaps-controllers/src/snaps/SnapController.test.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -3370,7 +3370,9 @@ describe('SnapController', () => {
33703370
preinstalledSnaps,
33713371
rootMessenger,
33723372
state: {
3373-
snaps: getPersistedSnapsState(),
3373+
snaps: getPersistedSnapsState(
3374+
getPersistedSnapObject({ preinstalled: true }),
3375+
),
33743376
},
33753377
});
33763378
const [snapController] = getSnapControllerWithEES(snapControllerOptions);

packages/snaps-controllers/src/snaps/SnapController.ts

+32-6
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ export interface PreinstalledSnap {
153153
snapId: SnapId;
154154
manifest: SnapManifest;
155155
files: PreinstalledSnapFile[];
156-
// removable: boolean;
156+
removable?: boolean;
157157
}
158158

159159
/**
@@ -640,6 +640,8 @@ type AddSnapArgs = {
640640
type SetSnapArgs = Omit<AddSnapArgs, 'location' | 'versionRange'> & {
641641
files: FetchedSnapFiles;
642642
isUpdate?: boolean;
643+
removable?: boolean;
644+
preinstalled?: boolean;
643645
};
644646

645647
const defaultState: SnapControllerState = {
@@ -1011,14 +1013,17 @@ export class SnapController extends BaseController<
10111013
}
10121014

10131015
#handlePreinstalledSnaps(preinstalledSnaps: PreinstalledSnap[]) {
1014-
for (const { snapId, manifest, files } of preinstalledSnaps) {
1016+
for (const { snapId, manifest, files, removable } of preinstalledSnaps) {
10151017
const existingSnap = this.get(snapId);
10161018
const isAlreadyInstalled = existingSnap !== undefined;
10171019
const isUpdate =
10181020
isAlreadyInstalled && gtVersion(manifest.version, existingSnap.version);
10191021

1020-
// Disallow downgrades
1021-
if (isAlreadyInstalled && !isUpdate) {
1022+
// Disallow downgrades and overwriting non preinstalled snaps
1023+
if (
1024+
isAlreadyInstalled &&
1025+
(!isUpdate || existingSnap.preinstalled !== true)
1026+
) {
10221027
continue;
10231028
}
10241029

@@ -1058,7 +1063,13 @@ export class SnapController extends BaseController<
10581063
};
10591064

10601065
// Add snap to the SnapController state
1061-
this.#set({ id: snapId, origin: 'MetaMask', files: filesObject });
1066+
this.#set({
1067+
id: snapId,
1068+
origin: 'MetaMask',
1069+
files: filesObject,
1070+
removable,
1071+
preinstalled: true,
1072+
});
10621073

10631074
// Setup permissions
10641075
const processedPermissions = processSnapPermissions(
@@ -1585,6 +1596,11 @@ export class SnapController extends BaseController<
15851596
throw new Error('Expected array of snap ids.');
15861597
}
15871598

1599+
snapIds.forEach((snapId) => {
1600+
const snap = this.getExpect(snapId);
1601+
assert(snap.removable !== false, `${snapId} is not removable.`);
1602+
});
1603+
15881604
await Promise.all(
15891605
snapIds.map(async (snapId) => {
15901606
const snap = this.getExpect(snapId);
@@ -2370,7 +2386,14 @@ export class SnapController extends BaseController<
23702386
* @returns The resulting snap object.
23712387
*/
23722388
#set(args: SetSnapArgs): PersistedSnap {
2373-
const { id: snapId, origin, files, isUpdate = false } = args;
2389+
const {
2390+
id: snapId,
2391+
origin,
2392+
files,
2393+
isUpdate = false,
2394+
removable,
2395+
preinstalled,
2396+
} = args;
23742397

23752398
const {
23762399
manifest,
@@ -2421,6 +2444,9 @@ export class SnapController extends BaseController<
24212444
blocked: false,
24222445
enabled: true,
24232446

2447+
removable,
2448+
preinstalled,
2449+
24242450
id: snapId,
24252451
initialPermissions: manifest.result.initialPermissions,
24262452
manifest: manifest.result,

packages/snaps-utils/src/snaps.ts

+14
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,20 @@ export type Snap = TruncatedSnap & {
126126
* Localization files which are used to translate the manifest.
127127
*/
128128
localizationFiles?: LocalizationFile[];
129+
130+
/**
131+
* Flag to signal whether this snap was preinstalled or not.
132+
*
133+
* A lack of specifying this option will be deemed as not preinstalled.
134+
*/
135+
preinstalled?: boolean;
136+
137+
/**
138+
* Flag to signal whether this snap is removable or not.
139+
*
140+
* A lack of specifying this option will be deemed as removable.
141+
*/
142+
removable?: boolean;
129143
};
130144

131145
export type TruncatedSnapFields =

packages/snaps-utils/src/test-utils/snap.ts

+8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export const getPersistedSnapObject = ({
3232
],
3333
auxiliaryFiles = [],
3434
localizationFiles = [],
35+
removable = undefined,
36+
preinstalled = undefined,
3537
}: GetPersistedSnapObjectOptions = {}): PersistedSnap => {
3638
return {
3739
blocked,
@@ -45,6 +47,8 @@ export const getPersistedSnapObject = ({
4547
versionHistory,
4648
auxiliaryFiles,
4749
localizationFiles,
50+
removable,
51+
preinstalled,
4852
} as const;
4953
};
5054

@@ -62,6 +66,8 @@ export const getSnapObject = ({
6266
],
6367
auxiliaryFiles = [],
6468
localizationFiles = [],
69+
removable = undefined,
70+
preinstalled = undefined,
6571
}: GetSnapObjectOptions = {}): Snap => {
6672
return {
6773
blocked,
@@ -75,6 +81,8 @@ export const getSnapObject = ({
7581
versionHistory,
7682
auxiliaryFiles,
7783
localizationFiles,
84+
removable,
85+
preinstalled,
7886
} as const;
7987
};
8088

0 commit comments

Comments
 (0)