Skip to content

Commit e1d2107

Browse files
Add preinstalled and removable flags
1 parent df15b28 commit e1d2107

File tree

5 files changed

+59
-9
lines changed

5 files changed

+59
-9
lines changed
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 90.95,
3-
"functions": 96.4,
2+
"branches": 90.97,
3+
"functions": 96.41,
44
"lines": 97.73,
55
"statements": 97.41
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(
@@ -1587,6 +1598,11 @@ export class SnapController extends BaseController<
15871598
throw new Error('Expected array of snap ids.');
15881599
}
15891600

1601+
snapIds.forEach((snapId) => {
1602+
const snap = this.getExpect(snapId);
1603+
assert(snap.removable !== false, `${snapId} is not removable.`);
1604+
});
1605+
15901606
await Promise.all(
15911607
snapIds.map(async (snapId) => {
15921608
const snap = this.getExpect(snapId);
@@ -2372,7 +2388,14 @@ export class SnapController extends BaseController<
23722388
* @returns The resulting snap object.
23732389
*/
23742390
#set(args: SetSnapArgs): PersistedSnap {
2375-
const { id: snapId, origin, files, isUpdate = false } = args;
2391+
const {
2392+
id: snapId,
2393+
origin,
2394+
files,
2395+
isUpdate = false,
2396+
removable,
2397+
preinstalled,
2398+
} = args;
23762399

23772400
const {
23782401
manifest,
@@ -2423,6 +2446,9 @@ export class SnapController extends BaseController<
24232446
blocked: false,
24242447
enabled: true,
24252448

2449+
removable,
2450+
preinstalled,
2451+
24262452
id: snapId,
24272453
initialPermissions: manifest.result.initialPermissions,
24282454
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)