module Test.BlockedDomains where import API.Brig as Brig import API.Brig as BrigAddUser (AddUser (..)) import API.Common import Data.Yaml (array) import SetupHelpers import Testlib.Prelude testCannotSendActivationCodeToBlockedDomain :: (HasCallStack) => App () testCannotSendActivationCodeToBlockedDomain :: HasCallStack => App () testCannotSendActivationCodeToBlockedDomain = do let blockedDomain :: String blockedDomain = String "blocked.example.com" validDomain :: String validDomain = String "valid.example.com" ServiceOverrides -> (HasCallStack => String -> App ()) -> App () forall a. HasCallStack => ServiceOverrides -> (HasCallStack => String -> App a) -> App a withModifiedBackend ServiceOverrides forall a. Default a => a def { brigCfg = setField "optSettings.setCustomerExtensions.domainsBlockedForRegistration" (array [fromString blockedDomain]) } ((HasCallStack => String -> App ()) -> App ()) -> (HasCallStack => String -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \String domain -> do String username <- App String randomName let validEmail :: String validEmail = String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain String -> AddUser -> App Response forall dom. (HasCallStack, MakesValue dom) => dom -> AddUser -> App Response addUser String domain AddUser forall a. Default a => a def {BrigAddUser.email = Just validEmail} App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a `bindResponse` \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 201 let blockedEmail :: String blockedEmail = String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String blockedDomain App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a bindResponse (String -> String -> Maybe String -> App Response forall domain. (HasCallStack, MakesValue domain) => domain -> String -> Maybe String -> App Response activateSend String domain String blockedEmail Maybe String forall a. Maybe a Nothing) ((Response -> App ()) -> App ()) -> (Response -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 451 Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "label" App Value -> String -> App () forall a b. (MakesValue a, MakesValue b, HasCallStack) => a -> b -> App () `shouldMatch` String "domain-blocked-for-registration" let otherValidEmail :: String otherValidEmail = String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "-1@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain String -> String -> Maybe String -> App Response forall domain. (HasCallStack, MakesValue domain) => domain -> String -> Maybe String -> App Response activateSend String domain String otherValidEmail Maybe String forall a. Maybe a Nothing App Response -> (Response -> App ()) -> App () forall a b. App a -> (a -> App b) -> App b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= HasCallStack => Response -> App () Response -> App () assertSuccess testCannotChangeOwnEmailWithBlockedDomain :: (HasCallStack) => App () testCannotChangeOwnEmailWithBlockedDomain :: HasCallStack => App () testCannotChangeOwnEmailWithBlockedDomain = do let blockedDomain :: String blockedDomain = String "blocked.example.com" validDomain :: String validDomain = String "valid.example.com" ServiceOverrides -> (HasCallStack => String -> App ()) -> App () forall a. HasCallStack => ServiceOverrides -> (HasCallStack => String -> App a) -> App a withModifiedBackend ServiceOverrides forall a. Default a => a def { brigCfg = setField "optSettings.setCustomerExtensions.domainsBlockedForRegistration" (array [fromString blockedDomain]) } ((HasCallStack => String -> App ()) -> App ()) -> (HasCallStack => String -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \String domain -> do Value validUser <- String -> CreateUser -> App Value forall domain. (HasCallStack, MakesValue domain) => domain -> CreateUser -> App Value randomUser String domain CreateUser forall a. Default a => a def String validUserEmail <- Value validUser Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "email" App Value -> (App Value -> App String) -> App String forall a b. a -> (a -> b) -> b & App Value -> App String forall a. (HasCallStack, MakesValue a) => a -> App String asString (String cookie, String token) <- String -> String -> String -> App Response forall domain. (HasCallStack, MakesValue domain) => domain -> String -> String -> App Response login String domain String validUserEmail String defPassword App Response -> (Response -> App (String, String)) -> App (String, String) forall a. HasCallStack => App Response -> (Response -> App a) -> App a `bindResponse` \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 200 String token <- Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "access_token" App Value -> (App Value -> App String) -> App String forall a b. a -> (a -> b) -> b & App Value -> App String forall a. (HasCallStack, MakesValue a) => a -> App String asString let cookie :: String cookie = Maybe String -> String forall a. HasCallStack => Maybe a -> a fromJust (Maybe String -> String) -> Maybe String -> String forall a b. (a -> b) -> a -> b $ String -> Response -> Maybe String getCookie String "zuid" Response resp (String, String) -> App (String, String) forall a. a -> App a forall (f :: * -> *) a. Applicative f => a -> f a pure (String "zuid=" String -> String -> String forall a. Semigroup a => a -> a -> a <> String cookie, String token) String username2 <- App String randomName App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a bindResponse (Value -> String -> String -> String -> App Response forall user. (HasCallStack, MakesValue user) => user -> String -> String -> String -> App Response putSelfEmail Value validUser String cookie String token (String username2 String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String blockedDomain)) ((Response -> App ()) -> App ()) -> (Response -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 451 Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "label" App Value -> String -> App () forall a b. (MakesValue a, MakesValue b, HasCallStack) => a -> b -> App () `shouldMatch` String "domain-blocked-for-registration" Value -> String -> String -> String -> App Response forall user. (HasCallStack, MakesValue user) => user -> String -> String -> String -> App Response putSelfEmail Value validUser String cookie String token (String username2 String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain) App Response -> (Response -> App ()) -> App () forall a b. App a -> (a -> App b) -> App b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= HasCallStack => Response -> App () Response -> App () assertSuccess testCannotChangeTeamMemberEmailWithBlockedDomain :: (HasCallStack) => App () testCannotChangeTeamMemberEmailWithBlockedDomain :: HasCallStack => App () testCannotChangeTeamMemberEmailWithBlockedDomain = do let blockedDomain :: String blockedDomain = String "blocked.example.com" validDomain :: String validDomain = String "valid.example.com" ServiceOverrides -> (HasCallStack => String -> App ()) -> App () forall a. HasCallStack => ServiceOverrides -> (HasCallStack => String -> App a) -> App a withModifiedBackend ServiceOverrides forall a. Default a => a def { brigCfg = setField "optSettings.setCustomerExtensions.domainsBlockedForRegistration" (array [fromString blockedDomain]) } ((HasCallStack => String -> App ()) -> App ()) -> (HasCallStack => String -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \String domain -> do (Value owner, String _team, [Value mem1]) <- String -> Int -> App (Value, String, [Value]) forall domain. (HasCallStack, MakesValue domain) => domain -> Int -> App (Value, String, [Value]) createTeam String domain Int 2 String username <- App String randomName App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a bindResponse (Value -> Value -> String -> App Response forall caller target. (HasCallStack, MakesValue caller, MakesValue target) => caller -> target -> String -> App Response putUserEmail Value owner Value mem1 (String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String blockedDomain)) ((Response -> App ()) -> App ()) -> (Response -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 451 Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "label" App Value -> String -> App () forall a b. (MakesValue a, MakesValue b, HasCallStack) => a -> b -> App () `shouldMatch` String "domain-blocked-for-registration" Value -> Value -> String -> App Response forall caller target. (HasCallStack, MakesValue caller, MakesValue target) => caller -> target -> String -> App Response putUserEmail Value owner Value mem1 (String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain) App Response -> (Response -> App ()) -> App () forall a b. App a -> (a -> App b) -> App b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= HasCallStack => Response -> App () Response -> App () assertSuccess String ownerUsername <- App String randomName App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a bindResponse (Value -> Value -> String -> App Response forall caller target. (HasCallStack, MakesValue caller, MakesValue target) => caller -> target -> String -> App Response putUserEmail Value owner Value owner (String ownerUsername String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String blockedDomain)) ((Response -> App ()) -> App ()) -> (Response -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 451 Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "label" App Value -> String -> App () forall a b. (MakesValue a, MakesValue b, HasCallStack) => a -> b -> App () `shouldMatch` String "domain-blocked-for-registration" Value -> Value -> String -> App Response forall caller target. (HasCallStack, MakesValue caller, MakesValue target) => caller -> target -> String -> App Response putUserEmail Value owner Value owner (String ownerUsername String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain) App Response -> (Response -> App ()) -> App () forall a b. App a -> (a -> App b) -> App b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= HasCallStack => Response -> App () Response -> App () assertSuccess testCannotCreateTeamInvitationWithBlockedDomain :: (HasCallStack) => App () testCannotCreateTeamInvitationWithBlockedDomain :: HasCallStack => App () testCannotCreateTeamInvitationWithBlockedDomain = do let blockedDomain :: String blockedDomain = String "blocked.example.com" validDomain :: String validDomain = String "valid.example.com" ServiceOverrides -> (HasCallStack => String -> App ()) -> App () forall a. HasCallStack => ServiceOverrides -> (HasCallStack => String -> App a) -> App a withModifiedBackend ServiceOverrides forall a. Default a => a def { brigCfg = setField "optSettings.setCustomerExtensions.domainsBlockedForRegistration" (array [fromString blockedDomain]) } ((HasCallStack => String -> App ()) -> App ()) -> (HasCallStack => String -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \String domain -> do (Value owner, String _team, []) <- String -> Int -> App (Value, String, [Value]) forall domain. (HasCallStack, MakesValue domain) => domain -> Int -> App (Value, String, [Value]) createTeam String domain Int 1 String username <- App String randomName App Response -> (Response -> App ()) -> App () forall a. HasCallStack => App Response -> (Response -> App a) -> App a bindResponse (Value -> PostInvitation -> App Response forall user. (HasCallStack, MakesValue user) => user -> PostInvitation -> App Response postInvitation Value owner (Maybe String -> Maybe String -> PostInvitation PostInvitation (String -> Maybe String forall a. a -> Maybe a Just (String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String blockedDomain)) Maybe String forall a. Maybe a Nothing)) ((Response -> App ()) -> App ()) -> (Response -> App ()) -> App () forall a b. (a -> b) -> a -> b $ \Response resp -> do Response resp.status Int -> Int -> App () forall a. (MakesValue a, HasCallStack) => a -> Int -> App () `shouldMatchInt` Int 451 Response resp.json App Value -> String -> App Value forall a. (HasCallStack, MakesValue a) => a -> String -> App Value %. String "label" App Value -> String -> App () forall a b. (MakesValue a, MakesValue b, HasCallStack) => a -> b -> App () `shouldMatch` String "domain-blocked-for-registration" App Value -> App () forall (f :: * -> *) a. Functor f => f a -> f () void (App Value -> App ()) -> App Value -> App () forall a b. (a -> b) -> a -> b $ Value -> PostInvitation -> App Response forall user. (HasCallStack, MakesValue user) => user -> PostInvitation -> App Response postInvitation Value owner (Maybe String -> Maybe String -> PostInvitation PostInvitation (String -> Maybe String forall a. a -> Maybe a Just (String username String -> String -> String forall a. Semigroup a => a -> a -> a <> String "@" String -> String -> String forall a. Semigroup a => a -> a -> a <> String validDomain)) Maybe String forall a. Maybe a Nothing) App Response -> (Response -> App Value) -> App Value forall a b. App a -> (a -> App b) -> App b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= HasCallStack => Int -> Response -> App Value Int -> Response -> App Value getJSON Int 201