{-| This module contains functionality common among multiple back-ends. -} module Snap.Snaplet.Session.Common where import Numeric import Data.Serialize import qualified Data.Serialize as S import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as B import qualified Data.Text.Encoding as T import Data.Text (Text) import System.Random.MWC ------------------------------------------------------------------------------ -- | Generates a random salt of given length randomToken :: Int -> IO ByteString randomToken n = let mk :: GenIO -> IO Int mk gen = uniformR (0,15) gen in do is <- withSystemRandom $ \gen -> sequence . take n . repeat $ mk gen return . B.pack . concat . map (flip showHex "") $ is ------------------------------------------------------------------------------ -- | Generate a randomized CSRF token mkCSRFToken :: IO Text mkCSRFToken = T.decodeUtf8 `fmap` randomToken 40 instance Serialize Text where put = S.put . T.encodeUtf8 get = T.decodeUtf8 `fmap` S.get