module Ecluse.Core.Credential (
Secret,
mkSecret,
unSecret,
ClientCredential (..),
bareCredential,
AuthToken (..),
CredentialProvider (..),
mintSecret,
staticProvider,
) where
import Data.Aeson (FromJSON (..), ToJSON (..), Value (String), withText)
import Data.ByteArray qualified as BA
import Data.Time (UTCTime)
import Text.Show (showString, showsPrec)
newtype Secret = Secret Text
instance Eq Secret where
Secret Text
a == :: Secret -> Secret -> Bool
== Secret Text
b = ByteString -> ByteString -> Bool
forall bs1 bs2.
(ByteArrayAccess bs1, ByteArrayAccess bs2) =>
bs1 -> bs2 -> Bool
BA.constEq (Text -> ByteString
forall a b. ConvertUtf8 a b => a -> b
encodeUtf8 Text
a :: ByteString) (Text -> ByteString
forall a b. ConvertUtf8 a b => a -> b
encodeUtf8 Text
b :: ByteString)
instance Show Secret where
showsPrec :: Int -> Secret -> ShowS
showsPrec Int
_ Secret
_ = String -> ShowS
showString String
"Secret <REDACTED>"
instance ToJSON Secret where
toJSON :: Secret -> Value
toJSON Secret
_ = Text -> Value
String Text
"<REDACTED>"
instance FromJSON Secret where
parseJSON :: Value -> Parser Secret
parseJSON = String -> (Text -> Parser Secret) -> Value -> Parser Secret
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Secret" (Secret -> Parser Secret
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Secret -> Parser Secret)
-> (Text -> Secret) -> Text -> Parser Secret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Secret
mkSecret)
mkSecret :: Text -> Secret
mkSecret :: Text -> Secret
mkSecret = Text -> Secret
Secret
unSecret :: Secret -> Text
unSecret :: Secret -> Text
unSecret (Secret Text
s) = Text
s
data ClientCredential = ClientCredential
{ ClientCredential -> Maybe Text
credUsername :: Maybe Text
, ClientCredential -> Secret
credSecret :: Secret
}
deriving stock (ClientCredential -> ClientCredential -> Bool
(ClientCredential -> ClientCredential -> Bool)
-> (ClientCredential -> ClientCredential -> Bool)
-> Eq ClientCredential
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ClientCredential -> ClientCredential -> Bool
== :: ClientCredential -> ClientCredential -> Bool
$c/= :: ClientCredential -> ClientCredential -> Bool
/= :: ClientCredential -> ClientCredential -> Bool
Eq, Int -> ClientCredential -> ShowS
[ClientCredential] -> ShowS
ClientCredential -> String
(Int -> ClientCredential -> ShowS)
-> (ClientCredential -> String)
-> ([ClientCredential] -> ShowS)
-> Show ClientCredential
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ClientCredential -> ShowS
showsPrec :: Int -> ClientCredential -> ShowS
$cshow :: ClientCredential -> String
show :: ClientCredential -> String
$cshowList :: [ClientCredential] -> ShowS
showList :: [ClientCredential] -> ShowS
Show)
bareCredential :: Secret -> ClientCredential
bareCredential :: Secret -> ClientCredential
bareCredential = Maybe Text -> Secret -> ClientCredential
ClientCredential Maybe Text
forall a. Maybe a
Nothing
data AuthToken = AuthToken
{ AuthToken -> Secret
authSecret :: Secret
, AuthToken -> Maybe UTCTime
authExpiresAt :: Maybe UTCTime
}
deriving stock (AuthToken -> AuthToken -> Bool
(AuthToken -> AuthToken -> Bool)
-> (AuthToken -> AuthToken -> Bool) -> Eq AuthToken
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AuthToken -> AuthToken -> Bool
== :: AuthToken -> AuthToken -> Bool
$c/= :: AuthToken -> AuthToken -> Bool
/= :: AuthToken -> AuthToken -> Bool
Eq, Int -> AuthToken -> ShowS
[AuthToken] -> ShowS
AuthToken -> String
(Int -> AuthToken -> ShowS)
-> (AuthToken -> String)
-> ([AuthToken] -> ShowS)
-> Show AuthToken
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AuthToken -> ShowS
showsPrec :: Int -> AuthToken -> ShowS
$cshow :: AuthToken -> String
show :: AuthToken -> String
$cshowList :: [AuthToken] -> ShowS
showList :: [AuthToken] -> ShowS
Show)
newtype CredentialProvider = CredentialProvider
{ CredentialProvider -> IO AuthToken
currentToken :: IO AuthToken
}
mintSecret :: CredentialProvider -> IO Secret
mintSecret :: CredentialProvider -> IO Secret
mintSecret = (AuthToken -> Secret) -> IO AuthToken -> IO Secret
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AuthToken -> Secret
authSecret (IO AuthToken -> IO Secret)
-> (CredentialProvider -> IO AuthToken)
-> CredentialProvider
-> IO Secret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CredentialProvider -> IO AuthToken
currentToken
staticProvider :: AuthToken -> CredentialProvider
staticProvider :: AuthToken -> CredentialProvider
staticProvider AuthToken
token = CredentialProvider{currentToken :: IO AuthToken
currentToken = AuthToken -> IO AuthToken
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AuthToken
token}