danielebarchiesi@2: reCAPTCHA web service to improve the CAPTCHA system and protect email addresses.', array('@url' => url('https://www.google.com/recaptcha'))); danielebarchiesi@2: break; danielebarchiesi@2: case 'admin/help#recaptcha': danielebarchiesi@2: $output .= '

' . danielebarchiesi@2: t('Uses the reCAPTCHA web service to improve the CAPTCHA module and protect email addresses. For more information on what reCAPTCHA is, visit the official website.', array('@url' => url('https://www.google.com/recaptcha'))) . danielebarchiesi@2: '

' . danielebarchiesi@2: t('Configuration') . danielebarchiesi@2: '

' . danielebarchiesi@2: t('The settings associated with reCAPTCHA can be found in the reCAPTCHA tab, in the CAPTCHA settings. You must set your public and private reCAPTCHA keys in order to use the module. Once the public and private keys are set, visit the CAPTCHA settings, where you can choose where reCAPTCHA should be displayed.', array('@recaptchatab' => url('admin/user/captcha/recaptcha'), '@captchasettings' => url('admin/user/captcha'))) . danielebarchiesi@2: '

'; danielebarchiesi@2: break; danielebarchiesi@2: } danielebarchiesi@2: return $output; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_menu(). danielebarchiesi@2: */ danielebarchiesi@2: function recaptcha_menu() { danielebarchiesi@2: $items = array(); danielebarchiesi@2: $items['admin/config/people/captcha/recaptcha'] = array( danielebarchiesi@2: 'title' => 'reCAPTCHA', danielebarchiesi@2: 'description' => 'Administer the reCAPTCHA web service.', danielebarchiesi@2: 'page callback' => 'drupal_get_form', danielebarchiesi@2: 'page arguments' => array('recaptcha_admin_settings'), danielebarchiesi@2: 'access arguments' => array('administer recaptcha'), danielebarchiesi@2: 'type' => MENU_LOCAL_TASK, danielebarchiesi@2: 'file' => 'recaptcha.admin.inc', danielebarchiesi@2: ); danielebarchiesi@2: return $items; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_permission(). danielebarchiesi@2: */ danielebarchiesi@2: function recaptcha_permission() { danielebarchiesi@2: return array( danielebarchiesi@2: 'administer recaptcha' => array( danielebarchiesi@2: 'title' => t('reCaptcha Administration'), danielebarchiesi@2: 'description' => t('Administer reCaptcha settings'), danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_captcha(). danielebarchiesi@2: */ danielebarchiesi@2: function recaptcha_captcha() { danielebarchiesi@2: $args = func_get_args(); danielebarchiesi@2: $op = array_shift($args); danielebarchiesi@2: switch ($op) { danielebarchiesi@2: case 'list': danielebarchiesi@2: return array('reCAPTCHA'); danielebarchiesi@2: danielebarchiesi@2: case 'generate': danielebarchiesi@2: $captcha_type = array_shift($args); danielebarchiesi@2: $captcha = array(); danielebarchiesi@2: if ($captcha_type == 'reCAPTCHA') { danielebarchiesi@2: // Retrieve configuration variables. danielebarchiesi@2: $recaptcha_theme = variable_get('recaptcha_theme', 'red'); danielebarchiesi@2: $recaptcha_tabindex = variable_get('recaptcha_tabindex', NULL); danielebarchiesi@2: $recaptcha_public_key = variable_get('recaptcha_public_key', FALSE); danielebarchiesi@2: $recaptcha_ajax_api = variable_get('recaptcha_ajax_api', FALSE); danielebarchiesi@2: danielebarchiesi@3: // Test if reCAPTCHA can be used, falling back to Math if it is not danielebarchiesi@3: // configured, the library won't load, or the server is down. danielebarchiesi@3: if (!$recaptcha_public_key || !_recaptcha_load_library() || !_recaptcha_test_recaptcha_server()) { danielebarchiesi@2: return captcha_captcha('generate', 'Math', $args); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: if ($recaptcha_ajax_api) { danielebarchiesi@2: // By default CAPTCHA turns off page caching on any page where a danielebarchiesi@2: // CAPTCHA challenge appears. If recaptcha is using AJAX API, set danielebarchiesi@2: // caching back to its old state as stored in DB. danielebarchiesi@2: global $conf; danielebarchiesi@2: $conf['cache'] = unserialize(db_query("SELECT value FROM {variable} WHERE name = 'cache'")->fetchField()); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: $recaptcha_options = array( danielebarchiesi@2: 'theme' => $recaptcha_theme, danielebarchiesi@2: ); danielebarchiesi@2: danielebarchiesi@2: // Localization support. danielebarchiesi@2: global $language; danielebarchiesi@2: if (isset($language->language)) { danielebarchiesi@2: // reCAPTCHA uses two-character language codes, so 'pt-br' must be danielebarchiesi@2: // passed as 'pt'; cf. https://developers.google.com/recaptcha/docs/customization#i18n danielebarchiesi@2: $recaptcha_options['lang'] = drupal_substr($language->language, 0, 2); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Construct the Javascript, but only display it once. danielebarchiesi@2: static $_recaptcha_jsadded = FALSE; danielebarchiesi@2: if ($_recaptcha_jsadded == FALSE && $recaptcha_ajax_api == FALSE) { danielebarchiesi@2: $_recaptcha_jsadded = TRUE; danielebarchiesi@2: danielebarchiesi@2: // Add support to display the custom theme. danielebarchiesi@2: if ($recaptcha_theme == 'custom') { danielebarchiesi@2: $recaptcha_options['custom_theme_widget'] = 'recaptcha_custom_theme_widget'; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Set the default tab index. danielebarchiesi@2: if (!empty($recaptcha_tabindex)) { danielebarchiesi@2: $recaptcha_options['tabindex'] = $recaptcha_tabindex; danielebarchiesi@2: } danielebarchiesi@2: drupal_add_js('var RecaptchaOptions = ' . drupal_json_encode($recaptcha_options) . ';', array('type' => 'inline')); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Create the form. Captcha requires TRUE to be returned in solution. danielebarchiesi@2: $captcha['solution'] = TRUE; danielebarchiesi@2: $captcha['captcha_validate'] = 'recaptcha_captcha_validation'; danielebarchiesi@2: danielebarchiesi@2: // If 'Disable Client-Side Cookies' is set, then add query string to danielebarchiesi@2: // end of the public key string before passing to recaptchalib. danielebarchiesi@2: if (variable_get('recaptcha_nocookies', FALSE)) { danielebarchiesi@2: $recaptcha_public_key .= '&nocookie=1'; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: $captcha['form']['captcha_response'] = array( danielebarchiesi@2: '#type' => 'hidden', danielebarchiesi@2: '#value' => 'reCAPTCHA', danielebarchiesi@2: ); danielebarchiesi@2: danielebarchiesi@2: // Expose the form, either straight HTML, or using the AJAX API. danielebarchiesi@3: // Build the custom theme HTML if necessary. danielebarchiesi@3: $recaptcha_custom_html = ($recaptcha_theme == 'custom') ? theme('recaptcha_custom_widget') : ''; danielebarchiesi@2: if ($recaptcha_ajax_api == FALSE) { danielebarchiesi@3: // Only generate recaptcha_get_html() if we're not using the AJAX API. danielebarchiesi@3: $html = recaptcha_get_html($recaptcha_public_key, NULL, TRUE); danielebarchiesi@2: $captcha['form']['captcha_form'] = array( danielebarchiesi@2: '#type' => 'item', danielebarchiesi@3: '#markup' => (!empty($recaptcha_custom_html) ? '
' . $recaptcha_custom_html . '
' : '') . $html, danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: else { danielebarchiesi@2: $captcha['form']['captcha_form'] = array( danielebarchiesi@2: '#type' => 'item', danielebarchiesi@3: // Create the destination container, inserting any custom theme HTML danielebarchiesi@3: // necessary ($recaptcha_custom_html will be empty if we are not danielebarchiesi@3: // using custom theme). danielebarchiesi@3: '#markup' => '
' . $recaptcha_custom_html . '
', danielebarchiesi@2: ); danielebarchiesi@3: drupal_add_js('https://www.google.com/recaptcha/api/js/recaptcha_ajax.js', array('type' => 'external')); danielebarchiesi@2: $recaptcha_options['public_key'] = $recaptcha_public_key; danielebarchiesi@2: $recaptcha_options['container'] = 'recaptcha_ajax_api_container'; danielebarchiesi@2: drupal_add_js(array('recaptcha' => $recaptcha_options), 'setting'); danielebarchiesi@2: drupal_add_js(drupal_get_path('module', 'recaptcha') . '/recaptcha.js'); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: return $captcha; danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * @return boolean danielebarchiesi@2: * Whether or not the reCAPTCHA server is up. danielebarchiesi@2: */ danielebarchiesi@2: function _recaptcha_test_recaptcha_server() { danielebarchiesi@2: $test = TRUE; danielebarchiesi@2: $fs = @fsockopen(RECAPTCHA_VERIFY_SERVER, 80, $errno, $errstr, 10); danielebarchiesi@2: if (!$fs) { danielebarchiesi@2: $test = FALSE; danielebarchiesi@2: drupal_set_message(t('Unable to connect with the reCAPTCHA server (@server): @errno: @errstr', array( danielebarchiesi@2: '@server' => RECAPTCHA_VERIFY_SERVER, danielebarchiesi@2: '@errno' => $errno, danielebarchiesi@2: '@errstr' => $errstr, danielebarchiesi@2: )), 'error'); danielebarchiesi@2: } danielebarchiesi@2: fclose($fs); danielebarchiesi@2: return $test; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * CAPTCHA Callback; Validates the reCAPTCHA code. danielebarchiesi@2: */ danielebarchiesi@2: function recaptcha_captcha_validation($solution = NULL, $response = NULL) { danielebarchiesi@2: global $user; danielebarchiesi@2: $recaptcha_private_key = variable_get('recaptcha_private_key', FALSE); danielebarchiesi@2: $ip_address = ip_address(); danielebarchiesi@2: if ($recaptcha_private_key && $ip_address && $response === 'reCAPTCHA' && !empty($_POST['recaptcha_challenge_field']) && !empty($_POST['recaptcha_response_field']) && _recaptcha_test_recaptcha_server()) { danielebarchiesi@2: $resp = recaptcha_check_answer( danielebarchiesi@2: $recaptcha_private_key, danielebarchiesi@2: $ip_address, danielebarchiesi@2: check_plain($_POST['recaptcha_challenge_field']), danielebarchiesi@2: check_plain($_POST['recaptcha_response_field']) danielebarchiesi@2: ); danielebarchiesi@2: return $resp->is_valid; danielebarchiesi@2: } danielebarchiesi@2: return FALSE; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_theme(). danielebarchiesi@2: */ danielebarchiesi@2: function recaptcha_theme() { danielebarchiesi@2: return array( danielebarchiesi@2: 'recaptcha_custom_widget' => array( danielebarchiesi@2: 'arguments' => array(), danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Theme function: creates the custom themed recaptcha widget. danielebarchiesi@2: * danielebarchiesi@2: * @ingroup themeable danielebarchiesi@2: */ danielebarchiesi@2: function theme_recaptcha_custom_widget() { danielebarchiesi@2: $recaptcha_only_if_incorrect_sol = t('Incorrect please try again'); danielebarchiesi@2: $recaptcha_only_if_image_enter = t('Enter the words above:'); danielebarchiesi@2: $recaptcha_only_if_audio_enter = t('Enter the words you hear:'); danielebarchiesi@2: $recaptcha_get_another_captcha = t('Get another CAPTCHA'); danielebarchiesi@2: $recaptcha_only_if_image = t('Get an audio CAPTCHA'); danielebarchiesi@2: $recaptcha_only_if_audio = t('Get an image CAPTCHA'); danielebarchiesi@2: $help = t('Help'); danielebarchiesi@2: return << danielebarchiesi@2:
$recaptcha_only_if_incorrect_sol
danielebarchiesi@2: $recaptcha_only_if_image_enter danielebarchiesi@2: $recaptcha_only_if_audio_enter danielebarchiesi@2: danielebarchiesi@2:
$recaptcha_get_another_captcha
danielebarchiesi@2:
$recaptcha_only_if_image
danielebarchiesi@2:
$recaptcha_only_if_audio
danielebarchiesi@2:
$help
danielebarchiesi@2: EOT; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Load the recaptcha library. danielebarchiesi@2: */ danielebarchiesi@2: function _recaptcha_load_library() { danielebarchiesi@3: return module_load_include('php', 'recaptcha', 'recaptcha-php-1.11/recaptchalib'); danielebarchiesi@2: }