@@ -153,7 +153,7 @@ export interface PreinstalledSnap {
153
153
snapId : SnapId ;
154
154
manifest : SnapManifest ;
155
155
files : PreinstalledSnapFile [ ] ;
156
- // removable: boolean;
156
+ removable ? : boolean ;
157
157
}
158
158
159
159
/**
@@ -640,6 +640,8 @@ type AddSnapArgs = {
640
640
type SetSnapArgs = Omit < AddSnapArgs , 'location' | 'versionRange' > & {
641
641
files : FetchedSnapFiles ;
642
642
isUpdate ?: boolean ;
643
+ removable ?: boolean ;
644
+ preinstalled ?: boolean ;
643
645
} ;
644
646
645
647
const defaultState : SnapControllerState = {
@@ -1011,14 +1013,17 @@ export class SnapController extends BaseController<
1011
1013
}
1012
1014
1013
1015
#handlePreinstalledSnaps( preinstalledSnaps : PreinstalledSnap [ ] ) {
1014
- for ( const { snapId, manifest, files } of preinstalledSnaps ) {
1016
+ for ( const { snapId, manifest, files, removable } of preinstalledSnaps ) {
1015
1017
const existingSnap = this . get ( snapId ) ;
1016
1018
const isAlreadyInstalled = existingSnap !== undefined ;
1017
1019
const isUpdate =
1018
1020
isAlreadyInstalled && gtVersion ( manifest . version , existingSnap . version ) ;
1019
1021
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
+ ) {
1022
1027
continue ;
1023
1028
}
1024
1029
@@ -1058,7 +1063,13 @@ export class SnapController extends BaseController<
1058
1063
} ;
1059
1064
1060
1065
// 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
+ } ) ;
1062
1073
1063
1074
// Setup permissions
1064
1075
const processedPermissions = processSnapPermissions (
@@ -1585,6 +1596,11 @@ export class SnapController extends BaseController<
1585
1596
throw new Error ( 'Expected array of snap ids.' ) ;
1586
1597
}
1587
1598
1599
+ snapIds . forEach ( ( snapId ) => {
1600
+ const snap = this . getExpect ( snapId ) ;
1601
+ assert ( snap . removable !== false , `${ snapId } is not removable.` ) ;
1602
+ } ) ;
1603
+
1588
1604
await Promise . all (
1589
1605
snapIds . map ( async ( snapId ) => {
1590
1606
const snap = this . getExpect ( snapId ) ;
@@ -2370,7 +2386,14 @@ export class SnapController extends BaseController<
2370
2386
* @returns The resulting snap object.
2371
2387
*/
2372
2388
#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 ;
2374
2397
2375
2398
const {
2376
2399
manifest,
@@ -2421,6 +2444,9 @@ export class SnapController extends BaseController<
2421
2444
blocked : false ,
2422
2445
enabled : true ,
2423
2446
2447
+ removable,
2448
+ preinstalled,
2449
+
2424
2450
id : snapId ,
2425
2451
initialPermissions : manifest . result . initialPermissions ,
2426
2452
manifest : manifest . result ,
0 commit comments