Skip to content

Commit 2ff7378

Browse files
authored
[FS-1148] Backport general changes from mls to develop (#3322)
* Backport changes from e90ea40 (PR #3304)
1 parent 59e5b33 commit 2ff7378

File tree

16 files changed

+95
-107
lines changed

16 files changed

+95
-107
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Throw when remote users to be added to an MLS conversation are unreachable

libs/wire-api-federation/default.nix

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
, lib
2727
, metrics-wai
2828
, mtl
29+
, polysemy
2930
, QuickCheck
3031
, schema-profunctor
3132
, servant
@@ -66,6 +67,7 @@ mkDerivation {
6667
lens
6768
metrics-wai
6869
mtl
70+
polysemy
6971
QuickCheck
7072
schema-profunctor
7173
servant

libs/wire-api-federation/src/Wire/API/Federation/API/Galley.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
module Wire.API.Federation.API.Galley where
1919

2020
import Data.Aeson (FromJSON, ToJSON)
21+
import Data.Domain
2122
import Data.Id
2223
import Data.Json.Util
2324
import Data.Misc (Milliseconds)
@@ -423,7 +424,12 @@ data MLSMessageResponse
423424
= MLSMessageResponseError GalleyError
424425
| MLSMessageResponseProtocolError Text
425426
| MLSMessageResponseProposalFailure Wai.Error
426-
| MLSMessageResponseUpdates [ConversationUpdate] (Maybe UnreachableUsers)
427+
| -- | The conversation-owning backend could not reach some of the backends that
428+
-- have users in the conversation when processing a commit.
429+
MLSMessageResponseUnreachableBackends (Set Domain)
430+
| -- | If the list of unreachable users is non-empty, it corresponds to users
431+
-- that an application message could not be sent to.
432+
MLSMessageResponseUpdates [ConversationUpdate] (Maybe UnreachableUsers)
427433
deriving stock (Eq, Show, Generic)
428434
deriving (ToJSON, FromJSON) via (CustomEncoded MLSMessageResponse)
429435

libs/wire-api-federation/src/Wire/API/Federation/Error.hs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,17 @@ module Wire.API.Federation.Error
7575
federationRemoteResponseError,
7676
federationNotImplemented,
7777
federationNotConfigured,
78+
79+
-- * utilities
80+
throwUnreachableUsers,
81+
throwUnreachableDomains,
7882
)
7983
where
8084

85+
import Data.Domain
86+
import qualified Data.List.NonEmpty as NE
87+
import Data.Qualified
88+
import qualified Data.Set as Set
8189
import qualified Data.Text as T
8290
import qualified Data.Text.Encoding as T
8391
import qualified Data.Text.Lazy as LT
@@ -87,8 +95,11 @@ import qualified Network.HTTP.Types.Status as HTTP
8795
import qualified Network.HTTP2.Client as HTTP2
8896
import qualified Network.Wai.Utilities.Error as Wai
8997
import OpenSSL.Session (SomeSSLException)
98+
import Polysemy
99+
import qualified Polysemy.Error as P
90100
import Servant.Client
91101
import Wire.API.Error
102+
import Wire.API.Unreachable
92103

93104
-- | Transport-layer errors in federator client.
94105
data FederatorClientHTTP2Error
@@ -151,6 +162,8 @@ data FederationError
151162
FederationUnexpectedBody Text
152163
| -- | Federator client got an unexpected error response from remote backend
153164
FederationUnexpectedError Text
165+
| -- | One or more remote backends is unreachable
166+
FederationUnreachableDomains (Set Domain)
154167
deriving (Show, Typeable)
155168

156169
data VersionNegotiationError
@@ -178,6 +191,7 @@ federationErrorToWai FederationNotConfigured = federationNotConfigured
178191
federationErrorToWai (FederationCallFailure err) = federationClientErrorToWai err
179192
federationErrorToWai (FederationUnexpectedBody s) = federationUnexpectedBody s
180193
federationErrorToWai (FederationUnexpectedError t) = federationUnexpectedError t
194+
federationErrorToWai (FederationUnreachableDomains ds) = federationUnreachableError ds
181195

182196
federationClientErrorToWai :: FederatorClientError -> Wai.Error
183197
federationClientErrorToWai (FederatorClientHTTP2Error e) =
@@ -304,6 +318,16 @@ federationUnexpectedError msg =
304318
"federation-unexpected-wai-error"
305319
("Could parse body, but got an unexpected error response: " <> LT.fromStrict msg)
306320

321+
federationUnreachableError :: Set Domain -> Wai.Error
322+
federationUnreachableError (Set.map domainText -> ds) =
323+
Wai.mkError
324+
status
325+
"federation-unreachable-domains-error"
326+
("The following domains are unreachable: " <> (LT.pack . show . Set.toList) ds)
327+
where
328+
status :: Status
329+
status = HTTP.Status 503 "Unreachable federated domains"
330+
307331
federationNotConfigured :: Wai.Error
308332
federationNotConfigured =
309333
Wai.mkError
@@ -324,3 +348,17 @@ federationUnknownError =
324348
unexpectedFederationResponseStatus
325349
"unknown-federation-error"
326350
"Unknown federation error"
351+
352+
--------------------------------------------------------------------------------
353+
-- Utilities
354+
355+
throwUnreachableUsers :: Member (P.Error FederationError) r => UnreachableUsers -> Sem r a
356+
throwUnreachableUsers =
357+
throwUnreachableDomains
358+
. Set.fromList
359+
. NE.toList
360+
. fmap qDomain
361+
. unreachableUsers
362+
363+
throwUnreachableDomains :: Member (P.Error FederationError) r => Set Domain -> Sem r a
364+
throwUnreachableDomains = P.throw . FederationUnreachableDomains

libs/wire-api-federation/test/Test/Wire/API/Federation/Golden/GoldenSpec.hs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,7 @@ spec =
4242
testObjects
4343
[ (MLSMessageSendingStatus.testObject_MLSMessageSendingStatus1, "testObject_MLSMessageSendingStatus1.json"),
4444
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus2, "testObject_MLSMessageSendingStatus2.json"),
45-
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus3, "testObject_MLSMessageSendingStatus3.json"),
46-
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus4, "testObject_MLSMessageSendingStatus4.json"),
47-
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus5, "testObject_MLSMessageSendingStatus5.json"),
48-
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus6, "testObject_MLSMessageSendingStatus6.json")
45+
(MLSMessageSendingStatus.testObject_MLSMessageSendingStatus3, "testObject_MLSMessageSendingStatus3.json")
4946
]
5047
testObjects [(LeaveConversationRequest.testObject_LeaveConversationRequest1, "testObject_LeaveConversationRequest1.json")]
5148
testObjects

libs/wire-api-federation/test/Test/Wire/API/Federation/Golden/MLSMessageSendingStatus.hs

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,47 +31,23 @@ testObject_MLSMessageSendingStatus1 =
3131
MLSMessageSendingStatus
3232
{ mmssEvents = [],
3333
mmssTime = toUTCTimeMillis (read "1864-04-12 12:22:43.673 UTC"),
34-
mmssUnreachableUsers = mempty
34+
mmssFailedToSendTo = mempty
3535
}
3636

3737
testObject_MLSMessageSendingStatus2 :: MLSMessageSendingStatus
3838
testObject_MLSMessageSendingStatus2 =
3939
MLSMessageSendingStatus
4040
{ mmssEvents = [],
4141
mmssTime = toUTCTimeMillis (read "2001-04-12 12:22:43.673 UTC"),
42-
mmssUnreachableUsers = unreachableFromList failed1
42+
mmssFailedToSendTo = unreachableFromList failed1
4343
}
4444

4545
testObject_MLSMessageSendingStatus3 :: MLSMessageSendingStatus
4646
testObject_MLSMessageSendingStatus3 =
4747
MLSMessageSendingStatus
4848
{ mmssEvents = [],
4949
mmssTime = toUTCTimeMillis (read "1999-04-12 12:22:43.673 UTC"),
50-
mmssUnreachableUsers = unreachableFromList failed2
51-
}
52-
53-
testObject_MLSMessageSendingStatus4 :: MLSMessageSendingStatus
54-
testObject_MLSMessageSendingStatus4 =
55-
MLSMessageSendingStatus
56-
{ mmssEvents = [],
57-
mmssTime = toUTCTimeMillis (read "2023-04-12 12:22:43.673 UTC"),
58-
mmssUnreachableUsers = unreachableFromList failed1
59-
}
60-
61-
testObject_MLSMessageSendingStatus5 :: MLSMessageSendingStatus
62-
testObject_MLSMessageSendingStatus5 =
63-
MLSMessageSendingStatus
64-
{ mmssEvents = [],
65-
mmssTime = toUTCTimeMillis (read "1901-04-12 12:22:43.673 UTC"),
66-
mmssUnreachableUsers = unreachableFromList failed2
67-
}
68-
69-
testObject_MLSMessageSendingStatus6 :: MLSMessageSendingStatus
70-
testObject_MLSMessageSendingStatus6 =
71-
MLSMessageSendingStatus
72-
{ mmssEvents = [],
73-
mmssTime = toUTCTimeMillis (read "1905-04-12 12:22:43.673 UTC"),
74-
mmssUnreachableUsers = unreachableFromList failed1 <> unreachableFromList failed2
50+
mmssFailedToSendTo = unreachableFromList failed2
7551
}
7652

7753
failed1 :: [Qualified UserId]

libs/wire-api-federation/test/golden/testObject_MLSMessageSendingStatus4.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

libs/wire-api-federation/test/golden/testObject_MLSMessageSendingStatus5.json

Lines changed: 0 additions & 14 deletions
This file was deleted.

libs/wire-api-federation/test/golden/testObject_MLSMessageSendingStatus6.json

Lines changed: 0 additions & 18 deletions
This file was deleted.

libs/wire-api-federation/wire-api-federation.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ library
9797
, lens
9898
, metrics-wai
9999
, mtl
100+
, polysemy
100101
, QuickCheck >=2.13
101102
, schema-profunctor
102103
, servant >=0.16

0 commit comments

Comments
 (0)