From ddd8e719efb86625636dceae70952c7d73f7e090 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 18 Apr 2023 19:43:16 +0400 Subject: [PATCH] core, ios: don't send/receive XFTP files in NSE (#2202) --- .../main/java/chat/simplex/app/model/SimpleXAPI.kt | 2 +- apps/ios/Shared/Model/SimpleXAPI.swift | 2 +- apps/ios/SimpleX NSE/NotificationService.swift | 5 ++++- apps/ios/SimpleXChat/APITypes.swift | 4 ++-- src/Simplex/Chat.hs | 14 +++++++------- src/Simplex/Chat/Controller.hs | 2 +- src/Simplex/Chat/Core.hs | 2 +- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index f79389e91e..c8eaccb572 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -1918,7 +1918,7 @@ sealed class CC { is ApiMuteUser -> "/_mute user $userId" is ApiUnmuteUser -> "/_unmute user $userId" is ApiDeleteUser -> "/_delete user $userId del_smp=${onOff(delSMPQueues)}${maybePwd(viewPwd)}" - is StartChat -> "/_start subscribe=on expire=${onOff(expire)}" + is StartChat -> "/_start subscribe=on expire=${onOff(expire)} xftp=on" is ApiStopChat -> "/_stop" is SetTempFolder -> "/_temp_folder $tempFolder" is SetFilesFolder -> "/_files_folder $filesFolder" diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index c8a3ba5316..5906c45b1f 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -187,7 +187,7 @@ func apiDeleteUser(_ userId: Int64, _ delSMPQueues: Bool, viewPwd: String?) asyn } func apiStartChat() throws -> Bool { - let r = chatSendCmdSync(.startChat(subscribe: true, expire: true)) + let r = chatSendCmdSync(.startChat(subscribe: true, expire: true, xftp: true)) switch r { case .chatStarted: return true case .chatRunning: return false diff --git a/apps/ios/SimpleX NSE/NotificationService.swift b/apps/ios/SimpleX NSE/NotificationService.swift index 5a015d9e5b..6a941c749c 100644 --- a/apps/ios/SimpleX NSE/NotificationService.swift +++ b/apps/ios/SimpleX NSE/NotificationService.swift @@ -273,18 +273,21 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? { } if case .image = cItem.content.msgContent { if let file = cItem.file, + file.fileProtocol == .smp, file.fileSize <= MAX_IMAGE_SIZE_AUTO_RCV, privacyAcceptImagesGroupDefault.get() { cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem } } else if case .video = cItem.content.msgContent { if let file = cItem.file, + file.fileProtocol == .smp, file.fileSize <= MAX_VIDEO_SIZE_AUTO_RCV, privacyAcceptImagesGroupDefault.get() { cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem } } else if case .voice = cItem.content.msgContent { // TODO check inlineFileMode != IFMSent if let file = cItem.file, + file.fileProtocol == .smp, file.fileSize <= MAX_IMAGE_SIZE, file.fileSize > MAX_VOICE_MESSAGE_SIZE_INLINE_SEND, privacyAcceptImagesGroupDefault.get() { @@ -343,7 +346,7 @@ func apiGetActiveUser() -> User? { } func apiStartChat() throws -> Bool { - let r = sendSimpleXCmd(.startChat(subscribe: false, expire: false)) + let r = sendSimpleXCmd(.startChat(subscribe: false, expire: false, xftp: false)) switch r { case .chatStarted: return true case .chatRunning: return false diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index a672081e37..c13f338332 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -22,7 +22,7 @@ public enum ChatCommand { case apiMuteUser(userId: Int64) case apiUnmuteUser(userId: Int64) case apiDeleteUser(userId: Int64, delSMPQueues: Bool, viewPwd: String?) - case startChat(subscribe: Bool, expire: Bool) + case startChat(subscribe: Bool, expire: Bool, xftp: Bool) case apiStopChat case apiActivateChat case apiSuspendChat(timeoutMicroseconds: Int) @@ -116,7 +116,7 @@ public enum ChatCommand { case let .apiMuteUser(userId): return "/_mute user \(userId)" case let .apiUnmuteUser(userId): return "/_unmute user \(userId)" case let .apiDeleteUser(userId, delSMPQueues, viewPwd): return "/_delete user \(userId) del_smp=\(onOff(delSMPQueues))\(maybePwd(viewPwd))" - case let .startChat(subscribe, expire): return "/_start subscribe=\(onOff(subscribe)) expire=\(onOff(expire))" + case let .startChat(subscribe, expire, xftp): return "/_start subscribe=\(onOff(subscribe)) expire=\(onOff(expire)) xftp=\(onOff(xftp))" case .apiStopChat: return "/_stop" case .apiActivateChat: return "/_app activate" case let .apiSuspendChat(timeoutMicroseconds): return "/_app suspend \(timeoutMicroseconds)" diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 7c960a0995..0efe7924c0 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -210,8 +210,8 @@ cfgServers = \case SPSMP -> smp SPXFTP -> xftp -startChatController :: forall m. ChatMonad' m => Bool -> Bool -> m (Async ()) -startChatController subConns enableExpireCIs = do +startChatController :: forall m. ChatMonad' m => Bool -> Bool -> Bool -> m (Async ()) +startChatController subConns enableExpireCIs startXFTPWorkers = do asks smpAgent >>= resumeAgentClient users <- fromRight [] <$> runExceptT (withStore' getUsers) restoreCalls @@ -225,7 +225,7 @@ startChatController subConns enableExpireCIs = do then Just <$> async (subscribeUsers users) else pure Nothing atomically . writeTVar s $ Just (a1, a2) - startXFTP + when startXFTPWorkers startXFTP startCleanupManager when enableExpireCIs $ startExpireCIs users pure a1 @@ -380,10 +380,10 @@ processChatCommand = \case checkDeleteChatUser user' withChatLock "deleteUser" . procCmd $ deleteChatUser user' delSMPQueues DeleteUser uName delSMPQueues viewPwd_ -> withUserName uName $ \userId -> APIDeleteUser userId delSMPQueues viewPwd_ - StartChat subConns enableExpireCIs -> withUser' $ \_ -> + StartChat subConns enableExpireCIs startXFTPWorkers -> withUser' $ \_ -> asks agentAsync >>= readTVarIO >>= \case Just _ -> pure CRChatRunning - _ -> checkStoreNotChanged $ startChatController subConns enableExpireCIs $> CRChatStarted + _ -> checkStoreNotChanged $ startChatController subConns enableExpireCIs startXFTPWorkers $> CRChatStarted APIStopChat -> do ask >>= stopChatController pure CRChatStopped @@ -4510,8 +4510,8 @@ chatCommandP = "/_delete user " *> (APIDeleteUser <$> A.decimal <* " del_smp=" <*> onOffP <*> optional (A.space *> jsonP)), "/delete user " *> (DeleteUser <$> displayName <*> pure True <*> optional (A.space *> pwdP)), ("/user" <|> "/u") $> ShowActiveUser, - "/_start subscribe=" *> (StartChat <$> onOffP <* " expire=" <*> onOffP), - "/_start" $> StartChat True True, + "/_start subscribe=" *> (StartChat <$> onOffP <* " expire=" <*> onOffP <* " xftp=" <*> onOffP), + "/_start" $> StartChat True True True, "/_stop" $> APIStopChat, "/_app activate" $> APIActivateChat, "/_app suspend " *> (APISuspendChat <$> A.decimal), diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index e90d6fcaca..e345dcf478 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -194,7 +194,7 @@ data ChatCommand | UnmuteUser | APIDeleteUser UserId Bool (Maybe UserPwd) | DeleteUser UserName Bool (Maybe UserPwd) - | StartChat {subscribeConnections :: Bool, enableExpireChatItems :: Bool} + | StartChat {subscribeConnections :: Bool, enableExpireChatItems :: Bool, startXFTPWorkers :: Bool} | APIStopChat | APIActivateChat | APISuspendChat {suspendTimeout :: Int} diff --git a/src/Simplex/Chat/Core.hs b/src/Simplex/Chat/Core.hs index a62ab5642b..e23dbc5a96 100644 --- a/src/Simplex/Chat/Core.hs +++ b/src/Simplex/Chat/Core.hs @@ -35,7 +35,7 @@ runSimplexChat :: ChatOpts -> User -> ChatController -> (User -> ChatController runSimplexChat ChatOpts {maintenance} u cc chat | maintenance = wait =<< async (chat u cc) | otherwise = do - a1 <- runReaderT (startChatController True True) cc + a1 <- runReaderT (startChatController True True True) cc a2 <- async $ chat u cc waitEither_ a1 a2