From 1b01dcec6da9f5058a03b5eb91d325d1f7aa6c7d Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Mon, 23 Jan 2023 19:55:19 +0400 Subject: [PATCH] core: fix inline file transfer - optional connection ids in RcvFileInfo, update rcv_file_inline on accept (#1823) * core: optional connection id in RcvFileInfo * query * check snd cancel * Revert "check snd cancel" This reverts commit f16651345d92dba3ab00fb84ce79f5ef065feb59. * update rcv_file_inline --- src/Simplex/Chat.hs | 6 +++--- src/Simplex/Chat/Store.hs | 38 +++++++++++++++----------------------- src/Simplex/Chat/Types.hs | 7 ++++--- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 524d05ac8a..87709e38d1 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -2545,7 +2545,7 @@ processAgentMessage (Just user@User {userId}) corrId agentConnId agentMessage = (filePath, fileStatus) <- case inline of Just IFMSent -> do fPath <- getRcvFilePath fileId Nothing fileName - withStore' $ \db -> startRcvInlineFT db user ft fPath + withStore' $ \db -> startRcvInlineFT db user ft fPath inline pure (Just fPath, CIFSRcvAccepted) _ -> pure (Nothing, CIFSRcvInvitation) pure CIFile {fileId, fileName, fileSize, filePath, fileStatus} @@ -3291,9 +3291,9 @@ cancelRcvFileTransfer user ft@RcvFileTransfer {fileId, fileStatus, rcvFileInline updateRcvFileStatus db ft FSCancelled deleteRcvFileChunks db ft when (isNothing rcvFileInline) $ case fileStatus of - RFSAccepted RcvFileInfo {connId, agentConnId} -> + RFSAccepted RcvFileInfo {connId = Just connId, agentConnId = Just agentConnId} -> deleteAgentConnectionAsync' user connId agentConnId - RFSConnected RcvFileInfo {connId, agentConnId} -> + RFSConnected RcvFileInfo {connId = Just connId, agentConnId = Just agentConnId} -> deleteAgentConnectionAsync' user connId agentConnId _ -> pure () diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index fd5e27b773..3787c40f6c 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -2743,14 +2743,14 @@ createRcvGroupFileTransfer db userId GroupMember {groupId, groupMemberId, localD pure RcvFileTransfer {fileId, fileInvitation = f, fileStatus = RFSNew, rcvFileInline, senderDisplayName = c, chunkSize, cancelled = False, grpMemberId = Just groupMemberId} getRcvFileTransfer :: DB.Connection -> User -> Int64 -> ExceptT StoreError IO RcvFileTransfer -getRcvFileTransfer db user@User {userId} fileId = do +getRcvFileTransfer db User {userId} fileId = do rftRow <- ExceptT . firstRow id (SERcvFileNotFound fileId) $ DB.query db [sql| SELECT r.file_status, r.file_queue_info, r.group_member_id, f.file_name, - f.file_size, f.chunk_size, f.cancelled, cs.contact_id, cs.local_display_name, m.group_id, m.group_member_id, m.local_display_name, + f.file_size, f.chunk_size, f.cancelled, cs.local_display_name, m.local_display_name, f.file_path, r.file_inline, r.rcv_file_inline, c.connection_id, c.agent_conn_id FROM rcv_files r JOIN files f USING (file_id) @@ -2763,11 +2763,11 @@ getRcvFileTransfer db user@User {userId} fileId = do rcvFileTransfer rftRow where rcvFileTransfer :: - (FileStatus, Maybe ConnReqInvitation, Maybe Int64, String, Integer, Integer, Maybe Bool) :. (Maybe Int64, Maybe ContactName, Maybe Int64, Maybe Int64, Maybe ContactName, Maybe FilePath, Maybe InlineFileMode, Maybe InlineFileMode) :. (Maybe Int64, Maybe AgentConnId) -> + (FileStatus, Maybe ConnReqInvitation, Maybe Int64, String, Integer, Integer, Maybe Bool) :. (Maybe ContactName, Maybe ContactName, Maybe FilePath, Maybe InlineFileMode, Maybe InlineFileMode) :. (Maybe Int64, Maybe AgentConnId) -> ExceptT StoreError IO RcvFileTransfer - rcvFileTransfer ((fileStatus', fileConnReq, grpMemberId, fileName, fileSize, chunkSize, cancelled_) :. (contactId_, contactName_, groupId_, groupMemberId_, memberName_, filePath_, fileInline, rcvFileInline) :. (connId_, agentConnId_)) = do + rcvFileTransfer ((fileStatus', fileConnReq, grpMemberId, fileName, fileSize, chunkSize, cancelled_) :. (contactName_, memberName_, filePath_, fileInline, rcvFileInline) :. (connId_, agentConnId_)) = do let fileInv = FileInvitation {fileName, fileSize, fileConnReq, fileInline} - fileInfo = (filePath_, connId_, agentConnId_, contactId_, groupId_, groupMemberId_, isJust fileInline) + fileInfo = (filePath_, connId_, agentConnId_) case contactName_ <|> memberName_ of Nothing -> throwError $ SERcvFileInvalid fileId Just name -> do @@ -2782,22 +2782,14 @@ getRcvFileTransfer db user@User {userId} fileId = do RcvFileTransfer {fileId, fileInvitation, fileStatus, rcvFileInline, senderDisplayName, chunkSize, cancelled, grpMemberId} rfi fileInfo = maybe (throwError $ SERcvFileInvalid fileId) pure =<< rfi_ fileInfo rfi_ = \case - (Just filePath, Just connId, Just agentConnId, _, _, _, _) -> pure $ Just RcvFileInfo {filePath, connId, agentConnId} - (Just filePath, Nothing, Nothing, Just contactId, _, _, True) -> do - Contact {activeConn = Connection {connId, agentConnId}} <- getContact db user contactId - pure $ Just RcvFileInfo {filePath, connId, agentConnId} - (Just filePath, Nothing, Nothing, _, Just groupId, Just groupMemberId, True) -> do - getGroupMember db user groupId groupMemberId >>= \case - GroupMember {activeConn = Just Connection {connId, agentConnId}} -> - pure $ Just RcvFileInfo {filePath, connId, agentConnId} - _ -> pure Nothing + (Just filePath, connId, agentConnId) -> pure $ Just RcvFileInfo {filePath, connId, agentConnId} _ -> pure Nothing cancelled = fromMaybe False cancelled_ acceptRcvFileTransfer :: DB.Connection -> User -> Int64 -> (CommandId, ConnId) -> ConnStatus -> FilePath -> ExceptT StoreError IO AChatItem acceptRcvFileTransfer db user@User {userId} fileId (cmdId, acId) connStatus filePath = ExceptT $ do currentTs <- getCurrentTime - acceptRcvFT_ db user fileId filePath currentTs + acceptRcvFT_ db user fileId filePath Nothing currentTs DB.execute db "INSERT INTO connections (agent_conn_id, conn_status, conn_type, rcv_file_id, user_id, created_at, updated_at) VALUES (?,?,?,?,?,?,?)" @@ -2817,23 +2809,23 @@ getContactByFileId db user@User {userId} fileId = do acceptRcvInlineFT :: DB.Connection -> User -> Int64 -> FilePath -> ExceptT StoreError IO AChatItem acceptRcvInlineFT db user fileId filePath = do - liftIO $ acceptRcvFT_ db user fileId filePath =<< getCurrentTime + liftIO $ acceptRcvFT_ db user fileId filePath (Just IFMOffer) =<< getCurrentTime getChatItemByFileId db user fileId -startRcvInlineFT :: DB.Connection -> User -> RcvFileTransfer -> FilePath -> IO () -startRcvInlineFT db user RcvFileTransfer {fileId} filePath = - acceptRcvFT_ db user fileId filePath =<< getCurrentTime +startRcvInlineFT :: DB.Connection -> User -> RcvFileTransfer -> FilePath -> Maybe InlineFileMode -> IO () +startRcvInlineFT db user RcvFileTransfer {fileId} filePath rcvFileInline = + acceptRcvFT_ db user fileId filePath rcvFileInline =<< getCurrentTime -acceptRcvFT_ :: DB.Connection -> User -> Int64 -> FilePath -> UTCTime -> IO () -acceptRcvFT_ db User {userId} fileId filePath currentTs = do +acceptRcvFT_ :: DB.Connection -> User -> Int64 -> FilePath -> Maybe InlineFileMode -> UTCTime -> IO () +acceptRcvFT_ db User {userId} fileId filePath rcvFileInline currentTs = do DB.execute db "UPDATE files SET file_path = ?, ci_file_status = ?, updated_at = ? WHERE user_id = ? AND file_id = ?" (filePath, CIFSRcvAccepted, currentTs, userId, fileId) DB.execute db - "UPDATE rcv_files SET file_status = ?, updated_at = ? WHERE file_id = ?" - (FSAccepted, currentTs, fileId) + "UPDATE rcv_files SET rcv_file_inline = ?, file_status = ?, updated_at = ? WHERE file_id = ?" + (rcvFileInline, FSAccepted, currentTs, fileId) updateRcvFileStatus :: DB.Connection -> RcvFileTransfer -> FileStatus -> IO () updateRcvFileStatus db RcvFileTransfer {fileId} status = do diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index bf884b7fa6..2fc46aa11b 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -1481,8 +1481,8 @@ instance ToJSON RcvFileStatus where data RcvFileInfo = RcvFileInfo { filePath :: FilePath, - connId :: Int64, - agentConnId :: AgentConnId + connId :: Maybe Int64, + agentConnId :: Maybe AgentConnId } deriving (Eq, Show, Generic) @@ -1494,7 +1494,8 @@ liveRcvFileTransferConnId RcvFileTransfer {fileStatus} = case fileStatus of RFSConnected fi -> acId fi _ -> Nothing where - acId RcvFileInfo {agentConnId = AgentConnId cId} = Just cId + acId RcvFileInfo {agentConnId = Just (AgentConnId cId)} = Just cId + acId _ = Nothing newtype AgentConnId = AgentConnId ConnId deriving (Eq, Show)