getPath( 'class', 'com_chronocontact' ) ); // the class name must be the same as the file name without the .php at the end class cf_recaptcha { //the next four fields must be defined for every plugin var $result_TITLE = "ReCaptcha verification"; var $result_TOOLTIP = "use the popular reCaptcha image verification in your form as simple as adding a {ReCaptcha} text in your form and enabling and configuring the plugin correctly, more details inside!"; var $plugin_name = "cf_recaptcha"; // must be the same as the class name var $event = "ONLOADONSUBMIT"; // must be defined and in Uppercase, should be ONSUBMIT or ONLOAD // the next function must exist and will have the backend config code function show_conf($row, $id, $form_id, $option) { global $mainframe; require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_chronocontact' .DS.'helpers'.DS.'plugin.php'); $helper = new ChronoContactHelperPlugin(); // identify and initialise the parameters used in this plugin $params_array = array( 'public_key' => '6LfNoAUAAAAAAKi8QZmjv-QHOvlGtyh509SG3FzG', 'private_key' => '6LfNoAUAAAAAABX7Dfw_9Pp4K4KVtKNCUHsIWG7O', 'ssl_server' => '0', 'theme' => 'red', 'lang' => 'en', 'api_server' => 'http://api.recaptcha.net', 'api_secure_server' => 'https://api-secure.recaptcha.net', 'verify_server' => 'api-verify.recaptcha.net', 'onsubmit' => 'before_email'); $params = $helper->loadParams($row, $params_array); ?>
startPane("cf_recaptcha"); echo $pane->startPanel( 'Configure', 'Configure' ); ?> createHeaderTD('Your ReCaptcha keys', '', true, array('colspan' => '4', 'class' => 'cf_header')); echo $helper->wrapTR($input); $tooltip = "Your ReCaptcha public key."; $input = $helper->createInputTD("ReCaptcha public key", 'params[public_key]', $params->get('public_key'), '', $attribs['input'], $tooltip); echo $helper->wrapTR($input, array('class' => 'cf_config')); $tooltip = "Your ReCaptcha private key."; $input = $helper->createInputTD("ReCaptcha private key", 'params[private_key]', $params->get('private_key'), '', $attribs['input'], $tooltip); echo $helper->wrapTR($input, array('class' => 'cf_config')); $input = $helper->createHeaderTD('Custom setup options', '', true, array('colspan' => '4', 'class' => 'cf_header')); echo $helper->wrapTR($input); $tooltip = "Check yes if you want to use the ReCaptcha SSL server."; $input = $helper->createYesNoTD('SSL server', 'params[ssl_server]', '', $params->get('ssl_server'), '', $tooltip ); echo $helper->wrapTR($input, array('class' => 'cf_config')); $tooltip = "Select one of the ReCaptcha themes."; $option_array = array('clean' => 'clean', 'red' => 'red', 'white' => 'white', 'blackglass' => 'blackglass', 'custom' => 'custom' ); foreach ($option_array as $k => $v ) { $option_array[$k] = JHTML::_('select.option', $k, JText::_($v)); } $input = $helper->createSelectTD('Theme', 'params[theme]', $option_array, $params->get('theme'), $attribs['select'], $tooltip ); echo $helper->wrapTR($input, array('class' => 'cf_config')); $tooltip = "Select one of the ReCaptcha supported languages."; $option_array = array('en' => 'English', 'nt' => 'Dutch', 'fr' => 'French', 'de' => 'German', 'pt' => 'Portuguese', 'ru' => 'Russian', 'es' => 'Spanish', 'tr' => 'Turkish'); foreach ($option_array as $k => $v ) { $option_array[$k] = JHTML::_('select.option', $k, JText::_($v)); } $input = $helper->createSelectTD('Language', 'params[lang]', $option_array, $params->get('lang'), $attribs['select'], $tooltip ); echo $helper->wrapTR($input, array('class' => 'cf_config')); ?>
endPanel(); echo $pane->startPanel( 'Advanced', 'advanced' ); ?> createHeaderTD('Advanced parameters - do not change', '', true, array('colspan' => '4', 'class' => 'cf_header')); echo $helper->wrapTR($input); $tooltip = "The full URL of the ReCaptcha standard api server. NB You should not normally need to change this."; $input = $helper->createInputTD("ReCaptcha server", 'params[api_server]', $params->get('api_server'), '', $attribs['input'], $tooltip); echo $helper->wrapTR($input, array('class' => 'cf_config')); $tooltip = "The full URL of the ReCaptcha SSL api server. NB You should not normally need to change this."; $input = $helper->createInputTD("ReCaptcha secure server", 'params[api_secure_server]', $params->get('api_secure_server'), '', $attribs['input'], $tooltip); echo $helper->wrapTR($input, array('class' => 'cf_config')); $tooltip = "The full URL of the ReCaptcha verify server. NB You should not normally need to change this."; $input = $helper->createInputTD("ReCaptcha verify server", 'params[verify_server]', $params->get('verify_server'), '', $attribs['input'], $tooltip); echo $helper->wrapTR($input, array('class' => 'cf_config')); ?>
$id, 'form_id' => $form_id, 'name' => $this->plugin_name, 'event' => $this->event, 'option' => $option, 'task' => 'save_conf' ); $hidden_array['params[onsubmit]'] = 'before_email'; echo $helper->createHiddenArray( $hidden_array ); echo $pane->endPanel(); echo $pane->startPanel( 'Help', 'help' ); ?>
Configure ReCaptcha plugin
The plugin allows you to use ReCaptcha form verification with your ChronoForms Form.
ReCAPTCHA is a completely independent verification system that is widely used on the Internet - see their site for more information.
  • The plugin comes with a pair of global ReCaptcha so that it will work immediately. For your own security we strongly recommend that you register at the ReCaptcha site and get your own keys limited to your site. Registration is simple, free and quick. When you have your keys copy and paste them over the keys here and re-save the plugin. You may use the same keys with any number of forms on your site.
  • You will need to include the ReCaptcha box in your form HTML using {ReCaptcha}. You can do this using a 'Text' item from the Toolbox with a value of {ReCaptcha}. You may need to editt the styling a little to format the box correctly (try removing the 'form_element' class from the surrounding div).
  • If your form is using SSL and the url has an 'https' prefix, set SSL Server to yes - otherwise leave it as No.
  • The theme list are those provided as default by ReCaptcha, it is possible to develop a custom theme - please see the instructions on the ReCaptcha FAQs and Wiki.
  • The languages listed are those provided as default by ReCaptcha, to change or add other languages please see the ReCaptcha site.
  • You should not need to change the server settings unless ReCaptcha make a change in their service.
  • Once this plugin is configured you must enable it in the Form 'Plugins'' tab.
endPane(); echo $pane->endPanel(); ?>
addStyleDeclaration($style); if ( $script ) $doc->addScriptDeclaration($script); } function onload( $option, $row, $params, $html_string ) { define('RECAPTCHA_API_SERVER', $params->get('api_server')); define('RECAPTCHA_API_SECURE_SERVER', $params->get('api_secure_server')); $recaptcha_load = "
".cf_recaptcha::recaptcha_get_html($params->get('public_key'))."
"; $script = " var RecaptchaOptions = { theme : '".$params->get('theme')."', lang : '".$params->get('lang')."' }; "; $doc =& JFactory::getDocument(); $doc->addScriptDeclaration($script); $html_string = str_replace("{ReCaptcha}", $recaptcha_load, $html_string); return $html_string; } function onsubmit( $option, $params, $plugin ) { define('RECAPTCHA_VERIFY_SERVER', $params->get('verify_server')); $MyForm =& CFChronoForm::getInstance(); $posted = JRequest::get( 'post' , JREQUEST_ALLOWRAW ); $resp = cf_recaptcha::recaptcha_check_answer( $params->get('private_key'), $_SERVER["REMOTE_ADDR"], JRequest::getVar("recaptcha_challenge_field"), JRequest::getVar("recaptcha_response_field") ); if ( !$resp->is_valid ) { global $mainframe;//, $errorfound, $stoprunning; $message = "The reCAPTCHA wasn't entered correctly. Go back and try it again
( reCAPTCHA said: ".$resp->error." )"; $MyForm->addErrorMsg($message); $MyForm->error_found = true; $MyForm->stoprunning = true; //$MyForm->showForm($MyForm->formrow->name, $posted); } } // this function must exist and may not be changed unless you need to customize something function save_conf( $option ) { require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_chronocontact' .DS.'helpers'.DS.'plugin.php'); $helper = new ChronoContactHelperPlugin(); $helper->save_conf($option); } //** below here is the ReCaptcha code - you should not need to change this //** the functions are called from inside this class using cf_recaptcha::functionName() /** * Gets the challenge HTML (javascript and non-javascript version). * This is called from the browser, and the resulting reCAPTCHA HTML widget * is embedded within the HTML form it was called from. * @param string $pubkey A public key for reCAPTCHA * @param string $error The error given by reCAPTCHA (optional, default is null) * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) * @return string - The HTML to be embedded in the user's form. */ function recaptcha_get_html($pubkey, $error = null, $use_ssl = false) { if ( $pubkey == null || $pubkey == '' ) { die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey"); } if ( $use_ssl ) { $server = RECAPTCHA_API_SECURE_SERVER; } else { $server = RECAPTCHA_API_SERVER; } $errorpart = ""; if ( $error ) { $errorpart = "&error=" . $error; } return ' '; } /** * Calls an HTTP POST function to verify if the user's guess was correct * @param string $privkey * @param string $remoteip * @param string $challenge * @param string $response * @param array $extra_params an array of extra variables to post to the server * @return ReCaptchaResponse */ function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) { if ( $privkey == null || $privkey == '' ) { die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey"); } if ( $remoteip == null || $remoteip == '' ) { die ("For security reasons, you must pass the remote ip to reCAPTCHA"); } //discard spam submissions if ( $challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { $recaptcha_response = new ReCaptchaResponse(); $recaptcha_response->is_valid = false; $recaptcha_response->error = 'incorrect-captcha-sol'; return $recaptcha_response; } $response = cf_recaptcha::_recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify", array ( 'privatekey' => $privkey, 'remoteip' => $remoteip, 'challenge' => $challenge, 'response' => $response ) + $extra_params ); $answers = explode ("\n", $response [1]); $recaptcha_response = new ReCaptchaResponse(); if (trim ($answers [0]) == 'true') { $recaptcha_response->is_valid = true; } else { $recaptcha_response->is_valid = false; $recaptcha_response->error = $answers [1]; } return $recaptcha_response; } function _recaptcha_http_post($host, $path, $data, $port = 80) { $req = cf_recaptcha::_recaptcha_qsencode ($data); $http_request = "POST $path HTTP/1.0\r\n"; $http_request .= "Host: $host\r\n"; $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; $http_request .= "Content-Length: " . strlen($req) . "\r\n"; $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; $http_request .= "\r\n"; $http_request .= $req; $response = ''; if ( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { die ('Could not open socket'); } fwrite($fs, $http_request); while ( !feof($fs) ) { $response .= fgets($fs, 1160); // One TCP-IP packet } fclose($fs); $response = explode("\r\n\r\n", $response, 2); return $response; } /** * Encodes the given data into a query string format * @param $data - array of string elements to be encoded * @return string - encoded request */ function _recaptcha_qsencode ($data) { $req = ""; foreach ( $data as $key => $value ) $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; // Cut the last '&' $req=substr($req, 0, strlen($req) - 1); return $req; } } /** * A ReCaptchaResponse is returned from recaptcha_check_answer() */ class ReCaptchaResponse { var $is_valid; var $error; } ?>