diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 8de74e46bd..be7c9e50ef 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -840,6 +840,7 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = newContentMessage ct@Contact {localDisplayName = c} mc msgId msgMeta = do ci <- saveRcvDirectChatItem userId ct msgId msgMeta (CIRcvMsgContent mc) toView . CRNewChatItem $ AChatItem SCTDirect SMDRcv (DirectChat ct) ci + checkIntegrity msgMeta $ toView . CRMsgIntegrityError showToast (c <> "> ") $ msgContentText mc setActive $ ActiveC c @@ -847,6 +848,7 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = newGroupContentMessage gInfo m@GroupMember {localDisplayName = c} mc msgId msgMeta = do ci <- saveRcvGroupChatItem userId gInfo m msgId msgMeta (CIRcvMsgContent mc) toView . CRNewChatItem $ AChatItem SCTGroup SMDRcv (GroupChat gInfo) ci + checkIntegrity msgMeta $ toView . CRMsgIntegrityError let g = groupName' gInfo showToast ("#" <> g <> " " <> c <> "> ") $ msgContentText mc setActive $ ActiveG g @@ -859,6 +861,7 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = ci <- saveRcvDirectChatItem userId ct msgId msgMeta (CIRcvFileInvitation ft) withStore $ \st -> updateFileTransferChatItemId st fileId $ chatItemId ci toView . CRNewChatItem $ AChatItem SCTDirect SMDRcv (DirectChat ct) ci + checkIntegrity msgMeta $ toView . CRMsgIntegrityError showToast (c <> "> ") "wants to send a file" setActive $ ActiveC c @@ -869,6 +872,7 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = ci <- saveRcvGroupChatItem userId gInfo m msgId msgMeta (CIRcvFileInvitation ft) withStore $ \st -> updateFileTransferChatItemId st fileId $ chatItemId ci toView . CRNewChatItem $ AChatItem SCTGroup SMDRcv (GroupChat gInfo) ci + checkIntegrity msgMeta $ toView . CRMsgIntegrityError let g = groupName' gInfo showToast ("#" <> g <> " " <> c <> "> ") "wants to send a file" setActive $ ActiveG g @@ -881,6 +885,11 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = toView $ CRReceivedGroupInvitation gInfo ct memRole showToast ("#" <> gName <> " " <> c <> "> ") "invited you to join the group" + checkIntegrity :: MsgMeta -> (MsgErrorType -> m ()) -> m () + checkIntegrity MsgMeta {integrity} action = case integrity of + MsgError e -> action e + MsgOk -> pure () + xInfo :: Contact -> Profile -> m () xInfo c@Contact {profile = p} p' = unless (p == p') $ do c' <- withStore $ \st -> updateContactProfile st userId c p' diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index dc718bc059..d1f3a65da1 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -123,6 +123,7 @@ data ChatResponse = CRApiChats {chats :: [AChat]} | CRApiChat {chat :: AChat} | CRNewChatItem {chatItem :: AChatItem} + | CRMsgIntegrityError {msgerror :: MsgErrorType} -- TODO make it chat item to support in mobile | CRCmdAccepted {corr :: CorrId} | CRChatHelp {helpSection :: HelpSection} | CRWelcome {user :: User} diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index 35fb1b2141..6897efaf77 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -37,6 +37,7 @@ responseToView cmd = \case CRApiChats chats -> api [sShow chats] CRApiChat chat -> api [sShow chat] CRNewChatItem (AChatItem _ _ chat item) -> viewChatItem chat item + CRMsgIntegrityError mErr -> viewMsgIntegrityError mErr CRCmdAccepted _ -> r [] CRChatHelp section -> case section of HSMain -> r chatHelpInfo @@ -146,6 +147,18 @@ viewChatItem chat (ChatItem cd meta content) = case (chat, cd) of ttyFromContact' Contact {localDisplayName = c} = ttyFromContact c ttyFromGroup' g GroupMember {localDisplayName = m} = ttyFromGroup g m +viewMsgIntegrityError :: MsgErrorType -> [StyledString] +viewMsgIntegrityError err = msgError $ case err of + MsgSkipped fromId toId -> + "skipped message ID " <> show fromId + <> if fromId == toId then "" else ".." <> show toId + MsgBadId msgId -> "unexpected message ID " <> show msgId + MsgBadHash -> "incorrect message hash" + MsgDuplicate -> "duplicate message ID" + where + msgError :: String -> [StyledString] + msgError s = [styled (Colored Red) s] + viewInvalidConnReq :: [StyledString] viewInvalidConnReq = [ "", @@ -310,17 +323,6 @@ receivedWithTime_ from CIMeta {localItemTs, createdAt} styledMsg = do then "%m-%d" -- if message is from yesterday or before and 6 hours has passed since midnight else "%H:%M" in styleTime $ formatTime defaultTimeLocale format localTime - showIntegrity :: MsgIntegrity -> [StyledString] - showIntegrity MsgOk = [] - showIntegrity (MsgError err) = msgError $ case err of - MsgSkipped fromId toId -> - "skipped message ID " <> show fromId - <> if fromId == toId then "" else ".." <> show toId - MsgBadId msgId -> "unexpected message ID " <> show msgId - MsgBadHash -> "incorrect message hash" - MsgDuplicate -> "duplicate message ID" - msgError :: String -> [StyledString] - msgError s = [styled (Colored Red) s] viewSentMessage :: StyledString -> MsgContent -> CIMeta -> [StyledString] viewSentMessage to = sentWithTime_ . prependFirst to . ttyMsgContent