package protocol import ( "strings" "unicode/utf8" ) func isEndpointIDChar(c rune) bool { return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == '.' || c == '-' } func isMessageIDChar(c rune) bool { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_' || c == '.' || c == '-' } // ValidEndpointID 校验端编号或群编号(小写字母、数字、_ . -,1–64)。 func ValidEndpointID(id string) bool { n := len(id) if n < MinIDLen || n > MaxIDLen { return false } for _, c := range id { if !isEndpointIDChar(c) { return false } } return true } // ValidMessageID 校验消息号(字母数字 _ . -,区分大小写,1–64)。 func ValidMessageID(id string) bool { n := len(id) if n < MinIDLen || n > MaxIDLen { return false } for _, c := range id { if !isMessageIDChar(c) { return false } } return true } // ValidLoginPassword 校验登录密码:8–128 字符,且不能以 nst_ 开头。空串表示由服务器生成,视为合法。 func ValidLoginPassword(pw string) bool { if pw == "" { return true } if strings.HasPrefix(pw, SessionTokenPrefix) { return false } n := utf8.RuneCountInString(pw) return n >= MinLoginPasswordLen && n <= MaxLoginPasswordLen } // LoginPasswordForbiddenPrefix 报告密码是否因 nst_ 前缀非法。 func LoginPasswordForbiddenPrefix(pw string) bool { return strings.HasPrefix(pw, SessionTokenPrefix) } // ValidTalkPassword 校验对话密码:空表示清除/不设;否则 4–64 字符。 func ValidTalkPassword(pw string) bool { if pw == "" { return true } n := utf8.RuneCountInString(pw) return n >= MinTalkPasswordLen && n <= MaxTalkPasswordLen } // ValidName 校验名称:最多 64 个 Unicode 字符。 func ValidName(name string) bool { return utf8.RuneCountInString(name) <= MaxNameChars } func requireRID(rid string) error { if rid == "" { return badRequest("missing rid") } return nil } func requireVersion(v int) error { if v != Version { return badRequest("unsupported version") } return nil } func requireType(got, want string) error { if got != want { return badRequest("wrong type") } return nil }