@oxy.so/core 4.5.0-oxy-one.1 → 4.6.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/README.md +1 -1
- package/dist/cjs/HttpService.js +63 -19
- package/dist/cjs/api/accounts.js +10 -3
- package/dist/cjs/api/agency.js +3 -1
- package/dist/cjs/api/apps.js +15 -4
- package/dist/cjs/api/assets.js +39 -11
- package/dist/cjs/api/auth.js +28 -8
- package/dist/cjs/api/billing.js +24 -7
- package/dist/cjs/api/civic.js +14 -4
- package/dist/cjs/api/follows.js +9 -2
- package/dist/cjs/api/identity.js +31 -9
- package/dist/cjs/api/nodes.js +3 -1
- package/dist/cjs/api/privacy.js +8 -2
- package/dist/cjs/api/session.js +15 -4
- package/dist/cjs/api/store.js +15 -5
- package/dist/cjs/api/topics.js +10 -3
- package/dist/cjs/api/users.js +16 -4
- package/dist/cjs/boot/sessionColdBoot.js +40 -13
- package/dist/cjs/constants/version.js +6 -6
- package/dist/cjs/crypto/identityMarker.js +3 -1
- package/dist/cjs/crypto/identityProof.js +6 -1
- package/dist/cjs/crypto/keyManager.js +87 -32
- package/dist/cjs/crypto/recoveryPhrase.js +2 -2
- package/dist/cjs/crypto/signatureService.js +3 -4
- package/dist/cjs/i18n/index.js +16 -3
- package/dist/cjs/i18n/locales/ar-SA.js +366 -366
- package/dist/cjs/i18n/locales/ca-ES.js +366 -366
- package/dist/cjs/i18n/locales/de-DE.js +366 -366
- package/dist/cjs/i18n/locales/en-US.js +1994 -1994
- package/dist/cjs/i18n/locales/es-ES.js +1994 -1994
- package/dist/cjs/i18n/locales/fr-FR.js +366 -366
- package/dist/cjs/i18n/locales/it-IT.js +366 -366
- package/dist/cjs/i18n/locales/ja-JP.js +366 -366
- package/dist/cjs/i18n/locales/ko-KR.js +366 -366
- package/dist/cjs/i18n/locales/pt-PT.js +366 -366
- package/dist/cjs/i18n/locales/zh-CN.js +366 -366
- package/dist/cjs/inference/OxyInferenceClient.js +12 -18
- package/dist/cjs/models/interfaces.js +11 -11
- package/dist/cjs/server/OxyServer.js +86 -28
- package/dist/cjs/server/agentAccount.js +6 -2
- package/dist/cjs/server/aliaMachineCredential.js +39 -14
- package/dist/cjs/server/auth.js +5 -4
- package/dist/cjs/server/capabilityTicket.js +5 -5
- package/dist/cjs/server/index.js +2 -1
- package/dist/cjs/server/liveCapabilityTicket.js +4 -1
- package/dist/cjs/server/middleware.js +61 -42
- package/dist/cjs/server/namespaces.js +28 -7
- package/dist/cjs/server/requesterAssertion.js +36 -30
- package/dist/cjs/server/serviceTokenLifetime.js +7 -4
- package/dist/cjs/server/traffic.js +53 -14
- package/dist/cjs/server/trafficNodeHttp.js +33 -8
- package/dist/cjs/server/workloadIdentity.client.js +4 -0
- package/dist/cjs/server/workloadIdentity.js +28 -1
- package/dist/cjs/session/SessionClient.js +54 -17
- package/dist/cjs/session/accountDelegationAccess.js +4 -6
- package/dist/cjs/session/accountDialogController.js +1 -1
- package/dist/cjs/session/authStateStore.js +18 -9
- package/dist/cjs/session/identityPin.js +6 -2
- package/dist/cjs/session/refresh.js +81 -23
- package/dist/cjs/session/sharedDeviceCredential.js +28 -15
- package/dist/cjs/shared/utils/errorUtils.js +1 -1
- package/dist/cjs/shared/utils/networkUtils.js +1 -1
- package/dist/cjs/shared/utils/themeUtils.js +1 -1
- package/dist/cjs/utils/accountCacheSweep.js +3 -1
- package/dist/cjs/utils/accountUtils.js +1 -3
- package/dist/cjs/utils/asyncUtils.js +1 -1
- package/dist/cjs/utils/authHelpers.js +2 -1
- package/dist/cjs/utils/avatarUtils.js +4 -2
- package/dist/cjs/utils/cache.js +1 -1
- package/dist/cjs/utils/cacheKey.js +3 -1
- package/dist/cjs/utils/deviceManager.js +4 -4
- package/dist/cjs/utils/errorUtils.js +6 -4
- package/dist/cjs/utils/languageUtils.js +404 -57
- package/dist/cjs/utils/profileLinks.js +1 -3
- package/dist/cjs/utils/requestUtils.js +7 -1
- package/dist/cjs/utils/userIdentity.js +1 -1
- package/dist/cjs/utils/validationUtils.js +5 -6
- package/dist/esm/HttpService.js +64 -20
- package/dist/esm/api/accounts.js +11 -4
- package/dist/esm/api/agency.js +3 -1
- package/dist/esm/api/apps.js +15 -4
- package/dist/esm/api/assets.js +39 -11
- package/dist/esm/api/auth.js +28 -8
- package/dist/esm/api/billing.js +25 -8
- package/dist/esm/api/civic.js +14 -4
- package/dist/esm/api/follows.js +9 -2
- package/dist/esm/api/identity.js +31 -9
- package/dist/esm/api/nodes.js +3 -1
- package/dist/esm/api/privacy.js +8 -2
- package/dist/esm/api/session.js +15 -4
- package/dist/esm/api/store.js +15 -5
- package/dist/esm/api/topics.js +10 -3
- package/dist/esm/api/users.js +16 -4
- package/dist/esm/boot/sessionColdBoot.js +41 -14
- package/dist/esm/constants/version.js +6 -6
- package/dist/esm/crypto/identityMarker.js +3 -1
- package/dist/esm/crypto/identityProof.js +6 -1
- package/dist/esm/crypto/internal.js +1 -1
- package/dist/esm/crypto/keyManager.js +87 -32
- package/dist/esm/crypto/recoveryPhrase.js +2 -2
- package/dist/esm/crypto/signatureService.js +3 -4
- package/dist/esm/i18n/index.js +16 -3
- package/dist/esm/i18n/locales/ar-SA.js +366 -366
- package/dist/esm/i18n/locales/ca-ES.js +366 -366
- package/dist/esm/i18n/locales/de-DE.js +366 -366
- package/dist/esm/i18n/locales/en-US.js +1994 -1994
- package/dist/esm/i18n/locales/es-ES.js +1994 -1994
- package/dist/esm/i18n/locales/fr-FR.js +366 -366
- package/dist/esm/i18n/locales/it-IT.js +366 -366
- package/dist/esm/i18n/locales/ja-JP.js +366 -366
- package/dist/esm/i18n/locales/ko-KR.js +366 -366
- package/dist/esm/i18n/locales/pt-PT.js +366 -366
- package/dist/esm/i18n/locales/zh-CN.js +366 -366
- package/dist/esm/index.js +1 -1
- package/dist/esm/inference/OxyInferenceClient.js +13 -19
- package/dist/esm/models/interfaces.js +11 -11
- package/dist/esm/server/OxyServer.js +87 -29
- package/dist/esm/server/agentAccount.js +6 -2
- package/dist/esm/server/aliaMachineCredential.js +39 -14
- package/dist/esm/server/auth.js +6 -5
- package/dist/esm/server/capabilityTicket.js +6 -6
- package/dist/esm/server/index.js +5 -5
- package/dist/esm/server/liveCapabilityTicket.js +6 -3
- package/dist/esm/server/middleware.js +62 -43
- package/dist/esm/server/namespaces.js +31 -10
- package/dist/esm/server/requesterAssertion.js +36 -30
- package/dist/esm/server/serviceTokenLifetime.js +7 -4
- package/dist/esm/server/traffic.js +55 -16
- package/dist/esm/server/trafficNodeHttp.js +34 -9
- package/dist/esm/server/userInvalidation.js +1 -1
- package/dist/esm/server/workloadIdentity.client.js +3 -0
- package/dist/esm/server/workloadIdentity.js +27 -1
- package/dist/esm/session/SessionClient.js +54 -17
- package/dist/esm/session/accountDelegationAccess.js +5 -7
- package/dist/esm/session/accountDialogController.js +1 -1
- package/dist/esm/session/authStateStore.js +18 -9
- package/dist/esm/session/identityPin.js +6 -2
- package/dist/esm/session/refresh.js +82 -24
- package/dist/esm/session/sharedDeviceCredential.js +28 -15
- package/dist/esm/shared/utils/errorUtils.js +1 -1
- package/dist/esm/shared/utils/networkUtils.js +1 -1
- package/dist/esm/shared/utils/themeUtils.js +1 -1
- package/dist/esm/utils/accountCacheSweep.js +3 -1
- package/dist/esm/utils/accountUtils.js +1 -3
- package/dist/esm/utils/asyncUtils.js +1 -1
- package/dist/esm/utils/authHelpers.js +2 -1
- package/dist/esm/utils/avatarUtils.js +4 -2
- package/dist/esm/utils/cache.js +1 -1
- package/dist/esm/utils/cacheKey.js +3 -1
- package/dist/esm/utils/deviceManager.js +4 -4
- package/dist/esm/utils/errorUtils.js +6 -4
- package/dist/esm/utils/languageUtils.js +404 -57
- package/dist/esm/utils/profileLinks.js +1 -3
- package/dist/esm/utils/requestUtils.js +7 -1
- package/dist/esm/utils/userIdentity.js +1 -1
- package/dist/esm/utils/validationUtils.js +5 -6
- package/dist/types/HttpService.d.ts +1 -1
- package/dist/types/api/accounts.d.ts +16 -3
- package/dist/types/api/apps.d.ts +4 -4
- package/dist/types/crypto/internal.d.ts +1 -1
- package/dist/types/index.d.ts +4 -4
- package/dist/types/models/interfaces.d.ts +9 -1
- package/dist/types/server/index.d.ts +6 -6
- package/dist/types/server/workloadIdentity.client.d.ts +5 -1
- package/dist/types/server/workloadIdentity.d.ts +26 -0
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/index.d.ts +1 -1
- package/dist/types/utils/userIdentity.d.ts +1 -1
- package/dist/types/utils/validationUtils.d.ts +4 -5
- package/package.json +3 -4
- package/src/HttpService.ts +183 -53
- package/src/OxyServices.errors.ts +7 -3
- package/src/OxyServices.ts +6 -2
- package/src/api/accounts.ts +96 -28
- package/src/api/agency.ts +24 -9
- package/src/api/appData.ts +12 -2
- package/src/api/apps.ts +81 -31
- package/src/api/assets.ts +113 -43
- package/src/api/auth.ts +145 -77
- package/src/api/billing.ts +112 -65
- package/src/api/civic.ts +61 -19
- package/src/api/contacts.ts +4 -1
- package/src/api/devices.ts +54 -21
- package/src/api/follows.ts +88 -31
- package/src/api/identity.ts +101 -33
- package/src/api/linkedAccounts.ts +26 -8
- package/src/api/nodes.ts +18 -6
- package/src/api/notifications.ts +26 -6
- package/src/api/privacy.ts +42 -8
- package/src/api/reputation.ts +18 -7
- package/src/api/session.ts +23 -5
- package/src/api/store.ts +81 -31
- package/src/api/topics.ts +18 -6
- package/src/api/users.ts +98 -35
- package/src/boot/sessionColdBoot.ts +60 -19
- package/src/civic/payloads.ts +1 -4
- package/src/client/context.ts +6 -1
- package/src/constants/version.ts +7 -6
- package/src/crypto/aead.ts +1 -5
- package/src/crypto/ecdh.ts +1 -4
- package/src/crypto/identityDerivations.ts +5 -1
- package/src/crypto/identityMarker.ts +3 -1
- package/src/crypto/identityProof.ts +6 -1
- package/src/crypto/index.ts +11 -11
- package/src/crypto/internal.ts +6 -1
- package/src/crypto/keyManager.ts +348 -98
- package/src/crypto/recoveryPhrase.ts +14 -9
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +14 -6
- package/src/i18n/accountCategoryLabels.ts +1 -4
- package/src/i18n/accountRoleLabels.ts +1 -4
- package/src/i18n/index.ts +25 -7
- package/src/i18n/locales/ar-SA.ts +375 -366
- package/src/i18n/locales/ca-ES.ts +382 -366
- package/src/i18n/locales/de-DE.ts +387 -366
- package/src/i18n/locales/en-US.ts +2034 -1994
- package/src/i18n/locales/es-ES.ts +2043 -1994
- package/src/i18n/locales/fr-FR.ts +387 -366
- package/src/i18n/locales/it-IT.ts +380 -366
- package/src/i18n/locales/ja-JP.ts +380 -366
- package/src/i18n/locales/ko-KR.ts +377 -366
- package/src/i18n/locales/pt-PT.ts +383 -366
- package/src/i18n/locales/zh-CN.ts +373 -366
- package/src/i18n/trustTierLabels.ts +1 -4
- package/src/index.ts +371 -349
- package/src/inference/OxyInferenceClient.ts +784 -780
- package/src/models/interfaces.ts +39 -27
- package/src/server/OxyServer.ts +227 -68
- package/src/server/agentAccount.ts +8 -2
- package/src/server/aliaMachineCredential.ts +57 -16
- package/src/server/auth.ts +9 -5
- package/src/server/capabilityTicket.ts +30 -21
- package/src/server/index.ts +29 -6
- package/src/server/liveCapabilityTicket.ts +31 -9
- package/src/server/middleware.ts +212 -121
- package/src/server/namespaces.ts +247 -94
- package/src/server/rateLimit.ts +2 -4
- package/src/server/requesterAssertion.ts +93 -54
- package/src/server/serviceTokenLifetime.ts +9 -4
- package/src/server/traffic.ts +117 -23
- package/src/server/trafficNodeHttp.ts +61 -14
- package/src/server/userInvalidation.ts +1 -4
- package/src/server/workloadIdentity.client.ts +12 -1
- package/src/server/workloadIdentity.ts +52 -5
- package/src/session/SessionClient.ts +170 -49
- package/src/session/accountDelegationAccess.ts +24 -31
- package/src/session/accountDialogController.ts +59 -14
- package/src/session/accountSwitchTargets.ts +10 -15
- package/src/session/authStateStore.ts +121 -81
- package/src/session/deviceDirectory.ts +1 -3
- package/src/session/identityPin.ts +10 -11
- package/src/session/identitySession.ts +3 -1
- package/src/session/index.ts +87 -82
- package/src/session/refresh.ts +138 -44
- package/src/session/sessionClientHost.ts +1 -3
- package/src/session/sharedDeviceCredential.ts +35 -14
- package/src/session/socketLoader.ts +9 -2
- package/src/shared/utils/errorUtils.ts +5 -2
- package/src/shared/utils/networkUtils.ts +5 -8
- package/src/shared/utils/themeUtils.ts +2 -6
- package/src/types/buffer.d.ts +66 -21
- package/src/types/expo-secure-store.d.ts +5 -1
- package/src/utils/accountCacheSweep.ts +4 -5
- package/src/utils/accountUtils.ts +107 -108
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +2 -2
- package/src/utils/authHelpers.ts +10 -5
- package/src/utils/avatarUtils.ts +11 -6
- package/src/utils/cache.ts +9 -10
- package/src/utils/cacheKey.ts +5 -1
- package/src/utils/coldBoot.ts +1 -3
- package/src/utils/commonsDelivery.ts +1 -4
- package/src/utils/deviceManager.ts +15 -14
- package/src/utils/errorUtils.ts +68 -86
- package/src/utils/languageUtils.ts +407 -58
- package/src/utils/oauthPkce.ts +1 -4
- package/src/utils/platform.ts +0 -1
- package/src/utils/profileLinks.ts +2 -5
- package/src/utils/requestUtils.ts +18 -14
- package/src/utils/sessionUtils.ts +34 -33
- package/src/utils/userHandle.ts +3 -1
- package/src/utils/userIdentity.ts +1 -1
- package/src/utils/validationUtils.ts +11 -9
|
@@ -227,7 +227,7 @@ async function initExpoCrypto() {
|
|
|
227
227
|
*/
|
|
228
228
|
function uint8ArrayToHex(bytes) {
|
|
229
229
|
return Array.from(bytes)
|
|
230
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
230
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
231
231
|
.join('');
|
|
232
232
|
}
|
|
233
233
|
/** Decode a lowercase hex string to bytes. Inverse of {@link uint8ArrayToHex}. */
|
|
@@ -337,7 +337,9 @@ class KeyManager {
|
|
|
337
337
|
}
|
|
338
338
|
/** Build private-key write options (device-only accessibility) for a given keychain service. */
|
|
339
339
|
static _privateWriteOpts(store, service) {
|
|
340
|
-
const opts = {
|
|
340
|
+
const opts = {
|
|
341
|
+
keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
|
|
342
|
+
};
|
|
341
343
|
if (service) {
|
|
342
344
|
opts.keychainService = service;
|
|
343
345
|
}
|
|
@@ -649,7 +651,9 @@ class KeyManager {
|
|
|
649
651
|
}
|
|
650
652
|
try {
|
|
651
653
|
if (!(await signer.write(privateKey, publicKey))) {
|
|
652
|
-
logger_1.logger.warn(`The identity signer store (${signer.name}) did not confirm the write`, {
|
|
654
|
+
logger_1.logger.warn(`The identity signer store (${signer.name}) did not confirm the write`, {
|
|
655
|
+
component: 'KeyManager',
|
|
656
|
+
});
|
|
653
657
|
}
|
|
654
658
|
}
|
|
655
659
|
catch (error) {
|
|
@@ -865,10 +869,14 @@ class KeyManager {
|
|
|
865
869
|
return {
|
|
866
870
|
primaryPublicKey,
|
|
867
871
|
sharedPublicKey,
|
|
868
|
-
activePublicKey: (0, platform_1.isAndroid)()
|
|
872
|
+
activePublicKey: (0, platform_1.isAndroid)()
|
|
873
|
+
? (primaryPublicKey ?? sharedPublicKey)
|
|
874
|
+
: (sharedPublicKey ?? primaryPublicKey),
|
|
869
875
|
// Only a real disagreement is out of sync. A device with just one slot
|
|
870
876
|
// populated has nothing to contradict.
|
|
871
|
-
inSync: primaryPublicKey === null ||
|
|
877
|
+
inSync: primaryPublicKey === null ||
|
|
878
|
+
sharedPublicKey === null ||
|
|
879
|
+
primaryPublicKey === sharedPublicKey,
|
|
872
880
|
};
|
|
873
881
|
}
|
|
874
882
|
/**
|
|
@@ -1121,7 +1129,9 @@ class KeyManager {
|
|
|
1121
1129
|
priorPublic = await store.getItemAsync(layout.primaryPublicKeyName, primaryReadOpts);
|
|
1122
1130
|
}
|
|
1123
1131
|
catch (error) {
|
|
1124
|
-
logger_1.logger.error('Failed to read existing primary before persist', error, {
|
|
1132
|
+
logger_1.logger.error('Failed to read existing primary before persist', error, {
|
|
1133
|
+
component: 'KeyManager',
|
|
1134
|
+
});
|
|
1125
1135
|
throw new IdentityPersistError('Could not read existing identity before writing a new one; refusing to overwrite blind.', error);
|
|
1126
1136
|
}
|
|
1127
1137
|
// If we are replacing a DIFFERENT, currently-healthy identity, make sure
|
|
@@ -1152,7 +1162,9 @@ class KeyManager {
|
|
|
1152
1162
|
await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupPubWriteOpts);
|
|
1153
1163
|
}
|
|
1154
1164
|
catch (error) {
|
|
1155
|
-
logger_1.logger.error('Failed to back up existing identity before overwrite', error, {
|
|
1165
|
+
logger_1.logger.error('Failed to back up existing identity before overwrite', error, {
|
|
1166
|
+
component: 'KeyManager',
|
|
1167
|
+
});
|
|
1156
1168
|
throw new IdentityPersistError('Failed to back up existing identity before overwrite', error);
|
|
1157
1169
|
}
|
|
1158
1170
|
}
|
|
@@ -1166,7 +1178,9 @@ class KeyManager {
|
|
|
1166
1178
|
await store.setItemAsync(layout.primaryPrivateKeyName, canonicalPrivate, primaryPrivWriteOpts);
|
|
1167
1179
|
}
|
|
1168
1180
|
catch (error) {
|
|
1169
|
-
logger_1.logger.error('Failed to write primary identity to secure store', error, {
|
|
1181
|
+
logger_1.logger.error('Failed to write primary identity to secure store', error, {
|
|
1182
|
+
component: 'KeyManager',
|
|
1183
|
+
});
|
|
1170
1184
|
await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
|
|
1171
1185
|
throw new IdentityPersistError('Failed to write identity to secure store', error);
|
|
1172
1186
|
}
|
|
@@ -1190,7 +1204,9 @@ class KeyManager {
|
|
|
1190
1204
|
// trigger a spurious mismatch.
|
|
1191
1205
|
if (readBackPrivate?.toLowerCase() !== canonicalPrivate ||
|
|
1192
1206
|
readBackPublic?.toLowerCase() !== canonicalPublic) {
|
|
1193
|
-
logger_1.logger.error('Identity round-trip mismatch after write', undefined, {
|
|
1207
|
+
logger_1.logger.error('Identity round-trip mismatch after write', undefined, {
|
|
1208
|
+
component: 'KeyManager',
|
|
1209
|
+
});
|
|
1194
1210
|
await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
|
|
1195
1211
|
throw new IdentityPersistError('Identity write was not persisted correctly (round-trip mismatch).');
|
|
1196
1212
|
}
|
|
@@ -1233,7 +1249,9 @@ class KeyManager {
|
|
|
1233
1249
|
priorBackupTimestamp = await store.getItemAsync(layout.backupTimestampName, backupReadOpts);
|
|
1234
1250
|
}
|
|
1235
1251
|
catch (error) {
|
|
1236
|
-
logger_1.logger.error('Failed to snapshot identity backup before refresh', error, {
|
|
1252
|
+
logger_1.logger.error('Failed to snapshot identity backup before refresh', error, {
|
|
1253
|
+
component: 'KeyManager',
|
|
1254
|
+
});
|
|
1237
1255
|
await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
|
|
1238
1256
|
throw new IdentityPersistError('Failed to snapshot identity backup before refresh', error);
|
|
1239
1257
|
}
|
|
@@ -1243,7 +1261,9 @@ class KeyManager {
|
|
|
1243
1261
|
await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupPubWriteOpts);
|
|
1244
1262
|
}
|
|
1245
1263
|
catch (error) {
|
|
1246
|
-
logger_1.logger.error('Failed to refresh identity backup after primary write', error, {
|
|
1264
|
+
logger_1.logger.error('Failed to refresh identity backup after primary write', error, {
|
|
1265
|
+
component: 'KeyManager',
|
|
1266
|
+
});
|
|
1247
1267
|
await KeyManager._rollbackBackup(store, layout, priorBackupPrivate, priorBackupPublic, priorBackupTimestamp);
|
|
1248
1268
|
await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
|
|
1249
1269
|
throw new IdentityPersistError('Failed to refresh identity backup after primary write', error);
|
|
@@ -1293,7 +1313,9 @@ class KeyManager {
|
|
|
1293
1313
|
}
|
|
1294
1314
|
const sameIdentity = existing?.publicKey === publicKey;
|
|
1295
1315
|
const keptMnemonic = mnemonic ?? (sameIdentity ? existing?.mnemonic : undefined);
|
|
1296
|
-
if (sameIdentity &&
|
|
1316
|
+
if (sameIdentity &&
|
|
1317
|
+
existing?.privateKey === privateKey &&
|
|
1318
|
+
existing?.mnemonic === keptMnemonic) {
|
|
1297
1319
|
return true; // Already current; do not churn the store.
|
|
1298
1320
|
}
|
|
1299
1321
|
await store.write((0, deviceBackup_1.serializeDeviceBackup)({
|
|
@@ -1340,7 +1362,9 @@ class KeyManager {
|
|
|
1340
1362
|
static async _readHealthyPrimary() {
|
|
1341
1363
|
try {
|
|
1342
1364
|
const direct = await KeyManager._readPrimaryDirect();
|
|
1343
|
-
if (KeyManager._isHealthyPair(direct.privateKey, direct.publicKey) &&
|
|
1365
|
+
if (KeyManager._isHealthyPair(direct.privateKey, direct.publicKey) &&
|
|
1366
|
+
direct.privateKey &&
|
|
1367
|
+
direct.publicKey) {
|
|
1344
1368
|
return {
|
|
1345
1369
|
privateKey: KeyManager.canonicalPrivateKey(direct.privateKey),
|
|
1346
1370
|
publicKey: direct.publicKey.toLowerCase(),
|
|
@@ -1437,7 +1461,9 @@ class KeyManager {
|
|
|
1437
1461
|
try {
|
|
1438
1462
|
await store.deleteItemAsync(layout.backupPrivateKeyName, backupReadOpts);
|
|
1439
1463
|
}
|
|
1440
|
-
catch {
|
|
1464
|
+
catch {
|
|
1465
|
+
/* best effort */
|
|
1466
|
+
}
|
|
1441
1467
|
}
|
|
1442
1468
|
if (priorBackupPublic) {
|
|
1443
1469
|
await store.setItemAsync(layout.backupPublicKeyName, priorBackupPublic, backupPubWriteOpts);
|
|
@@ -1446,7 +1472,9 @@ class KeyManager {
|
|
|
1446
1472
|
try {
|
|
1447
1473
|
await store.deleteItemAsync(layout.backupPublicKeyName, backupReadOpts);
|
|
1448
1474
|
}
|
|
1449
|
-
catch {
|
|
1475
|
+
catch {
|
|
1476
|
+
/* best effort */
|
|
1477
|
+
}
|
|
1450
1478
|
}
|
|
1451
1479
|
if (priorBackupTimestamp) {
|
|
1452
1480
|
await store.setItemAsync(layout.backupTimestampName, priorBackupTimestamp, backupPubWriteOpts);
|
|
@@ -1455,11 +1483,15 @@ class KeyManager {
|
|
|
1455
1483
|
try {
|
|
1456
1484
|
await store.deleteItemAsync(layout.backupTimestampName, backupReadOpts);
|
|
1457
1485
|
}
|
|
1458
|
-
catch {
|
|
1486
|
+
catch {
|
|
1487
|
+
/* best effort */
|
|
1488
|
+
}
|
|
1459
1489
|
}
|
|
1460
1490
|
}
|
|
1461
1491
|
catch (rollbackError) {
|
|
1462
|
-
logger_1.logger.error('Failed to roll back identity backup after a failed refresh', rollbackError, {
|
|
1492
|
+
logger_1.logger.error('Failed to roll back identity backup after a failed refresh', rollbackError, {
|
|
1493
|
+
component: 'KeyManager',
|
|
1494
|
+
});
|
|
1463
1495
|
}
|
|
1464
1496
|
}
|
|
1465
1497
|
/**
|
|
@@ -1487,15 +1519,21 @@ class KeyManager {
|
|
|
1487
1519
|
try {
|
|
1488
1520
|
await store.deleteItemAsync(layout.primaryPublicKeyName, primaryReadOpts);
|
|
1489
1521
|
}
|
|
1490
|
-
catch {
|
|
1522
|
+
catch {
|
|
1523
|
+
/* best effort */
|
|
1524
|
+
}
|
|
1491
1525
|
try {
|
|
1492
1526
|
await store.deleteItemAsync(layout.primaryPrivateKeyName, primaryReadOpts);
|
|
1493
1527
|
}
|
|
1494
|
-
catch {
|
|
1528
|
+
catch {
|
|
1529
|
+
/* best effort */
|
|
1530
|
+
}
|
|
1495
1531
|
}
|
|
1496
1532
|
}
|
|
1497
1533
|
catch (rollbackError) {
|
|
1498
|
-
logger_1.logger.error('Failed to roll back primary identity after a failed write', rollbackError, {
|
|
1534
|
+
logger_1.logger.error('Failed to roll back primary identity after a failed write', rollbackError, {
|
|
1535
|
+
component: 'KeyManager',
|
|
1536
|
+
});
|
|
1499
1537
|
}
|
|
1500
1538
|
finally {
|
|
1501
1539
|
// Whatever happened, the cached verdict is no longer trustworthy.
|
|
@@ -1801,7 +1839,9 @@ class KeyManager {
|
|
|
1801
1839
|
// fetch before the device is unlocked). Do NOT cache; throw a TYPED error
|
|
1802
1840
|
// so callers distinguish "temporarily unavailable" from "genuinely absent"
|
|
1803
1841
|
// instead of silently treating a locked keystore as a blank device.
|
|
1804
|
-
logger_1.logger.error('Failed to read identity from secure storage', error, {
|
|
1842
|
+
logger_1.logger.error('Failed to read identity from secure storage', error, {
|
|
1843
|
+
component: 'KeyManager',
|
|
1844
|
+
});
|
|
1805
1845
|
throw new IdentityUnavailableError('Failed to read identity from secure storage.', error);
|
|
1806
1846
|
}
|
|
1807
1847
|
// Storage succeeded. Now classify the result. From here onward, any
|
|
@@ -1828,7 +1868,9 @@ class KeyManager {
|
|
|
1828
1868
|
}
|
|
1829
1869
|
}
|
|
1830
1870
|
else {
|
|
1831
|
-
logger_1.logger.warn('KeyManager.hasIdentity: stored key material is malformed', {
|
|
1871
|
+
logger_1.logger.warn('KeyManager.hasIdentity: stored key material is malformed', {
|
|
1872
|
+
component: 'KeyManager',
|
|
1873
|
+
});
|
|
1832
1874
|
}
|
|
1833
1875
|
}
|
|
1834
1876
|
// Cache result. Storage succeeded, so this verdict is stable:
|
|
@@ -1953,7 +1995,9 @@ class KeyManager {
|
|
|
1953
1995
|
try {
|
|
1954
1996
|
const backupSuccess = await KeyManager.backupIdentity();
|
|
1955
1997
|
if (!backupSuccess && (0, logger_1.isDev)()) {
|
|
1956
|
-
logger_1.logger.warn('Failed to backup identity before deletion - proceeding anyway', {
|
|
1998
|
+
logger_1.logger.warn('Failed to backup identity before deletion - proceeding anyway', {
|
|
1999
|
+
component: 'KeyManager',
|
|
2000
|
+
});
|
|
1957
2001
|
}
|
|
1958
2002
|
}
|
|
1959
2003
|
catch (backupError) {
|
|
@@ -2081,7 +2125,9 @@ class KeyManager {
|
|
|
2081
2125
|
const probeHash = '0'.repeat(64);
|
|
2082
2126
|
const signature = (0, secp256k1_1.signSecp256k1Digest)(canonicalPrivateKey, probeHash);
|
|
2083
2127
|
if (!(0, secp256k1_1.verifySecp256k1Digest)(publicKey, probeHash, signature)) {
|
|
2084
|
-
logger_1.logger.error('Identity sign/verify probe failed during integrity check', undefined, {
|
|
2128
|
+
logger_1.logger.error('Identity sign/verify probe failed during integrity check', undefined, {
|
|
2129
|
+
component: 'KeyManager',
|
|
2130
|
+
});
|
|
2085
2131
|
return false;
|
|
2086
2132
|
}
|
|
2087
2133
|
return true;
|
|
@@ -2155,8 +2201,11 @@ class KeyManager {
|
|
|
2155
2201
|
if (!backupPrivateKey || !backupPublicKey) {
|
|
2156
2202
|
return false; // No backup available
|
|
2157
2203
|
}
|
|
2158
|
-
if (!KeyManager.isValidPrivateKey(backupPrivateKey) ||
|
|
2159
|
-
|
|
2204
|
+
if (!KeyManager.isValidPrivateKey(backupPrivateKey) ||
|
|
2205
|
+
!KeyManager.isValidPublicKey(backupPublicKey)) {
|
|
2206
|
+
logger_1.logger.warn('Backup identity is malformed; refusing to restore', {
|
|
2207
|
+
component: 'KeyManager',
|
|
2208
|
+
});
|
|
2160
2209
|
return false;
|
|
2161
2210
|
}
|
|
2162
2211
|
// Verify backup keys derive consistently. Hex is case-insensitive so
|
|
@@ -2164,7 +2213,9 @@ class KeyManager {
|
|
|
2164
2213
|
// be considered valid.
|
|
2165
2214
|
const derivedPublicKey = KeyManager.derivePublicKey(backupPrivateKey);
|
|
2166
2215
|
if (derivedPublicKey.toLowerCase() !== backupPublicKey.toLowerCase()) {
|
|
2167
|
-
logger_1.logger.warn('Backup public key does not match derived; refusing to restore', {
|
|
2216
|
+
logger_1.logger.warn('Backup public key does not match derived; refusing to restore', {
|
|
2217
|
+
component: 'KeyManager',
|
|
2218
|
+
});
|
|
2168
2219
|
return false;
|
|
2169
2220
|
}
|
|
2170
2221
|
// Guard 3: if ANY primary key material is still present and identifies a
|
|
@@ -2173,8 +2224,7 @@ class KeyManager {
|
|
|
2173
2224
|
// the user. We check the private key too (not just the public): a
|
|
2174
2225
|
// present private key that derives to a non-backup public means a real,
|
|
2175
2226
|
// different identity is sitting in the primary slot.
|
|
2176
|
-
if (primaryPublic &&
|
|
2177
|
-
primaryPublic.toLowerCase() !== backupPublicKey.toLowerCase()) {
|
|
2227
|
+
if (primaryPublic && primaryPublic.toLowerCase() !== backupPublicKey.toLowerCase()) {
|
|
2178
2228
|
logger_1.logger.error('Primary public key is present, corrupt-or-mismatched, AND differs from the backup. Refusing to restore to avoid switching accounts.', undefined, { component: 'KeyManager' });
|
|
2179
2229
|
return false;
|
|
2180
2230
|
}
|
|
@@ -2190,7 +2240,9 @@ class KeyManager {
|
|
|
2190
2240
|
await KeyManager._persistIdentityAtomic(backupPrivateKey, backupPublicKey, 'restore');
|
|
2191
2241
|
}
|
|
2192
2242
|
catch (error) {
|
|
2193
|
-
logger_1.logger.error('Failed to persist identity restored from backup', error, {
|
|
2243
|
+
logger_1.logger.error('Failed to persist identity restored from backup', error, {
|
|
2244
|
+
component: 'KeyManager',
|
|
2245
|
+
});
|
|
2194
2246
|
return false;
|
|
2195
2247
|
}
|
|
2196
2248
|
await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupReadOpts);
|
|
@@ -2328,7 +2380,8 @@ class KeyManager {
|
|
|
2328
2380
|
if (!(await KeyManager._commitRecovery(record.privateKey, record.publicKey))) {
|
|
2329
2381
|
return false;
|
|
2330
2382
|
}
|
|
2331
|
-
if (record.mnemonic &&
|
|
2383
|
+
if (record.mnemonic &&
|
|
2384
|
+
(await KeyManager._phraseDerivesPublicKey(record.mnemonic, record.publicKey))) {
|
|
2332
2385
|
try {
|
|
2333
2386
|
await KeyManager.storeRecoveryMnemonic(record.mnemonic);
|
|
2334
2387
|
}
|
|
@@ -2396,7 +2449,9 @@ class KeyManager {
|
|
|
2396
2449
|
return true;
|
|
2397
2450
|
}
|
|
2398
2451
|
catch (error) {
|
|
2399
|
-
logger_1.logger.error('Recovery: failed to persist recovered identity', error, {
|
|
2452
|
+
logger_1.logger.error('Recovery: failed to persist recovered identity', error, {
|
|
2453
|
+
component: 'KeyManager',
|
|
2454
|
+
});
|
|
2400
2455
|
return false;
|
|
2401
2456
|
}
|
|
2402
2457
|
}
|
|
@@ -27,7 +27,7 @@ function toHex(data) {
|
|
|
27
27
|
// Convert to array of numbers if needed
|
|
28
28
|
const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
29
29
|
return Array.from(bytes)
|
|
30
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
30
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
31
31
|
.join('');
|
|
32
32
|
}
|
|
33
33
|
/** UTF-8 encode an ASCII label to bytes (for HKDF salt/info). */
|
|
@@ -236,7 +236,7 @@ class RecoveryPhraseService {
|
|
|
236
236
|
* Convert a word array to a phrase string
|
|
237
237
|
*/
|
|
238
238
|
static wordsToPhrase(words) {
|
|
239
|
-
return words.map(w => w.toLowerCase().trim()).join(' ');
|
|
239
|
+
return words.map((w) => w.toLowerCase().trim()).join(' ');
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
exports.RecoveryPhraseService = RecoveryPhraseService;
|
|
@@ -42,7 +42,7 @@ class SignatureService {
|
|
|
42
42
|
const bytes = new Uint8Array(32);
|
|
43
43
|
globalThis.crypto.getRandomValues(bytes);
|
|
44
44
|
return Array.from(bytes)
|
|
45
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
45
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
46
46
|
.join('');
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
@@ -84,8 +84,7 @@ class SignatureService {
|
|
|
84
84
|
* Verify a signed message object
|
|
85
85
|
* Checks both signature validity and timestamp freshness
|
|
86
86
|
*/
|
|
87
|
-
static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000
|
|
88
|
-
) {
|
|
87
|
+
static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000) {
|
|
89
88
|
const { message, signature, publicKey, timestamp } = signedMessage;
|
|
90
89
|
// Check timestamp freshness
|
|
91
90
|
const now = Date.now();
|
|
@@ -188,7 +187,7 @@ class SignatureService {
|
|
|
188
187
|
const timestamp = Date.now();
|
|
189
188
|
// Create canonical string representation
|
|
190
189
|
const sortedKeys = Object.keys(data).sort();
|
|
191
|
-
const canonicalParts = sortedKeys.map(key => `${key}:${JSON.stringify(data[key])}`);
|
|
190
|
+
const canonicalParts = sortedKeys.map((key) => `${key}:${JSON.stringify(data[key])}`);
|
|
192
191
|
const canonicalString = canonicalParts.join('|');
|
|
193
192
|
const message = `request:${publicKey}:${timestamp}:${canonicalString}`;
|
|
194
193
|
const signature = await SignatureService.sign(message);
|
package/dist/cjs/i18n/index.js
CHANGED
|
@@ -64,8 +64,17 @@ const LOADERS = {
|
|
|
64
64
|
};
|
|
65
65
|
/** Base subtag → the dictionary that serves it. */
|
|
66
66
|
const ALIASES = {
|
|
67
|
-
en: 'en-US',
|
|
68
|
-
|
|
67
|
+
en: 'en-US',
|
|
68
|
+
es: 'es-ES',
|
|
69
|
+
ca: 'ca-ES',
|
|
70
|
+
fr: 'fr-FR',
|
|
71
|
+
de: 'de-DE',
|
|
72
|
+
it: 'it-IT',
|
|
73
|
+
pt: 'pt-PT',
|
|
74
|
+
ja: 'ja-JP',
|
|
75
|
+
ko: 'ko-KR',
|
|
76
|
+
zh: 'zh-CN',
|
|
77
|
+
ar: 'ar-SA',
|
|
69
78
|
};
|
|
70
79
|
const DICTS = { [FALLBACK]: en_US_1.default };
|
|
71
80
|
const pending = new Map();
|
|
@@ -140,7 +149,11 @@ function resolveLang(locale) {
|
|
|
140
149
|
return FALLBACK;
|
|
141
150
|
}
|
|
142
151
|
function getNested(obj, path) {
|
|
143
|
-
return path
|
|
152
|
+
return path
|
|
153
|
+
.split('.')
|
|
154
|
+
.reduce((acc, key) => acc && typeof acc === 'object' && acc[key] != null
|
|
155
|
+
? acc[key]
|
|
156
|
+
: undefined, obj);
|
|
144
157
|
}
|
|
145
158
|
function translate(locale, key, vars) {
|
|
146
159
|
const lang = resolveLang(locale);
|