MDL-61600 recaptcha: Create a script to display recaptcha
authorDani Palou <dani@moodle.com>
Tue, 6 Mar 2018 15:05:55 +0000 (16:05 +0100)
committerDani Palou <dani@moodle.com>
Wed, 14 Mar 2018 09:31:09 +0000 (10:31 +0100)
lib/recaptchalib_v2.php
webservice/recaptcha.php [new file with mode: 0644]

index e14b345..b8e4837 100644 (file)
@@ -56,13 +56,16 @@ define('RECAPTCHA_VERIFY_URL', 'https://www.google.com/recaptcha/api/siteverify'
  * Google reCAPTCHA uses different language codes than Moodle so we must convert.
  * https://developers.google.com/recaptcha/docs/language
  *
+ * @param string $lang Language to use. If not provided, get current language.
  * @return string A language code
  */
-function recaptcha_lang() {
+function recaptcha_lang($lang = null) {
 
-    $mlang = current_language();
+    if (empty($lang)) {
+        $lang = current_language();
+    }
 
-    $glang = $mlang;
+    $glang = $lang;
     switch ($glang) {
         case 'en':
             $glang = 'en-GB';
@@ -87,8 +90,8 @@ function recaptcha_lang() {
             break;
     }
     // For any language code that didn't change reduce down to the base language.
-    if (($mlang === $glang) and (strpos($mlang, '_') !== false)) {
-        list($glang, $trash) = explode('_', $mlang, 2);
+    if (($lang === $glang) and (strpos($lang, '_') !== false)) {
+        list($glang, $trash) = explode('_', $lang, 2);
     }
     return $glang;
 }
@@ -100,9 +103,10 @@ function recaptcha_lang() {
  *
  * @param string $apiurl URL for reCAPTCHA API
  * @param string $pubkey The public key for reCAPTCHA
+ * @param string $lang Language to use. If not provided, get current language.
  * @return string - The HTML to be embedded in the user's form.
  */
-function recaptcha_get_challenge_html($apiurl, $pubkey) {
+function recaptcha_get_challenge_html($apiurl, $pubkey, $lang = null) {
     global $CFG, $PAGE;
 
     // To use reCAPTCHA you must have an API key.
@@ -117,7 +121,7 @@ function recaptcha_get_challenge_html($apiurl, $pubkey) {
             });
         }";
 
-    $lang = recaptcha_lang();
+    $lang = recaptcha_lang($lang);
     $apicode = "\n<script type=\"text/javascript\" ";
     $apicode .= "src=\"$apiurl?onload=recaptchacallback&render=explicit&hl=$lang\" async defer>";
     $apicode .= "</script>\n";
diff --git a/webservice/recaptcha.php b/webservice/recaptcha.php
new file mode 100644 (file)
index 0000000..1e2ad7a
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+
+/**
+ * A script to display a ReCaptcha for the site.
+ *
+ * ReCaptcha V2 is restricted by domain, so it cannot be displayed in mobile and desktop apps.
+ *
+ * This script will display and initialize the reCaptcha, setting some empty callbacks by default. The client can override
+ * those Javascript callbacks (in the "window" object).
+ *
+ * This script won't work in mobile and desktop apps unless $CFG->allowframembedding is enabled.
+ *
+ * @package    core_webservice
+ * @copyright  2018 Dani Palou
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+define('NO_MOODLE_COOKIES', true);
+
+require_once(__DIR__ . '/../config.php');
+
+$lang = optional_param('lang', '', PARAM_LANG);
+
+$content = '';
+
+// Check that reCAPTCHA is configured.
+if (!empty($CFG->recaptchapublickey) && !empty($CFG->recaptchaprivatekey)) {
+    require_once($CFG->libdir . '/recaptchalib_v2.php');
+
+    $apiurl = RECAPTCHA_API_URL;
+    $pubkey = $CFG->recaptchapublickey;
+
+    $jscode = "
+        // Create empty callbacks by default. They can be overridden by the client.
+        var recaptchacallback = function() {};
+        var recaptchaexpiredcallback = function() {};
+        var recaptchaerrorcallback = function() {};
+
+        var recaptchaloaded = function() {
+            grecaptcha.render('recaptcha_element', {
+                'sitekey' : '$pubkey',
+                'callback' : 'recaptchacallback',
+                'expired-callback' : 'recaptchaexpiredcallback',
+                'error-callback' : 'recaptchaerrorcallback'
+            });
+        }";
+
+    $lang = recaptcha_lang($lang);
+
+    $apicode = "\n<script type=\"text/javascript\" ";
+    $apicode .= "src=\"$apiurl?onload=recaptchaloaded&render=explicit&hl=$lang\" async defer>";
+    $apicode .= "</script>\n";
+
+    $content = html_writer::script($jscode, '');
+    $content .= html_writer::div('', 'recaptcha_element', array('id' => 'recaptcha_element'));
+    $content .= $apicode;
+} else {
+    // To use reCAPTCHA you must have an API key.
+    require_once($CFG->libdir . '/filelib.php');
+    send_header_404();
+    print_error('cannotusepage2');
+}
+
+$output = <<<OET
+<html>
+    <head>
+        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+    </head>
+    <body style="margin:0; padding:0">
+        $content
+    </body>
+</html>
+OET;
+echo $output;