Skip to content

Commit c36b3f4

Browse files
committed
remove service association from agent API, add per-user flag to use the service
1 parent 34df7e4 commit c36b3f4

File tree

10 files changed

+124
-99
lines changed

10 files changed

+124
-99
lines changed

simplexmq.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ library
210210
Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250203_msg_bodies
211211
Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250322_short_links
212212
Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250702_conn_invitations_remove_cascade_delete
213+
Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250815_service_certs
213214
if flag(client_postgres) || flag(server_postgres)
214215
exposed-modules:
215216
Simplex.Messaging.Agent.Store.Postgres

src/Simplex/Messaging/Agent.hs

Lines changed: 97 additions & 63 deletions
Large diffs are not rendered by default.

src/Simplex/Messaging/Agent/Client.hs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ import Simplex.Messaging.Session
284284
import Simplex.Messaging.Agent.Store.Entity
285285
import Simplex.Messaging.TMap (TMap)
286286
import qualified Simplex.Messaging.TMap as TM
287-
import Simplex.Messaging.Transport (SMPVersion, SessionId, THandleParams (sessionId, thVersion), TransportError (..), TransportPeer (..), sndAuthKeySMPVersion, shortLinksSMPVersion, newNtfCredsSMPVersion)
287+
import Simplex.Messaging.Transport (SMPVersion, ServiceCredentials, SessionId, THandleParams (sessionId, thVersion), TransportError (..), TransportPeer (..), sndAuthKeySMPVersion, shortLinksSMPVersion, newNtfCredsSMPVersion)
288288
import Simplex.Messaging.Transport.Client (TransportHost (..))
289289
import Simplex.Messaging.Util
290290
import Simplex.Messaging.Version
@@ -321,6 +321,7 @@ data AgentClient = AgentClient
321321
msgQ :: TBQueue (ServerTransmissionBatch SMPVersion ErrorType BrokerMsg),
322322
smpServers :: TMap UserId (UserServers 'PSMP),
323323
smpClients :: TMap SMPTransportSession SMPClientVar,
324+
smpServiceCreds :: TMap UserId (Maybe (TMap SMPServer ServiceCredentials)), -- Nothing means not to use certificates for this user record
324325
-- smpProxiedRelays:
325326
-- SMPTransportSession defines connection from proxy to relay,
326327
-- SMPServerWithAuth defines client connected to SMP proxy (with the same userId and entityId in TransportSession)
@@ -493,6 +494,7 @@ newAgentClient clientId InitialAgentServers {smp, ntf, xftp, netCfg, presetDomai
493494
msgQ <- newTBQueueIO qSize
494495
smpServers <- newTVarIO $ M.map mkUserServers smp
495496
smpClients <- TM.emptyIO
497+
smpServiceCreds <- TM.emptyIO
496498
smpProxiedRelays <- TM.emptyIO
497499
ntfServers <- newTVarIO ntf
498500
ntfClients <- TM.emptyIO
@@ -531,6 +533,7 @@ newAgentClient clientId InitialAgentServers {smp, ntf, xftp, netCfg, presetDomai
531533
msgQ,
532534
smpServers,
533535
smpClients,
536+
smpServiceCreds,
534537
smpProxiedRelays,
535538
ntfServers,
536539
ntfClients,
@@ -1352,7 +1355,7 @@ getSessionMode :: MonadIO m => AgentClient -> m TransportSessionMode
13521355
getSessionMode = fmap sessionMode . getNetworkConfig
13531356
{-# INLINE getSessionMode #-}
13541357

1355-
newRcvQueue :: AgentClient -> NetworkRequestMode -> UserId -> ConnId -> SMPServerWithAuth -> VersionRangeSMPC -> SConnectionMode c -> Bool -> SubscriptionMode -> AM (NewRcvQueue, SMPQueueUri, SMPTransportSession, SessionId)
1358+
newRcvQueue :: AgentClient -> NetworkRequestMode -> UserId -> ConnId -> SMPServerWithAuth -> VersionRangeSMPC -> SConnectionMode c -> Bool -> SubscriptionMode -> AM (NewRcvQueue, SMPQueueUri, Maybe ServiceId, SMPTransportSession, SessionId)
13561359
newRcvQueue c nm userId connId srv vRange cMode enableNtfs subMode = do
13571360
let qrd = case cMode of SCMInvitation -> CQRMessaging Nothing; SCMContact -> CQRContact Nothing
13581361
e2eKeys <- atomically . C.generateKeyPair =<< asks random
@@ -1373,7 +1376,7 @@ queueReqData = \case
13731376
CQRMessaging d -> QRMessaging $ srvReq <$> d
13741377
CQRContact d -> QRContact $ srvReq <$> d
13751378

1376-
newRcvQueue_ :: AgentClient -> NetworkRequestMode -> UserId -> ConnId -> SMPServerWithAuth -> VersionRangeSMPC -> ClntQueueReqData -> Bool -> SubscriptionMode -> Maybe C.CbNonce -> C.KeyPairX25519 -> AM (NewRcvQueue, SMPQueueUri, SMPTransportSession, SessionId)
1379+
newRcvQueue_ :: AgentClient -> NetworkRequestMode -> UserId -> ConnId -> SMPServerWithAuth -> VersionRangeSMPC -> ClntQueueReqData -> Bool -> SubscriptionMode -> Maybe C.CbNonce -> C.KeyPairX25519 -> AM (NewRcvQueue, SMPQueueUri, Maybe ServiceId, SMPTransportSession, SessionId)
13771380
newRcvQueue_ c nm userId connId (ProtoServerWithAuth srv auth) vRange cqrd enableNtfs subMode nonce_ (e2eDhKey, e2ePrivKey) = do
13781381
C.AuthAlg a <- asks (rcvAuthAlg . config)
13791382
g <- asks random
@@ -1401,7 +1404,7 @@ newRcvQueue_ c nm userId connId (ProtoServerWithAuth srv auth) vRange cqrd enabl
14011404
sndId,
14021405
queueMode,
14031406
shortLink,
1404-
clientService = ClientService DBNewEntity <$> serviceId,
1407+
rcvServiceAssoc = isJust serviceId,
14051408
status = New,
14061409
dbQueueId = DBNewEntity,
14071410
primary = True,
@@ -1412,7 +1415,7 @@ newRcvQueue_ c nm userId connId (ProtoServerWithAuth srv auth) vRange cqrd enabl
14121415
deleteErrors = 0
14131416
}
14141417
qUri = SMPQueueUri vRange $ SMPQueueAddress srv sndId e2eDhKey queueMode
1415-
pure (rq, qUri, tSess, sessionId thParams')
1418+
pure (rq, qUri, serviceId, tSess, sessionId thParams')
14161419
where
14171420
mkNtfCreds :: (C.AlgorithmI a, C.AuthAlgorithm a) => C.SAlgorithm a -> TVar ChaChaDRG -> SMPClient -> IO (Maybe (C.AAuthKeyPair, C.PrivateKeyX25519), Maybe NewNtfCreds)
14181421
mkNtfCreds a g smp

src/Simplex/Messaging/Agent/Env/SQLite.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ data InitialAgentServers = InitialAgentServers
9797
ntf :: [NtfServer],
9898
xftp :: Map UserId (NonEmpty (ServerCfg 'PXFTP)),
9999
netCfg :: NetworkConfig,
100+
service :: Map UserId Bool, -- whether to use service certificates for a given user profile
100101
presetDomains :: [HostName]
101102
}
102103

src/Simplex/Messaging/Agent/Protocol.hs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ module Simplex.Messaging.Agent.Protocol
123123
ContactConnType (..),
124124
ShortLinkScheme (..),
125125
LinkKey (..),
126-
StoredClientService (..),
127-
ClientService,
128-
ClientServiceId,
129126
sameConnReqContact,
130127
sameShortLinkContact,
131128
simplexChat,
@@ -207,7 +204,6 @@ import Simplex.FileTransfer.Transport (XFTPErrorType)
207204
import Simplex.FileTransfer.Types (FileErrorType)
208205
import Simplex.Messaging.Agent.QueryString
209206
import Simplex.Messaging.Agent.Store.DB (Binary (..), FromField (..), ToField (..), blobFieldDecoder, fromTextField_)
210-
import Simplex.Messaging.Agent.Store.Entity
211207
import Simplex.Messaging.Client (ProxyClientError)
212208
import qualified Simplex.Messaging.Crypto as C
213209
import Simplex.Messaging.Crypto.Ratchet
@@ -376,7 +372,7 @@ type SndQueueSecured = Bool
376372

377373
-- | Parameterized type for SMP agent events
378374
data AEvent (e :: AEntity) where
379-
INV :: AConnectionRequestUri -> Maybe ClientServiceId -> AEvent AEConn
375+
INV :: AConnectionRequestUri -> AEvent AEConn
380376
CONF :: ConfirmationId -> PQSupport -> [SMPServer] -> ConnInfo -> AEvent AEConn -- ConnInfo is from sender, [SMPServer] will be empty only in v1 handshake
381377
REQ :: InvitationId -> PQSupport -> NonEmpty SMPServer -> ConnInfo -> AEvent AEConn -- ConnInfo is from sender
382378
INFO :: PQSupport -> ConnInfo -> AEvent AEConn
@@ -402,7 +398,7 @@ data AEvent (e :: AEntity) where
402398
DEL_USER :: Int64 -> AEvent AENone
403399
STAT :: ConnectionStats -> AEvent AEConn
404400
OK :: AEvent AEConn
405-
JOINED :: SndQueueSecured -> Maybe ClientServiceId -> AEvent AEConn
401+
JOINED :: SndQueueSecured -> AEvent AEConn
406402
ERR :: AgentErrorType -> AEvent AEConn
407403
ERRS :: [(ConnId, AgentErrorType)] -> AEvent AENone
408404
SUSPENDED :: AEvent AENone
@@ -1760,16 +1756,6 @@ instance Encoding UserLinkData where
17601756
smpP = UserLinkData <$> ((A.char '\255' *> (unLarge <$> smpP)) <|> smpP)
17611757
{-# INLINE smpP #-}
17621758

1763-
data StoredClientService (s :: DBStored) = ClientService
1764-
{ dbServiceId :: DBEntityId' s,
1765-
serviceId :: SMP.ServiceId
1766-
}
1767-
deriving (Eq, Show)
1768-
1769-
type ClientService = StoredClientService 'DBStored
1770-
1771-
type ClientServiceId = DBEntityId
1772-
17731759
-- | SMP queue status.
17741760
data QueueStatus
17751761
= -- | queue is created

src/Simplex/Messaging/Agent/Store.hs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ data StoredRcvQueue (q :: DBStored) = RcvQueue
8585
-- | short link ID and credentials
8686
shortLink :: Maybe ShortLinkCreds,
8787
-- | associated client service
88-
clientService :: Maybe (StoredClientService q),
88+
rcvServiceAssoc :: ServiceAssoc,
8989
-- | queue status
9090
status :: QueueStatus,
9191
-- | database queue ID (within connection)
@@ -111,9 +111,7 @@ data ShortLinkCreds = ShortLinkCreds
111111
}
112112
deriving (Show)
113113

114-
clientServiceId :: RcvQueue -> Maybe ClientServiceId
115-
clientServiceId = fmap dbServiceId . clientService
116-
{-# INLINE clientServiceId #-}
114+
type ServiceAssoc = Bool
117115

118116
rcvQueueInfo :: RcvQueue -> RcvQueueInfo
119117
rcvQueueInfo rq@RcvQueue {server, rcvSwchStatus} =

src/Simplex/Messaging/Agent/Store/AgentStore.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1979,7 +1979,7 @@ insertRcvQueue_ db connId' rq@RcvQueue {..} serverKeyHash_ = do
19791979
:. ntfCredsFields
19801980
)
19811981
-- TODO [certs rcv] save client service
1982-
pure (rq :: NewRcvQueue) {connId = connId', dbQueueId = qId, clientService = Nothing}
1982+
pure (rq :: NewRcvQueue) {connId = connId', dbQueueId = qId, rcvServiceAssoc = False}
19831983
where
19841984
ntfCredsFields = case clientNtfCreds of
19851985
Just ClientNtfCreds {ntfPublicKey, ntfPrivateKey, notifierId, rcvNtfDhSecret} ->
@@ -2179,7 +2179,7 @@ toRcvQueue
21792179
(Just shortLinkId, Just shortLinkKey, Just linkPrivSigKey, Just linkEncFixedData) -> Just ShortLinkCreds {shortLinkId, shortLinkKey, linkPrivSigKey, linkEncFixedData}
21802180
_ -> Nothing
21812181
-- TODO [certs rcv] read client service
2182-
in RcvQueue {userId, connId, server, rcvId, rcvPrivateKey, rcvDhSecret, e2ePrivKey, e2eDhSecret, sndId, queueMode, shortLink, clientService = Nothing, status, dbQueueId, primary, dbReplaceQueueId, rcvSwchStatus, smpClientVersion, clientNtfCreds, deleteErrors}
2182+
in RcvQueue {userId, connId, server, rcvId, rcvPrivateKey, rcvDhSecret, e2ePrivKey, e2eDhSecret, sndId, queueMode, shortLink, rcvServiceAssoc = False, status, dbQueueId, primary, dbReplaceQueueId, rcvSwchStatus, smpClientVersion, clientNtfCreds, deleteErrors}
21832183

21842184
getRcvQueueById :: DB.Connection -> ConnId -> Int64 -> IO (Either StoreError RcvQueue)
21852185
getRcvQueueById db connId dbRcvId =

src/Simplex/Messaging/Agent/Store/SQLite/Migrations/App.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20241224_ratchet_e2e_snd
4444
import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250203_msg_bodies
4545
import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250322_short_links
4646
import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250702_conn_invitations_remove_cascade_delete
47+
import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250815_service_certs
4748
import Simplex.Messaging.Agent.Store.Shared (Migration (..))
4849

4950
schemaMigrations :: [(String, Query, Maybe Query)]
@@ -87,7 +88,8 @@ schemaMigrations =
8788
("m20241224_ratchet_e2e_snd_params", m20241224_ratchet_e2e_snd_params, Just down_m20241224_ratchet_e2e_snd_params),
8889
("m20250203_msg_bodies", m20250203_msg_bodies, Just down_m20250203_msg_bodies),
8990
("m20250322_short_links", m20250322_short_links, Just down_m20250322_short_links),
90-
("m20250702_conn_invitations_remove_cascade_delete", m20250702_conn_invitations_remove_cascade_delete, Just down_m20250702_conn_invitations_remove_cascade_delete)
91+
("m20250702_conn_invitations_remove_cascade_delete", m20250702_conn_invitations_remove_cascade_delete, Just down_m20250702_conn_invitations_remove_cascade_delete),
92+
("m20250815_service_certs", m20250815_service_certs, Just down_m20250815_service_certs)
9193
]
9294

9395
-- | The list of migrations in ascending order by date

src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20250517_service_certs.hs renamed to src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20250815_service_certs.hs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{-# LANGUAGE QuasiQuotes #-}
22

3-
module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250517_service_certs where
3+
module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250815_service_certs where
44

55
import Database.SQLite.Simple (Query)
66
import Database.SQLite.Simple.QQ (sql)
77

88
-- TODO move date forward, create migration for postgres
9-
m20250517_service_certs :: Query
10-
m20250517_service_certs =
9+
m20250815_service_certs :: Query
10+
m20250815_service_certs =
1111
[sql|
1212
CREATE TABLE server_certs(
1313
server_cert_id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -24,13 +24,13 @@ CREATE UNIQUE INDEX idx_server_certs_user_id_host_port ON server_certs(user_id,
2424

2525
CREATE INDEX idx_server_certs_host_port ON server_certs(host, port);
2626

27-
ALTER TABLE rcv_queues ADD COLUMN rcv_service_id BLOB;
27+
ALTER TABLE rcv_queues ADD COLUMN rcv_service_assoc INTEGER NOT NULL DEFAULT 0;
2828
|]
2929

30-
down_m20250517_service_certs :: Query
31-
down_m20250517_service_certs =
30+
down_m20250815_service_certs :: Query
31+
down_m20250815_service_certs =
3232
[sql|
33-
ALTER TABLE rcv_queues DROP COLUMN rcv_service_id;
33+
ALTER TABLE rcv_queues DROP COLUMN rcv_service_assoc;
3434

3535
DROP INDEX idx_server_certs_host_port;
3636

src/Simplex/Messaging/Server/Information.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import qualified Data.Attoparsec.ByteString.Char8 as A
1414
import Data.Int (Int64)
1515
import Data.Maybe (isJust)
1616
import Data.Text (Text)
17-
import Simplex.Messaging.Agent.Protocol (ConnectionLink, ConnectionMode (..), ConnectionRequestUri)
17+
import Simplex.Messaging.Agent.Protocol (ConnectionLink, ConnectionMode (..))
1818
import Simplex.Messaging.Encoding.String
1919
import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, enumJSON)
2020

0 commit comments

Comments
 (0)