@pezkuwi/extension-base 0.62.10 → 0.62.13
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/LICENSE +201 -0
- package/background/RequestBytesSign.js +6 -9
- package/background/RequestExtrinsicSign.js +6 -9
- package/background/handlers/Extension.js +304 -460
- package/background/handlers/State.js +365 -619
- package/background/handlers/Tabs.js +155 -273
- package/background/handlers/helpers.js +1 -3
- package/background/handlers/index.js +17 -22
- package/background/handlers/subscriptions.js +5 -9
- package/background/index.js +0 -2
- package/background/types.js +0 -2
- package/bundle.js +0 -2
- package/cjs/background/RequestBytesSign.d.ts +12 -0
- package/cjs/background/RequestBytesSign.js +15 -0
- package/cjs/background/RequestExtrinsicSign.d.ts +12 -0
- package/cjs/background/RequestExtrinsicSign.js +14 -0
- package/cjs/background/handlers/Extension.d.ts +49 -0
- package/cjs/background/handlers/Extension.js +492 -0
- package/cjs/background/handlers/State.d.ts +96 -0
- package/cjs/background/handlers/State.js +482 -0
- package/cjs/background/handlers/Tabs.d.ts +25 -0
- package/cjs/background/handlers/Tabs.js +199 -0
- package/cjs/background/handlers/helpers.d.ts +1 -0
- package/cjs/background/handlers/helpers.js +14 -0
- package/cjs/background/handlers/index.d.ts +3 -0
- package/cjs/background/handlers/index.js +46 -0
- package/cjs/background/handlers/subscriptions.d.ts +3 -0
- package/cjs/background/handlers/subscriptions.js +22 -0
- package/cjs/background/index.d.ts +1 -0
- package/cjs/background/index.js +7 -0
- package/cjs/background/types.d.ts +343 -0
- package/cjs/background/types.js +2 -0
- package/cjs/bundle.d.ts +1 -0
- package/cjs/bundle.js +5 -0
- package/cjs/defaults.d.ts +9 -0
- package/cjs/defaults.js +16 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +4 -0
- package/cjs/package.json +3 -0
- package/cjs/packageDetect.d.ts +1 -0
- package/cjs/packageDetect.js +8 -0
- package/cjs/packageInfo.d.ts +6 -0
- package/cjs/packageInfo.js +4 -0
- package/cjs/page/Accounts.d.ts +7 -0
- package/cjs/page/Accounts.js +24 -0
- package/cjs/page/Injected.d.ts +13 -0
- package/cjs/page/Injected.js +25 -0
- package/cjs/page/Metadata.d.ts +7 -0
- package/cjs/page/Metadata.js +15 -0
- package/cjs/page/PostMessageProvider.d.ts +63 -0
- package/cjs/page/PostMessageProvider.js +135 -0
- package/cjs/page/Signer.d.ts +8 -0
- package/cjs/page/Signer.js +29 -0
- package/cjs/page/index.d.ts +16 -0
- package/cjs/page/index.js +52 -0
- package/cjs/page/types.d.ts +6 -0
- package/cjs/page/types.js +2 -0
- package/cjs/stores/Accounts.d.ts +6 -0
- package/cjs/stores/Accounts.js +21 -0
- package/cjs/stores/Base.d.ts +9 -0
- package/cjs/stores/Base.js +70 -0
- package/cjs/stores/Metadata.d.ts +5 -0
- package/cjs/stores/Metadata.js +13 -0
- package/cjs/stores/index.d.ts +2 -0
- package/cjs/stores/index.js +8 -0
- package/cjs/types.d.ts +9 -0
- package/cjs/types.js +2 -0
- package/cjs/utils/canDerive.d.ts +2 -0
- package/cjs/utils/canDerive.js +6 -0
- package/cjs/utils/getId.d.ts +1 -0
- package/cjs/utils/getId.js +8 -0
- package/cjs/utils/index.d.ts +1 -0
- package/cjs/utils/index.js +5 -0
- package/cjs/utils/portUtils.d.ts +13 -0
- package/cjs/utils/portUtils.js +49 -0
- package/defaults.js +10 -14
- package/index.js +0 -4
- package/package.json +464 -10
- package/packageDetect.js +0 -4
- package/packageInfo.js +1 -4
- package/page/Accounts.js +13 -18
- package/page/Injected.js +10 -10
- package/page/Metadata.js +8 -13
- package/page/PostMessageProvider.js +90 -192
- package/page/Signer.js +24 -90
- package/page/index.js +15 -72
- package/page/types.js +0 -2
- package/stores/Accounts.js +14 -80
- package/stores/Base.js +57 -240
- package/stores/Metadata.js +6 -26
- package/stores/index.js +0 -2
- package/types.js +0 -2
- package/utils/canDerive.js +0 -2
- package/utils/getId.js +2 -4
- package/utils/index.js +0 -2
- package/utils/portUtils.d.ts +0 -1
- package/utils/portUtils.js +31 -94
|
@@ -1,64 +1,3 @@
|
|
|
1
|
-
// Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
var __assign = (this && this.__assign) || function () {
|
|
4
|
-
__assign = Object.assign || function(t) {
|
|
5
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
6
|
-
s = arguments[i];
|
|
7
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
8
|
-
t[p] = s[p];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
return __assign.apply(this, arguments);
|
|
13
|
-
};
|
|
14
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
24
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
25
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
26
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
27
|
-
function step(op) {
|
|
28
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
29
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
30
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
31
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
32
|
-
switch (op[0]) {
|
|
33
|
-
case 0: case 1: t = op; break;
|
|
34
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
35
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
36
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
37
|
-
default:
|
|
38
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
39
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
40
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
41
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
42
|
-
if (t[2]) _.ops.pop();
|
|
43
|
-
_.trys.pop(); continue;
|
|
44
|
-
}
|
|
45
|
-
op = body.call(thisArg, _);
|
|
46
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
47
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
51
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
52
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
53
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
54
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
55
|
-
};
|
|
56
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
57
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
58
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
59
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
60
|
-
};
|
|
61
|
-
var _Tabs_accountSubs, _Tabs_state;
|
|
62
1
|
import { combineLatest } from 'rxjs';
|
|
63
2
|
import { checkIfDenied } from '@pezkuwi/phishing';
|
|
64
3
|
import { keyring } from '@pezkuwi/ui-keyring';
|
|
@@ -70,244 +9,187 @@ import RequestBytesSign from '../RequestBytesSign.js';
|
|
|
70
9
|
import RequestExtrinsicSign from '../RequestExtrinsicSign.js';
|
|
71
10
|
import { withErrorLog } from './helpers.js';
|
|
72
11
|
import { createSubscription, unsubscribe } from './subscriptions.js';
|
|
73
|
-
function transformAccounts(accounts, anyType) {
|
|
74
|
-
if (anyType === void 0) { anyType = false; }
|
|
12
|
+
function transformAccounts(accounts, anyType = false) {
|
|
75
13
|
return Object
|
|
76
14
|
.values(accounts)
|
|
77
|
-
.filter(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
.map(function (_a) {
|
|
87
|
-
var _b = _a.json, address = _b.address, _c = _b.meta, genesisHash = _c.genesisHash, name = _c.name, type = _a.type;
|
|
88
|
-
return ({
|
|
89
|
-
address: address,
|
|
90
|
-
genesisHash: genesisHash,
|
|
91
|
-
name: name,
|
|
92
|
-
type: type
|
|
93
|
-
});
|
|
94
|
-
});
|
|
15
|
+
.filter(({ json: { meta: { isHidden } } }) => !isHidden)
|
|
16
|
+
.filter(({ type }) => anyType ? true : canDerive(type))
|
|
17
|
+
.sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0))
|
|
18
|
+
.map(({ json: { address, meta: { genesisHash, name } }, type }) => ({
|
|
19
|
+
address,
|
|
20
|
+
genesisHash,
|
|
21
|
+
name,
|
|
22
|
+
type
|
|
23
|
+
}));
|
|
95
24
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
25
|
+
export default class Tabs {
|
|
26
|
+
#accountSubs = {};
|
|
27
|
+
#state;
|
|
28
|
+
constructor(state) {
|
|
29
|
+
this.#state = state;
|
|
101
30
|
}
|
|
102
|
-
|
|
103
|
-
|
|
31
|
+
filterForAuthorizedAccounts(accounts, url) {
|
|
32
|
+
const auth = this.#state.authUrls[this.#state.stripUrl(url)];
|
|
104
33
|
if (!auth) {
|
|
105
34
|
return [];
|
|
106
35
|
}
|
|
107
|
-
return accounts.filter(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
Tabs.prototype.accountsListAuthorized = function (url, _a) {
|
|
119
|
-
var anyType = _a.anyType;
|
|
120
|
-
var transformedAccounts = transformAccounts(accountsObservable.subject.getValue(), anyType);
|
|
36
|
+
return accounts.filter((allAcc) => auth.authorizedAccounts
|
|
37
|
+
// we have a list, use it
|
|
38
|
+
? auth.authorizedAccounts.includes(allAcc.address)
|
|
39
|
+
// if no authorizedAccounts and isAllowed return all - these are old converted urls
|
|
40
|
+
: auth.isAllowed);
|
|
41
|
+
}
|
|
42
|
+
authorize(url, request) {
|
|
43
|
+
return this.#state.authorizeUrl(url, request);
|
|
44
|
+
}
|
|
45
|
+
accountsListAuthorized(url, { anyType }) {
|
|
46
|
+
const transformedAccounts = transformAccounts(accountsObservable.subject.getValue(), anyType);
|
|
121
47
|
return this.filterForAuthorizedAccounts(transformedAccounts, url);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
var strippedUrl = __classPrivateFieldGet(this, _Tabs_state, "f").stripUrl(url);
|
|
128
|
-
var authUrlObservable = (_a = __classPrivateFieldGet(this, _Tabs_state, "f").authUrlSubjects[strippedUrl]) === null || _a === void 0 ? void 0 : _a.asObservable();
|
|
48
|
+
}
|
|
49
|
+
accountsSubscribeAuthorized(url, id, port) {
|
|
50
|
+
const cb = createSubscription(id, port);
|
|
51
|
+
const strippedUrl = this.#state.stripUrl(url);
|
|
52
|
+
const authUrlObservable = this.#state.authUrlSubjects[strippedUrl]?.asObservable();
|
|
129
53
|
if (!authUrlObservable) {
|
|
130
|
-
console.error(
|
|
54
|
+
console.error(`No authUrlSubject found for ${strippedUrl}`);
|
|
131
55
|
return id;
|
|
132
56
|
}
|
|
133
|
-
|
|
134
|
-
subscription: combineLatest([accountsObservable.subject, authUrlObservable]).subscribe(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
cb(_this.filterForAuthorizedAccounts(transformedAccounts, url));
|
|
57
|
+
this.#accountSubs[id] = {
|
|
58
|
+
subscription: combineLatest([accountsObservable.subject, authUrlObservable]).subscribe(([accounts, _authUrlInfo]) => {
|
|
59
|
+
const transformedAccounts = transformAccounts(accounts);
|
|
60
|
+
cb(this.filterForAuthorizedAccounts(transformedAccounts, url));
|
|
138
61
|
}),
|
|
139
|
-
url
|
|
62
|
+
url
|
|
140
63
|
};
|
|
141
|
-
port.onDisconnect.addListener(
|
|
142
|
-
|
|
64
|
+
port.onDisconnect.addListener(() => {
|
|
65
|
+
this.accountsUnsubscribe(url, { id });
|
|
143
66
|
});
|
|
144
67
|
return id;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
var sub = __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
|
|
68
|
+
}
|
|
69
|
+
accountsUnsubscribe(url, { id }) {
|
|
70
|
+
const sub = this.#accountSubs[id];
|
|
149
71
|
if (!sub || sub.url !== url) {
|
|
150
72
|
return false;
|
|
151
73
|
}
|
|
152
|
-
delete
|
|
74
|
+
delete this.#accountSubs[id];
|
|
153
75
|
unsubscribe(id);
|
|
154
76
|
sub.subscription.unsubscribe();
|
|
155
77
|
return true;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
78
|
+
}
|
|
79
|
+
getSigningPair(address) {
|
|
80
|
+
const pair = keyring.getPair(address);
|
|
159
81
|
assert(pair, 'Unable to find keypair');
|
|
160
82
|
return pair;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
return __generator(this, function (_a) {
|
|
198
|
-
switch (_a.label) {
|
|
199
|
-
case 0:
|
|
200
|
-
innerCb = createSubscription(id, port);
|
|
201
|
-
cb = function (_error, data) { return innerCb(data); };
|
|
202
|
-
return [4 /*yield*/, __classPrivateFieldGet(this, _Tabs_state, "f").rpcSubscribe(request, cb, port)];
|
|
203
|
-
case 1:
|
|
204
|
-
subscriptionId = _a.sent();
|
|
205
|
-
port.onDisconnect.addListener(function () {
|
|
206
|
-
unsubscribe(id);
|
|
207
|
-
withErrorLog(function () { return _this.rpcUnsubscribe(__assign(__assign({}, request), { subscriptionId: subscriptionId }), port); });
|
|
208
|
-
});
|
|
209
|
-
return [2 /*return*/, true];
|
|
210
|
-
}
|
|
211
|
-
});
|
|
83
|
+
}
|
|
84
|
+
bytesSign(url, request) {
|
|
85
|
+
const address = request.address;
|
|
86
|
+
const pair = this.getSigningPair(address);
|
|
87
|
+
return this.#state.sign(url, new RequestBytesSign(request), { address, ...pair.meta });
|
|
88
|
+
}
|
|
89
|
+
extrinsicSign(url, request) {
|
|
90
|
+
const address = request.address;
|
|
91
|
+
const pair = this.getSigningPair(address);
|
|
92
|
+
return this.#state.sign(url, new RequestExtrinsicSign(request), { address, ...pair.meta });
|
|
93
|
+
}
|
|
94
|
+
metadataProvide(url, request) {
|
|
95
|
+
return this.#state.injectMetadata(url, request);
|
|
96
|
+
}
|
|
97
|
+
metadataList(_url) {
|
|
98
|
+
return this.#state.knownMetadata.map(({ genesisHash, specVersion }) => ({
|
|
99
|
+
genesisHash,
|
|
100
|
+
specVersion
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
rpcListProviders() {
|
|
104
|
+
return this.#state.rpcListProviders();
|
|
105
|
+
}
|
|
106
|
+
rpcSend(request, port) {
|
|
107
|
+
return this.#state.rpcSend(request, port);
|
|
108
|
+
}
|
|
109
|
+
rpcStartProvider(key, port) {
|
|
110
|
+
return this.#state.rpcStartProvider(key, port);
|
|
111
|
+
}
|
|
112
|
+
async rpcSubscribe(request, id, port) {
|
|
113
|
+
const innerCb = createSubscription(id, port);
|
|
114
|
+
const cb = (_error, data) => innerCb(data);
|
|
115
|
+
const subscriptionId = await this.#state.rpcSubscribe(request, cb, port);
|
|
116
|
+
port.onDisconnect.addListener(() => {
|
|
117
|
+
unsubscribe(id);
|
|
118
|
+
withErrorLog(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port));
|
|
212
119
|
});
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
rpcSubscribeConnected(request, id, port) {
|
|
123
|
+
const innerCb = createSubscription(id, port);
|
|
124
|
+
const cb = (_error, data) => innerCb(data);
|
|
125
|
+
this.#state.rpcSubscribeConnected(request, cb, port);
|
|
126
|
+
port.onDisconnect.addListener(() => {
|
|
219
127
|
unsubscribe(id);
|
|
220
128
|
});
|
|
221
129
|
return Promise.resolve(true);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
var nonFragment = phishingWebsite.split('#')[0];
|
|
232
|
-
var encodedWebsite = encodeURIComponent(nonFragment);
|
|
233
|
-
var url = "".concat(chrome.runtime.getURL('index.html'), "#").concat(PHISHING_PAGE_REDIRECT, "/").concat(encodedWebsite);
|
|
234
|
-
chrome.tabs.query({ url: nonFragment }, function (tabs) {
|
|
130
|
+
}
|
|
131
|
+
async rpcUnsubscribe(request, port) {
|
|
132
|
+
return this.#state.rpcUnsubscribe(request, port);
|
|
133
|
+
}
|
|
134
|
+
redirectPhishingLanding(phishingWebsite) {
|
|
135
|
+
const nonFragment = phishingWebsite.split('#')[0];
|
|
136
|
+
const encodedWebsite = encodeURIComponent(nonFragment);
|
|
137
|
+
const url = `${chrome.runtime.getURL('index.html')}#${PHISHING_PAGE_REDIRECT}/${encodedWebsite}`;
|
|
138
|
+
chrome.tabs.query({ url: nonFragment }, (tabs) => {
|
|
235
139
|
tabs
|
|
236
|
-
.map(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
})
|
|
240
|
-
.filter(function (id) { return isNumber(id); })
|
|
241
|
-
.forEach(function (id) {
|
|
242
|
-
return withErrorLog(function () { return chrome.tabs.update(id, { url: url }); });
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
};
|
|
246
|
-
Tabs.prototype.redirectIfPhishing = function (url) {
|
|
247
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
248
|
-
var isInDenyList;
|
|
249
|
-
return __generator(this, function (_a) {
|
|
250
|
-
switch (_a.label) {
|
|
251
|
-
case 0: return [4 /*yield*/, checkIfDenied(url)];
|
|
252
|
-
case 1:
|
|
253
|
-
isInDenyList = _a.sent();
|
|
254
|
-
if (isInDenyList) {
|
|
255
|
-
this.redirectPhishingLanding(url);
|
|
256
|
-
return [2 /*return*/, true];
|
|
257
|
-
}
|
|
258
|
-
return [2 /*return*/, false];
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
};
|
|
263
|
-
Tabs.prototype.handle = function (id, type, request, url, port) {
|
|
264
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
265
|
-
return __generator(this, function (_a) {
|
|
266
|
-
if (type === 'pub(phishing.redirectIfDenied)') {
|
|
267
|
-
return [2 /*return*/, this.redirectIfPhishing(url)];
|
|
268
|
-
}
|
|
269
|
-
if (type !== 'pub(authorize.tab)') {
|
|
270
|
-
__classPrivateFieldGet(this, _Tabs_state, "f").ensureUrlAuthorized(url);
|
|
271
|
-
}
|
|
272
|
-
switch (type) {
|
|
273
|
-
case 'pub(authorize.tab)':
|
|
274
|
-
return [2 /*return*/, this.authorize(url, request)];
|
|
275
|
-
case 'pub(accounts.list)':
|
|
276
|
-
return [2 /*return*/, this.accountsListAuthorized(url, request)];
|
|
277
|
-
case 'pub(accounts.subscribe)':
|
|
278
|
-
return [2 /*return*/, port && this.accountsSubscribeAuthorized(url, id, port)];
|
|
279
|
-
case 'pub(accounts.unsubscribe)':
|
|
280
|
-
return [2 /*return*/, this.accountsUnsubscribe(url, request)];
|
|
281
|
-
case 'pub(bytes.sign)':
|
|
282
|
-
return [2 /*return*/, this.bytesSign(url, request)];
|
|
283
|
-
case 'pub(extrinsic.sign)':
|
|
284
|
-
return [2 /*return*/, this.extrinsicSign(url, request)];
|
|
285
|
-
case 'pub(metadata.list)':
|
|
286
|
-
return [2 /*return*/, this.metadataList(url)];
|
|
287
|
-
case 'pub(metadata.provide)':
|
|
288
|
-
return [2 /*return*/, this.metadataProvide(url, request)];
|
|
289
|
-
case 'pub(ping)':
|
|
290
|
-
return [2 /*return*/, Promise.resolve(true)];
|
|
291
|
-
case 'pub(rpc.listProviders)':
|
|
292
|
-
return [2 /*return*/, this.rpcListProviders()];
|
|
293
|
-
case 'pub(rpc.send)':
|
|
294
|
-
return [2 /*return*/, port && this.rpcSend(request, port)];
|
|
295
|
-
case 'pub(rpc.startProvider)':
|
|
296
|
-
return [2 /*return*/, port && this.rpcStartProvider(request, port)];
|
|
297
|
-
case 'pub(rpc.subscribe)':
|
|
298
|
-
return [2 /*return*/, port && this.rpcSubscribe(request, id, port)];
|
|
299
|
-
case 'pub(rpc.subscribeConnected)':
|
|
300
|
-
return [2 /*return*/, port && this.rpcSubscribeConnected(request, id, port)];
|
|
301
|
-
case 'pub(rpc.unsubscribe)':
|
|
302
|
-
return [2 /*return*/, port && this.rpcUnsubscribe(request, port)];
|
|
303
|
-
default:
|
|
304
|
-
throw new Error("Unable to handle message of type ".concat(type));
|
|
305
|
-
}
|
|
306
|
-
return [2 /*return*/];
|
|
307
|
-
});
|
|
140
|
+
.map(({ id }) => id)
|
|
141
|
+
.filter((id) => isNumber(id))
|
|
142
|
+
.forEach((id) => withErrorLog(() => chrome.tabs.update(id, { url })));
|
|
308
143
|
});
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
144
|
+
}
|
|
145
|
+
async redirectIfPhishing(url) {
|
|
146
|
+
const isInDenyList = await checkIfDenied(url);
|
|
147
|
+
if (isInDenyList) {
|
|
148
|
+
this.redirectPhishingLanding(url);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
async handle(id, type, request, url, port) {
|
|
154
|
+
if (type === 'pub(phishing.redirectIfDenied)') {
|
|
155
|
+
return this.redirectIfPhishing(url);
|
|
156
|
+
}
|
|
157
|
+
if (type !== 'pub(authorize.tab)') {
|
|
158
|
+
this.#state.ensureUrlAuthorized(url);
|
|
159
|
+
}
|
|
160
|
+
switch (type) {
|
|
161
|
+
case 'pub(authorize.tab)':
|
|
162
|
+
return this.authorize(url, request);
|
|
163
|
+
case 'pub(accounts.list)':
|
|
164
|
+
return this.accountsListAuthorized(url, request);
|
|
165
|
+
case 'pub(accounts.subscribe)':
|
|
166
|
+
return port && this.accountsSubscribeAuthorized(url, id, port);
|
|
167
|
+
case 'pub(accounts.unsubscribe)':
|
|
168
|
+
return this.accountsUnsubscribe(url, request);
|
|
169
|
+
case 'pub(bytes.sign)':
|
|
170
|
+
return this.bytesSign(url, request);
|
|
171
|
+
case 'pub(extrinsic.sign)':
|
|
172
|
+
return this.extrinsicSign(url, request);
|
|
173
|
+
case 'pub(metadata.list)':
|
|
174
|
+
return this.metadataList(url);
|
|
175
|
+
case 'pub(metadata.provide)':
|
|
176
|
+
return this.metadataProvide(url, request);
|
|
177
|
+
case 'pub(ping)':
|
|
178
|
+
return Promise.resolve(true);
|
|
179
|
+
case 'pub(rpc.listProviders)':
|
|
180
|
+
return this.rpcListProviders();
|
|
181
|
+
case 'pub(rpc.send)':
|
|
182
|
+
return port && this.rpcSend(request, port);
|
|
183
|
+
case 'pub(rpc.startProvider)':
|
|
184
|
+
return port && this.rpcStartProvider(request, port);
|
|
185
|
+
case 'pub(rpc.subscribe)':
|
|
186
|
+
return port && this.rpcSubscribe(request, id, port);
|
|
187
|
+
case 'pub(rpc.subscribeConnected)':
|
|
188
|
+
return port && this.rpcSubscribeConnected(request, id, port);
|
|
189
|
+
case 'pub(rpc.unsubscribe)':
|
|
190
|
+
return port && this.rpcUnsubscribe(request, port);
|
|
191
|
+
default:
|
|
192
|
+
throw new Error(`Unable to handle message of type ${type}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
// Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
1
|
export function withErrorLog(fn) {
|
|
4
2
|
try {
|
|
5
|
-
|
|
3
|
+
const p = fn();
|
|
6
4
|
if (p && typeof p === 'object' && typeof p.catch === 'function') {
|
|
7
5
|
p.catch(console.error);
|
|
8
6
|
}
|
|
@@ -1,45 +1,40 @@
|
|
|
1
|
-
// Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
1
|
import { assert } from '@pezkuwi/util';
|
|
4
2
|
import { PORT_EXTENSION } from '../../defaults.js';
|
|
5
3
|
import Extension from './Extension.js';
|
|
6
4
|
import State from './State.js';
|
|
7
5
|
import Tabs from './Tabs.js';
|
|
8
6
|
export { withErrorLog } from './helpers.js';
|
|
9
|
-
|
|
7
|
+
const state = new State();
|
|
10
8
|
await state.init();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export default function handler(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (extensionPortName === void 0) { extensionPortName = PORT_EXTENSION; }
|
|
17
|
-
var isExtension = !port || (port === null || port === void 0 ? void 0 : port.name) === extensionPortName;
|
|
18
|
-
var sender = port === null || port === void 0 ? void 0 : port.sender;
|
|
9
|
+
const extension = new Extension(state);
|
|
10
|
+
const tabs = new Tabs(state);
|
|
11
|
+
export default function handler({ id, message, request }, port, extensionPortName = PORT_EXTENSION) {
|
|
12
|
+
const isExtension = !port || port?.name === extensionPortName;
|
|
13
|
+
const sender = port?.sender;
|
|
19
14
|
if (!isExtension && !sender) {
|
|
20
15
|
throw new Error('Unable to extract message sender');
|
|
21
16
|
}
|
|
22
|
-
|
|
17
|
+
const from = isExtension
|
|
23
18
|
? 'extension'
|
|
24
|
-
:
|
|
25
|
-
|
|
26
|
-
console.log(
|
|
27
|
-
|
|
19
|
+
: sender?.url || sender?.tab?.url || '<unknown>';
|
|
20
|
+
const source = `${from}: ${id}: ${message}`;
|
|
21
|
+
console.log(` [in] ${source}`); // :: ${JSON.stringify(request)}`);
|
|
22
|
+
const promise = isExtension
|
|
28
23
|
? extension.handle(id, message, request, port)
|
|
29
24
|
: tabs.handle(id, message, request, from, port);
|
|
30
25
|
promise
|
|
31
|
-
.then(
|
|
32
|
-
console.log(
|
|
26
|
+
.then((response) => {
|
|
27
|
+
console.log(`[out] ${source}`); // :: ${JSON.stringify(response)}`);
|
|
33
28
|
// between the start and the end of the promise, the user may have closed
|
|
34
29
|
// the tab, in which case port will be undefined
|
|
35
30
|
assert(port, 'Port has been disconnected');
|
|
36
|
-
port.postMessage({ id
|
|
31
|
+
port.postMessage({ id, response });
|
|
37
32
|
})
|
|
38
|
-
.catch(
|
|
39
|
-
console.log(
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
console.log(`[err] ${source}:: ${error.message}`);
|
|
40
35
|
// only send message back to port if it's still connected
|
|
41
36
|
if (port) {
|
|
42
|
-
port.postMessage({ error: error.message, id
|
|
37
|
+
port.postMessage({ error: error.message, id });
|
|
43
38
|
}
|
|
44
39
|
});
|
|
45
40
|
}
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
var subscriptions = {};
|
|
4
|
-
// return a subscription callback, that will send the data to the caller via the port
|
|
1
|
+
const subscriptions = {};
|
|
5
2
|
export function createSubscription(id, port) {
|
|
6
3
|
subscriptions[id] = port;
|
|
7
|
-
return
|
|
4
|
+
return (subscription) => {
|
|
8
5
|
if (subscriptions[id]) {
|
|
9
|
-
port.postMessage({ id
|
|
6
|
+
port.postMessage({ id, subscription });
|
|
10
7
|
}
|
|
11
8
|
};
|
|
12
9
|
}
|
|
13
|
-
// clear a previous subscriber
|
|
14
10
|
export function unsubscribe(id) {
|
|
15
11
|
if (subscriptions[id]) {
|
|
16
|
-
console.log(
|
|
12
|
+
console.log(`Unsubscribing from ${id}`);
|
|
17
13
|
delete subscriptions[id];
|
|
18
14
|
}
|
|
19
15
|
else {
|
|
20
|
-
console.error(
|
|
16
|
+
console.error(`Unable to unsubscribe from ${id}`);
|
|
21
17
|
}
|
|
22
18
|
}
|
package/background/index.js
CHANGED
package/background/types.js
CHANGED
package/bundle.js
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { KeyringPair } from '@pezkuwi/keyring/types';
|
|
2
|
+
import type { TypeRegistry } from '@pezkuwi/types';
|
|
3
|
+
import type { SignerPayloadRaw } from '@pezkuwi/types/types';
|
|
4
|
+
import type { HexString } from '@pezkuwi/util/types';
|
|
5
|
+
import type { RequestSign } from './types.js';
|
|
6
|
+
export default class RequestBytesSign implements RequestSign {
|
|
7
|
+
readonly payload: SignerPayloadRaw;
|
|
8
|
+
constructor(payload: SignerPayloadRaw);
|
|
9
|
+
sign(_registry: TypeRegistry, pair: KeyringPair): {
|
|
10
|
+
signature: HexString;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const util_1 = require("@pezkuwi/util");
|
|
4
|
+
class RequestBytesSign {
|
|
5
|
+
payload;
|
|
6
|
+
constructor(payload) {
|
|
7
|
+
this.payload = payload;
|
|
8
|
+
}
|
|
9
|
+
sign(_registry, pair) {
|
|
10
|
+
return {
|
|
11
|
+
signature: (0, util_1.u8aToHex)(pair.sign((0, util_1.u8aWrapBytes)(this.payload.data)))
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.default = RequestBytesSign;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { KeyringPair } from '@pezkuwi/keyring/types';
|
|
2
|
+
import type { TypeRegistry } from '@pezkuwi/types';
|
|
3
|
+
import type { SignerPayloadJSON } from '@pezkuwi/types/types';
|
|
4
|
+
import type { HexString } from '@pezkuwi/util/types';
|
|
5
|
+
import type { RequestSign } from './types.js';
|
|
6
|
+
export default class RequestExtrinsicSign implements RequestSign {
|
|
7
|
+
readonly payload: SignerPayloadJSON;
|
|
8
|
+
constructor(payload: SignerPayloadJSON);
|
|
9
|
+
sign(registry: TypeRegistry, pair: KeyringPair): {
|
|
10
|
+
signature: HexString;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class RequestExtrinsicSign {
|
|
4
|
+
payload;
|
|
5
|
+
constructor(payload) {
|
|
6
|
+
this.payload = payload;
|
|
7
|
+
}
|
|
8
|
+
sign(registry, pair) {
|
|
9
|
+
return registry
|
|
10
|
+
.createType('ExtrinsicPayload', this.payload, { version: this.payload.version })
|
|
11
|
+
.sign(pair);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.default = RequestExtrinsicSign;
|