You are here

function recaptcha_captcha in reCAPTCHA 8

Same name and namespace in other branches
  1. 8.3 recaptcha.module \recaptcha_captcha()
  2. 8.2 recaptcha.module \recaptcha_captcha()
  3. 5.2 recaptcha.module \recaptcha_captcha()
  4. 6.2 recaptcha.module \recaptcha_captcha()
  5. 6 recaptcha.module \recaptcha_captcha()
  6. 7.2 recaptcha.module \recaptcha_captcha()
  7. 7 recaptcha.module \recaptcha_captcha()

Implements hook_captcha().

File

./recaptcha.module, line 76
Uses the reCAPTCHA web service to improve the CAPTCHA system.

Code

function recaptcha_captcha($op, $captcha_type = '') {
  switch ($op) {
    case 'list':
      return array(
        'reCAPTCHA',
      );
    case 'generate':
      $captcha = array();
      if ($captcha_type == 'reCAPTCHA') {

        // Retrieve configuration variables.
        $recaptcha_theme = variable_get('recaptcha_theme', 'red');
        $recaptcha_tabindex = variable_get('recaptcha_tabindex', NULL);
        $recaptcha_public_key = variable_get('recaptcha_public_key', FALSE);
        $recaptcha_ajax_api = variable_get('recaptcha_ajax_api', FALSE);

        // Test if reCAPTCHA can be used, falling back to Math if it is not
        // configured, the library won't load, or the server is down.
        if (!$recaptcha_public_key || !_recaptcha_load_library() || !_recaptcha_test_recaptcha_server()) {
          return captcha_captcha('generate', 'Math');
        }
        if ($recaptcha_ajax_api) {

          // By default CAPTCHA turns off page caching on any page where a
          // CAPTCHA challenge appears. If recaptcha is using AJAX API, set
          // caching back to its old state as stored in DB.
          global $conf;
          $conf['cache'] = unserialize(db_query("SELECT value FROM {variable} WHERE name = 'cache'")
            ->fetchField());
        }
        $recaptcha_options = array(
          'theme' => $recaptcha_theme,
        );

        // Localization support.
        global $language;
        if (isset($language->language)) {

          // reCAPTCHA uses two-character language codes, so 'pt-br' must be
          // passed as 'pt'; cf. https://developers.google.com/recaptcha/docs/customization#i18n
          $recaptcha_options['lang'] = drupal_substr($language->language, 0, 2);
        }

        // Construct the Javascript, but only display it once.
        static $_recaptcha_jsadded = FALSE;
        if ($_recaptcha_jsadded == FALSE && $recaptcha_ajax_api == FALSE) {
          $_recaptcha_jsadded = TRUE;

          // Add support to display the custom theme.
          if ($recaptcha_theme == 'custom') {
            $recaptcha_options['custom_theme_widget'] = 'recaptcha_custom_theme_widget';
          }

          // Set the default tab index.
          if (!empty($recaptcha_tabindex)) {
            $recaptcha_options['tabindex'] = $recaptcha_tabindex;
          }
          drupal_add_js('var RecaptchaOptions = ' . drupal_json_encode($recaptcha_options) . ';', array(
            'type' => 'inline',
          ));
        }

        // Create the form. Captcha requires TRUE to be returned in solution.
        $captcha['solution'] = TRUE;
        $captcha['captcha_validate'] = 'recaptcha_captcha_validation';

        // If 'Disable Client-Side Cookies' is set, then add query string to
        // end of the public key string before passing to recaptchalib.
        if (variable_get('recaptcha_nocookies', FALSE)) {
          $recaptcha_public_key .= '&nocookie=1';
        }
        $captcha['form']['captcha_response'] = array(
          '#type' => 'hidden',
          '#value' => 'reCAPTCHA',
        );

        // Expose the form, either straight HTML, or using the AJAX API.
        // Build the custom theme HTML if necessary.
        $recaptcha_custom_html = $recaptcha_theme == 'custom' ? theme('recaptcha_custom_widget') : '';
        if ($recaptcha_ajax_api == FALSE) {

          // Only generate recaptcha_get_html() if we're not using the AJAX API.
          $html = recaptcha_get_html($recaptcha_public_key, NULL, TRUE);
          $captcha['form']['captcha_form'] = array(
            '#type' => 'item',
            '#markup' => (!empty($recaptcha_custom_html) ? '<div id="recaptcha_custom_theme_widget">' . $recaptcha_custom_html . '</div>' : '') . $html,
          );
        }
        else {
          $captcha['form']['captcha_form'] = array(
            '#type' => 'item',
            // Create the destination container, inserting any custom theme HTML
            // necessary ($recaptcha_custom_html will be empty if we are not
            // using custom theme).
            '#markup' => '<div id="recaptcha_ajax_api_container">' . $recaptcha_custom_html . '</div>',
          );
          drupal_add_js('https://www.google.com/recaptcha/api/js/recaptcha_ajax.js', array(
            'type' => 'external',
          ));
          $recaptcha_options['public_key'] = $recaptcha_public_key;
          $recaptcha_options['container'] = 'recaptcha_ajax_api_container';
          drupal_add_js(array(
            'recaptcha' => $recaptcha_options,
          ), 'setting');
          drupal_add_js(drupal_get_path('module', 'recaptcha') . '/recaptcha.js');
        }
      }
      return $captcha;
  }
}