123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- <?php
- /**
- * Class used for numeral captchas
- *
- * PHP version 5
- *
- * @category Text
- * @package Text_CAPTCHA
- * @author David Coallier <davidc@agoraproduction.com>
- * @author Christian Wenz <wenz@php.net>
- * @author Michael Cramer <michael@bigmichi1.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @link http://pear.php.net/package/Text_CAPTCHA
- */
- /**
- * Class used for numeral captchas
- *
- * This class is intended to be used to generate numeral captchas as such as:
- * Example:
- * Give me the answer to "54 + 2" to prove that you are human.
- *
- * @category Text
- * @package Text_CAPTCHA
- * @author David Coallier <davidc@agoraproduction.com>
- * @author Christian Wenz <wenz@php.net>
- * @author Michael Cramer <michael@bigmichi1.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @link http://pear.php.net/package/Text_CAPTCHA
- */
- class Text_CAPTCHA_Driver_Numeral extends Text_CAPTCHA_Driver_Base
- {
- /**
- * This variable holds the minimum range value default set to "1".
- *
- * @var integer $_minValue The minimum value of the number range.
- */
- private $_minValue = 1;
- /**
- * This variable holds the maximum range value default set to "50".
- *
- * @var integer $_maxValue The maximum value of the number range.
- */
- private $_maxValue = 50;
- /**
- * The valid operators to use in the numeral captcha. We could use / and * but
- * not yet.
- *
- * @var array $_operators The operations for the captcha.
- */
- private $_operators = array('-', '+');
- /**
- * This variable is basically the operation that we're going to be using in the
- * numeral captcha we are about to generate.
- *
- * @var string $_operator The operation's operator to use.
- */
- private $_operator = '';
- /**
- * This variable holds the first number of the numeral operation we are about to
- * generate.
- *
- * @var integer $_firstNumber The first number of the operation.
- */
- private $_firstNumber = 0;
- /**
- * This variable holds the value of the second variable of the operation we are
- * about to generate for the captcha.
- *
- * @var integer $_secondNumber The second number of the operation.
- */
- private $_secondNumber = 0;
- /**
- * Initialize numeric CAPTCHA.
- *
- * @param array $options CAPTCHA options with these keys:<br>
- * minValue minimum value<br>
- * maxValue maximum value
- *
- * @return void
- */
- public function initDriver($options = array())
- {
- if (isset($options['minValue'])) {
- $this->_minValue = (int)$options['minValue'];
- } else {
- $this->_minValue = 1;
- }
- if (isset($options['maxValue'])) {
- $this->_maxValue = (int)$options['maxValue'];
- } else {
- $this->_maxValue = 50;
- }
- if (isset($options['operator'])) {
- $this->_operator = $options['operator'];
- } else {
- $this->_operator = '';
- }
- if (isset($options['firstValue'])) {
- $this->_firstNumber = (int)$options['firstValue'];
- } else {
- $this->_firstNumber = 0;
- }
- if (isset($options['secondValue'])) {
- $this->_secondNumber = (int)$options['secondValue'];
- } else {
- $this->_secondNumber = 0;
- }
- }
- /**
- * Create the CAPTCHA (the numeral expression).
- *
- * This function determines a random numeral expression and set the associated
- * class properties.
- *
- * @return void
- * @see _generateFirstNumber()
- * @see _generateSecondNumber()
- * @see _generateOperator()
- * @see _generateOperation()
- */
- public function createCAPTCHA()
- {
- if ($this->_firstNumber == 0) {
- $this->_firstNumber = $this->_generateNumber();
- }
- if ($this->_secondNumber == 0) {
- $this->_secondNumber = $this->_generateNumber();
- }
- if (empty($this->_operator)) {
- $this->_operator = $this->_operators[array_rand($this->_operators)];
- }
- $this->_generateOperation();
- }
- /**
- * Set operation.
- *
- * This variable sets the operation variable by taking the firstNumber,
- * secondNumber and operator.
- *
- * @return void
- * @see _operation
- * @see _firstNumber
- * @see _operator
- * @see _secondNumber
- */
- private function _setOperation()
- {
- $this->setCaptcha(
- $this->_firstNumber . ' ' . $this->_operator . ' ' . $this->_secondNumber
- );
- }
- /**
- * Generate a number.
- *
- * This function takes the parameters that are in the $this->_maxValue and
- * $this->_minValue and get the random number from them using mt_rand().
- *
- * @return integer Random value between _minValue and _maxValue
- * @see _minValue
- * @see _maxValue
- */
- private function _generateNumber()
- {
- return mt_rand($this->_minValue, $this->_maxValue);
- }
- /**
- * Adds values.
- *
- * This function will add the firstNumber and the secondNumber value and then
- * call setAnswer to set the answer value.
- *
- * @return void
- * @see _firstNumber
- * @see _secondNumber
- * @see _setAnswer()
- */
- private function _doAdd()
- {
- $phrase = $this->_firstNumber + $this->_secondNumber;
- $this->setPhrase($phrase);
- }
- /**
- * Does a subtract on the values.
- *
- * This function executes a subtraction on the firstNumber and the secondNumber
- * to then call $this->setAnswer to set the answer value.
- *
- * If the _firstNumber value is smaller than the _secondNumber value then we
- * regenerate the first number and regenerate the operation.
- *
- * @return void
- * @see _firstNumber
- * @see _secondNumber
- * @see _setOperation()
- * @see Text_CAPTCHA::setPhrase()
- */
- private function _doSubtract()
- {
- $first = $this->_firstNumber;
- $second = $this->_secondNumber;
- /**
- * Check if firstNumber is smaller than secondNumber
- */
- if ($first < $second) {
- $this->_firstNumber = $second;
- $this->_secondNumber = $first;
- $this->_setOperation();
- }
- $phrase = $this->_firstNumber - $this->_secondNumber;
- $this->setPhrase($phrase);
- }
- /**
- * Generate the operation
- *
- * This function will call the _setOperation() function to set the operation
- * string that will be called to display the operation, and call the function
- * necessary depending on which operation is set by this->operator.
- *
- * @return void
- * @see _setOperation()
- * @see _operator
- * @see _doAdd()
- * @see _doSubtract()
- */
- private function _generateOperation()
- {
- $this->_setOperation();
- switch ($this->_operator) {
- case '+':
- $this->_doAdd();
- break;
- case '-':
- $this->_doSubtract();
- break;
- default:
- $this->_operator = "+";
- $this->_setOperation();
- $this->_doAdd();
- break;
- }
- }
- /**
- * Create random CAPTCHA phrase. This method is a placeholder, since the equation
- * is created in createCAPTCHA()
- *
- * @return string
- */
- public function createPhrase()
- {
- $this->setCaptcha(null);
- }
- }
|