[MaxMind]: https://www.maxmind.com
# Geolocalización
Se ha observado que para registrar la localización se utiliza el servicio [MaxMind], del cual existe una librería en `CodeIgniter` y un _helper_.
Actualmente se ha encontrado que hacen uso de este servicio los ficheros:
- `esmeralda.php`
- `subscribe.php`
- `william.php`
- `checkout.php`
- `Opengateway.php`
El flujo comienza con la llamada a la función `maxmind_get_geolocation()`
a la cual si hacemos la petición desde un entorno de desarrollo asignará automáticamente la IP de la oficina `217.126.7.2'` y retorna el siguiente JSON:
```json
{
"country_code": "ES",
"region": "56",
"city": "Sant Cugat Del Vallès",
"postal_code": "08172",
"latitude": "41.458500",
"longitude": "2.083600",
"metro_code": "0",
"area_code": "0",
"isp": "Telefonica de Espana Static IP",
"organization": "Telefonica de Espana Static IP"
}
```
Si el servicio no obtiene resultados con la petición realizada, retorna un array vacío con los siguientes parámetros:
```json
{
"country_code": "",
"region": "",
"city": "",
"postal_code": ""
}
```
## `subscribe.php -> index() method`
En el caso de la función index() del fichero subscribe.php se hace una petición a la función `maxmind_get_geolocation()` anteriormente analizada, y con los resultados obtenidos de esta se llama al método interno de la clase `Subscribe::set_geopos_addOrigin()` pasando como parámetros un array con los datos del subscriber, la información geo obtenida y un array con los campos `$_POST` provinientes del formulario de la página.
En esta función en primer lugar si la posición del _array_ de información de la geo viene con la posición `city` existente, se sobrescribe únicamente cuando el `ENVIRONMENT` es `de`.
```php
if (isset($geo_array['city']) == true) {
$geo_array['city'] = en2local_cityname($geo_array['city']);
}
```
`en2local_cityname` realiza una consulta a la base de datos `cities_names` haciendo un `WHERE` con `en_name = $city` y retorna el `local_name`.
Se setean en los arrays `$subscriber_add` y `$field` los datos de la petición al servicio geo de MaxMind:
```php
$field[$this->config->item('city') . ',0'] = $geo_array['city']; // custom field: "ville"
$field[$this->config->item('state') . ',0'] = $geo_array['region']; // state
$field[$this->config->item('zipCodeGeolocation') . ',0'] = $geo_array['postal_code']; // zip code
$field[$this->config->item('country') . ',0'] = $geo_array['country_code']; // country
```
Visto esta parte del código hay que remarcar:
- La latitud y la longitud no se almacenan en ningún punto de la aplicación.
- Existe una función para filtrar subscriptores por país de procedencia y una ip_whitelist, pero únicamente en el pais ES.
## `esmeralda.php -> subscribe() method`
En el caso de esmeralda.php en la función subscribe, si la función `maxmind_get_geolocation` no retorna ningún `country_code` asigna automáticamente el `base_country` establecido en la configuración de `Oraculum`, que es el mismo para CHR, ESM y WIL para todos los países. Concretamente, para las plataformas, ES, EN y PT, se utilizan, respectivamente ES, **US** y **BR**.
## Otros ficheros
En los otros ficheros arriba mencionados `william.php`, `checkout.php` y `Opengateway.php` el sistema utilizado es el mismo que se ha mencionado hasta el momento.
## MindMax service
Se está utilizando actualmente un api service _legacy_:
https://dev.maxmind.com/geoip/legacy/web-services/
El nuevo servicio que ofrecen para obtener la geolocalización a partir de una dirección IP requiere de un AccountId y un licenseKey.
Por lo que mencionan en su blog, van a seguir dando continuidad al web service que estamos utilizando.
https://blog.maxmind.com/2020/06/15/data-changes-to-geoip-legacy-and-minfraud-legacy-web-services-in-may-2022/
Proporcionan una nueva url a la que atacar, para que según ellos "podamos obtener datos de los nuevos sistemas".
También argumentan que estos nuevos datos pueden contener cambios en los códigos de región, códigos de área y nombres de ciudades/paises y regiones.
Proporcionan una serie de documentos para que podamos verificarlos.
Y a continuación el nuevo webservice al cual no tenemos acceso, tendría que hacerse uno nuevo para obtener un accountId y una nueva licenseKey:
https://dev.maxmind.com/geoip/geoip2/web-services/
## Alternativas MindMax
https://members.ip-api.com/#pricing
https://www.ip2location.com
Google no ofrece un servicio parecido al que utilizamos, no hay nada para obtener a raíz de una IP la geolocalización de esta.