View file application/libraries/Engine/Captcha/ReCaptcha2.php

File size: 4.75Kb
<?php

class Engine_Captcha_ReCaptcha2 extends Zend_Captcha_Base
{

  /**
   * ReCaptcha response field name
   * @var string
   */
  protected $_RESPONSE = 'g-recaptcha-response';

  /**
   * Recaptcha service object
   *
   * @var Engine_Service_ReCaptcha2
   */
  protected $_service;

  /**
   * Parameters defined by the service
   *
   * @var array
   */
  protected $_serviceParams = array();

  /**
   * Options defined by the service
   *
   * @var array
   */
  protected $_serviceAttributes = array();

  /*   * #@+
   * Error codes
   */

  const MISSING_VALUE = 'missingValue';
  const ERR_CAPTCHA = 'errCaptcha';
  const BAD_CAPTCHA = 'badCaptcha';

  /*   * #@- */

  /**
   * Error messages
   * @var array
   */
  protected $_messageTemplates = array(
    self::MISSING_VALUE => 'Missing captcha fields',
    self::ERR_CAPTCHA => 'Failed to validate captcha',
    self::BAD_CAPTCHA => 'Captcha value is wrong: %value%',
  );

  /**
   * Retrieve ReCaptcha Private key
   *
   * @return string
   */
  public function getPrivkey()
  {
    return $this->getService()->getPrivateKey();
  }

  /**
   * Retrieve ReCaptcha Public key
   *
   * @return string
   */
  public function getPubkey()
  {
    return $this->getService()->getPublicKey();
  }

  /**
   * Set ReCaptcha Private key
   *
   * @param string $privkey
   * @return Engine_Captcha_ReCaptcha2
   */
  public function setPrivkey($privkey)
  {
    $this->getService()->setPrivateKey($privkey);
    return $this;
  }

  /**
   * Set ReCaptcha public key
   *
   * @param string $pubkey
   * @return Engine_Captcha_ReCaptcha2
   */
  public function setPubkey($pubkey)
  {
    $this->getService()->setPublicKey($pubkey);
    return $this;
  }

  /**
   * Constructor
   *
   * @param array|Zend_Config $options
   */
  public function __construct($options = null)
  {
    $this->setService(new Engine_Service_ReCaptcha2());
    $this->_serviceParams = $this->getService()->getParams();
    $this->_serviceAttributes = $this->getService()->getAttributes();

    parent::__construct($options);

    if( $options instanceof Zend_Config ) {
      $options = $options->toArray();
    }
    if( !empty($options) ) {
      $this->setOptions($options);
    }
  }

  /**
   * Set service object
   *
   * @param  Engine_Service_ReCaptcha2 $service
   * @return Engine_Captcha_ReCaptcha2
   */
  public function setService(Engine_Service_ReCaptcha2 $service)
  {
    $this->_service = $service;
    return $this;
  }

  /**
   * Retrieve ReCaptcha service object
   *
   * @return Engine_Service_ReCaptcha2
   */
  public function getService()
  {
    return $this->_service;
  }

  /**
   * Set option
   *
   * If option is a service parameter, proxies to the service. The same
   * goes for any service options (distinct from service params)
   *
   * @param  string $key
   * @param  mixed $value
   * @return Zend_Captcha_ReCaptcha
   */
  public function setOption($key, $value)
  {
    $service = $this->getService();
    if( isset($this->_serviceParams[$key]) ) {
      $service->setParam($key, $value);
      return $this;
    }
    if( isset($this->_serviceAttributes[$key]) ) {
      $service->setAttribute($key, $value);
      return $this;
    }
    return parent::setOption($key, $value);
  }

  /**
   * Generate captcha
   *
   * @see Zend_Form_Captcha_Adapter::generate()
   * @return string
   */
  public function generate()
  {
    return "";
  }

  /**
   * Validate captcha
   *
   * @see    Zend_Validate_Interface::isValid()
   * @param  mixed      $value
   * @param  array|null $context
   * @return boolean
   */
  public function isValid($value, $context = null)
  {
    if( !is_array($value) && !is_array($context) ) {
      $this->_error(self::MISSING_VALUE);
      return false;
    }

    if( !is_array($value) && is_array($context) ) {
      $value = $context;
    }

    if( empty($value[$this->_RESPONSE]) ) {
      $this->_error(self::MISSING_VALUE);
      return false;
    }

    $service = $this->getService();

    $res = $service->verify($value[$this->_RESPONSE]);

    if( !$res ) {
      $this->_error(self::ERR_CAPTCHA);
      return false;
    }

    if( !$res->isValid() ) {
      $this->_error(self::BAD_CAPTCHA, $res->getErrorCodes());
      $service->setParam('error', $res->getErrorCodes());
      return false;
    }

    return true;
  }

  /**
   * Render captcha
   *
   * @param  Zend_View_Interface $view
   * @param  mixed $element
   * @return string
   */
  public function render(Zend_View_Interface $view = null, $element = null)
  {
    $name = null;
    if( $element instanceof Zend_Form_Element ) {
      $name = $element->getBelongsTo();
    }
    return $this->getService()->getHTML($name);
  }

  /**
   * Get captcha decorator
   *
   * @return string
   */
  public function getDecorator()
  {
    return "Captcha_ReCaptcha2";
  }
}