-}
module Crypto.Macaroon.Instances where
-import Control.Monad
+import Control.Monad
import Data.Byteable
-import qualified Data.ByteString as BS
+import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as B8
import Data.Hex
import Data.List
import Crypto.Macaroon
-
--- | Adjust the size parameter, by transforming it with the given
--- function.
-scale :: (Int -> Int) -> Gen a -> Gen a
-scale f g = sized (\n -> resize (f n) g)
-
newtype Url = Url { unUrl :: BS.ByteString } deriving (Show)
instance Arbitrary Url where
instance Arbitrary Identifier where
arbitrary = Identifier . B8.pack <$>(scale (*3) . listOf1 . elements $ ['a'..'z'])
+newtype EquationLike = EquationLike { unEqlike :: BS.ByteString } deriving (Show)
+
+instance Arbitrary EquationLike where
+ arbitrary = do
+ keylen <- choose (3,8)
+ key <- B8.pack <$> vectorOf keylen (elements ['a'..'z'])
+ val <- B8.pack <$> (scale (*3) . listOf1 . elements $ ['a'..'z'])
+ return $ EquationLike (BS.concat [ key, " = ", val])
+
+
data SimpleMac = SimpleMac { secret :: BS.ByteString, macaroon :: Macaroon } deriving Show
instance Arbitrary SimpleMac where
secret <- unSecret <$> arbitrary
location <- unUrl <$> arbitrary
ident <- unIdent <$> arbitrary
- return $ SimpleMac secret (create secret ident location)
+ fpcavs <- listOf arbitrary
+ let mac = foldl (flip addFirstPartyCaveat) (create secret ident location) (map unEqlike fpcavs)
+ return $ SimpleMac secret mac