module JWT (init, Env, expirationSecs, jwks) where import Cherry.Prelude import qualified Data.ByteString as ByteString import qualified Jose.Jwk import qualified Json.Decode as D import qualified Interop import qualified Task import qualified Environment import qualified Result import qualified String import qualified Maybe import qualified File import qualified Data.Aeson as Aeson {-| -} data Env = Env { expirationSecs :: Int , jwks :: List Jose.Jwk.Jwk } {-| -} init :: Task String Env init = Task.map2 Env acquireExpirationSecs acquireJwks acquireJwks :: Task String (List Jose.Jwk.Jwk) acquireJwks = do path <- Environment.optional "JWK_PATH" contents <- File.read (Maybe.withDefault "secrets/jwk.sig" path) case decode (String.toByteString contents) of Ok jwks -> Task.succeed jwks Err err -> Task.fail err decode :: ByteString.ByteString -> Result.Result String (List Jose.Jwk.Jwk) decode file = Aeson.eitherDecodeStrict file |> Result.fromEither |> Result.mapError (\msg -> "Could not decode JWK file: " ++ String.fromList msg) acquireExpirationSecs :: Task String Int acquireExpirationSecs = do string <- Environment.optional "JWT_EXPIRATION_SECS" let secs = Maybe.withDefault defaultExpirationSecs (Maybe.andThen String.toInt string) Task.succeed secs defaultExpirationSecs :: Int defaultExpirationSecs = 2 * 60 * 60