module Network.AWS.CloudFront.SignedCookies
(
createSignedCookies
, simplePolicy
, Policy (..)
, Resource (..)
, Lifespan (..)
, StartTime (..)
, EndTime (..)
, IpAddress (..)
, readPrivateKeyPemFile
, PemFilePath (..)
, KeyPairId (..)
, PrivateKey
, policyJSON
, jsonTextPolicy
, jsonValPolicy
, cookiePolicy
, CookiesText
, renderCookiesText
, PolicyCookie (..)
, SignatureCookie (..)
, NominalDiffTime
, POSIXTime
, nominalDay
, getPOSIXTime
, Text
) where
import Network.AWS.CloudFront.SignedCookies.Crypto
import Network.AWS.CloudFront.SignedCookies.Encoding
import Network.AWS.CloudFront.SignedCookies.Policy
import Network.AWS.CloudFront.SignedCookies.Types
import qualified Data.Aeson as A
import Control.Monad ((>=>))
import Data.Coerce (coerce)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text as Text
import Data.Time.Clock (nominalDay)
import Data.Time.Clock.POSIX (getPOSIXTime)
createSignedCookies
:: KeyPairId
-> PrivateKey
-> Policy
-> IO CookiesText
createSignedCookies :: KeyPairId -> PrivateKey -> Policy -> IO CookiesText
createSignedCookies KeyPairId
kpid PrivateKey
key Policy
policy = do
let
ByteString
policyBS :: ByteString = Policy -> ByteString
policyJSON Policy
policy
ByteString
sigBS <- PrivateKey -> ByteString -> IO ByteString
sign PrivateKey
key ByteString
policyBS
CookiesText -> IO CookiesText
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
[ ( Text
"CloudFront-Policy" , ByteString -> Text
base64Encode ByteString
policyBS )
, ( Text
"CloudFront-Signature" , ByteString -> Text
base64Encode ByteString
sigBS )
, ( Text
"CloudFront-Key-Pair-Id" , forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @KeyPairId @Text KeyPairId
kpid )
]
renderCookiesText :: CookiesText -> Text
renderCookiesText :: CookiesText -> Text
renderCookiesText =
[Text] -> Text
Text.unlines ([Text] -> Text) -> (CookiesText -> [Text]) -> CookiesText -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, Text) -> Text) -> CookiesText -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (\(Text
k, Text
v) -> Text
"Cookie: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
k Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
v)
cookiePolicy :: PolicyCookie -> Either String Policy
cookiePolicy :: PolicyCookie -> Either String Policy
cookiePolicy =
(Text -> Either String ByteString
base64Decode (Text -> Either String ByteString)
-> (PolicyCookie -> Text)
-> PolicyCookie
-> Either String ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @PolicyCookie @Text) (PolicyCookie -> Either String ByteString)
-> (ByteString -> Either String Policy)
-> PolicyCookie
-> Either String Policy
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=>
(ByteString -> Either String Value
forall a. FromJSON a => ByteString -> Either String a
A.eitherDecode' (ByteString -> Either String Value)
-> (ByteString -> ByteString) -> ByteString -> Either String Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.fromStrict) (ByteString -> Either String Value)
-> (Value -> Either String Policy)
-> ByteString
-> Either String Policy
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Value -> Either String Policy
jsonValPolicy