@@ -84,6 +84,7 @@ module Simplex.Messaging.Client
8484 SocksMode (.. ),
8585 SMPProxyMode (.. ),
8686 SMPProxyFallback (.. ),
87+ SMPWebPortServers (.. ),
8788 defaultClientConfig ,
8889 defaultSMPClientConfig ,
8990 defaultNetworkConfig ,
@@ -129,7 +130,7 @@ import qualified Data.ByteString.Char8 as B
129130import qualified Data.ByteString.Base64 as B64
130131import Data.Functor (($>) )
131132import Data.Int (Int64 )
132- import Data.List (find )
133+ import Data.List (find , isSuffixOf )
133134import Data.List.NonEmpty (NonEmpty (.. ))
134135import qualified Data.List.NonEmpty as L
135136import Data.Maybe (catMaybes , fromMaybe )
@@ -138,7 +139,7 @@ import qualified Data.Text as T
138139import Data.Time.Clock (UTCTime (.. ), diffUTCTime , getCurrentTime )
139140import qualified Data.X509 as X
140141import qualified Data.X509.Validation as XV
141- import Network.Socket (ServiceName )
142+ import Network.Socket (HostName , ServiceName )
142143import Network.Socks5 (SocksCredentials (.. ))
143144import Numeric.Natural
144145import qualified Simplex.Messaging.Crypto as C
@@ -291,7 +292,7 @@ data NetworkConfig = NetworkConfig
291292 -- | Fallback to direct connection when destination SMP relay does not support SMP proxy protocol extensions
292293 smpProxyFallback :: SMPProxyFallback ,
293294 -- | use web port 443 for SMP protocol
294- smpWebPort :: Bool ,
295+ smpWebPortServers :: SMPWebPortServers ,
295296 -- | timeout for the initial client TCP/TLS connection (microseconds)
296297 tcpConnectTimeout :: Int ,
297298 -- | timeout of protocol commands (microseconds)
@@ -327,6 +328,12 @@ data SMPProxyFallback
327328 | SPFProhibit -- prohibit direct connection to destination relay.
328329 deriving (Eq , Show )
329330
331+ data SMPWebPortServers
332+ = SWPAll
333+ | SWPPreset
334+ | SWPOff
335+ deriving (Eq , Show )
336+
330337instance StrEncoding SMPProxyMode where
331338 strEncode = \ case
332339 SPMAlways -> " always"
@@ -353,6 +360,18 @@ instance StrEncoding SMPProxyFallback where
353360 " no" -> pure SPFProhibit
354361 _ -> fail " Invalid SMP proxy fallback mode"
355362
363+ instance StrEncoding SMPWebPortServers where
364+ strEncode = \ case
365+ SWPAll -> " all"
366+ SWPPreset -> " preset"
367+ SWPOff -> " off"
368+ strP =
369+ A. takeTill (== ' ' ) >>= \ case
370+ " all" -> pure SWPAll
371+ " preset" -> pure SWPPreset
372+ " off" -> pure SWPOff
373+ _ -> fail " Invalid SMP wep port setting"
374+
356375defaultNetworkConfig :: NetworkConfig
357376defaultNetworkConfig =
358377 NetworkConfig
@@ -363,7 +382,7 @@ defaultNetworkConfig =
363382 sessionMode = TSMSession ,
364383 smpProxyMode = SPMNever ,
365384 smpProxyFallback = SPFAllow ,
366- smpWebPort = False ,
385+ smpWebPortServers = SWPPreset ,
367386 tcpConnectTimeout = defaultTcpConnectTimeout,
368387 tcpTimeout = 15_000_000 ,
369388 tcpTimeoutPerKb = 5_000 ,
@@ -498,15 +517,15 @@ type TransportSession msg = (UserId, ProtoServer msg, Maybe ByteString)
498517--
499518-- A single queue can be used for multiple 'SMPClient' instances,
500519-- as 'SMPServerTransmission' includes server information.
501- getProtocolClient :: forall v err msg . Protocol v err msg => TVar ChaChaDRG -> TransportSession msg -> ProtocolClientConfig v -> Maybe (TBQueue (ServerTransmissionBatch v err msg )) -> UTCTime -> (ProtocolClient v err msg -> IO () ) -> IO (Either (ProtocolClientError err ) (ProtocolClient v err msg ))
502- getProtocolClient g transportSession@ (_, srv, _) cfg@ ProtocolClientConfig {qSize, networkConfig, clientALPN, serverVRange, agreeSecret, proxyServer, useSNI} msgQ proxySessTs disconnected = do
520+ getProtocolClient :: forall v err msg . Protocol v err msg => TVar ChaChaDRG -> TransportSession msg -> ProtocolClientConfig v -> [ HostName ] -> Maybe (TBQueue (ServerTransmissionBatch v err msg )) -> UTCTime -> (ProtocolClient v err msg -> IO () ) -> IO (Either (ProtocolClientError err ) (ProtocolClient v err msg ))
521+ getProtocolClient g transportSession@ (_, srv, _) cfg@ ProtocolClientConfig {qSize, networkConfig, clientALPN, serverVRange, agreeSecret, proxyServer, useSNI} presetDomains msgQ proxySessTs disconnected = do
503522 case chooseTransportHost networkConfig (host srv) of
504523 Right useHost ->
505524 (getCurrentTime >>= mkProtocolClient useHost >>= runClient useTransport useHost)
506525 `catch` \ (e :: IOException ) -> pure . Left $ PCEIOError e
507526 Left e -> pure $ Left e
508527 where
509- NetworkConfig {smpWebPort , tcpConnectTimeout, tcpTimeout, smpPingInterval} = networkConfig
528+ NetworkConfig {smpWebPortServers , tcpConnectTimeout, tcpTimeout, smpPingInterval} = networkConfig
510529 mkProtocolClient :: TransportHost -> UTCTime -> IO (PClient v err msg )
511530 mkProtocolClient transportHost ts = do
512531 connected <- newTVarIO False
@@ -554,6 +573,13 @@ getProtocolClient g transportSession@(_, srv, _) cfg@ProtocolClientConfig {qSize
554573 SPSMP | smpWebPort -> (" 443" , transport @ TLS )
555574 _ -> defaultTransport cfg
556575 p -> (p, transport @ TLS )
576+ where
577+ smpWebPort = case smpWebPortServers of
578+ SWPAll -> True
579+ SWPPreset -> case srv of
580+ ProtocolServer {host = THDomainName h :| _} -> any (`isSuffixOf` h) presetDomains
581+ _ -> False
582+ SWPOff -> False
557583
558584 client :: forall c . Transport c => TProxy c -> PClient v err msg -> TMVar (Either (ProtocolClientError err ) (ProtocolClient v err msg )) -> c -> IO ()
559585 client _ c cVar h = do
@@ -1262,6 +1288,8 @@ $(J.deriveJSON (enumJSON $ dropPrefix "SPM") ''SMPProxyMode)
12621288
12631289$ (J. deriveJSON (enumJSON $ dropPrefix " SPF" ) ''SMPProxyFallback)
12641290
1291+ $ (J. deriveJSON (enumJSON $ dropPrefix " SWP" ) ''SMPWebPortServers)
1292+
12651293$ (J. deriveJSON defaultJSON ''NetworkConfig)
12661294
12671295$ (J. deriveJSON (sumTypeJSON $ dropPrefix " Proxy" ) ''ProxyClientError)
0 commit comments