Permalink
Browse files

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...
danpoltawski committed Nov 26, 2015
1 parent 054da30 commit eacc36a26be59d070d738a0ee375b0228a9b04c3
Showing with 2,426 additions and 1 deletion.
  1. +2 −0 .eslintignore
  2. +2 −0 .stylelintignore
  3. +2 −0 lib/classes/component.php
  4. +27 −0 lib/maxmind/GeoIp2/Compat/JsonSerializable.php
  5. +246 −0 lib/maxmind/GeoIp2/Database/Reader.php
  6. +10 −0 lib/maxmind/GeoIp2/Exception/AddressNotFoundException.php
  7. +10 −0 lib/maxmind/GeoIp2/Exception/AuthenticationException.php
  8. +10 −0 lib/maxmind/GeoIp2/Exception/GeoIp2Exception.php
  9. +25 −0 lib/maxmind/GeoIp2/Exception/HttpException.php
  10. +26 −0 lib/maxmind/GeoIp2/Exception/InvalidRequestException.php
  11. +10 −0 lib/maxmind/GeoIp2/Exception/OutOfQueriesException.php
  12. +62 −0 lib/maxmind/GeoIp2/Model/AbstractModel.php
  13. +50 −0 lib/maxmind/GeoIp2/Model/AnonymousIp.php
  14. +122 −0 lib/maxmind/GeoIp2/Model/City.php
  15. +31 −0 lib/maxmind/GeoIp2/Model/ConnectionType.php
  16. +73 −0 lib/maxmind/GeoIp2/Model/Country.php
  17. +31 −0 lib/maxmind/GeoIp2/Model/Domain.php
  18. +56 −0 lib/maxmind/GeoIp2/Model/Enterprise.php
  19. +56 −0 lib/maxmind/GeoIp2/Model/Insights.php
  20. +47 −0 lib/maxmind/GeoIp2/Model/Isp.php
  21. +20 −0 lib/maxmind/GeoIp2/ProviderInterface.php
  22. +38 −0 lib/maxmind/GeoIp2/Record/AbstractPlaceRecord.php
  23. +60 −0 lib/maxmind/GeoIp2/Record/AbstractRecord.php
  24. +32 −0 lib/maxmind/GeoIp2/Record/City.php
  25. +35 −0 lib/maxmind/GeoIp2/Record/Continent.php
  26. +41 −0 lib/maxmind/GeoIp2/Record/Country.php
  27. +59 −0 lib/maxmind/GeoIp2/Record/Location.php
  28. +19 −0 lib/maxmind/GeoIp2/Record/MaxMind.php
  29. +27 −0 lib/maxmind/GeoIp2/Record/Postal.php
  30. +40 −0 lib/maxmind/GeoIp2/Record/RepresentedCountry.php
  31. +45 −0 lib/maxmind/GeoIp2/Record/Subdivision.php
  32. +107 −0 lib/maxmind/GeoIp2/Record/Traits.php
  33. +242 −0 lib/maxmind/GeoIp2/WebService/Client.php
  34. +296 −0 lib/maxmind/MaxMind/Db/Reader.php
  35. +309 −0 lib/maxmind/MaxMind/Db/Reader/Decoder.php
  36. +10 −0 lib/maxmind/MaxMind/Db/Reader/InvalidDatabaseException.php
  37. +77 −0 lib/maxmind/MaxMind/Db/Reader/Metadata.php
  38. +28 −0 lib/maxmind/MaxMind/Db/Reader/Util.php
  39. +30 −0 lib/maxmind/README_moodle.txt
  40. +12 −0 lib/thirdpartylibs.xml
  41. +1 −1 version.php
View
@@ -49,6 +49,8 @@ lib/amd/src/mustache.js
lib/graphlib.php
lib/spout/
lib/amd/src/chartjs-lazy.js
lib/maxmind/GeoIP2/
lib/maxmind/MaxMind/
mod/assign/feedback/editpdf/fpdi/
repository/s3/S3.php
theme/bootstrapbase/less/bootstrap/
View
@@ -48,6 +48,8 @@ lib/amd/src/mustache.js
lib/graphlib.php
lib/spout/
lib/amd/src/chartjs-lazy.js
lib/maxmind/GeoIP2/
lib/maxmind/MaxMind/
mod/assign/feedback/editpdf/fpdi/
repository/s3/S3.php
theme/bootstrapbase/less/bootstrap/
@@ -73,6 +73,8 @@ class core_component {
);
/** @var array associative array of PRS-4 namespaces and corresponding paths. */
protected static $psr4namespaces = array(
'MaxMind' => 'lib/maxmind/MaxMind',
'GeoIp2' => 'lib/maxmind/GeoIP2',
);
/**
@@ -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();
}
}
@@ -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();
}
}
@@ -0,0 +1,10 @@
<?php
namespace GeoIp2\Exception;
/**
* This class represents a generic error.
*/
class AddressNotFoundException extends GeoIp2Exception
{
}
@@ -0,0 +1,10 @@
<?php
namespace GeoIp2\Exception;
/**
* This class represents a generic error.
*/
class AuthenticationException extends GeoIp2Exception
{
}
@@ -0,0 +1,10 @@
<?php
namespace GeoIp2\Exception;
/**
* This class represents a generic error.
*/
class GeoIp2Exception extends \Exception
{
}
@@ -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);
}
}
@@ -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);
}
}
@@ -0,0 +1,10 @@
<?php
namespace GeoIp2\Exception;
/**
* This class represents a generic error.
*/
class OutOfQueriesException extends GeoIp2Exception
{
}
Oops, something went wrong.

0 comments on commit eacc36a

Please sign in to comment.