Skip to content

Commit

Permalink
Supprime les données GeoLite2 du dépôt (#6409)
Browse files Browse the repository at this point in the history
  • Loading branch information
Arnaud-D authored Jan 21, 2023
1 parent 1a70d23 commit d23dbc6
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 11 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ base.db
/media
/articles-data
/zds/_version.py
/geodata

/tutoriels-private-test
/tutoriels-public-test
Expand Down
73 changes: 73 additions & 0 deletions doc/source/install/extra-geolite2.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
========================
Installation de GeoLite2
========================

`GeoLite2 <https://dev.maxmind.com/geoip/geolite2-free-geolocation-data>`_ est une base de donnée gratuite donnant des informations de localisation sur les adresses IP, par exemple le pays d'origine probable. Zeste de Savoir l’utilise afin de localiser les adresses IP des membres à des fins de modération.

L’installation de la base de donnée est optionnelle pour le bon fonctionnement du site. En particulier, l’environnement de développement peut fonctionner sans.


Installation
------------

La base de donnée doit être téléchargée depuis le site de l’éditeur.

1. Créer un `compte utilisateur <https://www.maxmind.com/en/geolite2/signup?lang=en>`_ gratuit.
2. Se connecter et accéder à la `page de téléchargement <https://www.maxmind.com/en/accounts/current/geoip/downloads>`_.
3. Choisir la ligne « GeoLite2 City » ; vérifier que le format est bien *GeoIP2 Binary* et télécharger l’archive GZIP.
4. Décompresser l’archive et renommer le dossier ``GeoLite2-City_YYYYMMDD`` en ``geodata``.
5. Placer ce dossier à la racine du projet.

La localisation des adresses IP sera désormais indiquée sur les pages de profil si vous êtes connectés en tant que staff ou admin.

Consultez la `documentation officielle <https://dev.maxmind.com/geoip/geolite2-free-geolocation-data>`_ pour plus d’information.


Mise à jour
-----------

La mise à jour de la base de donnée peut se faire en téléchargeant une nouvelle version et en l’installant à la place de l’ancienne, en suivant la procédure décrite dans la section `Installation <#installation>`_.

Si vous souhaitez automatiser la mise à jour, d’autres options existent :

* le programme de mise à jour `GeoIP Update <https://dev.maxmind.com/geoip/updating-databases?lang=en#using-geoip-update>`_ ;
* l’utilisation des permaliens de la page de téléchargement, par exemple avec ``wget`` ou autre outil similaire.

Dans tous les cas, vous aurez besoin de générer une clé de licence.

Consultez la `documentation officielle <https://dev.maxmind.com/geoip/geolite2-free-geolocation-data>`_ pour une information complète à ce sujet.


Résolution de problème
----------------------

J’ai des avertissements concernant GeoIP2 dans les logs
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

Si le message d’erreur est le suivant :

.. sourcecode:: none

GeoIP path must be a valid file or directory.

alors la base de donnée n’est pas installée ou n’est pas installée au bon endroit.

* Vérifiez que vous avez placé le dossier au bon endroit.
* Vérifiez que le dossier a le bon nom.
* Vérifiez que le fichier ``.mmdb`` a le bon nom.

À cette fin, consulter la configuration de votre environnement de développement peut être utile. Le module de localisation utilise les paramètres ``GEOIP_PATH`` pour le nom dudossier et ``GEOIP_CITY`` pour le nom du fichier. Ils sont définis dans ``zds/settings/abstract_base/zds.py``.

Si vous avez une autre erreur, contactez les développeurs. Il s’agit sûrement d’un bug et non d’un souci d’installation.


La localisation de l’IP n’est pas affichée malgré tout
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Vérifiez d’abord votre installation encore une fois, et notamment l’absence d'avertissement concernant GeoIP2 dans les logs. Si vous avez des avertissements, consultez la `section ci-dessus <#jai-des-avertissements-concernant-geoip2-dans-les-logs>`_ pour les résoudre.

Vérifiez que vous êtes bien connecté en tant que staff ou admin. Les adresses IP et leur localisation ne sont pas affichées pour les simples membres.

Vérifiez que le profil ne s’est pas connecté depuis une IP locale telle que 127.0.0.1. Aucune localisation ne sera affichée pour ce type d’IP.

Autrement, il est possible que la base de donnée ne connaisse pas la localisation de l’IP. Dans ce cas, Zeste de Savoir ne donnera aucune information de localisation. Notez également que la localisation peut être partielle (par exemple seulement le pays, mais pas la ville).
1 change: 0 additions & 1 deletion geodata/COPYRIGHT.txt

This file was deleted.

Binary file removed geodata/GeoLite2-City.mmdb
Binary file not shown.
3 changes: 0 additions & 3 deletions geodata/LICENSE.txt

This file was deleted.

22 changes: 15 additions & 7 deletions zds/member/models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import logging
from datetime import datetime
from geoip2.errors import AddressNotFoundError
from hashlib import md5

from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.gis.geoip2 import GeoIP2
from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception
from django.urls import reverse
from django.db import models
from django.dispatch import receiver
Expand Down Expand Up @@ -101,14 +102,21 @@ def get_city(self):
try:
geo = GeoIP2().city(self.last_ip_address)
except AddressNotFoundError:
self._cached_city = (self.last_ip_address, "")
return ""

city = geo["city"]
country = geo["country_name"]
geo_location = ", ".join(i for i in [city, country] if i)
geo_location = ""
except GeoIP2Exception as e:
geo_location = ""
logging.getLogger(__name__).warning(
f"GeoIP2 failed with the following message: '{e}'. "
"The Geolite2 database might not be installed or configured correctly. "
"Check the documentation for guidance on how to install it properly."
)
else:
city = geo["city"]
country = geo["country_name"]
geo_location = ", ".join(i for i in [city, country] if i)

self._cached_city = (self.last_ip_address, geo_location)

return geo_location

def get_avatar_url(self, size=80):
Expand Down

0 comments on commit d23dbc6

Please sign in to comment.