feat: 实现 internal/protocol 帧类型、编解码、校验与请求指纹

This commit is contained in:
Nixevol
2026-09-30 06:01:08 +08:00
parent 86dc10a371
commit 31d92f841d
9 changed files with 2156 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
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
}