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)