package models import ( "regexp" "strings" ) const ( MaxAuthClientIDLen = 64 MaxAuthClientNameLen = 128 ) var authClientIDRe = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,63}$`) // AuthClientEntry 记录某第三方应用曾用本账号完成认证(登录 / 校验令牌 / 拉取 me)。 type AuthClientEntry struct { ClientID string `json:"clientId"` DisplayName string `json:"displayName,omitempty"` FirstSeenAt string `json:"firstSeenAt"` LastSeenAt string `json:"lastSeenAt"` } func NormalizeAuthClientID(raw string) (string, bool) { s := strings.TrimSpace(raw) if s == "" || len(s) > MaxAuthClientIDLen { return "", false } if !authClientIDRe.MatchString(s) { return "", false } return s, true } func ClampAuthClientName(raw string) string { s := strings.TrimSpace(raw) if len(s) > MaxAuthClientNameLen { return s[:MaxAuthClientNameLen] } return s }