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

Innanzitutto, grazie mille per il tuo aiuto! È comunque un bug interessante.

Il fatto è che potrei dover modificare il nome utente direttamente nel database, dato che la rotta non è disponibile :sweat_smile:

Puoi fornirmi una query?

Penso che non sia possibile, perché in tal caso bloccherei tutti i nomi che iniziano con Σ in Grecia (e di fatto interromperei gli accessi tramite Facebook per quegli utenti). Posso bloccare un pattern regex specifico? Così da assicurarmi che Σ sia almeno alla fine?

1 Mi Piace

Un altro membro si è registrato con lo stesso identico problema. Il mio punto è che, per noi, questo non è un caso limite. Ci sono letteralmente migliaia di nomi in greco che usano la Σ (o ς) alla fine del nome.

E purtroppo, dato che il nostro gruppo di età principale è > 40 anni, molti membri hanno il nome scritto tutto in maiuscolo su Facebook (:sweat_smile:), quindi quando usano l’accesso con Facebook, il loro nome viene copiato nel campo nome utente…

4 Mi Piace

Non ti preoccupare per Postgres. Dovremmo sempre confrontare con username_lower in SQL e non fare affidamento su LOWER(), perché username_lower non è semplicemente la versione in minuscolo del nome utente. Applichiamo anche la normalizzazione Unicode.

Sono d’accordo. Aggiungere una soluzione temporanea a User.normalize_username dovrebbe essere sufficiente per ora. Ci sono già state alcune discussioni nel bug di Ruby e sembra che non esista una soluzione semplice. Tuttavia, siamo fortunati, perché tutto ciò che dobbiamo fare è controllare l’ultimo carattere di un nome utente. È molto più semplice che farlo in una frase completa.

4 Mi Piace

Beh… come verrebbe gestito questo nome utente?

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

NodeJs lo gestisce correttamente, ma se controlli solo l’ultimo carattere del nome utente, il problema persiste.


(Quasi tutti i nomi maschili in greco, sia prenomi che cognomi, terminano con Σ)

3 Mi Piace

Giusto. Comunque, dovrebbe essere molto più semplice rispetto a un’implementazione completa, dato che dobbiamo preoccuparci solo di certi simboli come l’underscore, il trattino e forse i numeri? Dovrebbe essere fattibile.

2 Mi Piace

So che mi sto allontanando dalla discussione specifica su questo bug, ma quando penso a questa problematica, non posso ignorare il fatto che si potrebbe evitare.

Ho scoperto che ci sono alcune rotte API in Discourse che fanno riferimento a un utente tramite userId, mentre altre lo fanno tramite username. Non dovrebbe esserci maggiore coerenza (a favore dell’userId)?

Forse si potrebbe implementare qualcosa di simile a quanto avviene ora con le categorie e i tag? Avere sia lo username che l’userId nell’URL, ad esempio: https://meta.discourse.org/u/chrispanag/4387

Solo un pensiero :sweat_smile:

2 Mi Piace

Questo richiederà uno sforzo di pulizia; ho sicuramente visto alcune chiamate a LOWER().

4 Mi Piace

Questo argomento è emerso nel corso degli anni: Update quotes and mentions when username is changed - #10 by sam

Nel 2016 @eviltrout era contrario, non so qual è la sua posizione attuale.

Comunque, ho una soluzione alternativa in Discourse in questa PR:

Gestirà il problema del nuovo accesso su Facebook convertendo in minuscolo qualsiasi nome utente che inizia con sigma. Ciò significa che tutto ciò che dovete fare è correggere il nome utente di Spiros e di qualsiasi altro utente con sigma finale convertendoli in minuscolo, e il problema dovrebbe risolversi definitivamente.

(Unione della PR in attesa)

4 Mi Piace

Grazie mille @sam! Il tuo aiuto è stato immenso.

C’è un modo per farlo dalla console di Rails? (Poiché l’utente è danneggiato, non è possibile farlo tramite il pannello di amministrazione…)

1 Mi Piace

Sì, questo dovrebbe funzionare

./launcher enter app
rails c
u = User.find_by(username: 'ΣΠΥΡΟΣ')
u.username = 'σπυρος'
u.username_lower = 'σπυρος'
u.save!
4 Mi Piace

Ancora non amo usare gli ID ovunque, ma capisco che ci sono molti casi in cui ha senso.

In quei casi preferirei qualcosa come id-nomeutente, dove nomeutente è ciò che possiamo inserire in un URL. Potrebbe essere ignorato anche dal router. Ma almeno, quando condividi il link, avresti un’idea di cosa stai linkando.

6 Mi Piace

Per quanto riguarda PostgreSQL, sembra che impostare le collazioni corrette risolva il problema:

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

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

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

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

7 Mi Piace

A quanto pare, esistono altri caratteri Unicode che subiscono trasformazioni simili, ad esempio: ‘ß’ → ‘SS’ (tedesco)

È interessante indagare come vengono gestiti da Discourse…

Inoltre, puoi consultare anche questa risorsa:

Personalmente sono un grande sostenitore dello stile di routing di Stack Overflow per gli utenti:

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

Nel mondo Discourse questo sarebbe:

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

In questo modo ottieni il meglio da entrambi i mondi. Sì, capisco perfettamente l’obiezione: “Non mi piace avere 17174 da nessuna parte nell’URL, i nomi utente sono stabili”.

Detto questo, siamo sopravvissuti fino ad ora con le nostre rotte esistenti; è solo che ogni pochi anni emergono alcuni casi limite.

5 Mi Piace

Credo che sarebbe utile utilizzare l’ID invece del nome utente (o entrambi, ma affidandosi esclusivamente all’ID, come spiegato sopra) almeno nella pagina del profilo utente, in modo che l’amministratore possa modificare il nome utente tramite l’interfaccia di Discourse senza dover eseguire il comando nella console di Rails, nel caso in cui si verifichi un problema con il nome utente.

Dobbiamo preoccuparci solo dei caratteri in cui l’implementazione della conversione in minuscolo di JavaScript e Ruby differisce. Non il contrario.

Non esiste una regola fissa su come la lettera minuscola tedesca “ß” venga convertita in maiuscolo. Potrebbe diventare “SS”, “SZ” o addirittura la nuova lettera maiuscola “ẞ” (sì, c’è una sottile differenza). Invertire questo processo è possibile solo per “ẞ” e funziona correttamente sia in Ruby che in JavaScript.


Penso che dovremmo fare quanto segue:

  1. Unire la soluzione temporanea di @sam per risolvere il problema immediato
  2. Rimuovere LOWER(username) dalle query SQL, perché è semplicemente una cosa sbagliata da fare (ad esempio, manca la normalizzazione Unicode)
  3. Sperare che Ruby risolva il problema alla radice
  4. A lungo termine: valutare l’aggiunta degli ID utente alle route. Immagino che la parte più difficile sarà capire come gestire le virgolette e i menzioni.
3 Mi Piace

Non sono sicuro che sia correlato, ma abbiamo alcuni utenti con nomi unicode sparsi nel /log

ActionView::Template::Error (Nessuna rotta corrisponde a {:action=>"show", :controller=>"users", :username=>"ζηεδψ"}, vincoli non corrispondenti possibili: [:username])