Closed firm1 closed 8 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)…
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 ?
l'ulrquote est là pour ca : https://github.com/zestedesavoir/zds-site/issues/2301
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.
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…
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.
Donc, on est ok pour le "double parsage" ... L'erreur markdown est à mon avis impossible à régler, me trompe-je ?
Ca a été mergé mais le ticket est pas fermé. Est-ce que tout est bien corrigé ici ?
Up ?
ping @pierre-24
J'ai testé ici, à priori on est bon :)
Source:La source
Le lien vers l'url du membre est censé être
/membres/voir/La%2520source/
et non/membres/voir/La%252520source/