/** * Check request reCAPTCHA validity * This method return `true` or `false` after validation, and set error in * helper. If `true` error is set to null, otherwise `'incorrect-captcha-sol'` * * Example: * {{{ * class YourController extends \lithium\action\Controller { * public function index() { * if ($this->request->data) { * if (!Recaptcha::check($this->request)) { * return; * } * } * } * } * }}} * @param object $request Pass request object to check method * @return boolean * @throws ConfigException * @throws RuntimeException */ public static function check(\lithium\net\http\Request $request) { $config = Libraries::get('li3_recaptcha', 'keys'); if (!$config['private']) { throw new ConfigException('To use reCAPTCHA you must get API key from' . 'https://www.google.com/recaptcha/admin/create'); } if (!$request->env('SERVER_ADDR')) { throw new RuntimeException('For security reasons, you must pass the remote ip to reCAPTCHA'); } $data = array('privatekey' => $config['private'], 'remoteip' => $request->env('SERVER_ADDR'), 'challenge' => null, 'response' => null); if ($request->data) { $data['challenge'] = $request->data['recaptcha_challenge_field']; $data['response'] = $request->data['recaptcha_response_field']; } if (!$data['challenge'] || !$data['response']) { RecaptchaHelper::$error = 'incorrect-captcha-sol'; return false; } $service = Connections::get('recaptcha'); $serviceRespond = explode("\n", $service->post('/recaptcha/api/verify', $data)); if ($serviceRespond[0] == 'true') { RecaptchaHelper::$error = null; return true; } else { RecaptchaHelper::$error = 'incorrect-captcha-sol'; return false; } }