packages feed

rpf-0.2.0: RPF/Types.hs

module RPF.Types where

import Network.DomainAuth
import RPF.IP
import RPF.Domain

type Pline = Int

----------------------------------------------------------------

data Action = A_Accept | A_Discard | A_Hold | A_Reject | A_Continue deriving (Eq, Enum, Bounded, Show)

{-
instance Show Action where
    show act = "\"" ++ actionWords !! fromEnum act ++ "\""
-}

actionWords :: [String]
actionWords = ["accept","discard","hold","reject","continue"]

----------------------------------------------------------------

data DataType = DT_Sig | DT_Res | DT_Dom | DT_IP deriving (Eq, Show)

type Variable = (DataType, VariableId)

data VariableId = V_SIGDKIM | V_SIGDK
                | V_SPF | V_SID | V_DKIM | V_DK | V_ADSP
                | V_MAILFROM | V_FROM | V_PRA | V_DKIMFROM | V_DKFROM
                | V_IP
                deriving (Eq, Enum, Bounded, Show)

{-
instance Show VariableId where
    show vid = "\"" ++ variableNames !! fromEnum vid ++ "\""
-}

variableNames :: [String]
variableNames = [ "sig_dkim", "sig_domainkeys"
                , "spf", "sender_id", "dkim", "domainkeys", "adsp"
                , "mail_from", "from", "pra", "dkim_from", "domainkeys_from"
                , "ip"
                ]

variableTypes :: [DataType]
variableTypes = [ DT_Sig, DT_Sig
                , DT_Res, DT_Res, DT_Res, DT_Res, DT_Res
                , DT_Dom, DT_Dom, DT_Dom, DT_Dom, DT_Dom
                , DT_IP
                ]

varSanity :: [(BlockName, [VariableId])]
varSanity = [(B_Connect,  [V_IP]),
             (B_MailFrom, [V_IP, V_MAILFROM, V_SPF]),
             (B_Header,   [V_IP, V_MAILFROM, V_SPF, V_FROM, V_PRA, V_SID, V_DKIMFROM, V_DKFROM, V_SIGDKIM, V_SIGDK]),
             (B_Body,     [V_IP, V_MAILFROM, V_SPF, V_FROM, V_PRA, V_SID, V_DKIMFROM, V_DKFROM, V_SIGDKIM, V_SIGDK, V_DKIM, V_DK, V_ADSP])]

resultSanity :: [(VariableId, [DAResult])]
resultSanity =  [(V_SPF,  [DANone, DANeutral, DAPass, DAPolicy, DAHardFail, DASoftFail, DATempError, DAPermError]),
                 (V_SID,  [DANone, DANeutral, DAPass, DAPolicy, DAHardFail, DASoftFail, DATempError, DAPermError]),
                 (V_DKIM, [DANone, DAPass, DAFail, DAPolicy, DANeutral, DATempError, DAPermError]),
                 (V_DK,   [DANone, DAPass, DAFail, DAPolicy, DANeutral, DATempError, DAPermError]),
                 (V_ADSP, [DANone, DAPass, DAUnknown, DAFail, DADiscard, DANxDomain, DATempError, DAPermError])]


----------------------------------------------------------------

resultWords :: [String]
resultWords = [
    "pass", "hardfail", "softfail", "neutral"
  , "fail", "temperror", "permerror", "none"
  , "policy", "nxdomain", "discard", "unknown"
  ]

----------------------------------------------------------------

data BlockName = B_Connect | B_MailFrom | B_Header | B_Body deriving (Eq, Enum, Bounded, Show)

blockNames :: [String]
blockNames = ["connect", "mail_from", "header", "body"]

{-
instance Show BlockName where
    show blknm = "\"" ++ blockNames !! fromEnum blknm ++ "\""
-}

----------------------------------------------------------------

noyes :: [String]
noyes = ["No", "Yes"]

----------------------------------------------------------------

type Constant = (DataType, ConstantValue)
data ConstantValue = CV_Index Int | CV_Result [DAResult] | CV_Sig Bool
                     deriving (Eq, Show)

----------------------------------------------------------------

data Policy = Policy [Block] [IPTable] [DomainTable] deriving (Eq, Show)
data Block = Block BlockName [ActionCond] deriving (Eq, Show)
data ActionCond = ActionCond Pline (Maybe Cond) Action deriving (Eq, Show)
data Cond = Variable :== Constant | Variable :!= Constant | Cond :&& Cond deriving (Eq, Show)