1 ! Copyright (C) 2009 Doug Coleman.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs furnace.actions furnace.conversations
4 html.forms html.templates.chloe.compiler
5 html.templates.chloe.syntax http.client http.server
6 http.server.filters io.sockets json kernel namespaces urls
7 validators xml.syntax ;
10 TUPLE: recaptcha < filter-responder domain secret-key site-key ;
12 SYMBOL: recaptcha-error
14 : <recaptcha> ( responder -- recaptcha )
18 M: recaptcha call-responder*
20 responder>> call-responder ;
24 : render-recaptcha ( recaptcha -- xml )
26 <script type="text/javascript"
27 src="https://www.google.com/recaptcha/api.js" async="async" defer="defer">
30 <div class="g-recaptcha" data-sitekey=<->></div>
33 : parse-recaptcha-response ( string -- valid? error )
34 json> [ "success" of ] [ "error-codes" of ] bi ;
36 :: (validate-recaptcha) ( response recaptcha -- valid? error )
37 recaptcha secret-key>> :> secret-key
38 remote-address get host>> :> remote-ip
40 { "response" response }
41 { "secret" secret-key }
42 { "remoteip" remote-ip }
43 } URL" https://www.google.com/recaptcha/api/siteverify"
44 http-post nip parse-recaptcha-response ;
46 : validate-recaptcha-params ( -- )
48 { "g-recaptcha-response" [ v-required ] }
53 CHLOE: recaptcha drop [ recaptcha get render-recaptcha ] [xml-code] ;
55 : validate-recaptcha ( -- )
57 validate-recaptcha-params
59 "g-recaptcha-response" value
63 [ validation-failed ] unless ;