@ethora/chat-component-rn 26.8.6 → 26.8.7

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 (409) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +40 -0
  3. package/lib/commonjs/assets/icons.js +4 -2
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/MainComponents/ChatHeader.js +28 -6
  6. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatRoom.js +9 -1
  8. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js +47 -0
  10. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  11. package/lib/commonjs/components/MainComponents/EncryptionCard.js +286 -0
  12. package/lib/commonjs/components/MainComponents/EncryptionCard.js.map +1 -0
  13. package/lib/commonjs/components/MainComponents/MediaMessage.js +7 -0
  14. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  15. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +5 -0
  16. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  17. package/lib/commonjs/components/MainComponents/SealedAttachment.js +231 -0
  18. package/lib/commonjs/components/MainComponents/SealedAttachment.js.map +1 -0
  19. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +2 -1
  20. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  21. package/lib/commonjs/components/MessageBubble/Message.js +66 -6
  22. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  23. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +2 -1
  24. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  25. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  26. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  27. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +159 -16
  28. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  29. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +4 -0
  30. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  31. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +29 -6
  32. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  33. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +5 -1
  34. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  35. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +32 -9
  36. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  37. package/lib/commonjs/components/RoomComponents/LastMessageItem.js +6 -0
  38. package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
  39. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  40. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  41. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +4 -6
  42. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  43. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  44. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  45. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js +41 -0
  46. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  47. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  48. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  49. package/lib/commonjs/components/Thread/ThreadWrapper.js +53 -45
  50. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  51. package/lib/commonjs/components/UsersList/UsersList.js +2 -1
  52. package/lib/commonjs/components/UsersList/UsersList.js.map +1 -1
  53. package/lib/commonjs/components/styled/SendInput.js +4 -2
  54. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  55. package/lib/commonjs/e2ee/crypto.js +207 -0
  56. package/lib/commonjs/e2ee/crypto.js.map +1 -0
  57. package/lib/commonjs/e2ee/deviceStore.js +84 -0
  58. package/lib/commonjs/e2ee/deviceStore.js.map +1 -0
  59. package/lib/commonjs/e2ee/fileCipher.js +95 -0
  60. package/lib/commonjs/e2ee/fileCipher.js.map +1 -0
  61. package/lib/commonjs/e2ee/fileEnvelope.js +79 -0
  62. package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -0
  63. package/lib/commonjs/e2ee/index.js +210 -0
  64. package/lib/commonjs/e2ee/index.js.map +1 -0
  65. package/lib/commonjs/e2ee/limits.js +9 -0
  66. package/lib/commonjs/e2ee/limits.js.map +1 -0
  67. package/lib/commonjs/e2ee/ns.js +8 -0
  68. package/lib/commonjs/e2ee/ns.js.map +1 -0
  69. package/lib/commonjs/e2ee/omemo.js +622 -0
  70. package/lib/commonjs/e2ee/omemo.js.map +1 -0
  71. package/lib/commonjs/e2ee/protobuf.js +149 -0
  72. package/lib/commonjs/e2ee/protobuf.js.map +1 -0
  73. package/lib/commonjs/e2ee/ratchet.js +238 -0
  74. package/lib/commonjs/e2ee/ratchet.js.map +1 -0
  75. package/lib/commonjs/e2ee/sealedBody.js +23 -0
  76. package/lib/commonjs/e2ee/sealedBody.js.map +1 -0
  77. package/lib/commonjs/e2ee/sealedFiles.js +174 -0
  78. package/lib/commonjs/e2ee/sealedFiles.js.map +1 -0
  79. package/lib/commonjs/e2ee/send.js +54 -0
  80. package/lib/commonjs/e2ee/send.js.map +1 -0
  81. package/lib/commonjs/e2ee/stanza.js +114 -0
  82. package/lib/commonjs/e2ee/stanza.js.map +1 -0
  83. package/lib/commonjs/e2ee/store.js +43 -0
  84. package/lib/commonjs/e2ee/store.js.map +1 -0
  85. package/lib/commonjs/helpers/accountName.js +23 -0
  86. package/lib/commonjs/helpers/accountName.js.map +1 -0
  87. package/lib/commonjs/helpers/createMessageFromXml.js +19 -4
  88. package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
  89. package/lib/commonjs/helpers/createUserNameFromSetUser.js +2 -1
  90. package/lib/commonjs/helpers/createUserNameFromSetUser.js.map +1 -1
  91. package/lib/commonjs/helpers/displayName.js +16 -0
  92. package/lib/commonjs/helpers/displayName.js.map +1 -0
  93. package/lib/commonjs/helpers/persistCrypto.js +5 -0
  94. package/lib/commonjs/helpers/persistCrypto.js.map +1 -1
  95. package/lib/commonjs/helpers/secureKeyValue.js +20 -0
  96. package/lib/commonjs/helpers/secureKeyValue.js.map +1 -1
  97. package/lib/commonjs/helpers/videoCache.js +136 -0
  98. package/lib/commonjs/helpers/videoCache.js.map +1 -0
  99. package/lib/commonjs/hooks/useLogout.js +8 -0
  100. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  101. package/lib/commonjs/hooks/useSendMessage.js +71 -7
  102. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  103. package/lib/commonjs/i18n/strings.js +180 -0
  104. package/lib/commonjs/i18n/strings.js.map +1 -1
  105. package/lib/commonjs/main.js +13 -0
  106. package/lib/commonjs/main.js.map +1 -1
  107. package/lib/commonjs/networking/api-requests/auth.api.js +4 -1
  108. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  109. package/lib/commonjs/networking/api-requests/rooms.api.js +111 -17
  110. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  111. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +40 -0
  112. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  113. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  114. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  115. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  116. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  117. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  118. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  119. package/lib/commonjs/networking/xmppClient.js +6 -0
  120. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  121. package/lib/commonjs/roomStore/persistBackend.js +9 -12
  122. package/lib/commonjs/roomStore/persistBackend.js.map +1 -1
  123. package/lib/commonjs/roomStore/persistence.js +8 -1
  124. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  125. package/lib/commonjs/version.js +1 -1
  126. package/lib/module/assets/icons.js +3 -1
  127. package/lib/module/assets/icons.js.map +1 -1
  128. package/lib/module/components/MainComponents/ChatHeader.js +29 -7
  129. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  130. package/lib/module/components/MainComponents/ChatRoom.js +9 -1
  131. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  132. package/lib/module/components/MainComponents/EncryptedSendNotice.js +42 -0
  133. package/lib/module/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  134. package/lib/module/components/MainComponents/EncryptionCard.js +281 -0
  135. package/lib/module/components/MainComponents/EncryptionCard.js.map +1 -0
  136. package/lib/module/components/MainComponents/MediaMessage.js +7 -0
  137. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  138. package/lib/module/components/MainComponents/ReduxWrapper.js +5 -0
  139. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  140. package/lib/module/components/MainComponents/SealedAttachment.js +224 -0
  141. package/lib/module/components/MainComponents/SealedAttachment.js.map +1 -0
  142. package/lib/module/components/MessageBubble/BottomReplyContainer.js +2 -1
  143. package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  144. package/lib/module/components/MessageBubble/Message.js +69 -9
  145. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  146. package/lib/module/components/MessageBubble/MessageInteractions.js +2 -1
  147. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  148. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  149. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  150. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +161 -18
  151. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  152. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +4 -0
  153. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  154. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +32 -8
  155. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  156. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +4 -0
  157. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  158. package/lib/module/components/RoomComponents/ChatRoomItem.js +32 -9
  159. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  160. package/lib/module/components/RoomComponents/LastMessageItem.js +6 -0
  161. package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
  162. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  163. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  164. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +4 -6
  165. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  166. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  167. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  168. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js +36 -0
  169. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  170. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  171. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  172. package/lib/module/components/Thread/ThreadWrapper.js +54 -46
  173. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  174. package/lib/module/components/UsersList/UsersList.js +2 -1
  175. package/lib/module/components/UsersList/UsersList.js.map +1 -1
  176. package/lib/module/components/styled/SendInput.js +4 -2
  177. package/lib/module/components/styled/SendInput.js.map +1 -1
  178. package/lib/module/e2ee/crypto.js +170 -0
  179. package/lib/module/e2ee/crypto.js.map +1 -0
  180. package/lib/module/e2ee/deviceStore.js +77 -0
  181. package/lib/module/e2ee/deviceStore.js.map +1 -0
  182. package/lib/module/e2ee/fileCipher.js +90 -0
  183. package/lib/module/e2ee/fileCipher.js.map +1 -0
  184. package/lib/module/e2ee/fileEnvelope.js +66 -0
  185. package/lib/module/e2ee/fileEnvelope.js.map +1 -0
  186. package/lib/module/e2ee/index.js +185 -0
  187. package/lib/module/e2ee/index.js.map +1 -0
  188. package/lib/module/e2ee/limits.js +5 -0
  189. package/lib/module/e2ee/limits.js.map +1 -0
  190. package/lib/module/e2ee/ns.js +4 -0
  191. package/lib/module/e2ee/ns.js.map +1 -0
  192. package/lib/module/e2ee/omemo.js +610 -0
  193. package/lib/module/e2ee/omemo.js.map +1 -0
  194. package/lib/module/e2ee/protobuf.js +140 -0
  195. package/lib/module/e2ee/protobuf.js.map +1 -0
  196. package/lib/module/e2ee/ratchet.js +228 -0
  197. package/lib/module/e2ee/ratchet.js.map +1 -0
  198. package/lib/module/e2ee/sealedBody.js +19 -0
  199. package/lib/module/e2ee/sealedBody.js.map +1 -0
  200. package/lib/module/e2ee/sealedFiles.js +154 -0
  201. package/lib/module/e2ee/sealedFiles.js.map +1 -0
  202. package/lib/module/e2ee/send.js +48 -0
  203. package/lib/module/e2ee/send.js.map +1 -0
  204. package/lib/module/e2ee/stanza.js +107 -0
  205. package/lib/module/e2ee/stanza.js.map +1 -0
  206. package/lib/module/e2ee/store.js +35 -0
  207. package/lib/module/e2ee/store.js.map +1 -0
  208. package/lib/module/helpers/accountName.js +18 -0
  209. package/lib/module/helpers/accountName.js.map +1 -0
  210. package/lib/module/helpers/createMessageFromXml.js +19 -4
  211. package/lib/module/helpers/createMessageFromXml.js.map +1 -1
  212. package/lib/module/helpers/createUserNameFromSetUser.js +3 -1
  213. package/lib/module/helpers/createUserNameFromSetUser.js.map +1 -1
  214. package/lib/module/helpers/displayName.js +11 -0
  215. package/lib/module/helpers/displayName.js.map +1 -0
  216. package/lib/module/helpers/persistCrypto.js +4 -0
  217. package/lib/module/helpers/persistCrypto.js.map +1 -1
  218. package/lib/module/helpers/secureKeyValue.js +19 -0
  219. package/lib/module/helpers/secureKeyValue.js.map +1 -1
  220. package/lib/module/helpers/videoCache.js +125 -0
  221. package/lib/module/helpers/videoCache.js.map +1 -0
  222. package/lib/module/hooks/useLogout.js +8 -0
  223. package/lib/module/hooks/useLogout.js.map +1 -1
  224. package/lib/module/hooks/useSendMessage.js +71 -7
  225. package/lib/module/hooks/useSendMessage.js.map +1 -1
  226. package/lib/module/i18n/strings.js +180 -0
  227. package/lib/module/i18n/strings.js.map +1 -1
  228. package/lib/module/main.js +1 -0
  229. package/lib/module/main.js.map +1 -1
  230. package/lib/module/networking/api-requests/auth.api.js +4 -1
  231. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  232. package/lib/module/networking/api-requests/rooms.api.js +109 -18
  233. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  234. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +38 -0
  235. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  236. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  237. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  238. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  239. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  240. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  241. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  242. package/lib/module/networking/xmppClient.js +6 -0
  243. package/lib/module/networking/xmppClient.js.map +1 -1
  244. package/lib/module/roomStore/persistBackend.js +10 -13
  245. package/lib/module/roomStore/persistBackend.js.map +1 -1
  246. package/lib/module/roomStore/persistence.js +8 -1
  247. package/lib/module/roomStore/persistence.js.map +1 -1
  248. package/lib/module/version.js +1 -1
  249. package/lib/typescript/assets/icons.d.ts +8 -0
  250. package/lib/typescript/assets/icons.d.ts.map +1 -1
  251. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  252. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  253. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts +4 -0
  254. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts.map +1 -0
  255. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts +10 -0
  256. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts.map +1 -0
  257. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  258. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  259. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts +13 -0
  260. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts.map +1 -0
  261. package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
  262. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  263. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  264. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  265. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  266. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  267. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  268. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
  269. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  270. package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
  271. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
  272. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts +7 -0
  273. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts.map +1 -0
  274. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  275. package/lib/typescript/components/UsersList/UsersList.d.ts.map +1 -1
  276. package/lib/typescript/components/styled/SendInput.d.ts +1 -0
  277. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  278. package/lib/typescript/e2ee/crypto.d.ts +28 -0
  279. package/lib/typescript/e2ee/crypto.d.ts.map +1 -0
  280. package/lib/typescript/e2ee/deviceStore.d.ts +4 -0
  281. package/lib/typescript/e2ee/deviceStore.d.ts.map +1 -0
  282. package/lib/typescript/e2ee/fileCipher.d.ts +7 -0
  283. package/lib/typescript/e2ee/fileCipher.d.ts.map +1 -0
  284. package/lib/typescript/e2ee/fileEnvelope.d.ts +27 -0
  285. package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -0
  286. package/lib/typescript/e2ee/index.d.ts +23 -0
  287. package/lib/typescript/e2ee/index.d.ts.map +1 -0
  288. package/lib/typescript/e2ee/limits.d.ts +3 -0
  289. package/lib/typescript/e2ee/limits.d.ts.map +1 -0
  290. package/lib/typescript/e2ee/ns.d.ts +2 -0
  291. package/lib/typescript/e2ee/ns.d.ts.map +1 -0
  292. package/lib/typescript/e2ee/omemo.d.ts +64 -0
  293. package/lib/typescript/e2ee/omemo.d.ts.map +1 -0
  294. package/lib/typescript/e2ee/protobuf.d.ts +25 -0
  295. package/lib/typescript/e2ee/protobuf.d.ts.map +1 -0
  296. package/lib/typescript/e2ee/ratchet.d.ts +39 -0
  297. package/lib/typescript/e2ee/ratchet.d.ts.map +1 -0
  298. package/lib/typescript/e2ee/sealedBody.d.ts +2 -0
  299. package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -0
  300. package/lib/typescript/e2ee/sealedFiles.d.ts +31 -0
  301. package/lib/typescript/e2ee/sealedFiles.d.ts.map +1 -0
  302. package/lib/typescript/e2ee/send.d.ts +6 -0
  303. package/lib/typescript/e2ee/send.d.ts.map +1 -0
  304. package/lib/typescript/e2ee/stanza.d.ts +8 -0
  305. package/lib/typescript/e2ee/stanza.d.ts.map +1 -0
  306. package/lib/typescript/e2ee/store.d.ts +16 -0
  307. package/lib/typescript/e2ee/store.d.ts.map +1 -0
  308. package/lib/typescript/helpers/accountName.d.ts +7 -0
  309. package/lib/typescript/helpers/accountName.d.ts.map +1 -0
  310. package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
  311. package/lib/typescript/helpers/createUserNameFromSetUser.d.ts.map +1 -1
  312. package/lib/typescript/helpers/displayName.d.ts +2 -0
  313. package/lib/typescript/helpers/displayName.d.ts.map +1 -0
  314. package/lib/typescript/helpers/persistCrypto.d.ts +1 -0
  315. package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -1
  316. package/lib/typescript/helpers/secureKeyValue.d.ts +4 -0
  317. package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -1
  318. package/lib/typescript/helpers/videoCache.d.ts +19 -0
  319. package/lib/typescript/helpers/videoCache.d.ts.map +1 -0
  320. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  321. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  322. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  323. package/lib/typescript/main.d.ts +2 -0
  324. package/lib/typescript/main.d.ts.map +1 -1
  325. package/lib/typescript/networking/api-requests/auth.api.d.ts +4 -1
  326. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  327. package/lib/typescript/networking/api-requests/rooms.api.d.ts +22 -1
  328. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  329. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts +1 -0
  330. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  331. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  332. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  333. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  334. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  335. package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -1
  336. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  337. package/lib/typescript/types/models/message.model.d.ts +5 -0
  338. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  339. package/lib/typescript/types/models/room.model.d.ts +5 -0
  340. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  341. package/lib/typescript/types/types.d.ts +4 -0
  342. package/lib/typescript/types/types.d.ts.map +1 -1
  343. package/lib/typescript/version.d.ts +1 -1
  344. package/package.json +8 -4
  345. package/src/assets/icons.tsx +27 -0
  346. package/src/components/MainComponents/ChatHeader.tsx +30 -9
  347. package/src/components/MainComponents/ChatRoom.tsx +11 -1
  348. package/src/components/MainComponents/EncryptedSendNotice.tsx +35 -0
  349. package/src/components/MainComponents/EncryptionCard.tsx +287 -0
  350. package/src/components/MainComponents/MediaMessage.tsx +5 -0
  351. package/src/components/MainComponents/ReduxWrapper.tsx +5 -0
  352. package/src/components/MainComponents/SealedAttachment.tsx +251 -0
  353. package/src/components/MessageBubble/BottomReplyContainer.tsx +2 -1
  354. package/src/components/MessageBubble/Message.tsx +96 -6
  355. package/src/components/MessageBubble/MessageInteractions.tsx +2 -3
  356. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +7 -4
  357. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +181 -35
  358. package/src/components/Modals/FilePreviewModal/PdfView.tsx +4 -0
  359. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +53 -8
  360. package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +5 -0
  361. package/src/components/RoomComponents/ChatRoomItem.tsx +23 -11
  362. package/src/components/RoomComponents/LastMessageItem.tsx +5 -0
  363. package/src/components/RoomComponents/styled/LastAudioMessage.tsx +3 -1
  364. package/src/components/RoomComponents/styled/LastMessageFile.tsx +2 -2
  365. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +1 -1
  366. package/src/components/RoomComponents/styled/LastMessageSealed.tsx +31 -0
  367. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +1 -1
  368. package/src/components/Thread/ThreadWrapper.tsx +13 -0
  369. package/src/components/UsersList/UsersList.tsx +2 -1
  370. package/src/components/styled/SendInput.tsx +5 -2
  371. package/src/e2ee/crypto.ts +194 -0
  372. package/src/e2ee/deviceStore.ts +80 -0
  373. package/src/e2ee/fileCipher.ts +86 -0
  374. package/src/e2ee/fileEnvelope.ts +115 -0
  375. package/src/e2ee/index.ts +192 -0
  376. package/src/e2ee/limits.ts +2 -0
  377. package/src/e2ee/ns.ts +1 -0
  378. package/src/e2ee/omemo.ts +802 -0
  379. package/src/e2ee/protobuf.ts +188 -0
  380. package/src/e2ee/ratchet.ts +271 -0
  381. package/src/e2ee/sealedBody.ts +17 -0
  382. package/src/e2ee/sealedFiles.ts +181 -0
  383. package/src/e2ee/send.ts +70 -0
  384. package/src/e2ee/stanza.ts +133 -0
  385. package/src/e2ee/store.ts +54 -0
  386. package/src/helpers/accountName.ts +15 -0
  387. package/src/helpers/createMessageFromXml.ts +31 -6
  388. package/src/helpers/createUserNameFromSetUser.ts +2 -1
  389. package/src/helpers/displayName.ts +9 -0
  390. package/src/helpers/persistCrypto.ts +5 -0
  391. package/src/helpers/secureKeyValue.ts +15 -0
  392. package/src/helpers/videoCache.ts +138 -0
  393. package/src/hooks/useLogout.tsx +9 -0
  394. package/src/hooks/useSendMessage.tsx +71 -5
  395. package/src/i18n/strings.ts +180 -0
  396. package/src/main.ts +2 -0
  397. package/src/networking/api-requests/auth.api.ts +9 -1
  398. package/src/networking/api-requests/rooms.api.ts +121 -18
  399. package/src/networking/xmpp/handleStanzas.xmpp.ts +49 -0
  400. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +19 -1
  401. package/src/networking/xmpp/sendTextMessage.xmpp.ts +17 -10
  402. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +23 -10
  403. package/src/networking/xmppClient.ts +6 -0
  404. package/src/roomStore/persistBackend.ts +8 -11
  405. package/src/roomStore/persistence.ts +15 -0
  406. package/src/types/models/message.model.ts +5 -0
  407. package/src/types/models/room.model.ts +5 -0
  408. package/src/types/types.ts +4 -0
  409. package/src/version.ts +1 -1
@@ -20,6 +20,12 @@ import {
20
20
  } from '../stanzaHandlers';
21
21
  import XmppClient from '../xmppClient';
22
22
  import { onCallTokenMessage } from '../callTokenStanza';
23
+ import { accountDomain, isE2eeEnabled } from '../../e2ee';
24
+ import {
25
+ decryptStanzaInPlace,
26
+ encryptedCarrier,
27
+ rewriteEncryptedStanza,
28
+ } from '../../e2ee/stanza';
23
29
 
24
30
  /**
25
31
  * Unwrap a mucsub event wrapper so the chat handlers see the real inner
@@ -49,7 +55,46 @@ const unwrapMucsubMessage = (stanza: Element): Element => {
49
55
  return (inner as Element) || stanza;
50
56
  };
51
57
 
58
+ let held = 0;
59
+ let queue: Promise<void> = Promise.resolve();
60
+
52
61
  export function handleStanza(stanza: Element, xmppWs: XmppClient) {
62
+ if (!isE2eeEnabled()) {
63
+ dispatchStanza(stanza, xmppWs);
64
+ return;
65
+ }
66
+ const carrier =
67
+ stanza?.name === 'message' ? encryptedCarrier(stanza) : undefined;
68
+ if (!carrier && held === 0) {
69
+ dispatchStanza(stanza, xmppWs);
70
+ return;
71
+ }
72
+
73
+ held++;
74
+ queue = queue.then(async () => {
75
+ try {
76
+ if (carrier) {
77
+ const outcome = await decryptStanzaInPlace(
78
+ stanza,
79
+ accountDomain(xmppWs.client)
80
+ );
81
+ if (outcome === 'drop') {return;}
82
+ }
83
+ dispatchStanza(stanza, xmppWs);
84
+ } catch (err) {
85
+ console.warn('OMEMO: failed to handle stanza', err);
86
+ } finally {
87
+ held--;
88
+ }
89
+ });
90
+ }
91
+
92
+ export const __resetStanzaQueueForTests = (): void => {
93
+ held = 0;
94
+ queue = Promise.resolve();
95
+ };
96
+
97
+ function dispatchStanza(stanza: Element, xmppWs: XmppClient) {
53
98
  if (stanza?.attrs?.type === 'headline') {return;}
54
99
 
55
100
  // Call signaling is swallowed before any chat handler sees it. A
@@ -61,6 +106,10 @@ export function handleStanza(stanza: Element, xmppWs: XmppClient) {
61
106
  return;
62
107
  }
63
108
 
109
+ if (stanza?.name === 'message' && rewriteEncryptedStanza(stanza) === 'drop') {
110
+ return;
111
+ }
112
+
64
113
  switch (stanza.name) {
65
114
  case 'message': {
66
115
  const unwrapped = unwrapMucsubMessage(stanza);
@@ -1,4 +1,5 @@
1
1
  import { Client, xml } from '@xmpp/client';
2
+ import { sendSealedMedia, shouldEncrypt } from '../../e2ee/send';
2
3
 
3
4
  // Monotonic counter — see sendTextMessage for the rationale (avoids
4
5
  // Date.now() id collisions on <1ms-apart sends).
@@ -63,6 +64,23 @@ export function sendMediaMessage(
63
64
  push: 'true',
64
65
  };
65
66
 
67
+ const keys: string[] | undefined = data?.e2eeKeys;
68
+ if (keys?.length) {
69
+ (dataToSend as Record<string, unknown>).clientEncrypted = 'true';
70
+ }
71
+ const hints = xml('store', { xmlns: 'urn:xmpp:hints' });
72
+
73
+ if (keys?.length && shouldEncrypt(roomJID)) {
74
+ sendSealedMedia(
75
+ client,
76
+ roomJID,
77
+ id,
78
+ xml('body', {}, JSON.stringify({ v: 1, keys })),
79
+ [xml('data', dataToSend), hints]
80
+ );
81
+ return id;
82
+ }
83
+
66
84
  const message = xml(
67
85
  'message',
68
86
  {
@@ -72,7 +90,7 @@ export function sendMediaMessage(
72
90
  to: roomJID,
73
91
  },
74
92
  xml('body', {}, 'media'),
75
- xml('store', { xmlns: 'urn:xmpp:hints' }),
93
+ hints,
76
94
  xml('data', dataToSend)
77
95
  );
78
96
 
@@ -1,4 +1,5 @@
1
1
  import { Client, xml } from '@xmpp/client';
2
+ import { sendEncrypted, shouldEncrypt } from '../../e2ee/send';
2
3
 
3
4
  // Local monotonic counter — see comment in id construction below.
4
5
  let _sendTextSeq = 0;
@@ -52,14 +53,7 @@ export const sendTextMessage = (
52
53
 
53
54
  try {
54
55
  const dataXmlns = toServiceXmlns(devServer, client);
55
- const message = xml(
56
- 'message',
57
- {
58
- to: roomJID,
59
- type: 'groupchat',
60
- id: id,
61
- },
62
- xml('data', {
56
+ const data = xml('data', {
63
57
  xmlns: dataXmlns,
64
58
  senderFirstName: firstName,
65
59
  senderLastName: lastName,
@@ -76,9 +70,22 @@ export const sendTextMessage = (
76
70
  isReply: isReply || false,
77
71
  mainMessage: mainMessage || '',
78
72
  push: 'true',
79
- }),
80
- xml('body', {}, userMessage)
73
+ });
74
+ const body = xml('body', {}, userMessage);
75
+ const message = xml(
76
+ 'message',
77
+ {
78
+ to: roomJID,
79
+ type: 'groupchat',
80
+ id: id,
81
+ },
82
+ data,
83
+ body
81
84
  );
85
+ if (shouldEncrypt(roomJID)) {
86
+ sendEncrypted(client, roomJID, id, data, body, message);
87
+ return;
88
+ }
82
89
  const sendResult = client.send(message);
83
90
  if (sendResult && typeof (sendResult as any).then === 'function') {
84
91
  (sendResult as Promise<unknown>)
@@ -1,6 +1,7 @@
1
1
  import { Client, xml } from '@xmpp/client';
2
2
  import { Iso639_1Codes } from '../../types/types';
3
3
  import { toServiceXmlns } from './sendTextMessage.xmpp';
4
+ import { sendEncrypted, shouldEncrypt } from '../../e2ee/send';
4
5
 
5
6
  /**
6
7
  * Same wire message as `sendTextMessage`, plus a `<translate source="xx"/>`
@@ -39,14 +40,7 @@ export const sendTextMessageWithTranslateTag = (
39
40
 
40
41
  try {
41
42
  const dataXmlns = toServiceXmlns(stanzaMessage.devServer, client);
42
- const message = xml(
43
- 'message',
44
- {
45
- to: stanzaMessage.roomJID,
46
- type: 'groupchat',
47
- id,
48
- },
49
- xml('data', {
43
+ const data = xml('data', {
50
44
  xmlns: dataXmlns,
51
45
  senderFirstName: stanzaMessage.firstName,
52
46
  senderLastName: stanzaMessage.lastName,
@@ -63,8 +57,27 @@ export const sendTextMessageWithTranslateTag = (
63
57
  isReply: stanzaMessage.isReply || false,
64
58
  mainMessage: stanzaMessage.mainMessage || '',
65
59
  push: 'true',
66
- }),
67
- xml('body', {}, stanzaMessage.userMessage),
60
+ });
61
+ const body = xml('body', {}, stanzaMessage.userMessage);
62
+ const envelope = { to: stanzaMessage.roomJID, type: 'groupchat', id };
63
+
64
+ if (shouldEncrypt(stanzaMessage.roomJID)) {
65
+ sendEncrypted(
66
+ client,
67
+ stanzaMessage.roomJID,
68
+ id,
69
+ data,
70
+ body,
71
+ xml('message', envelope, data, body)
72
+ );
73
+ return true;
74
+ }
75
+
76
+ const message = xml(
77
+ 'message',
78
+ envelope,
79
+ data,
80
+ body,
68
81
  // `<translate source>` only DECLARES the language this text is in; it
69
82
  // costs nothing to send and is what lets each reader translate the
70
83
  // message into their own language on their side.
@@ -24,6 +24,7 @@ import { editMessage } from './xmpp/editMessage.xmpp';
24
24
  import { inviteRoomRequest } from './xmpp/inviteRoomRequest.xmpp';
25
25
  import { getRooms } from './xmpp/getRooms.xmpp';
26
26
  import { handleStanza } from './xmpp/handleStanzas.xmpp';
27
+ import { onOnline as e2eeOnOnline } from '../e2ee';
27
28
  import { pushLog as devPushLog, isDevLogActive } from '../utils/devLogger';
28
29
  import { normalizeRoomJid } from '../helpers/normalizeRoomJid';
29
30
  import { store } from '../roomStore';
@@ -569,6 +570,11 @@ export class XmppClient {
569
570
  } catch (err) {
570
571
  console.warn('onOnline callback failed', err);
571
572
  }
573
+ try {
574
+ e2eeOnOnline(this.client);
575
+ } catch (err) {
576
+ console.warn('e2ee onOnline failed', err);
577
+ }
572
578
  // Drain any sends that were buffered while the stream was down. The
573
579
  // presence stanzas from onOnlineCallback above were written to the
574
580
  // socket synchronously (allRoomPresences → presenceInRoom send the
@@ -1,5 +1,5 @@
1
1
  import AsyncStorage from '@react-native-async-storage/async-storage';
2
- import { secureGet, secureSet } from '../helpers/secureKeyValue';
2
+ import { secureGetOrCreate } from '../helpers/secureKeyValue';
3
3
  import { encryptForPersist, decryptFromPersist } from '../helpers/persistCrypto';
4
4
 
5
5
 
@@ -12,7 +12,7 @@ export interface PersistBackend {
12
12
  }
13
13
 
14
14
  const MMKV_INSTANCE_ID = 'ethora-chat-persist';
15
- const MMKV_KEY_STORE_KEY = '@ethora/persist:mmkvKey';
15
+ const MMKV_KEY_STORE_KEY = 'ethora_persist_mmkv_key';
16
16
  const MMKV_KEY_LENGTH = 16;
17
17
 
18
18
  const randomKey = (length: number): string => {
@@ -25,13 +25,6 @@ const randomKey = (length: number): string => {
25
25
  return out;
26
26
  };
27
27
 
28
- const loadOrCreateMmkvKey = async (): Promise<string> => {
29
- const existing = await secureGet(MMKV_KEY_STORE_KEY);
30
- if (existing) {return existing;}
31
- const key = randomKey(MMKV_KEY_LENGTH);
32
- await secureSet(MMKV_KEY_STORE_KEY, key);
33
- return key;
34
- };
35
28
 
36
29
  const createMmkvBackend = async (): Promise<PersistBackend | null> => {
37
30
  let MMKV: any;
@@ -42,9 +35,13 @@ const createMmkvBackend = async (): Promise<PersistBackend | null> => {
42
35
  }
43
36
  if (typeof MMKV !== 'function') {return null;}
44
37
  try {
45
- const encryptionKey = await loadOrCreateMmkvKey();
38
+ const key = await secureGetOrCreate(MMKV_KEY_STORE_KEY, () =>
39
+ randomKey(MMKV_KEY_LENGTH)
40
+ );
41
+ if (!key) {return null;}
46
42
  // Throws when the native module is missing from the binary.
47
- const storage = new MMKV({ id: MMKV_INSTANCE_ID, encryptionKey });
43
+ const storage = new MMKV({ id: MMKV_INSTANCE_ID, encryptionKey: key.value });
44
+ if (key.created) {storage.clearAll();}
48
45
  return {
49
46
  name: 'mmkv',
50
47
  getMany: async (keys) => keys.map((k) => storage.getString(k) ?? null),
@@ -132,6 +132,11 @@ const PERSISTED_MESSAGE_FIELDS: (keyof IMessage)[] = [
132
132
  // computeBootTimeFailures below) find exactly the messages that never
133
133
  // got confirmed and flip them to failed instead.
134
134
  'pending',
135
+ 'unencrypted',
136
+ 'undecryptable',
137
+ 'e2eeError',
138
+ 'clientEncrypted',
139
+ 'e2eeKeys',
135
140
  ];
136
141
 
137
142
  // The sender identity that rides along on every message over the wire
@@ -164,6 +169,7 @@ const PERSISTED_MESSAGE_USER_FIELDS = ['id', 'name'] as const;
164
169
  // repopulates from /chats/my on the very next load. `usersCnt`, which the
165
170
  // header actually reads, is its own scalar field and is preserved below.
166
171
  const REFETCHED_ROOM_FIELDS = ['members'] as const;
172
+ const PERSISTED_ROOM_MEMBERS = 30;
167
173
 
168
174
  const pickDefined = <T extends object>(
169
175
  source: T,
@@ -218,6 +224,15 @@ const sanitizeRooms = (
218
224
  for (const field of REFETCHED_ROOM_FIELDS) {
219
225
  delete compactRoom[field];
220
226
  }
227
+ // The same reasoning, one size down: the full roster a room gets once
228
+ // it is opened (loadRoomMembers) is re-fetched on the next open, so only
229
+ // the preview-sized head of it is worth a place in the cache.
230
+ if (
231
+ Array.isArray(compactRoom.roomMembers) &&
232
+ compactRoom.roomMembers.length > PERSISTED_ROOM_MEMBERS
233
+ ) {
234
+ compactRoom.roomMembers = compactRoom.roomMembers.slice(0, PERSISTED_ROOM_MEMBERS);
235
+ }
221
236
 
222
237
  out[jid] = {
223
238
  ...(compactRoom as IRoom),
@@ -17,6 +17,11 @@ export interface IMessage {
17
17
  mimetype?: string;
18
18
  location?: string;
19
19
  pending?: boolean;
20
+ unencrypted?: boolean;
21
+ undecryptable?: string;
22
+ e2eeError?: string;
23
+ e2eeKeys?: string[];
24
+ clientEncrypted?: string;
20
25
  timestamp?: number;
21
26
  showInChannel?: string;
22
27
  activeMessage?: boolean;
@@ -11,6 +11,8 @@ export interface RoomMember {
11
11
  name?: string;
12
12
  role?: string;
13
13
  last_active?: number;
14
+ profileImage?: string;
15
+ description?: string;
14
16
  }
15
17
 
16
18
  export interface RoomLastMessage {
@@ -29,6 +31,7 @@ export interface IRoom {
29
31
 
30
32
  members?: RoomMember[];
31
33
  type?: 'public' | 'group' | 'private';
34
+ e2ee?: boolean;
32
35
  creteadAt?: string; // Typo? Should it be createdAt?
33
36
 
34
37
  appId?: string;
@@ -79,6 +82,7 @@ export interface ApiRoom {
79
82
  name: string;
80
83
  type: 'public' | 'group' | 'private';
81
84
 
85
+ e2ee?: boolean;
82
86
  title?: string;
83
87
  description?: string;
84
88
  picture?: string;
@@ -93,6 +97,7 @@ export interface ApiRoom {
93
97
  __v?: string;
94
98
  jid?: string;
95
99
  participants?: number;
100
+ usersCnt?: number;
96
101
  icon?: string;
97
102
  muted?: boolean;
98
103
  /** See ApiRoomLastMessage. */
@@ -47,6 +47,7 @@ export interface IRoom {
47
47
  // in ChatProfileModal under Description / Chat type fields.
48
48
  description?: string;
49
49
  type?: string;
50
+ e2ee?: boolean;
50
51
 
51
52
  roomMembers?: RoomMember[];
52
53
  members?: RoomMember[];
@@ -358,6 +359,9 @@ export interface TypographyConfig {
358
359
  export interface IConfig {
359
360
  // ----- identity / network -----
360
361
  appId?: string;
362
+ e2ee?: {
363
+ enabled: boolean;
364
+ };
361
365
  baseUrl?: string;
362
366
  customAppToken?: string;
363
367
  projectName?: string;
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by scripts/sync-version.mjs on `npm version`.
2
2
  // Edit package.json's version instead of this file.
3
- export const ETHORA_CHAT_COMPONENT_VERSION = '26.8.6';
3
+ export const ETHORA_CHAT_COMPONENT_VERSION = '26.8.7';