<?php


/**


* This is a PHP library that handles calling reCAPTCHA.


* - Documentation and latest version


* https://developers.google.com/recaptcha/docs/php


* - Get a reCAPTCHA API Key


* https://www.google.com/recaptcha/admin/create


* - Discussion group


* http://groups.google.com/group/recaptcha


*


* @copyright Copyright (c) 2014, Google Inc.


* @link http://www.google.com/recaptcha


*


* Permission is hereby granted, free of charge, to any person obtaining a copy


* of this software and associated documentation files (the "Software"), to deal


* in the Software without restriction, including without limitation the rights


* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell


* copies of the Software, and to permit persons to whom the Software is


* furnished to do so, subject to the following conditions:


*


* The above copyright notice and this permission notice shall be included in


* all copies or substantial portions of the Software.


*


* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR


* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,


* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE


* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER


* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,


* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN


* THE SOFTWARE.


*/




/**


* A ReCaptchaResponse is returned from checkAnswer().


*/


class ReCaptchaResponse


{


public $success;


public $errorCodes;


}




class ReCaptcha


{


private static $_signupUrl = "https://www.google.com/recaptcha/admin";


private static $_siteVerifyUrl =


"https://www.google.com/recaptcha/api/siteverify?";


private $_secret;


private static $_version = "php_1.0";




/**


* Constructor.


*


* @param string $secret shared secret between site and ReCAPTCHA server.


*/


function ReCaptcha($secret)


{


if ($secret == null || $secret == "") {


die("To use reCAPTCHA you must get an API key from <a href='"


. self::$_signupUrl . "'>" . self::$_signupUrl . "</a>");


}


$this->_secret=$secret;


}




/**


* Encodes the given data into a query string format.


*


* @param array $data array of string elements to be encoded.


*


* @return string - encoded request.


*/


private function _encodeQS($data)


{


$req = "";


foreach ($data as $key => $value) {


$req .= $key . '=' . urlencode(stripslashes($value)) . '&';


}




// Cut the last '&'


$req=substr($req, 0, strlen($req)-1);


return $req;


}




/**


* Submits an HTTP GET to a reCAPTCHA server.


*


* @param string $path url path to recaptcha server.


* @param array $data array of parameters to be sent.


*


* @return array response


*/


private function _submitHTTPGet($path, $data)


{


$req = $this->_encodeQS($data);


$response = file_get_contents($path . $req);


return $response;


}




/**


* Calls the reCAPTCHA siteverify API to verify whether the user passes


* CAPTCHA test.


*


* @param string $remoteIp IP address of end user.


* @param string $response response string from recaptcha verification.


*


* @return ReCaptchaResponse


*/


public function verifyResponse($remoteIp, $response)


{


// Discard empty solution submissions


if ($response == null || strlen($response) == 0) {


$recaptchaResponse = new ReCaptchaResponse();


$recaptchaResponse->success = false;


$recaptchaResponse->errorCodes = 'missing-input';


return $recaptchaResponse;


}




$getResponse = $this->_submitHttpGet(


self::$_siteVerifyUrl,


array (


'secret' => $this->_secret,


'remoteip' => $remoteIp,


'v' => self::$_version,


'response' => $response


)


);


$answers = json_decode($getResponse, true);


$recaptchaResponse = new ReCaptchaResponse();




if (trim($answers ['success']) == true) {


$recaptchaResponse->success = true;


} else {


$recaptchaResponse->success = false;


$recaptchaResponse->errorCodes = $answers [error-codes];


}




return $recaptchaResponse;


}


}




?>

Charlie Taylor - Photojournalist
Near the end of the first day of Silencer Shoot '11, fire and the rat-tat-tat of a machine gun disturb the normally quiet proceedings as a suppressor unexpectadly ruptures.