diff --git a/cabal.project b/cabal.project index f35b3b95050..5129a466f03 100644 --- a/cabal.project +++ b/cabal.project @@ -51,7 +51,6 @@ packages: , tools/db/migrate-features/ , tools/db/mls-users/ , tools/db/move-team/ - , tools/db/phone-users/ , tools/db/repair-handles/ , tools/db/team-info/ , tools/db/repair-brig-clients-table/ diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs index 80ae80db1b4..2cf35367378 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs @@ -492,32 +492,6 @@ type SelfAPI = :> ReqBody '[JSON] UserUpdate :> MultiVerb1 'PUT '[JSON] (RespondEmpty 200 "User updated") ) - :<|> Named - "change-phone" - ( Summary "Change your phone number." - :> Until 'V6 - :> ZUser - :> ZConn - :> "self" - :> "phone" - :> ReqBody '[JSON] PhoneUpdate - :> MultiVerb 'PUT '[JSON] ChangePhoneResponses (Maybe ChangePhoneError) - ) - :<|> - -- This endpoint can lead to the following events being sent: - -- - UserIdentityRemoved event to self - Named - "remove-phone" - ( Summary "Remove your phone number." - :> Until 'V6 - :> Description - "Your phone number can only be removed if you also have an \ - \email address and a password." - :> ZUser - :> "self" - :> "phone" - :> MultiVerb 'DELETE '[JSON] RemoveIdentityResponses (Maybe RemoveIdentityError) - ) :<|> -- This endpoint can lead to the following events being sent: -- - UserIdentityRemoved event to self @@ -1767,26 +1741,6 @@ type AuthAPI = :> CanThrow 'BadCredentials :> MultiVerb1 'POST '[JSON] TokenResponse ) - :<|> Named - "send-login-code" - ( "login" - :> "send" - :> Until 'V6 - :> Summary "Send a login code to a verified phone number" - :> Description - "This operation generates and sends a login code via sms for phone login.\ - \ A login code can be used only once and times out after\ - \ 10 minutes. Only one login code may be pending at a time.\ - \ For 2nd factor authentication login with email and password, use the\ - \ `/verification-code/send` endpoint." - :> ReqBody '[JSON] SendLoginCode - :> CanThrow 'InvalidPhone - :> CanThrow 'PasswordExists - :> MultiVerb1 - 'POST - '[JSON] - (Respond 200 "OK" LoginCodeTimeout) - ) :<|> Named "login" ( "login" diff --git a/libs/wire-api/src/Wire/API/User.hs b/libs/wire-api/src/Wire/API/User.hs index defa322a590..6aaedc66157 100644 --- a/libs/wire-api/src/Wire/API/User.hs +++ b/libs/wire-api/src/Wire/API/User.hs @@ -87,9 +87,6 @@ module Wire.API.User ChangePasswordResponses, LocaleUpdate (..), EmailUpdate (..), - PhoneUpdate (..), - ChangePhoneError (..), - ChangePhoneResponses, RemoveIdentityError (..), RemoveIdentityResponses, HandleUpdate (..), @@ -1557,38 +1554,6 @@ instance ToByteString EmailActivation where builder SendActivationEmail = "send_activation_email" builder AutoActivate = "auto_activate" -newtype PhoneUpdate = PhoneUpdate {puPhone :: Phone} - deriving stock (Eq, Show, Generic) - deriving newtype (Arbitrary) - deriving (ToJSON, FromJSON, S.ToSchema) via Schema PhoneUpdate - -instance ToSchema PhoneUpdate where - schema = - object "PhoneUpdate" $ - PhoneUpdate - <$> puPhone - .= field "phone" schema - -data ChangePhoneError - = PhoneExists - | InvalidNewPhone - deriving (Generic) - deriving (AsUnion ChangePhoneErrorResponses) via GenericAsUnion ChangePhoneErrorResponses ChangePhoneError - -instance GSOP.Generic ChangePhoneError - -type ChangePhoneErrorResponses = - [ ErrorResponse 'UserKeyExists, - ErrorResponse 'InvalidPhone - ] - -type ChangePhoneResponses = - ChangePhoneErrorResponses .++ '[RespondEmpty 202 "Phone updated"] - -instance (res ~ ChangePhoneResponses) => AsUnion res (Maybe ChangePhoneError) where - toUnion = maybeToUnion (toUnion @ChangePhoneErrorResponses) - fromUnion = maybeFromUnion (fromUnion @ChangePhoneErrorResponses) - data RemoveIdentityError = LastIdentity | NoIdentity diff --git a/libs/wire-api/src/Wire/API/User/Auth.hs b/libs/wire-api/src/Wire/API/User/Auth.hs index 3a029c47500..2202d1debc2 100644 --- a/libs/wire-api/src/Wire/API/User/Auth.hs +++ b/libs/wire-api/src/Wire/API/User/Auth.hs @@ -24,7 +24,6 @@ module Wire.API.User.Auth LoginCode (..), LoginId (..), PendingLoginCode (..), - SendLoginCode (..), LoginCodeTimeout (..), -- * Cookies @@ -86,7 +85,7 @@ import Imports import Servant import Web.Cookie import Wire.API.Routes.MultiVerb -import Wire.API.User.Identity (EmailAddress, Phone) +import Wire.API.User.Identity (EmailAddress) import Wire.Arbitrary (Arbitrary (arbitrary), GenericUniform (..)) -------------------------------------------------------------------------------- @@ -154,40 +153,6 @@ instance ToSchema PendingLoginCode where <$> pendingLoginCode .= field "code" schema <*> pendingLoginTimeout .= field "expires_in" schema --------------------------------------------------------------------------------- --- SendLoginCode - --- | A request for sending a 'LoginCode' -data SendLoginCode = SendLoginCode - { lcPhone :: Phone, - lcCall :: Bool, - lcForce :: Bool - } - deriving stock (Eq, Show, Generic) - deriving (Arbitrary) via (GenericUniform SendLoginCode) - deriving (FromJSON, ToJSON, S.ToSchema) via Schema SendLoginCode - -instance ToSchema SendLoginCode where - schema = - objectWithDocModifier - "SendLoginCode" - (description ?~ "Payload for requesting a login code to be sent") - $ SendLoginCode - <$> lcPhone - .= fieldWithDocModifier - "phone" - (description ?~ "E.164 phone number to send the code to") - (unnamed schema) - <*> lcCall - .= fmap - (fromMaybe False) - ( optFieldWithDocModifier - "voice_call" - (description ?~ "Request the code with a call instead (default is SMS)") - schema - ) - <*> lcForce .= fmap (fromMaybe True) (optField "force" schema) - -------------------------------------------------------------------------------- -- LoginCodeTimeout diff --git a/libs/wire-api/src/Wire/API/User/Identity.hs b/libs/wire-api/src/Wire/API/User/Identity.hs index 97a3c503e59..63609b92347 100644 --- a/libs/wire-api/src/Wire/API/User/Identity.hs +++ b/libs/wire-api/src/Wire/API/User/Identity.hs @@ -47,14 +47,19 @@ module Wire.API.User.Identity where import Cassandra qualified as C +import Control.Applicative (optional) import Control.Error (hush) -import Control.Lens (dimap, (.~), (?~)) +import Control.Lens (dimap, over, (.~), (?~)) import Data.Aeson (FromJSON (..), ToJSON (..)) import Data.Aeson qualified as A import Data.Aeson.Types qualified as A +import Data.Attoparsec.Text import Data.ByteString (fromStrict, toStrict) +import Data.ByteString.Conversion import Data.ByteString.UTF8 qualified as UTF8 +import Data.OpenApi (ToParamSchema (..)) import Data.OpenApi qualified as S +import Data.Proxy (Proxy (Proxy)) import Data.Schema import Data.Text qualified as Text import Data.Text.Encoding @@ -66,15 +71,69 @@ import SAML2.WebSSO.Test.Arbitrary () import SAML2.WebSSO.Types qualified as SAML import SAML2.WebSSO.XML qualified as SAML import Servant +import Servant.API qualified as S import System.FilePath (()) +import Test.QuickCheck qualified as QC import Text.Email.Parser import URI.ByteString qualified as URI import URI.ByteString.QQ (uri) import Web.Scim.Schema.User.Email () import Wire.API.User.EmailAddress -import Wire.API.User.Phone import Wire.API.User.Profile (fromName, mkName) -import Wire.Arbitrary (Arbitrary, GenericUniform (..)) +import Wire.Arbitrary (Arbitrary (arbitrary), GenericUniform (..)) + +-------------------------------------------------------------------------------- +-- Phone (minimal definition for backward compatibility) + +-- | Phone number in E.164 format. This type is kept for backward compatibility +-- in API schemas and data structures, but phone-based functionality has been removed. +newtype Phone = Phone {fromPhone :: Text} + deriving stock (Eq, Ord, Show, Generic) + deriving (ToJSON, FromJSON, S.ToSchema) via (Schema Phone) + +instance ToParamSchema Phone where + toParamSchema _ = toParamSchema (Proxy @Text) + +instance ToSchema Phone where + schema = + over doc (S.description ?~ "E.164 phone number") $ + fromPhone + .= parsedText "PhoneNumber" (maybe (Left "Invalid phone number. Expected E.164 format.") Right . parsePhone) + +instance ToByteString Phone where + builder = builder . fromPhone + +instance FromByteString Phone where + parser = parser >>= maybe (fail "Invalid phone") pure . parsePhone + +instance S.FromHttpApiData Phone where + parseUrlPiece = maybe (Left "Invalid phone") Right . fromByteString . encodeUtf8 + +instance S.ToHttpApiData Phone where + toUrlPiece = decodeUtf8With lenientDecode . toByteString' + +instance Arbitrary Phone where + arbitrary = + Phone . Text.pack <$> do + let mkdigits n = replicateM n (QC.elements ['0' .. '9']) + mini <- mkdigits 8 + maxi <- mkdigits =<< QC.chooseInt (0, 7) + pure $ '+' : mini <> maxi + +deriving instance C.Cql Phone + +-- | Parses a phone number in E.164 format with a mandatory leading '+'. +parsePhone :: Text -> Maybe Phone +parsePhone p + | isValidPhone p = Just $! Phone p + | otherwise = Nothing + +-- | Checks whether a phone number is valid, i.e. it is in E.164 format +-- with a mandatory leading '+' followed by 10-15 digits. +isValidPhone :: Text -> Bool +isValidPhone = either (const False) (const True) . parseOnly e164 + where + e164 = char '+' *> count 8 digit *> count 7 (optional digit) *> endOfInput -------------------------------------------------------------------------------- -- UserIdentity diff --git a/libs/wire-api/src/Wire/API/User/Password.hs b/libs/wire-api/src/Wire/API/User/Password.hs index 33ad254da73..75e8542409a 100644 --- a/libs/wire-api/src/Wire/API/User/Password.hs +++ b/libs/wire-api/src/Wire/API/User/Password.hs @@ -52,7 +52,7 @@ import Data.Tuple.Extra import Imports import Servant (FromHttpApiData (..)) import Wire.API.User.EmailAddress -import Wire.API.User.Phone +import Wire.API.User.Identity (Phone) import Wire.Arbitrary (Arbitrary, GenericUniform (..)) -------------------------------------------------------------------------------- diff --git a/libs/wire-api/src/Wire/API/User/Phone.hs b/libs/wire-api/src/Wire/API/User/Phone.hs deleted file mode 100644 index 5648e326329..00000000000 --- a/libs/wire-api/src/Wire/API/User/Phone.hs +++ /dev/null @@ -1,94 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2025 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module Wire.API.User.Phone - ( Phone (..), - parsePhone, - isValidPhone, - ) -where - -import Cassandra qualified as C -import Control.Applicative (optional) -import Control.Lens (over, (?~)) -import Data.Aeson (FromJSON (..), ToJSON (..)) -import Data.Attoparsec.Text -import Data.ByteString.Conversion -import Data.OpenApi (ToParamSchema (..)) -import Data.OpenApi qualified as S -import Data.Schema -import Data.Text qualified as Text -import Data.Text.Encoding -import Data.Text.Encoding.Error -import Imports -import SAML2.WebSSO.Test.Arbitrary () -import Servant -import Servant.API qualified as S -import Test.QuickCheck qualified as QC -import Web.Scim.Schema.User.Email () -import Wire.Arbitrary (Arbitrary (arbitrary)) - --------------------------------------------------------------------------------- --- Phone - -newtype Phone = Phone {fromPhone :: Text} - deriving stock (Eq, Ord, Show, Generic) - deriving (ToJSON, FromJSON, S.ToSchema) via (Schema Phone) - -instance ToParamSchema Phone where - toParamSchema _ = toParamSchema (Proxy @Text) - -instance ToSchema Phone where - schema = - over doc (S.description ?~ "E.164 phone number") $ - fromPhone - .= parsedText "PhoneNumber" (maybe (Left "Invalid phone number. Expected E.164 format.") Right . parsePhone) - -instance ToByteString Phone where - builder = builder . fromPhone - -instance FromByteString Phone where - parser = parser >>= maybe (fail "Invalid phone") pure . parsePhone - -instance S.FromHttpApiData Phone where - parseUrlPiece = maybe (Left "Invalid phone") Right . fromByteString . encodeUtf8 - -instance S.ToHttpApiData Phone where - toUrlPiece = decodeUtf8With lenientDecode . toByteString' - -instance Arbitrary Phone where - arbitrary = - Phone . Text.pack <$> do - let mkdigits n = replicateM n (QC.elements ['0' .. '9']) - mini <- mkdigits 8 - maxi <- mkdigits =<< QC.chooseInt (0, 7) - pure $ '+' : mini <> maxi - -deriving instance C.Cql Phone - --- | Parses a phone number in E.164 format with a mandatory leading '+'. -parsePhone :: Text -> Maybe Phone -parsePhone p - | isValidPhone p = Just $! Phone p - | otherwise = Nothing - --- | Checks whether a phone number is valid, i.e. it is in E.164 format --- with a mandatory leading '+' followed by 10-15 digits. -isValidPhone :: Text -> Bool -isValidPhone = either (const False) (const True) . parseOnly e164 - where - e164 = char '+' *> count 8 digit *> count 7 (optional digit) *> endOfInput diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs index 02dc1d21e43..a05027f4afc 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs @@ -140,7 +140,6 @@ import Test.Wire.API.Golden.Generated.PasswordResetKey_user qualified import Test.Wire.API.Golden.Generated.PasswordReset_provider qualified import Test.Wire.API.Golden.Generated.PendingLoginCode_user qualified import Test.Wire.API.Golden.Generated.Permissions_team qualified -import Test.Wire.API.Golden.Generated.PhoneUpdate_user qualified import Test.Wire.API.Golden.Generated.Phone_user qualified import Test.Wire.API.Golden.Generated.Pict_user qualified import Test.Wire.API.Golden.Generated.PrekeyBundle_user qualified @@ -178,7 +177,6 @@ import Test.Wire.API.Golden.Generated.Scheme_user qualified import Test.Wire.API.Golden.Generated.SearchResult_20Contact_user qualified import Test.Wire.API.Golden.Generated.SearchResult_20TeamContact_user qualified import Test.Wire.API.Golden.Generated.SelfProfile_user qualified -import Test.Wire.API.Golden.Generated.SendLoginCode_user qualified import Test.Wire.API.Golden.Generated.ServiceKeyPEM_provider qualified import Test.Wire.API.Golden.Generated.ServiceKeyType_provider qualified import Test.Wire.API.Golden.Generated.ServiceKey_provider qualified @@ -969,8 +967,6 @@ tests = testObjects [(Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_1, "testObject_LocaleUpdate_user_1.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_2, "testObject_LocaleUpdate_user_2.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_3, "testObject_LocaleUpdate_user_3.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_4, "testObject_LocaleUpdate_user_4.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_5, "testObject_LocaleUpdate_user_5.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_6, "testObject_LocaleUpdate_user_6.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_7, "testObject_LocaleUpdate_user_7.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_8, "testObject_LocaleUpdate_user_8.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_9, "testObject_LocaleUpdate_user_9.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_10, "testObject_LocaleUpdate_user_10.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_11, "testObject_LocaleUpdate_user_11.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_12, "testObject_LocaleUpdate_user_12.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_13, "testObject_LocaleUpdate_user_13.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_14, "testObject_LocaleUpdate_user_14.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_15, "testObject_LocaleUpdate_user_15.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_16, "testObject_LocaleUpdate_user_16.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_17, "testObject_LocaleUpdate_user_17.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_18, "testObject_LocaleUpdate_user_18.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_19, "testObject_LocaleUpdate_user_19.json"), (Test.Wire.API.Golden.Generated.LocaleUpdate_user.testObject_LocaleUpdate_user_20, "testObject_LocaleUpdate_user_20.json")], testGroup "Golden: EmailUpdate_user" $ testObjects [(Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_1, "testObject_EmailUpdate_user_1.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_2, "testObject_EmailUpdate_user_2.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_3, "testObject_EmailUpdate_user_3.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_4, "testObject_EmailUpdate_user_4.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_5, "testObject_EmailUpdate_user_5.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_6, "testObject_EmailUpdate_user_6.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_7, "testObject_EmailUpdate_user_7.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_8, "testObject_EmailUpdate_user_8.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_9, "testObject_EmailUpdate_user_9.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_10, "testObject_EmailUpdate_user_10.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_11, "testObject_EmailUpdate_user_11.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_12, "testObject_EmailUpdate_user_12.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_13, "testObject_EmailUpdate_user_13.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_14, "testObject_EmailUpdate_user_14.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_15, "testObject_EmailUpdate_user_15.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_16, "testObject_EmailUpdate_user_16.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_17, "testObject_EmailUpdate_user_17.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_18, "testObject_EmailUpdate_user_18.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_19, "testObject_EmailUpdate_user_19.json"), (Test.Wire.API.Golden.Generated.EmailUpdate_user.testObject_EmailUpdate_user_20, "testObject_EmailUpdate_user_20.json")], - testGroup "Golden: PhoneUpdate_user" $ - testObjects [(Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_1, "testObject_PhoneUpdate_user_1.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_2, "testObject_PhoneUpdate_user_2.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_3, "testObject_PhoneUpdate_user_3.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_4, "testObject_PhoneUpdate_user_4.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_5, "testObject_PhoneUpdate_user_5.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_6, "testObject_PhoneUpdate_user_6.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_7, "testObject_PhoneUpdate_user_7.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_8, "testObject_PhoneUpdate_user_8.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_9, "testObject_PhoneUpdate_user_9.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_10, "testObject_PhoneUpdate_user_10.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_11, "testObject_PhoneUpdate_user_11.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_12, "testObject_PhoneUpdate_user_12.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_13, "testObject_PhoneUpdate_user_13.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_14, "testObject_PhoneUpdate_user_14.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_15, "testObject_PhoneUpdate_user_15.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_16, "testObject_PhoneUpdate_user_16.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_17, "testObject_PhoneUpdate_user_17.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_18, "testObject_PhoneUpdate_user_18.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_19, "testObject_PhoneUpdate_user_19.json"), (Test.Wire.API.Golden.Generated.PhoneUpdate_user.testObject_PhoneUpdate_user_20, "testObject_PhoneUpdate_user_20.json")], testGroup "Golden: HandleUpdate_user" $ testObjects [(Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_1, "testObject_HandleUpdate_user_1.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_2, "testObject_HandleUpdate_user_2.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_3, "testObject_HandleUpdate_user_3.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_4, "testObject_HandleUpdate_user_4.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_5, "testObject_HandleUpdate_user_5.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_6, "testObject_HandleUpdate_user_6.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_7, "testObject_HandleUpdate_user_7.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_8, "testObject_HandleUpdate_user_8.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_9, "testObject_HandleUpdate_user_9.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_10, "testObject_HandleUpdate_user_10.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_11, "testObject_HandleUpdate_user_11.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_12, "testObject_HandleUpdate_user_12.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_13, "testObject_HandleUpdate_user_13.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_14, "testObject_HandleUpdate_user_14.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_15, "testObject_HandleUpdate_user_15.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_16, "testObject_HandleUpdate_user_16.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_17, "testObject_HandleUpdate_user_17.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_18, "testObject_HandleUpdate_user_18.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_19, "testObject_HandleUpdate_user_19.json"), (Test.Wire.API.Golden.Generated.HandleUpdate_user.testObject_HandleUpdate_user_20, "testObject_HandleUpdate_user_20.json")], testGroup "Golden: DeleteUser_user" $ @@ -989,8 +985,6 @@ tests = testObjects [(Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_1, "testObject_LoginCode_user_1.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_2, "testObject_LoginCode_user_2.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_3, "testObject_LoginCode_user_3.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_4, "testObject_LoginCode_user_4.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_5, "testObject_LoginCode_user_5.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_6, "testObject_LoginCode_user_6.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_7, "testObject_LoginCode_user_7.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_8, "testObject_LoginCode_user_8.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_9, "testObject_LoginCode_user_9.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_10, "testObject_LoginCode_user_10.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_11, "testObject_LoginCode_user_11.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_12, "testObject_LoginCode_user_12.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_13, "testObject_LoginCode_user_13.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_14, "testObject_LoginCode_user_14.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_15, "testObject_LoginCode_user_15.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_16, "testObject_LoginCode_user_16.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_17, "testObject_LoginCode_user_17.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_18, "testObject_LoginCode_user_18.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_19, "testObject_LoginCode_user_19.json"), (Test.Wire.API.Golden.Generated.LoginCode_user.testObject_LoginCode_user_20, "testObject_LoginCode_user_20.json")], testGroup "Golden: PendingLoginCode_user" $ testObjects [(Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_1, "testObject_PendingLoginCode_user_1.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_2, "testObject_PendingLoginCode_user_2.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_3, "testObject_PendingLoginCode_user_3.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_4, "testObject_PendingLoginCode_user_4.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_5, "testObject_PendingLoginCode_user_5.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_6, "testObject_PendingLoginCode_user_6.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_7, "testObject_PendingLoginCode_user_7.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_8, "testObject_PendingLoginCode_user_8.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_9, "testObject_PendingLoginCode_user_9.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_10, "testObject_PendingLoginCode_user_10.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_11, "testObject_PendingLoginCode_user_11.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_12, "testObject_PendingLoginCode_user_12.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_13, "testObject_PendingLoginCode_user_13.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_14, "testObject_PendingLoginCode_user_14.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_15, "testObject_PendingLoginCode_user_15.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_16, "testObject_PendingLoginCode_user_16.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_17, "testObject_PendingLoginCode_user_17.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_18, "testObject_PendingLoginCode_user_18.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_19, "testObject_PendingLoginCode_user_19.json"), (Test.Wire.API.Golden.Generated.PendingLoginCode_user.testObject_PendingLoginCode_user_20, "testObject_PendingLoginCode_user_20.json")], - testGroup "Golden: SendLoginCode_user" $ - testObjects [(Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_1, "testObject_SendLoginCode_user_1.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_2, "testObject_SendLoginCode_user_2.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_3, "testObject_SendLoginCode_user_3.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_4, "testObject_SendLoginCode_user_4.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_5, "testObject_SendLoginCode_user_5.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_6, "testObject_SendLoginCode_user_6.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_7, "testObject_SendLoginCode_user_7.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_8, "testObject_SendLoginCode_user_8.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_9, "testObject_SendLoginCode_user_9.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_10, "testObject_SendLoginCode_user_10.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_11, "testObject_SendLoginCode_user_11.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_12, "testObject_SendLoginCode_user_12.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_13, "testObject_SendLoginCode_user_13.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_14, "testObject_SendLoginCode_user_14.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_15, "testObject_SendLoginCode_user_15.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_16, "testObject_SendLoginCode_user_16.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_17, "testObject_SendLoginCode_user_17.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_18, "testObject_SendLoginCode_user_18.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_19, "testObject_SendLoginCode_user_19.json"), (Test.Wire.API.Golden.Generated.SendLoginCode_user.testObject_SendLoginCode_user_20, "testObject_SendLoginCode_user_20.json")], testGroup "Golden: LoginCodeTimeout_user" $ testObjects [(Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_1, "testObject_LoginCodeTimeout_user_1.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_2, "testObject_LoginCodeTimeout_user_2.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_3, "testObject_LoginCodeTimeout_user_3.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_4, "testObject_LoginCodeTimeout_user_4.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_5, "testObject_LoginCodeTimeout_user_5.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_6, "testObject_LoginCodeTimeout_user_6.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_7, "testObject_LoginCodeTimeout_user_7.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_8, "testObject_LoginCodeTimeout_user_8.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_9, "testObject_LoginCodeTimeout_user_9.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_10, "testObject_LoginCodeTimeout_user_10.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_11, "testObject_LoginCodeTimeout_user_11.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_12, "testObject_LoginCodeTimeout_user_12.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_13, "testObject_LoginCodeTimeout_user_13.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_14, "testObject_LoginCodeTimeout_user_14.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_15, "testObject_LoginCodeTimeout_user_15.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_16, "testObject_LoginCodeTimeout_user_16.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_17, "testObject_LoginCodeTimeout_user_17.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_18, "testObject_LoginCodeTimeout_user_18.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_19, "testObject_LoginCodeTimeout_user_19.json"), (Test.Wire.API.Golden.Generated.LoginCodeTimeout_user.testObject_LoginCodeTimeout_user_20, "testObject_LoginCodeTimeout_user_20.json")], testGroup "Golden: CookieLabel_user" $ diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/PhoneUpdate_user.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/PhoneUpdate_user.hs deleted file mode 100644 index d0cf97e9ab8..00000000000 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/PhoneUpdate_user.hs +++ /dev/null @@ -1,80 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2022 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module Test.Wire.API.Golden.Generated.PhoneUpdate_user where - -import Wire.API.User (Phone (Phone, fromPhone), PhoneUpdate (..)) - -testObject_PhoneUpdate_user_1 :: PhoneUpdate -testObject_PhoneUpdate_user_1 = PhoneUpdate {puPhone = Phone {fromPhone = "+059566184168"}} - -testObject_PhoneUpdate_user_2 :: PhoneUpdate -testObject_PhoneUpdate_user_2 = PhoneUpdate {puPhone = Phone {fromPhone = "+030094397"}} - -testObject_PhoneUpdate_user_3 :: PhoneUpdate -testObject_PhoneUpdate_user_3 = PhoneUpdate {puPhone = Phone {fromPhone = "+39788099045"}} - -testObject_PhoneUpdate_user_4 :: PhoneUpdate -testObject_PhoneUpdate_user_4 = PhoneUpdate {puPhone = Phone {fromPhone = "+6060447691"}} - -testObject_PhoneUpdate_user_5 :: PhoneUpdate -testObject_PhoneUpdate_user_5 = PhoneUpdate {puPhone = Phone {fromPhone = "+27199438794"}} - -testObject_PhoneUpdate_user_6 :: PhoneUpdate -testObject_PhoneUpdate_user_6 = PhoneUpdate {puPhone = Phone {fromPhone = "+403076793307922"}} - -testObject_PhoneUpdate_user_7 :: PhoneUpdate -testObject_PhoneUpdate_user_7 = PhoneUpdate {puPhone = Phone {fromPhone = "+58949773"}} - -testObject_PhoneUpdate_user_8 :: PhoneUpdate -testObject_PhoneUpdate_user_8 = PhoneUpdate {puPhone = Phone {fromPhone = "+5689710422639"}} - -testObject_PhoneUpdate_user_9 :: PhoneUpdate -testObject_PhoneUpdate_user_9 = PhoneUpdate {puPhone = Phone {fromPhone = "+60751390"}} - -testObject_PhoneUpdate_user_10 :: PhoneUpdate -testObject_PhoneUpdate_user_10 = PhoneUpdate {puPhone = Phone {fromPhone = "+431000511612"}} - -testObject_PhoneUpdate_user_11 :: PhoneUpdate -testObject_PhoneUpdate_user_11 = PhoneUpdate {puPhone = Phone {fromPhone = "+1939668594372"}} - -testObject_PhoneUpdate_user_12 :: PhoneUpdate -testObject_PhoneUpdate_user_12 = PhoneUpdate {puPhone = Phone {fromPhone = "+156939434"}} - -testObject_PhoneUpdate_user_13 :: PhoneUpdate -testObject_PhoneUpdate_user_13 = PhoneUpdate {puPhone = Phone {fromPhone = "+54660214"}} - -testObject_PhoneUpdate_user_14 :: PhoneUpdate -testObject_PhoneUpdate_user_14 = PhoneUpdate {puPhone = Phone {fromPhone = "+17373888509447"}} - -testObject_PhoneUpdate_user_15 :: PhoneUpdate -testObject_PhoneUpdate_user_15 = PhoneUpdate {puPhone = Phone {fromPhone = "+817869255119807"}} - -testObject_PhoneUpdate_user_16 :: PhoneUpdate -testObject_PhoneUpdate_user_16 = PhoneUpdate {puPhone = Phone {fromPhone = "+541926748"}} - -testObject_PhoneUpdate_user_17 :: PhoneUpdate -testObject_PhoneUpdate_user_17 = PhoneUpdate {puPhone = Phone {fromPhone = "+7836584019595"}} - -testObject_PhoneUpdate_user_18 :: PhoneUpdate -testObject_PhoneUpdate_user_18 = PhoneUpdate {puPhone = Phone {fromPhone = "+3488257402473"}} - -testObject_PhoneUpdate_user_19 :: PhoneUpdate -testObject_PhoneUpdate_user_19 = PhoneUpdate {puPhone = Phone {fromPhone = "+1413522786322"}} - -testObject_PhoneUpdate_user_20 :: PhoneUpdate -testObject_PhoneUpdate_user_20 = PhoneUpdate {puPhone = Phone {fromPhone = "+64700149027"}} diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/SendLoginCode_user.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/SendLoginCode_user.hs deleted file mode 100644 index ba2d75d38a9..00000000000 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/SendLoginCode_user.hs +++ /dev/null @@ -1,102 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2022 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module Test.Wire.API.Golden.Generated.SendLoginCode_user where - -import Imports (Bool (False, True)) -import Wire.API.User (Phone (Phone, fromPhone)) -import Wire.API.User.Auth (SendLoginCode (..)) - -testObject_SendLoginCode_user_1 :: SendLoginCode -testObject_SendLoginCode_user_1 = - SendLoginCode {lcPhone = Phone {fromPhone = "+7852237164"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_2 :: SendLoginCode -testObject_SendLoginCode_user_2 = - SendLoginCode {lcPhone = Phone {fromPhone = "+1361303129"}, lcCall = False, lcForce = True} - -testObject_SendLoginCode_user_3 :: SendLoginCode -testObject_SendLoginCode_user_3 = - SendLoginCode {lcPhone = Phone {fromPhone = "+0278364030"}, lcCall = False, lcForce = False} - -testObject_SendLoginCode_user_4 :: SendLoginCode -testObject_SendLoginCode_user_4 = - SendLoginCode {lcPhone = Phone {fromPhone = "+7017081269"}, lcCall = True, lcForce = True} - -testObject_SendLoginCode_user_5 :: SendLoginCode -testObject_SendLoginCode_user_5 = - SendLoginCode {lcPhone = Phone {fromPhone = "+7210550349"}, lcCall = True, lcForce = True} - -testObject_SendLoginCode_user_6 :: SendLoginCode -testObject_SendLoginCode_user_6 = - SendLoginCode {lcPhone = Phone {fromPhone = "+57561912568"}, lcCall = True, lcForce = True} - -testObject_SendLoginCode_user_7 :: SendLoginCode -testObject_SendLoginCode_user_7 = - SendLoginCode {lcPhone = Phone {fromPhone = "+0478831396"}, lcCall = False, lcForce = True} - -testObject_SendLoginCode_user_8 :: SendLoginCode -testObject_SendLoginCode_user_8 = - SendLoginCode {lcPhone = Phone {fromPhone = "+731463104296"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_9 :: SendLoginCode -testObject_SendLoginCode_user_9 = - SendLoginCode {lcPhone = Phone {fromPhone = "+95425609807"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_10 :: SendLoginCode -testObject_SendLoginCode_user_10 = - SendLoginCode {lcPhone = Phone {fromPhone = "+43915096382846"}, lcCall = False, lcForce = False} - -testObject_SendLoginCode_user_11 :: SendLoginCode -testObject_SendLoginCode_user_11 = - SendLoginCode {lcPhone = Phone {fromPhone = "+08251498"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_12 :: SendLoginCode -testObject_SendLoginCode_user_12 = - SendLoginCode {lcPhone = Phone {fromPhone = "+8151944856397"}, lcCall = False, lcForce = True} - -testObject_SendLoginCode_user_13 :: SendLoginCode -testObject_SendLoginCode_user_13 = - SendLoginCode {lcPhone = Phone {fromPhone = "+40692963"}, lcCall = False, lcForce = True} - -testObject_SendLoginCode_user_14 :: SendLoginCode -testObject_SendLoginCode_user_14 = - SendLoginCode {lcPhone = Phone {fromPhone = "+661842350866268"}, lcCall = True, lcForce = True} - -testObject_SendLoginCode_user_15 :: SendLoginCode -testObject_SendLoginCode_user_15 = - SendLoginCode {lcPhone = Phone {fromPhone = "+921771798513"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_16 :: SendLoginCode -testObject_SendLoginCode_user_16 = - SendLoginCode {lcPhone = Phone {fromPhone = "+250712302"}, lcCall = False, lcForce = False} - -testObject_SendLoginCode_user_17 :: SendLoginCode -testObject_SendLoginCode_user_17 = - SendLoginCode {lcPhone = Phone {fromPhone = "+073544070484537"}, lcCall = False, lcForce = False} - -testObject_SendLoginCode_user_18 :: SendLoginCode -testObject_SendLoginCode_user_18 = - SendLoginCode {lcPhone = Phone {fromPhone = "+938837684"}, lcCall = True, lcForce = False} - -testObject_SendLoginCode_user_19 :: SendLoginCode -testObject_SendLoginCode_user_19 = - SendLoginCode {lcPhone = Phone {fromPhone = "+8081583978"}, lcCall = False, lcForce = True} - -testObject_SendLoginCode_user_20 :: SendLoginCode -testObject_SendLoginCode_user_20 = - SendLoginCode {lcPhone = Phone {fromPhone = "+55901961505705"}, lcCall = True, lcForce = False} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_1.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_1.json deleted file mode 100644 index e2e0a54d510..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_1.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+059566184168" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_10.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_10.json deleted file mode 100644 index 2edaeeb14c3..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_10.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+431000511612" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_11.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_11.json deleted file mode 100644 index bad9e033264..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_11.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+1939668594372" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_12.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_12.json deleted file mode 100644 index 22a44744353..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_12.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+156939434" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_13.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_13.json deleted file mode 100644 index 45f00e3be08..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_13.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+54660214" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_14.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_14.json deleted file mode 100644 index 0993ecb56ba..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_14.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+17373888509447" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_15.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_15.json deleted file mode 100644 index 119e498a1d4..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_15.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+817869255119807" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_16.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_16.json deleted file mode 100644 index 2fe9ce33d37..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_16.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+541926748" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_17.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_17.json deleted file mode 100644 index 28dd8427d26..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_17.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+7836584019595" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_18.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_18.json deleted file mode 100644 index 421b57587df..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_18.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+3488257402473" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_19.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_19.json deleted file mode 100644 index 8ca748e27a0..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_19.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+1413522786322" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_2.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_2.json deleted file mode 100644 index 41577586d99..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_2.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+030094397" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_20.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_20.json deleted file mode 100644 index 992bc694e42..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_20.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+64700149027" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_3.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_3.json deleted file mode 100644 index 932505249ea..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_3.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+39788099045" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_4.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_4.json deleted file mode 100644 index b9a771478de..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_4.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+6060447691" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_5.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_5.json deleted file mode 100644 index b7a95f7759a..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_5.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+27199438794" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_6.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_6.json deleted file mode 100644 index a0a90e34009..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_6.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+403076793307922" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_7.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_7.json deleted file mode 100644 index b1112e1e2da..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_7.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+58949773" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_8.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_8.json deleted file mode 100644 index 4e030e1182c..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_8.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+5689710422639" -} diff --git a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_9.json b/libs/wire-api/test/golden/testObject_PhoneUpdate_user_9.json deleted file mode 100644 index 07de23169b0..00000000000 --- a/libs/wire-api/test/golden/testObject_PhoneUpdate_user_9.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "phone": "+60751390" -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_1.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_1.json deleted file mode 100644 index 1bafe991f61..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+7852237164", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_10.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_10.json deleted file mode 100644 index 5dacbe14be0..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_10.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+43915096382846", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_11.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_11.json deleted file mode 100644 index 6a4551985f9..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_11.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+08251498", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_12.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_12.json deleted file mode 100644 index 8b562bf8bd7..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_12.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+8151944856397", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_13.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_13.json deleted file mode 100644 index bd154b75205..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_13.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+40692963", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_14.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_14.json deleted file mode 100644 index f737860916b..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_14.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+661842350866268", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_15.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_15.json deleted file mode 100644 index c16cc5f52f8..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_15.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+921771798513", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_16.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_16.json deleted file mode 100644 index db2431d5583..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_16.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+250712302", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_17.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_17.json deleted file mode 100644 index 190eb5fc0ed..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_17.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+073544070484537", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_18.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_18.json deleted file mode 100644 index f4e69f0d7da..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_18.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+938837684", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_19.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_19.json deleted file mode 100644 index 50aa6c62499..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_19.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+8081583978", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_2.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_2.json deleted file mode 100644 index 46953585e10..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_2.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+1361303129", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_20.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_20.json deleted file mode 100644 index ada6762a401..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_20.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+55901961505705", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_3.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_3.json deleted file mode 100644 index 1902ecd0bc7..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_3.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+0278364030", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_4.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_4.json deleted file mode 100644 index 47ff049e6ce..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_4.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+7017081269", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_5.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_5.json deleted file mode 100644 index 6a1b8d2ea0b..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_5.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+7210550349", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_6.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_6.json deleted file mode 100644 index 7f083fdd29a..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_6.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+57561912568", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_7.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_7.json deleted file mode 100644 index 2965c03f43a..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_7.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": true, - "phone": "+0478831396", - "voice_call": false -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_8.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_8.json deleted file mode 100644 index f99c81f3bc8..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_8.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+731463104296", - "voice_call": true -} diff --git a/libs/wire-api/test/golden/testObject_SendLoginCode_user_9.json b/libs/wire-api/test/golden/testObject_SendLoginCode_user_9.json deleted file mode 100644 index 6050998c9a1..00000000000 --- a/libs/wire-api/test/golden/testObject_SendLoginCode_user_9.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "force": false, - "phone": "+95425609807", - "voice_call": true -} diff --git a/libs/wire-api/wire-api.cabal b/libs/wire-api/wire-api.cabal index cc4ec01bb57..5f4771d9574 100644 --- a/libs/wire-api/wire-api.cabal +++ b/libs/wire-api/wire-api.cabal @@ -260,7 +260,6 @@ library Wire.API.User.IdentityProvider Wire.API.User.Orphans Wire.API.User.Password - Wire.API.User.Phone Wire.API.User.Profile Wire.API.User.RichInfo Wire.API.User.Saml diff --git a/services/brig/src/Brig/API/Auth.hs b/services/brig/src/Brig/API/Auth.hs index 962a8d79b98..7417335936d 100644 --- a/services/brig/src/Brig/API/Auth.hs +++ b/services/brig/src/Brig/API/Auth.hs @@ -125,11 +125,6 @@ access mcid t mt = traverse mkUserTokenCookie =<< Auth.renewAccess t mt mcid !>> (StdError . zauthError) -sendLoginCode :: SendLoginCode -> Handler r LoginCodeTimeout -sendLoginCode _ = - -- Login by phone is unsupported - throwStd (errorToWai @'E.InvalidPhone) - login :: ( Member GalleyAPIAccess r, Member TinyLog r, diff --git a/services/brig/src/Brig/API/Public.hs b/services/brig/src/Brig/API/Public.hs index 3d37d91d4e5..fa57713584a 100644 --- a/services/brig/src/Brig/API/Public.hs +++ b/services/brig/src/Brig/API/Public.hs @@ -477,8 +477,6 @@ servantSitemap = Named @"get-self" getSelf :<|> Named @"delete-self" deleteSelfUser :<|> Named @"put-self" updateUser - :<|> Named @"change-phone" changePhone - :<|> Named @"remove-phone" removePhone :<|> Named @"remove-email" removeEmail :<|> Named @"check-password-exists" checkPasswordExists :<|> Named @"change-password" changePassword @@ -590,7 +588,6 @@ servantSitemap = authAPI :: ServerT AuthAPI (Handler r) authAPI = Named @"access" accessH - :<|> Named @"send-login-code" sendLoginCode :<|> Named @"login" login :<|> Named @"logout" logoutH :<|> Named @"change-self-email" changeSelfEmail @@ -1134,18 +1131,6 @@ updateUser uid conn uu = do lift . liftSem $ updateUserProfile uid (Just conn) UpdateOriginWireClient update --- | Phone based functionality is not supported any more, but the handler is --- kept here so long as client API version 5 is supported. -changePhone :: - UserId -> - ConnId -> - Public.PhoneUpdate -> - (Handler r) (Maybe Public.ChangePhoneError) -changePhone _ _ _ = pure . Just $ Public.InvalidNewPhone - -removePhone :: UserId -> Handler r (Maybe Public.RemoveIdentityError) -removePhone _ = (lift . pure) Nothing - removeEmail :: ( Member UserSubsystem r, Member (Error UserSubsystemError) r diff --git a/tools/db/phone-users/.ormolu b/tools/db/phone-users/.ormolu deleted file mode 120000 index ffc2ca9745e..00000000000 --- a/tools/db/phone-users/.ormolu +++ /dev/null @@ -1 +0,0 @@ -../../../.ormolu \ No newline at end of file diff --git a/tools/db/phone-users/README.md b/tools/db/phone-users/README.md deleted file mode 100644 index ab03b0b8fa1..00000000000 --- a/tools/db/phone-users/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Phone users - -This program scans brig's users table and determines the number of users that can only login by phone/sms. - -Example usage: - -```shell -phone-users --brig-cassandra-keyspace brig --galley-cassandra-keyspace galley -l 100000 -``` - -Display usage: - -```shell -phone-users -h -``` - -```text -phone-users - -Usage: phone-users [--brig-cassandra-host HOST] [--brig-cassandra-port PORT] - [--brig-cassandra-keyspace STRING] - [--galley-cassandra-host HOST] [--galley-cassandra-port PORT] - [--galley-cassandra-keyspace STRING] [-l|--limit INT] - - This program scans brig's users table and determines the number of users that - can only login by phone/sms - -Available options: - -h,--help Show this help text - --brig-cassandra-host HOST - Cassandra Host for brig (default: "localhost") - --brig-cassandra-port PORT - Cassandra Port for brig (default: 9042) - --brig-cassandra-keyspace STRING - Cassandra Keyspace for brig (default: "brig_test") - --galley-cassandra-host HOST - Cassandra Host for galley (default: "localhost") - --galley-cassandra-port PORT - Cassandra Port for galley (default: 9043) - --galley-cassandra-keyspace STRING - Cassandra Keyspace for galley - (default: "galley_test") - -l,--limit INT Limit the number of users to process -``` diff --git a/tools/db/phone-users/app/Main.hs b/tools/db/phone-users/app/Main.hs deleted file mode 100644 index be8658b8005..00000000000 --- a/tools/db/phone-users/app/Main.hs +++ /dev/null @@ -1,23 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2024 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module Main where - -import qualified PhoneUsers.Lib as Lib - -main :: IO () -main = Lib.main diff --git a/tools/db/phone-users/default.nix b/tools/db/phone-users/default.nix deleted file mode 100644 index 2903ef57701..00000000000 --- a/tools/db/phone-users/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -# WARNING: GENERATED FILE, DO NOT EDIT. -# This file is generated by running hack/bin/generate-local-nix-packages.sh and -# must be regenerated whenever local packages are added or removed, or -# dependencies are added or removed. -{ mkDerivation -, aeson -, aeson-pretty -, base -, bytestring -, cassandra-util -, conduit -, cql -, gitignoreSource -, imports -, lens -, lib -, optparse-applicative -, time -, tinylog -, types-common -, wire-api -}: -mkDerivation { - pname = "phone-users"; - version = "1.0.0"; - src = gitignoreSource ./.; - isLibrary = true; - isExecutable = true; - libraryHaskellDepends = [ - aeson - aeson-pretty - bytestring - cassandra-util - conduit - cql - imports - lens - optparse-applicative - time - tinylog - types-common - wire-api - ]; - executableHaskellDepends = [ base ]; - description = "Check users that are only able to login via phone"; - license = lib.licenses.agpl3Only; - mainProgram = "phone-users"; -} diff --git a/tools/db/phone-users/phone-users.cabal b/tools/db/phone-users/phone-users.cabal deleted file mode 100644 index ab9c01f8284..00000000000 --- a/tools/db/phone-users/phone-users.cabal +++ /dev/null @@ -1,96 +0,0 @@ -cabal-version: 3.0 -name: phone-users -version: 1.0.0 -synopsis: Check users that are only able to login via phone -category: Network -author: Wire Swiss GmbH -maintainer: Wire Swiss GmbH -copyright: (c) 2024 Wire Swiss GmbH -license: AGPL-3.0-only -build-type: Simple - -library - hs-source-dirs: src - exposed-modules: - PhoneUsers.Lib - PhoneUsers.Types - - ghc-options: - -O2 -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates - -Wpartial-fields -fwarn-tabs -optP-Wno-nonportable-include-path - -funbox-strict-fields -threaded -with-rtsopts=-N - -Wredundant-constraints -Wunused-packages - - build-depends: - , aeson - , aeson-pretty - , bytestring - , cassandra-util - , conduit - , cql - , imports - , lens - , optparse-applicative - , time - , tinylog - , types-common - , wire-api - - default-extensions: - AllowAmbiguousTypes - BangPatterns - ConstraintKinds - DataKinds - DefaultSignatures - DeriveFunctor - DeriveGeneric - DeriveLift - DeriveTraversable - DerivingStrategies - DerivingVia - DuplicateRecordFields - EmptyCase - FlexibleContexts - FlexibleInstances - FunctionalDependencies - GADTs - GeneralizedNewtypeDeriving - InstanceSigs - KindSignatures - LambdaCase - MultiParamTypeClasses - MultiWayIf - NamedFieldPuns - NoImplicitPrelude - OverloadedLabels - OverloadedRecordDot - OverloadedStrings - PackageImports - PatternSynonyms - PolyKinds - QuasiQuotes - RankNTypes - RecordWildCards - ScopedTypeVariables - StandaloneDeriving - TupleSections - TypeApplications - TypeFamilies - TypeFamilyDependencies - TypeOperators - UndecidableInstances - ViewPatterns - -executable phone-users - main-is: Main.hs - build-depends: - , base - , phone-users - - hs-source-dirs: app - default-language: Haskell2010 - ghc-options: - -O2 -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates - -Wpartial-fields -fwarn-tabs -optP-Wno-nonportable-include-path - -funbox-strict-fields -threaded -with-rtsopts=-N - -Wredundant-constraints -Wunused-packages diff --git a/tools/db/phone-users/src/PhoneUsers/Lib.hs b/tools/db/phone-users/src/PhoneUsers/Lib.hs deleted file mode 100644 index 8bf816461ea..00000000000 --- a/tools/db/phone-users/src/PhoneUsers/Lib.hs +++ /dev/null @@ -1,178 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} - --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2024 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module PhoneUsers.Lib where - -import Cassandra as C -import Cassandra.Settings as C -import Data.Conduit -import qualified Data.Conduit.Combinators as Conduit -import qualified Data.Conduit.List as CL -import Data.Id (TeamId, UserId) -import Data.Time -import qualified Database.CQL.Protocol as CQL -import Imports -import Options.Applicative -import PhoneUsers.Types --- import qualified System.IO as SIO -import qualified System.Logger as Log -import System.Logger.Message ((.=), (~~)) -import Wire.API.Team.Feature (FeatureStatus (FeatureStatusDisabled, FeatureStatusEnabled)) -import Wire.API.User (AccountStatus (Active)) - -lookupClientsLastActiveTimestamps :: ClientState -> UserId -> IO [Maybe UTCTime] -lookupClientsLastActiveTimestamps client u = do - runClient client $ runIdentity <$$> retry x1 (query selectClients (params One (Identity u))) - where - selectClients :: PrepQuery R (Identity UserId) (Identity (Maybe UTCTime)) - selectClients = "SELECT last_active from clients where user = ?" - -readUsers :: ClientState -> ConduitM () [UserRow] IO () -readUsers client = - transPipe (runClient client) (paginateC selectUsersAll (paramsP One () 1000) x5) - .| Conduit.map (fmap CQL.asRecord) - where - selectUsersAll :: C.PrepQuery C.R () (CQL.TupleType UserRow) - selectUsersAll = - "SELECT id, email, phone, activated, status, team FROM user" - -getConferenceCalling :: ClientState -> TeamId -> IO (Maybe FeatureStatus) -getConferenceCalling client tid = do - runClient client $ runIdentity <$$> retry x1 (query1 select (params One (Identity tid))) - where - select :: PrepQuery R (Identity TeamId) (Identity FeatureStatus) - select = - "select conference_calling from team_features where team_id = ?" - -process :: Log.Logger -> Maybe Int -> ClientState -> ClientState -> IO Result -process logger limit brigClient galleyClient = - runConduit - $ readUsers brigClient - -- .| Conduit.mapM (\chunk -> SIO.hPutStr stderr "." $> chunk) - .| Conduit.concat - .| (maybe (Conduit.filter (const True)) Conduit.take limit) - .| Conduit.mapM (getUserInfo logger brigClient galleyClient) - .| forever (CL.isolate 10000 .| (Conduit.foldMap infoToResult >>= yield)) - .| Conduit.takeWhile ((> 0) . usersSearched) - .| CL.scan (<>) mempty - `fuseUpstream` Conduit.mapM_ (\r -> Log.info logger $ "intermediate_result" .= show r) - -getUserInfo :: Log.Logger -> ClientState -> ClientState -> UserRow -> IO UserInfo -getUserInfo logger brigClient galleyClient ur = do - if not $ isCandidate - then pure NoPhoneUser - else do - -- should we give C* a little break here and add a small threadDelay? - -- threadDelay 200 - lastActiveTimeStamps <- lookupClientsLastActiveTimestamps brigClient ur.id - now <- getCurrentTime - -- activity: - -- inactive: they have no client or client's last_active is greater than 90 days ago - -- active: otherwise - -- last_active is null on client creation, but it will be set once notifications are fetched - -- therefore we can consider empty last_active as inactive - let activeLast90Days = any (clientWasActiveLast90Days now) $ catMaybes lastActiveTimeStamps - userInfo <- - if activeLast90Days - then do - apu <- case ur.team of - Nothing -> pure ActivePersonalUser - Just tid -> do - isPaying <- isPayingTeam galleyClient tid - pure - $ if isPaying - then ActiveTeamUser Free - else ActiveTeamUser Paid - Log.info logger - $ "active_phone_user" - .= show apu - ~~ "user_record" .= show ur - ~~ "last_active_timestamps" .= show lastActiveTimeStamps - ~~ Log.msg (Log.val "active phone user found") - pure apu - else pure InactiveLast90Days - pure $ PhoneUser userInfo - where - -- to qualify as an active phone user candidate, their account must be active and they must have a phone number but no verified email - isCandidate :: Bool - isCandidate = - ur.activated && ur.status == Just Active && isJust ur.phone && isNothing ur.email - - clientWasActiveLast90Days :: UTCTime -> UTCTime -> Bool - clientWasActiveLast90Days now lastActive = diffUTCTime now lastActive < 90 * nominalDay - - -- if conference_calling is enabled for the team, then it's a paying team - isPayingTeam :: ClientState -> TeamId -> IO Bool - isPayingTeam client tid = do - status <- getConferenceCalling client tid - pure $ case status of - Just FeatureStatusEnabled -> True - Just FeatureStatusDisabled -> False - Nothing -> False - -infoToResult :: UserInfo -> Result -infoToResult = \case - NoPhoneUser -> mempty {usersSearched = 1} - PhoneUser InactiveLast90Days -> mempty {usersSearched = 1, phoneUsersTotal = 1, inactivePhoneUsers = 1} - PhoneUser ActivePersonalUser -> mempty {usersSearched = 1, phoneUsersTotal = 1, activePersonalPhoneUsers = 1} - PhoneUser (ActiveTeamUser Free) -> - Result - { usersSearched = 1, - phoneUsersTotal = 1, - inactivePhoneUsers = 0, - activePersonalPhoneUsers = 0, - activeFreeTeamPhoneUsers = 1, - activePaidTeamPhoneUsers = 0 - } - PhoneUser (ActiveTeamUser Paid) -> - Result - { usersSearched = 1, - phoneUsersTotal = 1, - inactivePhoneUsers = 0, - activePersonalPhoneUsers = 0, - activeFreeTeamPhoneUsers = 0, - activePaidTeamPhoneUsers = 1 - } - -main :: IO () -main = do - opts <- execParser (info (helper <*> optsParser) desc) - logger <- initLogger - brigClient <- initCas opts.brigDb logger - galleyClient <- initCas opts.galleyDb logger - putStrLn "scanning users table..." - res <- process logger opts.limit brigClient galleyClient - Log.info logger $ "result" .= show res - where - initLogger = - Log.new - . Log.setLogLevel Log.Info - . Log.setOutput Log.StdOut - . Log.setFormat Nothing - . Log.setBufSize 0 - $ Log.defSettings - initCas settings l = - C.init - . C.setLogger (C.mkLogger l) - . C.setContacts settings.host [] - . C.setPortNumber (fromIntegral settings.port) - . C.setKeyspace settings.keyspace - . C.setProtocolVersion C.V4 - $ C.defSettings - desc = header "phone-users" <> progDesc "This program scans brig's users table and determines the number of users that can only login by phone/sms" <> fullDesc diff --git a/tools/db/phone-users/src/PhoneUsers/Types.hs b/tools/db/phone-users/src/PhoneUsers/Types.hs deleted file mode 100644 index 087dafd2b70..00000000000 --- a/tools/db/phone-users/src/PhoneUsers/Types.hs +++ /dev/null @@ -1,186 +0,0 @@ -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE TemplateHaskell #-} - --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2024 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module PhoneUsers.Types where - -import Cassandra as C -import Control.Lens -import qualified Data.Aeson as A -import qualified Data.Aeson.Encode.Pretty as A -import qualified Data.ByteString.Lazy.Char8 as LC8 -import Data.Id -import Data.Text.Strict.Lens -import Database.CQL.Protocol hiding (Result) -import Imports -import Options.Applicative -import Wire.API.User - -data CassandraSettings = CassandraSettings - { host :: String, - port :: Int, - keyspace :: C.Keyspace - } - -data Opts = Opts - { brigDb :: CassandraSettings, - galleyDb :: CassandraSettings, - limit :: Maybe Int - } - -optsParser :: Parser Opts -optsParser = - Opts - <$> brigCassandraParser - <*> galleyCassandraParser - <*> optional - ( option - auto - ( long "limit" - <> short 'l' - <> metavar "INT" - <> help "Limit the number of users to process" - ) - ) - -galleyCassandraParser :: Parser CassandraSettings -galleyCassandraParser = - CassandraSettings - <$> strOption - ( long "galley-cassandra-host" - <> metavar "HOST" - <> help "Cassandra Host for galley" - <> value "localhost" - <> showDefault - ) - <*> option - auto - ( long "galley-cassandra-port" - <> metavar "PORT" - <> help "Cassandra Port for galley" - <> value 9043 - <> showDefault - ) - <*> ( C.Keyspace - . view packed - <$> strOption - ( long "galley-cassandra-keyspace" - <> metavar "STRING" - <> help "Cassandra Keyspace for galley" - <> value "galley_test" - <> showDefault - ) - ) - -brigCassandraParser :: Parser CassandraSettings -brigCassandraParser = - CassandraSettings - <$> strOption - ( long "brig-cassandra-host" - <> metavar "HOST" - <> help "Cassandra Host for brig" - <> value "localhost" - <> showDefault - ) - <*> option - auto - ( long "brig-cassandra-port" - <> metavar "PORT" - <> help "Cassandra Port for brig" - <> value 9042 - <> showDefault - ) - <*> ( C.Keyspace - . view packed - <$> strOption - ( long "brig-cassandra-keyspace" - <> metavar "STRING" - <> help "Cassandra Keyspace for brig" - <> value "brig_test" - <> showDefault - ) - ) - -data Result = Result - { usersSearched :: Int, - phoneUsersTotal :: Int, - inactivePhoneUsers :: Int, - activePersonalPhoneUsers :: Int, - activeFreeTeamPhoneUsers :: Int, - activePaidTeamPhoneUsers :: Int - } - deriving (Generic) - -instance A.ToJSON Result - -instance Show Result where - show = LC8.unpack . A.encodePretty - -instance Semigroup Result where - r1 <> r2 = - Result - { usersSearched = r1.usersSearched + r2.usersSearched, - phoneUsersTotal = r1.phoneUsersTotal + r2.phoneUsersTotal, - inactivePhoneUsers = r1.inactivePhoneUsers + r2.inactivePhoneUsers, - activePersonalPhoneUsers = r1.activePersonalPhoneUsers + r2.activePersonalPhoneUsers, - activeFreeTeamPhoneUsers = r1.activeFreeTeamPhoneUsers + r2.activeFreeTeamPhoneUsers, - activePaidTeamPhoneUsers = r1.activePaidTeamPhoneUsers + r2.activePaidTeamPhoneUsers - } - -instance Monoid Result where - mempty = - Result - { usersSearched = 0, - phoneUsersTotal = 0, - inactivePhoneUsers = 0, - activePersonalPhoneUsers = 0, - activeFreeTeamPhoneUsers = 0, - activePaidTeamPhoneUsers = 0 - } - -type Activated = Bool - -data UserRow = UserRow - { id :: UserId, - email :: Maybe EmailAddress, - phone :: Maybe Phone, - activated :: Activated, - status :: Maybe AccountStatus, - team :: Maybe TeamId - } - deriving (Generic) - -instance A.ToJSON UserRow - -recordInstance ''UserRow - -instance Show UserRow where - show = LC8.unpack . A.encodePretty - -data TeamUser = Free | Paid - deriving (Show) - -data UserInfo = NoPhoneUser | PhoneUser PhoneUserInfo - deriving (Show) - -data PhoneUserInfo - = InactiveLast90Days - | ActivePersonalUser - | ActiveTeamUser TeamUser - deriving (Show)