Skip to content
This repository was archived by the owner on Dec 6, 2019. It is now read-only.

Commit fdcb8e2

Browse files
Nabeel Shahzadnabeelio
authored andcommitted
Add new recaptcha library
1 parent e81ef70 commit fdcb8e2

File tree

15 files changed

+860
-360
lines changed

15 files changed

+860
-360
lines changed

core/lib/recaptcha/LICENSE

Lines changed: 0 additions & 22 deletions
This file was deleted.

core/lib/recaptcha/README

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
/**
3+
* This is a PHP library that handles calling reCAPTCHA.
4+
*
5+
* @copyright Copyright (c) 2015, Google Inc.
6+
* @link http://www.google.com/recaptcha
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
namespace ReCaptcha;
28+
29+
/**
30+
* reCAPTCHA client.
31+
*/
32+
class ReCaptcha
33+
{
34+
/**
35+
* Version of this client library.
36+
* @const string
37+
*/
38+
const VERSION = 'php_1.1.3';
39+
40+
/**
41+
* Shared secret for the site.
42+
* @var string
43+
*/
44+
private $secret;
45+
46+
/**
47+
* Method used to communicate with service. Defaults to POST request.
48+
* @var RequestMethod
49+
*/
50+
private $requestMethod;
51+
52+
/**
53+
* Create a configured instance to use the reCAPTCHA service.
54+
*
55+
* @param string $secret shared secret between site and reCAPTCHA server.
56+
* @param RequestMethod $requestMethod method used to send the request. Defaults to POST.
57+
* @throws \RuntimeException if $secret is invalid
58+
*/
59+
public function __construct($secret, RequestMethod $requestMethod = null)
60+
{
61+
if (empty($secret)) {
62+
throw new \RuntimeException('No secret provided');
63+
}
64+
65+
if (!is_string($secret)) {
66+
throw new \RuntimeException('The provided secret must be a string');
67+
}
68+
69+
$this->secret = $secret;
70+
71+
if (!is_null($requestMethod)) {
72+
$this->requestMethod = $requestMethod;
73+
} else {
74+
$this->requestMethod = new RequestMethod\Post();
75+
}
76+
}
77+
78+
/**
79+
* Calls the reCAPTCHA siteverify API to verify whether the user passes
80+
* CAPTCHA test.
81+
*
82+
* @param string $response The value of 'g-recaptcha-response' in the submitted form.
83+
* @param string $remoteIp The end user's IP address.
84+
* @return Response Response from the service.
85+
*/
86+
public function verify($response, $remoteIp = null)
87+
{
88+
// Discard empty solution submissions
89+
if (empty($response)) {
90+
$recaptchaResponse = new Response(false, array('missing-input-response'));
91+
return $recaptchaResponse;
92+
}
93+
94+
$params = new RequestParameters($this->secret, $response, $remoteIp, self::VERSION);
95+
$rawResponse = $this->requestMethod->submit($params);
96+
return Response::fromJson($rawResponse);
97+
}
98+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* This is a PHP library that handles calling reCAPTCHA.
4+
*
5+
* @copyright Copyright (c) 2015, Google Inc.
6+
* @link http://www.google.com/recaptcha
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
namespace ReCaptcha;
28+
29+
/**
30+
* Method used to send the request to the service.
31+
*/
32+
interface RequestMethod
33+
{
34+
35+
/**
36+
* Submit the request with the specified parameters.
37+
*
38+
* @param RequestParameters $params Request parameters
39+
* @return string Body of the reCAPTCHA response
40+
*/
41+
public function submit(RequestParameters $params);
42+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
/**
3+
* This is a PHP library that handles calling reCAPTCHA.
4+
*
5+
* @copyright Copyright (c) 2015, Google Inc.
6+
* @link http://www.google.com/recaptcha
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
namespace ReCaptcha\RequestMethod;
28+
29+
/**
30+
* Convenience wrapper around the cURL functions to allow mocking.
31+
*/
32+
class Curl
33+
{
34+
35+
/**
36+
* @see http://php.net/curl_init
37+
* @param string $url
38+
* @return resource cURL handle
39+
*/
40+
public function init($url = null)
41+
{
42+
return curl_init($url);
43+
}
44+
45+
/**
46+
* @see http://php.net/curl_setopt_array
47+
* @param resource $ch
48+
* @param array $options
49+
* @return bool
50+
*/
51+
public function setoptArray($ch, array $options)
52+
{
53+
return curl_setopt_array($ch, $options);
54+
}
55+
56+
/**
57+
* @see http://php.net/curl_exec
58+
* @param resource $ch
59+
* @return mixed
60+
*/
61+
public function exec($ch)
62+
{
63+
return curl_exec($ch);
64+
}
65+
66+
/**
67+
* @see http://php.net/curl_close
68+
* @param resource $ch
69+
*/
70+
public function close($ch)
71+
{
72+
curl_close($ch);
73+
}
74+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
/**
3+
* This is a PHP library that handles calling reCAPTCHA.
4+
*
5+
* @copyright Copyright (c) 2015, Google Inc.
6+
* @link http://www.google.com/recaptcha
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
namespace ReCaptcha\RequestMethod;
28+
29+
use ReCaptcha\RequestMethod;
30+
use ReCaptcha\RequestParameters;
31+
32+
/**
33+
* Sends cURL request to the reCAPTCHA service.
34+
* Note: this requires the cURL extension to be enabled in PHP
35+
* @see http://php.net/manual/en/book.curl.php
36+
*/
37+
class CurlPost implements RequestMethod
38+
{
39+
/**
40+
* URL to which requests are sent via cURL.
41+
* @const string
42+
*/
43+
const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
44+
45+
/**
46+
* Curl connection to the reCAPTCHA service
47+
* @var Curl
48+
*/
49+
private $curl;
50+
51+
public function __construct(Curl $curl = null)
52+
{
53+
if (!is_null($curl)) {
54+
$this->curl = $curl;
55+
} else {
56+
$this->curl = new Curl();
57+
}
58+
}
59+
60+
/**
61+
* Submit the cURL request with the specified parameters.
62+
*
63+
* @param RequestParameters $params Request parameters
64+
* @return string Body of the reCAPTCHA response
65+
*/
66+
public function submit(RequestParameters $params)
67+
{
68+
$handle = $this->curl->init(self::SITE_VERIFY_URL);
69+
70+
$options = array(
71+
CURLOPT_POST => true,
72+
CURLOPT_POSTFIELDS => $params->toQueryString(),
73+
CURLOPT_HTTPHEADER => array(
74+
'Content-Type: application/x-www-form-urlencoded'
75+
),
76+
CURLINFO_HEADER_OUT => false,
77+
CURLOPT_HEADER => false,
78+
CURLOPT_RETURNTRANSFER => true,
79+
CURLOPT_SSL_VERIFYPEER => true
80+
);
81+
$this->curl->setoptArray($handle, $options);
82+
83+
$response = $this->curl->exec($handle);
84+
$this->curl->close($handle);
85+
86+
return $response;
87+
}
88+
}

0 commit comments

Comments
 (0)