Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
gildeluermoz opened this issue Feb 6, 2024 · 6 comments
Open

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

gildeluermoz opened this issue Feb 6, 2024 · 6 comments

Comments

@gildeluermoz
Copy link
Contributor

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
Copy link
Member

Salut Gil,
Les URL sont construites grâce à la fonction url_for de Flask ici :

) 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
Copy link
Member

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
Copy link
Contributor Author

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
Copy link
Contributor Author

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
Copy link
Member

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
Copy link
Contributor Author

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.py qui 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants