Commit 26f80b27 by Scott

Update Google reCAPTCHA plugin

Switch to new “no CAPTCHA”
parent 54dedd00
...@@ -23,39 +23,56 @@ ...@@ -23,39 +23,56 @@
class qa_recaptcha_captcha class qa_recaptcha_captcha
{ {
private $directory; private $directory;
private $errorCodeMessages;
public function load_module($directory, $urltoroot) public function load_module($directory, $urltoroot)
{ {
$this->directory=$directory; $this->directory = $directory;
// human-readable error messages (though these are not currently displayed anywhere)
$this->errorCodeMessages = array(
'missing-input-secret' => 'The secret parameter is missing.',
'invalid-input-secret' => 'The secret parameter is invalid or malformed.',
'missing-input-response' => 'The response parameter is missing.',
'invalid-input-response' => 'The response parameter is invalid or malformed.',
);
} }
public function admin_form() public function admin_form()
{ {
$saved=false; $saved = false;
if (qa_clicked('recaptcha_save_button')) { if (qa_clicked('recaptcha_save_button')) {
qa_opt('recaptcha_public_key', qa_post_text('recaptcha_public_key_field')); qa_opt('recaptcha_public_key', qa_post_text('recaptcha_public_key_field'));
qa_opt('recaptcha_private_key', qa_post_text('recaptcha_private_key_field')); qa_opt('recaptcha_private_key', qa_post_text('recaptcha_private_key_field'));
$saved=true; $saved = true;
} }
$form=array( $pub = trim(qa_opt('recaptcha_public_key'));
$pri = trim(qa_opt('recaptcha_private_key'));
$error = null;
if (!strlen($pub) || !strlen($pri)) {
require_once $this->directory.'recaptchalib.php';
$error = 'To use reCAPTCHA, you must <a href="'.qa_html(ReCaptcha::getSignupUrl()).'" target="_blank">sign up</a> to get these keys.';
}
$form = array(
'ok' => $saved ? 'reCAPTCHA settings saved' : null, 'ok' => $saved ? 'reCAPTCHA settings saved' : null,
'fields' => array( 'fields' => array(
'public' => array( 'public' => array(
'label' => 'reCAPTCHA public key:', 'label' => 'reCAPTCHA public key:',
'value' => qa_opt('recaptcha_public_key'), 'value' => $pub,
'tags' => 'name="recaptcha_public_key_field"', 'tags' => 'name="recaptcha_public_key_field"',
), ),
'private' => array( 'private' => array(
'label' => 'reCAPTCHA private key:', 'label' => 'reCAPTCHA private key:',
'value' => qa_opt('recaptcha_private_key'), 'value' => $pri,
'tags' => 'name="recaptcha_private_key_field"', 'tags' => 'name="recaptcha_private_key_field"',
'error' => $this->recaptcha_error_html(), 'error' => $error,
), ),
), ),
...@@ -70,67 +87,73 @@ class qa_recaptcha_captcha ...@@ -70,67 +87,73 @@ class qa_recaptcha_captcha
return $form; return $form;
} }
/**
public function recaptcha_error_html() * Only allow reCAPTCHA if the keys are set up (new reCAPTCHA has no special requirements)
{ */
if (!function_exists('fsockopen'))
return 'To use reCAPTCHA, the fsockopen() PHP function must be enabled on your server. Please check with your system administrator.';
elseif ( (!strlen(trim(qa_opt('recaptcha_public_key')))) || (!strlen(trim(qa_opt('recaptcha_private_key')))) ) {
require_once $this->directory.'recaptchalib.php';
$url=recaptcha_get_signup_url(@$_SERVER['HTTP_HOST'], qa_opt('site_title'));
return 'To use reCAPTCHA, you must <a href="'.qa_html($url).'">sign up</a> to get these keys.';
}
return null;
}
public function allow_captcha() public function allow_captcha()
{ {
return function_exists('fsockopen') && strlen(trim(qa_opt('recaptcha_public_key'))) && strlen(trim(qa_opt('recaptcha_private_key'))); $pub = trim(qa_opt('recaptcha_public_key'));
} $pri = trim(qa_opt('recaptcha_private_key'));
return strlen($pub) && strlen($pri);
}
/**
* Return HTML for reCAPTCHA, including non-JS fallback. New reCAPTCHA auto-detects the user's language.
*/
public function form_html(&$qa_content, $error) public function form_html(&$qa_content, $error)
{ {
require_once $this->directory.'recaptchalib.php'; $pub = qa_opt('recaptcha_public_key');
$language=qa_opt('site_language'); $htmlLines = array(
if (strpos('|en|nl|fr|de|pt|ru|es|tr|', '|'.$language.'|')===false) // supported as of 3/2010 // currently we cannot add async/defer attributes via $qa_content so we insert script here
$language='en'; '<script src="https://www.google.com/recaptcha/api.js" async defer></script>',
'<div class="g-recaptcha" data-sitekey="'.$pub.'"></div>',
$qa_content['script_lines'][]=array(
"var RecaptchaOptions={", // non-JS falback
"\ttheme:'white',", '<noscript>',
"\tlang:".qa_js($language), ' <div style="width: 302px; height: 352px;">',
"};", ' <div style="width: 302px; height: 352px; position: relative;">',
' <div style="width: 302px; height: 352px; position: absolute;">',
' <iframe src="https://www.google.com/recaptcha/api/fallback?k='.$pub.'"',
' frameborder="0" scrolling="no"',
' style="width: 302px; height:352px; border-style: none;">',
' </iframe>',
' </div>',
' <div style="width: 250px; height: 80px; position: absolute; border-style: none;',
' bottom: 21px; left: 25px; margin: 0px; padding: 0px; right: 25px;">',
' <textarea id="g-recaptcha-response" name="g-recaptcha-response"',
' class="g-recaptcha-response"',
' style="width: 250px; height: 80px; border: 1px solid #c1c1c1;',
' margin: 0px; padding: 0px; resize: none;" value=""></textarea>',
' </div>',
' </div>',
' </div>',
'</noscript>',
); );
return recaptcha_get_html(qa_opt('recaptcha_public_key'), $error, qa_is_https_probably()); return implode("\n", $htmlLines);
} }
/**
* Check that the CAPTCHA was entered correctly. reCAPTCHA sets a long string in 'g-recaptcha-response'
* when the CAPTCHA is completed; we check that with the reCAPTCHA API.
*/
public function validate_post(&$error) public function validate_post(&$error)
{ {
if ( (!empty($_POST['recaptcha_challenge_field'])) && (!empty($_POST['recaptcha_response_field'])) ) { require_once $this->directory.'recaptchalib.php';
require_once $this->directory.'recaptchalib.php';
$answer=recaptcha_check_answer( $recaptcha = new ReCaptcha(qa_opt('recaptcha_private_key'));
qa_opt('recaptcha_private_key'), $remoteIp = qa_remote_ip_address();
qa_remote_ip_address(), $userResponse = qa_post_text('g-recaptcha-response');
$_POST['recaptcha_challenge_field'],
$_POST['recaptcha_response_field']
);
if ($answer->is_valid) $recResponse = $recaptcha->verifyResponse($remoteIp, $userResponse);
return true;
$error=@$answer->error; foreach ($recResponse->errorCodes as $code) {
if (isset($this->errorCodeMessages[$code]))
$error .= $this->errorCodeMessages[$code] . "\n";
} }
return false; return $recResponse->success;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment