false, /* Use SSL or not when generating the recaptcha */
'error' => null, /* The error message to display in the recaptcha */
'xhtml' => false /* Enable XHTML output (this will not be XHTML Strict
compliant since the IFRAME is necessary when
Javascript is disabled) */
);
/**
* Options for tailoring reCaptcha
*
* See the different options on http://recaptcha.net/apidocs/captcha/client.html
*
* @var array
*/
protected $_options = array(
'theme' => 'red',
'lang' => 'en',
);
/**
* Response from the verify server
*
* @var Zend_Service_ReCaptcha_Response
*/
protected $_response = null;
/**
* Class constructor
*
* @param string $publicKey
* @param string $privateKey
* @param array $params
* @param array $options
* @param string $ip
* @param array|Zend_Config $params
*/
public function __construct($publicKey = null, $privateKey = null,
$params = null, $options = null, $ip = null)
{
if ($publicKey !== null) {
$this->setPublicKey($publicKey);
}
if ($privateKey !== null) {
$this->setPrivateKey($privateKey);
}
if ($ip !== null) {
$this->setIp($ip);
} else if (isset($_SERVER['REMOTE_ADDR'])) {
$this->setIp($_SERVER['REMOTE_ADDR']);
}
if ($params !== null) {
$this->setParams($params);
}
if ($options !== null) {
$this->setOptions($options);
}
}
/**
* Serialize as string
*
* When the instance is used as a string it will display the recaptcha.
* Since we can't throw exceptions within this method we will trigger
* a user warning instead.
*
* @return string
*/
public function __toString()
{
try {
$return = $this->getHtml();
} catch (Exception $e) {
$return = '';
trigger_error($e->getMessage(), E_USER_WARNING);
}
return $return;
}
/**
* Set the ip property
*
* @param string $ip
* @return Zend_Service_ReCaptcha
*/
public function setIp($ip)
{
$this->_ip = $ip;
return $this;
}
/**
* Get the ip property
*
* @return string
*/
public function getIp()
{
return $this->_ip;
}
/**
* Set a single parameter
*
* @param string $key
* @param string $value
* @return Zend_Service_ReCaptcha
*/
public function setParam($key, $value)
{
$this->_params[$key] = $value;
return $this;
}
/**
* Set parameters
*
* @param array|Zend_Config $params
* @return Zend_Service_ReCaptcha
* @throws Zend_Service_ReCaptcha_Exception
*/
public function setParams($params)
{
if ($params instanceof Zend_Config) {
$params = $params->toArray();
}
if (is_array($params)) {
foreach ($params as $k => $v) {
$this->setParam($k, $v);
}
} else {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception(
'Expected array or Zend_Config object'
);
}
return $this;
}
/**
* Get the parameter array
*
* @return array
*/
public function getParams()
{
return $this->_params;
}
/**
* Get a single parameter
*
* @param string $key
* @return mixed
*/
public function getParam($key)
{
return $this->_params[$key];
}
/**
* Set a single option
*
* @param string $key
* @param string $value
* @return Zend_Service_ReCaptcha
*/
public function setOption($key, $value)
{
$this->_options[$key] = $value;
return $this;
}
/**
* Set options
*
* @param array|Zend_Config $options
* @return Zend_Service_ReCaptcha
* @throws Zend_Service_ReCaptcha_Exception
*/
public function setOptions($options)
{
if ($options instanceof Zend_Config) {
$options = $options->toArray();
}
if (is_array($options)) {
foreach ($options as $k => $v) {
$this->setOption($k, $v);
}
} else {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception(
'Expected array or Zend_Config object'
);
}
return $this;
}
/**
* Get the options array
*
* @return array
*/
public function getOptions()
{
return $this->_options;
}
/**
* Get a single option
*
* @param string $key
* @return mixed
*/
public function getOption($key)
{
return $this->_options[$key];
}
/**
* Get the public key
*
* @return string
*/
public function getPublicKey()
{
return $this->_publicKey;
}
/**
* Set the public key
*
* @param string $publicKey
* @return Zend_Service_ReCaptcha
*/
public function setPublicKey($publicKey)
{
$this->_publicKey = $publicKey;
return $this;
}
/**
* Get the private key
*
* @return string
*/
public function getPrivateKey()
{
return $this->_privateKey;
}
/**
* Set the private key
*
* @param string $privateKey
* @return Zend_Service_ReCaptcha
*/
public function setPrivateKey($privateKey)
{
$this->_privateKey = $privateKey;
return $this;
}
/**
* Get the HTML code for the captcha
*
* This method uses the public key to fetch a recaptcha form.
*
* @return string
* @throws Zend_Service_ReCaptcha_Exception
*/
public function getHtml()
{
if ($this->_publicKey === null) {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception('Missing public key');
}
$host = self::API_SERVER;
if ((bool) $this->_params['ssl'] === true) {
$host = self::API_SECURE_SERVER;
}
$htmlBreak = '
';
$htmlInputClosing = '>';
if ((bool) $this->_params['xhtml'] === true) {
$htmlBreak = '
';
$htmlInputClosing = '/>';
}
$errorPart = '';
if (!empty($this->_params['error'])) {
$errorPart = '&error=' . urlencode($this->_params['error']);
}
$reCaptchaOptions = '';
if (!empty($this->_options)) {
$encoded = Zend_Json::encode($this->_options);
$reCaptchaOptions = <<
SCRIPT;
}
$return = $reCaptchaOptions;
$return .= <<
HTML;
$return .= <<
{$htmlBreak}
HTML;
return $return;
}
/**
* Post a solution to the verify server
*
* @param string $challengeField
* @param string $responseField
* @return Zend_Http_Response
* @throws Zend_Service_ReCaptcha_Exception
*/
protected function _post($challengeField, $responseField)
{
if ($this->_privateKey === null) {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception('Missing private key');
}
if ($this->_ip === null) {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception('Missing ip address');
}
if (empty($challengeField)) {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception('Missing challenge field');
}
if (empty($responseField)) {
/** @see Zend_Service_ReCaptcha_Exception */
#require_once 'Zend/Service/ReCaptcha/Exception.php';
throw new Zend_Service_ReCaptcha_Exception('Missing response field');
}
/* Fetch an instance of the http client */
$httpClient = self::getHttpClient();
$postParams = array('privatekey' => $this->_privateKey,
'remoteip' => $this->_ip,
'challenge' => $challengeField,
'response' => $responseField);
/* Make the POST and return the response */
return $httpClient->setUri(self::VERIFY_SERVER)
->setParameterPost($postParams)
->request(Zend_Http_Client::POST);
}
/**
* Verify the user input
*
* This method calls up the post method and returns a
* Zend_Service_ReCaptcha_Response object.
*
* @param string $challengeField
* @param string $responseField
* @return Zend_Service_ReCaptcha_Response
*/
public function verify($challengeField, $responseField)
{
$response = $this->_post($challengeField, $responseField);
return new Zend_Service_ReCaptcha_Response(null, null, $response);
}
}