From 4ad1abcbfa85e163d2de481aa4d1e6db0dc16aa9 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Tue, 2 Aug 2022 15:36:12 +0100 Subject: [PATCH] core: support passing all network configuration to the agent (#868) * core: support passing all network configuration to the agent * update simplexmq --- apps/simplex-chat/Main.hs | 5 +++-- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- src/Simplex/Chat.hs | 14 +++++++------- src/Simplex/Chat/Mobile.hs | 4 ++-- src/Simplex/Chat/Options.hs | 23 ++++++++++++++++++++--- src/Simplex/Chat/Terminal.hs | 5 +++-- stack.yaml | 2 +- tests/ChatClient.hs | 5 ++--- 9 files changed, 40 insertions(+), 22 deletions(-) diff --git a/apps/simplex-chat/Main.hs b/apps/simplex-chat/Main.hs index 85840d05e1..0a025311cb 100644 --- a/apps/simplex-chat/Main.hs +++ b/apps/simplex-chat/Main.hs @@ -9,6 +9,7 @@ import Simplex.Chat.Core import Simplex.Chat.Options import Simplex.Chat.Terminal import Simplex.Chat.View (serializeChatResponse) +import Simplex.Messaging.Client (NetworkConfig (..)) import System.Directory (getAppUserDataDirectory) import System.Terminal (withTerminal) @@ -30,7 +31,7 @@ main = do threadDelay $ chatCmdDelay opts * 1000000 welcome :: ChatOpts -> IO () -welcome ChatOpts {dbFilePrefix, socksProxy} = +welcome ChatOpts {dbFilePrefix, networkConfig} = mapM_ putStrLn [ "SimpleX Chat v" ++ versionNumber, @@ -38,6 +39,6 @@ welcome ChatOpts {dbFilePrefix, socksProxy} = maybe "direct network connection - use `/network` command or `-x` CLI option to connect via SOCKS5 at :9050" (("using SOCKS5 proxy " <>) . show) - socksProxy, + (socksProxy networkConfig), "type \"/help\" or \"/h\" for usage info" ] diff --git a/cabal.project b/cabal.project index af6136eb1c..832c98f037 100644 --- a/cabal.project +++ b/cabal.project @@ -5,7 +5,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: fcaddb7848543baf64786d531cdd629488a462e4 + tag: e9db0a1162a0858b0acb1880a6ef261242adc356 source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index ec875ce64d..9975570217 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."fcaddb7848543baf64786d531cdd629488a462e4" = "1p3vl87i0jd8qjnak8nykvpbg6h7kby4z3wxx8wdmbjvjkw4x190"; + "https://github.com/simplex-chat/simplexmq.git"."e9db0a1162a0858b0acb1880a6ef261242adc356" = "1klakvm93qsgwbg00xbq6s32sqcqww8x4ln4m8bjss0mracgrnki"; "https://github.com/simplex-chat/aeson.git"."3eb66f9a68f103b5f1489382aad89f5712a64db7" = "0kilkx59fl6c3qy3kjczqvm8c3f4n3p0bdk9biyflf51ljnzp4yp"; "https://github.com/simplex-chat/haskell-terminal.git"."f708b00009b54890172068f168bf98508ffcd495" = "0zmq7lmfsk8m340g47g5963yba7i88n4afa6z93sg9px5jv1mijj"; "https://github.com/zw3rk/android-support.git"."3c3a5ab0b8b137a072c98d3d0937cbdc96918ddb" = "1r6jyxbim3dsvrmakqfyxbd6ms6miaghpbwyl0sr6dzwpgaprz97"; diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index eef3c38b3a..a1c8c0712e 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -50,14 +50,15 @@ import Simplex.Chat.Call import Simplex.Chat.Controller import Simplex.Chat.Markdown import Simplex.Chat.Messages -import Simplex.Chat.Options (ChatOpts (..), smpServersP) +import Simplex.Chat.Options import Simplex.Chat.Protocol import Simplex.Chat.Store import Simplex.Chat.Types import Simplex.Chat.Util (safeDecodeUtf8, uncurry3) import Simplex.Messaging.Agent as Agent -import Simplex.Messaging.Agent.Env.SQLite (AgentConfig (..), InitialAgentServers (..), NetworkConfig (..), defaultAgentConfig) +import Simplex.Messaging.Agent.Env.SQLite (AgentConfig (..), InitialAgentServers (..), defaultAgentConfig) import Simplex.Messaging.Agent.Protocol +import Simplex.Messaging.Client (defaultNetworkConfig) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String @@ -92,7 +93,7 @@ defaultChatConfig = InitialAgentServers { smp = _defaultSMPServers, ntf = _defaultNtfServers, - netCfg = NetworkConfig {socksProxy = Nothing, tcpTimeout = 5000000} + netCfg = defaultNetworkConfig }, tbqSize = 64, fileChunkSize = 15780, @@ -122,7 +123,7 @@ logCfg :: LogConfig logCfg = LogConfig {lc_file = Nothing, lc_stderr = True} newChatController :: SQLiteStore -> Maybe User -> ChatConfig -> ChatOpts -> Maybe (Notification -> IO ()) -> IO ChatController -newChatController chatStore user cfg@ChatConfig {agentConfig = aCfg, tbqSize, defaultServers} ChatOpts {dbFilePrefix, smpServers, socksProxy, tcpTimeout, logConnections} sendToast = do +newChatController chatStore user cfg@ChatConfig {agentConfig = aCfg, tbqSize, defaultServers} ChatOpts {dbFilePrefix, smpServers, networkConfig, logConnections} sendToast = do let f = chatStoreFile dbFilePrefix config = cfg {subscriptionEvents = logConnections} sendNotification = fromMaybe (const $ pure ()) sendToast @@ -130,8 +131,7 @@ newChatController chatStore user cfg@ChatConfig {agentConfig = aCfg, tbqSize, de firstTime <- not <$> doesFileExist f currentUser <- newTVarIO user servers <- resolveServers defaultServers - let netCfg = NetworkConfig {socksProxy, tcpTimeout} - smpAgent <- getSMPAgentClient aCfg {dbFile = dbFilePrefix <> "_agent.db"} servers {netCfg} + smpAgent <- getSMPAgentClient aCfg {dbFile = dbFilePrefix <> "_agent.db"} servers {netCfg = networkConfig} agentAsync <- newTVarIO Nothing idsDrg <- newTVarIO =<< drgNew inputQ <- newTBQueueIO tbqSize @@ -2590,7 +2590,7 @@ chatCommandP = socksProxy <- "socks=" *> ("off" $> Nothing <|> "on" $> Just defaultSocksProxy <|> Just <$> strP) t_ <- optional $ " timeout=" *> A.decimal let tcpTimeout = 1000000 * fromMaybe (maybe 5 (const 10) socksProxy) t_ - pure $ NetworkConfig {socksProxy, tcpTimeout} + pure $ fullNetworkConfig socksProxy tcpTimeout adminContactReq :: ConnReqContact adminContactReq = diff --git a/src/Simplex/Chat/Mobile.hs b/src/Simplex/Chat/Mobile.hs index ad2188e8f2..714734c747 100644 --- a/src/Simplex/Chat/Mobile.hs +++ b/src/Simplex/Chat/Mobile.hs @@ -25,6 +25,7 @@ import Simplex.Chat.Store import Simplex.Chat.Types import Simplex.Chat.Util (safeDecodeUtf8) import Simplex.Messaging.Agent.Env.SQLite (AgentConfig (yesToMigrations)) +import Simplex.Messaging.Client (defaultNetworkConfig) import Simplex.Messaging.Protocol (CorrId (..)) import System.Timeout (timeout) @@ -67,8 +68,7 @@ mobileChatOpts = ChatOpts { dbFilePrefix = undefined, smpServers = [], - socksProxy = Nothing, - tcpTimeout = 5000000, + networkConfig = defaultNetworkConfig, logConnections = False, logAgent = False, chatCmd = "", diff --git a/src/Simplex/Chat/Options.hs b/src/Simplex/Chat/Options.hs index 5423140035..cbd35e7dd9 100644 --- a/src/Simplex/Chat/Options.hs +++ b/src/Simplex/Chat/Options.hs @@ -8,6 +8,7 @@ module Simplex.Chat.Options ( ChatOpts (..), getChatOpts, smpServersP, + fullNetworkConfig, ) where @@ -16,6 +17,7 @@ import qualified Data.ByteString.Char8 as B import Options.Applicative import Simplex.Chat.Controller (updateStr, versionStr) import Simplex.Messaging.Agent.Protocol (SMPServer) +import Simplex.Messaging.Client (NetworkConfig (..), defaultNetworkConfig) import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers (parseAll) import Simplex.Messaging.Transport.Client (SocksProxy, defaultSocksProxy) @@ -24,8 +26,7 @@ import System.FilePath (combine) data ChatOpts = ChatOpts { dbFilePrefix :: String, smpServers :: [SMPServer], - socksProxy :: Maybe SocksProxy, - tcpTimeout :: Int, + networkConfig :: NetworkConfig, logConnections :: Bool, logAgent :: Bool, chatCmd :: String, @@ -116,11 +117,27 @@ chatOpts appDir defaultDbFileName = do <> short 'm' <> help "Run in maintenance mode (/_start to start chat)" ) - pure ChatOpts {dbFilePrefix, smpServers, socksProxy, tcpTimeout = useTcpTimeout socksProxy t, logConnections, logAgent, chatCmd, chatCmdDelay, chatServerPort, maintenance} + pure + ChatOpts + { dbFilePrefix, + smpServers, + networkConfig = fullNetworkConfig socksProxy $ useTcpTimeout socksProxy t, + logConnections, + logAgent, + chatCmd, + chatCmdDelay, + chatServerPort, + maintenance + } where useTcpTimeout p t = 1000000 * if t > 0 then t else maybe 5 (const 10) p defaultDbFilePath = combine appDir defaultDbFileName +fullNetworkConfig :: Maybe SocksProxy -> Int -> NetworkConfig +fullNetworkConfig socksProxy tcpTimeout = + let tcpConnectTimeout = (tcpTimeout * 3) `div` 2 + in defaultNetworkConfig {socksProxy, tcpTimeout, tcpConnectTimeout} + parseSMPServers :: ReadM [SMPServer] parseSMPServers = eitherReader $ parseAll smpServersP . B.pack diff --git a/src/Simplex/Chat/Terminal.hs b/src/Simplex/Chat/Terminal.hs index 09d2ae2e2e..f1554f576b 100644 --- a/src/Simplex/Chat/Terminal.hs +++ b/src/Simplex/Chat/Terminal.hs @@ -15,7 +15,8 @@ import Simplex.Chat.Options import Simplex.Chat.Terminal.Input import Simplex.Chat.Terminal.Notification import Simplex.Chat.Terminal.Output -import Simplex.Messaging.Agent.Env.SQLite (InitialAgentServers (..), NetworkConfig (..)) +import Simplex.Messaging.Agent.Env.SQLite (InitialAgentServers (..)) +import Simplex.Messaging.Client (defaultNetworkConfig) import Simplex.Messaging.Util (raceAny_) terminalChatConfig :: ChatConfig @@ -30,7 +31,7 @@ terminalChatConfig = "smp://PQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo=@smp6.simplex.im" ], ntf = ["ntf://FB-Uop7RTaZZEG0ZLD2CIaTjsPh-Fw0zFAnb7QyA8Ks=@ntf2.simplex.im"], - netCfg = NetworkConfig {socksProxy = Nothing, tcpTimeout = 5000000} + netCfg = defaultNetworkConfig } } diff --git a/stack.yaml b/stack.yaml index a7dd4e16b1..59a9e97775 100644 --- a/stack.yaml +++ b/stack.yaml @@ -49,7 +49,7 @@ extra-deps: # - simplexmq-1.0.0@sha256:34b2004728ae396e3ae449cd090ba7410781e2b3cefc59259915f4ca5daa9ea8,8561 # - ../simplexmq - github: simplex-chat/simplexmq - commit: fcaddb7848543baf64786d531cdd629488a462e4 + commit: e9db0a1162a0858b0acb1880a6ef261242adc356 # - terminal-0.2.0.0@sha256:de6770ecaae3197c66ac1f0db5a80cf5a5b1d3b64a66a05b50f442de5ad39570,2977 - github: simplex-chat/aeson commit: 3eb66f9a68f103b5f1489382aad89f5712a64db7 diff --git a/tests/ChatClient.hs b/tests/ChatClient.hs index 9c7e5a46d2..6410130836 100644 --- a/tests/ChatClient.hs +++ b/tests/ChatClient.hs @@ -27,7 +27,7 @@ import Simplex.Chat.Terminal.Output (newChatTerminal) import Simplex.Chat.Types (Profile, User (..)) import Simplex.Messaging.Agent.Env.SQLite import Simplex.Messaging.Agent.RetryInterval -import Simplex.Messaging.Client (ProtocolClientConfig (..)) +import Simplex.Messaging.Client (ProtocolClientConfig (..), defaultNetworkConfig) import Simplex.Messaging.Server (runSMPServerBlocking) import Simplex.Messaging.Server.Env.STM import Simplex.Messaging.Transport @@ -49,8 +49,7 @@ testOpts = ChatOpts { dbFilePrefix = undefined, smpServers = ["smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:5001"], - socksProxy = Nothing, - tcpTimeout = 5000000, + networkConfig = defaultNetworkConfig, logConnections = False, logAgent = False, chatCmd = "",