@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.
Files changed (281) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +2 -2
  3. package/lib/commonjs/components/AuthForms/Login.js +4 -4
  4. package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
  5. package/lib/commonjs/components/MainComponents/ChatHeader.js +4 -1
  6. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatWrapper.js +14 -13
  8. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/LoginWrapper.js +2 -1
  10. package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/MediaMessage.js +17 -6
  12. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +9 -8
  14. package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
  15. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
  16. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  17. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +8 -7
  18. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  19. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +2 -1
  20. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  21. package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +2 -1
  22. package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
  23. package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
  24. package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
  25. package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +7 -21
  26. package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
  27. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -1
  28. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  29. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +10 -2
  30. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  31. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
  32. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  33. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +4 -1
  34. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  35. package/lib/commonjs/components/styled/AudioMessage.js +2 -1
  36. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  37. package/lib/commonjs/components/styled/MessageImage.js +34 -8
  38. package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
  39. package/lib/commonjs/components/styled/VideoMessage.js +7 -1
  40. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  41. package/lib/commonjs/context/xmppProvider.js +46 -21
  42. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  43. package/lib/commonjs/helpers/ensureScopedChatCache.js +2 -2
  44. package/lib/commonjs/helpers/ensureScopedChatCache.js.map +1 -1
  45. package/lib/commonjs/helpers/initXmppRooms.js +5 -1
  46. package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
  47. package/lib/commonjs/helpers/persistCrypto.js +122 -0
  48. package/lib/commonjs/helpers/persistCrypto.js.map +1 -0
  49. package/lib/commonjs/helpers/pickImageAsset.js +68 -0
  50. package/lib/commonjs/helpers/pickImageAsset.js.map +1 -0
  51. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +130 -17
  52. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  53. package/lib/commonjs/helpers/secureFileUrl.js +101 -0
  54. package/lib/commonjs/helpers/secureFileUrl.js.map +1 -0
  55. package/lib/commonjs/helpers/secureKeyValue.js +83 -0
  56. package/lib/commonjs/helpers/secureKeyValue.js.map +1 -0
  57. package/lib/commonjs/helpers/secureStoreRuntime.js +59 -0
  58. package/lib/commonjs/helpers/secureStoreRuntime.js.map +1 -0
  59. package/lib/commonjs/helpers/secureUserStorage.js +75 -0
  60. package/lib/commonjs/helpers/secureUserStorage.js.map +1 -0
  61. package/lib/commonjs/hooks/useChatWrapperInit.js +3 -3
  62. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  63. package/lib/commonjs/hooks/useFileToken.js +10 -0
  64. package/lib/commonjs/hooks/useFileToken.js.map +1 -0
  65. package/lib/commonjs/hooks/useLogout.js +15 -7
  66. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  67. package/lib/commonjs/hooks/useSendMessage.js +23 -13
  68. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  69. package/lib/commonjs/main.js +25 -0
  70. package/lib/commonjs/main.js.map +1 -1
  71. package/lib/commonjs/networking/api-requests/auth.api.js +99 -54
  72. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  73. package/lib/commonjs/networking/api-requests/roomMembers.api.js +1 -1
  74. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  75. package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
  76. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  77. package/lib/commonjs/networking/api-requests/user.api.js +9 -9
  78. package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
  79. package/lib/commonjs/networking/apiClient.js +62 -112
  80. package/lib/commonjs/networking/apiClient.js.map +1 -1
  81. package/lib/commonjs/networking/authRefresh.js +322 -0
  82. package/lib/commonjs/networking/authRefresh.js.map +1 -0
  83. package/lib/commonjs/networking/xmppClient.js +33 -5
  84. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  85. package/lib/commonjs/roomStore/chatSettingsSlice.js +23 -6
  86. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  87. package/lib/commonjs/roomStore/persistence.js +29 -15
  88. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  89. package/lib/commonjs/roomStore/roomsSlice.js +2 -0
  90. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  91. package/lib/module/components/AuthForms/Login.js +4 -4
  92. package/lib/module/components/AuthForms/Login.js.map +1 -1
  93. package/lib/module/components/MainComponents/ChatHeader.js +4 -1
  94. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  95. package/lib/module/components/MainComponents/ChatWrapper.js +14 -13
  96. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  97. package/lib/module/components/MainComponents/LoginWrapper.js +2 -1
  98. package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
  99. package/lib/module/components/MainComponents/MediaMessage.js +17 -6
  100. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  101. package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +9 -8
  102. package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
  103. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
  104. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  105. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +8 -7
  106. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  107. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +2 -1
  108. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  109. package/lib/module/components/Modals/NewChatModal/ModalContent.js +2 -1
  110. package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
  111. package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
  112. package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
  113. package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +9 -23
  114. package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
  115. package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -1
  116. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  117. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +10 -2
  118. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  119. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
  120. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  121. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +4 -1
  122. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  123. package/lib/module/components/styled/AudioMessage.js +2 -1
  124. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  125. package/lib/module/components/styled/MessageImage.js +34 -8
  126. package/lib/module/components/styled/MessageImage.js.map +1 -1
  127. package/lib/module/components/styled/VideoMessage.js +7 -1
  128. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  129. package/lib/module/context/xmppProvider.js +45 -21
  130. package/lib/module/context/xmppProvider.js.map +1 -1
  131. package/lib/module/helpers/ensureScopedChatCache.js +2 -2
  132. package/lib/module/helpers/ensureScopedChatCache.js.map +1 -1
  133. package/lib/module/helpers/initXmppRooms.js +5 -1
  134. package/lib/module/helpers/initXmppRooms.js.map +1 -1
  135. package/lib/module/helpers/persistCrypto.js +115 -0
  136. package/lib/module/helpers/persistCrypto.js.map +1 -0
  137. package/lib/module/helpers/pickImageAsset.js +63 -0
  138. package/lib/module/helpers/pickImageAsset.js.map +1 -0
  139. package/lib/module/helpers/resolveInitBeforeLoadUser.js +130 -16
  140. package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  141. package/lib/module/helpers/secureFileUrl.js +91 -0
  142. package/lib/module/helpers/secureFileUrl.js.map +1 -0
  143. package/lib/module/helpers/secureKeyValue.js +75 -0
  144. package/lib/module/helpers/secureKeyValue.js.map +1 -0
  145. package/lib/module/helpers/secureStoreRuntime.js +52 -0
  146. package/lib/module/helpers/secureStoreRuntime.js.map +1 -0
  147. package/lib/module/helpers/secureUserStorage.js +72 -0
  148. package/lib/module/helpers/secureUserStorage.js.map +1 -0
  149. package/lib/module/hooks/useChatWrapperInit.js +3 -3
  150. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  151. package/lib/module/hooks/useFileToken.js +5 -0
  152. package/lib/module/hooks/useFileToken.js.map +1 -0
  153. package/lib/module/hooks/useLogout.js +15 -7
  154. package/lib/module/hooks/useLogout.js.map +1 -1
  155. package/lib/module/hooks/useSendMessage.js +24 -14
  156. package/lib/module/hooks/useSendMessage.js.map +1 -1
  157. package/lib/module/main.js +12 -1
  158. package/lib/module/main.js.map +1 -1
  159. package/lib/module/networking/api-requests/auth.api.js +96 -53
  160. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  161. package/lib/module/networking/api-requests/roomMembers.api.js +1 -1
  162. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  163. package/lib/module/networking/api-requests/rooms.api.js +9 -9
  164. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  165. package/lib/module/networking/api-requests/user.api.js +8 -7
  166. package/lib/module/networking/api-requests/user.api.js.map +1 -1
  167. package/lib/module/networking/apiClient.js +61 -113
  168. package/lib/module/networking/apiClient.js.map +1 -1
  169. package/lib/module/networking/authRefresh.js +311 -0
  170. package/lib/module/networking/authRefresh.js.map +1 -0
  171. package/lib/module/networking/xmppClient.js +33 -5
  172. package/lib/module/networking/xmppClient.js.map +1 -1
  173. package/lib/module/roomStore/chatSettingsSlice.js +23 -6
  174. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  175. package/lib/module/roomStore/persistence.js +30 -15
  176. package/lib/module/roomStore/persistence.js.map +1 -1
  177. package/lib/module/roomStore/roomsSlice.js +2 -0
  178. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  179. package/lib/typescript/components/AuthForms/Login.d.ts.map +1 -1
  180. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  181. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  182. package/lib/typescript/components/MainComponents/LoginWrapper.d.ts.map +1 -1
  183. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  184. package/lib/typescript/components/MainComponents/ProfileImagePlaceholder.d.ts.map +1 -1
  185. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  186. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  187. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  188. package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +4 -2
  189. package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts.map +1 -1
  190. package/lib/typescript/components/Modals/NewChatModal/UpdNewChatModal.d.ts.map +1 -1
  191. package/lib/typescript/components/Modals/UserProfileModal/EditUserModal.d.ts.map +1 -1
  192. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  193. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
  194. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
  195. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
  196. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  197. package/lib/typescript/components/styled/MessageImage.d.ts +8 -0
  198. package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
  199. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  200. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  201. package/lib/typescript/helpers/initXmppRooms.d.ts.map +1 -1
  202. package/lib/typescript/helpers/persistCrypto.d.ts +13 -0
  203. package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -0
  204. package/lib/typescript/helpers/pickImageAsset.d.ts +27 -0
  205. package/lib/typescript/helpers/pickImageAsset.d.ts.map +1 -0
  206. package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
  207. package/lib/typescript/helpers/secureFileUrl.d.ts +7 -0
  208. package/lib/typescript/helpers/secureFileUrl.d.ts.map +1 -0
  209. package/lib/typescript/helpers/secureKeyValue.d.ts +13 -0
  210. package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -0
  211. package/lib/typescript/helpers/secureStoreRuntime.d.ts +29 -0
  212. package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +1 -0
  213. package/lib/typescript/helpers/secureUserStorage.d.ts +23 -0
  214. package/lib/typescript/helpers/secureUserStorage.d.ts.map +1 -0
  215. package/lib/typescript/hooks/useFileToken.d.ts +2 -0
  216. package/lib/typescript/hooks/useFileToken.d.ts.map +1 -0
  217. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  218. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  219. package/lib/typescript/main.d.ts +6 -1
  220. package/lib/typescript/main.d.ts.map +1 -1
  221. package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -27
  222. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  223. package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
  224. package/lib/typescript/networking/apiClient.d.ts +12 -6
  225. package/lib/typescript/networking/apiClient.d.ts.map +1 -1
  226. package/lib/typescript/networking/authRefresh.d.ts +92 -0
  227. package/lib/typescript/networking/authRefresh.d.ts.map +1 -0
  228. package/lib/typescript/networking/xmppClient.d.ts +6 -0
  229. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  230. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +16 -0
  231. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  232. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  233. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  234. package/lib/typescript/types/types.d.ts +17 -0
  235. package/lib/typescript/types/types.d.ts.map +1 -1
  236. package/package.json +8 -1
  237. package/src/components/AuthForms/Login.tsx +3 -3
  238. package/src/components/MainComponents/ChatHeader.tsx +4 -1
  239. package/src/components/MainComponents/ChatWrapper.tsx +14 -19
  240. package/src/components/MainComponents/LoginWrapper.tsx +1 -0
  241. package/src/components/MainComponents/MediaMessage.tsx +14 -4
  242. package/src/components/MainComponents/ProfileImagePlaceholder.tsx +16 -9
  243. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +4 -1
  244. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +8 -7
  245. package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
  246. package/src/components/Modals/NewChatModal/ModalContent.tsx +6 -3
  247. package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +12 -1
  248. package/src/components/Modals/UserProfileModal/EditUserModal.tsx +9 -25
  249. package/src/components/RoomComponents/ChatRoomItem.tsx +9 -1
  250. package/src/components/RoomComponents/styled/LastMessageFile.tsx +14 -2
  251. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +4 -1
  252. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +4 -1
  253. package/src/components/styled/AudioMessage.tsx +2 -1
  254. package/src/components/styled/MessageImage.tsx +45 -6
  255. package/src/components/styled/VideoMessage.tsx +10 -1
  256. package/src/context/xmppProvider.tsx +47 -23
  257. package/src/helpers/ensureScopedChatCache.ts +2 -2
  258. package/src/helpers/initXmppRooms.tsx +5 -1
  259. package/src/helpers/persistCrypto.ts +127 -0
  260. package/src/helpers/pickImageAsset.ts +68 -0
  261. package/src/helpers/resolveInitBeforeLoadUser.ts +125 -18
  262. package/src/helpers/secureFileUrl.ts +103 -0
  263. package/src/helpers/secureKeyValue.ts +80 -0
  264. package/src/helpers/secureStoreRuntime.ts +62 -0
  265. package/src/helpers/secureUserStorage.ts +80 -0
  266. package/src/hooks/useChatWrapperInit.ts +3 -3
  267. package/src/hooks/useFileToken.ts +7 -0
  268. package/src/hooks/useLogout.tsx +15 -9
  269. package/src/hooks/useSendMessage.tsx +28 -13
  270. package/src/main.ts +22 -1
  271. package/src/networking/api-requests/auth.api.ts +125 -52
  272. package/src/networking/api-requests/roomMembers.api.ts +1 -1
  273. package/src/networking/api-requests/rooms.api.ts +9 -9
  274. package/src/networking/api-requests/user.api.ts +8 -7
  275. package/src/networking/apiClient.ts +68 -123
  276. package/src/networking/authRefresh.ts +430 -0
  277. package/src/networking/xmppClient.ts +37 -5
  278. package/src/roomStore/chatSettingsSlice.ts +31 -9
  279. package/src/roomStore/persistence.ts +39 -19
  280. package/src/roomStore/roomsSlice.ts +2 -0
  281. 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 http, { setBaseURL } from '../networking/apiClient';
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 { asyncLocalStorage } from '../hooks/useLocalStorage';
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
- const refreshWithToken = async refreshToken => {
35
- const response = await http.post('/users/login/refresh', {}, {
36
- headers: {
37
- Authorization: refreshToken
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: response?.data?.token || '',
42
- refreshToken: response?.data?.refreshToken || 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 asyncLocalStorage(localStorageConstants.ETHORA_USER).get();
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 asyncLocalStorage(localStorageConstants.ETHORA_USER).remove();
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 asyncLocalStorage(localStorageConstants.ETHORA_USER).get();
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":[]}