mirrored from git://git.moodle.org/moodle.git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-48766 lib: Import MaxMind GeoIP2 PHP API
No changes from the upstream version have been made, it is recommended by upstream to install these depdencies via composer - but the composer installation is bundled with a load of test files, shell scripts etc (and we don't use composer to manage 'production dependencies') so we have to do it manually.
- Loading branch information
1 parent
054da30
commit eacc36a
Showing
41 changed files
with
2,426 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Compat; | ||
|
||
// @codingStandardsIgnoreFile | ||
|
||
/** | ||
* This interface exists to provide backwards compatibility with PHP 5.3 | ||
* | ||
* This should _not_ be used by any third-party code. | ||
* | ||
* @ignore | ||
*/ | ||
if (interface_exists('JsonSerializable')) { | ||
interface JsonSerializable extends \JsonSerializable | ||
{ | ||
} | ||
} else { | ||
interface JsonSerializable | ||
{ | ||
/** | ||
* Returns data that can be serialized by json_encode | ||
* @ignore | ||
*/ | ||
public function jsonSerialize(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,246 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Database; | ||
|
||
use GeoIp2\Exception\AddressNotFoundException; | ||
use GeoIp2\ProviderInterface; | ||
use MaxMind\Db\Reader as DbReader; | ||
|
||
/** | ||
* Instances of this class provide a reader for the GeoIP2 database format. | ||
* IP addresses can be looked up using the database specific methods. | ||
* | ||
* ## Usage ## | ||
* | ||
* The basic API for this class is the same for every database. First, you | ||
* create a reader object, specifying a file name. You then call the method | ||
* corresponding to the specific database, passing it the IP address you want | ||
* to look up. | ||
* | ||
* If the request succeeds, the method call will return a model class for | ||
* the method you called. This model in turn contains multiple record classes, | ||
* each of which represents part of the data returned by the database. If | ||
* the database does not contain the requested information, the attributes | ||
* on the record class will have a `null` value. | ||
* | ||
* If the address is not in the database, an | ||
* {@link \GeoIp2\Exception\AddressNotFoundException} exception will be | ||
* thrown. If an invalid IP address is passed to one of the methods, a | ||
* SPL {@link \InvalidArgumentException} will be thrown. If the database is | ||
* corrupt or invalid, a {@link \MaxMind\Db\Reader\InvalidDatabaseException} | ||
* will be thrown. | ||
* | ||
*/ | ||
class Reader implements ProviderInterface | ||
{ | ||
private $dbReader; | ||
private $locales; | ||
|
||
/** | ||
* Constructor. | ||
* | ||
* @param string $filename The path to the GeoIP2 database file. | ||
* @param array $locales List of locale codes to use in name property | ||
* from most preferred to least preferred. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function __construct( | ||
$filename, | ||
$locales = array('en') | ||
) { | ||
$this->dbReader = new DbReader($filename); | ||
$this->locales = $locales; | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 City model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\City | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function city($ipAddress) | ||
{ | ||
return $this->modelFor('City', 'City', $ipAddress); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 Country model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\Country | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function country($ipAddress) | ||
{ | ||
return $this->modelFor('Country', 'Country', $ipAddress); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 Anonymous IP model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\AnonymousIp | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function anonymousIp($ipAddress) | ||
{ | ||
return $this->flatModelFor( | ||
'AnonymousIp', | ||
'GeoIP2-Anonymous-IP', | ||
$ipAddress | ||
); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 Connection Type model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\ConnectionType | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function connectionType($ipAddress) | ||
{ | ||
return $this->flatModelFor( | ||
'ConnectionType', | ||
'GeoIP2-Connection-Type', | ||
$ipAddress | ||
); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 Domain model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\Domain | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function domain($ipAddress) | ||
{ | ||
return $this->flatModelFor( | ||
'Domain', | ||
'GeoIP2-Domain', | ||
$ipAddress | ||
); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 Enterprise model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\Enterprise | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function enterprise($ipAddress) | ||
{ | ||
return $this->modelFor('Enterprise', 'Enterprise', $ipAddress); | ||
} | ||
|
||
/** | ||
* This method returns a GeoIP2 ISP model. | ||
* | ||
* @param string $ipAddress IPv4 or IPv6 address as a string. | ||
* | ||
* @return \GeoIp2\Model\Isp | ||
* | ||
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is | ||
* not in the database. | ||
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database | ||
* is corrupt or invalid | ||
*/ | ||
public function isp($ipAddress) | ||
{ | ||
return $this->flatModelFor( | ||
'Isp', | ||
'GeoIP2-ISP', | ||
$ipAddress | ||
); | ||
} | ||
|
||
private function modelFor($class, $type, $ipAddress) | ||
{ | ||
$record = $this->getRecord($class, $type, $ipAddress); | ||
|
||
$record['traits']['ip_address'] = $ipAddress; | ||
$class = "GeoIp2\\Model\\" . $class; | ||
|
||
return new $class($record, $this->locales); | ||
} | ||
|
||
private function flatModelFor($class, $type, $ipAddress) | ||
{ | ||
$record = $this->getRecord($class, $type, $ipAddress); | ||
|
||
$record['ip_address'] = $ipAddress; | ||
$class = "GeoIp2\\Model\\" . $class; | ||
|
||
return new $class($record); | ||
} | ||
|
||
private function getRecord($class, $type, $ipAddress) | ||
{ | ||
if (strpos($this->metadata()->databaseType, $type) === false) { | ||
$method = lcfirst($class); | ||
throw new \BadMethodCallException( | ||
"The $method method cannot be used to open a " | ||
. $this->metadata()->databaseType . " database" | ||
); | ||
} | ||
$record = $this->dbReader->get($ipAddress); | ||
if ($record === null) { | ||
throw new AddressNotFoundException( | ||
"The address $ipAddress is not in the database." | ||
); | ||
} | ||
return $record; | ||
} | ||
|
||
/** | ||
* @throws \InvalidArgumentException if arguments are passed to the method. | ||
* @throws \BadMethodCallException if the database has been closed. | ||
* @return \MaxMind\Db\Reader\Metadata object for the database. | ||
*/ | ||
public function metadata() | ||
{ | ||
return $this->dbReader->metadata(); | ||
} | ||
|
||
/** | ||
* Closes the GeoIP2 database and returns the resources to the system. | ||
*/ | ||
public function close() | ||
{ | ||
$this->dbReader->close(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents a generic error. | ||
*/ | ||
class AddressNotFoundException extends GeoIp2Exception | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents a generic error. | ||
*/ | ||
class AuthenticationException extends GeoIp2Exception | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents a generic error. | ||
*/ | ||
class GeoIp2Exception extends \Exception | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents an HTTP transport error. | ||
*/ | ||
|
||
class HttpException extends GeoIp2Exception | ||
{ | ||
/** | ||
* The URI queried | ||
*/ | ||
public $uri; | ||
|
||
public function __construct( | ||
$message, | ||
$httpStatus, | ||
$uri, | ||
\Exception $previous = null | ||
) { | ||
$this->uri = $uri; | ||
parent::__construct($message, $httpStatus, $previous); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents an error returned by MaxMind's GeoIP2 | ||
* web service. | ||
*/ | ||
class InvalidRequestException extends HttpException | ||
{ | ||
/** | ||
* The code returned by the MaxMind web service | ||
*/ | ||
public $error; | ||
|
||
public function __construct( | ||
$message, | ||
$error, | ||
$httpStatus, | ||
$uri, | ||
\Exception $previous = null | ||
) { | ||
$this->error = $error; | ||
parent::__construct($message, $httpStatus, $uri, $previous); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents a generic error. | ||
*/ | ||
class OutOfQueriesException extends GeoIp2Exception | ||
{ | ||
} |
Oops, something went wrong.