biscuit-haskell-0.2.0.0: src/Auth/Biscuit/Proto.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-|
Module : Auth.Biscuit.Proto
Copyright : © Clément Delafargue, 2021
License : MIT
Maintainer : clement@delafargue.name
Haskell data structures mapping the biscuit protobuf definitions
-}
module Auth.Biscuit.Proto
( Biscuit (..)
, SignedBlock (..)
, PublicKey (..)
, Algorithm (..)
, Proof (..)
, Block (..)
, FactV2 (..)
, RuleV2 (..)
, CheckV2 (..)
, PredicateV2 (..)
, TermV2 (..)
, ExpressionV2 (..)
, TermSet (..)
, Op (..)
, OpUnary (..)
, UnaryKind (..)
, OpBinary (..)
, BinaryKind (..)
, OpTernary (..)
, TernaryKind (..)
, getField
, putField
, decodeBlockList
, decodeBlock
, encodeBlockList
, encodeBlock
) where
import Data.ByteString (ByteString)
import Data.Int
import Data.ProtocolBuffers
import Data.Serialize
import Data.Text
import GHC.Generics (Generic)
data Biscuit = Biscuit
{ rootKeyId :: Optional 1 (Value Int32)
, authority :: Required 2 (Message SignedBlock)
, blocks :: Repeated 3 (Message SignedBlock)
, proof :: Required 4 (Message Proof)
} deriving (Generic, Show)
deriving anyclass (Decode, Encode)
data Proof =
ProofSecret (Required 1 (Value ByteString))
| ProofSignature (Required 2 (Value ByteString))
deriving (Generic, Show)
deriving anyclass (Decode, Encode)
data SignedBlock = SignedBlock
{ block :: Required 1 (Value ByteString)
, nextKey :: Required 2 (Message PublicKey)
, signature :: Required 3 (Value ByteString)
}
deriving (Generic, Show)
deriving anyclass (Decode, Encode)
data Algorithm = Ed25519
deriving stock (Show, Enum, Bounded)
data PublicKey = PublicKey
{ algorithm :: Required 1 (Enumeration Algorithm)
, key :: Required 2 (Value ByteString)
}
deriving (Generic, Show)
deriving anyclass (Decode, Encode)
data Block = Block {
symbols :: Repeated 1 (Value Text)
, context :: Optional 2 (Value Text)
, version :: Optional 3 (Value Int32)
, facts_v2 :: Repeated 4 (Message FactV2)
, rules_v2 :: Repeated 5 (Message RuleV2)
, checks_v2 :: Repeated 6 (Message CheckV2)
} deriving (Generic, Show)
deriving anyclass (Decode, Encode)
newtype FactV2 = FactV2
{ predicate :: Required 1 (Message PredicateV2)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data RuleV2 = RuleV2
{ head :: Required 1 (Message PredicateV2)
, body :: Repeated 2 (Message PredicateV2)
, expressions :: Repeated 3 (Message ExpressionV2)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype CheckV2 = CheckV2
{ queries :: Repeated 1 (Message RuleV2)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data PredicateV2 = PredicateV2
{ name :: Required 1 (Value Int64)
, terms :: Repeated 2 (Message TermV2)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data TermV2 =
TermVariable (Required 1 (Value Int32))
| TermInteger (Required 2 (Value Int64))
| TermString (Required 3 (Value Int64))
| TermDate (Required 4 (Value Int64))
| TermBytes (Required 5 (Value ByteString))
| TermBool (Required 6 (Value Bool))
| TermTermSet (Required 7 (Message TermSet))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype TermSet = TermSet
{ set :: Repeated 1 (Message TermV2)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
type CV2Id = Required 1 (Value Int32)
data ConstraintV2 =
CV2Int CV2Id (Required 2 (Message IntConstraintV2))
| CV2String CV2Id (Required 3 (Message StringConstraintV2))
| CV2Date CV2Id (Required 4 (Message DateConstraintV2))
| CV2Symbol CV2Id (Required 5 (Message SymbolConstraintV2))
| CV2Bytes CV2Id (Required 6 (Message BytesConstraintV2))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data IntConstraintV2 =
ICV2LessThan (Required 1 (Value Int64))
| ICV2GreaterThan (Required 2 (Value Int64))
| ICV2LessOrEqual (Required 3 (Value Int64))
| ICV2GreaterOrEqual (Required 4 (Value Int64))
| ICV2Equal (Required 5 (Value Int64))
| ICV2InSet (Required 6 (Message IntSet))
| ICV2NotInSet (Required 7 (Message IntSet))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype IntSet = IntSet
{ set :: Packed 7 (Value Int64)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data StringConstraintV2 =
SCV2Prefix (Required 1 (Value Text))
| SCV2Suffix (Required 2 (Value Text))
| SCV2Equal (Required 3 (Value Text))
| SCV2InSet (Required 4 (Message StringSet))
| SCV2NotInSet (Required 5 (Message StringSet))
| SCV2Regex (Required 6 (Value Text))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype StringSet = StringSet
{ set :: Repeated 1 (Value Text)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data DateConstraintV2 =
DCV2Before (Required 1 (Value Int64))
| DCV2After (Required 2 (Value Int64))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data SymbolConstraintV2 =
SyCV2InSet (Required 1 (Message SymbolSet))
| SyCV2NotInSet (Required 2 (Message SymbolSet))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype SymbolSet = SymbolSet
{ set :: Packed 1 (Value Int64)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data BytesConstraintV2 =
BCV2Equal (Required 1 (Value ByteString))
| BCV2InSet (Required 2 (Message BytesSet))
| BCV2NotInSet (Required 3 (Message BytesSet))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype BytesSet = BytesSet
{ set :: Repeated 1 (Value ByteString)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
newtype ExpressionV2 = ExpressionV2
{ ops :: Repeated 1 (Message Op)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data Op =
OpVValue (Required 1 (Message TermV2))
| OpVUnary (Required 2 (Message OpUnary))
| OpVBinary (Required 3 (Message OpBinary))
deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data UnaryKind = Negate | Parens | Length
deriving stock (Show, Enum, Bounded)
newtype OpUnary = OpUnary
{ kind :: Required 1 (Enumeration UnaryKind)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data BinaryKind =
LessThan
| GreaterThan
| LessOrEqual
| GreaterOrEqual
| Equal
| Contains
| Prefix
| Suffix
| Regex
| Add
| Sub
| Mul
| Div
| And
| Or
| Intersection
| Union
deriving stock (Show, Enum, Bounded)
newtype OpBinary = OpBinary
{ kind :: Required 1 (Enumeration BinaryKind)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
data TernaryKind =
VerifyEd25519Signature
deriving stock (Show, Enum, Bounded)
newtype OpTernary = OpTernary
{ kind :: Required 1 (Enumeration TernaryKind)
} deriving stock (Generic, Show)
deriving anyclass (Decode, Encode)
decodeBlockList :: ByteString
-> Either String Biscuit
decodeBlockList = runGet decodeMessage
decodeBlock :: ByteString
-> Either String Block
decodeBlock = runGet decodeMessage
encodeBlockList :: Biscuit -> ByteString
encodeBlockList = runPut . encodeMessage
encodeBlock :: Block -> ByteString
encodeBlock = runPut . encodeMessage