@metamask/snaps-controllers 14.2.2 → 15.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -1
- package/dist/cronjob/CronjobController.cjs +6 -1
- package/dist/cronjob/CronjobController.cjs.map +1 -1
- package/dist/cronjob/CronjobController.d.cts.map +1 -1
- package/dist/cronjob/CronjobController.d.mts.map +1 -1
- package/dist/cronjob/CronjobController.mjs +6 -1
- package/dist/cronjob/CronjobController.mjs.map +1 -1
- package/dist/insights/SnapInsightsController.cjs +6 -1
- package/dist/insights/SnapInsightsController.cjs.map +1 -1
- package/dist/insights/SnapInsightsController.d.cts.map +1 -1
- package/dist/insights/SnapInsightsController.d.mts.map +1 -1
- package/dist/insights/SnapInsightsController.mjs +6 -1
- package/dist/insights/SnapInsightsController.mjs.map +1 -1
- package/dist/interface/SnapInterfaceController.cjs +7 -5
- package/dist/interface/SnapInterfaceController.cjs.map +1 -1
- package/dist/interface/SnapInterfaceController.d.cts +2 -2
- package/dist/interface/SnapInterfaceController.d.cts.map +1 -1
- package/dist/interface/SnapInterfaceController.d.mts +2 -2
- package/dist/interface/SnapInterfaceController.d.mts.map +1 -1
- package/dist/interface/SnapInterfaceController.mjs +7 -5
- package/dist/interface/SnapInterfaceController.mjs.map +1 -1
- package/dist/services/AbstractExecutionService.cjs +22 -8
- package/dist/services/AbstractExecutionService.cjs.map +1 -1
- package/dist/services/AbstractExecutionService.d.cts.map +1 -1
- package/dist/services/AbstractExecutionService.d.mts.map +1 -1
- package/dist/services/AbstractExecutionService.mjs +24 -10
- package/dist/services/AbstractExecutionService.mjs.map +1 -1
- package/dist/snaps/SnapController.cjs +133 -75
- package/dist/snaps/SnapController.cjs.map +1 -1
- package/dist/snaps/SnapController.d.cts +13 -50
- package/dist/snaps/SnapController.d.cts.map +1 -1
- package/dist/snaps/SnapController.d.mts +13 -50
- package/dist/snaps/SnapController.d.mts.map +1 -1
- package/dist/snaps/SnapController.mjs +135 -77
- package/dist/snaps/SnapController.mjs.map +1 -1
- package/dist/snaps/Timer.cjs +5 -5
- package/dist/snaps/Timer.cjs.map +1 -1
- package/dist/snaps/Timer.d.cts.map +1 -1
- package/dist/snaps/Timer.d.mts.map +1 -1
- package/dist/snaps/Timer.mjs +5 -5
- package/dist/snaps/Timer.mjs.map +1 -1
- package/dist/snaps/registry/json.cjs +18 -3
- package/dist/snaps/registry/json.cjs.map +1 -1
- package/dist/snaps/registry/json.d.cts.map +1 -1
- package/dist/snaps/registry/json.d.mts.map +1 -1
- package/dist/snaps/registry/json.mjs +18 -3
- package/dist/snaps/registry/json.mjs.map +1 -1
- package/package.json +11 -9
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SnapController = exports.SNAP_APPROVAL_RESULT = exports.SNAP_APPROVAL_UPDATE = exports.SNAP_APPROVAL_INSTALL = exports.controllerName = void 0;
|
|
4
|
+
const approval_controller_1 = require("@metamask/approval-controller");
|
|
4
5
|
const base_controller_1 = require("@metamask/base-controller");
|
|
5
6
|
const permission_controller_1 = require("@metamask/permission-controller");
|
|
6
7
|
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
@@ -87,14 +88,28 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
87
88
|
messenger,
|
|
88
89
|
metadata: {
|
|
89
90
|
snapStates: {
|
|
91
|
+
includeInStateLogs: false,
|
|
90
92
|
persist: true,
|
|
91
93
|
anonymous: false,
|
|
94
|
+
usedInUi: false,
|
|
92
95
|
},
|
|
93
96
|
unencryptedSnapStates: {
|
|
97
|
+
includeInStateLogs: false,
|
|
94
98
|
persist: true,
|
|
95
99
|
anonymous: false,
|
|
100
|
+
usedInUi: false,
|
|
96
101
|
},
|
|
97
102
|
snaps: {
|
|
103
|
+
includeInStateLogs: (snaps) => {
|
|
104
|
+
// Delete larger snap properties
|
|
105
|
+
return Object.values(snaps).reduce((acc, snap) => {
|
|
106
|
+
const snapCopy = { ...snap };
|
|
107
|
+
delete snapCopy.sourceCode;
|
|
108
|
+
delete snapCopy.auxiliaryFiles;
|
|
109
|
+
acc[snap.id] = snapCopy;
|
|
110
|
+
return acc;
|
|
111
|
+
}, {});
|
|
112
|
+
},
|
|
98
113
|
persist: (snaps) => {
|
|
99
114
|
return (Object.values(snaps)
|
|
100
115
|
// We should not persist snaps that are in the installing state,
|
|
@@ -113,6 +128,9 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
113
128
|
}, {}));
|
|
114
129
|
},
|
|
115
130
|
anonymous: false,
|
|
131
|
+
// TODO: Ensure larger snap properties are not sent to the UI
|
|
132
|
+
// Currently these are stripped out manually in the extension
|
|
133
|
+
usedInUi: true,
|
|
116
134
|
},
|
|
117
135
|
},
|
|
118
136
|
name: exports.controllerName,
|
|
@@ -255,7 +273,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
255
273
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:getSnapState`, async (...args) => this.getSnapState(...args));
|
|
256
274
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:handleRequest`, async (...args) => this.handleRequest(...args));
|
|
257
275
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:has`, (...args) => this.has(...args));
|
|
258
|
-
this.messagingSystem.registerActionHandler(`${exports.controllerName}:
|
|
276
|
+
this.messagingSystem.registerActionHandler(`${exports.controllerName}:updateRegistry`, async () => this.updateRegistry());
|
|
259
277
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:updateSnapState`, async (...args) => this.updateSnapState(...args));
|
|
260
278
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:enable`, (...args) => this.enableSnap(...args));
|
|
261
279
|
this.messagingSystem.registerActionHandler(`${exports.controllerName}:disable`, async (...args) => this.disableSnap(...args));
|
|
@@ -361,8 +379,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
361
379
|
* Checks all installed snaps against the block list and
|
|
362
380
|
* blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
|
|
363
381
|
* for more information.
|
|
382
|
+
*
|
|
383
|
+
* Also updates any preinstalled Snaps to the latest allowlisted version.
|
|
364
384
|
*/
|
|
365
|
-
async
|
|
385
|
+
async updateRegistry() {
|
|
366
386
|
this.#assertCanUsePlatform();
|
|
367
387
|
await this.messagingSystem.call('SnapsRegistry:update');
|
|
368
388
|
const blockedSnaps = await this.messagingSystem.call('SnapsRegistry:get', Object.values(this.state.snaps).reduce((blockListArg, snap) => {
|
|
@@ -378,6 +398,30 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
378
398
|
}
|
|
379
399
|
return this.#unblockSnap(snapId);
|
|
380
400
|
}));
|
|
401
|
+
if (!this.#featureFlags.autoUpdatePreinstalledSnaps) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
const preinstalledVersionRange = '*';
|
|
405
|
+
await Promise.allSettled(Object.values(this.state.snaps)
|
|
406
|
+
.filter((snap) => snap.preinstalled)
|
|
407
|
+
.map(async (snap) => {
|
|
408
|
+
const resolvedVersion = await this.#resolveAllowlistVersion(snap.id, preinstalledVersionRange);
|
|
409
|
+
if (resolvedVersion !== preinstalledVersionRange &&
|
|
410
|
+
(0, utils_1.gtVersion)(resolvedVersion, snap.version)) {
|
|
411
|
+
const location = this.#detectSnapLocation(snap.id, {
|
|
412
|
+
versionRange: resolvedVersion,
|
|
413
|
+
fetch: this.#fetchFunction,
|
|
414
|
+
allowLocal: false,
|
|
415
|
+
});
|
|
416
|
+
await this.#updateSnap({
|
|
417
|
+
origin: approval_controller_1.ORIGIN_METAMASK,
|
|
418
|
+
snapId: snap.id,
|
|
419
|
+
location,
|
|
420
|
+
versionRange: resolvedVersion,
|
|
421
|
+
automaticUpdate: true,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}));
|
|
381
425
|
}
|
|
382
426
|
/**
|
|
383
427
|
* Blocks an installed snap and prevents it from being started again. Emits
|
|
@@ -669,7 +713,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
669
713
|
*/
|
|
670
714
|
getExpect(snapId) {
|
|
671
715
|
const snap = this.get(snapId);
|
|
672
|
-
(0, utils_1.assert)(snap !== undefined,
|
|
716
|
+
(0, utils_1.assert)(snap !== undefined, `Snap "${snapId}" not found.`);
|
|
673
717
|
return snap;
|
|
674
718
|
}
|
|
675
719
|
/**
|
|
@@ -1219,7 +1263,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1219
1263
|
else if (!isUpdate) {
|
|
1220
1264
|
pendingInstalls.push(snapId);
|
|
1221
1265
|
}
|
|
1222
|
-
result[snapId] = await this
|
|
1266
|
+
result[snapId] = await this.#processRequestedSnap(origin, snapId, location, version);
|
|
1223
1267
|
}
|
|
1224
1268
|
// Once we finish all installs / updates, emit events.
|
|
1225
1269
|
pendingInstalls.forEach((snapId) => this.messagingSystem.publish(`SnapController:snapInstalled`, this.getTruncatedExpect(snapId), origin, false));
|
|
@@ -1248,23 +1292,19 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1248
1292
|
* @param versionRange - The semver range of the snap to install.
|
|
1249
1293
|
* @returns The resulting snap object, or an error if something went wrong.
|
|
1250
1294
|
*/
|
|
1251
|
-
|
|
1252
|
-
// ignore.
|
|
1253
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
1254
|
-
async processRequestedSnap(origin, snapId, location, versionRange) {
|
|
1295
|
+
async #processRequestedSnap(origin, snapId, location, versionRange) {
|
|
1255
1296
|
const existingSnap = this.getTruncated(snapId);
|
|
1256
1297
|
// For devX we always re-install local snaps.
|
|
1257
1298
|
if (existingSnap && !location.shouldAlwaysReload) {
|
|
1258
1299
|
if ((0, utils_1.satisfiesVersionRange)(existingSnap.version, versionRange)) {
|
|
1259
1300
|
return existingSnap;
|
|
1260
1301
|
}
|
|
1261
|
-
return await this
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
false);
|
|
1302
|
+
return await this.#updateSnap({
|
|
1303
|
+
origin,
|
|
1304
|
+
snapId,
|
|
1305
|
+
location,
|
|
1306
|
+
versionRange,
|
|
1307
|
+
});
|
|
1268
1308
|
}
|
|
1269
1309
|
this.#assertCanInstallSnaps();
|
|
1270
1310
|
let pendingApproval = this.#createApproval({
|
|
@@ -1288,7 +1328,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1288
1328
|
location,
|
|
1289
1329
|
versionRange,
|
|
1290
1330
|
});
|
|
1291
|
-
await this
|
|
1331
|
+
await this.#authorize(snapId, pendingApproval);
|
|
1292
1332
|
pendingApproval = this.#createApproval({
|
|
1293
1333
|
origin,
|
|
1294
1334
|
snapId,
|
|
@@ -1357,28 +1397,30 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1357
1397
|
* If the original version of the snap was blocked and the update succeeded,
|
|
1358
1398
|
* the snap will be unblocked and enabled before it is restarted.
|
|
1359
1399
|
*
|
|
1360
|
-
* @param
|
|
1361
|
-
* @param
|
|
1362
|
-
* @param
|
|
1363
|
-
* @param
|
|
1364
|
-
* @param
|
|
1400
|
+
* @param options - An options bag.
|
|
1401
|
+
* @param options.origin - The origin requesting the snap update.
|
|
1402
|
+
* @param options.snapId - The id of the Snap to be updated.
|
|
1403
|
+
* @param options.location - The location implementation of the snap.
|
|
1404
|
+
* @param options.versionRange - A semver version range in which the maximum version will be chosen.
|
|
1405
|
+
* @param options.automaticUpdate - An optional boolean flag to indicate whether this update should be done
|
|
1406
|
+
* automatically.
|
|
1365
1407
|
* @returns The snap metadata if updated, `null` otherwise.
|
|
1366
1408
|
*/
|
|
1367
|
-
async updateSnap(origin, snapId, location,
|
|
1409
|
+
async #updateSnap({ origin, snapId, location, versionRange, automaticUpdate = false, }) {
|
|
1368
1410
|
this.#assertCanInstallSnaps();
|
|
1369
1411
|
this.#assertCanUsePlatform();
|
|
1370
1412
|
const snap = this.getExpect(snapId);
|
|
1371
|
-
|
|
1413
|
+
const { preinstalled, removable, hidden, hideSnapBranding } = snap;
|
|
1414
|
+
if (preinstalled && !automaticUpdate) {
|
|
1372
1415
|
throw new Error('Preinstalled Snaps cannot be manually updated.');
|
|
1373
1416
|
}
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
});
|
|
1417
|
+
let pendingApproval = automaticUpdate
|
|
1418
|
+
? null
|
|
1419
|
+
: this.#createApproval({
|
|
1420
|
+
origin,
|
|
1421
|
+
snapId,
|
|
1422
|
+
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1423
|
+
});
|
|
1382
1424
|
try {
|
|
1383
1425
|
this.messagingSystem.publish('SnapController:snapInstallStarted', snapId, origin, true);
|
|
1384
1426
|
const oldManifest = snap.manifest;
|
|
@@ -1387,10 +1429,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1387
1429
|
const manifest = manifestFile.result;
|
|
1388
1430
|
const newVersion = manifest.version;
|
|
1389
1431
|
if (!(0, utils_1.gtVersion)(newVersion, snap.version)) {
|
|
1390
|
-
throw rpc_errors_1.rpcErrors.invalidParams(`Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${
|
|
1432
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${versionRange}" range.`);
|
|
1391
1433
|
}
|
|
1392
|
-
if (!(0, utils_1.satisfiesVersionRange)(newVersion,
|
|
1393
|
-
throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${
|
|
1434
|
+
if (!(0, utils_1.satisfiesVersionRange)(newVersion, versionRange)) {
|
|
1435
|
+
throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${versionRange}".`);
|
|
1394
1436
|
}
|
|
1395
1437
|
await this.#assertIsInstallAllowed(snapId, {
|
|
1396
1438
|
version: newVersion,
|
|
@@ -1402,23 +1444,33 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1402
1444
|
this.#validateSnapPermissions(processedPermissions);
|
|
1403
1445
|
const { newPermissions, unusedPermissions, approvedPermissions } = this.#calculatePermissionsChange(snapId, processedPermissions);
|
|
1404
1446
|
const { newConnections, unusedConnections, approvedConnections } = this.#calculateConnectionsChange(snapId, oldManifest.initialConnections ?? {}, manifest.initialConnections ?? {});
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1447
|
+
let approvedNewPermissions;
|
|
1448
|
+
let requestData;
|
|
1449
|
+
if (pendingApproval) {
|
|
1450
|
+
this.#updateApproval(pendingApproval.id, {
|
|
1451
|
+
permissions: newPermissions,
|
|
1452
|
+
newVersion: manifest.version,
|
|
1453
|
+
newPermissions,
|
|
1454
|
+
approvedPermissions,
|
|
1455
|
+
unusedPermissions,
|
|
1456
|
+
newConnections,
|
|
1457
|
+
unusedConnections,
|
|
1458
|
+
approvedConnections,
|
|
1459
|
+
loading: false,
|
|
1460
|
+
});
|
|
1461
|
+
const { permissions, ...rest } = (await pendingApproval.promise);
|
|
1462
|
+
approvedNewPermissions = permissions;
|
|
1463
|
+
requestData = rest;
|
|
1464
|
+
pendingApproval = this.#createApproval({
|
|
1465
|
+
origin,
|
|
1466
|
+
snapId,
|
|
1467
|
+
type: exports.SNAP_APPROVAL_RESULT,
|
|
1468
|
+
});
|
|
1469
|
+
}
|
|
1470
|
+
else {
|
|
1471
|
+
(0, utils_1.assert)(automaticUpdate);
|
|
1472
|
+
approvedNewPermissions = newPermissions;
|
|
1473
|
+
}
|
|
1422
1474
|
if (this.isRunning(snapId)) {
|
|
1423
1475
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
1424
1476
|
}
|
|
@@ -1427,6 +1479,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1427
1479
|
origin,
|
|
1428
1480
|
id: snapId,
|
|
1429
1481
|
files: newSnap,
|
|
1482
|
+
removable,
|
|
1483
|
+
preinstalled,
|
|
1484
|
+
hidden,
|
|
1485
|
+
hideSnapBranding,
|
|
1430
1486
|
isUpdate: true,
|
|
1431
1487
|
});
|
|
1432
1488
|
this.#updatePermissions({
|
|
@@ -1435,14 +1491,17 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1435
1491
|
newPermissions: approvedNewPermissions,
|
|
1436
1492
|
requestData,
|
|
1437
1493
|
});
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1494
|
+
const previousInitialConnections = oldManifest.initialConnections ?? null;
|
|
1495
|
+
const newInitialConnections = manifest.initialConnections ?? {};
|
|
1496
|
+
this.#handleInitialConnections(snapId, previousInitialConnections, newInitialConnections);
|
|
1441
1497
|
const rollbackSnapshot = this.#getRollbackSnapshot(snapId);
|
|
1442
1498
|
if (rollbackSnapshot !== undefined) {
|
|
1443
1499
|
rollbackSnapshot.permissions.revoked = unusedPermissions;
|
|
1444
1500
|
rollbackSnapshot.permissions.granted = approvedNewPermissions;
|
|
1445
1501
|
rollbackSnapshot.permissions.requestData = requestData;
|
|
1502
|
+
rollbackSnapshot.previousInitialConnections =
|
|
1503
|
+
previousInitialConnections;
|
|
1504
|
+
rollbackSnapshot.newInitialConnections = newInitialConnections;
|
|
1446
1505
|
}
|
|
1447
1506
|
const sourceCode = sourceCodeFile.toString();
|
|
1448
1507
|
(0, utils_1.assert)(typeof sourceCode === 'string' && sourceCode.length > 0, `Invalid source code for snap "${snapId}".`);
|
|
@@ -1453,23 +1512,24 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1453
1512
|
throw new Error(`Snap ${snapId} crashed with updated source code.`);
|
|
1454
1513
|
}
|
|
1455
1514
|
const truncatedSnap = this.getTruncatedExpect(snapId);
|
|
1456
|
-
if (
|
|
1457
|
-
this
|
|
1515
|
+
if (pendingApproval) {
|
|
1516
|
+
this.#updateApproval(pendingApproval.id, {
|
|
1517
|
+
loading: false,
|
|
1518
|
+
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1519
|
+
});
|
|
1458
1520
|
}
|
|
1459
|
-
this.#updateApproval(pendingApproval.id, {
|
|
1460
|
-
loading: false,
|
|
1461
|
-
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1462
|
-
});
|
|
1463
1521
|
return truncatedSnap;
|
|
1464
1522
|
}
|
|
1465
1523
|
catch (error) {
|
|
1466
1524
|
(0, snaps_utils_1.logError)(`Error when updating ${snapId},`, error);
|
|
1467
1525
|
const errorString = error instanceof Error ? error.message : error.toString();
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1526
|
+
if (pendingApproval) {
|
|
1527
|
+
this.#updateApproval(pendingApproval.id, {
|
|
1528
|
+
loading: false,
|
|
1529
|
+
error: errorString,
|
|
1530
|
+
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1531
|
+
});
|
|
1532
|
+
}
|
|
1473
1533
|
this.messagingSystem.publish('SnapController:snapInstallFailed', snapId, origin, true, errorString);
|
|
1474
1534
|
throw error;
|
|
1475
1535
|
}
|
|
@@ -1715,14 +1775,11 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1715
1775
|
* Initiates a request for the given snap's initial permissions.
|
|
1716
1776
|
* Must be called in order. See processRequestedSnap.
|
|
1717
1777
|
*
|
|
1718
|
-
* This function is not hash private yet because of tests.
|
|
1719
|
-
*
|
|
1720
1778
|
* @param snapId - The id of the Snap.
|
|
1721
1779
|
* @param pendingApproval - Pending approval to update.
|
|
1722
1780
|
* @returns The snap's approvedPermissions.
|
|
1723
1781
|
*/
|
|
1724
|
-
|
|
1725
|
-
async authorize(snapId, pendingApproval) {
|
|
1782
|
+
async #authorize(snapId, pendingApproval) {
|
|
1726
1783
|
(0, logging_1.log)(`Authorizing snap: ${snapId}`);
|
|
1727
1784
|
const snapsState = this.state.snaps;
|
|
1728
1785
|
const snap = snapsState[snapId];
|
|
@@ -2144,14 +2201,14 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2144
2201
|
* @returns A `RollbackSnapshot`.
|
|
2145
2202
|
*/
|
|
2146
2203
|
#createRollbackSnapshot(snapId) {
|
|
2147
|
-
(0, utils_1.assert)(this.#rollbackSnapshots.get(snapId) === undefined,
|
|
2204
|
+
(0, utils_1.assert)(this.#rollbackSnapshots.get(snapId) === undefined, `Snap "${snapId}" rollback snapshot already exists.`);
|
|
2148
2205
|
this.#rollbackSnapshots.set(snapId, {
|
|
2149
2206
|
statePatches: [],
|
|
2150
2207
|
permissions: {},
|
|
2151
2208
|
newVersion: '',
|
|
2152
2209
|
});
|
|
2153
2210
|
const newRollbackSnapshot = this.#rollbackSnapshots.get(snapId);
|
|
2154
|
-
(0, utils_1.assert)(newRollbackSnapshot !== undefined,
|
|
2211
|
+
(0, utils_1.assert)(newRollbackSnapshot !== undefined, `Snapshot creation failed for ${snapId}.`);
|
|
2155
2212
|
return newRollbackSnapshot;
|
|
2156
2213
|
}
|
|
2157
2214
|
/**
|
|
@@ -2175,7 +2232,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2175
2232
|
if (this.get(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
|
|
2176
2233
|
this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
2177
2234
|
}
|
|
2178
|
-
const { statePatches, permissions } = rollbackSnapshot;
|
|
2235
|
+
const { statePatches, permissions, previousInitialConnections, newInitialConnections, } = rollbackSnapshot;
|
|
2179
2236
|
if (statePatches?.length) {
|
|
2180
2237
|
this.applyPatches(statePatches);
|
|
2181
2238
|
}
|
|
@@ -2192,6 +2249,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2192
2249
|
newPermissions: permissions.revoked,
|
|
2193
2250
|
requestData: permissions.requestData,
|
|
2194
2251
|
});
|
|
2252
|
+
// Calling this in reverse order to undo the changes
|
|
2253
|
+
this.#handleInitialConnections(snapId, newInitialConnections ?? null, previousInitialConnections ?? {});
|
|
2195
2254
|
const truncatedSnap = this.getTruncatedExpect(snapId);
|
|
2196
2255
|
this.messagingSystem.publish('SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion);
|
|
2197
2256
|
this.#rollbackSnapshots.delete(snapId);
|
|
@@ -2212,7 +2271,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2212
2271
|
}
|
|
2213
2272
|
#getRuntimeExpect(snapId) {
|
|
2214
2273
|
const runtime = this.#getRuntime(snapId);
|
|
2215
|
-
(0, utils_1.assert)(runtime !== undefined,
|
|
2274
|
+
(0, utils_1.assert)(runtime !== undefined, `Snap "${snapId}" runtime data not found`);
|
|
2216
2275
|
return runtime;
|
|
2217
2276
|
}
|
|
2218
2277
|
#setupRuntime(snapId) {
|
|
@@ -2283,8 +2342,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2283
2342
|
* @returns The permissions to grant to the Snap.
|
|
2284
2343
|
*/
|
|
2285
2344
|
#getPermissionsToGrant(snapId, newPermissions) {
|
|
2286
|
-
if (
|
|
2287
|
-
Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
|
|
2345
|
+
if (Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
|
|
2288
2346
|
// This will return the globally selected network if the Snap doesn't have
|
|
2289
2347
|
// one set.
|
|
2290
2348
|
const networkClientId = this.messagingSystem.call('SelectedNetworkController:getNetworkClientIdForDomain', snapId);
|