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
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 != "" {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue