module Ecluse.Core.Registry.Npm.Credential (
npmCredential,
) where
import Data.Text qualified as T
import Network.HTTP.Types.Header (RequestHeaders, hAuthorization)
import Ecluse.Core.Credential (ClientCredential (credSecret), bareCredential, mkSecret, unSecret)
import Ecluse.Core.Registry.Request (CredentialMapping, authorizationUnder, credentialMapping)
npmCredential :: CredentialMapping
npmCredential :: CredentialMapping
npmCredential = (RequestHeaders -> Maybe ClientCredential)
-> HeaderName
-> (ClientCredential -> ByteString)
-> CredentialMapping
credentialMapping RequestHeaders -> Maybe ClientCredential
recoverBearer HeaderName
hAuthorization ClientCredential -> ByteString
renderBearer
recoverBearer :: RequestHeaders -> Maybe ClientCredential
recoverBearer :: RequestHeaders -> Maybe ClientCredential
recoverBearer RequestHeaders
headers = do
token <- Text -> RequestHeaders -> Maybe Text
authorizationUnder Text
"bearer" RequestHeaders
headers
guard (not (T.null token))
pure (bareCredential (mkSecret token))
renderBearer :: ClientCredential -> ByteString
renderBearer :: ClientCredential -> ByteString
renderBearer ClientCredential
credential = ByteString
"Bearer " ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Text -> ByteString
forall a b. ConvertUtf8 a b => a -> b
encodeUtf8 (Secret -> Text
unSecret (ClientCredential -> Secret
credSecret ClientCredential
credential))