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