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