@@ -1,11 +1,15 @@
1module Random.Token
2module Random.Token
3 , tokenToAscii
4 , tokenToAscii
4 , tokenToText
5 , tokenToText
5 , asciiToToken
6 , asciiToToken
6 , textToToken
7 , textToToken
8 , unsafeCoerceToken
8 , unsafeCoerceToken
11import Control.DeepSeq
15import Control.DeepSeq
@@ -20,9 +24,12 @@ import Data.Typeable
20import Test.QuickCheck.Arbitrary
24import Test.QuickCheck.Arbitrary
21import Web.HttpApiData
25import Web.HttpApiData
23import Crypto.Random as R
29import Crypto.Random as R
24import Database.PostgreSQL.Simple.FromField
30import Database.PostgreSQL.Simple.FromField
25import Database.PostgreSQL.Simple.ToField
31import Database.PostgreSQL.Simple.ToField
27-- | 16 bytes lenght random value parametrized by label.
34-- | 16 bytes lenght random value parametrized by label.
28newtype Token (a :: k) = Token ByteString
35newtype Token (a :: k) = Token ByteString
@@ -39,6 +46,7 @@ instance FromJSON (Token a) where
39instance ToJSON (Token a) where
46instance ToJSON (Token a) where
40 toJSON = toJSON . tokenToText
47 toJSON = toJSON . tokenToText
42instance forall a. (Typeable (Token a), Typeable a) => FromField (Token a) where
50instance forall a. (Typeable (Token a), Typeable a) => FromField (Token a) where
43 fromField fld bs = do
51 fromField fld bs = do
44 t <- fromField fld bs
52 t <- fromField fld bs
@@ -52,6 +60,8 @@ instance ToField (Token a) where
52generateToken :: (MonadRandom m) => m (Token a)
60generateToken :: (MonadRandom m) => m (Token a)
53generateToken = Token <$> R.getRandomBytes 16
61generateToken = Token <$> R.getRandomBytes 16
55instance FromHttpApiData (Token a) where
65instance FromHttpApiData (Token a) where
56 parseQueryParam = first T.pack . textToToken
66 parseQueryParam = first T.pack . textToToken
@@ -70,5 +80,8 @@ asciiToToken bs = Token <$> B64.decode bs
70textToToken :: Text -> Either String (Token a)
80textToToken :: Text -> Either String (Token a)
71textToToken = asciiToToken . T.encodeUtf8
81textToToken = asciiToToken . T.encodeUtf8
83+tokenWithContents :: Text -> Token a
84+tokenWithContents = Token . T.encodeUtf8
73unsafeCoerceToken :: Token a -> Token b
86unsafeCoerceToken :: Token a -> Token b
74unsafeCoerceToken (Token a) = Token a
87unsafeCoerceToken (Token a) = Token a