{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CognitoIdentityProvider.SetUserMFAPreference
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Set the user\'s multi-factor authentication (MFA) method preference,
-- including which MFA factors are activated and if any are preferred. Only
-- one factor can be set as preferred. The preferred MFA factor will be
-- used to authenticate a user if multiple factors are activated. If
-- multiple options are activated and no preference is set, a challenge to
-- choose an MFA option will be returned during sign-in. If an MFA type is
-- activated for a user, the user will be prompted for MFA during all
-- sign-in attempts unless device tracking is turned on and the device has
-- been trusted. If you want MFA to be applied selectively based on the
-- assessed risk level of sign-in attempts, deactivate MFA for users and
-- turn on Adaptive Authentication for the user pool.
module Amazonka.CognitoIdentityProvider.SetUserMFAPreference
  ( -- * Creating a Request
    SetUserMFAPreference (..),
    newSetUserMFAPreference,

    -- * Request Lenses
    setUserMFAPreference_sMSMfaSettings,
    setUserMFAPreference_softwareTokenMfaSettings,
    setUserMFAPreference_accessToken,

    -- * Destructuring the Response
    SetUserMFAPreferenceResponse (..),
    newSetUserMFAPreferenceResponse,

    -- * Response Lenses
    setUserMFAPreferenceResponse_httpStatus,
  )
where

import Amazonka.CognitoIdentityProvider.Types
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newSetUserMFAPreference' smart constructor.
data SetUserMFAPreference = SetUserMFAPreference'
  { -- | The SMS text message multi-factor authentication (MFA) settings.
    SetUserMFAPreference -> Maybe SMSMfaSettingsType
sMSMfaSettings :: Prelude.Maybe SMSMfaSettingsType,
    -- | The time-based one-time password (TOTP) software token MFA settings.
    SetUserMFAPreference -> Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings :: Prelude.Maybe SoftwareTokenMfaSettingsType,
    -- | A valid access token that Amazon Cognito issued to the user whose MFA
    -- preference you want to set.
    SetUserMFAPreference -> Sensitive Text
accessToken :: Data.Sensitive Prelude.Text
  }
  deriving (SetUserMFAPreference -> SetUserMFAPreference -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SetUserMFAPreference -> SetUserMFAPreference -> Bool
$c/= :: SetUserMFAPreference -> SetUserMFAPreference -> Bool
== :: SetUserMFAPreference -> SetUserMFAPreference -> Bool
$c== :: SetUserMFAPreference -> SetUserMFAPreference -> Bool
Prelude.Eq, Int -> SetUserMFAPreference -> ShowS
[SetUserMFAPreference] -> ShowS
SetUserMFAPreference -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetUserMFAPreference] -> ShowS
$cshowList :: [SetUserMFAPreference] -> ShowS
show :: SetUserMFAPreference -> String
$cshow :: SetUserMFAPreference -> String
showsPrec :: Int -> SetUserMFAPreference -> ShowS
$cshowsPrec :: Int -> SetUserMFAPreference -> ShowS
Prelude.Show, forall x. Rep SetUserMFAPreference x -> SetUserMFAPreference
forall x. SetUserMFAPreference -> Rep SetUserMFAPreference x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SetUserMFAPreference x -> SetUserMFAPreference
$cfrom :: forall x. SetUserMFAPreference -> Rep SetUserMFAPreference x
Prelude.Generic)

-- |
-- Create a value of 'SetUserMFAPreference' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'sMSMfaSettings', 'setUserMFAPreference_sMSMfaSettings' - The SMS text message multi-factor authentication (MFA) settings.
--
-- 'softwareTokenMfaSettings', 'setUserMFAPreference_softwareTokenMfaSettings' - The time-based one-time password (TOTP) software token MFA settings.
--
-- 'accessToken', 'setUserMFAPreference_accessToken' - A valid access token that Amazon Cognito issued to the user whose MFA
-- preference you want to set.
newSetUserMFAPreference ::
  -- | 'accessToken'
  Prelude.Text ->
  SetUserMFAPreference
newSetUserMFAPreference :: Text -> SetUserMFAPreference
newSetUserMFAPreference Text
pAccessToken_ =
  SetUserMFAPreference'
    { $sel:sMSMfaSettings:SetUserMFAPreference' :: Maybe SMSMfaSettingsType
sMSMfaSettings =
        forall a. Maybe a
Prelude.Nothing,
      $sel:softwareTokenMfaSettings:SetUserMFAPreference' :: Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings = forall a. Maybe a
Prelude.Nothing,
      $sel:accessToken:SetUserMFAPreference' :: Sensitive Text
accessToken = forall a. Iso' (Sensitive a) a
Data._Sensitive forall t b. AReview t b -> b -> t
Lens.# Text
pAccessToken_
    }

-- | The SMS text message multi-factor authentication (MFA) settings.
setUserMFAPreference_sMSMfaSettings :: Lens.Lens' SetUserMFAPreference (Prelude.Maybe SMSMfaSettingsType)
setUserMFAPreference_sMSMfaSettings :: Lens' SetUserMFAPreference (Maybe SMSMfaSettingsType)
setUserMFAPreference_sMSMfaSettings = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetUserMFAPreference' {Maybe SMSMfaSettingsType
sMSMfaSettings :: Maybe SMSMfaSettingsType
$sel:sMSMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SMSMfaSettingsType
sMSMfaSettings} -> Maybe SMSMfaSettingsType
sMSMfaSettings) (\s :: SetUserMFAPreference
s@SetUserMFAPreference' {} Maybe SMSMfaSettingsType
a -> SetUserMFAPreference
s {$sel:sMSMfaSettings:SetUserMFAPreference' :: Maybe SMSMfaSettingsType
sMSMfaSettings = Maybe SMSMfaSettingsType
a} :: SetUserMFAPreference)

-- | The time-based one-time password (TOTP) software token MFA settings.
setUserMFAPreference_softwareTokenMfaSettings :: Lens.Lens' SetUserMFAPreference (Prelude.Maybe SoftwareTokenMfaSettingsType)
setUserMFAPreference_softwareTokenMfaSettings :: Lens' SetUserMFAPreference (Maybe SoftwareTokenMfaSettingsType)
setUserMFAPreference_softwareTokenMfaSettings = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetUserMFAPreference' {Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings :: Maybe SoftwareTokenMfaSettingsType
$sel:softwareTokenMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings} -> Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings) (\s :: SetUserMFAPreference
s@SetUserMFAPreference' {} Maybe SoftwareTokenMfaSettingsType
a -> SetUserMFAPreference
s {$sel:softwareTokenMfaSettings:SetUserMFAPreference' :: Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings = Maybe SoftwareTokenMfaSettingsType
a} :: SetUserMFAPreference)

-- | A valid access token that Amazon Cognito issued to the user whose MFA
-- preference you want to set.
setUserMFAPreference_accessToken :: Lens.Lens' SetUserMFAPreference Prelude.Text
setUserMFAPreference_accessToken :: Lens' SetUserMFAPreference Text
setUserMFAPreference_accessToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetUserMFAPreference' {Sensitive Text
accessToken :: Sensitive Text
$sel:accessToken:SetUserMFAPreference' :: SetUserMFAPreference -> Sensitive Text
accessToken} -> Sensitive Text
accessToken) (\s :: SetUserMFAPreference
s@SetUserMFAPreference' {} Sensitive Text
a -> SetUserMFAPreference
s {$sel:accessToken:SetUserMFAPreference' :: Sensitive Text
accessToken = Sensitive Text
a} :: SetUserMFAPreference) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. Iso' (Sensitive a) a
Data._Sensitive

instance Core.AWSRequest SetUserMFAPreference where
  type
    AWSResponse SetUserMFAPreference =
      SetUserMFAPreferenceResponse
  request :: (Service -> Service)
-> SetUserMFAPreference -> Request SetUserMFAPreference
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy SetUserMFAPreference
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse SetUserMFAPreference)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Int -> SetUserMFAPreferenceResponse
SetUserMFAPreferenceResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable SetUserMFAPreference where
  hashWithSalt :: Int -> SetUserMFAPreference -> Int
hashWithSalt Int
_salt SetUserMFAPreference' {Maybe SMSMfaSettingsType
Maybe SoftwareTokenMfaSettingsType
Sensitive Text
accessToken :: Sensitive Text
softwareTokenMfaSettings :: Maybe SoftwareTokenMfaSettingsType
sMSMfaSettings :: Maybe SMSMfaSettingsType
$sel:accessToken:SetUserMFAPreference' :: SetUserMFAPreference -> Sensitive Text
$sel:softwareTokenMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SoftwareTokenMfaSettingsType
$sel:sMSMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SMSMfaSettingsType
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SMSMfaSettingsType
sMSMfaSettings
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Sensitive Text
accessToken

instance Prelude.NFData SetUserMFAPreference where
  rnf :: SetUserMFAPreference -> ()
rnf SetUserMFAPreference' {Maybe SMSMfaSettingsType
Maybe SoftwareTokenMfaSettingsType
Sensitive Text
accessToken :: Sensitive Text
softwareTokenMfaSettings :: Maybe SoftwareTokenMfaSettingsType
sMSMfaSettings :: Maybe SMSMfaSettingsType
$sel:accessToken:SetUserMFAPreference' :: SetUserMFAPreference -> Sensitive Text
$sel:softwareTokenMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SoftwareTokenMfaSettingsType
$sel:sMSMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SMSMfaSettingsType
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe SMSMfaSettingsType
sMSMfaSettings
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Sensitive Text
accessToken

instance Data.ToHeaders SetUserMFAPreference where
  toHeaders :: SetUserMFAPreference -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"AWSCognitoIdentityProviderService.SetUserMFAPreference" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON SetUserMFAPreference where
  toJSON :: SetUserMFAPreference -> Value
toJSON SetUserMFAPreference' {Maybe SMSMfaSettingsType
Maybe SoftwareTokenMfaSettingsType
Sensitive Text
accessToken :: Sensitive Text
softwareTokenMfaSettings :: Maybe SoftwareTokenMfaSettingsType
sMSMfaSettings :: Maybe SMSMfaSettingsType
$sel:accessToken:SetUserMFAPreference' :: SetUserMFAPreference -> Sensitive Text
$sel:softwareTokenMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SoftwareTokenMfaSettingsType
$sel:sMSMfaSettings:SetUserMFAPreference' :: SetUserMFAPreference -> Maybe SMSMfaSettingsType
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"SMSMfaSettings" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe SMSMfaSettingsType
sMSMfaSettings,
            (Key
"SoftwareTokenMfaSettings" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe SoftwareTokenMfaSettingsType
softwareTokenMfaSettings,
            forall a. a -> Maybe a
Prelude.Just (Key
"AccessToken" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Sensitive Text
accessToken)
          ]
      )

instance Data.ToPath SetUserMFAPreference where
  toPath :: SetUserMFAPreference -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery SetUserMFAPreference where
  toQuery :: SetUserMFAPreference -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newSetUserMFAPreferenceResponse' smart constructor.
data SetUserMFAPreferenceResponse = SetUserMFAPreferenceResponse'
  { -- | The response's http status code.
    SetUserMFAPreferenceResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (SetUserMFAPreferenceResponse
-> SetUserMFAPreferenceResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SetUserMFAPreferenceResponse
-> SetUserMFAPreferenceResponse -> Bool
$c/= :: SetUserMFAPreferenceResponse
-> SetUserMFAPreferenceResponse -> Bool
== :: SetUserMFAPreferenceResponse
-> SetUserMFAPreferenceResponse -> Bool
$c== :: SetUserMFAPreferenceResponse
-> SetUserMFAPreferenceResponse -> Bool
Prelude.Eq, ReadPrec [SetUserMFAPreferenceResponse]
ReadPrec SetUserMFAPreferenceResponse
Int -> ReadS SetUserMFAPreferenceResponse
ReadS [SetUserMFAPreferenceResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SetUserMFAPreferenceResponse]
$creadListPrec :: ReadPrec [SetUserMFAPreferenceResponse]
readPrec :: ReadPrec SetUserMFAPreferenceResponse
$creadPrec :: ReadPrec SetUserMFAPreferenceResponse
readList :: ReadS [SetUserMFAPreferenceResponse]
$creadList :: ReadS [SetUserMFAPreferenceResponse]
readsPrec :: Int -> ReadS SetUserMFAPreferenceResponse
$creadsPrec :: Int -> ReadS SetUserMFAPreferenceResponse
Prelude.Read, Int -> SetUserMFAPreferenceResponse -> ShowS
[SetUserMFAPreferenceResponse] -> ShowS
SetUserMFAPreferenceResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetUserMFAPreferenceResponse] -> ShowS
$cshowList :: [SetUserMFAPreferenceResponse] -> ShowS
show :: SetUserMFAPreferenceResponse -> String
$cshow :: SetUserMFAPreferenceResponse -> String
showsPrec :: Int -> SetUserMFAPreferenceResponse -> ShowS
$cshowsPrec :: Int -> SetUserMFAPreferenceResponse -> ShowS
Prelude.Show, forall x.
Rep SetUserMFAPreferenceResponse x -> SetUserMFAPreferenceResponse
forall x.
SetUserMFAPreferenceResponse -> Rep SetUserMFAPreferenceResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep SetUserMFAPreferenceResponse x -> SetUserMFAPreferenceResponse
$cfrom :: forall x.
SetUserMFAPreferenceResponse -> Rep SetUserMFAPreferenceResponse x
Prelude.Generic)

-- |
-- Create a value of 'SetUserMFAPreferenceResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'httpStatus', 'setUserMFAPreferenceResponse_httpStatus' - The response's http status code.
newSetUserMFAPreferenceResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  SetUserMFAPreferenceResponse
newSetUserMFAPreferenceResponse :: Int -> SetUserMFAPreferenceResponse
newSetUserMFAPreferenceResponse Int
pHttpStatus_ =
  SetUserMFAPreferenceResponse'
    { $sel:httpStatus:SetUserMFAPreferenceResponse' :: Int
httpStatus =
        Int
pHttpStatus_
    }

-- | The response's http status code.
setUserMFAPreferenceResponse_httpStatus :: Lens.Lens' SetUserMFAPreferenceResponse Prelude.Int
setUserMFAPreferenceResponse_httpStatus :: Lens' SetUserMFAPreferenceResponse Int
setUserMFAPreferenceResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetUserMFAPreferenceResponse' {Int
httpStatus :: Int
$sel:httpStatus:SetUserMFAPreferenceResponse' :: SetUserMFAPreferenceResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: SetUserMFAPreferenceResponse
s@SetUserMFAPreferenceResponse' {} Int
a -> SetUserMFAPreferenceResponse
s {$sel:httpStatus:SetUserMFAPreferenceResponse' :: Int
httpStatus = Int
a} :: SetUserMFAPreferenceResponse)

instance Prelude.NFData SetUserMFAPreferenceResponse where
  rnf :: SetUserMFAPreferenceResponse -> ()
rnf SetUserMFAPreferenceResponse' {Int
httpStatus :: Int
$sel:httpStatus:SetUserMFAPreferenceResponse' :: SetUserMFAPreferenceResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus