'. t('The ASCII art CAPTCHA shows a random character code in ASCII art style. Example with current settings:') .'
'; $captcha = ascii_art_captcha_captcha('generate', 'ASCII art CAPTCHA'); $output .= $captcha['form']['ascii']['#value']; return $output; } } /** * Implementation of hook_menu(). */ function ascii_art_captcha_menu() { $items = array(); $items['admin/user/captcha/ascii_art_captcha'] = array( 'title' => 'ASCII art CAPTCHA', 'file' => 'ascii_art_captcha.admin.inc', 'page callback' => 'drupal_get_form', 'page arguments' => array('ascii_art_captcha_settings_form'), 'access arguments' => array('administer CAPTCHA settings'), 'type' => MENU_LOCAL_TASK, ); return $items; } /** * helper function for generating a code, taking the allowed characters into account */ function _ascii_art_captcha_get_allowed_characters() { $allowed_chars = array(); $allowed_chars_settings = variable_get('ascii_art_captcha_allowed_characters', array('upper' => 'upper', 'lower' => 'lower', 'digit' => 'digit')); if ($allowed_chars_settings['upper']) { $allowed_chars = array_merge($allowed_chars, array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z')); } if ($allowed_chars_settings['lower']) { $allowed_chars = array_merge($allowed_chars, array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')); } if ($allowed_chars_settings['digit']) { $allowed_chars += array_merge($allowed_chars, array('1', '2', '3', '4', '5', '6', '7', '8', '9')); } return $allowed_chars; } /** * Implementation of hook_captcha */ function ascii_art_captcha_captcha($op, $captcha_type='', $response='') { switch ($op) { case 'list': return array('ASCII art CAPTCHA'); case 'generate': if ($captcha_type == "ASCII art CAPTCHA") { // get settings $allowed_chars = _ascii_art_captcha_get_allowed_characters(); $code_length = (int) variable_get('ascii_art_captcha_code_length', 6); // load font $font_name = variable_get('ascii_art_captcha_font', 'standard'); if (!include_once('fonts/ascii_art_captcha_font_'. $font_name .'.inc')) { return; } $font = call_user_func('ascii_art_captcha_font_'. $font_name); if (!$font) { return; } // build solution and ASCII art array $solution = ''; $ascii_lines = array(); for ($i = 0; $i < $font['height']; $i++) { $ascii_lines[$i] = ''; } for ($i = 0; $i < $code_length; $i++) { $character = $allowed_chars[array_rand($allowed_chars)]; $solution .= $character; foreach ($font[$character] as $l => $cline) { $ascii_lines[$l] .= ' '. check_plain($cline); } } // build CAPTCHA array $captcha = array(); $captcha['solution'] = $solution; $style = 'line-height:1.1;'; if (variable_get('ascii_art_captcha_font_size', 0)) { $style .= 'font-size:'. variable_get('ascii_art_captcha_font_size', 0) .'pt;'; } $captcha['form']['ascii'] = array( '#type' => 'markup', '#value' => ''. implode('', ); $captcha['form']['captcha_response'] = array( '#type' => 'textfield', '#title' => t('Enter the code above'), '#size' => 10, '#maxlength' => 10, '#required' => TRUE, '#description' => t('Enter the code depicted in ASCII art style.') ); return $captcha; } break; } }
', $ascii_lines) .'