diff --git a/backend/app/cmd/server.go b/backend/app/cmd/server.go index d568c2a8..21707357 100644 --- a/backend/app/cmd/server.go +++ b/backend/app/cmd/server.go @@ -718,13 +718,17 @@ func (s *ServerCommand) addAuthProviders(authenticator *auth.Service) error { if s.Auth.Anonymous { log.Print("[INFO] anonymous access enabled") - var isValidAnonName = regexp.MustCompile(`^[a-zA-Z][\w ]+$`).MatchString + var isValidAnonName = regexp.MustCompile(`^[\p{L}\d_ ]+$`).MatchString authenticator.AddDirectProvider("anonymous", provider.CredCheckerFunc(func(user, _ string) (ok bool, err error) { user = strings.TrimSpace(user) if len(user) < 3 { log.Printf("[WARN] name %q is too short, should be at least 3 characters", user) return false, nil } + if len(user) > 64 { + log.Printf("[WARN] name %q is too long, should be up to 64 characters", user) + return false, nil + } if !isValidAnonName(user) { log.Printf("[WARN] name %q should have letters, digits, underscores and spaces only", user) diff --git a/backend/app/cmd/server_test.go b/backend/app/cmd/server_test.go index defbcc85..12c4d582 100644 --- a/backend/app/cmd/server_test.go +++ b/backend/app/cmd/server_test.go @@ -133,6 +133,12 @@ func TestServerApp_AnonMode(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode) + // try to login with non-latin name + resp, err = http.Get(fmt.Sprintf("http://localhost:%d/auth/anonymous/login?user=Раз_Два%20%20Три_34567&aud=remark", port)) + require.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusOK, resp.StatusCode) + // try to login with bad name resp, err = http.Get(fmt.Sprintf("http://localhost:%d/auth/anonymous/login?user=**blah123&aud=remark", port)) require.NoError(t, err) @@ -145,6 +151,13 @@ func TestServerApp_AnonMode(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusForbidden, resp.StatusCode) + // try to login with long name + ln := strings.Repeat("x", 65) + resp, err = http.Get(fmt.Sprintf("http://localhost:%d/auth/anonymous/login?user=%s&aud=remark", port, ln)) + require.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusForbidden, resp.StatusCode) + // try to login with admin name resp, err = http.Get(fmt.Sprintf("http://localhost:%d/auth/anonymous/login?user=umputun&aud=remark", port)) require.NoError(t, err)