123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <?php
- /* vim: set expandtab tabstop=4 shiftwidth=4: */
- /**
- * Common class for HTML_QuickForm elements to display a CAPTCHA
- *
- * The HTML_QuickForm_CAPTCHA package adds an element to the
- * HTML_QuickForm package to display a CAPTCHA question (image, riddle, etc...)
- *
- * This package requires the use of a PHP session ($_SESSION).
- *
- * PHP versions 4 and 5
- *
- * LICENSE:
- *
- * Copyright (c) 2006-2008, Philippe Jausions / 11abacus
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of 11abacus nor the names of its contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @category HTML
- * @package HTML_QuickForm_CAPTCHA
- * @author Philippe Jausions <Philippe.Jausions@11abacus.com>
- * @copyright 2006-2008 by Philippe Jausions / 11abacus
- * @license http://www.opensource.org/licenses/bsd-license.php New BSD
- * @version CVS: $Id: CAPTCHA.php,v 1.1 2008/04/26 23:27:28 jausions Exp $
- * @link http://pear.php.net/package/HTML_QuickForm_CAPTCHA
- */
- /**
- * Common class for HTML_QuickForm elements to display a CAPTCHA
- *
- * The HTML_QuickForm_CAPTCHA package adds an element to the
- * HTML_QuickForm package to display a CAPTCHA question (image, riddle, etc...)
- *
- * This package requires the use of a PHP session ($_SESSION).
- *
- * Because the CAPTCHA element is serialized in the PHP session,
- * you need to include the class declaration BEFORE the session starts.
- * So BEWARE if you have php.ini session.auto_start enabled, you won't be
- * able to use this element, unless you're also using PHP 5's __autoload()
- * or php.ini's unserialize_callback_func setting
- *
- * @category HTML
- * @package HTML_QuickForm_CAPTCHA
- * @author Philippe Jausions <Philippe.Jausions@11abacus.com>
- * @copyright 2006-2008 by Philippe Jausions / 11abacus
- * @license http://www.opensource.org/licenses/bsd-license.php New BSD
- * @version Release: 0.3.0
- * @link http://pear.php.net/package/HTML_QuickForm_CAPTCHA
- * @abstract
- */
- class HTML_QuickForm_CAPTCHA extends HTML_QuickForm_input
- {
- /**
- * Default options
- *
- * @var array
- * @access protected
- */
- var $_options = array(
- 'sessionVar' => '_HTML_QuickForm_CAPTCHA',
- 'phrase' => null,
- );
- /**
- * CAPTCHA driver
- *
- * @var string
- * @access protected
- */
- var $_CAPTCHA_driver;
- /**
- * Class constructor
- *
- * @param string $elementName Name
- * @param mixed $elementLabel Label for the CAPTCHA
- * @param array $options Options for the Text_CAPTCHA package
- * <ul>
- * <li>'sessionVar' (string) name of session variable containing
- * the Text_CAPTCHA instance (defaults to
- * _HTML_QuickForm_CAPTCHA.)</li>
- * <li>Other options depend on the driver used</li>
- * </ul>
- * @param mixed $attributes HTML Attributes for the <a> tag surrounding
- * the image. Can be a string or array.
- *
- * @access public
- */
- public function __construct(
- $elementName = null,
- $elementLabel = null,
- $options = null,
- $attributes = null
- ) {
- parent::__construct($elementName, $elementLabel, $attributes);
- $this->setType('CAPTCHA_'.$this->_CAPTCHA_driver);
- if (is_array($options)) {
- $this->_options = array_merge($this->_options, $options);
- }
- }
- /**
- * Initializes the CAPTCHA instance (if needed)
- *
- * @return boolean TRUE or PEAR_Error on error
- * @access protected
- */
- function _initCAPTCHA()
- {
- $sessionVar = $this->_options['sessionVar'];
- if (empty($_SESSION[$sessionVar])) {
- $_SESSION[$sessionVar] = Text_CAPTCHA::factory($this->_CAPTCHA_driver);
- if (PEAR::isError($_SESSION[$sessionVar])) {
- return $_SESSION[$sessionVar];
- }
- $result = $_SESSION[$sessionVar]->init($this->_options);
- if (PEAR::isError($result)) {
- return $result;
- }
- }
- return true;
- }
- /**
- * Returns the answer/phrase of the CAPTCHA
- *
- * @param mixed &$values Ignored by this element
- *
- * @return string
- * @access private
- */
- function _findValue(&$values)
- {
- return $this->getValue();
- }
- /**
- * Returns the answer/phrase of the CAPTCHA
- *
- * @return string
- * @access public
- */
- function getValue()
- {
- $sessionVar = $this->_options['sessionVar'];
- return (!empty($_SESSION[$sessionVar]))
- ? $_SESSION[$sessionVar]->getPhrase()
- : null;
- }
- /**
- * Returns the answer/phrase of the CAPTCHA
- *
- * @param mixed &$submitValues Ignored by this element
- * @param boolean $assoc Whether to return an array
- *
- * @return string
- * @access public
- */
- function exportValue(&$submitValues, $assoc = false)
- {
- return ($assoc)
- ? array($this->getName() => $this->getValue())
- : $this->getValue();
- }
- /**
- * Sets the CAPTCHA question/phrase
- *
- * Pass NULL or no argument for a random question/phrase to be generated
- *
- * @param string $phrase Value of the CAPTCHA to set
- *
- * @return void
- * @access public
- */
- function setPhrase($phrase = null)
- {
- $this->_options['phrase'] = $phrase;
- if (!empty($_SESSION[$this->_options['sessionVar']])) {
- $_SESSION[$this->_options['sessionVar']]->setPhrase($phrase);
- }
- }
- /**
- * Destroys the CAPTCHA instance to prevent reuse
- *
- * @return void
- * @access public
- */
- function destroy()
- {
- unset($_SESSION[$this->_options['sessionVar']]);
- }
- /**
- * Returns the HTML for the CAPTCHA
- *
- * This can be overwritten by sub-classes for specific output behavior
- * (for instance the Image CAPTCHA displays an image)
- *
- * @return string
- * @access public
- */
- function toHtml()
- {
- $result = $this->_initCAPTCHA();
- if (PEAR::isError($result)) {
- return $result;
- }
- $captcha = $_SESSION[$this->_options['sessionVar']]->getCAPTCHA();
- $attr = $this->_attributes;
- unset($attr['type']);
- unset($attr['value']);
- unset($attr['name']);
- $html = $this->_getTabs()
- . '<span' . $this->_getAttrString($attr) . '>'
- . htmlspecialchars($captcha)
- . '</span>';
- return $html;
- }
- }
|