-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- 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 <https://www.gnu.org/licenses/>.

module Wire.API.User.Auth.ReAuth
  ( -- * ReAuth
    ReAuthUser (..),
  )
where

import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Aeson qualified as A
import Data.Code
import Data.Misc
import Data.OpenApi qualified as S
import Data.Schema
import Imports
import Wire.API.User

-- | Certain operations might require reauth of the user. These are available
-- only for users that have already set a password.
data ReAuthUser = ReAuthUser
  { ReAuthUser -> Maybe PlainTextPassword6
reAuthPassword :: Maybe PlainTextPassword6,
    ReAuthUser -> Maybe Value
reAuthCode :: Maybe Value,
    ReAuthUser -> Maybe VerificationAction
reAuthCodeAction :: Maybe VerificationAction
  }
  deriving (ReAuthUser -> ReAuthUser -> Bool
(ReAuthUser -> ReAuthUser -> Bool)
-> (ReAuthUser -> ReAuthUser -> Bool) -> Eq ReAuthUser
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReAuthUser -> ReAuthUser -> Bool
== :: ReAuthUser -> ReAuthUser -> Bool
$c/= :: ReAuthUser -> ReAuthUser -> Bool
/= :: ReAuthUser -> ReAuthUser -> Bool
Eq, Int -> ReAuthUser -> ShowS
[ReAuthUser] -> ShowS
ReAuthUser -> String
(Int -> ReAuthUser -> ShowS)
-> (ReAuthUser -> String)
-> ([ReAuthUser] -> ShowS)
-> Show ReAuthUser
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReAuthUser -> ShowS
showsPrec :: Int -> ReAuthUser -> ShowS
$cshow :: ReAuthUser -> String
show :: ReAuthUser -> String
$cshowList :: [ReAuthUser] -> ShowS
showList :: [ReAuthUser] -> ShowS
Show, (forall x. ReAuthUser -> Rep ReAuthUser x)
-> (forall x. Rep ReAuthUser x -> ReAuthUser) -> Generic ReAuthUser
forall x. Rep ReAuthUser x -> ReAuthUser
forall x. ReAuthUser -> Rep ReAuthUser x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ReAuthUser -> Rep ReAuthUser x
from :: forall x. ReAuthUser -> Rep ReAuthUser x
$cto :: forall x. Rep ReAuthUser x -> ReAuthUser
to :: forall x. Rep ReAuthUser x -> ReAuthUser
Generic)
  deriving (Value -> Parser [ReAuthUser]
Value -> Parser ReAuthUser
(Value -> Parser ReAuthUser)
-> (Value -> Parser [ReAuthUser]) -> FromJSON ReAuthUser
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser ReAuthUser
parseJSON :: Value -> Parser ReAuthUser
$cparseJSONList :: Value -> Parser [ReAuthUser]
parseJSONList :: Value -> Parser [ReAuthUser]
FromJSON, [ReAuthUser] -> Value
[ReAuthUser] -> Encoding
ReAuthUser -> Value
ReAuthUser -> Encoding
(ReAuthUser -> Value)
-> (ReAuthUser -> Encoding)
-> ([ReAuthUser] -> Value)
-> ([ReAuthUser] -> Encoding)
-> ToJSON ReAuthUser
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: ReAuthUser -> Value
toJSON :: ReAuthUser -> Value
$ctoEncoding :: ReAuthUser -> Encoding
toEncoding :: ReAuthUser -> Encoding
$ctoJSONList :: [ReAuthUser] -> Value
toJSONList :: [ReAuthUser] -> Value
$ctoEncodingList :: [ReAuthUser] -> Encoding
toEncodingList :: [ReAuthUser] -> Encoding
ToJSON, Typeable ReAuthUser
Typeable ReAuthUser =>
(Proxy ReAuthUser -> Declare (Definitions Schema) NamedSchema)
-> ToSchema ReAuthUser
Proxy ReAuthUser -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy ReAuthUser -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy ReAuthUser -> Declare (Definitions Schema) NamedSchema
S.ToSchema) via Schema ReAuthUser

instance ToSchema ReAuthUser where
  schema :: ValueSchema NamedSwaggerDoc ReAuthUser
schema =
    Text
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser ReAuthUser
-> ValueSchema NamedSwaggerDoc ReAuthUser
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
object Text
"ReAuthUser" (SchemaP SwaggerDoc Object [Pair] ReAuthUser ReAuthUser
 -> ValueSchema NamedSwaggerDoc ReAuthUser)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser ReAuthUser
-> ValueSchema NamedSwaggerDoc ReAuthUser
forall a b. (a -> b) -> a -> b
$
      Maybe PlainTextPassword6
-> Maybe Value -> Maybe VerificationAction -> ReAuthUser
ReAuthUser
        (Maybe PlainTextPassword6
 -> Maybe Value -> Maybe VerificationAction -> ReAuthUser)
-> SchemaP
     SwaggerDoc Object [Pair] ReAuthUser (Maybe PlainTextPassword6)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     ReAuthUser
     (Maybe Value -> Maybe VerificationAction -> ReAuthUser)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReAuthUser -> Maybe PlainTextPassword6
reAuthPassword (ReAuthUser -> Maybe PlainTextPassword6)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe PlainTextPassword6)
     (Maybe PlainTextPassword6)
-> SchemaP
     SwaggerDoc Object [Pair] ReAuthUser (Maybe PlainTextPassword6)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP
     NamedSwaggerDoc
     Value
     Value
     (Maybe PlainTextPassword6)
     PlainTextPassword6
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe PlainTextPassword6)
     (Maybe PlainTextPassword6)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"password" (Value
-> SchemaP
     NamedSwaggerDoc Value Value PlainTextPassword6 PlainTextPassword6
-> SchemaP
     NamedSwaggerDoc
     Value
     Value
     (Maybe PlainTextPassword6)
     PlainTextPassword6
forall w d v a b.
w -> SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybeWithDefault Value
A.Null SchemaP
  NamedSwaggerDoc Value Value PlainTextPassword6 PlainTextPassword6
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  ReAuthUser
  (Maybe Value -> Maybe VerificationAction -> ReAuthUser)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser (Maybe Value)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     ReAuthUser
     (Maybe VerificationAction -> ReAuthUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] ReAuthUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser a
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReAuthUser -> Maybe Value
reAuthCode (ReAuthUser -> Maybe Value)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Value) (Maybe Value)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser (Maybe Value)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value (Maybe Value) Value
-> SchemaP SwaggerDoc Object [Pair] (Maybe Value) (Maybe Value)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"verification_code" (Value
-> SchemaP NamedSwaggerDoc Value Value Value Value
-> SchemaP NamedSwaggerDoc Value Value (Maybe Value) Value
forall w d v a b.
w -> SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybeWithDefault Value
A.Null SchemaP NamedSwaggerDoc Value Value Value Value
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  ReAuthUser
  (Maybe VerificationAction -> ReAuthUser)
-> SchemaP
     SwaggerDoc Object [Pair] ReAuthUser (Maybe VerificationAction)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser ReAuthUser
forall a b.
SchemaP SwaggerDoc Object [Pair] ReAuthUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser a
-> SchemaP SwaggerDoc Object [Pair] ReAuthUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReAuthUser -> Maybe VerificationAction
reAuthCodeAction (ReAuthUser -> Maybe VerificationAction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe VerificationAction)
     (Maybe VerificationAction)
-> SchemaP
     SwaggerDoc Object [Pair] ReAuthUser (Maybe VerificationAction)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP
     NamedSwaggerDoc
     Value
     Value
     (Maybe VerificationAction)
     VerificationAction
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe VerificationAction)
     (Maybe VerificationAction)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"action" (Value
-> SchemaP
     NamedSwaggerDoc Value Value VerificationAction VerificationAction
-> SchemaP
     NamedSwaggerDoc
     Value
     Value
     (Maybe VerificationAction)
     VerificationAction
forall w d v a b.
w -> SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybeWithDefault Value
A.Null SchemaP
  NamedSwaggerDoc Value Value VerificationAction VerificationAction
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)