You are here

word_list_captcha.module in CAPTCHA Pack 8

Contains general functionality for the module.

File

text_captcha/modules/word_list_captcha/word_list_captcha.module
View source
<?php

/**
 * @file
 * Contains general functionality for the module.
 */
define('WORD_LIST_CAPTCHA_WORD_POOL1', 'green red blue yellow black white magenta cyan orange violet purple gold brown pink');
define('WORD_LIST_CAPTCHA_WORD_POOL2', 'bird elephant dog cat crocodile lion fish cow horse sheep frog beetle worm spider bat giraffe lizard goat monkey rabbit chimpanzee');

/**
 * Implements hook_help().
 */
function word_list_captcha_help($path, $arg) {
  switch ($path) {
    case 'admin/config/people/captcha/word_list_captcha':
      return '<p>' . t('The unrelated word CAPTCHA consists of a list of closely related words with one non-related word, which the user has to select. To generate this list, two word pools are needed: one for the related words and one for the non-related word.') . '</p>';
  }
}

/**
 * Helper function for generating a word list CAPTCHA.
 */
function _word_list_captcha_get_word_list_captcha($list_size) {
  if (mt_rand(0, 1)) {
    $normal_words = _text_captcha_word_pool_get_content('word_list_captcha_word_pool_1', NULL, WORD_LIST_CAPTCHA_WORD_POOL1, TRUE);
    $other_words = _text_captcha_word_pool_get_content('word_list_captcha_word_pool_2', NULL, WORD_LIST_CAPTCHA_WORD_POOL2, TRUE);
  }
  else {
    $normal_words = _text_captcha_word_pool_get_content('word_list_captcha_word_pool_2', NULL, WORD_LIST_CAPTCHA_WORD_POOL2, TRUE);
    $other_words = _text_captcha_word_pool_get_content('word_list_captcha_word_pool_1', NULL, WORD_LIST_CAPTCHA_WORD_POOL1, TRUE);
  }
  shuffle($normal_words);
  $word_list = array_slice($normal_words, 0, $list_size - 1);
  $wrong_word = $other_words[array_rand($other_words)];
  $word_list[] = $wrong_word;
  shuffle($word_list);
  return [
    $word_list,
    $wrong_word,
  ];
}

/**
 * Implements hook_captcha().
 */
function word_list_captcha_captcha($op, $captcha_type = '') {
  $config = \Drupal::config('word_list_captcha.settings');
  switch ($op) {
    case 'list':
      return [
        'Pick the unrelated word',
      ];
    case 'generate':
      if ($captcha_type == 'Pick the unrelated word') {
        $list_size = $config
          ->get('word_list_captcha_list_size');
        list($word_list, $wrong_word) = _word_list_captcha_get_word_list_captcha($list_size);

        // Build options list.
        $options = [];
        foreach ($word_list as $word) {
          $options[$word] = $word;
        }
        $captcha = [];
        $captcha['solution'] = $wrong_word;
        $captcha['form']['captcha_response'] = [
          '#type' => 'radios',
          '#title' => t('Which word does not belong to the list?'),
          '#options' => $options,
          // Extra class needed for additional CSS'ing of the options.
          '#attributes' => [
            'class' => [
              'text-captcha-word-list-radios',
            ],
          ],
          // TODO: the following needs to be ported to Drupal 6, which does not
          // Support DANGEROUS_SKIP_CHECK anymore
          //
          // The following entry '#DANGEROUS_SKIP_CHECK' is needed to prevent
          // that Drupal checks during validation phase if a submitted option
          // is in the list of possible options. (see includes/form.inc)
          // The options are randomly generated on each call and consequently
          // almost never the same during the generate phase and the validation
          // phase.
          //
          '#DANGEROUS_SKIP_CHECK' => TRUE,
          '#required' => TRUE,
          '#cache' => [
            'max-age' => 0,
          ],
        ];
        \Drupal::service('page_cache_kill_switch')
          ->trigger();

        // Add css to form.
        $captcha['form']['captcha_response']['#attached']['library'][] = 'text_captcha/base';
        return $captcha;
      }
  }
}

Functions

Namesort descending Description
word_list_captcha_captcha Implements hook_captcha().
word_list_captcha_help Implements hook_help().
_word_list_captcha_get_word_list_captcha Helper function for generating a word list CAPTCHA.

Constants

Namesort descending Description
WORD_LIST_CAPTCHA_WORD_POOL1 @file Contains general functionality for the module.
WORD_LIST_CAPTCHA_WORD_POOL2