ProxyLookup::isConfiguredProxy()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 1
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 2 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License along
15
 * with this program; if not, write to the Free Software Foundation, Inc.,
16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
 * http://www.gnu.org/copyleft/gpl.html
18
 *
19
 * @file
20
 */
21
22
use IPSet\IPSet;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, IPSet.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/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 before OtherDir/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:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
23
24
/**
25
 * @since 1.28
26
 */
27
class ProxyLookup {
28
29
	/**
30
	 * @var string[]
31
	 */
32
	private $proxyServers;
33
34
	/**
35
	 * @var string[]
36
	 */
37
	private $proxyServersComplex;
38
39
	/**
40
	 * @var IPSet|null
41
	 */
42
	private $proxyIPSet;
43
44
	/**
45
	 * @param string[] $proxyServers Simple list of IPs
46
	 * @param string[] $proxyServersComplex Complex list of IPs/ranges
47
	 */
48
	public function __construct( $proxyServers, $proxyServersComplex ) {
49
		$this->proxyServers = $proxyServers;
50
		$this->proxyServersComplex = $proxyServersComplex;
51
	}
52
53
	/**
54
	 * Checks if an IP matches a proxy we've configured
55
	 *
56
	 * @param string $ip
57
	 * @return bool
58
	 */
59
	public function isConfiguredProxy( $ip ) {
60
		// Quick check of known singular proxy servers
61
		if ( in_array( $ip, $this->proxyServers ) ) {
62
			return true;
63
		}
64
65
		// Check against addresses and CIDR nets in the complex list
66
		if ( !$this->proxyIPSet ) {
67
			$this->proxyIPSet = new IPSet( $this->proxyServersComplex );
68
		}
69
		return $this->proxyIPSet->match( $ip );
70
	}
71
72
	/**
73
	 * Checks if an IP is a trusted proxy provider.
74
	 * Useful to tell if X-Forwarded-For data is possibly bogus.
75
	 * CDN cache servers for the site are whitelisted.
76
	 *
77
	 * @param string $ip
78
	 * @return bool
79
	 */
80
	public function isTrustedProxy( $ip ) {
81
		$trusted = $this->isConfiguredProxy( $ip );
82
		Hooks::run( 'IsTrustedProxy', [ &$ip, &$trusted ] );
83
		return $trusted;
84
	}
85
}
86