Unicode-Benutzername mit Σ als letztem Zeichen führt zu einem Fehler beim Laden der Profilseite

Vielen Dank zuerst einmal für deine Hilfe! Es ist trotzdem ein interessanter Fehler.

Die Sache ist die: Ich muss den Benutzernamen möglicherweise über die Datenbank ändern, da die Route nicht verfügbar ist :sweat_smile:

Könntest du mir eine Abfrage bereitstellen?

[quote=“sam, post:19, topic:173182”]
Außerdem könntest du die Verwendung von Σ in Benutzernamen über unsere Einstellung „Erlaubte Unicode-Zeichen für Benutzernamen

1 „Gefällt mir“

Ein weiteres Mitglied hat sich mit exakt demselben Problem registriert. Mein Punkt ist: Für uns ist dies kein Randfall. Es gibt buchstäblich Tausende griechische Namen, die am Ende ein Σ (oder ς) verwenden.

Und leider gibt es angesichts unserer primären Altersgruppe (> 40) viele Mitglieder, die ihren Namen auf Facebook in GROSSBUCHSTABEN geschrieben haben (:sweat_smile:). Wenn sie sich also über Facebook anmelden, wird ihr Name in das Benutzernamen-Feld kopiert…

4 „Gefällt mir“

Ich würde mir wegen Postgres keine Sorgen machen. Wir sollten in SQL immer mit username_lower vergleichen und uns nicht auf LOWER() verlassen, da username_lower nicht einfach die Kleinbuchstaben-Version des Benutzernamens ist. Wir wenden zudem eine Unicode-Normalisierung an.

Ich stimme zu. Eine Workaround-Lösung in User.normalize_username sollte vorerst ausreichen. Im Ruby-Fehlerbericht wird dies bereits diskutiert, und es scheint keine einfache Lösung zu geben. Wir haben jedoch Glück, da wir nur das letzte Zeichen eines Benutzernamens prüfen müssen. Das ist deutlich einfacher als die Prüfung in einem vollständigen Satz.

4 „Gefällt mir“

Nun… wie würde dieser Benutzername behandelt werden?

Großbuchstaben: ΧΡΗΣΤΟΣ_ΠΑΝΑΓΙΩΤΑΚΟΠΟΥΛΟΣ
Kleinbuchstaben: χρηστος_παναγιωτακοπουλος oder χρηστοσ_παναγιωτακοπουλος

NodeJs handhabt dies korrekt, aber wenn man nur das letzte Zeichen des Benutzernamens prüft, bleibt das Problem bestehen.


(Fast alle männlichen Namen im Griechischen – sowohl Vor- als auch Nachnamen – enden mit Σ)

3 „Gefällt mir“

Richtig. Trotzdem sollte es viel einfacher sein als eine vollständige Implementierung, da wir uns nur um bestimmte Symbole wie Unterstrich, Bindestrich und vielleicht Zahlen kümmern müssen? Das sollte machbar sein.

2 „Gefällt mir“

Ich weiß, dass ich mich von dieser spezifischen Bug-Diskussion wegbewege, aber wenn ich an dieses Problem denke, kann ich nicht leugnen, dass es vermieden werden könnte.

Ich habe festgestellt, dass es in Discourse einige API-Routen gibt, die einen Benutzer über die userId referenzieren, während andere ihn über den Benutzernamen referenzieren. Sollte dies nicht konsistenter sein (zugunsten der userId)?

Vielleicht könnte man etwas umsetzen, wie es derzeit bei Kategorien/Tags der Fall ist: Sowohl den Benutzernamen als auch die userId in der URL angeben, z. B. https://meta.discourse.org/u/chrispanag/4387.

Nur ein Gedanke :sweat_smile:

2 „Gefällt mir“

Dies wird eine Bereinigungsaktion erfordern; ich habe definitiv einige LOWER()-Aufrufe gesehen.

4 „Gefällt mir“

Dieses Thema taucht seit Jahren immer wieder auf: Update quotes and mentions when username is changed - #10 by sam

2016 war @eviltrout dagegen, ich bin mir nicht sicher, wie er heute dazu steht.

Jedenfalls habe ich in Discourse einen Workaround in diesem PR implementiert:

Damit wird das Problem mit der neuen Facebook-Anmeldung behoben, indem Benutzernamen, die mit einem Sigma beginnen, in Kleinbuchstaben umgewandelt werden. Das bedeutet, dass Sie nur noch den Benutzernamen von Spiros und aller anderen Benutzer mit einem finalen Sigma in Kleinbuchstaben umwandeln müssen, und das Problem sollte langfristig behoben sein.

(PR-Merge ausstehend)

4 „Gefällt mir“

Vielen Dank, @sam! Deine Hilfe war enorm.

Gibt es eine Möglichkeit, das über die Rails-Konsole zu machen? (Da der Benutzer defekt ist, lässt sich das nicht über das Admin-Panel erledigen…)

1 „Gefällt mir“

Ja, das sollte funktionieren

./launcher enter app
rails c
u = User.find_by(username: 'ΣΠΥΡΟΣ')
u.username = 'σπυρος'
u.username_lower = 'σπυρος'
u.save!
4 „Gefällt mir“

Ich liebe es immer noch nicht, überall IDs zu verwenden, aber ich verstehe, dass es viele Fälle gibt, in denen das sinnvoll ist.

In diesen Fällen würde ich etwas wie id-benutzername bevorzugen, wobei der Benutzername alles ist, was wir in eine URL einfügen können. Er könnte sogar vom Router ignoriert werden. Aber zumindest hättest du beim Teilen des Links eine Ahnung, worauf du verlinkst.

6 „Gefällt mir“

Was PostgreSQL betrifft, scheint das Einrichten korrekter Kollationen das Problem zu beheben:

➜  discoursesmall git:(master) psql -d discourse_development
psql (13.1 (Ubuntu 13.1-1.pgdg20.10+1))
Type "help" for help.

discourse_development=# SELECT lower('ΣΠΥΡΟΣ');
 lower  
--------
 σπυροσ
(1 row)

discourse_development=# SELECT lower('ΣΠΥΡΟΣ' COLLATE "und-x-icu"); 
 lower  
--------
 σπυρος
(1 row)

Quelle: https://www.postgresql.org/message-id/5d80ac2d-3f1f-4d60-88a8-5602eb9978a3%40manitou-mail.org

7 „Gefällt mir“

Anscheinend gibt es weitere Unicode-Zeichen mit ähnlichen Transformationen, z. B. ‘ß’ → ‘SS’ (Deutsch).

Es ist interessant zu untersuchen, wie diese von Discourse behandelt werden…

Außerdem könntest du diese Ressource prüfen:

Persönlich bin ich ein großer Fan des Stack-Overflow-Stils für Benutzer-Routen:

https://stackoverflow.com/users/17174/sam-saffron

In der Discourse-Welt wäre das:

https://meta.discourse.org/u/17174/sam-saffron

Das gibt dir den Kuchen und du kannst ihn auch essen. Aber ja, ich verstehe den Einwand völlig: „Ich mag die 17174 nirgendwo in der URL, Benutzernamen sind stabil.

5 „Gefällt mir“

Ich denke, es wäre hilfreich, die ID anstelle des Benutzernamens (oder beides, aber mit Abhängigkeit nur von der ID, wie oben erklärt) zumindest auf der Benutzerprofilseite zu verwenden, damit der Administrator den Benutzernamen über die Discourse-Oberfläche ändern kann, ohne den Befehl in der Rails-Konsole ausführen zu müssen, falls beim Benutzernamen etwas schiefgeht.

Wir müssen uns nur um Zeichen kümmern, bei denen sich die JavaScript- und Ruby-Implementierung der Umwandlung in Kleinbuchstaben unterscheiden. Nicht umgekehrt.

Es gibt keine feste Regel, wie der deutsche Kleinbuchstabe „ß“ in Großbuchstaben umgewandelt wird. Es könnte „SS“, „SZ“ oder sogar der neue Großbuchstabe „ẞ“ sein (ja, es gibt einen subtilen Unterschied). Um diesen Vorgang umzukehren, ist nur bei „ẞ“ möglich, und das funktioniert sowohl in Ruby als auch in JavaScript korrekt.


Ich denke, wir sollten Folgendes tun:

  1. @sams Workaround zusammenführen, um das unmittelbare Problem zu beheben
  2. LOWER(username) aus SQL-Abfragen entfernen, da dies einfach eine schlechte™ Praxis ist (z. B. fehlende Unicode-Normalisierung)
  3. Hoffen, dass Ruby das zugrunde liegende Problem behebt
  4. Langfristig: Überlegen, ob wir Benutzer-IDs in Routen einfügen sollten. Ich schätze, der schwierigste Teil wird sein, herauszufinden, wie man mit Anführungszeichen und Erwähnungen umgeht.
3 „Gefällt mir“

Nicht sicher, ob es damit zusammenhängt, aber wir haben einige Benutzer mit Unicode-Namen, die im /log verstreut sind.

ActionView::Template::Error (Keine Route für {:action=>"show", :controller=>"users", :username=>"ζηεδψ"} gefunden, mögliche nicht übereinstimmende Constraints: [:username])