Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Generated Swagger docs differed from the ratified ones for versions up to V9
regarding the `get-all-registered-domains`
(`/teams/{teamId}/registered-domains`) endpoint: The `backend_url` became part
of the `backend` object which should be introduced with V10. As teams do not
set backend redirects this should not be seen in practice.
23 changes: 13 additions & 10 deletions libs/wire-api/src/Wire/API/EnterpriseLogin.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ import Data.Id
import Data.Json.Util (base64URLSchema)
import Data.Misc
import Data.OpenApi qualified as S
import Data.Ord
import Data.Schema
import Data.Singletons
import Data.Text qualified as Text
import Data.Text.Ascii (AsciiBase64Url, AsciiText (toText))
import Data.Text.Ascii qualified as Ascii
Expand All @@ -30,6 +32,7 @@ import SAML2.WebSSO.Test.Arbitrary ()
import Test.QuickCheck (suchThat)
import Web.HttpApiData
import Wire.API.Routes.Bearer
import Wire.API.Routes.Version
import Wire.Arbitrary

data DomainRedirect
Expand Down Expand Up @@ -104,8 +107,8 @@ backendConfigSchemaV9 =
-- API versions <= V9 ignore the WebApp URL
<*> const Nothing .= pure Nothing

domainRedirectSchema :: ObjectSchema SwaggerDoc DomainRedirect
domainRedirectSchema =
domainRedirectSchema :: Version -> ObjectSchema SwaggerDoc DomainRedirect
domainRedirectSchema v =
snd
<$> (domainRedirectTag &&& id)
.= bind
Expand All @@ -117,7 +120,7 @@ domainRedirectSchema =
NoneTag -> tag _None (pure ())
LockedTag -> tag _Locked (pure ())
SSOTag -> tag _SSO samlIdPIdObjectSchema
BackendTag -> tag (_Backend) backendConfigFieldSchema
BackendTag -> tag (_Backend) (if v <= V9 then backendConfigSchemaV9 else backendConfigFieldSchema)
NoRegistrationTag -> tag _NoRegistration (pure ())
PreAuthorizedTag -> tag _PreAuthorized (pure ())

Expand All @@ -135,7 +138,7 @@ samlIdPIdObjectSchema :: ObjectSchema SwaggerDoc SAML.IdPId
samlIdPIdObjectSchema = SAML.IdPId <$> SAML.fromIdPId .= field "sso_code" uuidSchema

instance ToSchema DomainRedirect where
schema = object "DomainRedirect " domainRedirectSchema
schema = object "DomainRedirect " (domainRedirectSchema V10)

deriving via (Schema DomainRedirect) instance FromJSON DomainRedirect

Expand Down Expand Up @@ -237,29 +240,29 @@ instance ToSchema DomainRegistrationUpdate where
schema =
object "DomainRegistrationUpdate" $
DomainRegistrationUpdate
<$> (.domainRedirect) .= domainRedirectSchema
<$> (.domainRedirect) .= domainRedirectSchema V10
<*> (.teamInvite) .= teamInviteObjectSchema

data DomainRegistrationResponse = DomainRegistrationResponse
data DomainRegistrationResponse (v :: Version) = DomainRegistrationResponse
{ domain :: Domain,
authorizedTeam :: Maybe TeamId,
domainRedirect :: DomainRedirect,
teamInvite :: TeamInvite,
dnsVerificationToken :: Maybe DnsVerificationToken
}
deriving stock (Eq, Show)
deriving (ToJSON, FromJSON, S.ToSchema) via Schema DomainRegistrationResponse
deriving (ToJSON, FromJSON, S.ToSchema) via Schema (DomainRegistrationResponse v)

mkDomainRegistrationResponse :: DomainRegistration -> DomainRegistrationResponse
mkDomainRegistrationResponse :: DomainRegistration -> DomainRegistrationResponse v
mkDomainRegistrationResponse DomainRegistration {..} = DomainRegistrationResponse {..}

instance ToSchema DomainRegistrationResponse where
instance (SingI v) => ToSchema (DomainRegistrationResponse v) where
schema =
object "DomainRegistrationResponse" $
DomainRegistrationResponse
<$> (.domain) .= field "domain" schema
<*> (.authorizedTeam) .= maybe_ (optField "authorized_team" schema)
<*> (.domainRedirect) .= domainRedirectSchema
<*> (.domainRedirect) .= domainRedirectSchema (fromSing (sing @v))
<*> (.teamInvite) .= teamInviteObjectSchema
<*> (.dnsVerificationToken) .= optField "dns_verification_token" (maybeWithDefault Aeson.Null schema)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import Data.Domain
import Servant
import Wire.API.EnterpriseLogin
import Wire.API.Routes.Named
import Wire.API.Routes.Version

--------------------------------------------------------------------------------
-- API Internal
Expand Down Expand Up @@ -103,5 +104,5 @@ type EnterpriseLoginApi =
:> Description "Returns the current entry in the domain table for that domain, as a JSON document"
:> "domain-registration"
:> Capture "domain" Domain
:> Get '[JSON] DomainRegistrationResponse
:> Get '[JSON] (DomainRegistrationResponse V10)
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import Data.Id
import Data.Misc
import Data.OpenApi qualified as S
import Data.Schema
import Data.Singletons (SingI)
import Imports
import SAML2.WebSSO qualified as SAML
import Servant
Expand Down Expand Up @@ -250,10 +251,10 @@ instance ToSchema DomainOwnershipToken where
DomainOwnershipToken
<$> unDomainOwnershipToken .= field "domain_ownership_token" schema

newtype RegisteredDomains = RegisteredDomains {unRegisteredDomains :: [DomainRegistrationResponse]}
deriving (A.ToJSON, A.FromJSON, S.ToSchema) via (Schema RegisteredDomains)
newtype RegisteredDomains (v :: Version) = RegisteredDomains {unRegisteredDomains :: [DomainRegistrationResponse v]}
deriving (A.ToJSON, A.FromJSON, S.ToSchema) via Schema (RegisteredDomains v)

instance ToSchema RegisteredDomains where
instance (SingI v) => ToSchema (RegisteredDomains v) where
schema =
object "RegisteredDomains" $
RegisteredDomains
Expand Down Expand Up @@ -303,7 +304,7 @@ instance ToSchema DomainRedirectResponseV10 where
.= maybe_
( fromMaybe False <$> optField "due_to_existing_account" schema
)
<*> (.redirect) .= domainRedirectSchema
<*> (.redirect) .= domainRedirectSchema V10

type DomainVerificationChallengeAPI =
Named
Expand Down Expand Up @@ -369,14 +370,25 @@ type DomainVerificationTeamAPI =
:> ReqBody '[JSON] TeamInviteConfig
:> MultiVerb1 'POST '[JSON] (RespondEmpty 200 "Updated")
)
:<|> Named
"get-all-registered-domains@v9"
( Summary "Get all registered domains"
:> Until V10
:> ZLocalUser
:> "teams"
:> Capture "teamId" TeamId
:> "registered-domains"
:> Get '[JSON] (RegisteredDomains V9)
)
:<|> Named
"get-all-registered-domains"
( Summary "Get all registered domains"
:> From V10
:> ZLocalUser
:> "teams"
:> Capture "teamId" TeamId
:> "registered-domains"
:> Get '[JSON] RegisteredDomains
:> Get '[JSON] (RegisteredDomains V10)
)
:<|> Named
"delete-registered-domain"
Expand Down
43 changes: 29 additions & 14 deletions libs/wire-api/test/golden/Test/Wire/API/Golden/Manual.hs
Original file line number Diff line number Diff line change
Expand Up @@ -334,18 +334,33 @@ tests =
(testObject_InvitationUserView_team_2, "testObject_InvitationUserView_team_2.json")
],
testGroup "DomainRegistrationResponse" $
testObjects
[ (testObject_DomainRegistrationResponse_1, "testObject_DomainRegistrationResponse_1.json"),
(testObject_DomainRegistrationResponse_2, "testObject_DomainRegistrationResponse_2.json"),
(testObject_DomainRegistrationResponse_3, "testObject_DomainRegistrationResponse_3.json"),
(testObject_DomainRegistrationResponse_4, "testObject_DomainRegistrationResponse_4.json"),
(testObject_DomainRegistrationResponse_5, "testObject_DomainRegistrationResponse_5.json"),
(testObject_DomainRegistrationResponse_6, "testObject_DomainRegistrationResponse_6.json")
]
++ [ testCase
"non-isomorph in webappUrl"
(assertJSONIsGolden testObject_DomainRegistrationResponse_7 "testObject_DomainRegistrationResponse_7.json")
],
[ testGroup "V9" $
testObjects
[ (testObject_DomainRegistrationResponseV9_1, "testObject_DomainRegistrationResponseV9_1.json"),
(testObject_DomainRegistrationResponseV9_2, "testObject_DomainRegistrationResponseV9_2.json"),
(testObject_DomainRegistrationResponseV9_3, "testObject_DomainRegistrationResponseV9_3.json"),
(testObject_DomainRegistrationResponseV9_4, "testObject_DomainRegistrationResponseV9_4.json"),
(testObject_DomainRegistrationResponseV9_5, "testObject_DomainRegistrationResponseV9_5.json"),
(testObject_DomainRegistrationResponseV9_6, "testObject_DomainRegistrationResponseV9_6.json")
]
++ [ testCase
"non-isomorph in webappUrl"
(assertJSONIsGolden testObject_DomainRegistrationResponseV9_7 "testObject_DomainRegistrationResponseV9_7.json")
],
testGroup "V10" $
testObjects
[ (testObject_DomainRegistrationResponseV10_1, "testObject_DomainRegistrationResponseV10_1.json"),
(testObject_DomainRegistrationResponseV10_2, "testObject_DomainRegistrationResponseV10_2.json"),
(testObject_DomainRegistrationResponseV10_3, "testObject_DomainRegistrationResponseV10_3.json"),
(testObject_DomainRegistrationResponseV10_4, "testObject_DomainRegistrationResponseV10_4.json"),
(testObject_DomainRegistrationResponseV10_5, "testObject_DomainRegistrationResponseV10_5.json"),
(testObject_DomainRegistrationResponseV10_6, "testObject_DomainRegistrationResponseV10_6.json")
]
++ [ testCase
"non-isomorph in webappUrl"
(assertJSONIsGolden testObject_DomainRegistrationResponseV10_7 "testObject_DomainRegistrationResponseV10_7.json")
]
],
testGroup "DomainRegistrationUpdate" $
testObjects
[ (testObject_DomainRegistrationUpdate_1, "testObject_DomainRegistrationUpdate_1.json"),
Expand All @@ -361,7 +376,7 @@ tests =
],
testGroup
"DomainRedirectResponse"
$ [ testGroup "V8" $
$ [ testGroup "V9" $
testObjects
[ (testObject_DomainRedirectResponseV9_1, "testObject_DomainRedirectResponseV9_1.json"),
(testObject_DomainRedirectResponseV9_2, "testObject_DomainRedirectResponseV9_2.json"),
Expand All @@ -374,7 +389,7 @@ tests =
"non-isomorph in webappUrl"
(assertJSONIsGolden testObject_DomainRedirectResponseV9_5 "testObject_DomainRedirectResponseV9_5.json")
],
testGroup "V9" $
testGroup "V10" $
testObjects
[ (testObject_DomainRedirectResponseV10_1, "testObject_DomainRedirectResponseV10_1.json"),
(testObject_DomainRedirectResponseV10_2, "testObject_DomainRedirectResponseV10_2.json"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ import Imports
import SAML2.WebSSO qualified as SAML
import URI.ByteString (parseURI, strictURIParserOptions)
import Wire.API.EnterpriseLogin
import Wire.API.Routes.Version

testObject_DomainRegistrationResponse_1 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_1 =
testObject_DomainRegistrationResponseV10_1 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_1 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand All @@ -36,8 +37,8 @@ testObject_DomainRegistrationResponse_1 =
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponse_2 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_2 =
testObject_DomainRegistrationResponseV10_2 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_2 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand All @@ -46,8 +47,8 @@ testObject_DomainRegistrationResponse_2 =
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponse_3 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_3 =
testObject_DomainRegistrationResponseV10_3 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_3 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand All @@ -56,8 +57,8 @@ testObject_DomainRegistrationResponse_3 =
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponse_4 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_4 =
testObject_DomainRegistrationResponseV10_4 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_4 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand All @@ -66,8 +67,8 @@ testObject_DomainRegistrationResponse_4 =
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponse_5 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_5 =
testObject_DomainRegistrationResponseV10_5 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_5 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Id <$> UUID.fromString "abf7c0b2-f4e6-4588-8fbb-3b4bf2344284",
Expand All @@ -76,8 +77,8 @@ testObject_DomainRegistrationResponse_5 =
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponse_6 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_6 =
testObject_DomainRegistrationResponseV10_6 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_6 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand All @@ -86,8 +87,81 @@ testObject_DomainRegistrationResponse_6 =
dnsVerificationToken = Just $ DnsVerificationToken "jfdjsejsdjsdfjsdfjlwejwekljwef"
}

testObject_DomainRegistrationResponse_7 :: DomainRegistrationResponse
testObject_DomainRegistrationResponse_7 =
testObject_DomainRegistrationResponseV10_7 :: DomainRegistrationResponse V10
testObject_DomainRegistrationResponseV10_7 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect =
Backend
(HttpsUrl (fromRight' (parseURI strictURIParserOptions "https://example.com/inv14")))
(Just (HttpsUrl (fromRight' (parseURI strictURIParserOptions "https://webapp.example.com/inv14")))),
teamInvite = Allowed,
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_1 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_1 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect = Locked,
teamInvite = Allowed,
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_2 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_2 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect = None,
teamInvite = NotAllowed,
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_3 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_3 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect = SSO (SAML.IdPId $ fromJust (UUID.fromString "abf7c0b2-f4e6-4588-8fbb-3b4bf2344284")),
teamInvite = Team $ Id (fromJust (UUID.fromString "abf7c0b2-f4e6-4588-8fbb-3b4bf2344284")),
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_4 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_4 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect = Backend (HttpsUrl (fromRight' (parseURI strictURIParserOptions "https://example.com/inv14"))) Nothing,
teamInvite = Allowed,
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_5 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_5 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Id <$> UUID.fromString "abf7c0b2-f4e6-4588-8fbb-3b4bf2344284",
domainRedirect = NoRegistration,
teamInvite = Allowed,
dnsVerificationToken = Nothing
}

testObject_DomainRegistrationResponseV9_6 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_6 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
domainRedirect = PreAuthorized,
teamInvite = Allowed,
dnsVerificationToken = Just $ DnsVerificationToken "jfdjsejsdjsdfjsdfjlwejwekljwef"
}

testObject_DomainRegistrationResponseV9_7 :: DomainRegistrationResponse V9
testObject_DomainRegistrationResponseV9_7 =
DomainRegistrationResponse
{ domain = Domain "example.com",
authorizedTeam = Nothing,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"dns_verification_token": null,
"domain": "example.com",
"domain_redirect": "locked",
"team_invite": "allowed"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"dns_verification_token": null,
"domain": "example.com",
"domain_redirect": "none",
"team_invite": "not-allowed"
}
Loading