@metamask/snaps-controllers 15.0.2 → 16.1.0
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 +34 -1
- package/dist/cronjob/CronjobController.cjs +17 -17
- package/dist/cronjob/CronjobController.cjs.map +1 -1
- package/dist/cronjob/CronjobController.d.cts +3 -2
- package/dist/cronjob/CronjobController.d.cts.map +1 -1
- package/dist/cronjob/CronjobController.d.mts +3 -2
- package/dist/cronjob/CronjobController.d.mts.map +1 -1
- package/dist/cronjob/CronjobController.mjs +17 -17
- package/dist/cronjob/CronjobController.mjs.map +1 -1
- package/dist/insights/SnapInsightsController.cjs +8 -8
- package/dist/insights/SnapInsightsController.cjs.map +1 -1
- package/dist/insights/SnapInsightsController.d.cts +3 -2
- package/dist/insights/SnapInsightsController.d.cts.map +1 -1
- package/dist/insights/SnapInsightsController.d.mts +3 -2
- package/dist/insights/SnapInsightsController.d.mts.map +1 -1
- package/dist/insights/SnapInsightsController.mjs +8 -8
- package/dist/insights/SnapInsightsController.mjs.map +1 -1
- package/dist/interface/SnapInterfaceController.cjs +16 -17
- package/dist/interface/SnapInterfaceController.cjs.map +1 -1
- package/dist/interface/SnapInterfaceController.d.cts +3 -2
- package/dist/interface/SnapInterfaceController.d.cts.map +1 -1
- package/dist/interface/SnapInterfaceController.d.mts +3 -2
- package/dist/interface/SnapInterfaceController.d.mts.map +1 -1
- package/dist/interface/SnapInterfaceController.mjs +16 -17
- package/dist/interface/SnapInterfaceController.mjs.map +1 -1
- package/dist/multichain/MultichainRouter.cjs.map +1 -1
- package/dist/multichain/MultichainRouter.d.cts +3 -3
- package/dist/multichain/MultichainRouter.d.cts.map +1 -1
- package/dist/multichain/MultichainRouter.d.mts +3 -3
- package/dist/multichain/MultichainRouter.d.mts.map +1 -1
- package/dist/multichain/MultichainRouter.mjs.map +1 -1
- package/dist/services/ExecutionService.cjs.map +1 -1
- package/dist/services/ExecutionService.d.cts +2 -2
- package/dist/services/ExecutionService.d.cts.map +1 -1
- package/dist/services/ExecutionService.d.mts +2 -2
- package/dist/services/ExecutionService.d.mts.map +1 -1
- package/dist/services/ExecutionService.mjs.map +1 -1
- package/dist/snaps/SnapController.cjs +124 -135
- package/dist/snaps/SnapController.cjs.map +1 -1
- package/dist/snaps/SnapController.d.cts +5 -16
- package/dist/snaps/SnapController.d.cts.map +1 -1
- package/dist/snaps/SnapController.d.mts +5 -16
- package/dist/snaps/SnapController.d.mts.map +1 -1
- package/dist/snaps/SnapController.mjs +126 -137
- package/dist/snaps/SnapController.mjs.map +1 -1
- package/dist/snaps/constants.cjs +12 -1
- package/dist/snaps/constants.cjs.map +1 -1
- package/dist/snaps/constants.d.cts +9 -0
- package/dist/snaps/constants.d.cts.map +1 -1
- package/dist/snaps/constants.d.mts +9 -0
- package/dist/snaps/constants.d.mts.map +1 -1
- package/dist/snaps/constants.mjs +11 -0
- package/dist/snaps/constants.mjs.map +1 -1
- package/dist/snaps/location/npm.cjs +6 -3
- package/dist/snaps/location/npm.cjs.map +1 -1
- package/dist/snaps/location/npm.d.cts +7 -0
- package/dist/snaps/location/npm.d.cts.map +1 -1
- package/dist/snaps/location/npm.d.mts +7 -0
- package/dist/snaps/location/npm.d.mts.map +1 -1
- package/dist/snaps/location/npm.mjs +5 -2
- package/dist/snaps/location/npm.mjs.map +1 -1
- package/dist/snaps/registry/json.cjs +7 -7
- package/dist/snaps/registry/json.cjs.map +1 -1
- package/dist/snaps/registry/json.d.cts +3 -2
- package/dist/snaps/registry/json.d.cts.map +1 -1
- package/dist/snaps/registry/json.d.mts +3 -2
- package/dist/snaps/registry/json.d.mts.map +1 -1
- package/dist/snaps/registry/json.mjs +7 -7
- package/dist/snaps/registry/json.mjs.map +1 -1
- package/dist/websocket/WebSocketService.cjs.map +1 -1
- package/dist/websocket/WebSocketService.d.cts +2 -2
- package/dist/websocket/WebSocketService.d.cts.map +1 -1
- package/dist/websocket/WebSocketService.d.mts +2 -2
- package/dist/websocket/WebSocketService.d.mts.map +1 -1
- package/dist/websocket/WebSocketService.mjs.map +1 -1
- package/package.json +11 -10
|
@@ -83,20 +83,20 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
83
83
|
#preinstalledSnaps;
|
|
84
84
|
#trackEvent;
|
|
85
85
|
#trackSnapExport;
|
|
86
|
-
constructor({ closeAllConnections, messenger, state, dynamicPermissions = ['
|
|
86
|
+
constructor({ closeAllConnections, messenger, state, dynamicPermissions = ['endowment:caip25', 'wallet_snap'], environmentEndowmentPermissions = [], excludedPermissions = {}, idleTimeCheckInterval = (0, utils_1.inMilliseconds)(5, utils_1.Duration.Second), maxIdleTime = (0, utils_1.inMilliseconds)(30, utils_1.Duration.Second), maxRequestTime = (0, utils_1.inMilliseconds)(60, utils_1.Duration.Second), fetchFunction = globalThis.fetch.bind(undefined), featureFlags = {}, detectSnapLocation: detectSnapLocationFunction = location_1.detectSnapLocation, preinstalledSnaps = null, encryptor, getMnemonicSeed, getFeatureFlags = () => ({}), clientCryptography, trackEvent, }) {
|
|
87
87
|
super({
|
|
88
88
|
messenger,
|
|
89
89
|
metadata: {
|
|
90
90
|
snapStates: {
|
|
91
91
|
includeInStateLogs: false,
|
|
92
92
|
persist: true,
|
|
93
|
-
|
|
93
|
+
includeInDebugSnapshot: false,
|
|
94
94
|
usedInUi: false,
|
|
95
95
|
},
|
|
96
96
|
unencryptedSnapStates: {
|
|
97
97
|
includeInStateLogs: false,
|
|
98
98
|
persist: true,
|
|
99
|
-
|
|
99
|
+
includeInDebugSnapshot: false,
|
|
100
100
|
usedInUi: false,
|
|
101
101
|
},
|
|
102
102
|
snaps: {
|
|
@@ -127,7 +127,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
127
127
|
return memo;
|
|
128
128
|
}, {}));
|
|
129
129
|
},
|
|
130
|
-
|
|
130
|
+
includeInDebugSnapshot: false,
|
|
131
131
|
// TODO: Ensure larger snap properties are not sent to the UI
|
|
132
132
|
// Currently these are stripped out manually in the extension
|
|
133
133
|
usedInUi: true,
|
|
@@ -162,21 +162,21 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
162
162
|
this.#trackEvent = trackEvent;
|
|
163
163
|
this.#pollForLastRequestStatus();
|
|
164
164
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
165
|
-
this.
|
|
166
|
-
this.
|
|
167
|
-
this.
|
|
165
|
+
this.messenger.subscribe('ExecutionService:unhandledError', this._onUnhandledSnapError);
|
|
166
|
+
this.messenger.subscribe('ExecutionService:outboundRequest', this._onOutboundRequest);
|
|
167
|
+
this.messenger.subscribe('ExecutionService:outboundResponse', this._onOutboundResponse);
|
|
168
168
|
/* eslint-enable @typescript-eslint/unbound-method */
|
|
169
|
-
this.
|
|
169
|
+
this.messenger.subscribe('SnapController:snapInstalled', ({ id }, origin) => {
|
|
170
170
|
this.#callLifecycleHook(origin, id, snaps_utils_1.HandlerType.OnInstall).catch((error) => {
|
|
171
171
|
(0, snaps_utils_1.logError)(`Error when calling \`onInstall\` lifecycle hook for snap "${id}": ${(0, snaps_sdk_1.getErrorMessage)(error)}`);
|
|
172
172
|
});
|
|
173
173
|
});
|
|
174
|
-
this.
|
|
174
|
+
this.messenger.subscribe('SnapController:snapUpdated', ({ id }, _oldVersion, origin) => {
|
|
175
175
|
this.#callLifecycleHook(origin, id, snaps_utils_1.HandlerType.OnUpdate).catch((error) => {
|
|
176
176
|
(0, snaps_utils_1.logError)(`Error when calling \`onUpdate\` lifecycle hook for snap "${id}": ${(0, snaps_sdk_1.getErrorMessage)(error)}`);
|
|
177
177
|
});
|
|
178
178
|
});
|
|
179
|
-
this.
|
|
179
|
+
this.messenger.subscribe('KeyringController:lock', this.#handleLock.bind(this));
|
|
180
180
|
this.#initializeStateMachine();
|
|
181
181
|
this.#registerMessageHandlers();
|
|
182
182
|
Object.values(this.state?.snaps ?? {}).forEach((snap) => this.#setupRuntime(snap.id));
|
|
@@ -184,7 +184,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
184
184
|
this.#handlePreinstalledSnaps(this.#preinstalledSnaps);
|
|
185
185
|
}
|
|
186
186
|
this.#trackSnapExport = (0, utils_2.throttleTracking)((snapId, handler, success, origin) => {
|
|
187
|
-
const snapMetadata = this.
|
|
187
|
+
const snapMetadata = this.messenger.call('SnapsRegistry:getMetadata', snapId);
|
|
188
188
|
this.#trackEvent({
|
|
189
189
|
event: 'Snap Export Used',
|
|
190
190
|
category: 'Snaps',
|
|
@@ -267,29 +267,29 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
267
267
|
* actions.
|
|
268
268
|
*/
|
|
269
269
|
#registerMessageHandlers() {
|
|
270
|
-
this.
|
|
271
|
-
this.
|
|
272
|
-
this.
|
|
273
|
-
this.
|
|
274
|
-
this.
|
|
275
|
-
this.
|
|
276
|
-
this.
|
|
277
|
-
this.
|
|
278
|
-
this.
|
|
279
|
-
this.
|
|
280
|
-
this.
|
|
281
|
-
this.
|
|
282
|
-
this.
|
|
283
|
-
this.
|
|
284
|
-
this.
|
|
285
|
-
this.
|
|
286
|
-
this.
|
|
287
|
-
this.
|
|
288
|
-
this.
|
|
289
|
-
this.
|
|
290
|
-
this.
|
|
291
|
-
this.
|
|
292
|
-
this.
|
|
270
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:init`, (...args) => this.init(...args));
|
|
271
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:clearSnapState`, (...args) => this.clearSnapState(...args));
|
|
272
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:get`, (...args) => this.get(...args));
|
|
273
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getSnapState`, async (...args) => this.getSnapState(...args));
|
|
274
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:handleRequest`, async (...args) => this.handleRequest(...args));
|
|
275
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:has`, (...args) => this.has(...args));
|
|
276
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:updateRegistry`, async () => this.updateRegistry());
|
|
277
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:updateSnapState`, async (...args) => this.updateSnapState(...args));
|
|
278
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:enable`, (...args) => this.enableSnap(...args));
|
|
279
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:disable`, async (...args) => this.disableSnap(...args));
|
|
280
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:remove`, async (...args) => this.removeSnap(...args));
|
|
281
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getPermitted`, (...args) => this.getPermittedSnaps(...args));
|
|
282
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:install`, async (...args) => this.installSnaps(...args));
|
|
283
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getAll`, (...args) => this.getAllSnaps(...args));
|
|
284
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getRunnableSnaps`, (...args) => this.getRunnableSnaps(...args));
|
|
285
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:incrementActiveReferences`, (...args) => this.incrementActiveReferences(...args));
|
|
286
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:decrementActiveReferences`, (...args) => this.decrementActiveReferences(...args));
|
|
287
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:disconnectOrigin`, (...args) => this.removeSnapFromSubject(...args));
|
|
288
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:revokeDynamicPermissions`, (...args) => this.revokeDynamicSnapPermissions(...args));
|
|
289
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getFile`, async (...args) => this.getSnapFile(...args));
|
|
290
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:stopAllSnaps`, async (...args) => this.stopAllSnaps(...args));
|
|
291
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:isMinimumPlatformVersion`, (...args) => this.isMinimumPlatformVersion(...args));
|
|
292
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:setClientActive`, (...args) => this.setClientActive(...args));
|
|
293
293
|
}
|
|
294
294
|
/**
|
|
295
295
|
* Initialise the SnapController.
|
|
@@ -359,10 +359,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
359
359
|
this.#setupRuntime(snapId);
|
|
360
360
|
// Emit events
|
|
361
361
|
if (isUpdate) {
|
|
362
|
-
this.
|
|
362
|
+
this.messenger.publish('SnapController:snapUpdated', this.getTruncatedExpect(snapId), existingSnap.version, constants_1.METAMASK_ORIGIN, true);
|
|
363
363
|
}
|
|
364
364
|
else {
|
|
365
|
-
this.
|
|
365
|
+
this.messenger.publish('SnapController:snapInstalled', this.getTruncatedExpect(snapId), constants_1.METAMASK_ORIGIN, true);
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
368
|
}
|
|
@@ -384,8 +384,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
384
384
|
*/
|
|
385
385
|
async updateRegistry() {
|
|
386
386
|
this.#assertCanUsePlatform();
|
|
387
|
-
await this.
|
|
388
|
-
const blockedSnaps = await this.
|
|
387
|
+
await this.messenger.call('SnapsRegistry:update');
|
|
388
|
+
const blockedSnaps = await this.messenger.call('SnapsRegistry:get', Object.values(this.state.snaps).reduce((blockListArg, snap) => {
|
|
389
389
|
blockListArg[snap.id] = {
|
|
390
390
|
version: snap.version,
|
|
391
391
|
checksum: snap.manifest.source.shasum,
|
|
@@ -412,6 +412,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
412
412
|
versionRange: resolvedVersion,
|
|
413
413
|
fetch: this.#fetchFunction,
|
|
414
414
|
allowLocal: false,
|
|
415
|
+
useNpmProxy: true,
|
|
415
416
|
});
|
|
416
417
|
await this.#updateSnap({
|
|
417
418
|
origin: approval_controller_1.ORIGIN_METAMASK,
|
|
@@ -444,7 +445,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
444
445
|
catch (error) {
|
|
445
446
|
(0, snaps_utils_1.logError)(`Encountered error when stopping blocked snap "${snapId}".`, error);
|
|
446
447
|
}
|
|
447
|
-
this.
|
|
448
|
+
this.messenger.publish(`${exports.controllerName}:snapBlocked`, snapId, blockedSnapInfo);
|
|
448
449
|
}
|
|
449
450
|
/**
|
|
450
451
|
* Unblocks a snap so that it can be enabled and started again. Emits
|
|
@@ -461,10 +462,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
461
462
|
state.snaps[snapId].blocked = false;
|
|
462
463
|
delete state.snaps[snapId].blockInformation;
|
|
463
464
|
});
|
|
464
|
-
this.
|
|
465
|
+
this.messenger.publish(`${exports.controllerName}:snapUnblocked`, snapId);
|
|
465
466
|
}
|
|
466
467
|
async #assertIsInstallAllowed(snapId, { platformVersion, ...snapInfo }) {
|
|
467
|
-
const results = await this.
|
|
468
|
+
const results = await this.messenger.call('SnapsRegistry:get', {
|
|
468
469
|
[snapId]: snapInfo,
|
|
469
470
|
});
|
|
470
471
|
const result = results[snapId];
|
|
@@ -581,7 +582,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
581
582
|
this.update((state) => {
|
|
582
583
|
state.snaps[snapId].enabled = true;
|
|
583
584
|
});
|
|
584
|
-
this.
|
|
585
|
+
this.messenger.publish('SnapController:snapEnabled', this.getTruncatedExpect(snapId));
|
|
585
586
|
}
|
|
586
587
|
/**
|
|
587
588
|
* Disables the given snap. A snap can only be started if it is enabled.
|
|
@@ -599,7 +600,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
599
600
|
if (this.isRunning(snapId)) {
|
|
600
601
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
601
602
|
}
|
|
602
|
-
this.
|
|
603
|
+
this.messenger.publish('SnapController:snapDisabled', this.getTruncatedExpect(snapId));
|
|
603
604
|
}
|
|
604
605
|
/**
|
|
605
606
|
* Stops the given snap, removes all hooks, closes all connections, and
|
|
@@ -659,7 +660,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
659
660
|
* @param snapId - The snap to terminate.
|
|
660
661
|
*/
|
|
661
662
|
async #terminateSnap(snapId) {
|
|
662
|
-
await this.
|
|
663
|
+
await this.messenger.call('ExecutionService:terminateSnap', snapId);
|
|
663
664
|
// Hack to give up execution for a bit to let gracefully terminating Snaps return.
|
|
664
665
|
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
665
666
|
const runtime = this.#getRuntimeExpect(snapId);
|
|
@@ -669,7 +670,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
669
670
|
.forEach((pendingRequest) => pendingRequest.timer.finish());
|
|
670
671
|
// Hack to give up execution for a bit to let timed out requests return.
|
|
671
672
|
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
672
|
-
this.
|
|
673
|
+
this.messenger.publish('SnapController:snapTerminated', this.getTruncatedExpect(snapId));
|
|
673
674
|
}
|
|
674
675
|
/**
|
|
675
676
|
* Returns whether the given snap is running.
|
|
@@ -1054,7 +1055,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1054
1055
|
});
|
|
1055
1056
|
// If the snap has been fully installed before, also emit snapUninstalled.
|
|
1056
1057
|
if (snap.status !== snaps_utils_1.SnapStatus.Installing) {
|
|
1057
|
-
this.
|
|
1058
|
+
this.messenger.publish(`SnapController:snapUninstalled`, truncated);
|
|
1058
1059
|
}
|
|
1059
1060
|
}));
|
|
1060
1061
|
}
|
|
@@ -1070,7 +1071,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1070
1071
|
}
|
|
1071
1072
|
}
|
|
1072
1073
|
#addSnapToSubject(origin, snapId) {
|
|
1073
|
-
const subjectPermissions = this.
|
|
1074
|
+
const subjectPermissions = this.messenger.call('PermissionController:getPermissions', origin);
|
|
1074
1075
|
const existingCaveat = subjectPermissions?.[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds);
|
|
1075
1076
|
const subjectHasSnap = Boolean(existingCaveat?.value?.[snapId]);
|
|
1076
1077
|
// If the subject is already connected to the snap, this is a no-op.
|
|
@@ -1079,7 +1080,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1079
1080
|
}
|
|
1080
1081
|
// If an existing caveat exists, we add the snap to that.
|
|
1081
1082
|
if (existingCaveat) {
|
|
1082
|
-
this.
|
|
1083
|
+
this.messenger.call('PermissionController:updateCaveat', origin, snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY, snaps_utils_1.SnapCaveatType.SnapIds, { ...existingCaveat.value, [snapId]: {} });
|
|
1083
1084
|
return;
|
|
1084
1085
|
}
|
|
1085
1086
|
const approvedPermissions = {
|
|
@@ -1094,7 +1095,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1094
1095
|
],
|
|
1095
1096
|
},
|
|
1096
1097
|
};
|
|
1097
|
-
this.
|
|
1098
|
+
this.messenger.call('PermissionController:grantPermissions', {
|
|
1098
1099
|
approvedPermissions,
|
|
1099
1100
|
subject: { origin },
|
|
1100
1101
|
});
|
|
@@ -1106,7 +1107,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1106
1107
|
* @param snapId - The id of the snap to remove.
|
|
1107
1108
|
*/
|
|
1108
1109
|
removeSnapFromSubject(origin, snapId) {
|
|
1109
|
-
const subjectPermissions = this.
|
|
1110
|
+
const subjectPermissions = this.messenger.call('PermissionController:getPermissions', origin);
|
|
1110
1111
|
const snapIdsCaveat = subjectPermissions?.[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds);
|
|
1111
1112
|
if (!snapIdsCaveat) {
|
|
1112
1113
|
return;
|
|
@@ -1118,10 +1119,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1118
1119
|
};
|
|
1119
1120
|
delete newCaveatValue[snapId];
|
|
1120
1121
|
if (Object.keys(newCaveatValue).length > 0) {
|
|
1121
|
-
this.
|
|
1122
|
+
this.messenger.call('PermissionController:updateCaveat', origin, snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY, snaps_utils_1.SnapCaveatType.SnapIds, newCaveatValue);
|
|
1122
1123
|
}
|
|
1123
1124
|
else {
|
|
1124
|
-
this.
|
|
1125
|
+
this.messenger.call('PermissionController:revokePermissions', {
|
|
1125
1126
|
[origin]: [snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY],
|
|
1126
1127
|
});
|
|
1127
1128
|
}
|
|
@@ -1136,7 +1137,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1136
1137
|
*/
|
|
1137
1138
|
revokeDynamicSnapPermissions(snapId, permissionNames) {
|
|
1138
1139
|
(0, utils_1.assert)(permissionNames.every((permissionName) => this.#dynamicPermissions.includes(permissionName)), 'Non-dynamic permissions cannot be revoked');
|
|
1139
|
-
this.
|
|
1140
|
+
this.messenger.call('PermissionController:revokePermissions', {
|
|
1140
1141
|
[snapId]: permissionNames,
|
|
1141
1142
|
});
|
|
1142
1143
|
}
|
|
@@ -1146,7 +1147,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1146
1147
|
* @param snapId - The id of the Snap.
|
|
1147
1148
|
*/
|
|
1148
1149
|
#removeSnapFromSubjects(snapId) {
|
|
1149
|
-
const subjects = this.
|
|
1150
|
+
const subjects = this.messenger.call('PermissionController:getSubjectNames');
|
|
1150
1151
|
for (const subject of subjects) {
|
|
1151
1152
|
this.removeSnapFromSubject(subject, snapId);
|
|
1152
1153
|
}
|
|
@@ -1157,8 +1158,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1157
1158
|
* @param snapId - The snap ID.
|
|
1158
1159
|
*/
|
|
1159
1160
|
#revokeAllSnapPermissions(snapId) {
|
|
1160
|
-
if (this.
|
|
1161
|
-
this.
|
|
1161
|
+
if (this.messenger.call('PermissionController:hasPermissions', snapId)) {
|
|
1162
|
+
this.messenger.call('PermissionController:revokeAllPermissions', snapId);
|
|
1162
1163
|
}
|
|
1163
1164
|
}
|
|
1164
1165
|
/**
|
|
@@ -1203,7 +1204,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1203
1204
|
* @returns The serialized permitted snaps for the origin.
|
|
1204
1205
|
*/
|
|
1205
1206
|
getPermittedSnaps(origin) {
|
|
1206
|
-
const permissions = this.
|
|
1207
|
+
const permissions = this.messenger.call('PermissionController:getPermissions', origin) ?? {};
|
|
1207
1208
|
const snaps = permissions[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds)?.value ?? {};
|
|
1208
1209
|
return Object.keys(snaps).reduce((permittedSnaps, snapId) => {
|
|
1209
1210
|
const snap = this.get(snapId);
|
|
@@ -1266,8 +1267,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1266
1267
|
result[snapId] = await this.#processRequestedSnap(origin, snapId, location, version);
|
|
1267
1268
|
}
|
|
1268
1269
|
// Once we finish all installs / updates, emit events.
|
|
1269
|
-
pendingInstalls.forEach((snapId) => this.
|
|
1270
|
-
pendingUpdates.forEach(({ snapId, oldVersion }) => this.
|
|
1270
|
+
pendingInstalls.forEach((snapId) => this.messenger.publish(`SnapController:snapInstalled`, this.getTruncatedExpect(snapId), origin, false));
|
|
1271
|
+
pendingUpdates.forEach(({ snapId, oldVersion }) => this.messenger.publish(`SnapController:snapUpdated`, this.getTruncatedExpect(snapId), oldVersion, origin, false));
|
|
1271
1272
|
snapIds.forEach((snapId) => this.#rollbackSnapshots.delete(snapId));
|
|
1272
1273
|
}
|
|
1273
1274
|
catch (error) {
|
|
@@ -1312,7 +1313,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1312
1313
|
snapId,
|
|
1313
1314
|
type: exports.SNAP_APPROVAL_INSTALL,
|
|
1314
1315
|
});
|
|
1315
|
-
this.
|
|
1316
|
+
this.messenger.publish('SnapController:snapInstallStarted', snapId, origin, false);
|
|
1316
1317
|
// Existing snaps must be stopped before overwriting
|
|
1317
1318
|
if (existingSnap && this.isRunning(snapId)) {
|
|
1318
1319
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
@@ -1353,13 +1354,13 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1353
1354
|
type: exports.SNAP_APPROVAL_INSTALL,
|
|
1354
1355
|
error: errorString,
|
|
1355
1356
|
});
|
|
1356
|
-
this.
|
|
1357
|
+
this.messenger.publish('SnapController:snapInstallFailed', snapId, origin, false, errorString);
|
|
1357
1358
|
throw error;
|
|
1358
1359
|
}
|
|
1359
1360
|
}
|
|
1360
1361
|
#createApproval({ origin, snapId, type, }) {
|
|
1361
1362
|
const id = (0, nanoid_1.nanoid)();
|
|
1362
|
-
const promise = this.
|
|
1363
|
+
const promise = this.messenger.call('ApprovalController:addRequest', {
|
|
1363
1364
|
origin,
|
|
1364
1365
|
id,
|
|
1365
1366
|
type,
|
|
@@ -1376,7 +1377,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1376
1377
|
}
|
|
1377
1378
|
#updateApproval(id, requestState) {
|
|
1378
1379
|
try {
|
|
1379
|
-
this.
|
|
1380
|
+
this.messenger.call('ApprovalController:updateRequestState', {
|
|
1380
1381
|
id,
|
|
1381
1382
|
requestState,
|
|
1382
1383
|
});
|
|
@@ -1422,7 +1423,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1422
1423
|
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1423
1424
|
});
|
|
1424
1425
|
try {
|
|
1425
|
-
this.
|
|
1426
|
+
this.messenger.publish('SnapController:snapInstallStarted', snapId, origin, true);
|
|
1426
1427
|
const oldManifest = snap.manifest;
|
|
1427
1428
|
const newSnap = await (0, utils_2.fetchSnap)(snapId, location);
|
|
1428
1429
|
const { sourceCode: sourceCodeFile, manifest: manifestFile } = newSnap;
|
|
@@ -1530,12 +1531,12 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1530
1531
|
type: exports.SNAP_APPROVAL_UPDATE,
|
|
1531
1532
|
});
|
|
1532
1533
|
}
|
|
1533
|
-
this.
|
|
1534
|
+
this.messenger.publish('SnapController:snapInstallFailed', snapId, origin, true, errorString);
|
|
1534
1535
|
throw error;
|
|
1535
1536
|
}
|
|
1536
1537
|
}
|
|
1537
1538
|
async #resolveAllowlistVersion(snapId, versionRange) {
|
|
1538
|
-
return await this.
|
|
1539
|
+
return await this.messenger.call('SnapsRegistry:resolveVersion', snapId, versionRange);
|
|
1539
1540
|
}
|
|
1540
1541
|
/**
|
|
1541
1542
|
* Returns a promise representing the complete installation of the requested snap.
|
|
@@ -1598,7 +1599,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1598
1599
|
}
|
|
1599
1600
|
try {
|
|
1600
1601
|
const runtime = this.#getRuntimeExpect(snapId);
|
|
1601
|
-
const result = await this.
|
|
1602
|
+
const result = await this.messenger.call('ExecutionService:executeSnap', {
|
|
1602
1603
|
...snapData,
|
|
1603
1604
|
endowments: await this.#getEndowments(snapId),
|
|
1604
1605
|
});
|
|
@@ -1626,8 +1627,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1626
1627
|
async #getEndowments(snapId) {
|
|
1627
1628
|
let allEndowments = [];
|
|
1628
1629
|
for (const permissionName of this.#environmentEndowmentPermissions) {
|
|
1629
|
-
if (this.
|
|
1630
|
-
const endowments = await this.
|
|
1630
|
+
if (this.messenger.call('PermissionController:hasPermission', snapId, permissionName)) {
|
|
1631
|
+
const endowments = await this.messenger.call('PermissionController:getEndowments', snapId, permissionName);
|
|
1631
1632
|
if (endowments) {
|
|
1632
1633
|
// We don't have any guarantees about the type of the endowments
|
|
1633
1634
|
// value, so we have to guard at runtime.
|
|
@@ -1727,7 +1728,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1727
1728
|
// In case the Snap uses a localized manifest, we need to get the
|
|
1728
1729
|
// proposed name from the localized manifest.
|
|
1729
1730
|
const { proposedName } = (0, snaps_utils_1.getLocalizedSnapManifest)(manifest.result, 'en', localizedFiles);
|
|
1730
|
-
this.
|
|
1731
|
+
this.messenger.call('SubjectMetadataController:addSubjectMetadata', {
|
|
1731
1732
|
subjectType: permission_controller_1.SubjectType.Snap,
|
|
1732
1733
|
name: proposedName,
|
|
1733
1734
|
origin: snap.id,
|
|
@@ -1813,11 +1814,11 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1813
1814
|
clearTimeout(this.#timeoutForLastRequestStatus);
|
|
1814
1815
|
}
|
|
1815
1816
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
1816
|
-
this.
|
|
1817
|
-
this.
|
|
1818
|
-
this.
|
|
1819
|
-
this.
|
|
1820
|
-
this.
|
|
1817
|
+
this.messenger.unsubscribe('ExecutionService:unhandledError', this._onUnhandledSnapError);
|
|
1818
|
+
this.messenger.unsubscribe('ExecutionService:outboundRequest', this._onOutboundRequest);
|
|
1819
|
+
this.messenger.unsubscribe('ExecutionService:outboundResponse', this._onOutboundResponse);
|
|
1820
|
+
this.messenger.clearEventSubscriptions('SnapController:snapInstalled');
|
|
1821
|
+
this.messenger.clearEventSubscriptions('SnapController:snapUpdated');
|
|
1821
1822
|
/* eslint-enable @typescript-eslint/unbound-method */
|
|
1822
1823
|
}
|
|
1823
1824
|
/**
|
|
@@ -1843,7 +1844,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1843
1844
|
(0, utils_1.assertIsJsonRpcRequest)(request);
|
|
1844
1845
|
const permissionName = snaps_rpc_methods_1.handlerEndowments[handlerType];
|
|
1845
1846
|
(0, utils_1.assert)(typeof permissionName === 'string' || permissionName === null, "'permissionName' must be either a string or null.");
|
|
1846
|
-
const permissions = this.
|
|
1847
|
+
const permissions = this.messenger.call('PermissionController:getPermissions', snapId);
|
|
1847
1848
|
// If permissionName is null, the handler does not require a permission.
|
|
1848
1849
|
if (permissionName !== null &&
|
|
1849
1850
|
(!permissions || !(0, utils_1.hasProperty)(permissions, permissionName))) {
|
|
@@ -1855,7 +1856,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1855
1856
|
if (permissionName === snaps_rpc_methods_1.SnapEndowments.Rpc ||
|
|
1856
1857
|
permissionName === snaps_rpc_methods_1.SnapEndowments.Keyring) {
|
|
1857
1858
|
(0, utils_1.assert)(handlerPermissions);
|
|
1858
|
-
const subject = this.
|
|
1859
|
+
const subject = this.messenger.call('SubjectMetadataController:getSubjectMetadata', origin);
|
|
1859
1860
|
const origins = permissionName === snaps_rpc_methods_1.SnapEndowments.Rpc
|
|
1860
1861
|
? (0, snaps_rpc_methods_1.getRpcCaveatOrigins)(handlerPermissions)
|
|
1861
1862
|
: (0, snaps_rpc_methods_1.getKeyringCaveatOrigins)(handlerPermissions);
|
|
@@ -1893,7 +1894,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1893
1894
|
const transformedRequest = this.#transformSnapRpcRequest(snapId, handlerType, request);
|
|
1894
1895
|
const timer = new Timer_1.Timer(timeout);
|
|
1895
1896
|
this.#recordSnapRpcRequestStart(snapId, transformedRequest.id, timer);
|
|
1896
|
-
const handleRpcRequestPromise = this.
|
|
1897
|
+
const handleRpcRequestPromise = this.messenger.call('ExecutionService:handleRpcRequest', snapId, { origin, handler: handlerType, request: transformedRequest });
|
|
1897
1898
|
// This will either get the result or reject due to the timeout.
|
|
1898
1899
|
try {
|
|
1899
1900
|
const result = await (0, utils_2.withTimeout)(handleRpcRequestPromise, timer);
|
|
@@ -1957,11 +1958,11 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1957
1958
|
* @returns An identifier that can be used to identify the interface.
|
|
1958
1959
|
*/
|
|
1959
1960
|
async #createInterface(snapId, content, contentType) {
|
|
1960
|
-
return this.
|
|
1961
|
+
return this.messenger.call('SnapInterfaceController:createInterface', snapId, content, undefined, contentType);
|
|
1961
1962
|
}
|
|
1962
1963
|
#assertInterfaceExists(snapId, id) {
|
|
1963
1964
|
// This will throw if the interface isn't accessible, but we assert nevertheless.
|
|
1964
|
-
(0, utils_1.assert)(this.
|
|
1965
|
+
(0, utils_1.assert)(this.messenger.call('SnapInterfaceController:getInterface', snapId, id));
|
|
1965
1966
|
}
|
|
1966
1967
|
/**
|
|
1967
1968
|
* Transform a RPC response if necessary.
|
|
@@ -2015,7 +2016,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2015
2016
|
* @returns The transformed result.
|
|
2016
2017
|
*/
|
|
2017
2018
|
#transformOnAssetsLookupResult(snapId, { params: requestedParams }, { assets }) {
|
|
2018
|
-
const permissions = this.
|
|
2019
|
+
const permissions = this.messenger.call('PermissionController:getPermissions', snapId);
|
|
2019
2020
|
// We know the permissions are guaranteed to be set here.
|
|
2020
2021
|
(0, utils_1.assert)(permissions);
|
|
2021
2022
|
const permission = permissions[snaps_rpc_methods_1.SnapEndowments.Assets];
|
|
@@ -2098,7 +2099,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2098
2099
|
case snaps_utils_1.HandlerType.OnUserInput: {
|
|
2099
2100
|
(0, utils_1.assert)(request.params && (0, utils_1.hasProperty)(request.params, 'id'));
|
|
2100
2101
|
const interfaceId = request.params.id;
|
|
2101
|
-
const { context } = this.
|
|
2102
|
+
const { context } = this.messenger.call('SnapInterfaceController:getInterface', snapId, interfaceId);
|
|
2102
2103
|
return {
|
|
2103
2104
|
...request,
|
|
2104
2105
|
params: { ...request.params, context },
|
|
@@ -2254,7 +2255,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2254
2255
|
// Calling this in reverse order to undo the changes
|
|
2255
2256
|
this.#handleInitialConnections(snapId, newInitialConnections ?? null, previousInitialConnections ?? {});
|
|
2256
2257
|
const truncatedSnap = this.getTruncatedExpect(snapId);
|
|
2257
|
-
this.
|
|
2258
|
+
this.messenger.publish('SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion);
|
|
2258
2259
|
this.#rollbackSnapshots.delete(snapId);
|
|
2259
2260
|
}
|
|
2260
2261
|
/**
|
|
@@ -2303,19 +2304,48 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2303
2304
|
getStateMutex: new async_mutex_1.Mutex(),
|
|
2304
2305
|
});
|
|
2305
2306
|
}
|
|
2307
|
+
/**
|
|
2308
|
+
* Get the desired permissions including dynamic permissions. That is, if a
|
|
2309
|
+
* dynamic permission was previously granted and at least one of its
|
|
2310
|
+
* dependencies is still desired, it will be included in the desired
|
|
2311
|
+
* permissions.
|
|
2312
|
+
*
|
|
2313
|
+
* @param oldPermissions - The old permissions.
|
|
2314
|
+
* @param desiredPermissions - The desired permissions.
|
|
2315
|
+
* @returns The desired permissions including dynamic permissions.
|
|
2316
|
+
*/
|
|
2317
|
+
#getDesiredPermissions(oldPermissions, desiredPermissions) {
|
|
2318
|
+
return Object.keys(oldPermissions).reduce((accumulator, permissionName) => {
|
|
2319
|
+
if (this.#dynamicPermissions.includes(permissionName)) {
|
|
2320
|
+
const hasDependencies = (0, utils_1.hasProperty)(constants_1.DYNAMIC_PERMISSION_DEPENDENCIES, permissionName);
|
|
2321
|
+
const hasDependency = constants_1.DYNAMIC_PERMISSION_DEPENDENCIES[permissionName]?.some((dependency) => (0, utils_1.hasProperty)(desiredPermissions, dependency));
|
|
2322
|
+
// If the permission doesn't have dependencies, or if at least one of
|
|
2323
|
+
// its dependencies is desired, include it in the desired permissions.
|
|
2324
|
+
// NOTE: This effectively means that any permissions granted in the manifest
|
|
2325
|
+
// that are considered dynamic, will not be automatically revoked
|
|
2326
|
+
// when the permission is removed from the manifest.
|
|
2327
|
+
// TODO: Deal with this technical debt.
|
|
2328
|
+
if (!hasDependencies || hasDependency) {
|
|
2329
|
+
accumulator[permissionName] = oldPermissions[permissionName];
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
return accumulator;
|
|
2333
|
+
}, desiredPermissions);
|
|
2334
|
+
}
|
|
2306
2335
|
#calculatePermissionsChange(snapId, desiredPermissionsSet) {
|
|
2307
|
-
const oldPermissions = this.
|
|
2308
|
-
const
|
|
2309
|
-
|
|
2310
|
-
//
|
|
2311
|
-
|
|
2336
|
+
const oldPermissions = this.messenger.call('PermissionController:getPermissions', snapId) ?? {};
|
|
2337
|
+
const desiredPermissionsSetWithDynamic = this.#getDesiredPermissions(oldPermissions, desiredPermissionsSet);
|
|
2338
|
+
const newPermissions = (0, utils_2.permissionsDiff)(desiredPermissionsSetWithDynamic, oldPermissions);
|
|
2339
|
+
// TODO: The assumption that these are unused only holds so long as we do
|
|
2340
|
+
// not permit dynamic permission requests.
|
|
2341
|
+
const unusedPermissions = (0, utils_2.permissionsDiff)(oldPermissions, desiredPermissionsSetWithDynamic);
|
|
2312
2342
|
// It's a Set Intersection of oldPermissions and desiredPermissionsSet
|
|
2313
2343
|
// oldPermissions ∖ (oldPermissions ∖ desiredPermissionsSet) ⟺ oldPermissions ∩ desiredPermissionsSet
|
|
2314
2344
|
const approvedPermissions = (0, utils_2.permissionsDiff)(oldPermissions, unusedPermissions);
|
|
2315
2345
|
return { newPermissions, unusedPermissions, approvedPermissions };
|
|
2316
2346
|
}
|
|
2317
2347
|
#isSubjectConnectedToSnap(snapId, origin) {
|
|
2318
|
-
const subjectPermissions = this.
|
|
2348
|
+
const subjectPermissions = this.messenger.call('PermissionController:getPermissions', origin);
|
|
2319
2349
|
const existingCaveat = subjectPermissions?.[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds);
|
|
2320
2350
|
return Boolean(existingCaveat?.value?.[snapId]);
|
|
2321
2351
|
}
|
|
@@ -2335,46 +2365,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2335
2365
|
const approvedConnections = (0, utils_2.setDiff)(filteredOldConnections, unusedConnections);
|
|
2336
2366
|
return { newConnections, unusedConnections, approvedConnections };
|
|
2337
2367
|
}
|
|
2338
|
-
/**
|
|
2339
|
-
* Get the permissions to grant to a Snap following an install, update or
|
|
2340
|
-
* rollback.
|
|
2341
|
-
*
|
|
2342
|
-
* @param snapId - The snap ID.
|
|
2343
|
-
* @param newPermissions - The new permissions to be granted.
|
|
2344
|
-
* @returns The permissions to grant to the Snap.
|
|
2345
|
-
*/
|
|
2346
|
-
#getPermissionsToGrant(snapId, newPermissions) {
|
|
2347
|
-
if (Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
|
|
2348
|
-
// This will return the globally selected network if the Snap doesn't have
|
|
2349
|
-
// one set.
|
|
2350
|
-
const networkClientId = this.messagingSystem.call('SelectedNetworkController:getNetworkClientIdForDomain', snapId);
|
|
2351
|
-
const { configuration } = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
|
|
2352
|
-
const chainId = (0, utils_1.hexToNumber)(configuration.chainId);
|
|
2353
|
-
// This needs to be assigned to have proper type inference.
|
|
2354
|
-
const modifiedPermissions = {
|
|
2355
|
-
...newPermissions,
|
|
2356
|
-
'endowment:caip25': {
|
|
2357
|
-
caveats: [
|
|
2358
|
-
{
|
|
2359
|
-
type: 'authorizedScopes',
|
|
2360
|
-
value: {
|
|
2361
|
-
requiredScopes: {},
|
|
2362
|
-
optionalScopes: {
|
|
2363
|
-
[`eip155:${chainId}`]: {
|
|
2364
|
-
accounts: [],
|
|
2365
|
-
},
|
|
2366
|
-
},
|
|
2367
|
-
sessionProperties: {},
|
|
2368
|
-
isMultichainOrigin: false,
|
|
2369
|
-
},
|
|
2370
|
-
},
|
|
2371
|
-
],
|
|
2372
|
-
},
|
|
2373
|
-
};
|
|
2374
|
-
return modifiedPermissions;
|
|
2375
|
-
}
|
|
2376
|
-
return newPermissions;
|
|
2377
|
-
}
|
|
2378
2368
|
/**
|
|
2379
2369
|
* Update the permissions for a snap following an install, update or rollback.
|
|
2380
2370
|
*
|
|
@@ -2389,14 +2379,13 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2389
2379
|
#updatePermissions({ snapId, unusedPermissions = {}, newPermissions = {}, requestData, }) {
|
|
2390
2380
|
const unusedPermissionsKeys = Object.keys(unusedPermissions);
|
|
2391
2381
|
if ((0, utils_1.isNonEmptyArray)(unusedPermissionsKeys)) {
|
|
2392
|
-
this.
|
|
2382
|
+
this.messenger.call('PermissionController:revokePermissions', {
|
|
2393
2383
|
[snapId]: unusedPermissionsKeys,
|
|
2394
2384
|
});
|
|
2395
2385
|
}
|
|
2396
2386
|
if ((0, utils_1.isNonEmptyArray)(Object.keys(newPermissions))) {
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
approvedPermissions,
|
|
2387
|
+
this.messenger.call('PermissionController:grantPermissions', {
|
|
2388
|
+
approvedPermissions: newPermissions,
|
|
2400
2389
|
subject: { origin: snapId },
|
|
2401
2390
|
requestData,
|
|
2402
2391
|
});
|
|
@@ -2437,7 +2426,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2437
2426
|
#callLifecycleHooks(origin, handler) {
|
|
2438
2427
|
const snaps = this.getRunnableSnaps();
|
|
2439
2428
|
for (const { id } of snaps) {
|
|
2440
|
-
const hasLifecycleHooksEndowment = this.
|
|
2429
|
+
const hasLifecycleHooksEndowment = this.messenger.call('PermissionController:hasPermission', id, snaps_rpc_methods_1.SnapEndowments.LifecycleHooks);
|
|
2441
2430
|
if (!hasLifecycleHooksEndowment) {
|
|
2442
2431
|
continue;
|
|
2443
2432
|
}
|
|
@@ -2460,7 +2449,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2460
2449
|
async #callLifecycleHook(origin, snapId, handler) {
|
|
2461
2450
|
const permissionName = snaps_rpc_methods_1.handlerEndowments[handler];
|
|
2462
2451
|
(0, utils_1.assert)(permissionName, 'Lifecycle hook must have an endowment.');
|
|
2463
|
-
const hasPermission = this.
|
|
2452
|
+
const hasPermission = this.messenger.call('PermissionController:hasPermission', snapId, permissionName);
|
|
2464
2453
|
if (!hasPermission) {
|
|
2465
2454
|
return;
|
|
2466
2455
|
}
|