https-everywhere-rules/src/Data/HTTPSEverywhere/Rules/Internal.hs

67 lines
2.6 KiB
Haskell
Raw Normal View History

2014-08-10 23:31:03 +02:00
{-# LANGUAGE CPP #-}
module Data.HTTPSEverywhere.Rules.Internal (
2014-08-10 01:16:57 +02:00
getRulesetsMatching,
havingRulesThatTrigger,
havingCookieRulesThatTrigger,
2014-08-10 23:31:03 +02:00
setSecureFlag,
#ifdef TEST
hasTargetMatching,
hasTriggeringRuleOn,
hasExclusionMatching
#endif
) where
2014-08-10 01:16:57 +02:00
import Prelude hiding (readFile, filter)
import Control.Applicative ((<*>), (<$>))
import Control.Lens ((&))
import Control.Monad ((<=<), join)
import Data.Bool (bool)
import Data.Functor.Infix ((<$$>))
2014-08-10 01:16:57 +02:00
import Data.List (find)
import Data.Maybe (isJust)
import qualified Data.HTTPSEverywhere.Rules.Raw as Raw (getRule, getRules)
import Network.HTTP.Client (Cookie(..))
import Network.URI (URI)
2014-08-24 06:40:06 +02:00
import Pipes (Pipe, Producer, for, each, await, yield, lift, (>->))
2014-08-10 01:16:57 +02:00
import Pipes.Prelude (filter)
import Data.HTTPSEverywhere.Rules.Internal.Parser (parseRuleSets)
2014-08-10 01:16:57 +02:00
import Data.HTTPSEverywhere.Rules.Internal.Types (RuleSet(..), Target(..), Exclusion(..), Rule(..), CookieRule(..))
getRulesets :: Producer RuleSet IO ()
2014-08-10 01:16:57 +02:00
getRulesets = lift Raw.getRules
>>= flip (for . each) (flip (for . each) yield <=< lift . (parseRuleSets <$$> Raw.getRule))
getRulesetsMatching :: URI -> Producer RuleSet IO ()
2014-08-10 01:16:57 +02:00
getRulesetsMatching url = getRulesets
>-> filter (flip hasTargetMatching url)
>-> filter (not . flip hasExclusionMatching url)
2014-08-24 06:40:06 +02:00
havingRulesThatTrigger :: URI -> Pipe RuleSet (Maybe URI) IO ()
havingRulesThatTrigger url = flip hasTriggeringRuleOn url <$> await
>>= maybe (havingRulesThatTrigger url) (yield . Just)
2014-08-10 01:16:57 +02:00
2014-08-24 06:40:06 +02:00
havingCookieRulesThatTrigger :: Cookie -> Pipe RuleSet Bool IO ()
2014-08-10 01:16:57 +02:00
havingCookieRulesThatTrigger cookie = flip hasTriggeringCookieRuleOn cookie <$> await
2014-08-24 06:40:06 +02:00
>>= bool (havingCookieRulesThatTrigger cookie) (yield True)
2014-08-10 01:16:57 +02:00
hasTargetMatching :: RuleSet -> URI -> Bool
2014-08-10 01:16:57 +02:00
hasTargetMatching ruleset url = getTargets ruleset <*> [url] & or
where getTargets = getTarget <$$> ruleSetTargets
hasExclusionMatching :: RuleSet -> URI -> Bool
2014-08-17 02:39:56 +02:00
hasExclusionMatching ruleset url = getExclusions ruleset <*> [url] & or
2014-08-10 01:16:57 +02:00
where getExclusions = getExclusion <$$> ruleSetExclusions
hasTriggeringRuleOn :: RuleSet -> URI -> Maybe URI -- Nothing ~ False
2014-08-10 01:16:57 +02:00
hasTriggeringRuleOn ruleset url = getRules ruleset <*> [url] & find isJust & join
where getRules = getRule <$$> ruleSetRules
hasTriggeringCookieRuleOn :: RuleSet -> Cookie -> Bool
hasTriggeringCookieRuleOn ruleset cookie = getCookieRules ruleset <*> [cookie] & or
where getCookieRules = getCookieRule <$$> ruleSetCookieRules
setSecureFlag :: Cookie -> Cookie
setSecureFlag cookie = cookie { cookie_secure_only = True }