Skip to content

Commit e48bede

Browse files
authored
servers: fix server pages when source code is not specified, include commit SHA in printed version and in web page. (#1608)
* smp server: fix server pages when source code is not specified * servers: include git commit in version * flexible alpn * fix test * fix ghc 8.10.7 build
1 parent a2d3528 commit e48bede

File tree

20 files changed

+124
-61
lines changed

20 files changed

+124
-61
lines changed

apps/smp-server/static/index.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,14 @@ <h2 class="text-[30px] mb-[20px] leading-[28px] text-[#606C71] dark:text-white f
223223
<table id="public-info">
224224
<tr class="text-grey-black dark:text-white text-base">
225225
<td>Server version:</td>
226-
<td>${version}</td>
226+
<td>${version}<x-commit> / <a href="${commitSourceCode}/commit/${commit}" target="_blank">${shortCommit}</a></x-commit></td>
227227
</tr>
228228
<tr class="text-grey-black dark:text-white text-base">
229229
<td>Source code:</td>
230-
<td><a href="${sourceCode}" target="_blank">${sourceCode}</a></td>
230+
<td>
231+
<x-sourceCode><a href="${sourceCode}" target="_blank">${sourceCode}</a></x-sourceCode>
232+
<x-noSourceCode>add to smp-server.ini (required by <a href="https://github.com/simplex-chat/simplexmq/blob/stable/LICENSE" target="_blank">AGPLv3</a>)</x-noSourceCode>
233+
</td>
231234
</tr>
232235
<x-website>
233236
<tr class="text-grey-black dark:text-white text-base">

apps/smp-server/web/Static.hs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Data.Char (toUpper)
1212
import Data.IORef (readIORef)
1313
import Data.Maybe (fromMaybe)
1414
import Data.String (fromString)
15+
import qualified Data.Text as T
1516
import Data.Text.Encoding (encodeUtf8)
1617
import Network.Socket (getPeerName)
1718
import Network.Wai (Application, Request (..))
@@ -22,8 +23,9 @@ import qualified Network.Wai.Handler.Warp.Internal as WI
2223
import qualified Network.Wai.Handler.WarpTLS as WT
2324
import Simplex.Messaging.Encoding.String (strEncode)
2425
import Simplex.Messaging.Server (AttachHTTP)
26+
import Simplex.Messaging.Server.CLI (simplexmqCommit)
2527
import Simplex.Messaging.Server.Information
26-
import Simplex.Messaging.Server.Main (EmbeddedWebParams (..), WebHttpsParams (..))
28+
import Simplex.Messaging.Server.Main (EmbeddedWebParams (..), WebHttpsParams (..), simplexmqSource)
2729
import Simplex.Messaging.Transport (simplexMQVersion)
2830
import Simplex.Messaging.Transport.Client (TransportHost (..))
2931
import Simplex.Messaging.Util (tshow)
@@ -117,7 +119,7 @@ generateSite si onionHost sitePath = do
117119
serverInformation :: ServerInformation -> Maybe TransportHost -> ByteString
118120
serverInformation ServerInformation {config, information} onionHost = render E.indexHtml substs
119121
where
120-
substs = substConfig <> maybe [] substInfo information <> [("onionHost", strEncode <$> onionHost)]
122+
substs = substConfig <> substInfo <> [("onionHost", strEncode <$> onionHost)]
121123
substConfig =
122124
[ ( "persistence",
123125
Just $ case persistence config of
@@ -132,7 +134,7 @@ serverInformation ServerInformation {config, information} onionHost = render E.i
132134
]
133135
yesNo True = "Yes"
134136
yesNo False = "No"
135-
substInfo spi =
137+
substInfo =
136138
concat
137139
[ basic,
138140
maybe [("usageConditions", Nothing), ("usageAmendments", Nothing)] conds (usageConditions spi),
@@ -144,10 +146,16 @@ serverInformation ServerInformation {config, information} onionHost = render E.i
144146
]
145147
where
146148
basic =
147-
[ ("sourceCode", Just . encodeUtf8 $ sourceCode spi),
149+
[ ("sourceCode", if T.null sc then Nothing else Just (encodeUtf8 sc)),
150+
("noSourceCode", if T.null sc then Just "none" else Nothing),
148151
("version", Just $ B.pack simplexMQVersion),
152+
("commitSourceCode", Just $ encodeUtf8 $ maybe (T.pack simplexmqSource) sourceCode information),
153+
("shortCommit", Just $ B.pack $ take 7 simplexmqCommit),
154+
("commit", Just $ B.pack simplexmqCommit),
149155
("website", encodeUtf8 <$> website spi)
150156
]
157+
spi = fromMaybe (emptyServerInfo "") information
158+
sc = sourceCode spi
151159
conds ServerConditions {conditions, amendments} =
152160
[ ("usageConditions", Just $ encodeUtf8 conditions),
153161
("usageAmendments", encodeUtf8 <$> amendments)
@@ -229,8 +237,8 @@ section_ label content' src =
229237
(inside, next') ->
230238
let next = B.drop (B.length endMarker) next'
231239
in case content' of
232-
Nothing -> before <> next -- collapse section
233-
Just content -> before <> item_ label content inside <> section_ label content' next
240+
Just content | not (B.null content) -> before <> item_ label content inside <> section_ label content' next
241+
_ -> before <> next -- collapse section
234242
where
235243
startMarker = "<x-" <> label <> ">"
236244
endMarker = "</x-" <> label <> ">"

simplexmq.cabal

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ library
234234
Simplex.Messaging.Server.Env.STM
235235
Simplex.Messaging.Server.Information
236236
Simplex.Messaging.Server.Main
237+
Simplex.Messaging.Server.Main.GitCommit
237238
Simplex.Messaging.Server.Main.Init
238239
Simplex.Messaging.Server.MsgStore
239240
Simplex.Messaging.Server.MsgStore.Journal
@@ -354,10 +355,12 @@ library
354355
if impl(ghc >= 9.6.2)
355356
build-depends:
356357
bytestring ==0.11.*
358+
, template-haskell ==2.20.*
357359
, text >=2.0.1 && <2.2
358360
if impl(ghc < 9.6.2)
359361
build-depends:
360362
bytestring ==0.10.*
363+
, template-haskell ==2.16.*
361364
, text >=1.2.3.0 && <1.3
362365

363366
executable ntf-server

src/Simplex/FileTransfer/Client.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import qualified Data.X509 as X
3131
import qualified Data.X509.Validation as XV
3232
import qualified Network.HTTP.Types as N
3333
import qualified Network.HTTP2.Client as H
34+
import Network.Socket (HostName)
3435
import Simplex.FileTransfer.Chunks
3536
import Simplex.FileTransfer.Protocol
3637
import Simplex.FileTransfer.Transport
@@ -45,6 +46,7 @@ import Simplex.Messaging.Client
4546
transportClientConfig,
4647
clientSocksCredentials,
4748
unexpectedResponse,
49+
useWebPort,
4850
)
4951
import qualified Simplex.Messaging.Crypto as C
5052
import qualified Simplex.Messaging.Crypto.Lazy as LC
@@ -104,12 +106,13 @@ defaultXFTPClientConfig =
104106
clientALPN = Just alpnSupportedXFTPhandshakes
105107
}
106108

107-
getXFTPClient :: TransportSession FileResponse -> XFTPClientConfig -> UTCTime -> (XFTPClient -> IO ()) -> IO (Either XFTPClientError XFTPClient)
108-
getXFTPClient transportSession@(_, srv, _) config@XFTPClientConfig {clientALPN, xftpNetworkConfig, serverVRange} proxySessTs disconnected = runExceptT $ do
109+
getXFTPClient :: TransportSession FileResponse -> XFTPClientConfig -> [HostName] -> UTCTime -> (XFTPClient -> IO ()) -> IO (Either XFTPClientError XFTPClient)
110+
getXFTPClient transportSession@(_, srv, _) config@XFTPClientConfig {clientALPN, xftpNetworkConfig, serverVRange} presetDomains proxySessTs disconnected = runExceptT $ do
109111
let socksCreds = clientSocksCredentials xftpNetworkConfig proxySessTs transportSession
110112
ProtocolServer _ host port keyHash = srv
113+
useALPN = if useWebPort xftpNetworkConfig presetDomains srv then Just [httpALPN11] else clientALPN
111114
useHost <- liftEither $ chooseTransportHost xftpNetworkConfig host
112-
let tcConfig = transportClientConfig xftpNetworkConfig NRMBackground useHost False clientALPN
115+
let tcConfig = transportClientConfig xftpNetworkConfig NRMBackground useHost False useALPN
113116
http2Config = xftpHTTP2Config tcConfig config
114117
clientVar <- newTVarIO Nothing
115118
let usePort = if null port then "443" else port
@@ -121,7 +124,8 @@ getXFTPClient transportSession@(_, srv, _) config@XFTPClientConfig {clientALPN,
121124
thParams0 = THandleParams {sessionId, blockSize = xftpBlockSize, thVersion = v, thServerVRange, thAuth = Nothing, implySessId = False, encryptBlock = Nothing, batch = True, serviceAuth = False}
122125
logDebug $ "Client negotiated handshake protocol: " <> tshow sessionALPN
123126
thParams@THandleParams {thVersion} <- case sessionALPN of
124-
Just "xftp/1" -> xftpClientHandshakeV1 serverVRange keyHash http2Client thParams0
127+
Just alpn | alpn == xftpALPNv1 || alpn == httpALPN11 ->
128+
xftpClientHandshakeV1 serverVRange keyHash http2Client thParams0
125129
_ -> pure thParams0
126130
logDebug $ "Client negotiated protocol: " <> tshow thVersion
127131
let c = XFTPClient {http2Client, thParams, transportSession, config}

src/Simplex/FileTransfer/Client/Agent.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ getXFTPServerClient XFTPClientAgent {xftpClients, startedAt, config} srv = do
7171
connectClient =
7272
ExceptT $
7373
first (XFTPClientAgentError srv)
74-
<$> getXFTPClient (1, srv, Nothing) (xftpConfig config) startedAt clientDisconnected
74+
<$> getXFTPClient (1, srv, Nothing) (xftpConfig config) [] startedAt clientDisconnected
7575

7676
clientDisconnected :: XFTPClient -> IO ()
7777
clientDisconnected _ = do

src/Simplex/FileTransfer/Server.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira
133133
req0 = XFTPTransportRequest {thParams = thParams0, request = r, reqBody, sendResponse}
134134
flip runReaderT env $ case sessionALPN of
135135
Nothing -> processRequest req0
136-
Just "xftp/1" ->
136+
Just alpn | alpn == xftpALPNv1 || alpn == httpALPN11 ->
137137
xftpServerHandshakeV1 chain signKey sessions req0 >>= \case
138138
Nothing -> pure () -- handshake response sent
139139
Just thParams -> processRequest req0 {thParams} -- proceed with new version (XXX: may as well switch the request handler here)

src/Simplex/FileTransfer/Server/Main.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import Simplex.Messaging.Encoding.String
2727
import Simplex.Messaging.Protocol (ProtoServerWithAuth (..), pattern XFTPServer)
2828
import Simplex.Messaging.Server.CLI
2929
import Simplex.Messaging.Server.Expiration
30-
import Simplex.Messaging.Transport (simplexMQVersion)
3130
import Simplex.Messaging.Transport.Client (TransportHost (..))
31+
import Simplex.Messaging.Transport.HTTP2 (httpALPN)
3232
import Simplex.Messaging.Transport.Server (ServerCredentials (..), mkTransportServerConfig)
3333
import Simplex.Messaging.Util (eitherToMaybe, safeDecodeUtf8, tshow)
3434
import System.Directory (createDirectoryIfMissing, doesFileExist)
@@ -60,7 +60,7 @@ xftpServerCLI cfgPath logPath = do
6060
putStrLn "Deleted configuration and log files"
6161
where
6262
iniFile = combine cfgPath "file-server.ini"
63-
serverVersion = "SimpleX XFTP server v" <> simplexMQVersion
63+
serverVersion = "SimpleX XFTP server v" <> simplexmqVersionCommit
6464
defaultServerPort = "443"
6565
executableName = "file-server"
6666
storeLogFilePath = combine logPath "file-server-store.log"
@@ -196,7 +196,7 @@ xftpServerCLI cfgPath logPath = do
196196
transportConfig =
197197
mkTransportServerConfig
198198
(fromMaybe False $ iniOnOff "TRANSPORT" "log_tls_errors" ini)
199-
(Just alpnSupportedXFTPhandshakes)
199+
(Just $ alpnSupportedXFTPhandshakes <> httpALPN)
200200
False,
201201
responseDelay = 0
202202
}

src/Simplex/FileTransfer/Transport.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module Simplex.FileTransfer.Transport
1414
blockedFilesXFTPVersion,
1515
xftpClientHandshakeStub,
1616
alpnSupportedXFTPhandshakes,
17+
xftpALPNv1,
1718
XFTPClientHandshake (..),
1819
-- xftpClientHandshake,
1920
XFTPServerHandshake (..),
@@ -105,7 +106,10 @@ xftpClientHandshakeStub :: c 'TClient -> Maybe C.KeyPairX25519 -> C.KeyHash -> V
105106
xftpClientHandshakeStub _c _ks _keyHash _xftpVRange _proxyServer _serviceKeys = throwE TEVersion
106107

107108
alpnSupportedXFTPhandshakes :: [ALPN]
108-
alpnSupportedXFTPhandshakes = ["xftp/1"]
109+
alpnSupportedXFTPhandshakes = [xftpALPNv1]
110+
111+
xftpALPNv1 :: ALPN
112+
xftpALPNv1 = "xftp/1"
109113

110114
data XFTPServerHandshake = XFTPServerHandshake
111115
{ xftpVersionRange :: VersionRangeXFTP,

src/Simplex/Messaging/Agent/Client.hs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ data AgentClient = AgentClient
330330
xftpServers :: TMap UserId (UserServers 'PXFTP),
331331
xftpClients :: TMap XFTPTransportSession XFTPClientVar,
332332
useNetworkConfig :: TVar (NetworkConfig, NetworkConfig), -- (slow, fast) networks
333-
presetSMPDomains :: [HostName],
333+
presetDomains :: [HostName],
334334
userNetworkInfo :: TVar UserNetworkInfo,
335335
userNetworkUpdated :: TVar (Maybe UTCTime),
336336
subscrConns :: TVar (Set ConnId),
@@ -537,7 +537,7 @@ newAgentClient clientId InitialAgentServers {smp, ntf, xftp, netCfg, presetDomai
537537
xftpServers,
538538
xftpClients,
539539
useNetworkConfig,
540-
presetSMPDomains = presetDomains,
540+
presetDomains,
541541
userNetworkInfo,
542542
userNetworkUpdated,
543543
subscrConns,
@@ -686,7 +686,7 @@ getSMPProxyClient c@AgentClient {active, smpClients, smpProxiedRelays, workerSeq
686686
Nothing -> Left $ BROKER (B.unpack $ strEncode srv) TIMEOUT
687687

688688
smpConnectClient :: AgentClient -> NetworkRequestMode -> SMPTransportSession -> TMap SMPServer ProxiedRelayVar -> SMPClientVar -> AM SMPConnectedClient
689-
smpConnectClient c@AgentClient {smpClients, msgQ, proxySessTs} nm tSess@(_, srv, _) prs v =
689+
smpConnectClient c@AgentClient {smpClients, msgQ, proxySessTs, presetDomains} nm tSess@(_, srv, _) prs v =
690690
newProtocolClient c tSess smpClients connectClient v
691691
`catchAgentError` \e -> lift (resubscribeSMPSession c tSess) >> throwE e
692692
where
@@ -697,7 +697,7 @@ smpConnectClient c@AgentClient {smpClients, msgQ, proxySessTs} nm tSess@(_, srv,
697697
env <- ask
698698
liftError (protocolClientError SMP $ B.unpack $ strEncode srv) $ do
699699
ts <- readTVarIO proxySessTs
700-
smp <- ExceptT $ getProtocolClient g nm tSess cfg (presetSMPDomains c) (Just msgQ) ts $ smpClientDisconnected c tSess env v' prs
700+
smp <- ExceptT $ getProtocolClient g nm tSess cfg presetDomains (Just msgQ) ts $ smpClientDisconnected c tSess env v' prs
701701
pure SMPConnectedClient {connectedClient = smp, proxiedRelays = prs}
702702

703703
smpClientDisconnected :: AgentClient -> SMPTransportSession -> Env -> SMPClientVar -> TMap SMPServer ProxiedRelayVar -> SMPClient -> IO ()
@@ -786,7 +786,7 @@ reconnectSMPClient c tSess@(_, srv, _) qs = handleNotify $ do
786786
notifySub connId cmd = atomically $ writeTBQueue (subQ c) ("", connId, AEvt (sAEntity @e) cmd)
787787

788788
getNtfServerClient :: AgentClient -> NetworkRequestMode -> NtfTransportSession -> AM NtfClient
789-
getNtfServerClient c@AgentClient {active, ntfClients, workerSeq, proxySessTs} nm tSess@(_, srv, _) = do
789+
getNtfServerClient c@AgentClient {active, ntfClients, workerSeq, proxySessTs, presetDomains} nm tSess@(_, srv, _) = do
790790
unlessM (readTVarIO active) $ throwE INACTIVE
791791
ts <- liftIO getCurrentTime
792792
atomically (getSessVar workerSeq tSess ntfClients ts)
@@ -800,7 +800,7 @@ getNtfServerClient c@AgentClient {active, ntfClients, workerSeq, proxySessTs} nm
800800
g <- asks random
801801
ts <- readTVarIO proxySessTs
802802
liftError' (protocolClientError NTF $ B.unpack $ strEncode srv) $
803-
getProtocolClient g nm tSess cfg [] Nothing ts $
803+
getProtocolClient g nm tSess cfg presetDomains Nothing ts $
804804
clientDisconnected v
805805

806806
clientDisconnected :: NtfClientVar -> NtfClient -> IO ()
@@ -810,7 +810,7 @@ getNtfServerClient c@AgentClient {active, ntfClients, workerSeq, proxySessTs} nm
810810
logInfo . decodeUtf8 $ "Agent disconnected from " <> showServer srv
811811

812812
getXFTPServerClient :: AgentClient -> XFTPTransportSession -> AM XFTPClient
813-
getXFTPServerClient c@AgentClient {active, xftpClients, workerSeq, proxySessTs} tSess@(_, srv, _) = do
813+
getXFTPServerClient c@AgentClient {active, xftpClients, workerSeq, proxySessTs, presetDomains} tSess@(_, srv, _) = do
814814
unlessM (readTVarIO active) $ throwE INACTIVE
815815
ts <- liftIO getCurrentTime
816816
atomically (getSessVar workerSeq tSess xftpClients ts)
@@ -824,7 +824,7 @@ getXFTPServerClient c@AgentClient {active, xftpClients, workerSeq, proxySessTs}
824824
xftpNetworkConfig <- getNetworkConfig c
825825
ts <- readTVarIO proxySessTs
826826
liftError' (protocolClientError XFTP $ B.unpack $ strEncode srv) $
827-
X.getXFTPClient tSess cfg {xftpNetworkConfig} ts $
827+
X.getXFTPClient tSess cfg {xftpNetworkConfig} presetDomains ts $
828828
clientDisconnected v
829829

830830
clientDisconnected :: XFTPClientVar -> XFTPClient -> IO ()
@@ -1227,15 +1227,15 @@ data ProtocolTestFailure = ProtocolTestFailure
12271227
deriving (Eq, Show)
12281228

12291229
runSMPServerTest :: AgentClient -> NetworkRequestMode -> UserId -> SMPServerWithAuth -> AM' (Maybe ProtocolTestFailure)
1230-
runSMPServerTest c nm userId (ProtoServerWithAuth srv auth) = do
1230+
runSMPServerTest c@AgentClient {presetDomains} nm userId (ProtoServerWithAuth srv auth) = do
12311231
cfg <- getClientConfig c smpCfg
12321232
C.AuthAlg ra <- asks $ rcvAuthAlg . config
12331233
C.AuthAlg sa <- asks $ sndAuthAlg . config
12341234
g <- asks random
12351235
liftIO $ do
12361236
let tSess = (userId, srv, Nothing)
12371237
ts <- readTVarIO $ proxySessTs c
1238-
getProtocolClient g nm tSess cfg (presetSMPDomains c) Nothing ts (\_ -> pure ()) >>= \case
1238+
getProtocolClient g nm tSess cfg presetDomains Nothing ts (\_ -> pure ()) >>= \case
12391239
Right smp -> do
12401240
rKeys@(_, rpKey) <- atomically $ C.generateAuthKeyPair ra g
12411241
(sKey, spKey) <- atomically $ C.generateAuthKeyPair sa g
@@ -1256,7 +1256,7 @@ runSMPServerTest c nm userId (ProtoServerWithAuth srv auth) = do
12561256
testErr step = ProtocolTestFailure step . protocolClientError SMP addr
12571257

12581258
runXFTPServerTest :: AgentClient -> NetworkRequestMode -> UserId -> XFTPServerWithAuth -> AM' (Maybe ProtocolTestFailure)
1259-
runXFTPServerTest c nm userId (ProtoServerWithAuth srv auth) = do
1259+
runXFTPServerTest c@AgentClient {presetDomains} nm userId (ProtoServerWithAuth srv auth) = do
12601260
cfg <- asks $ xftpCfg . config
12611261
g <- asks random
12621262
xftpNetworkConfig <- getNetworkConfig c
@@ -1266,7 +1266,7 @@ runXFTPServerTest c nm userId (ProtoServerWithAuth srv auth) = do
12661266
liftIO $ do
12671267
let tSess = (userId, srv, Nothing)
12681268
ts <- readTVarIO $ proxySessTs c
1269-
X.getXFTPClient tSess cfg {xftpNetworkConfig} ts (\_ -> pure ()) >>= \case
1269+
X.getXFTPClient tSess cfg {xftpNetworkConfig} presetDomains ts (\_ -> pure ()) >>= \case
12701270
Right xftp -> withTestChunk filePath $ do
12711271
(sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g
12721272
(rcvKey, rpKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g
@@ -1304,14 +1304,14 @@ runXFTPServerTest c nm userId (ProtoServerWithAuth srv auth) = do
13041304
createTestChunk fp = B.writeFile fp =<< atomically . C.randomBytes chSize =<< C.newRandom
13051305

13061306
runNTFServerTest :: AgentClient -> NetworkRequestMode -> UserId -> NtfServerWithAuth -> AM' (Maybe ProtocolTestFailure)
1307-
runNTFServerTest c nm userId (ProtoServerWithAuth srv _) = do
1307+
runNTFServerTest c@AgentClient {presetDomains} nm userId (ProtoServerWithAuth srv _) = do
13081308
cfg <- getClientConfig c ntfCfg
13091309
C.AuthAlg a <- asks $ rcvAuthAlg . config
13101310
g <- asks random
13111311
liftIO $ do
13121312
let tSess = (userId, srv, Nothing)
13131313
ts <- readTVarIO $ proxySessTs c
1314-
getProtocolClient g nm tSess cfg [] Nothing ts (\_ -> pure ()) >>= \case
1314+
getProtocolClient g nm tSess cfg presetDomains Nothing ts (\_ -> pure ()) >>= \case
13151315
Right ntf -> do
13161316
(nKey, npKey) <- atomically $ C.generateAuthKeyPair a g
13171317
(dhKey, _) <- atomically $ C.generateKeyPair g

0 commit comments

Comments
 (0)