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

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

Closed
firm1 opened this issue Jun 3, 2015 · 11 comments
Closed

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

firm1 opened this issue Jun 3, 2015 · 11 comments
Labels
C-Back Concerne le back-end Django S-BUG Corrige un problème

Comments

@firm1
Copy link
Contributor

firm1 commented Jun 3, 2015

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

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

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) : 5579863
J'ai l'impression que tout cela est superflu. Y-a-t-il une raison de son existence ?

@Eskimon
Copy link
Contributor

Eskimon commented Jun 6, 2015

l'ulrquote est là pour ca : #2301

@yapper-git
Copy link
Contributor

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

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

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

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

@Eskimon
Copy link
Contributor

Eskimon commented Nov 1, 2015

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

@SpaceFox
Copy link
Contributor

Up ?

@GerardPaligot
Copy link
Member

ping @pierre-24

@pierre-24
Copy link
Member

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-Back Concerne le back-end Django S-BUG Corrige un problème
Projects
None yet
Development

No branches or pull requests

6 participants