@oxyhq/services 5.17.5 → 5.17.8
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/lib/commonjs/crypto/keyManager.js +6 -161
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +20 -543
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContextBase.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +14 -331
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +8 -112
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +2 -27
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +2 -27
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +2 -88
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/crypto/keyManager.js +6 -161
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +20 -543
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/OxyContextBase.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +14 -330
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +8 -112
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/queries/useAccountQueries.js +2 -27
- package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/useServicesQueries.js +2 -27
- package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/module/ui/hooks/useSessionSocket.js +2 -88
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts +3 -20
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/crypto/types.d.ts +4 -0
- package/lib/typescript/crypto/types.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -37
- package/lib/typescript/ui/context/OxyContextBase.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +1 -20
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -14
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/crypto/keyManager.ts +4 -170
- package/src/crypto/types.ts +4 -0
- package/src/ui/context/OxyContext.tsx +17 -588
- package/src/ui/context/OxyContextBase.tsx +2 -20
- package/src/ui/context/hooks/useAuthOperations.ts +22 -347
- package/src/ui/hooks/mutations/useAccountMutations.ts +12 -110
- package/src/ui/hooks/queries/useAccountQueries.ts +3 -27
- package/src/ui/hooks/queries/useServicesQueries.ts +3 -27
- package/src/ui/hooks/useSessionSocket.ts +2 -106
|
@@ -10,13 +10,6 @@ export interface KeyPair {
|
|
|
10
10
|
privateKey: string;
|
|
11
11
|
}
|
|
12
12
|
export declare class KeyManager {
|
|
13
|
-
private static cachedPublicKey;
|
|
14
|
-
private static cachedHasIdentity;
|
|
15
|
-
/**
|
|
16
|
-
* Invalidate cached identity state
|
|
17
|
-
* Called internally when identity is created/deleted/imported
|
|
18
|
-
*/
|
|
19
|
-
private static invalidateCache;
|
|
20
13
|
/**
|
|
21
14
|
* Generate a new ECDSA secp256k1 key pair
|
|
22
15
|
* Returns the keys in hexadecimal format
|
|
@@ -41,35 +34,25 @@ export declare class KeyManager {
|
|
|
41
34
|
*/
|
|
42
35
|
static getPrivateKey(): Promise<string | null>;
|
|
43
36
|
/**
|
|
44
|
-
* Get the stored public key
|
|
37
|
+
* Get the stored public key
|
|
45
38
|
*/
|
|
46
39
|
static getPublicKey(): Promise<string | null>;
|
|
47
40
|
/**
|
|
48
|
-
* Check if an identity (key pair) exists on this device
|
|
41
|
+
* Check if an identity (key pair) exists on this device
|
|
49
42
|
*/
|
|
50
43
|
static hasIdentity(): Promise<boolean>;
|
|
51
44
|
/**
|
|
52
45
|
* Delete the stored identity (both keys)
|
|
53
46
|
* Use with EXTREME caution - this is irreversible without a backup file
|
|
54
47
|
* This should ONLY be called when explicitly requested by the user
|
|
55
|
-
* @param skipBackup - If true, skip backup before deletion (default: false)
|
|
56
48
|
* @param force - If true, skip confirmation checks (default: false)
|
|
57
49
|
* @param userConfirmed - If true, user has explicitly confirmed deletion (default: false)
|
|
58
50
|
*/
|
|
59
|
-
static deleteIdentity(
|
|
60
|
-
/**
|
|
61
|
-
* Backup identity to SecureStore (separate backup storage)
|
|
62
|
-
* This provides a recovery mechanism if primary storage fails
|
|
63
|
-
*/
|
|
64
|
-
static backupIdentity(): Promise<boolean>;
|
|
51
|
+
static deleteIdentity(force?: boolean, userConfirmed?: boolean): Promise<void>;
|
|
65
52
|
/**
|
|
66
53
|
* Verify identity integrity - checks if keys are valid and accessible
|
|
67
54
|
*/
|
|
68
55
|
static verifyIdentityIntegrity(): Promise<boolean>;
|
|
69
|
-
/**
|
|
70
|
-
* Restore identity from backup if primary storage is corrupted
|
|
71
|
-
*/
|
|
72
|
-
static restoreIdentityFromBackup(): Promise<boolean>;
|
|
73
56
|
/**
|
|
74
57
|
* Get the elliptic curve key object from the stored private key
|
|
75
58
|
* Used internally for signing operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyManager.d.ts","sourceRoot":"","sources":["../../../src/crypto/keyManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"keyManager.d.ts","sourceRoot":"","sources":["../../../src/crypto/keyManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsG1C,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IAErB;;;OAGG;IACH,MAAM,CAAC,mBAAmB,IAAI,OAAO;IAQrC;;OAEG;WACU,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAWhD;;;OAGG;WACU,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAgB9C;;OAEG;WACU,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB/D;;;OAGG;WACU,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBpD;;OAEG;WACU,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnD;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB5C;;;;;;OAMG;WACU,cAAc,CACzB,KAAK,GAAE,OAAe,EACtB,aAAa,GAAE,OAAe,GAC7B,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;WACU,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IA2CxD;;;OAGG;WACU,gBAAgB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAS1D;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAKlD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IASnD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAWrD;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAInD;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -14,5 +14,9 @@ export interface BackupData {
|
|
|
14
14
|
iv: string;
|
|
15
15
|
/** Public key associated with the encrypted private key */
|
|
16
16
|
publicKey: string;
|
|
17
|
+
/** Encryption algorithm used (optional, for backward compatibility) */
|
|
18
|
+
algorithm?: 'xor' | 'aes-256-gcm';
|
|
19
|
+
/** Format version (optional, for backward compatibility) */
|
|
20
|
+
version?: string;
|
|
17
21
|
}
|
|
18
22
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/crypto/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/crypto/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,SAAS,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC;IAClC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAoC/B,OAAO,EACL,UAAU,EACV,MAAM,EACN,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,CAAC;AAgClF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAoC/B,OAAO,EACL,UAAU,EACV,MAAM,EACN,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,CAAC;AAgClF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAgezD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mCAAc,CAAC;AAE9C,eAAe,UAAU,CAAC"}
|
|
@@ -5,7 +5,6 @@ import type { ClientSession } from '../../models/session';
|
|
|
5
5
|
import type { UseFollowHook } from '../hooks/useFollow.types';
|
|
6
6
|
import type { useLanguageManagement } from '../hooks/useLanguageManagement';
|
|
7
7
|
import type { RouteName } from '../navigation/routes';
|
|
8
|
-
import type { BackupData } from '../../crypto';
|
|
9
8
|
export interface OxyContextState {
|
|
10
9
|
user: User | null;
|
|
11
10
|
sessions: ClientSession[];
|
|
@@ -20,43 +19,7 @@ export interface OxyContextState {
|
|
|
20
19
|
currentLanguageMetadata: ReturnType<typeof useLanguageManagement>['metadata'];
|
|
21
20
|
currentLanguageName: string;
|
|
22
21
|
currentNativeLanguageName: string;
|
|
23
|
-
createIdentity: () => Promise<{
|
|
24
|
-
synced: boolean;
|
|
25
|
-
}>;
|
|
26
|
-
importIdentity: (backupData: BackupData, password: string) => Promise<{
|
|
27
|
-
synced: boolean;
|
|
28
|
-
}>;
|
|
29
22
|
signIn: (deviceName?: string) => Promise<User>;
|
|
30
|
-
hasIdentity: () => Promise<boolean>;
|
|
31
|
-
getPublicKey: () => Promise<string | null>;
|
|
32
|
-
isIdentitySynced: () => Promise<boolean>;
|
|
33
|
-
syncIdentity: () => Promise<User>;
|
|
34
|
-
deleteIdentityAndClearAccount: (skipBackup?: boolean, force?: boolean, userConfirmed?: boolean) => Promise<void>;
|
|
35
|
-
storeTransferCode: (transferId: string, code: string, sourceDeviceId: string | null, publicKey: string) => Promise<void>;
|
|
36
|
-
getTransferCode: (transferId: string) => {
|
|
37
|
-
code: string;
|
|
38
|
-
sourceDeviceId: string | null;
|
|
39
|
-
publicKey: string;
|
|
40
|
-
timestamp: number;
|
|
41
|
-
state: 'pending' | 'completed' | 'failed';
|
|
42
|
-
} | null;
|
|
43
|
-
clearTransferCode: (transferId: string) => Promise<void>;
|
|
44
|
-
getAllPendingTransfers: () => Array<{
|
|
45
|
-
transferId: string;
|
|
46
|
-
data: {
|
|
47
|
-
code: string;
|
|
48
|
-
sourceDeviceId: string | null;
|
|
49
|
-
publicKey: string;
|
|
50
|
-
timestamp: number;
|
|
51
|
-
state: 'pending' | 'completed' | 'failed';
|
|
52
|
-
};
|
|
53
|
-
}>;
|
|
54
|
-
getActiveTransferId: () => string | null;
|
|
55
|
-
updateTransferState: (transferId: string, state: 'pending' | 'completed' | 'failed') => Promise<void>;
|
|
56
|
-
identitySyncState: {
|
|
57
|
-
isSynced: boolean;
|
|
58
|
-
isSyncing: boolean;
|
|
59
|
-
};
|
|
60
23
|
logout: (targetSessionId?: string) => Promise<void>;
|
|
61
24
|
logoutAll: () => Promise<void>;
|
|
62
25
|
switchSession: (sessionId: string) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyContextBase.d.ts","sourceRoot":"","sources":["../../../../src/ui/context/OxyContextBase.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"OxyContextBase.d.ts","sourceRoot":"","sources":["../../../../src/ui/context/OxyContextBase.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAIlC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAG/C,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,OAAO,CAC5B,KAAK,CAAC;QACF,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CACL,CAAC;IACF,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,GAAG;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,UAAU,iDAA8C,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC"}
|
|
@@ -3,7 +3,6 @@ import type { AuthState } from '../../stores/authStore';
|
|
|
3
3
|
import type { ClientSession } from '../../../models/session';
|
|
4
4
|
import type { StorageInterface } from '../../utils/storageHelpers';
|
|
5
5
|
import type { OxyServices } from '../../../core';
|
|
6
|
-
import { type BackupData } from '../../../crypto';
|
|
7
6
|
export interface UseAuthOperationsOptions {
|
|
8
7
|
oxyServices: OxyServices;
|
|
9
8
|
storage: StorageInterface | null;
|
|
@@ -23,37 +22,19 @@ export interface UseAuthOperationsOptions {
|
|
|
23
22
|
loginFailure: (message: string) => void;
|
|
24
23
|
logoutStore: () => void;
|
|
25
24
|
setAuthState: (state: Partial<AuthState>) => void;
|
|
26
|
-
setIdentitySynced: (synced: boolean) => void;
|
|
27
|
-
setSyncing: (syncing: boolean) => void;
|
|
28
25
|
logger?: (message: string, error?: unknown) => void;
|
|
29
26
|
}
|
|
30
27
|
export interface UseAuthOperationsResult {
|
|
31
|
-
/** Create a new identity locally (offline-first) and optionally sync with server */
|
|
32
|
-
createIdentity: () => Promise<{
|
|
33
|
-
synced: boolean;
|
|
34
|
-
}>;
|
|
35
|
-
/** Import an existing identity from backup file data */
|
|
36
|
-
importIdentity: (backupData: BackupData, password: string) => Promise<{
|
|
37
|
-
synced: boolean;
|
|
38
|
-
}>;
|
|
39
28
|
/** Sign in with existing identity on device */
|
|
40
29
|
signIn: (deviceName?: string) => Promise<User>;
|
|
41
30
|
/** Logout from current session */
|
|
42
31
|
logout: (targetSessionId?: string) => Promise<void>;
|
|
43
32
|
/** Logout from all sessions */
|
|
44
33
|
logoutAll: () => Promise<void>;
|
|
45
|
-
/** Check if device has an identity stored */
|
|
46
|
-
hasIdentity: () => Promise<boolean>;
|
|
47
|
-
/** Get the public key of the stored identity */
|
|
48
|
-
getPublicKey: () => Promise<string | null>;
|
|
49
|
-
/** Check if identity is synced with server */
|
|
50
|
-
isIdentitySynced: () => Promise<boolean>;
|
|
51
|
-
/** Sync local identity with server (when online) */
|
|
52
|
-
syncIdentity: () => Promise<User>;
|
|
53
34
|
}
|
|
54
35
|
/**
|
|
55
36
|
* Authentication operations using public key cryptography.
|
|
56
37
|
* No passwords required - identity is based on ECDSA key pairs.
|
|
57
38
|
*/
|
|
58
|
-
export declare const useAuthOperations: ({ oxyServices, storage, sessions, activeSessionId, setActiveSessionId, updateSessions, saveActiveSessionId, clearSessionState, switchSession, applyLanguagePreference, onAuthStateChange, onError, loginSuccess, loginFailure, logoutStore, setAuthState,
|
|
39
|
+
export declare const useAuthOperations: ({ oxyServices, storage, sessions, activeSessionId, setActiveSessionId, updateSessions, saveActiveSessionId, clearSessionState, switchSession, applyLanguagePreference, onAuthStateChange, onError, loginSuccess, loginFailure, logoutStore, setAuthState, logger, }: UseAuthOperationsOptions) => UseAuthOperationsResult;
|
|
59
40
|
//# sourceMappingURL=useAuthOperations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthOperations.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/hooks/useAuthOperations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"useAuthOperations.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/hooks/useAuthOperations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,uBAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,kCAAkC;IAClC,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,+BAA+B;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAOD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,qQAkB/B,wBAAwB,KAAG,uBAmP7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAccountMutations.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/mutations/useAccountMutations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAUvD;;GAEG;AACH,eAAO,MAAM,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"useAccountMutations.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/mutations/useAccountMutations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAUvD;;GAEG;AACH,eAAO,MAAM,gBAAgB;;EAqF5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;SAKQ,MAAM;WAAS,MAAM;WAAS,MAAM;WAAS,MAAM;;;EA8EtF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;EAwCpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;cAKoB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;aAAW,MAAM;;;;cAwG5F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;UAUd,IAAI;iBACG,SAAS,GAAG,QAAQ,GAAG,UAAU;eACnC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;iBACjB,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI;WA4B5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAKvD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAe7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAezF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;WAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,+
|
|
1
|
+
{"version":3,"file":"useAccountQueries.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/queries/useAccountQueries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAKvD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEAepF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAe7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,gEAezF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;WAevF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,+DA2ClF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useServicesQueries.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/queries/useServicesQueries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2EAqB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA6BnF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iEAgBhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"useServicesQueries.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/queries/useServicesQueries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2EAqB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,GAAG,IAAI,EAAE,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,yEA6BnF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iEAgBhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iEAoC7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;SAY9D,CAAC"}
|
|
@@ -7,22 +7,9 @@ interface UseSessionSocketProps {
|
|
|
7
7
|
clearSessionState: () => Promise<void>;
|
|
8
8
|
baseURL: string;
|
|
9
9
|
getAccessToken: () => string | null;
|
|
10
|
-
getTransferCode?: (transferId: string) => {
|
|
11
|
-
code: string;
|
|
12
|
-
sourceDeviceId: string | null;
|
|
13
|
-
publicKey: string;
|
|
14
|
-
timestamp: number;
|
|
15
|
-
} | null;
|
|
16
10
|
onRemoteSignOut?: () => void;
|
|
17
11
|
onSessionRemoved?: (sessionId: string) => void;
|
|
18
|
-
onIdentityTransferComplete?: (data: {
|
|
19
|
-
transferId: string;
|
|
20
|
-
sourceDeviceId: string;
|
|
21
|
-
publicKey: string;
|
|
22
|
-
transferCode?: string;
|
|
23
|
-
completedAt: string;
|
|
24
|
-
}) => void;
|
|
25
12
|
}
|
|
26
|
-
export declare function useSessionSocket({ userId, activeSessionId, currentDeviceId, refreshSessions, logout, clearSessionState, baseURL, getAccessToken,
|
|
13
|
+
export declare function useSessionSocket({ userId, activeSessionId, currentDeviceId, refreshSessions, logout, clearSessionState, baseURL, getAccessToken, onRemoteSignOut, onSessionRemoved }: UseSessionSocketProps): void;
|
|
27
14
|
export {};
|
|
28
15
|
//# sourceMappingURL=useSessionSocket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSessionSocket.d.ts","sourceRoot":"","sources":["../../../../src/ui/hooks/useSessionSocket.ts"],"names":[],"mappings":"AAMA,UAAU,qBAAqB;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"useSessionSocket.d.ts","sourceRoot":"","sources":["../../../../src/ui/hooks/useSessionSocket.ts"],"names":[],"mappings":"AAMA,UAAU,qBAAqB;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,QA6W3M"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/services",
|
|
3
|
-
"version": "5.17.
|
|
3
|
+
"version": "5.17.8",
|
|
4
4
|
"description": "Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
package/src/crypto/keyManager.ts
CHANGED
|
@@ -18,9 +18,6 @@ const ec = new EC('secp256k1');
|
|
|
18
18
|
const STORAGE_KEYS = {
|
|
19
19
|
PRIVATE_KEY: 'oxy_identity_private_key',
|
|
20
20
|
PUBLIC_KEY: 'oxy_identity_public_key',
|
|
21
|
-
BACKUP_PRIVATE_KEY: 'oxy_identity_backup_private_key',
|
|
22
|
-
BACKUP_PUBLIC_KEY: 'oxy_identity_backup_public_key',
|
|
23
|
-
BACKUP_TIMESTAMP: 'oxy_identity_backup_timestamp',
|
|
24
21
|
} as const;
|
|
25
22
|
|
|
26
23
|
/**
|
|
@@ -117,18 +114,6 @@ export interface KeyPair {
|
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
export class KeyManager {
|
|
120
|
-
// In-memory cache for identity state (invalidated on identity changes)
|
|
121
|
-
private static cachedPublicKey: string | null = null;
|
|
122
|
-
private static cachedHasIdentity: boolean | null = null;
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Invalidate cached identity state
|
|
126
|
-
* Called internally when identity is created/deleted/imported
|
|
127
|
-
*/
|
|
128
|
-
private static invalidateCache(): void {
|
|
129
|
-
KeyManager.cachedPublicKey = null;
|
|
130
|
-
KeyManager.cachedHasIdentity = null;
|
|
131
|
-
}
|
|
132
117
|
|
|
133
118
|
/**
|
|
134
119
|
* Generate a new ECDSA secp256k1 key pair
|
|
@@ -173,10 +158,6 @@ export class KeyManager {
|
|
|
173
158
|
|
|
174
159
|
await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, publicKey);
|
|
175
160
|
|
|
176
|
-
// Update cache
|
|
177
|
-
KeyManager.cachedPublicKey = publicKey;
|
|
178
|
-
KeyManager.cachedHasIdentity = true;
|
|
179
|
-
|
|
180
161
|
return publicKey;
|
|
181
162
|
}
|
|
182
163
|
|
|
@@ -197,10 +178,6 @@ export class KeyManager {
|
|
|
197
178
|
});
|
|
198
179
|
await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, publicKey);
|
|
199
180
|
|
|
200
|
-
// Update cache
|
|
201
|
-
KeyManager.cachedPublicKey = publicKey;
|
|
202
|
-
KeyManager.cachedHasIdentity = true;
|
|
203
|
-
|
|
204
181
|
return publicKey;
|
|
205
182
|
}
|
|
206
183
|
|
|
@@ -226,28 +203,17 @@ export class KeyManager {
|
|
|
226
203
|
}
|
|
227
204
|
|
|
228
205
|
/**
|
|
229
|
-
* Get the stored public key
|
|
206
|
+
* Get the stored public key
|
|
230
207
|
*/
|
|
231
208
|
static async getPublicKey(): Promise<string | null> {
|
|
232
209
|
if (isWebPlatform()) {
|
|
233
210
|
return null; // Identity storage is only available on native platforms
|
|
234
211
|
}
|
|
235
|
-
if (KeyManager.cachedPublicKey !== null) {
|
|
236
|
-
return KeyManager.cachedPublicKey;
|
|
237
|
-
}
|
|
238
212
|
|
|
239
213
|
try {
|
|
240
214
|
const store = await initSecureStore();
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
// Cache result (null is a valid cache value meaning no identity)
|
|
244
|
-
KeyManager.cachedPublicKey = publicKey;
|
|
245
|
-
|
|
246
|
-
return publicKey;
|
|
215
|
+
return await store.getItemAsync(STORAGE_KEYS.PUBLIC_KEY);
|
|
247
216
|
} catch (error) {
|
|
248
|
-
// If secure store is not available, return null (no identity)
|
|
249
|
-
// Cache null to avoid repeated failed attempts
|
|
250
|
-
KeyManager.cachedPublicKey = null;
|
|
251
217
|
if (__DEV__) {
|
|
252
218
|
console.warn('[KeyManager] Failed to access secure store:', error);
|
|
253
219
|
}
|
|
@@ -256,28 +222,17 @@ export class KeyManager {
|
|
|
256
222
|
}
|
|
257
223
|
|
|
258
224
|
/**
|
|
259
|
-
* Check if an identity (key pair) exists on this device
|
|
225
|
+
* Check if an identity (key pair) exists on this device
|
|
260
226
|
*/
|
|
261
227
|
static async hasIdentity(): Promise<boolean> {
|
|
262
228
|
if (isWebPlatform()) {
|
|
263
229
|
return false; // Identity storage is only available on native platforms
|
|
264
230
|
}
|
|
265
|
-
if (KeyManager.cachedHasIdentity !== null) {
|
|
266
|
-
return KeyManager.cachedHasIdentity;
|
|
267
|
-
}
|
|
268
231
|
|
|
269
232
|
try {
|
|
270
233
|
const privateKey = await KeyManager.getPrivateKey();
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
// Cache result
|
|
274
|
-
KeyManager.cachedHasIdentity = hasIdentity;
|
|
275
|
-
|
|
276
|
-
return hasIdentity;
|
|
234
|
+
return privateKey !== null;
|
|
277
235
|
} catch (error) {
|
|
278
|
-
// If we can't check, assume no identity (safer default)
|
|
279
|
-
// Cache false to avoid repeated failed attempts
|
|
280
|
-
KeyManager.cachedHasIdentity = false;
|
|
281
236
|
if (__DEV__) {
|
|
282
237
|
console.warn('[KeyManager] Failed to check identity:', error);
|
|
283
238
|
}
|
|
@@ -289,12 +244,10 @@ export class KeyManager {
|
|
|
289
244
|
* Delete the stored identity (both keys)
|
|
290
245
|
* Use with EXTREME caution - this is irreversible without a backup file
|
|
291
246
|
* This should ONLY be called when explicitly requested by the user
|
|
292
|
-
* @param skipBackup - If true, skip backup before deletion (default: false)
|
|
293
247
|
* @param force - If true, skip confirmation checks (default: false)
|
|
294
248
|
* @param userConfirmed - If true, user has explicitly confirmed deletion (default: false)
|
|
295
249
|
*/
|
|
296
250
|
static async deleteIdentity(
|
|
297
|
-
skipBackup: boolean = false,
|
|
298
251
|
force: boolean = false,
|
|
299
252
|
userConfirmed: boolean = false
|
|
300
253
|
): Promise<void> {
|
|
@@ -314,70 +267,8 @@ export class KeyManager {
|
|
|
314
267
|
}
|
|
315
268
|
|
|
316
269
|
const store = await initSecureStore();
|
|
317
|
-
|
|
318
|
-
// ALWAYS create backup before deletion unless explicitly skipped
|
|
319
|
-
if (!skipBackup) {
|
|
320
|
-
try {
|
|
321
|
-
const backupSuccess = await KeyManager.backupIdentity();
|
|
322
|
-
if (!backupSuccess && typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
323
|
-
console.warn('[KeyManager] Failed to backup identity before deletion - proceeding anyway');
|
|
324
|
-
}
|
|
325
|
-
} catch (backupError) {
|
|
326
|
-
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
327
|
-
console.warn('[KeyManager] Failed to backup identity before deletion:', backupError);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
270
|
await store.deleteItemAsync(STORAGE_KEYS.PRIVATE_KEY);
|
|
333
271
|
await store.deleteItemAsync(STORAGE_KEYS.PUBLIC_KEY);
|
|
334
|
-
|
|
335
|
-
// Invalidate cache
|
|
336
|
-
KeyManager.invalidateCache();
|
|
337
|
-
|
|
338
|
-
// Also clear backup if force deletion
|
|
339
|
-
if (force) {
|
|
340
|
-
try {
|
|
341
|
-
await store.deleteItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY);
|
|
342
|
-
await store.deleteItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY);
|
|
343
|
-
await store.deleteItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP);
|
|
344
|
-
} catch (error) {
|
|
345
|
-
// Ignore backup deletion errors
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* Backup identity to SecureStore (separate backup storage)
|
|
352
|
-
* This provides a recovery mechanism if primary storage fails
|
|
353
|
-
*/
|
|
354
|
-
static async backupIdentity(): Promise<boolean> {
|
|
355
|
-
if (isWebPlatform()) {
|
|
356
|
-
return false; // Identity storage is only available on native platforms
|
|
357
|
-
}
|
|
358
|
-
try {
|
|
359
|
-
const store = await initSecureStore();
|
|
360
|
-
const privateKey = await KeyManager.getPrivateKey();
|
|
361
|
-
const publicKey = await KeyManager.getPublicKey();
|
|
362
|
-
|
|
363
|
-
if (!privateKey || !publicKey) {
|
|
364
|
-
return false; // Nothing to backup
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// Store backup in SecureStore (still secure, but separate from primary storage)
|
|
368
|
-
await store.setItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY, privateKey, {
|
|
369
|
-
keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
|
|
370
|
-
});
|
|
371
|
-
await store.setItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY, publicKey);
|
|
372
|
-
await store.setItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP, Date.now().toString());
|
|
373
|
-
|
|
374
|
-
return true;
|
|
375
|
-
} catch (error) {
|
|
376
|
-
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
377
|
-
console.error('[KeyManager] Failed to backup identity:', error);
|
|
378
|
-
}
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
272
|
}
|
|
382
273
|
|
|
383
274
|
/**
|
|
@@ -426,63 +317,6 @@ export class KeyManager {
|
|
|
426
317
|
}
|
|
427
318
|
}
|
|
428
319
|
|
|
429
|
-
/**
|
|
430
|
-
* Restore identity from backup if primary storage is corrupted
|
|
431
|
-
*/
|
|
432
|
-
static async restoreIdentityFromBackup(): Promise<boolean> {
|
|
433
|
-
if (isWebPlatform()) {
|
|
434
|
-
return false; // Identity storage is only available on native platforms
|
|
435
|
-
}
|
|
436
|
-
try {
|
|
437
|
-
const store = await initSecureStore();
|
|
438
|
-
|
|
439
|
-
// Check if backup exists
|
|
440
|
-
const backupPrivateKey = await store.getItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY);
|
|
441
|
-
const backupPublicKey = await store.getItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY);
|
|
442
|
-
|
|
443
|
-
if (!backupPrivateKey || !backupPublicKey) {
|
|
444
|
-
return false; // No backup available
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// Verify backup integrity
|
|
448
|
-
if (!KeyManager.isValidPrivateKey(backupPrivateKey)) {
|
|
449
|
-
return false;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
if (!KeyManager.isValidPublicKey(backupPublicKey)) {
|
|
453
|
-
return false;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
// Verify keys match
|
|
457
|
-
const derivedPublicKey = KeyManager.derivePublicKey(backupPrivateKey);
|
|
458
|
-
if (derivedPublicKey !== backupPublicKey) {
|
|
459
|
-
return false; // Backup keys don't match
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
await store.setItemAsync(STORAGE_KEYS.PRIVATE_KEY, backupPrivateKey, {
|
|
463
|
-
keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
|
|
464
|
-
});
|
|
465
|
-
await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, backupPublicKey);
|
|
466
|
-
|
|
467
|
-
const restored = await KeyManager.verifyIdentityIntegrity();
|
|
468
|
-
if (restored) {
|
|
469
|
-
// Update cache
|
|
470
|
-
KeyManager.cachedPublicKey = backupPublicKey;
|
|
471
|
-
KeyManager.cachedHasIdentity = true;
|
|
472
|
-
|
|
473
|
-
await store.setItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP, Date.now().toString());
|
|
474
|
-
return true;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return false;
|
|
478
|
-
} catch (error) {
|
|
479
|
-
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
480
|
-
console.error('[KeyManager] Failed to restore identity from backup:', error);
|
|
481
|
-
}
|
|
482
|
-
return false;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
320
|
/**
|
|
487
321
|
* Get the elliptic curve key object from the stored private key
|
|
488
322
|
* Used internally for signing operations
|
package/src/crypto/types.ts
CHANGED
|
@@ -15,5 +15,9 @@ export interface BackupData {
|
|
|
15
15
|
iv: string;
|
|
16
16
|
/** Public key associated with the encrypted private key */
|
|
17
17
|
publicKey: string;
|
|
18
|
+
/** Encryption algorithm used (optional, for backward compatibility) */
|
|
19
|
+
algorithm?: 'xor' | 'aes-256-gcm';
|
|
20
|
+
/** Format version (optional, for backward compatibility) */
|
|
21
|
+
version?: string;
|
|
18
22
|
}
|
|
19
23
|
|