version 3.3:

* added reCaptcha again (got too much spam)
This commit is contained in:
Vincent Ambo 2012-04-04 02:20:56 +02:00
parent 5b80f528c7
commit 3e16a443e6
5 changed files with 59 additions and 15 deletions

View file

@ -24,6 +24,7 @@ import Data.Time
import Data.SafeCopy (base, deriveSafeCopy)
import Happstack.Server hiding (Session)
import Happstack.Server.Compression
import Network.Captcha.ReCaptcha
import Options
import System.Locale (defaultTimeLocale)
@ -38,6 +39,8 @@ defineOptions "MainOptions" $ do
stringOption "optState" "statedir" "../"
"Directory in which the /BlogState dir is located.\
\ The default is ../ (if run from src/)"
stringOption "optCaptcha" "captchakey" ""
"The reCaptcha private key"
intOption "optPort" "port" 8000
"The port to run the web server on. Default is 8000"
@ -50,12 +53,12 @@ main = do
runCommand $ \opts args ->
bracket (openLocalStateFrom (optState opts ++ "BlogState") initialBlogState)
(createCheckpointAndClose)
(\acid -> simpleHTTP nullConf {port = optPort opts} $ tazBlog acid)
(\acid -> simpleHTTP nullConf {port = optPort opts} $ tazBlog acid $ optCaptcha opts)
tazBlog :: AcidState Blog -> ServerPart Response
tazBlog acid = do
tazBlog :: AcidState Blog -> String -> ServerPart Response
tazBlog acid captchakey = do
compr <- compressedResponseFilter
msum [ path $ \(lang :: BlogLang) -> blogHandler acid lang
msum [ path $ \(lang :: BlogLang) -> blogHandler acid lang captchakey
, nullDir >> showIndex acid DE
, dir " " $ nullDir >>
seeOther ("https://plus.google.com/115916629925754851590" :: Text) (toResponse ())
@ -87,12 +90,12 @@ tazBlog acid = do
, notFound $ toResponse $ showError NotFound DE
]
blogHandler :: AcidState Blog -> BlogLang -> ServerPart Response
blogHandler acid lang =
blogHandler :: AcidState Blog -> BlogLang -> String -> ServerPart Response
blogHandler acid lang captchakey =
msum [ path $ \(eId :: Integer) -> showEntry acid lang $ EntryId eId
, do decodeBody tmpPolicy
dir "postcomment" $ path $
\(eId :: Integer) -> addComment acid lang $ EntryId eId
\(eId :: Integer) -> addComment acid lang captchakey $ EntryId eId
, nullDir >> showIndex acid lang
, dir "rss" $ nullDir >> showRSS acid lang
, dir "rss.xml" $ nullDir >> showRSS acid lang
@ -134,15 +137,22 @@ showRSS acid lang = do
setHeaderM "content-type" "text/xml"
ok $ toResponse feed
addComment :: AcidState Blog -> BlogLang -> EntryId -> ServerPart Response
addComment acid lang eId = do
addComment :: AcidState Blog -> BlogLang -> String -> EntryId -> ServerPart Response
addComment acid lang captchakey eId = do
now <- liftIO $ getCurrentTime >>= return
nCtext <- lookText' "ctext"
nComment <- Comment <$> pure now
<*> lookText' "cname"
<*> pure (commentEscape nCtext)
update' acid (AddComment eId nComment)
seeOther ("/" ++ show lang ++ "/" ++ show eId) (toResponse())
-- captcha verification
challenge <- look "recaptcha_challenge_field"
response <- look "recaptcha_response_field"
(userIp, _) <- askRq >>= return . rqPeer
validation <- liftIO $ validateCaptcha captchakey userIp challenge response
case validation of
Right _ -> update' acid (AddComment eId nComment)
>> seeOther ("/" ++ show lang ++ "/" ++ show eId) (toResponse())
Left _ -> (liftIO $ putStrLn "Captcha failed") >> seeOther ("/" ++ show lang ++ "/" ++ show eId) (toResponse())
commentEscape :: Text -> Text
commentEscape = newlineEscape . ltEscape . gtEscape . ampEscape