diff --git a/lib/recaptchalib_v2.php b/lib/recaptchalib_v2.php index e14b345a568..b8e4837d3a5 100644 --- a/lib/recaptchalib_v2.php +++ b/lib/recaptchalib_v2.php @@ -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\n"; diff --git a/webservice/recaptcha.php b/webservice/recaptcha.php new file mode 100644 index 00000000000..1e2ad7a29df --- /dev/null +++ b/webservice/recaptcha.php @@ -0,0 +1,89 @@ +. + + +/** + * 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\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 = << + + + + + $content + + +OET; +echo $output;