]> gitweb.factorcode.org Git - factor.git/commitdiff
furance.recaptcha: update to reCAPTCHA2 2049/head
authorBenjamin Pollack <benjamin@bitquabit.com>
Wed, 15 Aug 2018 00:07:04 +0000 (20:07 -0400)
committerBenjamin Pollack <benjamin@bitquabit.com>
Sat, 15 Sep 2018 00:58:52 +0000 (20:58 -0400)
basis/furnace/recaptcha/example/authors.txt
basis/furnace/recaptcha/example/example.factor
basis/furnace/recaptcha/example/example.xml
basis/furnace/recaptcha/recaptcha-docs.factor
basis/furnace/recaptcha/recaptcha-tests.factor
basis/furnace/recaptcha/recaptcha.factor

index 7c1b2f22790bfdca05f14a555a40b7eaa3ce2abd..28fd95c75e37a9cdabb4e2d0548ff8cae300f81b 100644 (file)
@@ -1 +1,2 @@
 Doug Coleman
+Benjamin Pollack
index 6c2acc541ea0574c460e57a861ec5b3968d33e8c..41ade9e96a26ed37373c682be9c58782f11493ce 100644 (file)
@@ -20,8 +20,8 @@ TUPLE: recaptcha-app < dispatcher recaptcha ;
 : <test-recaptcha> ( responder -- recaptcha )
     <recaptcha>
         "concatenative.org" >>domain
-        "6LeJWQgAAAAAAFlYV7SuBClE9uSpGtV_ZS-qVON7" >>public-key
-        "6LeJWQgAAAAAALh-XJgSSQ6xKygRgJ8-029Ip2Xv" >>private-key ;
+        "6LeJWQgAAAAAAFlYV7SuBClE9uSpGtV_ZS-qVON7" >>site-key
+        "6LeJWQgAAAAAALh-XJgSSQ6xKygRgJ8-029Ip2Xv" >>secret-key ;
 
 : <recaptcha-app> ( -- obj )
     \ recaptcha-app new-dispatcher
index 38ac6019e58e18200b7da19eca501e08f7e84c90..4a8ce13eba4e9790af117feca2b23854d334daba 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version='1.0' ?>
 <!DOCTYPE html>
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-<html><body><t:form t:action=""><t:recaptcha/></t:form></body></html>
+<html><body><t:form t:action=""><t:recaptcha/><input type="SUBMIT" value="Done" /></t:form></body></html>
 </t:chloe>
index 3d239799627fa90fd63221dc4090dfab9c66fdfb..2a4be14e1fa19682e9cbdf143b6d9a1c9389ced6 100644 (file)
@@ -36,7 +36,7 @@ $nl
 ARTICLE: "furnace.recaptcha" "Recaptcha support for Furnace"
 "The " { $vocab-link "furnace.recaptcha" } " vocabulary implements support for the recaptcha. Recaptcha is a web service that provides the user with a captcha, a test that is easy to solve by visual inspection, but hard to solve by writing a computer program. Use a captcha to protect forms from abusive users." $nl
 
-"The recaptcha responder is a " { $link filter-responder } " that wraps another responder. Set the " { $slot "domain" } ", " { $slot "public-key" } ", and " { $slot "private-key" } " slots of this responder to your recaptcha account information." $nl
+"The recaptcha responder is a " { $link filter-responder } " that wraps another responder. Set the " { $slot "domain" } ", " { $slot "site-key" } ", and " { $slot "secret-key" } " slots of this responder to your recaptcha account information." $nl
 
 "Wrapping a responder with recaptcha support:"
 { $subsections <recaptcha> }
index 7f18184eef13f14ea011101d0458cdbead9a96e5..ff0f4217b581ad77f8f14012420154f18d9233f7 100644 (file)
@@ -1,10 +1,5 @@
 USING: furnace.recaptcha.private tools.test urls ;
 IN: furnace.recaptcha.tests
 
-{
-    URL" http://www.google.com/recaptcha/api/challenge"
-    URL" https://www.google.com/recaptcha/api/challenge"
-} [
-    f recaptcha-url
-    t recaptcha-url
-] unit-test
+{ t f } [ "{\"success\": true, \"challenge_ts\": \"2018-09-14T21:12:17Z\", \"hostname\": \"localhost\"}" parse-recaptcha-response ] unit-test
+{ f { "invalid-input-secret" } } [ "{\"success\": false, \"error-codes\": [\"invalid-input-secret\"]}" parse-recaptcha-response ] unit-test
index fff1f61610c3bba25cfd921a881807b9a1e4720d..95a2caccf15e8d63fd7fa3d7150bcd8a4408c740 100644 (file)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors furnace.actions furnace.redirection html.forms
-html.templates.chloe.compiler html.templates.chloe.syntax
-http.client http.server http.server.filters io.sockets kernel
-locals namespaces sequences splitting urls validators
-xml.syntax furnace.conversations ;
+USING: accessors assocs furnace.actions furnace.conversations
+furnace.redirection html.forms html.templates.chloe.compiler
+html.templates.chloe.syntax http.client http.server
+http.server.filters io.sockets json.reader kernel locals
+namespaces sequences splitting urls validators xml.syntax ;
 IN: furnace.recaptcha
 
-TUPLE: recaptcha < filter-responder domain public-key private-key ;
+TUPLE: recaptcha < filter-responder domain secret-key site-key ;
 
 SYMBOL: recaptcha-error
 
@@ -21,61 +21,42 @@ M: recaptcha call-responder*
 
 <PRIVATE
 
-: (render-recaptcha) ( url -- xml )
-    dup
-    [XML
+: render-recaptcha ( recaptcha -- xml )
+    site-key>> [XML
         <script type="text/javascript"
-           src=<->>
+           src="https://www.google.com/recaptcha/api.js" async="async" defer="defer">
         </script>
 
-        <noscript>
-           <iframe src=<->
-               height="300" width="500" frameborder="0"></iframe><br/>
-           <textarea name="recaptcha_challenge_field" rows="3" cols="40">
-           </textarea>
-           <input type="hidden" name="recaptcha_response_field"
-               value="manual_challenge"/>
-        </noscript>
+        <div class="g-recaptcha" data-sitekey=<->></div>
     XML] ;
 
-: recaptcha-url ( secure? -- ? )
-    "https" "http" ? "://www.google.com/recaptcha/api/challenge" append
-    recaptcha-error cget [ "?error=" glue ] when* >url ;
-
-: render-recaptcha ( -- xml )
-    secure-connection? recaptcha-url
-    recaptcha get public-key>> "k" set-query-param (render-recaptcha) ;
-
 : parse-recaptcha-response ( string -- valid? error )
-    "\n" split first2 [ "true" = ] dip ;
+    json> [ "success" of ] [ "error-codes" of ] bi ;
 
-:: (validate-recaptcha) ( challenge response recaptcha -- valid? error )
-    recaptcha private-key>> :> private-key
+:: (validate-recaptcha) ( response recaptcha -- valid? error )
+    recaptcha secret-key>> :> secret-key
     remote-address get host>> :> remote-ip
     H{
-        { "challenge" challenge }
         { "response" response }
-        { "privatekey" private-key }
+        { "secret" secret-key }
         { "remoteip" remote-ip }
-    } URL" http://api-verify.recaptcha.net/verify"
+    } URL" https://www.google.com/recaptcha/api/siteverify"
     http-post nip parse-recaptcha-response ;
 
 : validate-recaptcha-params ( -- )
     {
-        { "recaptcha_challenge_field" [ v-required ] }
-        { "recaptcha_response_field" [ v-required ] }
+        { "g-recaptcha-response" [ v-required ] }
     } validate-params ;
 
 PRIVATE>
 
-CHLOE: recaptcha drop [ render-recaptcha ] [xml-code] ;
+CHLOE: recaptcha drop [ recaptcha get render-recaptcha ] [xml-code] ;
 
 : validate-recaptcha ( -- )
     begin-conversation
     validate-recaptcha-params
 
-    "recaptcha_challenge_field" value
-    "recaptcha_response_field" value
+    "g-recaptcha-response" value
     recaptcha get
     (validate-recaptcha)
     recaptcha-error cset