mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
令smux+simplesocks支持user分流;fix #217
通过在utils添加 UserAssigner接口, 并在此用例时调用SetUser来达到目的
This commit is contained in:
11
main.go
11
main.go
@@ -596,6 +596,17 @@ func handshakeInserver(iics *incomingInserverConnState) (wlc net.Conn, udp_wlc n
|
||||
newiics := *iics
|
||||
newiics.isInner = true
|
||||
|
||||
//试图将user赋值给simplesocks, 使其在内部的对user的分流依旧可用
|
||||
if wlc != nil {
|
||||
if u, ok := wlc.(utils.User); ok {
|
||||
if wlc1 != nil {
|
||||
if us, ok := wlc1.(utils.UserAssigner); ok {
|
||||
us.SetUser(u)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
passToOutClient(newiics, false, wlc1, udp_wlc1, targetAddr1)
|
||||
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ func tryRejectWithHttpRespAndClose(rejectType string, underlay net.Conn) {
|
||||
zap.String("type", rejectType),
|
||||
)
|
||||
}
|
||||
|
||||
case "":
|
||||
fallthrough
|
||||
case "http":
|
||||
underlay.Write([]byte(httpLayer.Err403response))
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/e1732a364fed/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
// 实现 utils.User, utils.UserAssigner
|
||||
type TCPConn struct {
|
||||
net.Conn
|
||||
optionalReader io.Reader
|
||||
@@ -17,6 +18,40 @@ type TCPConn struct {
|
||||
underlayIsBasic bool
|
||||
|
||||
isServerEnd bool
|
||||
|
||||
upstreamUser utils.User
|
||||
}
|
||||
|
||||
// 实现 utils.UserAssigner
|
||||
func (c *TCPConn) SetUser(u utils.User) {
|
||||
c.upstreamUser = u
|
||||
}
|
||||
|
||||
func (c *TCPConn) IdentityStr() string {
|
||||
if c.upstreamUser != nil {
|
||||
return c.upstreamUser.IdentityStr()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *TCPConn) IdentityBytes() []byte {
|
||||
if c.upstreamUser != nil {
|
||||
return c.upstreamUser.IdentityBytes()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *TCPConn) AuthStr() string {
|
||||
if c.upstreamUser != nil {
|
||||
return c.upstreamUser.AuthStr()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
func (c *TCPConn) AuthBytes() []byte {
|
||||
if c.upstreamUser != nil {
|
||||
return c.upstreamUser.AuthBytes()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *TCPConn) Upstream() net.Conn {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
//User是一个 可确定唯一身份,且可验证该身份的 标识。
|
||||
// User是一个 可确定唯一身份,且可验证该身份的 标识。
|
||||
type User interface {
|
||||
IdentityStr() string //每个user唯一,通过比较这个string 即可 判断两个User 是否相等。相当于 user name
|
||||
|
||||
@@ -21,20 +21,20 @@ type UserWithPass interface {
|
||||
GetPassword() []byte
|
||||
}
|
||||
|
||||
//用户集合,判断用户是否存在并取出
|
||||
// 用户集合,判断用户是否存在并取出
|
||||
type UserSet interface {
|
||||
HasUserByBytes(bs []byte) User
|
||||
IDBytesLen() int //用户名bytes的最小长度
|
||||
}
|
||||
|
||||
//通过验证信息 试图取出 一个User
|
||||
// 通过验证信息 试图取出 一个User
|
||||
type UserAuthenticator interface {
|
||||
AuthUserByStr(authStr string) User
|
||||
AuthUserByBytes(authBytes []byte) User
|
||||
AuthBytesLen() int
|
||||
}
|
||||
|
||||
//用户容器,可判断是否存在,也可以验证
|
||||
// 用户容器,可判断是否存在,也可以验证
|
||||
type UserContainer interface {
|
||||
UserSet
|
||||
|
||||
@@ -47,6 +47,10 @@ type UserBus interface {
|
||||
DelUser(User)
|
||||
}
|
||||
|
||||
type UserAssigner interface {
|
||||
SetUser(User)
|
||||
}
|
||||
|
||||
type UserConf struct {
|
||||
User string `toml:"user"`
|
||||
Pass string `toml:"pass"`
|
||||
@@ -72,7 +76,7 @@ func InitRealV2rayUsers(uc []UserConf) (us []V2rayUser) {
|
||||
return
|
||||
}
|
||||
|
||||
//一种专门用于v2ray协议族(vmess/vless)的 用于标识用户的符号 , 实现 User 接口. (其实就是uuid)
|
||||
// 一种专门用于v2ray协议族(vmess/vless)的 用于标识用户的符号 , 实现 User 接口. (其实就是uuid)
|
||||
type V2rayUser [UUID_BytesLen]byte
|
||||
|
||||
func (u V2rayUser) IdentityStr() string {
|
||||
@@ -98,7 +102,7 @@ func NewV2rayUser(uuidStr string) (V2rayUser, error) {
|
||||
return V2rayUser(uuid), nil
|
||||
}
|
||||
|
||||
//used in proxy/socks5 and proxy.http. implements User
|
||||
// used in proxy/socks5 and proxy.http. implements User
|
||||
type UserPass struct {
|
||||
UserID, Password []byte
|
||||
}
|
||||
@@ -133,7 +137,7 @@ func (ph *UserPass) AuthBytes() []byte {
|
||||
return []byte(ph.AuthStr())
|
||||
}
|
||||
|
||||
// return len(ph.User) > 0 && len(ph.Password) > 0
|
||||
// return len(ph.User) > 0 && len(ph.Password) > 0
|
||||
func (ph *UserPass) Valid() bool {
|
||||
return len(ph.UserID) > 0 && len(ph.Password) > 0
|
||||
}
|
||||
@@ -158,14 +162,14 @@ func (ph *UserPass) AuthUserByBytes(bs []byte) User {
|
||||
return nil
|
||||
}
|
||||
|
||||
//require "user" and "pass" field. return true if both not empty.
|
||||
// require "user" and "pass" field. return true if both not empty.
|
||||
func (ph *UserPass) InitWithUrl(u *url.URL) bool {
|
||||
ph.UserID = []byte(u.Query().Get("user"))
|
||||
ph.Password = []byte(u.Query().Get("pass"))
|
||||
return len(ph.UserID) > 0 && len(ph.Password) > 0
|
||||
}
|
||||
|
||||
//uuid: "user:xxxx\npass:xxxx"
|
||||
// uuid: "user:xxxx\npass:xxxx"
|
||||
func (ph *UserPass) InitWithStr(str string) (ok bool) {
|
||||
var v1, v2 string
|
||||
ok, v1, v2 = CommonSplit(str, "user", "pass")
|
||||
@@ -177,7 +181,7 @@ func (ph *UserPass) InitWithStr(str string) (ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
//implements UserBus, UserSet, UserGetter; 只能存储同一类型的User.
|
||||
// implements UserBus, UserSet, UserGetter; 只能存储同一类型的User.
|
||||
// 通过 bytes存储用户id,而不是 str。
|
||||
type MultiUserMap struct {
|
||||
IDMap map[string]User
|
||||
@@ -220,7 +224,7 @@ func (mu *MultiUserMap) SetUseUUIDStr_asKey() {
|
||||
mu.AuthStrToBytesFunc = StrToUUID_slice
|
||||
}
|
||||
|
||||
//same as AddUser_nolock but with lock; concurrent safe
|
||||
// same as AddUser_nolock but with lock; concurrent safe
|
||||
func (mu *MultiUserMap) AddUser(u User) error {
|
||||
mu.Mutex.Lock()
|
||||
mu.AddUser_nolock(u)
|
||||
@@ -229,7 +233,7 @@ func (mu *MultiUserMap) AddUser(u User) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
//not concurrent safe, use with caution.
|
||||
// not concurrent safe, use with caution.
|
||||
func (mu *MultiUserMap) AddUser_nolock(u User) {
|
||||
if mu.StoreKeyByStr {
|
||||
|
||||
@@ -270,7 +274,7 @@ func (mu *MultiUserMap) LoadUsers(us []User) {
|
||||
}
|
||||
}
|
||||
|
||||
//通过ID查找
|
||||
// 通过ID查找
|
||||
func (mu *MultiUserMap) HasUserByStr(str string) bool {
|
||||
mu.Mutex.RLock()
|
||||
defer mu.Mutex.RUnlock()
|
||||
@@ -285,7 +289,7 @@ func (mu *MultiUserMap) HasUserByStr(str string) bool {
|
||||
}
|
||||
}
|
||||
|
||||
//通过ID查找
|
||||
// 通过ID查找
|
||||
func (mu *MultiUserMap) HasUserByBytes(bs []byte) User {
|
||||
mu.Mutex.RLock()
|
||||
defer mu.Mutex.RUnlock()
|
||||
@@ -309,7 +313,7 @@ func (mu *MultiUserMap) AuthBytesLen() int {
|
||||
return mu.TheAuthBytesLen
|
||||
}
|
||||
|
||||
//通过Auth查找
|
||||
// 通过Auth查找
|
||||
func (mu *MultiUserMap) AuthUserByStr(str string) User {
|
||||
mu.Mutex.RLock()
|
||||
|
||||
@@ -328,7 +332,7 @@ func (mu *MultiUserMap) AuthUserByStr(str string) User {
|
||||
return u
|
||||
}
|
||||
|
||||
//通过Auth查找
|
||||
// 通过Auth查找
|
||||
func (mu *MultiUserMap) AuthUserByBytes(bs []byte) User {
|
||||
mu.Mutex.RLock()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user