Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Core/src/Controller/Component/RecaptchaComponent.php
<?php
namespace Croogo\Core\Controller\Component;

use
Cake\Controller\Component;
use
Cake\Controller\ComponentRegistry;
use
Cake\Core\Configure;
use
Cake\Network\Http\Client;

/**
 * Recaptcha Component
 *
 * @package Croogo.Croogo.Controller.Component
 * @category Component
 */
class RecaptchaComponent extends Component
{

    const
SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';

    const
VERSION = 'php_1.1.2';

    private
$_controller = null;

    private
$_publicKey = '';
    private
$_privateKey = '';

    protected
$_defaultConfig = [
       
'actions' => []
    ];

   
/**
     * Constructor
     */
   
public function __construct(ComponentRegistry $registry, array $config = [])
    {
       
$this->_defaultConfig['modelClass'] = $registry->getController()->modelClass;
       
parent::__construct($registry, $config);
    }

   
/**
     * initialize
     */
   
public function initialize(array $config)
    {
       
$controller = $this->_registry->getController();
       
$this->_controller = $controller;
        if (
$controller->getName() === 'CakeError') {
            return;
        }

        if (
in_array($this->request->getParam('action'), $this->getConfig('actions'))) {
           
$controller->Security->validatePost = false;
        }

       
$controller->viewBuilder()->setHelpers(['Croogo/Core.Recaptcha']);
    }

   
/**
     * startup
     */
   
public function startup()
    {
       
$this->_publicKey = Configure::read('Service.recaptcha_public_key');
       
$this->_privateKey = Configure::read('Service.recaptcha_private_key');

       
Configure::write('Recaptcha.pubKey', $this->_publicKey);
       
Configure::write('Recaptcha.privateKey', $this->_privateKey);
    }

   
/**
     * verify reCAPTCHA
     */
   
public function verify()
    {
        if (
$this->request->getData('g-recaptcha-response')) {
           
$captcha = $this->request->getData('g-recaptcha-response');
           
$response = $this->_getApiResponse($captcha);

            if (!
$response->success) {
               
$this->_controller->Flash->error($this->_errorMsg($response->{'error-codes'}));

                return
false;
            }

            return
true;
        }
    }

   
/**
     * Get reCAPTCHA response
     *
     * @return array Body of the reCAPTCHA response
     */
   
protected function _getApiResponse($captcha)
    {
       
$data = [
           
'secret' => $this->_privateKey,
           
'response' => $captcha,
           
'remoteip' => env('REMOTE_ADDR'),
           
'version' => self::VERSION
       
];
       
$HttpSocket = new Client();
       
$request = $HttpSocket->post(self::SITE_VERIFY_URL, $data);

        return
json_decode($request->body());
    }

   
/**
     * Error message
     */
   
protected function _errorMsg($errorCodes = null)
    {
        switch (
$errorCodes) {
            case
'missing-input-secret':
               
$msg = 'The secret parameter is missing.';
                break;
            case
'invaid-input-secret':
               
$msg = 'The secret parameter is invalid or malformed.';
                break;
            case
'missing-input-response':
               
$msg = 'The response parameter is missing.';
                break;
            case
'invalid-input-response':
               
$msg = 'The response parameter is invalid or malformed.';
                break;
            default:
               
$msg = null;
                break;
        }

        return
$msg;
    }
}