Cela peut-il également affecter les identifiants liés aux utilisateurs (contenant le nom d’utilisateur) ?
Nous avons quelques utilisateurs avec des noms d’utilisateur en UTF-8, et certains ne parviennent pas à accéder à leurs profils…
Cela ne devrait pas affecter l’utilisateur du tout, car les routes sont complètement différentes.
Peux-tu partager un lien où un profil échoue à se charger ? Ou au moins un exemple de nom d’utilisateur qui déclenche le bug ?
Ceci est un cas : https://rembetiko.gr/u/σπυρος
Le nom d’utilisateur est ΣΠΥΡΟΣ (qui est la forme majuscule de σπυρος)
Désolé pour le grec ![]()
Cette page est-elle derrière un proxy Cloudflare ? Pouvez-vous tester avec cette option désactivée ?
Aussi, quelles sont les valeurs des paramètres suivants :
-
caractères Unicode autorisés pour les noms d'utilisateur -
noms d'utilisateur Unicode
Voici les valeurs (assez classiques
)
Oui
Je viens de désactiver le proxy et de retester. Le problème persiste malheureusement. Je laisserai le proxy désactivé un moment pour que tu puisses le tester toi-même si tu le souhaites ![]()
Merci beaucoup pour ton aide ! ![]()
Hmmm.
Si j’essaie de charger la version majuscule, elle se charge d’abord : Προφίλ - ΣΠΥΡΟΣ - Ρεμπέτικο Φόρουμ, puis échoue lors d’une requête JSON ultérieure vers la version minuscule.
Il semble y avoir une erreur dans notre gestion des majuscules et des minuscules.
Étrangement, celui-ci fonctionne :
https://rembetiko.gr/u/αγγελικη_ντοτη
Le nom d’utilisateur est ΑΓΓΕΛΙΚΗ_ΝΤΟΤΗ (encore une fois, la forme en majuscules de αγγελικη_ντοτη)
Est-il possible qu’en grec, il existe deux façons de mettre la lettre « Σ » en minuscule ?
- « ς » lorsqu’elle est utilisée à la fin d’un mot
- « σ » partout ailleurs
Donc, est-ce que c’est faux ?
[1] pry(main) > "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
Oui, grammaticalement, c’est incorrect. La forme correcte est « σπυρος ».
Oh, alors je crains qu’il s’agisse d’un bug Ruby :
➜ ruby --version
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜ irb
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
Mais cela fonctionne bien lorsque le lien est créé… Il doit donc y avoir un moyen de le faire fonctionner… (?)
Cela n’a pas d’importance si Ruby convertit le nom d’utilisateur en sa version minuscule grammaticalement correcte, tant qu’il recherche toujours les utilisateurs avec le nom d’utilisateur normalisé (User.normalize_username en Ruby) et le champ username_lower dans la base de données.
Quelle requête JSON échoue ? Il est très probable qu’il existe une route qui utilise un mécanisme différent pour comparer les noms d’utilisateur.
Peut-être est-ce dû au fait que Ruby et JS ont des implémentations différentes ?
➜ ruby --version
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜ irb
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
➜ node
Welcome to Node.js v12.11.1.
Type ".help" for more information.
> "ΣΠΥΡΟΣ".toLowerCase()
'σπυρος'
Dans mes tests, Firefox se comporte de la même manière que NodeJS.
Le point de terminaison /u/#{username}.json ne renvoie que la colonne username et non la colonne username_lower. Nous nous reposons donc peut-être sur le navigateur ? Je creuse le sujet…
Oh, c’est mauvais. Donc, le problème est probablement ceci :
Je pensais suggérer d’ajouter username_lower au UserSerializer côté serveur plutôt que de le faire côté client, mais cela nous laisserait tout de même avec quelques autres occurrences de username.toLowerCase.
Je me demande si la meilleure solution ne serait pas d’utiliser mini_racer pour calculer username_lower côté serveur lorsqu’il contient des caractères non-ASCII. ![]()
Eh bien, indépendamment de la solution de contournement que nous recherchons, je signalerai ce problème à Ruby.
Juste pour information, PHP le fait de la même manière que Ruby… Cela me fait penser que c’est une conception intentionnelle (?)
Vous pouvez tester le code ici :
Curieusement, PostgreSQL échoue également ici :
[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]
Peut-être devrions-nous simplement traiter ce cas particulier dans notre méthode interne Discourse qui gère le calcul de username_lower ?
Trouvez toutes les méthodes qui appellent username_lower, redirigez-les vers une fonction centrale, puis permettez ce cas particulier (je suppose que nous pouvons utiliser un appel à mini_racer si nous le souhaitons, ou simplement appeler .lower et le corriger ensuite avec un appel à sub).
Je mets à jour le titre de l’OP ici pour plus de clarté.
Étant donné :
[4] pry(main)> "σπυρος".downcase
=> "σπυρος"
@chrispanag, une solution de contournement triviale pour vous consiste simplement à changer le nom d’utilisateur en σπυρος. Le nom d’utilisateur et username_lower seront exactement identiques, et cela fonctionnera parfaitement.
Je suis partagé quant à l’idée d’ajouter des solutions de contournement au cœur du système juste pour ce cas spécifique, surtout lorsqu’une solution de contournement totalement triviale existe.
De plus, vous pourriez interdire l’utilisation de Σ dans les noms d’utilisateur en utilisant notre paramètre allowed unicode username characters, ce qui garantirait que ce problème ne se reproduise jamais.
Je suis tout à fait favorable à la correction de Ruby et de Postgres ici, mais c’est une bataille longue de plusieurs années pour faire corriger ces problèmes.
Je suis entièrement d’accord ici : nous signalons les bogues en amont et les utilisateurs de Discourse peuvent utiliser des outils existants pour contourner le problème en attendant.
