* @author Christian Wenz * @todo define an obfuscation algorithm */ class Text_CAPTCHA_Driver_Figlet extends Text_CAPTCHA { /** * Text_Figlet object * * @access private * @var resource */ var $_fig; /** * Width of CAPTCHA * * @access private * @var int */ var $_width; /** * Figlet output string * * @access private * @var string */ var $_output_string; /** * Figlet font options * * @access private * @var array */ var $_fonts = array(); /** * Figlet font * * @access private * @var string */ var $_font; /** * Figlet font * * @access private * @var array */ var $_style = array(); /** * Output Format * * @access private * @var string */ var $_output; /** * Last error * * @access protected * @var PEAR_Error */ var $_error = null; /** * init function * * Initializes the new Text_CAPTCHA_Driver_Figlet object and creates a GD image * * @param array $options CAPTCHA options * @access public * @return mixed true upon success, PEAR error otherwise */ function init($options = array()) { if (is_array($options)) { if (!empty($options['output'])){ $this->_output = $options['output']; } else { $this->_output = 'html'; } if (isset($options['width']) && is_int($options['width'])) { $this->_width = $options['width']; } else { $this->_width = 200; } if (!empty($options['length'])){ $this->_length = $options['length']; } else { $this->_length = 6; } if (!isset($options['phrase']) || empty($options['phrase'])) { $this->_createPhrase($this->_length); } else { $this->_phrase = $options['phrase']; } } if (empty($options['options']) || !is_array($options['options'])){ die; } else { if (!empty($options['options']['style']) && is_array($options['options']['style'])){ $this->_style = $options['options']['style']; } if (empty($this->style['padding'])){ $this->_style['padding'] = '5px'; } if (!empty($options['options']['font_file'])){ if (is_array($options['options']['font_file'])){ $this->_font = $options['options']['font_file'][array_rand($options['options']['font_file'])]; } else { $this->_font = $options['options']['font_file']; } } } } /** * Create random CAPTCHA phrase * This method creates a random phrase * * @access private */ function _createPhrase() { $this->_phrase = Text_Password::create($this->_length); } /** * Create CAPTCHA image * * This method creates a CAPTCHA image * * @access private * @return void PEAR_Error on error */ function _createCAPTCHA() { $this->_fig = new Text_Figlet(); if (PEAR::isError($this->_fig->LoadFont($this->_font))){ $this->_error = PEAR::raiseError('Error loading Text_Figlet font'); return $this->_error; } $this->_output_string = $this->_fig->LineEcho($this->_phrase); } /** * Return CAPTCHA in the specified format * * This method returns the CAPTCHA depending on the output format * * @access public * @return mixed Formatted captcha or PEAR error */ function getCAPTCHA() { $retval = $this->_createCAPTCHA(); if (PEAR::isError($retval)) { return PEAR::raiseError($retval->getMessage()); } switch ($this->_output) { case 'text': return $this->_output_string; break; case 'html': return $this->getCAPTCHAAsHTML(); break; case 'javascript': return $this->getCAPTCHAAsJavascript(); break; } } /** * Return CAPTCHA as HTML * * This method returns the CAPTCHA as HTML * * @access public * @return mixed HTML Figlet image or PEAR error */ function getCAPTCHAAsHTML() { $retval = $this->_createCAPTCHA(); if (PEAR::isError($retval)) { return PEAR::raiseError($retval->getMessage()); } $charwidth = strpos($this->_output_string, "\n"); $data = str_replace("\n", '
', $this->_output_string); $textsize = ($this->_width / $charwidth) * 1.4; $css_output = ""; foreach ($this->_style as $key => $value){ $css_output .= "$key: $value;"; } $htmloutput = '
'; $htmloutput .= '
'. $data. '
'; return $htmloutput; } /** * Return CAPTCHA as Javascript version of HTML * * This method returns the CAPTCHA as a Javascript string * I'm not exactly sure what the point of doing this would be. * * @access public * @return mixed javascript string or PEAR error */ function getCAPTCHAAsJavascript() { $data = $this->getCAPTCHAAsHTML(); if (PEAR::isError($data)) { return PEAR::raiseError($data->getMessage()); } $obfus_data = rawurlencode($data); $javascript = ""; return $javascript; } }