mirror of https://github.com/jetkvm/kvm.git
refactor: deduplicate nickname validation logic
This commit is contained in:
parent
d7a37b5eb3
commit
6898ede8e5
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 != "" {
|
||||
|
|
|
|||
Loading…
Reference in New Issue