mirror of https://github.com/v2ray/v2ray-core
User settings for trusted user
parent
b44098d752
commit
46c0d457d9
|
@ -1,6 +1,7 @@
|
||||||
package net
|
package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -12,25 +13,19 @@ var (
|
||||||
type TimeOutReader struct {
|
type TimeOutReader struct {
|
||||||
timeout int
|
timeout int
|
||||||
connection net.Conn
|
connection net.Conn
|
||||||
|
worker io.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTimeOutReader(timeout int, connection net.Conn) *TimeOutReader {
|
func NewTimeOutReader(timeout int, connection net.Conn) *TimeOutReader {
|
||||||
return &TimeOutReader{
|
reader := &TimeOutReader{
|
||||||
timeout: timeout,
|
|
||||||
connection: connection,
|
connection: connection,
|
||||||
}
|
}
|
||||||
|
reader.SetTimeOut(timeout)
|
||||||
|
return reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (reader *TimeOutReader) Read(p []byte) (n int, err error) {
|
func (reader *TimeOutReader) Read(p []byte) (int, error) {
|
||||||
if reader.timeout > 0 {
|
return reader.worker.Read(p)
|
||||||
deadline := time.Duration(reader.timeout) * time.Second
|
|
||||||
reader.connection.SetReadDeadline(time.Now().Add(deadline))
|
|
||||||
}
|
|
||||||
n, err = reader.connection.Read(p)
|
|
||||||
if reader.timeout > 0 {
|
|
||||||
reader.connection.SetReadDeadline(emptyTime)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (reader *TimeOutReader) GetTimeOut() int {
|
func (reader *TimeOutReader) GetTimeOut() int {
|
||||||
|
@ -39,4 +34,35 @@ func (reader *TimeOutReader) GetTimeOut() int {
|
||||||
|
|
||||||
func (reader *TimeOutReader) SetTimeOut(value int) {
|
func (reader *TimeOutReader) SetTimeOut(value int) {
|
||||||
reader.timeout = value
|
reader.timeout = value
|
||||||
|
if value > 0 {
|
||||||
|
reader.worker = &timedReaderWorker{
|
||||||
|
timeout: value,
|
||||||
|
connection: reader.connection,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reader.worker = &noOpReaderWorker{
|
||||||
|
connection: reader.connection,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type timedReaderWorker struct {
|
||||||
|
timeout int
|
||||||
|
connection net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *timedReaderWorker) Read(p []byte) (int, error) {
|
||||||
|
deadline := time.Duration(this.timeout) * time.Second
|
||||||
|
this.connection.SetReadDeadline(time.Now().Add(deadline))
|
||||||
|
nBytes, err := this.connection.Read(p)
|
||||||
|
this.connection.SetReadDeadline(emptyTime)
|
||||||
|
return nBytes, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type noOpReaderWorker struct {
|
||||||
|
connection net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *noOpReaderWorker) Read(p []byte) (int, error) {
|
||||||
|
return this.connection.Read(p)
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ const (
|
||||||
// streaming.
|
// streaming.
|
||||||
type VMessRequest struct {
|
type VMessRequest struct {
|
||||||
Version byte
|
Version byte
|
||||||
UserId config.ID
|
User config.User
|
||||||
RequestIV []byte
|
RequestIV []byte
|
||||||
RequestKey []byte
|
RequestKey []byte
|
||||||
ResponseHeader []byte
|
ResponseHeader []byte
|
||||||
|
@ -98,7 +98,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
||||||
bufferLen := nBytes
|
bufferLen := nBytes
|
||||||
|
|
||||||
request := &VMessRequest{
|
request := &VMessRequest{
|
||||||
UserId: *userObj.ID(),
|
User: userObj,
|
||||||
Version: buffer.Value[0],
|
Version: buffer.Value[0],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u
|
||||||
}
|
}
|
||||||
|
|
||||||
counter := randomRangeInt64(time.Now().Unix(), 30)
|
counter := randomRangeInt64(time.Now().Unix(), 30)
|
||||||
hash := idHash.Hash(request.UserId.Bytes[:], counter)
|
hash := idHash.Hash(request.User.ID().Bytes[:], counter)
|
||||||
|
|
||||||
buffer.Append(hash)
|
buffer.Append(hash)
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u
|
||||||
buffer.AppendBytes(byte(fnvHash>>24), byte(fnvHash>>16), byte(fnvHash>>8), byte(fnvHash))
|
buffer.AppendBytes(byte(fnvHash>>24), byte(fnvHash>>16), byte(fnvHash>>8), byte(fnvHash))
|
||||||
encryptionEnd += 4
|
encryptionEnd += 4
|
||||||
|
|
||||||
aesCipher, err := aes.NewCipher(request.UserId.CmdKey())
|
aesCipher, err := aes.NewCipher(request.User.ID().CmdKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,14 +33,16 @@ func TestVMessSerialization(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
userSet := mocks.MockUserSet{[]config.User{}, make(map[string]int), make(map[string]int64)}
|
testUser := &TestUser {
|
||||||
userSet.AddUser(&TestUser{
|
|
||||||
id: userId,
|
id: userId,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
userSet := mocks.MockUserSet{[]config.User{}, make(map[string]int), make(map[string]int64)}
|
||||||
|
userSet.AddUser(testUser)
|
||||||
|
|
||||||
request := new(VMessRequest)
|
request := new(VMessRequest)
|
||||||
request.Version = byte(0x01)
|
request.Version = byte(0x01)
|
||||||
request.UserId = *userId
|
request.User = testUser
|
||||||
|
|
||||||
randBytes := make([]byte, 36)
|
randBytes := make([]byte, 36)
|
||||||
_, err = rand.Read(randBytes)
|
_, err = rand.Read(randBytes)
|
||||||
|
@ -69,7 +71,7 @@ func TestVMessSerialization(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01))
|
assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01))
|
||||||
assert.String(actualRequest.UserId.String).Named("UserId").Equals(request.UserId.String)
|
assert.String(actualRequest.User.ID().String).Named("UserId").Equals(request.User.ID().String)
|
||||||
assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:])
|
assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:])
|
||||||
assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:])
|
assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:])
|
||||||
assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:])
|
assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:])
|
||||||
|
@ -80,13 +82,15 @@ func TestVMessSerialization(t *testing.T) {
|
||||||
func BenchmarkVMessRequestWriting(b *testing.B) {
|
func BenchmarkVMessRequestWriting(b *testing.B) {
|
||||||
userId, _ := config.NewID("2b2966ac-16aa-4fbf-8d81-c5f172a3da51")
|
userId, _ := config.NewID("2b2966ac-16aa-4fbf-8d81-c5f172a3da51")
|
||||||
userSet := mocks.MockUserSet{[]config.User{}, make(map[string]int), make(map[string]int64)}
|
userSet := mocks.MockUserSet{[]config.User{}, make(map[string]int), make(map[string]int64)}
|
||||||
userSet.AddUser(&TestUser{
|
|
||||||
|
testUser := &TestUser{
|
||||||
id: userId,
|
id: userId,
|
||||||
})
|
}
|
||||||
|
userSet.AddUser(testUser)
|
||||||
|
|
||||||
request := new(VMessRequest)
|
request := new(VMessRequest)
|
||||||
request.Version = byte(0x01)
|
request.Version = byte(0x01)
|
||||||
request.UserId = *userId
|
request.User = testUser
|
||||||
|
|
||||||
randBytes := make([]byte, 36)
|
randBytes := make([]byte, 36)
|
||||||
rand.Read(randBytes)
|
rand.Read(randBytes)
|
||||||
|
|
|
@ -91,7 +91,8 @@ func (handler *VMessInboundHandler) HandleConnection(connection *net.TCPConn) er
|
||||||
readFinish.Lock()
|
readFinish.Lock()
|
||||||
writeFinish.Lock()
|
writeFinish.Lock()
|
||||||
|
|
||||||
connReader.SetTimeOut(120)
|
userSettings := config.GetUserSettings(request.User.Level())
|
||||||
|
connReader.SetTimeOut(userSettings.PayloadReadTimeout)
|
||||||
go handleInput(request, connReader, input, &readFinish)
|
go handleInput(request, connReader, input, &readFinish)
|
||||||
|
|
||||||
responseKey := md5.Sum(request.RequestKey)
|
responseKey := md5.Sum(request.RequestKey)
|
||||||
|
|
|
@ -67,7 +67,7 @@ func (handler *VMessOutboundHandler) Dispatch(firstPacket v2net.Packet, ray ray.
|
||||||
}
|
}
|
||||||
request := &protocol.VMessRequest{
|
request := &protocol.VMessRequest{
|
||||||
Version: protocol.Version,
|
Version: protocol.Version,
|
||||||
UserId: *vNextUser.ID(),
|
User: vNextUser,
|
||||||
Command: command,
|
Command: command,
|
||||||
Address: firstPacket.Destination().Address(),
|
Address: firstPacket.Destination().Address(),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue