feat: 实现 internal/protocol 帧类型、编解码、校验与请求指纹
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user