module Thentos.CookieSession.Types where
import Control.Lens (Getter)
import Control.Monad.State.Class (MonadState)
import "cryptonite" Crypto.Random (MonadRandom, getRandomBytes)
import Data.Aeson (FromJSON, ToJSON)
import Data.String.Conversions
import Data.String (IsString)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Servant.API (FromHttpApiData)
import qualified Codec.Binary.Base64 as Base64
import qualified Data.Text as ST
newtype ThentosSessionToken = ThentosSessionToken { fromThentosSessionToken :: ST }
deriving ( Eq, Ord, Show, Read, Typeable, Generic, IsString
, FromHttpApiData, FromJSON, ToJSON
)
class GetThentosSessionToken a where
getThentosSessionToken :: Getter a (Maybe ThentosSessionToken)
type MonadUseThentosSessionToken s m = (MonadState s m, GetThentosSessionToken s)
freshRandomName :: MonadRandom m => m ST
freshRandomName = ST.replace "/" "_" . cs . Base64.encode <$> getRandomBytes 18
freshSessionToken :: MonadRandom m => m ThentosSessionToken
freshSessionToken = ThentosSessionToken <$> freshRandomName