{-# LANGUAGE OverloadedStrings #-}

module Network.DomainAuth.DK.Types where

import Data.ByteString (ByteString)
import qualified Data.Map as M
import Network.DNS
import Network.DomainAuth.Mail

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

-- | Canonicalized key for DomainKey-Signature:.
dkFieldKey :: CanonFieldKey
dkFieldKey :: CanonFieldKey
dkFieldKey = CanonFieldKey
"domainkey-signature"

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

data DkAlgorithm = DK_RSA_SHA1 deriving (DkAlgorithm -> DkAlgorithm -> Bool
(DkAlgorithm -> DkAlgorithm -> Bool)
-> (DkAlgorithm -> DkAlgorithm -> Bool) -> Eq DkAlgorithm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DkAlgorithm -> DkAlgorithm -> Bool
== :: DkAlgorithm -> DkAlgorithm -> Bool
$c/= :: DkAlgorithm -> DkAlgorithm -> Bool
/= :: DkAlgorithm -> DkAlgorithm -> Bool
Eq, Int -> DkAlgorithm -> ShowS
[DkAlgorithm] -> ShowS
DkAlgorithm -> String
(Int -> DkAlgorithm -> ShowS)
-> (DkAlgorithm -> String)
-> ([DkAlgorithm] -> ShowS)
-> Show DkAlgorithm
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DkAlgorithm -> ShowS
showsPrec :: Int -> DkAlgorithm -> ShowS
$cshow :: DkAlgorithm -> String
show :: DkAlgorithm -> String
$cshowList :: [DkAlgorithm] -> ShowS
showList :: [DkAlgorithm] -> ShowS
Show)
data DkCanonAlgo = DK_SIMPLE | DK_NOFWS deriving (DkCanonAlgo -> DkCanonAlgo -> Bool
(DkCanonAlgo -> DkCanonAlgo -> Bool)
-> (DkCanonAlgo -> DkCanonAlgo -> Bool) -> Eq DkCanonAlgo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DkCanonAlgo -> DkCanonAlgo -> Bool
== :: DkCanonAlgo -> DkCanonAlgo -> Bool
$c/= :: DkCanonAlgo -> DkCanonAlgo -> Bool
/= :: DkCanonAlgo -> DkCanonAlgo -> Bool
Eq, Int -> DkCanonAlgo -> ShowS
[DkCanonAlgo] -> ShowS
DkCanonAlgo -> String
(Int -> DkCanonAlgo -> ShowS)
-> (DkCanonAlgo -> String)
-> ([DkCanonAlgo] -> ShowS)
-> Show DkCanonAlgo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DkCanonAlgo -> ShowS
showsPrec :: Int -> DkCanonAlgo -> ShowS
$cshow :: DkCanonAlgo -> String
show :: DkCanonAlgo -> String
$cshowList :: [DkCanonAlgo] -> ShowS
showList :: [DkCanonAlgo] -> ShowS
Show)

-- data DkQuery = DK_DNS deriving (Eq,Show)
type DkFields = M.Map ByteString Bool -- Key Bool

-- | Abstract type for DomainKey-Signature:
data DK = DK
    { DK -> DkAlgorithm
dkAlgorithm :: DkAlgorithm
    , DK -> CanonFieldKey
dkSignature :: ByteString
    , DK -> DkCanonAlgo
dkCanonAlgo :: DkCanonAlgo
    , DK -> CanonFieldKey
dkDomain0 :: ByteString
    , DK -> Maybe DkFields
dkFields :: Maybe DkFields
    , --  , dkQuery     :: Maybe DkQuery -- gmail does not provide, sigh
      DK -> CanonFieldKey
dkSelector0 :: ByteString
    }
    deriving (DK -> DK -> Bool
(DK -> DK -> Bool) -> (DK -> DK -> Bool) -> Eq DK
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DK -> DK -> Bool
== :: DK -> DK -> Bool
$c/= :: DK -> DK -> Bool
/= :: DK -> DK -> Bool
Eq, Int -> DK -> ShowS
[DK] -> ShowS
DK -> String
(Int -> DK -> ShowS)
-> (DK -> String) -> ([DK] -> ShowS) -> Show DK
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DK -> ShowS
showsPrec :: Int -> DK -> ShowS
$cshow :: DK -> String
show :: DK -> String
$cshowList :: [DK] -> ShowS
showList :: [DK] -> ShowS
Show)

-- | Getting of the value of the \"d\" tag in DomainKey-Signature:.
dkDomain :: DK -> Domain
dkDomain :: DK -> CanonFieldKey
dkDomain = DK -> CanonFieldKey
dkDomain0

-- | Getting of the value of the \"s\" tag in DomainKey-Signature:.
dkSelector :: DK -> ByteString
dkSelector :: DK -> CanonFieldKey
dkSelector = DK -> CanonFieldKey
dkSelector0