@oxyhq/services 5.16.35 → 5.16.37
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 +8 -26
- package/lib/commonjs/core/OxyServices.base.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.utility.js.map +1 -1
- package/lib/commonjs/crypto/README.md +142 -0
- package/lib/commonjs/crypto/core.js +147 -0
- package/lib/commonjs/crypto/core.js.map +1 -0
- package/lib/commonjs/crypto/index.js +16 -0
- package/lib/commonjs/crypto/index.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +19 -22
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/crypto/signatureService.js +116 -28
- package/lib/commonjs/crypto/signatureService.js.map +1 -1
- package/lib/commonjs/index.js +0 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/interfaces.js +10 -11
- package/lib/commonjs/models/interfaces.js.map +1 -1
- package/lib/commonjs/node/index.js +10 -1
- package/lib/commonjs/node/index.js.map +1 -1
- package/lib/commonjs/node/signatureService.js +107 -0
- package/lib/commonjs/node/signatureService.js.map +1 -0
- package/lib/commonjs/ui/context/OxyContext.js +23 -0
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +29 -2
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useLanguageManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/index.js +0 -2
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +11 -2
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/core/OxyServices.base.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.utility.js.map +1 -1
- package/lib/module/crypto/README.md +142 -0
- package/lib/module/crypto/core.js +133 -0
- package/lib/module/crypto/core.js.map +1 -0
- package/lib/module/crypto/index.js +3 -9
- package/lib/module/crypto/index.js.map +1 -1
- package/lib/module/crypto/keyManager.js +19 -22
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/crypto/signatureService.js +113 -23
- package/lib/module/crypto/signatureService.js.map +1 -1
- package/lib/module/index.js +0 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/interfaces.js +10 -11
- package/lib/module/models/interfaces.js.map +1 -1
- package/lib/module/node/index.js +3 -0
- package/lib/module/node/index.js.map +1 -1
- package/lib/module/node/signatureService.js +101 -0
- package/lib/module/node/signatureService.js.map +1 -0
- package/lib/module/ui/context/OxyContext.js +23 -0
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +29 -2
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/hooks/useLanguageManagement.js.map +1 -1
- package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/index.js +0 -1
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +11 -2
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +1 -2
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +13 -13
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/core/services/SessionService.d.ts +1 -1
- package/lib/typescript/core/services/SessionService.d.ts.map +1 -1
- package/lib/typescript/crypto/core.d.ts +56 -0
- package/lib/typescript/crypto/core.d.ts.map +1 -0
- package/lib/typescript/crypto/index.d.ts +1 -9
- package/lib/typescript/crypto/index.d.ts.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts +13 -1
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/crypto/signatureService.d.ts +15 -9
- package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/models/interfaces.d.ts +68 -15
- package/lib/typescript/models/interfaces.d.ts.map +1 -1
- package/lib/typescript/node/index.d.ts +1 -0
- package/lib/typescript/node/index.d.ts.map +1 -1
- package/lib/typescript/node/signatureService.d.ts +55 -0
- package/lib/typescript/node/signatureService.d.ts.map +1 -0
- package/lib/typescript/ui/context/OxyContext.d.ts +1 -2
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +1 -2
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +1 -2
- package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +1 -2
- package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts +1 -2
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/index.d.ts +1 -1
- package/lib/typescript/ui/index.d.ts.map +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/core/OxyServices.base.ts +1 -2
- package/src/core/mixins/OxyServices.auth.ts +1 -1
- package/src/core/mixins/OxyServices.user.ts +1 -2
- package/src/core/mixins/OxyServices.utility.ts +1 -2
- package/src/core/services/SessionService.ts +1 -1
- package/src/crypto/README.md +142 -0
- package/src/crypto/__tests__/core.test.ts +203 -0
- package/src/crypto/core.ts +142 -0
- package/src/crypto/index.ts +3 -10
- package/src/crypto/keyManager.ts +25 -21
- package/src/crypto/signatureService.ts +137 -36
- package/src/index.ts +2 -3
- package/src/models/interfaces.ts +73 -21
- package/src/node/index.ts +3 -0
- package/src/node/signatureService.ts +126 -0
- package/src/ui/context/OxyContext.tsx +26 -2
- package/src/ui/context/hooks/useAuthOperations.ts +33 -4
- package/src/ui/context/hooks/useLanguageManagement.ts +1 -2
- package/src/ui/hooks/auth/index.ts +2 -0
- package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
- package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
- package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
- package/src/ui/hooks/useLanguageManagement.ts +1 -2
- package/src/ui/hooks/useSessionManagement.ts +1 -2
- package/src/ui/index.ts +1 -2
- package/src/ui/screens/AccountSettingsScreen.tsx +6 -6
- package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
- package/src/ui/screens/OxyAuthScreen.tsx +11 -2
- package/src/ui/screens/ProfileScreen.tsx +1 -1
- package/src/ui/stores/authStore.ts +1 -1
- package/src/ui/types/navigation.ts +1 -1
- package/src/ui/utils/avatarUtils.ts +1 -1
- package/lib/commonjs/core/services/AuthService.js +0 -156
- package/lib/commonjs/core/services/AuthService.js.map +0 -1
- package/lib/commonjs/core/services/SessionTransportService.js +0 -64
- package/lib/commonjs/core/services/SessionTransportService.js.map +0 -1
- package/lib/commonjs/core/services/UserService.js +0 -123
- package/lib/commonjs/core/services/UserService.js.map +0 -1
- package/lib/commonjs/core/services/index.js +0 -34
- package/lib/commonjs/core/services/index.js.map +0 -1
- package/lib/commonjs/shared/crypto/messageBuilders.js +0 -79
- package/lib/commonjs/shared/crypto/messageBuilders.js.map +0 -1
- package/lib/commonjs/shared/crypto/platform.js +0 -118
- package/lib/commonjs/shared/crypto/platform.js.map +0 -1
- package/lib/commonjs/shared/crypto/signature.js +0 -191
- package/lib/commonjs/shared/crypto/signature.js.map +0 -1
- package/lib/commonjs/shared/index.js +0 -94
- package/lib/commonjs/shared/index.js.map +0 -1
- package/lib/commonjs/shared/models/index.js +0 -2
- package/lib/commonjs/shared/models/index.js.map +0 -1
- package/lib/commonjs/shared/transport/index.js +0 -260
- package/lib/commonjs/shared/transport/index.js.map +0 -1
- package/lib/commonjs/shared/utils/index.js +0 -82
- package/lib/commonjs/shared/utils/index.js.map +0 -1
- package/lib/module/core/services/AuthService.js +0 -151
- package/lib/module/core/services/AuthService.js.map +0 -1
- package/lib/module/core/services/SessionTransportService.js +0 -59
- package/lib/module/core/services/SessionTransportService.js.map +0 -1
- package/lib/module/core/services/UserService.js +0 -118
- package/lib/module/core/services/UserService.js.map +0 -1
- package/lib/module/core/services/index.js +0 -16
- package/lib/module/core/services/index.js.map +0 -1
- package/lib/module/shared/crypto/messageBuilders.js +0 -70
- package/lib/module/shared/crypto/messageBuilders.js.map +0 -1
- package/lib/module/shared/crypto/platform.js +0 -112
- package/lib/module/shared/crypto/platform.js.map +0 -1
- package/lib/module/shared/crypto/signature.js +0 -186
- package/lib/module/shared/crypto/signature.js.map +0 -1
- package/lib/module/shared/index.js +0 -30
- package/lib/module/shared/index.js.map +0 -1
- package/lib/module/shared/models/index.js +0 -2
- package/lib/module/shared/models/index.js.map +0 -1
- package/lib/module/shared/transport/index.js +0 -254
- package/lib/module/shared/transport/index.js.map +0 -1
- package/lib/module/shared/utils/index.js +0 -74
- package/lib/module/shared/utils/index.js.map +0 -1
- package/lib/typescript/core/services/AuthService.d.ts +0 -50
- package/lib/typescript/core/services/AuthService.d.ts.map +0 -1
- package/lib/typescript/core/services/SessionTransportService.d.ts +0 -31
- package/lib/typescript/core/services/SessionTransportService.d.ts.map +0 -1
- package/lib/typescript/core/services/UserService.d.ts +0 -39
- package/lib/typescript/core/services/UserService.d.ts.map +0 -1
- package/lib/typescript/core/services/index.d.ts +0 -13
- package/lib/typescript/core/services/index.d.ts.map +0 -1
- package/lib/typescript/shared/crypto/messageBuilders.d.ts +0 -38
- package/lib/typescript/shared/crypto/messageBuilders.d.ts.map +0 -1
- package/lib/typescript/shared/crypto/platform.d.ts +0 -54
- package/lib/typescript/shared/crypto/platform.d.ts.map +0 -1
- package/lib/typescript/shared/crypto/signature.d.ts +0 -72
- package/lib/typescript/shared/crypto/signature.d.ts.map +0 -1
- package/lib/typescript/shared/index.d.ts +0 -20
- package/lib/typescript/shared/index.d.ts.map +0 -1
- package/lib/typescript/shared/models/index.d.ts +0 -163
- package/lib/typescript/shared/models/index.d.ts.map +0 -1
- package/lib/typescript/shared/transport/index.d.ts +0 -73
- package/lib/typescript/shared/transport/index.d.ts.map +0 -1
- package/lib/typescript/shared/utils/index.d.ts +0 -28
- package/lib/typescript/shared/utils/index.d.ts.map +0 -1
- package/src/core/services/AuthService.ts +0 -153
- package/src/core/services/SessionTransportService.ts +0 -69
- package/src/core/services/UserService.ts +0 -125
- package/src/core/services/index.ts +0 -14
- package/src/shared/crypto/messageBuilders.ts +0 -89
- package/src/shared/crypto/platform.ts +0 -140
- package/src/shared/crypto/signature.ts +0 -235
- package/src/shared/index.ts +0 -28
- package/src/shared/models/index.ts +0 -173
- package/src/shared/transport/index.ts +0 -349
- package/src/shared/utils/index.ts +0 -73
|
@@ -6,35 +6,97 @@
|
|
|
6
6
|
* Handles signing and verification of messages using ECDSA secp256k1.
|
|
7
7
|
* Used for authenticating requests and proving identity ownership.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* For
|
|
9
|
+
* This service provides async methods for cross-platform compatibility (React Native + Node).
|
|
10
|
+
* For Node.js-only synchronous operations, use the node/signatureService module.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { ec as EC } from 'elliptic';
|
|
14
13
|
import { KeyManager } from './keyManager';
|
|
15
|
-
import {
|
|
16
|
-
const ec = new EC('secp256k1');
|
|
14
|
+
import { verifySignatureCore, isTimestampFresh, buildAuthMessage, buildRegistrationMessage, buildRequestMessage, getEllipticCurve } from './core';
|
|
17
15
|
|
|
18
|
-
//
|
|
16
|
+
// Lazy import for expo-crypto
|
|
17
|
+
let ExpoCrypto = null;
|
|
18
|
+
const ec = getEllipticCurve();
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Check if we're in a React Native environment
|
|
22
|
+
*/
|
|
23
|
+
function isReactNative() {
|
|
24
|
+
return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Check if we're in a Node.js environment
|
|
29
|
+
*/
|
|
30
|
+
function isNodeJS() {
|
|
31
|
+
return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Initialize expo-crypto module
|
|
36
|
+
*/
|
|
37
|
+
async function initExpoCrypto() {
|
|
38
|
+
if (!ExpoCrypto) {
|
|
39
|
+
ExpoCrypto = await import('expo-crypto');
|
|
40
|
+
}
|
|
41
|
+
return ExpoCrypto;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Compute SHA-256 hash of a string
|
|
46
|
+
*/
|
|
47
|
+
async function sha256(message) {
|
|
48
|
+
// In React Native, always use expo-crypto
|
|
49
|
+
if (isReactNative() || !isNodeJS()) {
|
|
50
|
+
const Crypto = await initExpoCrypto();
|
|
51
|
+
return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// In Node.js, use Node's crypto module
|
|
55
|
+
// Use Function constructor to prevent Metro bundler from statically analyzing this require
|
|
56
|
+
// This ensures the require is only evaluated in Node.js runtime, not during Metro bundling
|
|
57
|
+
try {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
59
|
+
const getCrypto = new Function('return require("crypto")');
|
|
60
|
+
const crypto = getCrypto();
|
|
61
|
+
return crypto.createHash('sha256').update(message).digest('hex');
|
|
62
|
+
} catch (error) {
|
|
63
|
+
// Fallback to expo-crypto if Node crypto fails
|
|
64
|
+
const Crypto = await initExpoCrypto();
|
|
65
|
+
return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
20
68
|
export class SignatureService {
|
|
21
69
|
/**
|
|
22
70
|
* Generate a random challenge string (for offline use)
|
|
23
|
-
* Uses
|
|
71
|
+
* Uses expo-crypto in React Native, crypto.randomBytes in Node.js
|
|
24
72
|
*/
|
|
25
73
|
static async generateChallenge() {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
74
|
+
if (isReactNative() || !isNodeJS()) {
|
|
75
|
+
// Use expo-crypto for React Native (expo-random is deprecated)
|
|
76
|
+
const Crypto = await initExpoCrypto();
|
|
77
|
+
const randomBytes = await Crypto.getRandomBytesAsync(32);
|
|
78
|
+
return Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Node.js fallback
|
|
82
|
+
try {
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
84
|
+
const getCrypto = new Function('return require("crypto")');
|
|
85
|
+
const crypto = getCrypto();
|
|
86
|
+
return crypto.randomBytes(32).toString('hex');
|
|
87
|
+
} catch (error) {
|
|
88
|
+
// Fallback to expo-crypto if Node crypto fails
|
|
89
|
+
const Crypto = await initExpoCrypto();
|
|
90
|
+
const randomBytes = await Crypto.getRandomBytesAsync(32);
|
|
91
|
+
return Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
92
|
+
}
|
|
29
93
|
}
|
|
30
94
|
|
|
31
95
|
/**
|
|
32
96
|
* Hash a message using SHA-256
|
|
33
|
-
* Uses shared crypto adapter
|
|
34
97
|
*/
|
|
35
98
|
static async hashMessage(message) {
|
|
36
|
-
|
|
37
|
-
return adapter.sha256(message);
|
|
99
|
+
return sha256(message);
|
|
38
100
|
}
|
|
39
101
|
|
|
40
102
|
/**
|
|
@@ -46,8 +108,7 @@ export class SignatureService {
|
|
|
46
108
|
if (!keyPair) {
|
|
47
109
|
throw new Error('No identity found. Please create or import an identity first.');
|
|
48
110
|
}
|
|
49
|
-
const
|
|
50
|
-
const messageHash = await adapter.sha256(message);
|
|
111
|
+
const messageHash = await sha256(message);
|
|
51
112
|
const signature = keyPair.sign(messageHash);
|
|
52
113
|
return signature.toDER('hex');
|
|
53
114
|
}
|
|
@@ -58,18 +119,43 @@ export class SignatureService {
|
|
|
58
119
|
*/
|
|
59
120
|
static async signWithKey(message, privateKey) {
|
|
60
121
|
const keyPair = ec.keyFromPrivate(privateKey);
|
|
61
|
-
const
|
|
62
|
-
const messageHash = await adapter.sha256(message);
|
|
122
|
+
const messageHash = await sha256(message);
|
|
63
123
|
const signature = keyPair.sign(messageHash);
|
|
64
124
|
return signature.toDER('hex');
|
|
65
125
|
}
|
|
66
126
|
|
|
67
127
|
/**
|
|
68
128
|
* Verify a signature against a message and public key
|
|
69
|
-
* Uses shared SignatureService for verification
|
|
70
129
|
*/
|
|
71
130
|
static async verify(message, signature, publicKey) {
|
|
72
|
-
|
|
131
|
+
try {
|
|
132
|
+
const messageHash = await sha256(message);
|
|
133
|
+
return verifySignatureCore(messageHash, signature, publicKey);
|
|
134
|
+
} catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Synchronous verification (for Node.js backend)
|
|
141
|
+
* Uses crypto module directly for hashing
|
|
142
|
+
* Note: This method should only be used in Node.js environments
|
|
143
|
+
*/
|
|
144
|
+
static verifySync(message, signature, publicKey) {
|
|
145
|
+
try {
|
|
146
|
+
if (!isNodeJS()) {
|
|
147
|
+
// In React Native, use async verify instead
|
|
148
|
+
throw new Error('verifySync should only be used in Node.js. Use verify() in React Native.');
|
|
149
|
+
}
|
|
150
|
+
// Use Function constructor to prevent Metro bundler from statically analyzing this require
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
152
|
+
const getCrypto = new Function('return require("crypto")');
|
|
153
|
+
const crypto = getCrypto();
|
|
154
|
+
const messageHash = crypto.createHash('sha256').update(message).digest('hex');
|
|
155
|
+
return verifySignatureCore(messageHash, signature, publicKey);
|
|
156
|
+
} catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
73
159
|
}
|
|
74
160
|
|
|
75
161
|
/**
|
|
@@ -94,7 +180,6 @@ export class SignatureService {
|
|
|
94
180
|
/**
|
|
95
181
|
* Verify a signed message object
|
|
96
182
|
* Checks both signature validity and timestamp freshness
|
|
97
|
-
* Uses shared SignatureService for verification
|
|
98
183
|
*/
|
|
99
184
|
static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000 // 5 minutes default
|
|
100
185
|
) {
|
|
@@ -112,7 +197,7 @@ export class SignatureService {
|
|
|
112
197
|
|
|
113
198
|
// Verify signature
|
|
114
199
|
const messageWithTimestamp = `${message}:${timestamp}`;
|
|
115
|
-
return
|
|
200
|
+
return SignatureService.verify(messageWithTimestamp, signature, publicKey);
|
|
116
201
|
}
|
|
117
202
|
|
|
118
203
|
/**
|
|
@@ -136,7 +221,6 @@ export class SignatureService {
|
|
|
136
221
|
|
|
137
222
|
/**
|
|
138
223
|
* Verify a challenge response
|
|
139
|
-
* Uses shared SignatureService for verification
|
|
140
224
|
*/
|
|
141
225
|
static async verifyChallengeResponse(originalChallenge, response, maxAgeMs = 5 * 60 * 1000) {
|
|
142
226
|
const {
|
|
@@ -144,7 +228,13 @@ export class SignatureService {
|
|
|
144
228
|
publicKey,
|
|
145
229
|
timestamp
|
|
146
230
|
} = response;
|
|
147
|
-
|
|
231
|
+
|
|
232
|
+
// Check timestamp freshness
|
|
233
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
const message = buildAuthMessage(publicKey, originalChallenge, timestamp);
|
|
237
|
+
return SignatureService.verify(message, signature, publicKey);
|
|
148
238
|
}
|
|
149
239
|
|
|
150
240
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["KeyManager","verifySignatureCore","isTimestampFresh","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","getEllipticCurve","ExpoCrypto","ec","isReactNative","navigator","product","isNodeJS","process","versions","node","initExpoCrypto","sha256","message","Crypto","digestStringAsync","CryptoDigestAlgorithm","SHA256","getCrypto","Function","crypto","createHash","update","digest","error","SignatureService","generateChallenge","randomBytes","getRandomBytesAsync","Array","from","map","b","toString","padStart","join","hashMessage","sign","keyPair","getKeyPairObject","Error","messageHash","signature","toDER","signWithKey","privateKey","keyFromPrivate","verify","publicKey","verifySync","createSignedMessage","getPublicKey","timestamp","Date","now","messageWithTimestamp","verifySignedMessage","signedMessage","maxAgeMs","signChallenge","challenge","verifyChallengeResponse","originalChallenge","response","createRegistrationSignature","signRequestData","data"],"sourceRoot":"../../../src","sources":["crypto/signatureService.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -30,8 +30,6 @@ export { default as OxyProvider } from './ui/components/OxyProvider';
|
|
|
30
30
|
export { DeviceManager } from './utils/deviceManager';
|
|
31
31
|
// Language utilities
|
|
32
32
|
export { SUPPORTED_LANGUAGES, getLanguageMetadata, getLanguageName, getNativeLanguageName, normalizeLanguageCode } from './utils/languageUtils';
|
|
33
|
-
// Shared models and utilities (bundled for external consumers)
|
|
34
|
-
export * from './shared';
|
|
35
33
|
|
|
36
34
|
// Type exports
|
|
37
35
|
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["KeyManager","SignatureService","OxyServices","OxyAuthenticationError","OxyAuthenticationTimeoutError","OXY_CLOUD_URL","oxyClient","OxyContextProvider","useOxy","default","OxyProvider","DeviceManager","SUPPORTED_LANGUAGES","getLanguageMetadata","getLanguageName","getNativeLanguageName","normalizeLanguageCode","SECURITY_EVENT_SEVERITY_MAP","useAuthStore","useAssetStore","useAssets","useAssetsStore","useAsset","useUploadProgress","useAssetLoading","useAssetErrors","useAssetsByApp","useAssetsByEntity","useAssetUsageCount","useIsAssetLinked","useSessionSocket","setOxyAssetInstance","useFileDownloadUrl","setOxyFileUrlInstance","useUsernameValidation","USERNAME_MIN_LENGTH","USERNAME_REGEX","USERNAME_FORMAT_ERROR","USERNAME_DEBOUNCE_MS","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useUsersBySessions","usePrivacySettings","useBlockedUsers","useRestrictedUsers","useSessions","useSession","useDeviceSessions","useUserDevices","useSecurityInfo","useSecurityActivity","useRecentSecurityActivity","useUpdateProfile","useUploadAvatar","useUpdateAccountSettings","useUpdatePrivacySettings","useUploadFile","useUnblockUser","useUnrestrictUser","useSwitchSession","useLogoutSession","useLogoutAll","useUpdateDeviceName","useRemoveDevice","OxySignInButton","OxyLogo","FollowButton","ErrorCodes","createApiError","handleHttpError","validateRequiredFields","retryWithBackoff","logger","LogLevel","LogContext","logAuth","logApi","logSession","logUser","logDevice","logPayment","logPerformance"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,mBAAmB;;AAE1B;AACA,SACEA,UAAU,EACVC,gBAAgB,QACX,UAAU;;AAEjB;AACA,SAASC,WAAW,EAAEC,sBAAsB,EAAEC,6BAA6B,QAAQ,QAAQ;AAC3F,SAASC,aAAa,EAAEC,SAAS,QAAQ,QAAQ;AAOjD;AACA,SACEC,kBAAkB;AAAE;AACpBC,MAAM,QACD,yBAAyB;;AAEhC;AACA,SAASC,OAAO,IAAIC,WAAW,QAAQ,6BAA6B;;AAEpE;AACA,SAASC,aAAa,QAAQ,uBAAuB;AAGrD;AACA,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,eAAe,EACfC,qBAAqB,EACrBC,qBAAqB,QAChB,uBAAuB
|
|
1
|
+
{"version":3,"names":["KeyManager","SignatureService","OxyServices","OxyAuthenticationError","OxyAuthenticationTimeoutError","OXY_CLOUD_URL","oxyClient","OxyContextProvider","useOxy","default","OxyProvider","DeviceManager","SUPPORTED_LANGUAGES","getLanguageMetadata","getLanguageName","getNativeLanguageName","normalizeLanguageCode","SECURITY_EVENT_SEVERITY_MAP","useAuthStore","useAssetStore","useAssets","useAssetsStore","useAsset","useUploadProgress","useAssetLoading","useAssetErrors","useAssetsByApp","useAssetsByEntity","useAssetUsageCount","useIsAssetLinked","useSessionSocket","setOxyAssetInstance","useFileDownloadUrl","setOxyFileUrlInstance","useUsernameValidation","USERNAME_MIN_LENGTH","USERNAME_REGEX","USERNAME_FORMAT_ERROR","USERNAME_DEBOUNCE_MS","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useUsersBySessions","usePrivacySettings","useBlockedUsers","useRestrictedUsers","useSessions","useSession","useDeviceSessions","useUserDevices","useSecurityInfo","useSecurityActivity","useRecentSecurityActivity","useUpdateProfile","useUploadAvatar","useUpdateAccountSettings","useUpdatePrivacySettings","useUploadFile","useUnblockUser","useUnrestrictUser","useSwitchSession","useLogoutSession","useLogoutAll","useUpdateDeviceName","useRemoveDevice","OxySignInButton","OxyLogo","FollowButton","ErrorCodes","createApiError","handleHttpError","validateRequiredFields","retryWithBackoff","logger","LogLevel","LogContext","logAuth","logApi","logSession","logUser","logDevice","logPayment","logPerformance"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,mBAAmB;;AAE1B;AACA,SACEA,UAAU,EACVC,gBAAgB,QACX,UAAU;;AAEjB;AACA,SAASC,WAAW,EAAEC,sBAAsB,EAAEC,6BAA6B,QAAQ,QAAQ;AAC3F,SAASC,aAAa,EAAEC,SAAS,QAAQ,QAAQ;AAOjD;AACA,SACEC,kBAAkB;AAAE;AACpBC,MAAM,QACD,yBAAyB;;AAEhC;AACA,SAASC,OAAO,IAAIC,WAAW,QAAQ,6BAA6B;;AAEpE;AACA,SAASC,aAAa,QAAQ,uBAAuB;AAGrD;AACA,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,eAAe,EACfC,qBAAqB,EACrBC,qBAAqB,QAChB,uBAAuB;;AAG9B;;AA6DA;AACA,SAASC,2BAA2B,QAAQ,qBAAqB;AAQjE;AACA,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SACEC,aAAa,EACbC,SAAS,IAAIC,cAAc,EAC3BC,QAAQ,EACRC,iBAAiB,EACjBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,QACX,wBAAwB;;AAE/B;AACA,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASV,SAAS,EAAEW,mBAAmB,QAAQ,sBAAsB;AACrE,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,+BAA+B;AACzF,SAASC,qBAAqB,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,qBAAqB,EAAEC,oBAAoB,QAAQ,iBAAiB;AAGzI;AACA;AACE;AACAC,cAAc,EACdC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,iBAAiB,EACjBC,kBAAkB,EAClBC,kBAAkB,EAClBC,eAAe,EACfC,kBAAkB;AAClB;AACAC,WAAW,EACXC,UAAU,EACVC,iBAAiB,EACjBC,cAAc,EACdC,eAAe;AACf;AACAC,mBAAmB,EACnBC,yBAAyB,QACpB,oBAAoB;;AAE3B;AACA;AACE;AACAC,gBAAgB,EAChBC,eAAe,EACfC,wBAAwB,EACxBC,wBAAwB,EACxBC,aAAa,EACbC,cAAc,EACdC,iBAAiB;AACjB;AACAC,gBAAgB,EAChBC,gBAAgB,EAChBC,YAAY,EACZC,mBAAmB,EACnBC,eAAe,QACV,sBAAsB;;AAE7B;AACA,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,OAAO,EAAEC,YAAY,QAAQ,MAAM;;AAE5C;AACA,cAAc,kBAAkB;AAChC,SACEC,UAAU,EACVC,cAAc,EACdC,eAAe,EACfC,sBAAsB,EACtBC,gBAAgB,QACX,oBAAoB;AAC3B,cAAc,yBAAyB;AACvC,SACEC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,UAAU,EACVC,cAAc,QACT,qBAAqB;AAC5B,cAAc,oBAAoB;AAClC,cAAc,mBAAmB","ignoreList":[]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* User Model
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* IMPORTANT:
|
|
7
|
+
* - id: MongoDB ObjectId (24 hex characters) - PRIMARY IDENTIFIER for all internal operations
|
|
8
|
+
* - publicKey: Cryptographic public key (130 hex characters) - LOOKUP KEY for authentication and identity operations
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
+
* Never use publicKey as an ID. Always use id (ObjectId) for:
|
|
11
|
+
* - Database queries
|
|
12
|
+
* - Session userId
|
|
13
|
+
* - Token userId
|
|
14
|
+
* - Socket room names
|
|
15
|
+
* - API route parameters (unless explicitly doing publicKey lookup)
|
|
10
16
|
*/
|
|
11
17
|
|
|
12
|
-
// Note: User and LoginResponse are in the shared module
|
|
13
|
-
// Import them directly: import { User, LoginResponse } from '../shared';
|
|
14
|
-
|
|
15
|
-
// Note: PaginationInfo and SearchProfilesResponse are in the shared module
|
|
16
|
-
// Import them directly: import { PaginationInfo, SearchProfilesResponse } from '../shared';
|
|
17
|
-
|
|
18
18
|
/**
|
|
19
19
|
* File management interfaces
|
|
20
20
|
*/
|
|
@@ -69,5 +69,4 @@ export const SECURITY_EVENT_SEVERITY_MAP = {
|
|
|
69
69
|
*/
|
|
70
70
|
|
|
71
71
|
// Device Session interfaces
|
|
72
|
-
// Note: User type should be imported from the shared module
|
|
73
72
|
//# sourceMappingURL=interfaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SECURITY_EVENT_SEVERITY_MAP"],"sourceRoot":"../../../src","sources":["models/interfaces.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["SECURITY_EVENT_SEVERITY_MAP"],"sourceRoot":"../../../src","sources":["models/interfaces.ts"],"mappings":";;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmMA;AACA;AACA;;AAmDA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAuGA;AACA;AACA;;AAqBA;AACA;AACA;;AAcA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMA,2BAA6E,GAAG;EAC3F,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,iBAAiB,EAAE,KAAK;EACxB,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,QAAQ;EACxB,gBAAgB,EAAE,QAAQ;EAC1B,2BAA2B,EAAE,QAAQ;EACrC,kBAAkB,EAAE,MAAM;EAC1B,sBAAsB,EAAE,MAAM;EAC9B,gBAAgB,EAAE,MAAM;EACxB,qBAAqB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;;AAeA;AACA;AACA;;AAkBA","ignoreList":[]}
|
package/lib/module/node/index.js
CHANGED
|
@@ -15,6 +15,9 @@ export { OxyServices, OXY_CLOUD_URL, oxyClient };
|
|
|
15
15
|
export { Models }; // Export all models as a namespace
|
|
16
16
|
export * from '../models/interfaces'; // Export all models directly
|
|
17
17
|
|
|
18
|
+
// ------------- Node-Specific Crypto Exports -------------
|
|
19
|
+
export { SignatureService } from './signatureService';
|
|
20
|
+
|
|
18
21
|
// Default export for consistency or specific use cases if needed
|
|
19
22
|
export default OxyServices;
|
|
20
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OxyServices","OXY_CLOUD_URL","oxyClient","Models"],"sourceRoot":"../../../src","sources":["node/index.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SAASA,WAAW,EAAEC,aAAa,EAAEC,SAAS,QAAQ,SAAS,CAAC,CAAC;AACjE,OAAO,KAAKC,MAAM,MAAM,sBAAsB,CAAC,CAAC;;AAEhD;AACA,SAASH,WAAW,EAAEC,aAAa,EAAEC,SAAS;;AAE9C;AACA,SAASC,MAAM,GAAG,CAAE;AACpB,cAAc,sBAAsB,CAAC,CAAC;;AAEtC;AACA,
|
|
1
|
+
{"version":3,"names":["OxyServices","OXY_CLOUD_URL","oxyClient","Models","SignatureService"],"sourceRoot":"../../../src","sources":["node/index.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SAASA,WAAW,EAAEC,aAAa,EAAEC,SAAS,QAAQ,SAAS,CAAC,CAAC;AACjE,OAAO,KAAKC,MAAM,MAAM,sBAAsB,CAAC,CAAC;;AAEhD;AACA,SAASH,WAAW,EAAEC,aAAa,EAAEC,SAAS;;AAE9C;AACA,SAASC,MAAM,GAAG,CAAE;AACpB,cAAc,sBAAsB,CAAC,CAAC;;AAEtC;AACA,SAASC,gBAAgB,QAAQ,oBAAoB;;AAErD;AACA,eAAeJ,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Node.js Signature Service
|
|
5
|
+
*
|
|
6
|
+
* Provides synchronous signature operations for Node.js backend.
|
|
7
|
+
* Uses Node's crypto module for hashing and the shared core for verification.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import crypto from 'crypto';
|
|
11
|
+
import { verifySignatureCore, isValidPublicKey, isTimestampFresh, buildAuthMessage, buildRegistrationMessage, buildRequestMessage, shortenPublicKey, CHALLENGE_TTL_MS, MAX_SIGNATURE_AGE_MS } from '../crypto/core';
|
|
12
|
+
export class SignatureService {
|
|
13
|
+
/**
|
|
14
|
+
* Generate a random challenge string
|
|
15
|
+
*/
|
|
16
|
+
static generateChallenge() {
|
|
17
|
+
return crypto.randomBytes(32).toString('hex');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Compute SHA-256 hash of a message (synchronous)
|
|
22
|
+
*/
|
|
23
|
+
static hashMessage(message) {
|
|
24
|
+
return crypto.createHash('sha256').update(message).digest('hex');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Verify an ECDSA signature (synchronous)
|
|
29
|
+
*
|
|
30
|
+
* @param message - The original message that was signed
|
|
31
|
+
* @param signature - The signature in DER format (hex encoded)
|
|
32
|
+
* @param publicKey - The public key (hex encoded, uncompressed)
|
|
33
|
+
* @returns true if the signature is valid
|
|
34
|
+
*/
|
|
35
|
+
static verifySignature(message, signature, publicKey) {
|
|
36
|
+
const messageHash = SignatureService.hashMessage(message);
|
|
37
|
+
return verifySignatureCore(messageHash, signature, publicKey);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Verify an authentication challenge response
|
|
42
|
+
*
|
|
43
|
+
* @param publicKey - The user's public key
|
|
44
|
+
* @param challenge - The original challenge string
|
|
45
|
+
* @param signature - The signature of the auth message
|
|
46
|
+
* @param timestamp - The timestamp when the signature was created
|
|
47
|
+
* @returns true if the challenge response is valid
|
|
48
|
+
*/
|
|
49
|
+
static verifyChallengeResponse(publicKey, challenge, signature, timestamp) {
|
|
50
|
+
// Check timestamp is not too old
|
|
51
|
+
if (!isTimestampFresh(timestamp, CHALLENGE_TTL_MS)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Build the message and verify signature
|
|
56
|
+
const message = buildAuthMessage(publicKey, challenge, timestamp);
|
|
57
|
+
return SignatureService.verifySignature(message, signature, publicKey);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Verify a registration signature
|
|
62
|
+
* Signature format: oxy:register:{publicKey}:{timestamp}
|
|
63
|
+
*/
|
|
64
|
+
static verifyRegistrationSignature(publicKey, signature, timestamp) {
|
|
65
|
+
// Check timestamp freshness
|
|
66
|
+
if (!isTimestampFresh(timestamp, MAX_SIGNATURE_AGE_MS)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const message = buildRegistrationMessage(publicKey, timestamp);
|
|
70
|
+
return SignatureService.verifySignature(message, signature, publicKey);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Verify a signed request
|
|
75
|
+
* Used for authenticated API operations
|
|
76
|
+
*/
|
|
77
|
+
static verifyRequestSignature(publicKey, data, signature, timestamp) {
|
|
78
|
+
// Check timestamp freshness
|
|
79
|
+
if (!isTimestampFresh(timestamp, MAX_SIGNATURE_AGE_MS)) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const message = buildRequestMessage(publicKey, timestamp, data);
|
|
83
|
+
return SignatureService.verifySignature(message, signature, publicKey);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Validate that a string is a valid public key
|
|
88
|
+
*/
|
|
89
|
+
static isValidPublicKey(publicKey) {
|
|
90
|
+
return isValidPublicKey(publicKey);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get a shortened display version of a public key
|
|
95
|
+
*/
|
|
96
|
+
static shortenPublicKey(publicKey) {
|
|
97
|
+
return shortenPublicKey(publicKey);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export default SignatureService;
|
|
101
|
+
//# sourceMappingURL=signatureService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["crypto","verifySignatureCore","isValidPublicKey","isTimestampFresh","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","shortenPublicKey","CHALLENGE_TTL_MS","MAX_SIGNATURE_AGE_MS","SignatureService","generateChallenge","randomBytes","toString","hashMessage","message","createHash","update","digest","verifySignature","signature","publicKey","messageHash","verifyChallengeResponse","challenge","timestamp","verifyRegistrationSignature","verifyRequestSignature","data"],"sourceRoot":"../../../src","sources":["node/signatureService.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,MAAM,MAAM,QAAQ;AAC3B,SACEC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,wBAAwB,EACxBC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,oBAAoB,QACf,gBAAgB;AAEvB,OAAO,MAAMC,gBAAgB,CAAC;EAC5B;AACF;AACA;EACE,OAAOC,iBAAiBA,CAAA,EAAW;IACjC,OAAOX,MAAM,CAACY,WAAW,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,KAAK,CAAC;EAC/C;;EAEA;AACF;AACA;EACE,OAAOC,WAAWA,CAACC,OAAe,EAAU;IAC1C,OAAOf,MAAM,CAACgB,UAAU,CAAC,QAAQ,CAAC,CAACC,MAAM,CAACF,OAAO,CAAC,CAACG,MAAM,CAAC,KAAK,CAAC;EAClE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,eAAeA,CAACJ,OAAe,EAAEK,SAAiB,EAAEC,SAAiB,EAAW;IACrF,MAAMC,WAAW,GAAGZ,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAAC;IACzD,OAAOd,mBAAmB,CAACqB,WAAW,EAAEF,SAAS,EAAEC,SAAS,CAAC;EAC/D;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOE,uBAAuBA,CAC5BF,SAAiB,EACjBG,SAAiB,EACjBJ,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEjB,gBAAgB,CAAC,EAAE;MAClD,OAAO,KAAK;IACd;;IAEA;IACA,MAAMO,OAAO,GAAGX,gBAAgB,CAACiB,SAAS,EAAEG,SAAS,EAAEC,SAAS,CAAC;IACjE,OAAOf,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;AACA;EACE,OAAOK,2BAA2BA,CAChCL,SAAiB,EACjBD,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEhB,oBAAoB,CAAC,EAAE;MACtD,OAAO,KAAK;IACd;IAEA,MAAMM,OAAO,GAAGV,wBAAwB,CAACgB,SAAS,EAAEI,SAAS,CAAC;IAC9D,OAAOf,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;AACA;EACE,OAAOM,sBAAsBA,CAC3BN,SAAiB,EACjBO,IAA6B,EAC7BR,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEhB,oBAAoB,CAAC,EAAE;MACtD,OAAO,KAAK;IACd;IAEA,MAAMM,OAAO,GAAGT,mBAAmB,CAACe,SAAS,EAAEI,SAAS,EAAEG,IAAI,CAAC;IAC/D,OAAOlB,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;EACE,OAAOnB,gBAAgBA,CAACmB,SAAiB,EAAW;IAClD,OAAOnB,gBAAgB,CAACmB,SAAS,CAAC;EACpC;;EAEA;AACF;AACA;EACE,OAAOd,gBAAgBA,CAACc,SAAiB,EAAU;IACjD,OAAOd,gBAAgB,CAACc,SAAS,CAAC;EACpC;AACF;AAEA,eAAeX,gBAAgB","ignoreList":[]}
|
|
@@ -467,9 +467,21 @@ export const OxyProvider = ({
|
|
|
467
467
|
}
|
|
468
468
|
setTokenReady(false);
|
|
469
469
|
try {
|
|
470
|
+
// CRITICAL: Get current identity's public key first
|
|
471
|
+
// Only restore sessions that belong to this identity
|
|
472
|
+
const currentPublicKey = await KeyManager.getPublicKey().catch(() => null);
|
|
470
473
|
const storedSessionIdsJson = await storage.getItem(storageKeys.sessionIds);
|
|
471
474
|
const storedSessionIds = storedSessionIdsJson ? JSON.parse(storedSessionIdsJson) : [];
|
|
472
475
|
const storedActiveSessionId = await storage.getItem(storageKeys.activeSessionId);
|
|
476
|
+
|
|
477
|
+
// If no identity exists, clear all sessions and return
|
|
478
|
+
if (!currentPublicKey) {
|
|
479
|
+
if (storedSessionIds.length > 0 || storedActiveSessionId) {
|
|
480
|
+
await clearSessionState();
|
|
481
|
+
}
|
|
482
|
+
setTokenReady(true);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
473
485
|
const validSessions = [];
|
|
474
486
|
if (storedSessionIds.length > 0) {
|
|
475
487
|
for (const sessionId of storedSessionIds) {
|
|
@@ -478,6 +490,17 @@ export const OxyProvider = ({
|
|
|
478
490
|
useHeaderValidation: true
|
|
479
491
|
});
|
|
480
492
|
if (validation?.valid && validation.user) {
|
|
493
|
+
// CRITICAL: Verify session belongs to current identity
|
|
494
|
+
// IMPORTANT: In OxyAccounts, user.id is set to the publicKey (as confirmed by line 754 comment below)
|
|
495
|
+
// This is different from the JWT's userId field which contains MongoDB ObjectId
|
|
496
|
+
// We compare user.id (publicKey) to currentPublicKey to ensure session ownership
|
|
497
|
+
if (validation.user.id !== currentPublicKey) {
|
|
498
|
+
// Session belongs to different identity - skip it
|
|
499
|
+
if (__DEV__) {
|
|
500
|
+
logger('Skipping session from different identity during restoration');
|
|
501
|
+
}
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
481
504
|
const now = new Date();
|
|
482
505
|
validSessions.push({
|
|
483
506
|
sessionId,
|