diff --git a/auth.go b/auth.go index c981a0a..0198883 100644 --- a/auth.go +++ b/auth.go @@ -22,7 +22,10 @@ type Session struct { } var ( - reNonWord = regexp.MustCompile(`[^._\w\s-]`) + // \p{L}\p{N} statt \w: Go-RE2-\w ist ASCII-only und würde Unicode-Namen + // (z. B. "佳紫达尔") komplett entfernen -> Login/Rename unmöglich. \p{L}\p{N} + // lässt Buchstaben und Ziffern aller Schriften zu. + reNonWord = regexp.MustCompile(`[^._\p{L}\p{N}\s-]`) reSpace = regexp.MustCompile(`\s+`) ) @@ -189,8 +192,10 @@ func handleHeaderbar(w http.ResponseWriter, r *http.Request) { func sanitizeUsername(u string) string { u = strings.TrimSpace(u) - if len(u) > 32 { - u = u[:32] + // Auf 32 Zeichen (Runen) kürzen, nicht 32 Bytes -- sonst kann der Schnitt + // mitten in eine Multibyte-Rune fallen und kaputtes UTF-8 erzeugen. + if r := []rune(u); len(r) > 32 { + u = string(r[:32]) } u = reNonWord.ReplaceAllString(u, "") u = reSpace.ReplaceAllString(u, "_")