diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index d7a261734..df5ffa5c5 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -640,10 +640,11 @@ joinConnSrv c userId connId enableNtfs (CRContactUri ConnReqUriData {crAgentVRan joinConnSrvAsync :: AgentMonad m => AgentClient -> UserId -> ConnId -> Bool -> ConnectionRequestUri c -> ConnInfo -> SMPServerWithAuth -> m () joinConnSrvAsync c userId connId enableNtfs inv@CRInvitationUri {} cInfo srv = do (aVersion, cData, q, rc, e2eSndParams) <- startJoinInvitation userId connId enableNtfs inv - withStore c $ \db -> runExceptT $ do - void . ExceptT $ updateNewConnSnd db connId q + dbQueueId <- withStore c $ \db -> runExceptT $ do liftIO $ createRatchet db connId rc - confirmQueueAsync aVersion c cData q srv cInfo $ Just e2eSndParams + ExceptT $ updateNewConnSnd db connId q + let q' = (q :: SndQueue) {dbQueueId} + confirmQueueAsync aVersion c cData q' srv cInfo $ Just e2eSndParams joinConnSrvAsync _c _userId _connId _enableNtfs (CRContactUri _) _cInfo _srv = do throwError $ CMD PROHIBITED diff --git a/tests/SMPClient.hs b/tests/SMPClient.hs index 639f254d0..9c283ae2c 100644 --- a/tests/SMPClient.hs +++ b/tests/SMPClient.hs @@ -173,20 +173,23 @@ smpTest _ test' = runSmpTest test' `shouldReturn` () smpTestN :: (HasCallStack, Transport c) => Int -> (HasCallStack => [THandle c] -> IO ()) -> Expectation smpTestN n test' = runSmpTestN n test' `shouldReturn` () -smpTest2 :: (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> IO ()) -> Expectation +smpTest2 :: forall c. (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> IO ()) -> Expectation smpTest2 _ test' = smpTestN 2 _test where + _test :: HasCallStack => [THandle c] -> IO () _test [h1, h2] = test' h1 h2 _test _ = error "expected 2 handles" -smpTest3 :: (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> THandle c -> IO ()) -> Expectation +smpTest3 :: forall c. (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> THandle c -> IO ()) -> Expectation smpTest3 _ test' = smpTestN 3 _test where + _test :: HasCallStack => [THandle c] -> IO () _test [h1, h2, h3] = test' h1 h2 h3 _test _ = error "expected 3 handles" -smpTest4 :: (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> THandle c -> THandle c -> IO ()) -> Expectation +smpTest4 :: forall c. (HasCallStack, Transport c) => TProxy c -> (HasCallStack => THandle c -> THandle c -> THandle c -> THandle c -> IO ()) -> Expectation smpTest4 _ test' = smpTestN 4 _test where + _test :: HasCallStack => [THandle c] -> IO () _test [h1, h2, h3, h4] = test' h1 h2 h3 h4 _test _ = error "expected 4 handles" diff --git a/tests/ServerTests.hs b/tests/ServerTests.hs index 7a3402f61..19d63c5bd 100644 --- a/tests/ServerTests.hs +++ b/tests/ServerTests.hs @@ -182,65 +182,65 @@ testCreateSecureV2 _ = testCreateSecure :: ATransport -> Spec testCreateSecure (ATransport t) = it "should create (NEW) and secure (KEY) queue" $ - smpTest t $ \h -> do + smpTest2 t $ \r s -> do (rPub, rKey) <- C.generateSignatureKeyPair C.SEd448 (dhPub, dhPriv :: C.PrivateKeyX25519) <- C.generateKeyPair' - Resp "abcd" rId1 (Ids rId sId srvDh) <- signSendRecv h rKey ("abcd", "", NEW rPub dhPub Nothing) + Resp "abcd" rId1 (Ids rId sId srvDh) <- signSendRecv r rKey ("abcd", "", NEW rPub dhPub Nothing) let dec = decryptMsgV3 $ C.dh' srvDh dhPriv (rId1, "") #== "creates queue" - Resp "bcda" sId1 ok1 <- sendRecv h ("", "bcda", sId, _SEND "hello") + Resp "bcda" sId1 ok1 <- sendRecv s ("", "bcda", sId, _SEND "hello") (ok1, OK) #== "accepts unsigned SEND" (sId1, sId) #== "same queue ID in response 1" - Resp "" _ (Msg mId1 msg1) <- tGet1 h + Resp "" _ (Msg mId1 msg1) <- tGet1 r (dec mId1 msg1, Right "hello") #== "delivers message" - Resp "cdab" _ ok4 <- signSendRecv h rKey ("cdab", rId, ACK mId1) + Resp "cdab" _ ok4 <- signSendRecv r rKey ("cdab", rId, ACK mId1) (ok4, OK) #== "replies OK when message acknowledged if no more messages" - Resp "dabc" _ err6 <- signSendRecv h rKey ("dabc", rId, ACK mId1) + Resp "dabc" _ err6 <- signSendRecv r rKey ("dabc", rId, ACK mId1) (err6, ERR NO_MSG) #== "replies ERR when message acknowledged without messages" (sPub, sKey) <- C.generateSignatureKeyPair C.SEd448 - Resp "abcd" sId2 err1 <- signSendRecv h sKey ("abcd", sId, _SEND "hello") + Resp "abcd" sId2 err1 <- signSendRecv s sKey ("abcd", sId, _SEND "hello") (err1, ERR AUTH) #== "rejects signed SEND" (sId2, sId) #== "same queue ID in response 2" - Resp "bcda" _ err2 <- sendRecv h (sampleSig, "bcda", rId, KEY sPub) + Resp "bcda" _ err2 <- sendRecv r (sampleSig, "bcda", rId, KEY sPub) (err2, ERR AUTH) #== "rejects KEY with wrong signature" - Resp "cdab" _ err3 <- signSendRecv h rKey ("cdab", sId, KEY sPub) + Resp "cdab" _ err3 <- signSendRecv r rKey ("cdab", sId, KEY sPub) (err3, ERR AUTH) #== "rejects KEY with sender's ID" - Resp "dabc" rId2 ok2 <- signSendRecv h rKey ("dabc", rId, KEY sPub) + Resp "dabc" rId2 ok2 <- signSendRecv r rKey ("dabc", rId, KEY sPub) (ok2, OK) #== "secures queue" (rId2, rId) #== "same queue ID in response 3" - Resp "abcd" _ OK <- signSendRecv h rKey ("abcd", rId, KEY sPub) + Resp "abcd" _ OK <- signSendRecv r rKey ("abcd", rId, KEY sPub) (sPub', _) <- C.generateSignatureKeyPair C.SEd448 - Resp "abcd" _ err4 <- signSendRecv h rKey ("abcd", rId, KEY sPub') + Resp "abcd" _ err4 <- signSendRecv r rKey ("abcd", rId, KEY sPub') (err4, ERR AUTH) #== "rejects if secured with different key" - Resp "bcda" _ ok3 <- signSendRecv h sKey ("bcda", sId, _SEND "hello again") + Resp "bcda" _ ok3 <- signSendRecv s sKey ("bcda", sId, _SEND "hello again") (ok3, OK) #== "accepts signed SEND" - Resp "" _ (Msg mId2 msg2) <- tGet1 h + Resp "" _ (Msg mId2 msg2) <- tGet1 r (dec mId2 msg2, Right "hello again") #== "delivers message 2" - Resp "cdab" _ ok5 <- signSendRecv h rKey ("cdab", rId, ACK mId2) + Resp "cdab" _ ok5 <- signSendRecv r rKey ("cdab", rId, ACK mId2) (ok5, OK) #== "replies OK when message acknowledged 2" - Resp "dabc" _ err5 <- sendRecv h ("", "dabc", sId, _SEND "hello") + Resp "dabc" _ err5 <- sendRecv s ("", "dabc", sId, _SEND "hello") (err5, ERR AUTH) #== "rejects unsigned SEND" let maxAllowedMessage = B.replicate maxMessageLength '-' - Resp "bcda" _ OK <- signSendRecv h sKey ("bcda", sId, _SEND maxAllowedMessage) - Resp "" _ (Msg mId3 msg3) <- tGet1 h + Resp "bcda" _ OK <- signSendRecv s sKey ("bcda", sId, _SEND maxAllowedMessage) + Resp "" _ (Msg mId3 msg3) <- tGet1 r (dec mId3 msg3, Right maxAllowedMessage) #== "delivers message of max size" let biggerMessage = B.replicate (maxMessageLength + 1) '-' - Resp "bcda" _ (ERR LARGE_MSG) <- signSendRecv h sKey ("bcda", sId, _SEND biggerMessage) + Resp "bcda" _ (ERR LARGE_MSG) <- signSendRecv s sKey ("bcda", sId, _SEND biggerMessage) pure () testCreateDelete :: ATransport -> Spec