@trezor/connect 9.6.2-beta.3 → 9.6.3-beta.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 +15 -6
- package/README.md +1 -1
- package/lib/api/applySettings.js +16 -1
- package/lib/api/bitcoin/signtx.d.ts +2 -2
- package/lib/api/bitcoin/signtx.js +1 -1
- package/lib/api/bleUnpair.js +0 -1
- package/lib/api/cardano/api/cardanoGetAddress.d.ts +1 -0
- package/lib/api/cardano/api/cardanoSignMessage.d.ts +25 -0
- package/lib/api/cardano/api/cardanoSignMessage.js +97 -0
- package/lib/api/cardano/api/index.d.ts +1 -0
- package/lib/api/cardano/api/index.js +3 -1
- package/lib/api/cardano/cardanoUtils.d.ts +1 -1
- package/lib/api/cardano/cardanoUtils.js +2 -2
- package/lib/api/discoverAccounts.js +61 -33
- package/lib/api/ethereum/api/ethereumGetAddress.js +1 -0
- package/lib/api/ethereum/api/ethereumSignTransaction.js +22 -4
- package/lib/api/ethereum/ethereumSignTx.d.ts +3 -2
- package/lib/api/ethereum/ethereumSignTx.js +4 -2
- package/lib/api/evoluGetNode.d.ts +11 -0
- package/lib/api/evoluGetNode.js +26 -0
- package/lib/api/firmware/calculateFirmwareHash.d.ts +2 -1
- package/lib/api/firmware/calculateFirmwareHash.js +17 -4
- package/lib/api/firmware/getBinary.d.ts +7 -6
- package/lib/api/firmware/getBinary.js +18 -6
- package/lib/api/firmware/index.d.ts +0 -2
- package/lib/api/firmware/index.js +1 -5
- package/lib/api/firmware/uploadFirmware.d.ts +10 -1
- package/lib/api/firmware/uploadFirmware.js +8 -7
- package/lib/api/getFeatures.d.ts +2 -1
- package/lib/api/index.d.ts +3 -0
- package/lib/api/index.js +8 -2
- package/lib/api/nem/nemSignTx.d.ts +1 -1
- package/lib/api/pushTransaction.d.ts +2 -1
- package/lib/api/pushTransaction.js +2 -1
- package/lib/api/resetDevice.js +2 -1
- package/lib/api/ripple/api/rippleGetAddress.d.ts +1 -0
- package/lib/api/signMessage.js +1 -1
- package/lib/api/signTransaction.d.ts +1 -1
- package/lib/api/solana/api/solanaGetAddress.d.ts +1 -0
- package/lib/api/solana/api/solanaGetPublicKey.d.ts +2 -0
- package/lib/api/solana/api/solanaGetPublicKey.js +3 -0
- package/lib/api/stellar/api/stellarGetAddress.d.ts +1 -0
- package/lib/api/tezos/api/tezosGetAddress.d.ts +1 -0
- package/lib/api/tezos/tezosSignTx.d.ts +1 -1
- package/lib/api/thpGetCredentials.d.ts +10 -0
- package/lib/api/thpGetCredentials.js +31 -0
- package/lib/api/thpRemoveCredentials.d.ts +8 -0
- package/lib/api/thpRemoveCredentials.js +32 -0
- package/lib/api/wipeDevice.js +6 -2
- package/lib/backend/Blockchain.d.ts +4 -4
- package/lib/backend/Blockchain.js +12 -11
- package/lib/constants/cardano.d.ts +3 -0
- package/lib/constants/cardano.js +5 -1
- package/lib/constants/errors.d.ts +12 -9
- package/lib/constants/errors.js +18 -24
- package/lib/core/AbstractMethod.d.ts +5 -24
- package/lib/core/AbstractMethod.js +2 -2
- package/lib/core/index.js +5 -1
- package/lib/core/onCallFirmwareUpdate.d.ts +13 -1
- package/lib/core/onCallFirmwareUpdate.js +158 -94
- package/lib/data/DataManager.d.ts +13 -1
- package/lib/data/DataManager.js +44 -14
- package/lib/data/coinInfo.d.ts +8 -84
- package/lib/data/coinInfo.js +6 -9
- package/lib/data/config.d.ts +26 -192
- package/lib/data/config.js +37 -1
- package/lib/data/connectSettings.js +7 -0
- package/lib/data/defaultFeeLevels.js +2 -1
- package/lib/data/deviceAuthenticityConfig.js +10 -1
- package/lib/data/firmwareInfo.d.ts +44 -11
- package/lib/data/firmwareInfo.js +360 -122
- package/lib/data/thpSettings.js +5 -2
- package/lib/data/version.d.ts +2 -1
- package/lib/data/version.js +4 -3
- package/lib/device/Device.d.ts +17 -7
- package/lib/device/Device.js +72 -115
- package/lib/device/DeviceCommands.d.ts +1 -0
- package/lib/device/DeviceCurrentSession.d.ts +41 -20
- package/lib/device/DeviceCurrentSession.js +18 -22
- package/lib/device/TransportList.js +10 -5
- package/lib/device/checkFirmwareRevision.d.ts +3 -2
- package/lib/device/checkFirmwareRevision.js +6 -11
- package/lib/device/thp/handshake.d.ts +4 -0
- package/lib/device/thp/handshake.js +88 -0
- package/lib/device/thp/index.d.ts +4 -1
- package/lib/device/thp/index.js +24 -6
- package/lib/device/thp/pairing.d.ts +16 -0
- package/lib/device/thp/pairing.js +230 -0
- package/lib/device/thp/session.d.ts +3 -0
- package/lib/device/thp/session.js +27 -0
- package/lib/device/thp/thpCall.d.ts +41 -0
- package/lib/device/thp/thpCall.js +57 -0
- package/lib/device/workflow/checkFirmwareHash.d.ts +10 -0
- package/lib/device/workflow/checkFirmwareHash.js +79 -0
- package/lib/device/workflow/checkFirmwareHashWithRetries.d.ts +9 -0
- package/lib/device/workflow/checkFirmwareHashWithRetries.js +41 -0
- package/lib/device/workflow/handshake.js +7 -6
- package/lib/device/workflow/validateState.js +53 -10
- package/lib/events/ui-request.d.ts +1 -1
- package/lib/factory.js +4 -0
- package/lib/tsconfig.lib.tsbuildinfo +1 -1
- package/lib/types/api/bitcoin/index.d.ts +1 -1
- package/lib/types/api/cardano/index.d.ts +62 -1
- package/lib/types/api/cardano/index.js +30 -1
- package/lib/types/api/cardanoSignMessage.d.ts +4 -0
- package/lib/types/api/cardanoSignMessage.js +3 -0
- package/lib/types/api/discoverAccounts.d.ts +17 -12
- package/lib/types/api/ethereum/index.d.ts +108 -0
- package/lib/types/api/ethereum/index.js +3 -0
- package/lib/types/api/evoluGetNode.d.ts +4 -0
- package/lib/types/api/evoluGetNode.js +3 -0
- package/lib/types/api/index.d.ts +8 -0
- package/lib/types/api/pushTransaction.d.ts +4 -1
- package/lib/types/api/pushTransaction.js +7 -1
- package/lib/types/api/solana/index.d.ts +3 -0
- package/lib/types/api/solana/index.js +2 -0
- package/lib/types/api/thpGetCredentials.d.ts +4 -0
- package/lib/types/api/thpGetCredentials.js +3 -0
- package/lib/types/api/thpRemoveCredentials.d.ts +7 -0
- package/lib/types/api/thpRemoveCredentials.js +3 -0
- package/lib/types/device.d.ts +9 -9
- package/lib/types/firmware.d.ts +15 -12
- package/lib/types/firmware.js +0 -3
- package/lib/types/params.d.ts +1 -0
- package/lib/types/settings.d.ts +7 -0
- package/lib/utils/assetUtils.d.ts +5 -2
- package/lib/utils/assetUtils.js +14 -18
- package/lib/utils/assets.native.js +0 -2
- package/lib/utils/firmwareReleaseConfigUtils.d.ts +8 -5
- package/lib/utils/firmwareReleaseConfigUtils.js +74 -59
- package/lib/utils/firmwareUtils.d.ts +8 -4
- package/lib/utils/firmwareUtils.js +62 -20
- package/lib/utils/formatUtils.d.ts +1 -0
- package/lib/utils/formatUtils.js +3 -2
- package/package.json +19 -18
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +0 -12
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.js +0 -32
- package/lib/data/getLanguage.d.ts +0 -6
- package/lib/data/getLanguage.js +0 -10
package/lib/data/firmwareInfo.js
CHANGED
|
@@ -1,170 +1,408 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getFirmwareLocation = exports.getFirmwareStatus = exports.getFirmwareReleaseConfigInfo = exports.getReleaseInfo = exports.getLanguage = exports.initializeFirmwareConfig = exports.createRemoteFirmwareConfig = exports.createLocalFirmwareConfig = exports.getReleaseByVersion = exports.getReleaseConfig = exports.getOnlineReleaseByVersion = exports.getBundledRelease = exports.getOnlineFirmwareBaseUrl = void 0;
|
|
4
4
|
const device_utils_1 = require("@trezor/device-utils");
|
|
5
5
|
const utils_1 = require("@trezor/utils");
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
const DataManager_1 = require("./DataManager");
|
|
8
|
+
const assetUtils_1 = require("../utils/assetUtils");
|
|
6
9
|
const assets_1 = require("../utils/assets");
|
|
7
10
|
const firmwareUtils_1 = require("../utils/firmwareUtils");
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
const RELEASES_URL_REMOTE_BASE = {
|
|
12
|
+
BASE_URL: 'https://data.trezor.io',
|
|
13
|
+
MIDDLE_PATH: 'firmware',
|
|
14
|
+
};
|
|
15
|
+
const UNSIGNED_URL_REMOTE_BASE = {
|
|
16
|
+
BASE_URL: 'https://data.trezor.io',
|
|
17
|
+
MIDDLE_PATH: 'dev/firmware/releases/unsigned',
|
|
18
|
+
};
|
|
19
|
+
const SIGNED_URL_REMOTE_BASE = {
|
|
20
|
+
BASE_URL: 'https://suite.corp.sldev.cz',
|
|
21
|
+
MIDDLE_PATH: 'firmware/signed',
|
|
22
|
+
};
|
|
23
|
+
const SIGNED_LOCALHOST = {
|
|
24
|
+
BASE_URL: 'http://localhost:3000',
|
|
25
|
+
MIDDLE_PATH: 'firmware/signed',
|
|
26
|
+
};
|
|
27
|
+
const UNSIGNED_LOCALHOST = {
|
|
28
|
+
BASE_URL: 'http://localhost:3000',
|
|
29
|
+
MIDDLE_PATH: 'firmware/unsigned',
|
|
30
|
+
};
|
|
31
|
+
const FIRMWARE_REMOTE_BASE_URLS = {
|
|
32
|
+
production: RELEASES_URL_REMOTE_BASE,
|
|
33
|
+
'test-unsigned': UNSIGNED_URL_REMOTE_BASE,
|
|
34
|
+
'test-signed': SIGNED_URL_REMOTE_BASE,
|
|
35
|
+
'localhost-unsigned': UNSIGNED_LOCALHOST,
|
|
36
|
+
'localhost-signed': SIGNED_LOCALHOST,
|
|
18
37
|
};
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
38
|
+
const getOnlineFirmwareBaseUrl = () => {
|
|
39
|
+
const firmwareUpdateSource = DataManager_1.DataManager.getSettings('firmwareUpdateSource');
|
|
40
|
+
if (!firmwareUpdateSource) {
|
|
41
|
+
return {
|
|
42
|
+
...FIRMWARE_REMOTE_BASE_URLS['production'],
|
|
43
|
+
env: 'production',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...FIRMWARE_REMOTE_BASE_URLS[firmwareUpdateSource],
|
|
48
|
+
env: firmwareUpdateSource,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
exports.getOnlineFirmwareBaseUrl = getOnlineFirmwareBaseUrl;
|
|
52
|
+
const getBundledFirmwareVersion = (deviceModel, firmwareType) => {
|
|
53
|
+
const localFirmwareReleaseConfig = DataManager_1.DataManager.getLocalFirmwareReleaseConfig();
|
|
54
|
+
const modelReleases = localFirmwareReleaseConfig.releases[deviceModel];
|
|
55
|
+
const bundledRelease = modelReleases?.[firmwareType];
|
|
56
|
+
if (!bundledRelease) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const bundledVersion = bundledRelease.releasePath.match(/(\d+\.\d+\.\d+)/);
|
|
60
|
+
if (!bundledVersion) {
|
|
61
|
+
throw new Error('Fimrware bundled version was not found.');
|
|
62
|
+
}
|
|
63
|
+
return bundledVersion[0];
|
|
64
|
+
};
|
|
65
|
+
const getBundledRelease = (deviceModel, firmwareType) => {
|
|
66
|
+
const version = getBundledFirmwareVersion(deviceModel, firmwareType);
|
|
67
|
+
if (!version) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const versionArray = utils_1.versionUtils.tryParse(version);
|
|
71
|
+
if (!versionArray) {
|
|
72
|
+
throw new Error('There was error parsing bundled release.');
|
|
73
|
+
}
|
|
74
|
+
return (0, assetUtils_1.getReleaseAsset)(deviceModel, versionArray, firmwareType);
|
|
75
|
+
};
|
|
76
|
+
exports.getBundledRelease = getBundledRelease;
|
|
77
|
+
const getOnlineReleaseByPath = async (releasePath) => {
|
|
78
|
+
const onlineFirmwareBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
|
|
79
|
+
const url = `${onlineFirmwareBaseUrl.BASE_URL}/${releasePath}`;
|
|
24
80
|
const response = await (0, assets_1.httpRequest)(url, 'json', {
|
|
25
81
|
signal: AbortSignal.timeout(10000),
|
|
26
82
|
skipLocalForceDownload: true,
|
|
27
83
|
});
|
|
28
|
-
|
|
29
|
-
|
|
84
|
+
return response;
|
|
85
|
+
};
|
|
86
|
+
const getOnlineReleaseByVersion = async (deviceModel, firmwareVersion, firmwareType) => {
|
|
87
|
+
const onlineFirmwareBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
|
|
88
|
+
const firmwareTypeFileString = firmwareType === types_1.FirmwareType.BitcoinOnly ? 'bitcoinonly' : 'universal';
|
|
89
|
+
const relaseJsonFilename = `${deviceModel.toLowerCase()}-${firmwareVersion.join('.')}-${firmwareTypeFileString}.json`;
|
|
90
|
+
const origin = `${onlineFirmwareBaseUrl.MIDDLE_PATH}/${deviceModel.toLowerCase()}/${firmwareTypeFileString}`;
|
|
91
|
+
const releasePath = `${origin}/${relaseJsonFilename}`;
|
|
92
|
+
const onlineRelease = await getOnlineReleaseByPath(releasePath);
|
|
93
|
+
if (!onlineRelease || !utils_1.versionUtils.isEqual(onlineRelease.version, firmwareVersion)) {
|
|
94
|
+
return;
|
|
30
95
|
}
|
|
31
|
-
return
|
|
96
|
+
return onlineRelease;
|
|
32
97
|
};
|
|
33
|
-
exports.
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
98
|
+
exports.getOnlineReleaseByVersion = getOnlineReleaseByVersion;
|
|
99
|
+
const getReleaseConfig = (features, firmwareType) => {
|
|
100
|
+
const { internal_model } = features;
|
|
101
|
+
if (internal_model === device_utils_1.DeviceModelInternal.UNKNOWN) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
const firmwareReleaseConfig = DataManager_1.DataManager.getFirmwareReleaseConfig();
|
|
105
|
+
if (!firmwareReleaseConfig) {
|
|
106
|
+
throw new Error('Firmware release config not loaded.');
|
|
107
|
+
}
|
|
108
|
+
const deviceMessageRelease = firmwareReleaseConfig[internal_model];
|
|
109
|
+
if (!deviceMessageRelease) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
return deviceMessageRelease[firmwareType];
|
|
113
|
+
};
|
|
114
|
+
exports.getReleaseConfig = getReleaseConfig;
|
|
115
|
+
const getReleaseByVersion = async (features, firmwareVersion, firmwareType) => {
|
|
116
|
+
const deviceModel = features.internal_model;
|
|
117
|
+
const tryGetRelease = async (getter) => {
|
|
118
|
+
try {
|
|
119
|
+
return await getter();
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const releaseFromConfig = (0, exports.getReleaseConfig)(features, firmwareType)?.release;
|
|
126
|
+
if (releaseFromConfig && utils_1.versionUtils.isEqual(firmwareVersion, releaseFromConfig.version)) {
|
|
127
|
+
return releaseFromConfig;
|
|
128
|
+
}
|
|
129
|
+
const release = (await tryGetRelease(() => (0, assetUtils_1.getReleaseAsset)(deviceModel, firmwareVersion, firmwareType))) ||
|
|
130
|
+
(await tryGetRelease(() => (0, exports.getOnlineReleaseByVersion)(deviceModel, firmwareVersion, firmwareType)));
|
|
131
|
+
if (release && utils_1.versionUtils.isEqual(release.version, firmwareVersion)) {
|
|
132
|
+
return release;
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
};
|
|
136
|
+
exports.getReleaseByVersion = getReleaseByVersion;
|
|
137
|
+
const createLocalFirmwareConfig = (baseConfig) => {
|
|
138
|
+
const releaseEntries = Object.entries(baseConfig.releases)
|
|
139
|
+
.map(([deviceModel, modelReleases]) => {
|
|
140
|
+
const modelKey = deviceModel;
|
|
141
|
+
if (modelKey === device_utils_1.DeviceModelInternal.UNKNOWN)
|
|
37
142
|
return null;
|
|
143
|
+
const { 'bitcoin-only': bitcoinOnlyConfig, universal: universalConfig } = modelReleases ?? {};
|
|
144
|
+
if (!bitcoinOnlyConfig?.releasePath || !universalConfig?.releasePath)
|
|
145
|
+
return null;
|
|
146
|
+
const btcOnlyRelease = (0, exports.getBundledRelease)(modelKey, types_1.FirmwareType.BitcoinOnly);
|
|
147
|
+
const universalRelease = (0, exports.getBundledRelease)(modelKey, types_1.FirmwareType.Universal);
|
|
148
|
+
if (!btcOnlyRelease || !universalRelease)
|
|
149
|
+
return null;
|
|
150
|
+
const releases = {
|
|
151
|
+
[types_1.FirmwareType.BitcoinOnly]: { ...bitcoinOnlyConfig, release: btcOnlyRelease },
|
|
152
|
+
[types_1.FirmwareType.Universal]: { ...universalConfig, release: universalRelease },
|
|
153
|
+
};
|
|
154
|
+
return [modelKey, releases];
|
|
155
|
+
})
|
|
156
|
+
.filter(entry => entry !== null);
|
|
157
|
+
return Object.fromEntries(releaseEntries);
|
|
158
|
+
};
|
|
159
|
+
exports.createLocalFirmwareConfig = createLocalFirmwareConfig;
|
|
160
|
+
const createRemoteFirmwareConfig = async (config) => {
|
|
161
|
+
const releaseEntryPromises = Object.entries(config.releases).map(async ([deviceModel, modelReleases]) => {
|
|
162
|
+
const modelKey = deviceModel;
|
|
163
|
+
if (modelKey === device_utils_1.DeviceModelInternal.UNKNOWN)
|
|
164
|
+
return null;
|
|
165
|
+
const { 'bitcoin-only': bitcoinOnlyConfig, universal: universalConfig } = modelReleases ?? {};
|
|
166
|
+
if (!bitcoinOnlyConfig?.releasePath || !universalConfig?.releasePath)
|
|
167
|
+
return null;
|
|
168
|
+
const [bitcoinOnlyRelease, universalRelease] = await Promise.all([
|
|
169
|
+
getOnlineReleaseByPath(bitcoinOnlyConfig.releasePath),
|
|
170
|
+
getOnlineReleaseByPath(universalConfig.releasePath),
|
|
171
|
+
]);
|
|
172
|
+
if (!universalRelease || !bitcoinOnlyRelease)
|
|
173
|
+
return null;
|
|
174
|
+
const releases = {
|
|
175
|
+
[types_1.FirmwareType.BitcoinOnly]: {
|
|
176
|
+
...bitcoinOnlyConfig,
|
|
177
|
+
release: bitcoinOnlyRelease,
|
|
178
|
+
},
|
|
179
|
+
[types_1.FirmwareType.Universal]: { ...universalConfig, release: universalRelease },
|
|
180
|
+
};
|
|
181
|
+
return [modelKey, releases];
|
|
182
|
+
});
|
|
183
|
+
const validEntries = (await Promise.all(releaseEntryPromises)).filter(entry => entry !== null);
|
|
184
|
+
return Object.fromEntries(validEntries);
|
|
185
|
+
};
|
|
186
|
+
exports.createRemoteFirmwareConfig = createRemoteFirmwareConfig;
|
|
187
|
+
const initializeFirmwareConfig = async (config, isRemote) => {
|
|
188
|
+
if (isRemote) {
|
|
189
|
+
try {
|
|
190
|
+
const remoteReleases = await (0, exports.createRemoteFirmwareConfig)(config);
|
|
191
|
+
return {
|
|
192
|
+
releases: remoteReleases,
|
|
193
|
+
intermediaries: config.intermediaries,
|
|
194
|
+
};
|
|
38
195
|
}
|
|
39
|
-
|
|
40
|
-
return releases2.filter(r => utils_1.versionUtils.isNewer(r.version, [
|
|
41
|
-
features.fw_major,
|
|
42
|
-
features.fw_minor,
|
|
43
|
-
features.fw_patch,
|
|
44
|
-
]));
|
|
196
|
+
catch {
|
|
45
197
|
}
|
|
46
|
-
return releases2;
|
|
47
198
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
199
|
+
const localFirmwareReleaseConfig = DataManager_1.DataManager.getLocalFirmwareReleaseConfig();
|
|
200
|
+
const localReleases = (0, exports.createLocalFirmwareConfig)(localFirmwareReleaseConfig);
|
|
201
|
+
return {
|
|
202
|
+
releases: localReleases,
|
|
203
|
+
intermediaries: localFirmwareReleaseConfig.intermediaries,
|
|
204
|
+
};
|
|
53
205
|
};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const getIntermediaryVersion = (releases2, features, offerLatest) => {
|
|
80
|
-
if (features.major_version !== 1 || offerLatest) {
|
|
81
|
-
return;
|
|
206
|
+
exports.initializeFirmwareConfig = initializeFirmwareConfig;
|
|
207
|
+
const getLanguage = (languageBinPath) => {
|
|
208
|
+
const baseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
|
|
209
|
+
const url = `${baseUrl.BASE_URL}/${languageBinPath}`;
|
|
210
|
+
return (0, assets_1.httpRequest)(url, 'binary');
|
|
211
|
+
};
|
|
212
|
+
exports.getLanguage = getLanguage;
|
|
213
|
+
const getCurrentVersion = (features) => {
|
|
214
|
+
if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
|
|
215
|
+
throw new Error('Features of unexpected shape provided.');
|
|
216
|
+
}
|
|
217
|
+
const { bootloader_mode, major_version, minor_version, patch_version, fw_major, fw_minor, fw_patch, } = features;
|
|
218
|
+
const fw_version = [fw_major, fw_minor, fw_patch];
|
|
219
|
+
const version = [major_version, minor_version, patch_version];
|
|
220
|
+
const bootloaderVersion = bootloader_mode ? version : null;
|
|
221
|
+
const fwVersion = bootloader_mode ? fw_version : version;
|
|
222
|
+
return {
|
|
223
|
+
bootloaderVersion,
|
|
224
|
+
firmwareVersion: fwVersion.includes(null) ? null : fwVersion,
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
const getIntermediaryMessageRelease = (features) => {
|
|
228
|
+
const config = DataManager_1.DataManager.getFirmwareIntermediaryReleaseConfig();
|
|
229
|
+
if (!config) {
|
|
230
|
+
throw new Error('Firmware release config not loaded.');
|
|
82
231
|
}
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
232
|
+
const deviceIntermediaryReleases = config[features.internal_model];
|
|
233
|
+
if (!deviceIntermediaryReleases || deviceIntermediaryReleases.length === 0) {
|
|
234
|
+
return;
|
|
86
235
|
}
|
|
87
|
-
|
|
88
|
-
|
|
236
|
+
const { bootloaderVersion, firmwareVersion } = getCurrentVersion(features);
|
|
237
|
+
const currentVersion = features.bootloader_mode ? bootloaderVersion : firmwareVersion;
|
|
238
|
+
const minVersionKey = features.bootloader_mode
|
|
239
|
+
? 'min_bootloader_version'
|
|
240
|
+
: 'min_firmware_version';
|
|
241
|
+
if (!currentVersion) {
|
|
242
|
+
return undefined;
|
|
89
243
|
}
|
|
90
|
-
return
|
|
244
|
+
return deviceIntermediaryReleases.find(release => utils_1.versionUtils.isNewer(release[minVersionKey], currentVersion));
|
|
91
245
|
};
|
|
92
|
-
const
|
|
93
|
-
const {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
if (major_version === 2 && bootloader_mode) {
|
|
99
|
-
const fwVersion = [fw_major, fw_minor, fw_patch];
|
|
100
|
-
if (utils_1.versionUtils.isVersionArray(fwVersion)) {
|
|
101
|
-
return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, fwVersion);
|
|
102
|
-
}
|
|
103
|
-
return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion);
|
|
246
|
+
const getIsBitcoinOnlyAvailable = (features) => {
|
|
247
|
+
const { internal_model } = features;
|
|
248
|
+
if (internal_model === device_utils_1.DeviceModelInternal.UNKNOWN) {
|
|
249
|
+
return false;
|
|
104
250
|
}
|
|
105
|
-
|
|
106
|
-
|
|
251
|
+
const firmwareReleaseConfig = DataManager_1.DataManager.getFirmwareReleaseConfig();
|
|
252
|
+
if (!firmwareReleaseConfig) {
|
|
253
|
+
throw new Error('Firmware release config not loaded.');
|
|
107
254
|
}
|
|
108
|
-
|
|
255
|
+
const deviceMessageRelease = firmwareReleaseConfig[internal_model];
|
|
256
|
+
return !!deviceMessageRelease && !!deviceMessageRelease[types_1.FirmwareType.BitcoinOnly];
|
|
109
257
|
};
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
258
|
+
const isValidConditionalRelease = (release) => !!(release.version && release.min_firmware_version && release.min_bootloader_version);
|
|
259
|
+
const calculateShouldOfferRelease = (rolloutProbability, deviceId) => {
|
|
260
|
+
if (rolloutProbability < 0 || rolloutProbability > 100) {
|
|
261
|
+
throw new Error('Probability must be between 0 and 100.');
|
|
262
|
+
}
|
|
263
|
+
if (deviceId === null) {
|
|
264
|
+
return rolloutProbability > 0;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const deterministicValueToCompare = (0, utils_1.getIntegerInRangeFromString)(deviceId, 101);
|
|
268
|
+
return deterministicValueToCompare < rolloutProbability;
|
|
113
269
|
}
|
|
270
|
+
};
|
|
271
|
+
const getReleaseInfo = ({ features, release, conditions, intermediary, firmwareType, isBitcoinOnlyAvailable, }) => {
|
|
114
272
|
if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
|
|
115
273
|
throw new Error('Features of unexpected shape provided.');
|
|
116
274
|
}
|
|
117
|
-
if (!(
|
|
275
|
+
if (!isValidConditionalRelease(release)) {
|
|
118
276
|
throw new Error(`Release object in unexpected shape.`);
|
|
119
277
|
}
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
278
|
+
const { min_firmware_version, min_bootloader_version, required } = release;
|
|
279
|
+
let isNewer = false;
|
|
280
|
+
let requiresIntermediary = false;
|
|
281
|
+
if (features.bootloader_mode && release.bootloader_version) {
|
|
282
|
+
const { bootloaderVersion, firmwareVersion } = getCurrentVersion(features);
|
|
283
|
+
if (utils_1.versionUtils.isVersionArray(firmwareVersion)) {
|
|
284
|
+
isNewer = utils_1.versionUtils.isNewer(release.version, firmwareVersion);
|
|
285
|
+
requiresIntermediary = utils_1.versionUtils.isNewer(min_firmware_version, firmwareVersion);
|
|
286
|
+
}
|
|
287
|
+
else if (utils_1.versionUtils.isVersionArray(bootloaderVersion)) {
|
|
288
|
+
isNewer = utils_1.versionUtils.isNewer(release.bootloader_version, bootloaderVersion);
|
|
289
|
+
requiresIntermediary = utils_1.versionUtils.isNewer(min_bootloader_version, bootloaderVersion);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
throw new Error('Version is not version array.');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
const { firmwareVersion } = getCurrentVersion(features);
|
|
297
|
+
if (!utils_1.versionUtils.isVersionArray(firmwareVersion)) {
|
|
298
|
+
throw new Error('Firmware version is not version array.');
|
|
299
|
+
}
|
|
300
|
+
isNewer = utils_1.versionUtils.isNewer(release.version, firmwareVersion);
|
|
301
|
+
requiresIntermediary = utils_1.versionUtils.isNewer(min_firmware_version, firmwareVersion);
|
|
302
|
+
}
|
|
303
|
+
const { rollout_probability } = conditions;
|
|
304
|
+
const shouldBeOffered = calculateShouldOfferRelease(rollout_probability, features.device_id);
|
|
305
|
+
if (requiresIntermediary && intermediary) {
|
|
306
|
+
isNewer = true;
|
|
307
|
+
}
|
|
131
308
|
return {
|
|
132
|
-
|
|
309
|
+
firmwareType,
|
|
310
|
+
isBitcoinOnlyAvailable,
|
|
311
|
+
releaseConditions: {
|
|
312
|
+
...conditions,
|
|
313
|
+
shouldBeOffered,
|
|
314
|
+
},
|
|
133
315
|
release,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
translations:
|
|
316
|
+
intermediary: requiresIntermediary ? intermediary : undefined,
|
|
317
|
+
isRequired: required,
|
|
318
|
+
isNewer,
|
|
319
|
+
translations: release.translations,
|
|
138
320
|
};
|
|
139
321
|
};
|
|
140
|
-
exports.
|
|
141
|
-
const
|
|
322
|
+
exports.getReleaseInfo = getReleaseInfo;
|
|
323
|
+
const getFirmwareReleaseConfigInfo = (features, firmwareType) => {
|
|
324
|
+
const deviceMessageRelease = (0, exports.getReleaseConfig)(features, firmwareType);
|
|
325
|
+
if (!deviceMessageRelease?.release) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const { release, conditions, firmware_type } = deviceMessageRelease;
|
|
329
|
+
const currentVersion = getCurrentVersion(features);
|
|
330
|
+
const inBootloaderMode = features.bootloader_mode && !!currentVersion.bootloaderVersion;
|
|
331
|
+
const versionContext = inBootloaderMode
|
|
332
|
+
? {
|
|
333
|
+
version: currentVersion.bootloaderVersion,
|
|
334
|
+
minVersionKey: 'min_bootloader_version',
|
|
335
|
+
}
|
|
336
|
+
: {
|
|
337
|
+
version: currentVersion.firmwareVersion,
|
|
338
|
+
minVersionKey: 'min_firmware_version',
|
|
339
|
+
};
|
|
340
|
+
const isCompatible = versionContext.version &&
|
|
341
|
+
utils_1.versionUtils.isNewerOrEqual(versionContext.version, release[versionContext.minVersionKey]);
|
|
342
|
+
let suitableRelease = release;
|
|
343
|
+
if (!isCompatible) {
|
|
344
|
+
const alternativeRelease = (0, firmwareUtils_1.findBestCompatibleRelease)((0, assetUtils_1.getReleasesAssetByDeviceModelAndFirmwareType)(features.internal_model, firmwareType), currentVersion, versionContext.minVersionKey);
|
|
345
|
+
if (alternativeRelease) {
|
|
346
|
+
suitableRelease = alternativeRelease;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const intermediary = getIntermediaryMessageRelease(features);
|
|
350
|
+
const finalTargetRelease = intermediary ? release : suitableRelease;
|
|
351
|
+
return (0, exports.getReleaseInfo)({
|
|
352
|
+
isBitcoinOnlyAvailable: getIsBitcoinOnlyAvailable(features),
|
|
353
|
+
features,
|
|
354
|
+
release: finalTargetRelease,
|
|
355
|
+
conditions,
|
|
356
|
+
intermediary,
|
|
357
|
+
firmwareType: firmware_type,
|
|
358
|
+
});
|
|
359
|
+
};
|
|
360
|
+
exports.getFirmwareReleaseConfigInfo = getFirmwareReleaseConfigInfo;
|
|
361
|
+
const getFirmwareStatus = (features, firmwareType) => {
|
|
142
362
|
if (features.firmware_present === false) {
|
|
143
363
|
return 'none';
|
|
144
364
|
}
|
|
145
365
|
if (features.major_version === 1 && features.bootloader_mode) {
|
|
146
366
|
return 'unknown';
|
|
147
367
|
}
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
releases: (0, exports.getReleases)(features?.internal_model),
|
|
151
|
-
});
|
|
152
|
-
if (!info)
|
|
368
|
+
const releaseInfo = (0, exports.getFirmwareReleaseConfigInfo)(features, firmwareType);
|
|
369
|
+
if (!releaseInfo)
|
|
153
370
|
return 'custom';
|
|
154
|
-
if (
|
|
371
|
+
if (releaseInfo.isRequired)
|
|
155
372
|
return 'required';
|
|
156
|
-
if (
|
|
373
|
+
if (releaseInfo.isNewer)
|
|
157
374
|
return 'outdated';
|
|
158
375
|
return 'valid';
|
|
159
376
|
};
|
|
160
377
|
exports.getFirmwareStatus = getFirmwareStatus;
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
378
|
+
const getFirmwareLocation = ({ firmwareVersion, remotePath, deviceModel, firmwareType, intermediaryVersion, }) => {
|
|
379
|
+
const firmwareName = intermediaryVersion
|
|
380
|
+
? (0, firmwareUtils_1.buildIntermediaryFirmwareFileName)(deviceModel, intermediaryVersion)
|
|
381
|
+
: (0, firmwareUtils_1.buildLocalFirmwareFileName)(firmwareType, deviceModel, firmwareVersion);
|
|
382
|
+
const versionString = firmwareVersion.join('.');
|
|
383
|
+
const bundledBaseUrl = (0, utils_1.removeTrailingSlashes)(DataManager_1.DataManager.getSettings('binFilesBaseUrl'));
|
|
384
|
+
const isRealBundled = !bundledBaseUrl.includes('data.trezor.io');
|
|
385
|
+
const bundledVersion = getBundledFirmwareVersion(deviceModel, firmwareType);
|
|
386
|
+
const isIntermediary = bundledBaseUrl && intermediaryVersion;
|
|
387
|
+
const isMatchingBundledVersion = bundledBaseUrl && isRealBundled && bundledVersion === versionString;
|
|
388
|
+
if (isIntermediary || isMatchingBundledVersion) {
|
|
389
|
+
return {
|
|
390
|
+
baseUrl: bundledBaseUrl,
|
|
391
|
+
path: `firmware/${deviceModel.toLowerCase()}/${firmwareName}`,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
const { firmwareDir, firmwareList } = DataManager_1.DataManager.getLocalFirmwares();
|
|
395
|
+
if (firmwareList.includes(firmwareName)) {
|
|
396
|
+
return {
|
|
397
|
+
baseUrl: firmwareDir,
|
|
398
|
+
path: firmwareName,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
const onlineBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
|
|
402
|
+
return {
|
|
403
|
+
baseUrl: onlineBaseUrl.BASE_URL,
|
|
404
|
+
path: remotePath,
|
|
405
|
+
};
|
|
406
|
+
};
|
|
407
|
+
exports.getFirmwareLocation = getFirmwareLocation;
|
|
170
408
|
//# sourceMappingURL=firmwareInfo.js.map
|
package/lib/data/thpSettings.js
CHANGED
|
@@ -14,8 +14,11 @@ const parseThpSettings = ({ manifest, thp }) => {
|
|
|
14
14
|
if (typeof thp?.hostName === 'string') {
|
|
15
15
|
settings.hostName = thp.hostName;
|
|
16
16
|
}
|
|
17
|
+
if (typeof thp?.appName === 'string') {
|
|
18
|
+
settings.appName = thp.appName;
|
|
19
|
+
}
|
|
17
20
|
else if (typeof manifest?.appName === 'string') {
|
|
18
|
-
settings.
|
|
21
|
+
settings.appName = manifest?.appName;
|
|
19
22
|
}
|
|
20
23
|
if (typeof thp?.staticKey === 'string') {
|
|
21
24
|
settings.staticKey = thp.staticKey;
|
|
@@ -25,7 +28,7 @@ const parseThpSettings = ({ manifest, thp }) => {
|
|
|
25
28
|
if (k &&
|
|
26
29
|
typeof k === 'object' &&
|
|
27
30
|
typeof k.credential === 'string' &&
|
|
28
|
-
typeof k.
|
|
31
|
+
typeof k.trezor_static_public_key === 'string') {
|
|
29
32
|
return k;
|
|
30
33
|
}
|
|
31
34
|
return [];
|
package/lib/data/version.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export declare const VERSION = "9.6.
|
|
1
|
+
export declare const VERSION = "9.6.3-beta.1";
|
|
2
|
+
export declare const DEFAULT_DOMAIN_MAJOR_VER: string;
|
|
2
3
|
export declare const DEFAULT_DOMAIN: string;
|
|
3
4
|
export declare const CONTENT_SCRIPT_VERSION = 1;
|
|
4
5
|
export declare const DEEPLINK_VERSION = 1;
|
package/lib/data/version.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEEPLINK_VERSION = exports.CONTENT_SCRIPT_VERSION = exports.DEFAULT_DOMAIN = exports.VERSION = void 0;
|
|
4
|
-
exports.VERSION = '9.6.
|
|
3
|
+
exports.DEEPLINK_VERSION = exports.CONTENT_SCRIPT_VERSION = exports.DEFAULT_DOMAIN = exports.DEFAULT_DOMAIN_MAJOR_VER = exports.VERSION = void 0;
|
|
4
|
+
exports.VERSION = '9.6.3-beta.1';
|
|
5
5
|
const versionN = exports.VERSION.split('.').map(s => parseInt(s, 10));
|
|
6
6
|
const isBeta = exports.VERSION.includes('beta');
|
|
7
|
+
exports.DEFAULT_DOMAIN_MAJOR_VER = `https://connect.trezor.io/${versionN[0]}/`;
|
|
7
8
|
exports.DEFAULT_DOMAIN = isBeta
|
|
8
9
|
? `https://connect.trezor.io/${exports.VERSION}/`
|
|
9
|
-
:
|
|
10
|
+
: exports.DEFAULT_DOMAIN_MAJOR_VER;
|
|
10
11
|
exports.CONTENT_SCRIPT_VERSION = 1;
|
|
11
12
|
exports.DEEPLINK_VERSION = 1;
|
|
12
13
|
//# sourceMappingURL=version.js.map
|