{-|
Description: Arrow interface for signing and verifying XML documents
-}

module Crypto.PubKey.Xml.Arrows where

import qualified Crypto.PubKey.Xml as X
import Crypto.PubKey.Xml.Errors

import Text.XML.HXT.Core
import Data.X509

-- | Filters out XML if key validation fails
isSigned :: (ArrowIOIf a) => PubKey -> a XmlTree XmlTree
isSigned :: PubKey -> a XmlTree XmlTree
isSigned PubKey
key = (XmlTree -> IO Bool) -> a XmlTree XmlTree
forall (a :: * -> * -> *) b. ArrowIOIf a => (b -> IO Bool) -> a b b
isIOA ((XmlTree -> IO Bool) -> a XmlTree XmlTree)
-> (XmlTree -> IO Bool) -> a XmlTree XmlTree
forall a b. (a -> b) -> a -> b
$ \ XmlTree
xml -> IO (Either XmlVerifyError Bool) -> IO Bool
forall a. IO (Either XmlVerifyError a) -> IO a
throwXmlError (IO (Either XmlVerifyError Bool) -> IO Bool)
-> IO (Either XmlVerifyError Bool) -> IO Bool
forall a b. (a -> b) -> a -> b
$ XmlTree -> PubKey -> IO (Either XmlVerifyError Bool)
forall (m :: * -> *).
MonadIO m =>
XmlTree -> PubKey -> m (Either XmlVerifyError Bool)
X.verifyXml XmlTree
xml PubKey
key

-- | Filters out XML if key validation fails
isSignedPem :: (ArrowIOIf a) => FilePath -> a XmlTree XmlTree
isSignedPem :: FilePath -> a XmlTree XmlTree
isSignedPem FilePath
pem = (XmlTree -> IO Bool) -> a XmlTree XmlTree
forall (a :: * -> * -> *) b. ArrowIOIf a => (b -> IO Bool) -> a b b
isIOA ((XmlTree -> IO Bool) -> a XmlTree XmlTree)
-> (XmlTree -> IO Bool) -> a XmlTree XmlTree
forall a b. (a -> b) -> a -> b
$ \XmlTree
xml -> IO (Either XmlVerifyError Bool) -> IO Bool
forall a. IO (Either XmlVerifyError a) -> IO a
throwXmlError (IO (Either XmlVerifyError Bool) -> IO Bool)
-> IO (Either XmlVerifyError Bool) -> IO Bool
forall a b. (a -> b) -> a -> b
$ XmlTree -> FilePath -> IO (Either XmlVerifyError Bool)
forall (m :: * -> *).
MonadIO m =>
XmlTree -> FilePath -> m (Either XmlVerifyError Bool)
X.verifyXmlPem XmlTree
xml FilePath
pem