@ethora/chat-component-rn 26.6.12 → 26.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +2 -2
- package/lib/commonjs/components/AuthForms/Login.js +4 -4
- package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +4 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +14 -13
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LoginWrapper.js +2 -1
- package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +17 -6
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +9 -8
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +8 -7
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +2 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +2 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +7 -21
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +10 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +4 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/commonjs/components/styled/AudioMessage.js +2 -1
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/MessageImage.js +34 -8
- package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
- package/lib/commonjs/components/styled/VideoMessage.js +7 -1
- package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +46 -21
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/ensureScopedChatCache.js +2 -2
- package/lib/commonjs/helpers/ensureScopedChatCache.js.map +1 -1
- package/lib/commonjs/helpers/initXmppRooms.js +5 -1
- package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
- package/lib/commonjs/helpers/persistCrypto.js +122 -0
- package/lib/commonjs/helpers/persistCrypto.js.map +1 -0
- package/lib/commonjs/helpers/pickImageAsset.js +68 -0
- package/lib/commonjs/helpers/pickImageAsset.js.map +1 -0
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +130 -17
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/commonjs/helpers/secureFileUrl.js +101 -0
- package/lib/commonjs/helpers/secureFileUrl.js.map +1 -0
- package/lib/commonjs/helpers/secureKeyValue.js +83 -0
- package/lib/commonjs/helpers/secureKeyValue.js.map +1 -0
- package/lib/commonjs/helpers/secureStoreRuntime.js +59 -0
- package/lib/commonjs/helpers/secureStoreRuntime.js.map +1 -0
- package/lib/commonjs/helpers/secureUserStorage.js +75 -0
- package/lib/commonjs/helpers/secureUserStorage.js.map +1 -0
- package/lib/commonjs/hooks/useChatWrapperInit.js +3 -3
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useFileToken.js +10 -0
- package/lib/commonjs/hooks/useFileToken.js.map +1 -0
- package/lib/commonjs/hooks/useLogout.js +15 -7
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +23 -13
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/main.js +25 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +99 -54
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/roomMembers.api.js +1 -1
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +9 -9
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/apiClient.js +62 -112
- package/lib/commonjs/networking/apiClient.js.map +1 -1
- package/lib/commonjs/networking/authRefresh.js +322 -0
- package/lib/commonjs/networking/authRefresh.js.map +1 -0
- package/lib/commonjs/networking/xmppClient.js +33 -5
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +23 -6
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +29 -15
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +2 -0
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/components/AuthForms/Login.js +4 -4
- package/lib/module/components/AuthForms/Login.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +4 -1
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +14 -13
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/LoginWrapper.js +2 -1
- package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +17 -6
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +9 -8
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +8 -7
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js +2 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js +2 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +9 -23
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js +10 -2
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +4 -1
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/module/components/styled/AudioMessage.js +2 -1
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/MessageImage.js +34 -8
- package/lib/module/components/styled/MessageImage.js.map +1 -1
- package/lib/module/components/styled/VideoMessage.js +7 -1
- package/lib/module/components/styled/VideoMessage.js.map +1 -1
- package/lib/module/context/xmppProvider.js +45 -21
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/ensureScopedChatCache.js +2 -2
- package/lib/module/helpers/ensureScopedChatCache.js.map +1 -1
- package/lib/module/helpers/initXmppRooms.js +5 -1
- package/lib/module/helpers/initXmppRooms.js.map +1 -1
- package/lib/module/helpers/persistCrypto.js +115 -0
- package/lib/module/helpers/persistCrypto.js.map +1 -0
- package/lib/module/helpers/pickImageAsset.js +63 -0
- package/lib/module/helpers/pickImageAsset.js.map +1 -0
- package/lib/module/helpers/resolveInitBeforeLoadUser.js +130 -16
- package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/module/helpers/secureFileUrl.js +91 -0
- package/lib/module/helpers/secureFileUrl.js.map +1 -0
- package/lib/module/helpers/secureKeyValue.js +75 -0
- package/lib/module/helpers/secureKeyValue.js.map +1 -0
- package/lib/module/helpers/secureStoreRuntime.js +52 -0
- package/lib/module/helpers/secureStoreRuntime.js.map +1 -0
- package/lib/module/helpers/secureUserStorage.js +72 -0
- package/lib/module/helpers/secureUserStorage.js.map +1 -0
- package/lib/module/hooks/useChatWrapperInit.js +3 -3
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useFileToken.js +5 -0
- package/lib/module/hooks/useFileToken.js.map +1 -0
- package/lib/module/hooks/useLogout.js +15 -7
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +24 -14
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/main.js +12 -1
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +96 -53
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/api-requests/roomMembers.api.js +1 -1
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +9 -9
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +8 -7
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/apiClient.js +61 -113
- package/lib/module/networking/apiClient.js.map +1 -1
- package/lib/module/networking/authRefresh.js +311 -0
- package/lib/module/networking/authRefresh.js.map +1 -0
- package/lib/module/networking/xmppClient.js +33 -5
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +23 -6
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/persistence.js +30 -15
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +2 -0
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/typescript/components/AuthForms/Login.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/LoginWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ProfileImagePlaceholder.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +4 -2
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/UpdNewChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/EditUserModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts +8 -0
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/initXmppRooms.d.ts.map +1 -1
- package/lib/typescript/helpers/persistCrypto.d.ts +13 -0
- package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -0
- package/lib/typescript/helpers/pickImageAsset.d.ts +27 -0
- package/lib/typescript/helpers/pickImageAsset.d.ts.map +1 -0
- package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
- package/lib/typescript/helpers/secureFileUrl.d.ts +7 -0
- package/lib/typescript/helpers/secureFileUrl.d.ts.map +1 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts +13 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -0
- package/lib/typescript/helpers/secureStoreRuntime.d.ts +29 -0
- package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +1 -0
- package/lib/typescript/helpers/secureUserStorage.d.ts +23 -0
- package/lib/typescript/helpers/secureUserStorage.d.ts.map +1 -0
- package/lib/typescript/hooks/useFileToken.d.ts +2 -0
- package/lib/typescript/hooks/useFileToken.d.ts.map +1 -0
- package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +6 -1
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -27
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/apiClient.d.ts +12 -6
- package/lib/typescript/networking/apiClient.d.ts.map +1 -1
- package/lib/typescript/networking/authRefresh.d.ts +92 -0
- package/lib/typescript/networking/authRefresh.d.ts.map +1 -0
- package/lib/typescript/networking/xmppClient.d.ts +6 -0
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +16 -0
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +17 -0
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/package.json +8 -1
- package/src/components/AuthForms/Login.tsx +3 -3
- package/src/components/MainComponents/ChatHeader.tsx +4 -1
- package/src/components/MainComponents/ChatWrapper.tsx +14 -19
- package/src/components/MainComponents/LoginWrapper.tsx +1 -0
- package/src/components/MainComponents/MediaMessage.tsx +14 -4
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +16 -9
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +4 -1
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +8 -7
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
- package/src/components/Modals/NewChatModal/ModalContent.tsx +6 -3
- package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +12 -1
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +9 -25
- package/src/components/RoomComponents/ChatRoomItem.tsx +9 -1
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +14 -2
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +4 -1
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +4 -1
- package/src/components/styled/AudioMessage.tsx +2 -1
- package/src/components/styled/MessageImage.tsx +45 -6
- package/src/components/styled/VideoMessage.tsx +10 -1
- package/src/context/xmppProvider.tsx +47 -23
- package/src/helpers/ensureScopedChatCache.ts +2 -2
- package/src/helpers/initXmppRooms.tsx +5 -1
- package/src/helpers/persistCrypto.ts +127 -0
- package/src/helpers/pickImageAsset.ts +68 -0
- package/src/helpers/resolveInitBeforeLoadUser.ts +125 -18
- package/src/helpers/secureFileUrl.ts +103 -0
- package/src/helpers/secureKeyValue.ts +80 -0
- package/src/helpers/secureStoreRuntime.ts +62 -0
- package/src/helpers/secureUserStorage.ts +80 -0
- package/src/hooks/useChatWrapperInit.ts +3 -3
- package/src/hooks/useFileToken.ts +7 -0
- package/src/hooks/useLogout.tsx +15 -9
- package/src/hooks/useSendMessage.tsx +28 -13
- package/src/main.ts +22 -1
- package/src/networking/api-requests/auth.api.ts +125 -52
- package/src/networking/api-requests/roomMembers.api.ts +1 -1
- package/src/networking/api-requests/rooms.api.ts +9 -9
- package/src/networking/api-requests/user.api.ts +8 -7
- package/src/networking/apiClient.ts +68 -123
- package/src/networking/authRefresh.ts +430 -0
- package/src/networking/xmppClient.ts +37 -5
- package/src/roomStore/chatSettingsSlice.ts +31 -9
- package/src/roomStore/persistence.ts +39 -19
- package/src/roomStore/roomsSlice.ts +2 -0
- package/src/types/types.ts +17 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import CryptoJS from 'crypto-js';
|
|
4
|
+
import { secureGet, secureSet } from './secureKeyValue';
|
|
5
|
+
|
|
6
|
+
// AES-256-CBC at rest for the bulk persisted state (message history +
|
|
7
|
+
// room list) that `roomStore/persistence.ts` writes to AsyncStorage.
|
|
8
|
+
// This is envelope encryption, not a SecureStore write of the payload
|
|
9
|
+
// itself: expo-secure-store has historically capped a single value's
|
|
10
|
+
// size on Android (chunking exists in newer releases, but the payload
|
|
11
|
+
// here is unbounded — up to MESSAGE_LIMIT messages per room, times
|
|
12
|
+
// every room), so only the small symmetric KEY goes through the
|
|
13
|
+
// platform Keychain/Keystore (`secureKeyValue.ts`); the ciphertext
|
|
14
|
+
// itself stays in plain AsyncStorage, unreadable without that key.
|
|
15
|
+
const CIPHER_KEY_STORE_KEY = 'ethora_history_cipher_key';
|
|
16
|
+
const ENVELOPE_VERSION = 1;
|
|
17
|
+
const KEY_BYTES = 32; // AES-256
|
|
18
|
+
const IV_BYTES = 16; // one AES block
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* `crypto-js`'s own `WordArray.random()` falls back to `Math.random()`
|
|
22
|
+
* when it can't detect a browser `window.crypto` — not safe for key/IV
|
|
23
|
+
* material. `react-native-get-random-values` (a REQUIRED peer
|
|
24
|
+
* dependency, imported at the top of `main.ts`/`index.js` before
|
|
25
|
+
* anything else in the SDK runs) polyfills the real thing onto
|
|
26
|
+
* `global.crypto.getRandomValues` instead; source bytes from that and
|
|
27
|
+
* hand them to crypto-js as a WordArray rather than trust its default.
|
|
28
|
+
*/
|
|
29
|
+
const randomWordArray = byteLength => {
|
|
30
|
+
const bytes = new Uint8Array(byteLength);
|
|
31
|
+
global.crypto.getRandomValues(bytes);
|
|
32
|
+
const words = [];
|
|
33
|
+
for (let i = 0; i < bytes.length; i += 4) {
|
|
34
|
+
words.push((bytes[i] || 0) << 24 | (bytes[i + 1] || 0) << 16 | (bytes[i + 2] || 0) << 8 | (bytes[i + 3] || 0));
|
|
35
|
+
}
|
|
36
|
+
return CryptoJS.lib.WordArray.create(words, byteLength);
|
|
37
|
+
};
|
|
38
|
+
let cachedKeyPromise = null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* One AES-256 key per install, generated on first use and persisted
|
|
42
|
+
* through the SecureStore/Keychain bridge. Reused across logins on
|
|
43
|
+
* purpose: the ciphertext it protects is deleted wholesale on logout
|
|
44
|
+
* (`clearPersistedState`), so there is no cross-account data for a
|
|
45
|
+
* stable key to expose — only the encrypted blob of whoever is
|
|
46
|
+
* currently logged in ever exists on disk at a given time.
|
|
47
|
+
*/
|
|
48
|
+
const loadOrCreateKey = () => {
|
|
49
|
+
if (cachedKeyPromise) {
|
|
50
|
+
return cachedKeyPromise;
|
|
51
|
+
}
|
|
52
|
+
cachedKeyPromise = (async () => {
|
|
53
|
+
const existing = await secureGet(CIPHER_KEY_STORE_KEY);
|
|
54
|
+
if (existing) {
|
|
55
|
+
return CryptoJS.enc.Base64.parse(existing);
|
|
56
|
+
}
|
|
57
|
+
const key = randomWordArray(KEY_BYTES);
|
|
58
|
+
await secureSet(CIPHER_KEY_STORE_KEY, CryptoJS.enc.Base64.stringify(key));
|
|
59
|
+
return key;
|
|
60
|
+
})();
|
|
61
|
+
return cachedKeyPromise;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** Encrypt a JSON-serialisable payload for storage. Returns the string to persist. */
|
|
65
|
+
export async function encryptForPersist(plaintext) {
|
|
66
|
+
const key = await loadOrCreateKey();
|
|
67
|
+
const iv = randomWordArray(IV_BYTES);
|
|
68
|
+
const encrypted = CryptoJS.AES.encrypt(plaintext, key, {
|
|
69
|
+
iv,
|
|
70
|
+
mode: CryptoJS.mode.CBC,
|
|
71
|
+
padding: CryptoJS.pad.Pkcs7
|
|
72
|
+
});
|
|
73
|
+
const envelope = {
|
|
74
|
+
v: ENVELOPE_VERSION,
|
|
75
|
+
iv: CryptoJS.enc.Base64.stringify(iv),
|
|
76
|
+
ct: encrypted.ciphertext.toString(CryptoJS.enc.Base64)
|
|
77
|
+
};
|
|
78
|
+
return JSON.stringify(envelope);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Decrypt a value previously written by `encryptForPersist`. Returns
|
|
83
|
+
* null (never throws) for anything that isn't a valid envelope for the
|
|
84
|
+
* current key — including a plaintext blob from a pre-encryption
|
|
85
|
+
* install: the app just re-hydrates that room/history from the server,
|
|
86
|
+
* same as any other empty-cache cold start.
|
|
87
|
+
*/
|
|
88
|
+
export async function decryptFromPersist(stored) {
|
|
89
|
+
try {
|
|
90
|
+
const envelope = JSON.parse(stored);
|
|
91
|
+
if (!envelope || envelope.v !== ENVELOPE_VERSION || !envelope.iv || !envelope.ct) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const key = await loadOrCreateKey();
|
|
95
|
+
const iv = CryptoJS.enc.Base64.parse(envelope.iv);
|
|
96
|
+
const ciphertext = CryptoJS.enc.Base64.parse(envelope.ct);
|
|
97
|
+
const decrypted = CryptoJS.AES.decrypt({
|
|
98
|
+
ciphertext
|
|
99
|
+
}, key, {
|
|
100
|
+
iv,
|
|
101
|
+
mode: CryptoJS.mode.CBC,
|
|
102
|
+
padding: CryptoJS.pad.Pkcs7
|
|
103
|
+
});
|
|
104
|
+
const plaintext = decrypted.toString(CryptoJS.enc.Utf8);
|
|
105
|
+
return plaintext || null;
|
|
106
|
+
} catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Test seam only. */
|
|
112
|
+
export const __resetPersistCryptoKeyForTests = () => {
|
|
113
|
+
cachedKeyPromise = null;
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=persistCrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CryptoJS","secureGet","secureSet","CIPHER_KEY_STORE_KEY","ENVELOPE_VERSION","KEY_BYTES","IV_BYTES","randomWordArray","byteLength","bytes","Uint8Array","global","crypto","getRandomValues","words","i","length","push","lib","WordArray","create","cachedKeyPromise","loadOrCreateKey","existing","enc","Base64","parse","key","stringify","encryptForPersist","plaintext","iv","encrypted","AES","encrypt","mode","CBC","padding","pad","Pkcs7","envelope","v","ct","ciphertext","toString","JSON","decryptFromPersist","stored","decrypted","decrypt","Utf8","__resetPersistCryptoKeyForTests"],"sourceRoot":"../../../src","sources":["helpers/persistCrypto.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Alert, Linking } from 'react-native';
|
|
4
|
+
import * as ImagePicker from 'expo-image-picker';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A picked image in the shape React Native's FormData understands.
|
|
8
|
+
*
|
|
9
|
+
* NOT a web `File`: RN streams a multipart part straight from a `file://`
|
|
10
|
+
* uri and has no usable Blob/File/atob path. Screens ported from the web
|
|
11
|
+
* client used to carry base64 -> Blob -> File helpers that could never
|
|
12
|
+
* have run here.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Ask for library permission, open the picker, and normalise the result.
|
|
17
|
+
*
|
|
18
|
+
* Returns `null` for every non-error outcome — permission refused, user
|
|
19
|
+
* cancelled — so call sites can simply keep their current value.
|
|
20
|
+
*
|
|
21
|
+
* Exists because the avatar pickers are wired to `onPress`, which hands
|
|
22
|
+
* the callback a SyntheticEvent. Storing that event as "the image" (what
|
|
23
|
+
* two screens used to do) rendered a pooled event as an <Image source>
|
|
24
|
+
* and then crashed with "Property is not configurable" when React tried
|
|
25
|
+
* to release it — on top of never letting the user pick anything.
|
|
26
|
+
*/
|
|
27
|
+
export const pickImageAsset = async () => {
|
|
28
|
+
try {
|
|
29
|
+
// expo-image-picker owns the permission prompt internally and
|
|
30
|
+
// returns a `granted` flag.
|
|
31
|
+
const perm = await ImagePicker.requestMediaLibraryPermissionsAsync();
|
|
32
|
+
if (!perm.granted) {
|
|
33
|
+
Alert.alert('Permission required', 'Photo library permission is needed to select images.', [{
|
|
34
|
+
text: 'Cancel',
|
|
35
|
+
style: 'cancel'
|
|
36
|
+
}, {
|
|
37
|
+
text: 'Open Settings',
|
|
38
|
+
onPress: () => Linking.openSettings()
|
|
39
|
+
}]);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const result = await ImagePicker.launchImageLibraryAsync({
|
|
43
|
+
mediaTypes: ['images'],
|
|
44
|
+
allowsEditing: true,
|
|
45
|
+
aspect: [1, 1],
|
|
46
|
+
quality: 0.8
|
|
47
|
+
});
|
|
48
|
+
if (result.canceled || !result.assets?.[0]) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const asset = result.assets[0];
|
|
52
|
+
const originalName = asset.fileName || asset.uri.split('/').pop();
|
|
53
|
+
return {
|
|
54
|
+
uri: asset.uri,
|
|
55
|
+
type: asset.mimeType || 'image/jpeg',
|
|
56
|
+
name: originalName || `image_${Date.now()}.jpg`
|
|
57
|
+
};
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error('Failed to pick an image:', error);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=pickImageAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Alert","Linking","ImagePicker","pickImageAsset","perm","requestMediaLibraryPermissionsAsync","granted","alert","text","style","onPress","openSettings","result","launchImageLibraryAsync","mediaTypes","allowsEditing","aspect","quality","canceled","assets","asset","originalName","fileName","uri","split","pop","type","mimeType","name","Date","now","error","console"],"sourceRoot":"../../../src","sources":["helpers/pickImageAsset.ts"],"mappings":";;AAAA,SAASA,KAAK,EAAEC,OAAO,QAAQ,cAAc;AAC7C,OAAO,KAAKC,WAAW,MAAM,mBAAmB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAG,MAAAA,CAAA,KAAyC;EACrE,IAAI;IACF;IACA;IACA,MAAMC,IAAI,GAAG,MAAMF,WAAW,CAACG,mCAAmC,CAAC,CAAC;IACpE,IAAI,CAACD,IAAI,CAACE,OAAO,EAAE;MACjBN,KAAK,CAACO,KAAK,CACT,qBAAqB,EACrB,sDAAsD,EACtD,CACE;QAAEC,IAAI,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAS,CAAC,EACnC;QAAED,IAAI,EAAE,eAAe;QAAEE,OAAO,EAAEA,CAAA,KAAMT,OAAO,CAACU,YAAY,CAAC;MAAE,CAAC,CAEpE,CAAC;MACD,OAAO,IAAI;IACb;IAEA,MAAMC,MAAM,GAAG,MAAMV,WAAW,CAACW,uBAAuB,CAAC;MACvDC,UAAU,EAAE,CAAC,QAAQ,CAAC;MACtBC,aAAa,EAAE,IAAI;MACnBC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;MACdC,OAAO,EAAE;IACX,CAAC,CAAC;IACF,IAAIL,MAAM,CAACM,QAAQ,IAAI,CAACN,MAAM,CAACO,MAAM,GAAG,CAAC,CAAC,EAAE;MAC1C,OAAO,IAAI;IACb;IAEA,MAAMC,KAAK,GAAGR,MAAM,CAACO,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAME,YAAY,GAAGD,KAAK,CAACE,QAAQ,IAAIF,KAAK,CAACG,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;IACjE,OAAO;MACLF,GAAG,EAAEH,KAAK,CAACG,GAAG;MACdG,IAAI,EAAEN,KAAK,CAACO,QAAQ,IAAI,YAAY;MACpCC,IAAI,EAAEP,YAAY,IAAI,SAASQ,IAAI,CAACC,GAAG,CAAC,CAAC;IAC3C,CAAC;EACH,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;IAChD,OAAO,IAAI;EACb;AACF,CAAC","ignoreList":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { setBaseURL } from '../networking/apiClient';
|
|
4
|
+
import { refreshAuthTokens, isRefreshFatalError } from '../networking/authRefresh';
|
|
4
5
|
import { loginViaJwt } from '../networking/api-requests/auth.api';
|
|
5
6
|
import { getMyUser } from '../networking/api-requests/user.api';
|
|
6
7
|
import { store } from '../roomStore';
|
|
7
8
|
import { setUser } from '../roomStore/chatSettingsSlice';
|
|
8
9
|
import { walletToUsername } from './walletUsername';
|
|
9
|
-
import {
|
|
10
|
-
import { localStorageConstants } from './constants/LOCAL_STORAGE';
|
|
10
|
+
import { secureUserStorage } from './secureUserStorage';
|
|
11
11
|
const getStatusCode = error => {
|
|
12
12
|
const status = error?.response?.status;
|
|
13
13
|
return typeof status === 'number' ? status : null;
|
|
@@ -31,15 +31,112 @@ const normalizeUserForXmpp = user => {
|
|
|
31
31
|
xmppUsername: normalizedXmppUsername
|
|
32
32
|
};
|
|
33
33
|
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
|
|
35
|
+
// Hermes has no atob/Buffer; hand-decode just enough base64url to read a
|
|
36
|
+
// JWT's `iat`. Claims are ASCII so the byte-per-char string is fine.
|
|
37
|
+
const B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
38
|
+
const readJwtIat = token => {
|
|
39
|
+
if (!token || typeof token !== 'string') {
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
const part = token.split('.')[1];
|
|
43
|
+
if (!part) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const clean = part.replace(/-/g, '+').replace(/_/g, '/');
|
|
48
|
+
let out = '';
|
|
49
|
+
let buffer = 0;
|
|
50
|
+
let bits = 0;
|
|
51
|
+
for (let i = 0; i < clean.length; i++) {
|
|
52
|
+
const idx = B64_ALPHABET.indexOf(clean[i]);
|
|
53
|
+
if (idx === -1) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
buffer = buffer << 6 | idx;
|
|
57
|
+
bits += 6;
|
|
58
|
+
if (bits >= 8) {
|
|
59
|
+
bits -= 8;
|
|
60
|
+
out += String.fromCharCode(buffer >> bits & 0xff);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const iat = JSON.parse(out)?.iat;
|
|
64
|
+
return typeof iat === 'number' ? iat : 0;
|
|
65
|
+
} catch {
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A `userLogin.user` is typically a snapshot the host captured at ITS
|
|
72
|
+
* login time and re-presents verbatim on every mount, while this SDK
|
|
73
|
+
* keeps rotating the session and persisting the newest pair to
|
|
74
|
+
* `ETHORA_USER`. Taking the snapshot as-is therefore discards the live
|
|
75
|
+
* session in favour of an ever-aging copy: media goes blank the moment
|
|
76
|
+
* the snapshot has no `fileToken` (secure-files URLs 401 without it),
|
|
77
|
+
* and once the snapshot's refresh token ages out entirely the account
|
|
78
|
+
* looks dead even though the SDK held a working session all along.
|
|
79
|
+
*
|
|
80
|
+
* So, for the SAME account only, prefer whichever refresh pair was
|
|
81
|
+
* minted later (JWT `iat` decides — a host that genuinely re-logged-in
|
|
82
|
+
* hands us newer tokens and wins), and fill in a missing `fileToken`
|
|
83
|
+
* from the persisted copy either way.
|
|
84
|
+
*/
|
|
85
|
+
const adoptFresherPersistedSession = async candidate => {
|
|
86
|
+
try {
|
|
87
|
+
const stored = await secureUserStorage().get();
|
|
88
|
+
if (!stored) {
|
|
89
|
+
return candidate;
|
|
38
90
|
}
|
|
91
|
+
const sameUser = candidate._id && stored._id && candidate._id === stored._id || candidate.xmppUsername && stored.xmppUsername && candidate.xmppUsername === stored.xmppUsername;
|
|
92
|
+
if (!sameUser) {
|
|
93
|
+
return candidate;
|
|
94
|
+
}
|
|
95
|
+
const merged = {
|
|
96
|
+
...candidate
|
|
97
|
+
};
|
|
98
|
+
if (stored.refreshToken && readJwtIat(stored.refreshToken) > readJwtIat(candidate.refreshToken)) {
|
|
99
|
+
merged.refreshToken = stored.refreshToken;
|
|
100
|
+
if (stored.token) {
|
|
101
|
+
merged.token = stored.token;
|
|
102
|
+
}
|
|
103
|
+
if (stored.fileToken) {
|
|
104
|
+
merged.fileToken = stored.fileToken;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!merged.fileToken && stored.fileToken) {
|
|
108
|
+
merged.fileToken = stored.fileToken;
|
|
109
|
+
}
|
|
110
|
+
return merged;
|
|
111
|
+
} catch {
|
|
112
|
+
return candidate;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Bootstrap rotation.
|
|
118
|
+
*
|
|
119
|
+
* Was a second, independent `/users/login/refresh` caller that bypassed
|
|
120
|
+
* every lock in the SDK — and, worse, only wrote the rotated token to
|
|
121
|
+
* the store on the happy path, so several of the early-return branches
|
|
122
|
+
* below used to drop it. Under the backend's reuse detection a dropped
|
|
123
|
+
* rotation means the next launch presents a burned token and the
|
|
124
|
+
* session is killed.
|
|
125
|
+
*
|
|
126
|
+
* `refreshAuthTokens` persists the new pair before it resolves, so by
|
|
127
|
+
* the time this returns the rotation is safe no matter which branch the
|
|
128
|
+
* caller takes afterwards. The explicit token is required here: during
|
|
129
|
+
* bootstrap the candidate session isn't in the store yet.
|
|
130
|
+
*/
|
|
131
|
+
const refreshWithToken = async refreshToken => {
|
|
132
|
+
const result = await refreshAuthTokens({
|
|
133
|
+
refreshToken
|
|
39
134
|
});
|
|
40
135
|
return {
|
|
41
|
-
token:
|
|
42
|
-
refreshToken:
|
|
136
|
+
token: result.token,
|
|
137
|
+
refreshToken: result.refreshToken || refreshToken,
|
|
138
|
+
xmppPassword: result.xmppPassword || '',
|
|
139
|
+
fileToken: result.fileToken || ''
|
|
43
140
|
};
|
|
44
141
|
};
|
|
45
142
|
const mergeUsers = (base, patch) => {
|
|
@@ -64,10 +161,14 @@ const tryHydrateViaMy = async (candidate, myEndpoint, signal) => {
|
|
|
64
161
|
}
|
|
65
162
|
let workingToken = candidate?.token || '';
|
|
66
163
|
let workingRefresh = candidate?.refreshToken || '';
|
|
164
|
+
let rotatedXmppPassword = '';
|
|
165
|
+
let workingFileToken = candidate?.fileToken || '';
|
|
67
166
|
const candidateWithCurrentTokens = () => ({
|
|
68
167
|
...candidate,
|
|
69
168
|
token: workingToken || candidate.token,
|
|
70
|
-
refreshToken: workingRefresh || candidate.refreshToken
|
|
169
|
+
refreshToken: workingRefresh || candidate.refreshToken,
|
|
170
|
+
xmppPassword: rotatedXmppPassword || candidate.xmppPassword,
|
|
171
|
+
fileToken: workingFileToken || candidate.fileToken
|
|
71
172
|
});
|
|
72
173
|
const fallbackWithCreds = () => {
|
|
73
174
|
const normalized = normalizeUserForXmpp(candidateWithCurrentTokens());
|
|
@@ -86,6 +187,8 @@ const tryHydrateViaMy = async (candidate, myEndpoint, signal) => {
|
|
|
86
187
|
if (merged) {
|
|
87
188
|
merged.token = workingToken || merged.token;
|
|
88
189
|
merged.refreshToken = workingRefresh || merged.refreshToken;
|
|
190
|
+
merged.xmppPassword = rotatedXmppPassword || merged.xmppPassword;
|
|
191
|
+
merged.fileToken = workingFileToken || merged.fileToken;
|
|
89
192
|
}
|
|
90
193
|
return merged;
|
|
91
194
|
} catch (error) {
|
|
@@ -110,6 +213,8 @@ const tryHydrateViaMy = async (candidate, myEndpoint, signal) => {
|
|
|
110
213
|
const refreshed = await refreshWithToken(workingRefresh);
|
|
111
214
|
workingToken = refreshed.token;
|
|
112
215
|
workingRefresh = refreshed.refreshToken;
|
|
216
|
+
rotatedXmppPassword = refreshed.xmppPassword || rotatedXmppPassword;
|
|
217
|
+
workingFileToken = refreshed.fileToken || workingFileToken;
|
|
113
218
|
try {
|
|
114
219
|
const myUser = await getMyUser({
|
|
115
220
|
token: workingToken,
|
|
@@ -119,6 +224,8 @@ const tryHydrateViaMy = async (candidate, myEndpoint, signal) => {
|
|
|
119
224
|
if (merged) {
|
|
120
225
|
merged.token = workingToken || merged.token;
|
|
121
226
|
merged.refreshToken = workingRefresh || merged.refreshToken;
|
|
227
|
+
merged.xmppPassword = rotatedXmppPassword || merged.xmppPassword;
|
|
228
|
+
merged.fileToken = workingFileToken || merged.fileToken;
|
|
122
229
|
}
|
|
123
230
|
return merged;
|
|
124
231
|
} catch (myError) {
|
|
@@ -138,6 +245,13 @@ const tryHydrateViaMy = async (candidate, myEndpoint, signal) => {
|
|
|
138
245
|
if (signal?.aborted || isAbortError(error)) {
|
|
139
246
|
return null;
|
|
140
247
|
}
|
|
248
|
+
// A fatal refresh verdict (reuse detected / token not found / stale
|
|
249
|
+
// with nothing newer around) carries no HTTP response, so it would
|
|
250
|
+
// otherwise fall through to `throw` — the session is simply dead,
|
|
251
|
+
// which for bootstrap means "nothing to restore".
|
|
252
|
+
if (isRefreshFatalError(error)) {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
141
255
|
if (isAuthError(error)) {
|
|
142
256
|
return null;
|
|
143
257
|
}
|
|
@@ -155,14 +269,14 @@ export const resolveInitBeforeLoadUser = async options => {
|
|
|
155
269
|
if (config?.baseUrl) {
|
|
156
270
|
setBaseURL(config.baseUrl, config.customAppToken);
|
|
157
271
|
}
|
|
158
|
-
const myEndpoint = config?.initBeforeLoadAuth?.myEndpoint || '/users/my';
|
|
272
|
+
const myEndpoint = config?.initBeforeLoadAuth?.myEndpoint || '/v1/users/my';
|
|
159
273
|
|
|
160
274
|
// Priority 1: explicit userLogin
|
|
161
275
|
const explicitUser = config?.userLogin?.enabled ? config?.userLogin?.user : null;
|
|
162
276
|
if (explicitUser) {
|
|
163
277
|
const candidate = normalizeUserForXmpp(explicitUser);
|
|
164
278
|
if (candidate && hasXmppCredentials(candidate)) {
|
|
165
|
-
return candidate;
|
|
279
|
+
return await adoptFresherPersistedSession(candidate);
|
|
166
280
|
}
|
|
167
281
|
const hydrated = await tryHydrateViaMy(explicitUser, myEndpoint, signal).catch(() => null);
|
|
168
282
|
if (hydrated && hasXmppCredentials(hydrated)) {
|
|
@@ -219,13 +333,13 @@ export const resolveInitBeforeLoadUser = async options => {
|
|
|
219
333
|
|
|
220
334
|
// Priority 5: persisted user in AsyncStorage
|
|
221
335
|
try {
|
|
222
|
-
const storedUser = await
|
|
336
|
+
const storedUser = await secureUserStorage().get();
|
|
223
337
|
if (storedUser && (storedUser.token || storedUser.refreshToken || storedUser.xmppPassword)) {
|
|
224
338
|
const hydrated = await tryHydrateViaMy(storedUser, myEndpoint, signal).catch(() => null);
|
|
225
339
|
if (hydrated && hasXmppCredentials(hydrated)) {
|
|
226
340
|
return hydrated;
|
|
227
341
|
}
|
|
228
|
-
await
|
|
342
|
+
await secureUserStorage().remove();
|
|
229
343
|
}
|
|
230
344
|
} catch {
|
|
231
345
|
// ignore storage errors
|
|
@@ -279,7 +393,7 @@ export const refreshUserCredentialsForXmpp = async (config, signal) => {
|
|
|
279
393
|
// fall through to /users/my path
|
|
280
394
|
}
|
|
281
395
|
}
|
|
282
|
-
const myEndpoint = config?.initBeforeLoadAuth?.myEndpoint || '/users/my';
|
|
396
|
+
const myEndpoint = config?.initBeforeLoadAuth?.myEndpoint || '/v1/users/my';
|
|
283
397
|
|
|
284
398
|
// Priority 2: redux store user (covers userLogin + customLogin +
|
|
285
399
|
// anything previously persisted into chatSettingStore.user). The
|
|
@@ -297,7 +411,7 @@ export const refreshUserCredentialsForXmpp = async (config, signal) => {
|
|
|
297
411
|
// should already mirror this, but if the redux state got cleared
|
|
298
412
|
// mid-session (logout race) this gives us one last shot.
|
|
299
413
|
try {
|
|
300
|
-
const storedUser = await
|
|
414
|
+
const storedUser = await secureUserStorage().get();
|
|
301
415
|
if (storedUser && (storedUser.token || storedUser.refreshToken || storedUser.xmppPassword)) {
|
|
302
416
|
const hydrated = await tryHydrateViaMy(storedUser, myEndpoint, signal).catch(() => null);
|
|
303
417
|
if (hydrated && hasXmppCredentials(hydrated)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["http","setBaseURL","loginViaJwt","getMyUser","store","setUser","walletToUsername","asyncLocalStorage","localStorageConstants","getStatusCode","error","status","response","isAuthError","code","isAbortError","message","toLowerCase","includes","hasXmppCredentials","user","Boolean","xmppPassword","xmppUsername","defaultWallet","walletAddress","normalizeUserForXmpp","normalizedXmppUsername","refreshWithToken","refreshToken","post","headers","Authorization","token","data","mergeUsers","base","patch","tryHydrateViaMy","candidate","myEndpoint","signal","aborted","mergedCandidate","workingToken","workingRefresh","candidateWithCurrentTokens","fallbackWithCreds","normalized","myUser","endpoint","merged","fallback","refreshed","myError","resolveInitBeforeLoadUser","options","config","baseUrl","customAppToken","initBeforeLoadAuth","explicitUser","userLogin","enabled","hydrated","catch","customLogin","loginFunction","customUser","jwtLogin","jwtUser","currentUser","getState","chatSettingStore","storedUser","ETHORA_USER","get","remove","applyResolvedUserToStore","dispatch","refreshUserCredentialsForXmpp","fresh"],"sourceRoot":"../../../src","sources":["helpers/resolveInitBeforeLoadUser.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["setBaseURL","refreshAuthTokens","isRefreshFatalError","loginViaJwt","getMyUser","store","setUser","walletToUsername","secureUserStorage","getStatusCode","error","status","response","isAuthError","code","isAbortError","message","toLowerCase","includes","hasXmppCredentials","user","Boolean","xmppPassword","xmppUsername","defaultWallet","walletAddress","normalizeUserForXmpp","normalizedXmppUsername","B64_ALPHABET","readJwtIat","token","part","split","clean","replace","out","buffer","bits","i","length","idx","indexOf","String","fromCharCode","iat","JSON","parse","adoptFresherPersistedSession","candidate","stored","get","sameUser","_id","merged","refreshToken","fileToken","refreshWithToken","result","mergeUsers","base","patch","tryHydrateViaMy","myEndpoint","signal","aborted","mergedCandidate","workingToken","workingRefresh","rotatedXmppPassword","workingFileToken","candidateWithCurrentTokens","fallbackWithCreds","normalized","myUser","endpoint","fallback","refreshed","myError","resolveInitBeforeLoadUser","options","config","baseUrl","customAppToken","initBeforeLoadAuth","explicitUser","userLogin","enabled","hydrated","catch","customLogin","loginFunction","customUser","jwtLogin","jwtUser","currentUser","getState","chatSettingStore","storedUser","remove","applyResolvedUserToStore","dispatch","refreshUserCredentialsForXmpp","fresh"],"sourceRoot":"../../../src","sources":["helpers/resolveInitBeforeLoadUser.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { store } from '../roomStore';
|
|
4
|
+
import { getCurrentBaseURL } from '../networking/apiClient';
|
|
5
|
+
import { refreshAuthTokens } from '../networking/authRefresh';
|
|
6
|
+
const SECURE_FILES_HOST_PREFIX = 'secure-files.';
|
|
7
|
+
const SECURE_MEDIA_PATH_PREFIX = '/secure-media/';
|
|
8
|
+
const FILE_TOKEN_PARAM = 'ft';
|
|
9
|
+
export const resolveFileUrl = url => {
|
|
10
|
+
if (!url) {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
// Any scheme at all — http(s), data, file, content, blob.
|
|
14
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(url)) {
|
|
15
|
+
return url;
|
|
16
|
+
}
|
|
17
|
+
if (!url.startsWith('/')) {
|
|
18
|
+
return url;
|
|
19
|
+
}
|
|
20
|
+
const base = getCurrentBaseURL().replace(/\/+$/, '');
|
|
21
|
+
return base ? `${base}${url}` : url;
|
|
22
|
+
};
|
|
23
|
+
export const isSecureFileUrl = url => {
|
|
24
|
+
if (!url) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const path = url.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/]*/i, '');
|
|
28
|
+
if (path.startsWith(SECURE_MEDIA_PATH_PREFIX)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const match = /^https?:\/\/(?:[^@/]+@)?([^:/?#]+)/i.exec(url);
|
|
32
|
+
if (!match) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return match[1].toLowerCase().startsWith(SECURE_FILES_HOST_PREFIX);
|
|
36
|
+
};
|
|
37
|
+
export const appendFileToken = (url, fileToken) => {
|
|
38
|
+
if (!url) {
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
const resolved = resolveFileUrl(url);
|
|
42
|
+
if (!fileToken || !isSecureFileUrl(resolved)) {
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
url = resolved;
|
|
46
|
+
const hashIndex = url.indexOf('#');
|
|
47
|
+
const hash = hashIndex === -1 ? '' : url.slice(hashIndex);
|
|
48
|
+
const withoutHash = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
49
|
+
const queryIndex = withoutHash.indexOf('?');
|
|
50
|
+
const base = queryIndex === -1 ? withoutHash : withoutHash.slice(0, queryIndex);
|
|
51
|
+
const query = queryIndex === -1 ? '' : withoutHash.slice(queryIndex + 1);
|
|
52
|
+
const params = query.split('&').filter(Boolean).filter(pair => pair.split('=')[0] !== FILE_TOKEN_PARAM);
|
|
53
|
+
params.push(`${FILE_TOKEN_PARAM}=${encodeURIComponent(fileToken)}`);
|
|
54
|
+
return `${base}?${params.join('&')}${hash}`;
|
|
55
|
+
};
|
|
56
|
+
export const withFileToken = url => appendFileToken(url, store.getState().chatSettingStore?.user?.fileToken || '');
|
|
57
|
+
const RECOVERY_COOLDOWN_MS = 30_000;
|
|
58
|
+
let recoveryInFlight = null;
|
|
59
|
+
let lastRecoveryAt = 0;
|
|
60
|
+
export const requestFileTokenRecovery = () => {
|
|
61
|
+
if (recoveryInFlight) {
|
|
62
|
+
return recoveryInFlight;
|
|
63
|
+
}
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
if (now - lastRecoveryAt < RECOVERY_COOLDOWN_MS) {
|
|
66
|
+
return Promise.resolve(false);
|
|
67
|
+
}
|
|
68
|
+
lastRecoveryAt = now;
|
|
69
|
+
const state = store.getState();
|
|
70
|
+
const refreshConfig = state.chatSettingStore?.config?.refreshTokens;
|
|
71
|
+
const user = state.chatSettingStore?.user;
|
|
72
|
+
if (!refreshConfig?.enabled) {
|
|
73
|
+
return Promise.resolve(false);
|
|
74
|
+
}
|
|
75
|
+
const run = async () => {
|
|
76
|
+
if (!refreshConfig.refreshFunction && !user?.refreshToken) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
const tokens = await refreshAuthTokens();
|
|
80
|
+
return Boolean(tokens.fileToken);
|
|
81
|
+
};
|
|
82
|
+
recoveryInFlight = run().catch(() => false).finally(() => {
|
|
83
|
+
recoveryInFlight = null;
|
|
84
|
+
});
|
|
85
|
+
return recoveryInFlight;
|
|
86
|
+
};
|
|
87
|
+
export const __resetFileTokenRecoveryForTests = () => {
|
|
88
|
+
recoveryInFlight = null;
|
|
89
|
+
lastRecoveryAt = 0;
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=secureFileUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["store","getCurrentBaseURL","refreshAuthTokens","SECURE_FILES_HOST_PREFIX","SECURE_MEDIA_PATH_PREFIX","FILE_TOKEN_PARAM","resolveFileUrl","url","test","startsWith","base","replace","isSecureFileUrl","path","match","exec","toLowerCase","appendFileToken","fileToken","resolved","hashIndex","indexOf","hash","slice","withoutHash","queryIndex","query","params","split","filter","Boolean","pair","push","encodeURIComponent","join","withFileToken","getState","chatSettingStore","user","RECOVERY_COOLDOWN_MS","recoveryInFlight","lastRecoveryAt","requestFileTokenRecovery","now","Date","Promise","resolve","state","refreshConfig","config","refreshTokens","enabled","run","refreshFunction","refreshToken","tokens","catch","finally","__resetFileTokenRecoveryForTests"],"sourceRoot":"../../../src","sources":["helpers/secureFileUrl.ts"],"mappings":"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","ignoreList":[]}
|