Nome utente Unicode con Σ come ultimo carattere causa un errore nel caricamento della pagina del profilo

Può questo influenzare anche gli slug relativi agli utenti (che contengono il nome utente)?
Abbiamo alcuni utenti che utilizzano nomi utente UTF-8 e alcuni di loro non riescono ad accedere ai propri profili…

2 Mi Piace

Non dovrebbe assolutamente influenzare l’utente, poiché le rotte sono completamente diverse.

Puoi condividere un link in cui un profilo non riesce a caricarsi? O almeno un esempio di nome utente che innesca il bug?

4 Mi Piace

Questo è un caso: https://rembetiko.gr/u/σπυρος

Il nome utente è ΣΠΥΡΟΣ (che è la forma maiuscola di σπυρος)


Scusa per il greco :sweat_smile:

2 Mi Piace

Questa pagina è dietro un proxy Cloudflare? Puoi provare a disattivarlo?

Inoltre, quali sono i valori delle impostazioni:

  • caratteri unicode consentiti per i nomi utente

  • nomi utente unicode

3 Mi Piace

Ecco i valori (abbastanza standard :sweat_smile:)

Ho appena disattivato il proxy e riprovato. Purtroppo il problema persiste. Tengo il proxy disattivato per un po’ così puoi provare tu stesso se vuoi :slight_smile:


Grazie mille per il tuo aiuto! :smiley:

2 Mi Piace

Hmmm.

Se provo a caricare la versione maiuscola, all’inizio carica: Προφίλ - ΣΠΥΡΟΣ - Ρεμπέτικο Φόρουμ e poi fallisce in una successiva richiesta JSON alla versione minuscola.

Sembra esserci un errore nella gestione delle maiuscole/minuscole da parte nostra.

6 Mi Piace

Stranamente questo funziona:

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

Il nome utente è ΑΓΓΕΛΙΚΗ_ΝΤΟΤΗ (di nuovo la forma maiuscola di αγγελικη_ντοτη)

2 Mi Piace

È possibile che in greco ci siano due modi per rendere minuscola la lettera ‘Σ’?

  • ‘ς’ quando è usata alla fine di una parola
  • ‘σ’ in qualsiasi altro caso
2 Mi Piace

Quindi è sbagliato?

[1] pry(main) > "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
2 Mi Piace

Sì, grammaticalmente è sbagliato. La forma corretta dovrebbe essere “σπυρος”

2 Mi Piace

Oh, quindi temo che si tratti di un bug di Ruby:

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

Ma funziona bene quando il link viene creato… Quindi deve esserci un modo per farlo funzionare… (?)

https://rembetiko.gr/u/σπυρος

2 Mi Piace

Non dovrebbe importare se Ruby converte il nome utente nella versione in minuscolo grammaticalmente corretta, purché l’utente venga sempre cercato con il nome utente normalizzato (User.normalize_username in Ruby) e con username_lower nel database.

Quale fetch JSON fallisce? È molto probabile che esista una rotta che utilizza un meccanismo diverso per confrontare i nomi utente.

4 Mi Piace

Forse è perché Ruby e JS hanno implementazioni diverse?

➜  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()
'σπυρος'

Nei miei test Firefox si comporta come NodeJS.

L’endpoint /u/#{username}.json restituisce solo la colonna username e non la colonna username_lower, quindi forse ci stiamo affidando al browser? Lo sto indagando ora…

6 Mi Piace

Oh, questo è un problema. Quindi, il problema è probabilmente questo:

Stavo per suggerire di aggiungere username_lower al UserSerializer sul server invece di farlo sul client, ma questo ci lascerebbe comunque con alcune altre occorrenze di username.toLowerCase.

Mi chiedo se la soluzione migliore sarebbe usare mini_racer per calcolare username_lower sul server quando contiene caratteri non ASCII. :thinking:

6 Mi Piace

Bene, indipendentemente dal workaround che stiamo cercando, segnalerò questo problema a Ruby.

8 Mi Piace

Solo per riferimento, PHP lo fa allo stesso modo di Ruby… Mi fa pensare che sia una scelta di progettazione intenzionale (?)

Puoi testare il codice qui:

1 Mi Piace

Interessante, anche Postgres fallisce qui:

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

Forse dovremmo semplicemente gestire questo comportamento anomalo come caso speciale nel nostro metodo interno di Discourse che calcola username_lower?

Trova tutti i metodi che chiamano username_lower, convoglia le loro chiamate a una funzione centrale e poi gestisci questo caso speciale (immagino che possiamo usare una chiamata a mini_racer se vogliamo, oppure semplicemente chiamare .lower e correggerla successivamente con una chiamata a sub)

Aggiorno il titolo dell’OP qui per renderlo più chiaro.

3 Mi Piace

Dato:

[4] pry(main)\u003e "\u03c3\u03c0\u03c5\u03c1\u03bf\u03c2".downcase
=\u003e "\u03c3\u03c0\u03c5\u03c1\u03bf\u03c2"

@chrispanag, una soluzione di lavoro banale per te è semplicemente cambiare il nome utente in σπυρος; username e username_lower saranno esattamente uguali e questo funzionerà senza problemi.

Sono indeciso sull’aggiungere soluzioni di lavoro al core solo per questo caso specifico, specialmente quando esiste una soluzione di lavoro totalmente banale.

Inoltre, potresti vietare l’uso di Σ nei nomi utente utilizzando l’impostazione allowed unicode username characters, il che garantirebbe che questo problema non si ripresenti mai.

Tutto sommato, sarei a favore di risolvere il problema in Ruby e Postgres, ma questa è una battaglia lunga di diversi anni per ottenere la correzione di queste cose.

5 Mi Piace

Sono pienamente d’accordo: segnaliamo i bug upstream e gli utenti di Discourse possono utilizzare gli strumenti esistenti per trovare soluzioni alternative nel frattempo.

5 Mi Piace