1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors furnace.actions furnace.redirection html.forms
4 html.templates.chloe.compiler html.templates.chloe.syntax
5 http.client http.server http.server.filters io.sockets kernel
6 locals namespaces sequences splitting urls validators
7 xml.syntax furnace.conversations ;
10 TUPLE: recaptcha < filter-responder domain public-key private-key ;
12 SYMBOLS: recaptcha-valid? recaptcha-error ;
14 : <recaptcha> ( responder -- obj )
18 M: recaptcha call-responder*
20 responder>> call-responder ;
24 : (render-recaptcha) ( private-key -- xml )
26 [XML <script type="text/javascript"
32 height="300" width="500" frameborder="0"></iframe><br/>
33 <textarea name="recaptcha_challenge_field" rows="3" cols="40">
35 <input type="hidden" name="recaptcha_response_field"
36 value="manual_challenge"/>
40 : recaptcha-url ( secure? -- ? )
41 [ "https://api.recaptcha.net/challenge" ]
42 [ "http://api.recaptcha.net/challenge" ] if
43 recaptcha-error cget [ "?error=" glue ] when* >url ;
45 : render-recaptcha ( -- xml )
46 secure-connection? recaptcha-url
47 recaptcha get public-key>> "k" set-query-param (render-recaptcha) ;
49 : parse-recaptcha-response ( string -- valid? error )
50 "\n" split first2 [ "true" = ] dip ;
52 :: (validate-recaptcha) ( challenge response recaptcha -- valid? error )
53 recaptcha private-key>> :> private-key
54 remote-address get host>> :> remote-ip
56 { "challenge" challenge }
57 { "response" response }
58 { "privatekey" private-key }
59 { "remoteip" remote-ip }
60 } URL" http://api-verify.recaptcha.net/verify"
61 <post-request> http-request nip parse-recaptcha-response ;
64 drop [ render-recaptcha ] [xml-code] ;
68 : validate-recaptcha ( -- )
70 { "recaptcha_challenge_field" [ v-required ] }
71 { "recaptcha_response_field" [ v-required ] }
73 "recaptcha_challenge_field" value
74 "recaptcha_response_field" value
75 \ recaptcha get (validate-recaptcha)
76 [ recaptcha-valid? cset ] [ recaptcha-error cset ] bi* ;