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

Kann dies auch benutzerbezogene Slugs (die den Benutzernamen enthalten) betreffen?

Wir haben einige Benutzer, die UTF-8-Benutzernamen verwenden, und einige von ihnen können nicht auf ihre Profile zugreifen…

2 „Gefällt mir“

Es sollte den Benutzer in keiner Weise beeinflussen, da die Routen völlig unterschiedlich sind.

Können Sie einen Link teilen, bei dem ein Profil nicht lädt? Oder zumindest ein Beispiel für einen Benutzernamen, der den Fehler auslöst?

4 „Gefällt mir“

Dies ist ein Fall: https://rembetiko.gr/u/σπυρος

Der Benutzername ist ΣΠΥΡΟΣ (die Großbuchstabenform von σπυρος)


Entschuldigung für das Griechisch :sweat_smile:

2 „Gefällt mir“

Diese Seite befindet sich hinter einem Cloudflare-Proxy? Können Sie das mit deaktiviertem Proxy testen?

Außerdem, welche Werte haben folgende Einstellungen:

  • erlaubte Unicode-Zeichen für Benutzernamen

  • Unicode-Benutzernamen

3 „Gefällt mir“

Hier sind die Werte (ziemlich standardmäßig :sweat_smile:)

Ja

Ich habe den Proxy gerade deaktiviert und erneut getestet. Das Problem besteht leider weiterhin. Ich werde den Proxy vorerst deaktiviert lassen, falls du es selbst testen möchtest :slight_smile:


Vielen Dank für deine Hilfe! :smiley:

2 „Gefällt mir“

Hmm.

Wenn ich versuche, die Großbuchstaben-Version zu laden, wird zunächst Προφίλ - ΣΠΥΡΟΣ - Ρεμπέτικο Φόρουμ geladen, aber bei einem nachfolgenden JSON-Abfrage für die Kleinbuchstaben-Version schlägt dies fehl.

Das sieht nach einem Fehler in unserer Groß-/Kleinschreibungs-Verarbeitung aus.

6 „Gefällt mir“

Seltsamerweise funktioniert dieser hier:

https://rembetiko.gr/u/αγγελικη_ντοτη

Der Benutzername ist ΑΓΓΕΛΙΚΗ_ΝΤΟΤΗ (wiederum die Großbuchstaben-Form von αγγελικη_ντοτη)

2 „Gefällt mir“

Könnte es sein, dass es im Griechischen zwei Möglichkeiten gibt, den Buchstaben ‘Σ’ in Kleinbuchstaben umzuwandeln?

  • ‘ς’, wenn er am Ende eines Wortes verwendet wird
  • ‘σ’ ansonsten überall
2 „Gefällt mir“

Ist das also falsch?

[1] pry(main)> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
2 „Gefällt mir“

Ja, grammatikalisch ist es falsch. Die korrekte Form lautet ‘σπυρος’.

2 „Gefällt mir“

Oh, leider handelt es sich dabei um einen Ruby-Fehler:

➜  ruby --version           
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜  irb           
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
3 „Gefällt mir“

Aber es funktioniert gut, wenn der Link erstellt wird… Also muss es einen Weg geben, damit es funktioniert… (?)

2 „Gefällt mir“

Es sollte keine Rolle spielen, ob Ruby den Benutzernamen in die grammatikalisch korrekte Kleinbuchstaben-Version umwandelt, solange Benutzer stets mit dem normalisierten Benutzernamen (User.normalize_username in Ruby) und dem username_lower in der Datenbank abgerufen werden.

Welche JSON-Anfrage schlägt fehl? Es ist sehr wahrscheinlich, dass eine Route einen anderen Mechanismus zum Vergleichen von Benutzernamen verwendet.

4 „Gefällt mir“

Vielleicht liegt es daran, dass Ruby und JS unterschiedliche Implementierungen haben?

➜  ruby --version           
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜  irb           
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
➜  node
Willkommen bei Node.js v12.11.1.
Tippe ".help" für weitere Informationen.
> "ΣΠΥΡΟΣ".toLowerCase()
'σπυρος'

Firefox verhält sich in meinen Tests genauso wie NodeJS.

Der Endpunkt /u/#{username}.json liefert nur die Spalte username und nicht die Spalte username_lower, also verlassen wir uns vielleicht hier auf den Browser? Ich untersuche das gerade…

6 „Gefällt mir“

Oh, das ist schlecht. Das Problem liegt also wahrscheinlich hier:

Ich wollte vorschlagen, username_lower stattdessen auf dem Server in den UserSerializer aufzunehmen, anstatt es auf dem Client zu erledigen. Das würde uns jedoch immer noch ein paar weitere Vorkommen von username.toLowerCase lassen.

Ich frage mich, ob die bessere Lösung darin bestehen würde, mini_racer zur Berechnung von username_lower auf dem Server zu verwenden, wenn es nicht-ASCII-Zeichen enthält. :thinking:

6 „Gefällt mir“

Nun, unabhängig von dem Workaround, den wir verfolgen, werde ich dies an Ruby berichten.

8 „Gefällt mir“

Nur zur Information: PHP macht es auf die gleiche Weise wie Ruby… Das lässt mich denken, dass es ein absichtliches Design ist (?)

Sie können den Code hier testen:

1 „Gefällt mir“

Interessanterweise schlägt auch Postgres hier fehl:

[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]

Vielleicht sollten wir diesen Kuriosität einfach in unserer internen Discourse-Methode, die die Berechnung von username_lower übernimmt, als Sonderfall behandeln?

Finde alle Methoden, die username_lower aufrufen, leite sie an eine zentrale Funktion weiter und ermögliche dann diesen Sonderfall (ich schätze, wir könnten hier einen mini_racer-Aufruf verwenden oder einfach .lower aufrufen und es danach mit einem sub-Aufruf korrigieren).

Ich habe den Titel des ursprünglichen Beitrags hier aktualisiert, um ihn klarer zu machen.

3 „Gefällt mir“

Gegeben:

[4] pry(main)> "σπυρος".downcase
=> "σπυρος"

@chrispanag Eine einfache Workaround-Lösung für Sie besteht darin, den Benutzernamen einfach in σπυρος zu ändern. Dann sind Benutzername und username_lower identisch, und das Problem ist gelöst.

Ich bin hin- und hergerissen, ob wir für diesen speziellen Fall Workarounds in den Kern einbauen sollten, zumal es eine völlig einfache Alternative gibt.

Zusätzlich könnten Sie die Verwendung von Σ in Benutzernamen über unsere Einstellung „Erlaubte Unicode-Zeichen für Benutzernamen

5 „Gefällt mir“

Ich stimme dem voll und ganz zu. Wir melden die Bugs an die Upstream-Entwickler, und Discourse-Nutzer können in der Zwischenzeit bestehende Tools als Workaround verwenden.

5 „Gefällt mir“