<?php /* Question2Answer by Gideon Greenspan and contributors http://www.question2answer.org/ File: qa-plugin/recaptcha-captcha/qa-recaptcha-captcha.php Version: See define()s at top of qa-include/qa-base.php Description: Captcha module for reCAPTCHA This program 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 2 of the License, or (at your option) any later version. This program 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. More about this license: http://www.question2answer.org/license.php */ if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser header('Location: ../'); exit; } class qa_recaptcha_captcha { private $directory; public function load_module($directory, $urltoroot) { $this->directory=$directory; } public function admin_form() { $saved=false; if (qa_clicked('recaptcha_save_button')) { qa_opt('recaptcha_public_key', qa_post_text('recaptcha_public_key_field')); qa_opt('recaptcha_private_key', qa_post_text('recaptcha_private_key_field')); $saved=true; } $form=array( 'ok' => $saved ? 'reCAPTCHA settings saved' : null, 'fields' => array( 'public' => array( 'label' => 'reCAPTCHA public key:', 'value' => qa_opt('recaptcha_public_key'), 'tags' => 'name="recaptcha_public_key_field"', ), 'private' => array( 'label' => 'reCAPTCHA private key:', 'value' => qa_opt('recaptcha_private_key'), 'tags' => 'name="recaptcha_private_key_field"', 'error' => $this->recaptcha_error_html(), ), ), 'buttons' => array( array( 'label' => 'Save Changes', 'tags' => 'name="recaptcha_save_button"', ), ), ); return $form; } public function recaptcha_error_html() { 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() { return function_exists('fsockopen') && strlen(trim(qa_opt('recaptcha_public_key'))) && strlen(trim(qa_opt('recaptcha_private_key'))); } public function form_html(&$qa_content, $error) { require_once $this->directory.'recaptchalib.php'; $language=qa_opt('site_language'); if (strpos('|en|nl|fr|de|pt|ru|es|tr|', '|'.$language.'|')===false) // supported as of 3/2010 $language='en'; $qa_content['script_lines'][]=array( "var RecaptchaOptions={", "\ttheme:'white',", "\tlang:".qa_js($language), "};", ); return recaptcha_get_html(qa_opt('recaptcha_public_key'), $error, qa_is_https_probably()); } public function validate_post(&$error) { if ( (!empty($_POST['recaptcha_challenge_field'])) && (!empty($_POST['recaptcha_response_field'])) ) { require_once $this->directory.'recaptchalib.php'; $answer=recaptcha_check_answer( qa_opt('recaptcha_private_key'), qa_remote_ip_address(), $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field'] ); if ($answer->is_valid) return true; $error=@$answer->error; } return false; } } /* Omit PHP closing tag to help avoid accidental output */