snaplet-recaptcha 1.0.1 → 1.0.2
raw patch · 2 files changed
+41/−24 lines, 2 filesdep ~snap
Dependency ranges changed: snap
Files
- snaplet-recaptcha.cabal +3/−3
- src/Snap/Snaplet/ReCaptcha.hs +38/−21
snaplet-recaptcha.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: snaplet-recaptcha-version: 1.0.1+version: 1.0.2 synopsis: A ReCAPTCHA verification snaplet with Heist integration and connection sharing. -- description: homepage: http://github.com/mikeplus64/snaplet-recaptcha@@ -22,8 +22,8 @@ build-depends: base < 5 , lens- , heist >= 0.14 && <0.15- , snap >= 0.13 && <0.14+ , heist >= 0.14 && < 0.15+ , snap >= 0.13 && < 0.15 , blaze-builder , MonadCatchIO-transformers , mtl
src/Snap/Snaplet/ReCaptcha.hs view
@@ -1,7 +1,8 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-} -- | -- Module : Snap.Snaplet.ReCaptcha -- Copyright : (c) Mike Ledger 2014@@ -31,6 +32,8 @@ , checkCaptcha , withCaptcha , getCaptcha+ , getCaptchaDiv+ , getCaptchaSiteKey -- * Types , Captcha(..) , PrivateKey@@ -40,29 +43,29 @@ , recaptchaScript, recaptchaDiv ) where -import qualified Blaze.ByteString.Builder as Blaze+import qualified Blaze.ByteString.Builder as Blaze import Control.Applicative import Control.Lens-import Control.Monad.Reader (runReaderT)+import Control.Monad.Reader (runReaderT) -import qualified Data.Aeson as JSON-import qualified Data.Aeson.TH as JSON-import qualified Data.ByteString.Char8 as BS-import qualified Data.Configurator as Conf-import Data.Text (Text)-import Data.Text.Encoding (encodeUtf8)+import qualified Data.Aeson as JSON+import qualified Data.Aeson.TH as JSON+import qualified Data.ByteString.Char8 as BS+import qualified Data.Configurator as Conf+import Data.Text (Text)+import Data.Text.Encoding (encodeUtf8) -import Data.Foldable (fold, for_, toList)-import Data.Monoid-import Data.Typeable+import Data.Foldable (fold, for_, toList)+import Data.Monoid+import Data.Typeable -import Heist-import Heist.Compiled+import Heist+import Heist.Compiled import qualified Network.HTTP.Client.Conduit as HTTP -import Snap-import Snap.Snaplet.Heist.Compiled+import Snap+import Snap.Snaplet.Heist.Compiled type PrivateKey = BS.ByteString type SiteKey = BS.ByteString@@ -86,6 +89,8 @@ data ReCaptcha = ReCaptcha { connectionManager :: !HTTP.Manager , recaptchaQuery :: !(UserIP -> UserAnswer -> HTTP.Request)+ , recaptchaHtmlDiv :: !Blaze.Builder+ , siteKey :: !SiteKey , _cstate :: !Captcha } deriving (Typeable) @@ -126,7 +131,9 @@ , ("response" , answer) , ("remoteip" , ip) ] req- , _cstate = Failure+ , recaptchaHtmlDiv = recaptchaDiv site+ , siteKey = site+ , _cstate = Failure } -- | Initialise the 'ReCaptcha' snaplet. You are required to have "site_key" and@@ -167,7 +174,7 @@ "recaptcha-div" ## pureSplice id (return (recaptchaDiv site)) "recaptcha-script" ## pureSplice id (return recaptchaScript) --- | @<script src='https://www.google.com/recaptcha/api.js' async defer></script> @+-- | @ \<script src='https://www.google.com/recaptcha/api.js' async defer\>\</script\> @ recaptchaScript :: Blaze.Builder recaptchaScript = Blaze.fromByteString "<script src='https://www.google.com/recaptcha/api.js' async defer></script>"@@ -177,6 +184,7 @@ recaptchaDiv site = Blaze.fromByteString $! "<div class='g-recaptcha' data-sitekey='" <> site <> "'></div>" + -- | Get the ReCaptcha result by querying Google's API. -- -- This requires a "g-recaptcha-response" (POST) parameter to be set in the@@ -269,3 +277,12 @@ where showTextList :: [Text] -> BS.ByteString showTextList = BS.intercalate "/" . map encodeUtf8++-- | Get the 'recaptchaDiv' for this 'ReCaptcha'. Useful inside a 'Handler'.+--+-- This is computed when the snaplet is first initialised.+getCaptchaDiv :: HasReCaptcha b => Handler b c Blaze.Builder+getCaptchaDiv = withTop' captchaLens (gets recaptchaHtmlDiv)++getCaptchaSiteKey :: HasReCaptcha b => Handler b c SiteKey+getCaptchaSiteKey = withTop' captchaLens (gets siteKey)