Nouvelle dépêche avec un lien type http://localhost/ééé
-> HTTP 500
FATAL -- : [xxx] URI::InvalidURIError (URI must be ascii only "http://localhost/\u{e9}\u{e9}\u{e9}"):
Il y a pire, si on réorganise la dépêche et que l'on insère un lien invalide -> HTTP 500 + perte du format markdown (l'entrée news_versions
est conservée, les entrées paragraphs
sont perdues).
# Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
Hello,
J'ai ajouté la validation des liens HTTP dans ce Pull Request: https://github.com/linuxfrorg/linuxfr.org/pull/309
Avant, on n'affichait aucune des erreurs de validation, j'ai ajouté les messages d'erreurs dans ces cas. J'ai dû mettre à jour un peu le rendu des liens en édition dans l'espace de rédaction:
J'ai ajouté un cadre autour du formulaire, pour bien montrer à l'utilisateur que tous ces boutons sont liés.
Dans le lien "en édition", j'ai profité d'expliquer que le lien peut être supprimé en vidant le champ Adresse.
Quand plusieurs erreurs existent, une liste à puce est affichée. Si le lien est en modification, les puces sont les drapeaux de langue. Je n'ai pas corrigé ça, parce qu'on a déjà un Pull Request pour enlever les drapeaux de langue dans les liens.
[^] # Re: Validation des liens et bookmarks
Posté par Benoît Sibaud (site web personnel) . Évalué à 3 (+0/-0).
Contexte :
- étape 1 : j'essayais de compléter les infos pour https://linuxfr.org/suivi/gerer-les-vieux-contenus-en-html-et-non-en-markdown .
- étape 2 : ça m'a conduit à me poser des questions sur les
paragraphs
et/ou lesnews_versions
qui sont NULL, ainsi que sur des paragraphs.wiki_body qui sont NULL- étape 3 : en essayant de comprendre ça, j'ai explosé une dépêche en tombant sur ce bug
- étape 4 : j'ai ouvert le bug
- étape 5 : j'ai constaté qu'on avait quelques centaines de liens problématiques… j'ai commencé à nettoyer
- … à un moment je dépilerai…
[^] # Re: Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
Pour la réorganisation, on a, dans le modèle de news, le code:
On voit bien que la première étape est de supprimer tous les paragraphes.
La ligne
create_parts
va recréer tous les paragraphes de la première et de la seconde partie.L'appel à
create_new_version
est définit pour s'exécuter après le save (after_save
).Il faut savoir que, si un lien est invalide, le modèle
link
lève une exception sans gestion d'erreur et donc fait arrêter nette la procédure.Ce que je ne sais pas, c'est si le modèle de
link
est appelé au moment de faireself.attributes = params
ou au moment de fairesave
.En plus, je ne sais pas si Rails fait des transactions dans MySQL, donc c'est un peu compliqué à expliquer ce qui se passe juste en regardant le code. Il faudrait que je reproduise aussi pour mieux analyser.
Mais en tout cas, s'il n'y a pas de transaction SQL, la news serait effectivement dans un mauvais état: les paragraphes ont été détruits et les nouveaux body/wiki_body n'ont pas été sauvés.
Mon Pull Request fait en sorte que le modèle
link
ne lève plus une exception brute, mais remonte une erreur de validtion. Au moins, ça n'arrête plus le processus d'un coup, mais ça perturbe uniquement les modifications sur les liens.[^] # Re: Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
Je viens de reproduire, c'est sur la ligne
self.attributes = params
que ça se déclenche.Voilà le déroulement dans le log et, malheureusement, il n'y a pas de transaction sql :(
[^] # Re: Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
J'ai ajouté une transaction SQL manuellement pour la réorganisation, parce que c'est une opération complexe et que ce genre de bug ne devrait pas mettre dans un tel état une dépêche.
[^] # Re: Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
Mince, visiblement, ça ne suffit pas.
Avec le Pull Request, si je fais une réorganisation avec un lien invalide: il n'y a plus d'exception levée, mais le save ne passe pas et, du coup, il n'y a pas de nouvelle version crée.
Par contre, le résultat est que la news est bien complètement sauvée (les paragraphes sont bien présents).
Les logs pour info:
On voit bien que je n'ai plus d'exception, car j'ai le COMMIT SQL qui est exécuté.
Mais aucun lien n'a été mis à jour (sûrement à cause du validator d'url) et aucune version n'a été crée.
[^] # Re: Validation des liens et bookmarks
Posté par Adrien Dorsaz (site web personnel, Mastodon) . Évalué à 3 (+0/-0).
Voilà, j'ai ajouté des commits pour avoir un comportement acceptable:
Si la transaction SQL a échoué ou s'il y a une erreur de validation, la méthode
reorganize
du modèle retournefalse
(sinon, elle retournetrue
).Dans le cas d'un
false
, le contrôleur demande de réafficher la page de réorganisation avec les erreurs de validations.[^] # Re: Validation des liens et bookmarks
Posté par Benoît Sibaud (site web personnel) . Évalué à 3 (+0/-0).
a priori j'ai nettoyé cette partie là. ça devrait potentiellement se voir aussi sur la validité des pages HTML concernées.
[^] # Re: Validation des liens et bookmarks
Posté par Benoît Sibaud (site web personnel) . Évalué à 3 (+0/-0). Dernière modification le 27 juin 2021 à 16:35.
Mergée, merci. Cf https://github.com/linuxfrorg/linuxfr.org/commit/0cc375f167bbfe54244aa64583cf6f47db9e9fb3
# Correction
Posté par Benoît Sibaud (site web personnel) . Évalué à 3 (+0/-0).
Voir aussi https://linuxfr.org/suivi/echec-de-validation-de-lien
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.