From 6898ede8e5d9ae96ad65ad231d55c627fc396d70 Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 23 Oct 2025 20:43:11 +0300 Subject: [PATCH] refactor: deduplicate nickname validation logic --- jsonrpc_session_handlers.go | 33 +------------------------------- session_manager.go | 38 ++++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/jsonrpc_session_handlers.go b/jsonrpc_session_handlers.go index 34332a5d..e744b3d0 100644 --- a/jsonrpc_session_handlers.go +++ b/jsonrpc_session_handlers.go @@ -95,42 +95,11 @@ func handleRequestSessionApprovalRPC(session *Session) (any, error) { 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) { sessionID, _ := params["sessionId"].(string) nickname, _ := params["nickname"].(string) - if err := validateNickname(nickname); err != nil { + if err := sessionManager.validateNickname(nickname); err != nil { return nil, err } diff --git a/session_manager.go b/session_manager.go index 80543800..2f9fca1e 100644 --- a/session_manager.go +++ b/session_manager.go @@ -173,11 +173,8 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe } if session.Nickname != "" { - if len(session.Nickname) < minNicknameLength { - return fmt.Errorf("nickname must be at least %d characters", minNicknameLength) - } - if len(session.Nickname) > maxNicknameLength { - return fmt.Errorf("nickname must be %d characters or less", maxNicknameLength) + if err := sm.validateNickname(session.Nickname); err != nil { + return err } } if len(session.Identity) > maxIdentityLength { @@ -1529,6 +1526,37 @@ func generateNicknameFromUserAgent(userAgent string) string { } // 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) { // Skip if session already has a nickname if session.Nickname != "" {