Browse Source

User settings for trusted user

V2Ray 10 years ago
parent
commit
46c0d457d9

+ 40 - 14
common/net/timed_io.go

@@ -1,6 +1,7 @@
 package net
 package net
 
 
 import (
 import (
+  "io"
 	"net"
 	"net"
 	"time"
 	"time"
 )
 )
@@ -10,27 +11,21 @@ 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{
-		timeout:    timeout,
+	reader := &TimeOutReader{
 		connection: connection,
 		connection: connection,
 	}
 	}
+  reader.SetTimeOut(timeout)
+  return reader
 }
 }
 
 
-func (reader *TimeOutReader) Read(p []byte) (n int, err error) {
-	if reader.timeout > 0 {
-		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) Read(p []byte) (int, error) {
+	return reader.worker.Read(p)
 }
 }
 
 
 func (reader *TimeOutReader) GetTimeOut() int {
 func (reader *TimeOutReader) GetTimeOut() int {
@@ -38,5 +33,36 @@ 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)
 }
 }

+ 4 - 4
proxy/vmess/protocol/vmess.go

@@ -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
 	}
 	}

+ 12 - 8
proxy/vmess/protocol/vmess_test.go

@@ -32,15 +32,17 @@ func TestVMessSerialization(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
+  
+  testUser := &TestUser {
+    id: userId,
+  }
 
 
 	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{
-    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)
 	_, 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)

+ 2 - 1
proxy/vmess/vmessin.go

@@ -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)

+ 1 - 1
proxy/vmess/vmessout.go

@@ -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(),
 	}
 	}