zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 161 forks source link

Problème de référencement d'un pseudo dans un MP #2788

Closed firm1 closed 8 years ago

firm1 commented 9 years ago

Bonjour,

J'ai signalé une erreur dans un tuto, ce qui a créé un MP pour les auteurs dudit tuto.
Dans ce MP automatique le html donne:

<a href="http://zestedesavoir.com/membres/voir/La%252520source/">La source</a> souhaite vous proposer une correction pour votre tutoriel

Donc dans mon pseudo il y a un problème dans le lien vu que sa ne mène pas sur mon profil.

Source:La source

Le lien vers l'url du membre est censé être /membres/voir/La%2520source/ et non /membres/voir/La%252520source/

yapper-git commented 9 years ago

Il semble que l'argument "La source" dans l'URL soit échappé trois fois au lieu d'une fois ou de deux (d'après le 1er post de @firm1).

En effet:

>>> from urllib.parse import quote
>>> quote('La source')
'La%20source'
>>> quote(quote('La source'))
'La%2520source'
>>> quote(quote(quote('La source')))
'La%252520source'

EDIT: D'après @firm1 le lien devrait être /membres/voir/La%2520source/. Dans l'absolu ce devrait même être /membres/voir/La%20source/ en toute logique ! En réalité les 2 fonctionnent actuellement (càd échappé 1 ou 2 fois) mais selon moi seul le premeier devrait fonctionner. Pourquoi échapper deux fois, pour d'ailleurs ensuite lors du chargement de la page faire un urlunquote (une fois par Django en automatique, puis une fois dans la vue)…

yapper-git commented 9 years ago

J'ai regardé le code et il semble que zds/member/models.py soit en cause (plusieurs liens sont affectés : lien vers l'auteur lors du signalement d'une typo dans un article ou un tuto, lien sur la liste des articles/tutos à valider par un admin notamment).

Pour régler le problème, il suffit de supprimer le urlquote autour du nom d'utilisateur dans la méthode get_absolute_url de Profil (et virer un import qui du coup devient obsolète). Ici : https://github.com/zestedesavoir/zds-site/blob/dev/zds/member/models.py#L110

@firm1 c'est toi qui a ajouté ces lignes (urlquote dans get_absolute_url et l'import) : https://github.com/zestedesavoir/zds-site/commit/5579863a77d2f05788efdda645fa681a71104eca J'ai l'impression que tout cela est superflu. Y-a-t-il une raison de son existence ?

Eskimon commented 9 years ago

l'ulrquote est là pour ca : https://github.com/zestedesavoir/zds-site/issues/2301

yapper-git commented 9 years ago

En tout cas chez moi (tout à jour), cet urlquote est inutile pour corriger #2301 et ne fonctionne pas ! (voir message posté sur le sujet #2301 en question)

En effet ce n'est pas cette fonction là qui est appelée lors du message.author.get_absolute_url mais celle de Django dans le template !

A priori il faut mettre le urlquote dans le settings.py au niveau de:

ABSOLUTE_URL_OVERRIDES = {
    'auth.user': lambda u: '/membres/voir/{0}/'.format(u.username.encode('utf-8'))
}

Par contre avec le MP il y a un problème supplémentaire : le parseur Markdown échappe à nouveau l'URL je crois…

Je vais regarder et proposer une PR pour corriger tout ça si possible.

yapper-git commented 9 years ago

En résumé, actuellement:

>>> from zds.utils.templatetags.emarkdown import render_markdown
>>> render_markdown('[La source](http://zds.com/voir/La source)')
'<p><a href="http://zds.com/voir/La%20source">La source</a></p>'
>>> render_markdown('[La source](http://zds.com/voir/La%20source)')
'<p><a href="http://zds.com/voir/La%2520source">La source</a></p>'
>>> render_markdown('[La source](http://zds.com/voir/La%2520source)')
'<p><a href="http://zds.com/voir/La%252520source">La source</a></p>'

Je pense qu'il serait bien de virer le urlunquote mais actuellement c'est pas possible à cause du parseur markdown.

En effet il reçoit comme code (truc du genre):

[La source](http://zds.com/voir/La%20source) souhaite vous proposer…

mais il touche à l'URL (contrairement au parseur markdown par défaut) et donc échappe à nouveau…

Est-ce un bug du parseur ? Doit-il échappé automatiquement ?

PS : J'ai fait un commit sur un fork https://github.com/yapper-git/zds-site/commit/70afc9a6662eb317f101d14dcbc7a4d21323dcfb Tout fonctionne mais j'accepte comme actuellement les URLs quotés 2 fois à cause du parseur markdown…

yapper-git commented 9 years ago

Il y a actuellement d'autres problèmes du fait que le parseur Markdown soit utilisé pour envoyer ces MP et que le markdown a ses propres caractères qu'il faudrait échapper…

Par exemple si le nom d'utilisateur contient ], \ ou $ (d'autres ?) alors le lien n'est pas généré car le parseur n'a pas compris qu'il s'agissait d'un lien (et c'est plutôt logique d'ailleurs). Or ZdS n'a aucune restriction sur nom d'utilisateur choisi (sauf la longueur) semble-t-il.

Par exemple si le nom d'utilisateur est Micro$oft alors

>>> from zds.utils.templatetags.emarkdown import render_markdown
>>> render_markdown('[Micro$oft](http://zds.com/profil/Micro$oft)')
'<p>[Micro<span>$oft](http://zds.com/profil/Micro$</span>oft)</p>'

On voit qu'il n'y a aucune balise <a>. D'ailleurs il croît même qu'il y a une formule LaTeX… et le MP est illisible ou presque avec une formule mathématiques qui n'en n'est pas une.

Il faudrait une fonction qui permette d'échapper (de protéger) le texte d'un lien (ajouter un backslash suffirai a priori devant \ $ et ]).

Bref dans tous les cas on ne peut pas trouvé de solution simple pour que ça marche à tous les coups j'ai l'impression.

pierre-24 commented 9 years ago

Donc, on est ok pour le "double parsage" ... L'erreur markdown est à mon avis impossible à régler, me trompe-je ?

Eskimon commented 9 years ago

Ca a été mergé mais le ticket est pas fermé. Est-ce que tout est bien corrigé ici ?

SpaceFox commented 8 years ago

Up ?

GerardPaligot commented 8 years ago

ping @pierre-24

pierre-24 commented 8 years ago

J'ai testé ici, à priori on est bon :)