1 | <?php |
||||
2 | /* |
||||
3 | You may not change or alter any portion of this comment or credits |
||||
4 | of supporting developers from this source code or any supporting source code |
||||
5 | which is considered copyrighted (c) material of the original comment or credit authors. |
||||
6 | |||||
7 | This program is distributed in the hope that it will be useful, |
||||
8 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||||
10 | */ |
||||
11 | |||||
12 | use Xmf\Request; |
||||
0 ignored issues
–
show
|
|||||
13 | use Xmf\IPAddress; |
||||
14 | |||||
15 | /** |
||||
16 | * CAPTCHA for Recaptcha mode |
||||
17 | * |
||||
18 | * @package class |
||||
19 | * @subpackage CAPTCHA |
||||
20 | * @author Grégory Mage |
||||
21 | * @copyright 2000-2025 XOOPS Project (https://xoops.org) |
||||
22 | * @license GNU GPL 2.0 or later (https://www.gnu.org/licenses/gpl-2.0.html) |
||||
23 | * @link https://xoops.org |
||||
24 | */ |
||||
25 | |||||
26 | defined('XOOPS_ROOT_PATH') || exit('Restricted access'); |
||||
27 | |||||
28 | /** |
||||
29 | * Class XoopsCaptchaRecaptcha2 |
||||
30 | */ |
||||
31 | class XoopsCaptchaRecaptcha2 extends XoopsCaptchaMethod |
||||
32 | { |
||||
33 | /** |
||||
34 | * XoopsCaptchaRecaptcha2::isActive() |
||||
35 | * |
||||
36 | * @return bool |
||||
37 | */ |
||||
38 | public function isActive() |
||||
39 | { |
||||
40 | return true; |
||||
41 | } |
||||
42 | |||||
43 | /** |
||||
44 | * XoopsCaptchaRecaptcha2::render() |
||||
45 | * |
||||
46 | * @return string |
||||
47 | */ |
||||
48 | public function render() |
||||
49 | { |
||||
50 | $form = '<script src="https://www.google.com/recaptcha/api.js"></script>'; |
||||
51 | $form .= '<div class="form-group"><div class="g-recaptcha" data-sitekey="' |
||||
52 | . $this->config['website_key'] . '"></div></div>'; |
||||
53 | return $form; |
||||
54 | } |
||||
55 | |||||
56 | /** |
||||
57 | * XoopsCaptchaRecaptcha2::verify() |
||||
58 | * |
||||
59 | * @param string|null $sessionName unused for recaptcha |
||||
60 | * |
||||
61 | * @return bool |
||||
62 | */ |
||||
63 | public function verify($sessionName = null) |
||||
64 | { |
||||
65 | $isValid = false; |
||||
66 | $recaptchaResponse = Request::getString('g-recaptcha-response', ''); |
||||
67 | $recaptchaVerifyURL = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $this->config['secret_key'] |
||||
68 | . '&response=' . $recaptchaResponse . '&remoteip=' . IPAddress::fromRequest()->asReadable(); |
||||
69 | $usedCurl = false; |
||||
70 | if (function_exists('curl_init') && false !== ($curlHandle = curl_init())) { |
||||
71 | curl_setopt($curlHandle, CURLOPT_URL, $recaptchaVerifyURL); |
||||
72 | curl_setopt($curlHandle, CURLOPT_FAILONERROR, true); |
||||
73 | curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); |
||||
74 | curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 5); |
||||
75 | $curlReturn = curl_exec($curlHandle); |
||||
76 | if (false === $curlReturn) { |
||||
77 | trigger_error(curl_error($curlHandle)); |
||||
78 | } else { |
||||
79 | $usedCurl = true; |
||||
80 | $recaptchaCheck = json_decode($curlReturn, true); |
||||
0 ignored issues
–
show
It seems like
$curlReturn can also be of type true ; however, parameter $json of json_decode() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
81 | } |
||||
82 | curl_close($curlHandle); |
||||
83 | } |
||||
84 | if (false === $usedCurl) { |
||||
85 | $recaptchaCheck = file_get_contents($recaptchaVerifyURL); |
||||
86 | $recaptchaCheck = json_decode($recaptchaCheck, true); |
||||
87 | } |
||||
88 | if (isset($recaptchaCheck['success']) && $recaptchaCheck['success'] === true) { |
||||
89 | $isValid = true; |
||||
90 | } else { |
||||
91 | /** @var \XoopsCaptcha $captchaInstance */ |
||||
92 | $captchaInstance = \XoopsCaptcha::getInstance(); |
||||
93 | /** @var array $recaptchaCheck */ |
||||
94 | foreach ($recaptchaCheck['error-codes'] as $msg) { |
||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||||
95 | $captchaInstance->message[] = $msg; |
||||
96 | } |
||||
97 | } |
||||
98 | |||||
99 | return $isValid; |
||||
100 | } |
||||
101 | } |
||||
102 |
Let?s assume that you have a directory layout like this:
and let?s assume the following content of
Bar.php
:If both files
OtherDir/Foo.php
andSomeDir/Foo.php
are loaded in the same runtime, you will see a PHP error such as the following:PHP Fatal error: Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php
However, as
OtherDir/Foo.php
does not necessarily have to be loaded and the error is only triggered if it is loaded beforeOtherDir/Bar.php
, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias: