module Network.DomainAuth.SPF (
runSPF,
Limit (..),
defaultLimit,
) where
import Control.Exception as E
import Data.IP
import Network.DNS (Domain, Resolver)
import Network.DomainAuth.SPF.Eval
import Network.DomainAuth.SPF.Resolver
import Network.DomainAuth.Types
import System.IO.Error
runSPF :: Limit -> Resolver -> Domain -> IP -> IO DAResult
runSPF :: Limit -> Resolver -> Domain -> IP -> IO DAResult
runSPF Limit
lim Resolver
resolver Domain
dom IP
ip =
(Resolver -> Domain -> IP -> IO [IO SpfSeq]
resolveSPF Resolver
resolver Domain
dom IP
ip IO [IO SpfSeq] -> ([IO SpfSeq] -> IO DAResult) -> IO DAResult
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Limit -> IP -> [IO SpfSeq] -> IO DAResult
evalSPF Limit
lim IP
ip) IO DAResult -> (IOError -> IO DAResult) -> IO DAResult
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`E.catch` IOError -> IO DAResult
spfErrorHandle
spfErrorHandle :: IOError -> IO DAResult
spfErrorHandle :: IOError -> IO DAResult
spfErrorHandle IOError
e = case IOError -> String
ioeGetErrorString IOError
e of
String
"TempError" -> DAResult -> IO DAResult
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return DAResult
DATempError
String
"PermError" -> DAResult -> IO DAResult
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return DAResult
DAPermError
String
_ -> DAResult -> IO DAResult
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return DAResult
DANone