refactor: deduplicate nickname validation logic

This commit is contained in:
Alex P 2025-10-23 20:43:11 +03:00
parent d7a37b5eb3
commit 6898ede8e5
2 changed files with 34 additions and 37 deletions

View File

@ -95,42 +95,11 @@ func handleRequestSessionApprovalRPC(session *Session) (any, error) {
return map[string]interface{}{"status": "requested"}, nil return map[string]interface{}{"status": "requested"}, nil
} }
func validateNickname(nickname string) error {
if len(nickname) < minNicknameLength {
return fmt.Errorf("nickname must be at least %d characters", minNicknameLength)
}
if len(nickname) > maxNicknameLength {
return fmt.Errorf("nickname must be %d characters or less", maxNicknameLength)
}
if !isValidNickname(nickname) {
return errors.New("nickname can only contain letters, numbers, spaces, and - _ . @")
}
for i, r := range nickname {
if r < 32 || r == 127 {
return fmt.Errorf("nickname contains control character at position %d", i)
}
if r >= 0x200B && r <= 0x200D {
return errors.New("nickname contains zero-width character")
}
}
trimmed := ""
for _, r := range nickname {
trimmed += string(r)
}
if trimmed != nickname {
return errors.New("nickname contains disallowed unicode")
}
return nil
}
func handleUpdateSessionNicknameRPC(params map[string]any, session *Session) (any, error) { func handleUpdateSessionNicknameRPC(params map[string]any, session *Session) (any, error) {
sessionID, _ := params["sessionId"].(string) sessionID, _ := params["sessionId"].(string)
nickname, _ := params["nickname"].(string) nickname, _ := params["nickname"].(string)
if err := validateNickname(nickname); err != nil { if err := sessionManager.validateNickname(nickname); err != nil {
return nil, err return nil, err
} }

View File

@ -173,11 +173,8 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe
} }
if session.Nickname != "" { if session.Nickname != "" {
if len(session.Nickname) < minNicknameLength { if err := sm.validateNickname(session.Nickname); err != nil {
return fmt.Errorf("nickname must be at least %d characters", minNicknameLength) return err
}
if len(session.Nickname) > maxNicknameLength {
return fmt.Errorf("nickname must be %d characters or less", maxNicknameLength)
} }
} }
if len(session.Identity) > maxIdentityLength { if len(session.Identity) > maxIdentityLength {
@ -1529,6 +1526,37 @@ func generateNicknameFromUserAgent(userAgent string) string {
} }
// ensureNickname ensures session has a nickname, auto-generating if needed // ensureNickname ensures session has a nickname, auto-generating if needed
func (sm *SessionManager) validateNickname(nickname string) error {
if len(nickname) < minNicknameLength {
return fmt.Errorf("nickname must be at least %d characters", minNicknameLength)
}
if len(nickname) > maxNicknameLength {
return fmt.Errorf("nickname must be %d characters or less", maxNicknameLength)
}
if !isValidNickname(nickname) {
return errors.New("nickname can only contain letters, numbers, spaces, and - _ . @")
}
for i, r := range nickname {
if r < 32 || r == 127 {
return fmt.Errorf("nickname contains control character at position %d", i)
}
if r >= 0x200B && r <= 0x200D {
return errors.New("nickname contains zero-width character")
}
}
trimmed := ""
for _, r := range nickname {
trimmed += string(r)
}
if trimmed != nickname {
return errors.New("nickname contains disallowed unicode")
}
return nil
}
func (sm *SessionManager) ensureNickname(session *Session) { func (sm *SessionManager) ensureNickname(session *Session) {
// Skip if session already has a nickname // Skip if session already has a nickname
if session.Nickname != "" { if session.Nickname != "" {