PnX-SI / gn_module_export

Module GeoNature d'export
GNU General Public License v3.0
7 stars 10 forks source link

Lien vers le fichier malformé dans un réseau local #207

Open gildeluermoz opened 10 months ago

gildeluermoz commented 10 months ago

GeoNature 2.12.3 est installé sur une machine dans un réseau local. En interne, les utilisateurs accèdde a geonature via cette url : geonature.mastructure.local/geonature Cette machine est aussi accessible depuis l'extérieur via un domaine : geonature.mondomaine.fr/geonature Tout fonctionne bien pour les utilisateurs en interne comme en externe.

MAIS sur le module d'export (qu'il soit généré depuis une connexion en interne comme en externe), le lien dans le mail est construit avec l'accès interne qui ne fonctionne pas de l'extérieur : https://geonature.mastructure.local/geonature/api/media/exports/usr_generated/monfichier.csv

Je n'arrive pas à trouver quelle variable est utilisée pour contruire le lien. Dans le virtualhost apache, il y a

    ServerName geonature.mondomaine.fr
    ServerAlias geonature.mastructure.local

dans le /etc/hosts il y a

   127.0.0.1    localhost 
   172.1.2.3    geonature.mastructure.local

dans geonature.config.toml j'ai

URL_APPLICATION = 'https://geonature.mondomaine.fr/geonature'
API_ENDPOINT = 'https://geonature.mondomaine.fr/geonature/api'
API_TAXHUB = 'https://geonature.mondomaine.fr/taxhub/api'

J'ai essayé de changer ou de commenter les références à l'url en .local mais ça ne change rien, le lien est toujours construit avec l'url locale. Après chaque changement pour tester, je restart apache et le service geonature et le geonature-worker.

Est-ce que vous auriez une idée de comment est construit le lien et éventuellement où changer quoi pour obtenir un lien formaté avec l'url qui est sur le domaine (fonctionnel en interne comme en externe) ?

Merci

TheoLechemia commented 9 months ago

Salut Gil, Les URL sont construites grâce à la fonction url_for de Flask ici : https://github.com/PnX-SI/gn_module_export/blob/30433d41c9bbf9672e09e5b86caa705708a4837c/backend/gn_module_export/utils_export.py#L111) en lui forçant le extenal=True pour qu'il construise une URL absolue. Flask utilise les info du server HTTP pour déduire le SERVER_NAME dont il a besoin pour construire l'url voir https://flask.palletsprojects.com/en/3.0.x/api/#flask.Flask.url_for et https://flask.palletsprojects.com/en/3.0.x/config/#SERVER_NAME Dans ton cas à mon avis c'est le ServerAlias qui est utilisé, donc toujours l'adresse locale.. Mais comment lui forcer parfois l'URL locale et parfois l'URL externe, j'avoue que je sais pas trop

camillemonchicourt commented 9 months ago

Pourquoi ne pas faire en sorte que les utilisateurs accèdent à GeoNature toujours à la même URL (geonature.mondomaine.fr/geonature) pour que ça soit plus simple pour eux ?

gildeluermoz commented 9 months ago

Théo, Merci pour ces infos précieuses. Etrange effectivement qu'en utilisant la constatne SERVER_NAMEce soit ServerAlias plutôt que ServerName qui est retournée. Je creuse et je fais qq tests pour identifier une éventuelle solution et je vous fais un retour. Mais question : est-ce qu'il ne serait pas pertinent d'utiliser plutôt current_app.config["API_ENDPOINT"] pour contruire l'url de base de ce lien ?

gildeluermoz commented 9 months ago

Pourquoi ne pas faire en sorte que les utilisateurs accèdent à GeoNature toujours à la même URL (geonature.mondomaine.fr/geonature) pour que ça soit plus simple pour eux ?

Oui je suis d'accord et de toute manière pour le mobile c'est obligatoire. Mais ce choix ne me revient pas. Ils souhaitent un accès interne.

TheoLechemia commented 9 months ago

Mais question : est-ce qu'il ne serait pas pertinent d'utiliser plutôt current_app.config["API_ENDPOINT"] pour contruire l'url de base de ce lien ?

ça m'embête un peu de faire un truc custo plutôt que d'utiliser le mécanisme natif de Flask... Jusqu’à maintenant ce paramètre n'est utilisé que par le frontend pour interroger l'API. Mais si il y a vraiment pas d'autre solution, à voir..

gildeluermoz commented 9 months ago

Après analyse et travail avec @TheoLechemia sur les fichiers du backend construisant le lien, il ressort que la construction du lien est faite à partir de l'environnement server et notamment à partir de la variable HTTP_X_FORWARDED_HOST C'est la librairie de Werkzeug proxy_fix.pyqui utilise cette variable HTTP_X_FORWARDED_HOST pour modifier la variable SERVER_NAME que url_for utilise pour construire le lien.

Pourquoi ne pas faire en sorte que les utilisateurs accèdent à GeoNature toujours à la même URL (geonature.mondomaine.fr/geonature) pour que ça soit plus simple pour eux ?

En fait, pour ce qui me concerne, je ne suis pas dans le réseau local, j'accède à GeoNature depuis l'extérieur et le lien est mal formé quoiqu'il en soit. A priori le soucis vient du fait que le serveur est derrière un proxy qui redirige les requêtes externes en modifiant les entêtes des requêtes. Sur le navigateurs tu ne vois rien de tout ça. Par contre, on n'a pas bien su identifier si le lien est construit dans le contexte de la requête d'export ou pas. Ce qui est sûr c'est que toutes les autres requêtes de GeoNature en appel à l'api fonctionnent bien. On doit creuser encore le sujet avec @TheoLechemia pour identifier une piste de résolution.