mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-12-23 03:43:33 +02:00
Add seed padding logic
- Seed is decoupled with XTLS Vision, which means Seed can turn on without flow - XTLS Vision now use Seed config to configure its padding only mode
This commit is contained in:
parent
855b773973
commit
38ef5eac28
8 changed files with 631 additions and 50 deletions
512
proxy/addons.pb.go
Normal file
512
proxy/addons.pb.go
Normal file
|
@ -0,0 +1,512 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.33.0
|
||||
// protoc v4.23.1
|
||||
// source: proxy/addons.proto
|
||||
|
||||
package proxy
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type SeedMode int32
|
||||
|
||||
const (
|
||||
SeedMode_Unknown SeedMode = 0
|
||||
SeedMode_PaddingOnly SeedMode = 1
|
||||
SeedMode_PaddingPlusDelay SeedMode = 2
|
||||
SeedMode_IndependentScheduler SeedMode = 3
|
||||
)
|
||||
|
||||
// Enum value maps for SeedMode.
|
||||
var (
|
||||
SeedMode_name = map[int32]string{
|
||||
0: "Unknown",
|
||||
1: "PaddingOnly",
|
||||
2: "PaddingPlusDelay",
|
||||
3: "IndependentScheduler",
|
||||
}
|
||||
SeedMode_value = map[string]int32{
|
||||
"Unknown": 0,
|
||||
"PaddingOnly": 1,
|
||||
"PaddingPlusDelay": 2,
|
||||
"IndependentScheduler": 3,
|
||||
}
|
||||
)
|
||||
|
||||
func (x SeedMode) Enum() *SeedMode {
|
||||
p := new(SeedMode)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
|
||||
func (x SeedMode) String() string {
|
||||
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||
}
|
||||
|
||||
func (SeedMode) Descriptor() protoreflect.EnumDescriptor {
|
||||
return file_proxy_addons_proto_enumTypes[0].Descriptor()
|
||||
}
|
||||
|
||||
func (SeedMode) Type() protoreflect.EnumType {
|
||||
return &file_proxy_addons_proto_enumTypes[0]
|
||||
}
|
||||
|
||||
func (x SeedMode) Number() protoreflect.EnumNumber {
|
||||
return protoreflect.EnumNumber(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use SeedMode.Descriptor instead.
|
||||
func (SeedMode) EnumDescriptor() ([]byte, []int) {
|
||||
return file_proxy_addons_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
type Addons struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Flow string `protobuf:"bytes,1,opt,name=Flow,proto3" json:"Flow,omitempty"`
|
||||
Seed []byte `protobuf:"bytes,2,opt,name=Seed,proto3" json:"Seed,omitempty"`
|
||||
Mode SeedMode `protobuf:"varint,3,opt,name=Mode,proto3,enum=xray.proxy.SeedMode" json:"Mode,omitempty"`
|
||||
Duration string `protobuf:"bytes,4,opt,name=Duration,proto3" json:"Duration,omitempty"` // "0-8" means apply to number of packets, "1000b-" means start applying once both side exchange 1kb data, counting two-ways
|
||||
Padding *PaddingConfig `protobuf:"bytes,5,opt,name=Padding,proto3" json:"Padding,omitempty"`
|
||||
Delay *DelayConfig `protobuf:"bytes,6,opt,name=Delay,proto3" json:"Delay,omitempty"`
|
||||
Scheduler *SchedulerConfig `protobuf:"bytes,7,opt,name=Scheduler,proto3" json:"Scheduler,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Addons) Reset() {
|
||||
*x = Addons{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proxy_addons_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Addons) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Addons) ProtoMessage() {}
|
||||
|
||||
func (x *Addons) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proxy_addons_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Addons.ProtoReflect.Descriptor instead.
|
||||
func (*Addons) Descriptor() ([]byte, []int) {
|
||||
return file_proxy_addons_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *Addons) GetFlow() string {
|
||||
if x != nil {
|
||||
return x.Flow
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Addons) GetSeed() []byte {
|
||||
if x != nil {
|
||||
return x.Seed
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Addons) GetMode() SeedMode {
|
||||
if x != nil {
|
||||
return x.Mode
|
||||
}
|
||||
return SeedMode_Unknown
|
||||
}
|
||||
|
||||
func (x *Addons) GetDuration() string {
|
||||
if x != nil {
|
||||
return x.Duration
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Addons) GetPadding() *PaddingConfig {
|
||||
if x != nil {
|
||||
return x.Padding
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Addons) GetDelay() *DelayConfig {
|
||||
if x != nil {
|
||||
return x.Delay
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Addons) GetScheduler() *SchedulerConfig {
|
||||
if x != nil {
|
||||
return x.Scheduler
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PaddingConfig struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
RegularMin uint32 `protobuf:"varint,1,opt,name=RegularMin,proto3" json:"RegularMin,omitempty"`
|
||||
RegularMax uint32 `protobuf:"varint,2,opt,name=RegularMax,proto3" json:"RegularMax,omitempty"`
|
||||
LongMin uint32 `protobuf:"varint,3,opt,name=LongMin,proto3" json:"LongMin,omitempty"`
|
||||
LongMax uint32 `protobuf:"varint,4,opt,name=LongMax,proto3" json:"LongMax,omitempty"`
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) Reset() {
|
||||
*x = PaddingConfig{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proxy_addons_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*PaddingConfig) ProtoMessage() {}
|
||||
|
||||
func (x *PaddingConfig) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proxy_addons_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use PaddingConfig.ProtoReflect.Descriptor instead.
|
||||
func (*PaddingConfig) Descriptor() ([]byte, []int) {
|
||||
return file_proxy_addons_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) GetRegularMin() uint32 {
|
||||
if x != nil {
|
||||
return x.RegularMin
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) GetRegularMax() uint32 {
|
||||
if x != nil {
|
||||
return x.RegularMax
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) GetLongMin() uint32 {
|
||||
if x != nil {
|
||||
return x.LongMin
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *PaddingConfig) GetLongMax() uint32 {
|
||||
if x != nil {
|
||||
return x.LongMax
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type DelayConfig struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
IsRandom bool `protobuf:"varint,1,opt,name=IsRandom,proto3" json:"IsRandom,omitempty"`
|
||||
MinMillis uint32 `protobuf:"varint,2,opt,name=MinMillis,proto3" json:"MinMillis,omitempty"`
|
||||
MaxMillis uint32 `protobuf:"varint,3,opt,name=MaxMillis,proto3" json:"MaxMillis,omitempty"`
|
||||
}
|
||||
|
||||
func (x *DelayConfig) Reset() {
|
||||
*x = DelayConfig{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proxy_addons_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *DelayConfig) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*DelayConfig) ProtoMessage() {}
|
||||
|
||||
func (x *DelayConfig) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proxy_addons_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use DelayConfig.ProtoReflect.Descriptor instead.
|
||||
func (*DelayConfig) Descriptor() ([]byte, []int) {
|
||||
return file_proxy_addons_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *DelayConfig) GetIsRandom() bool {
|
||||
if x != nil {
|
||||
return x.IsRandom
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *DelayConfig) GetMinMillis() uint32 {
|
||||
if x != nil {
|
||||
return x.MinMillis
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *DelayConfig) GetMaxMillis() uint32 {
|
||||
if x != nil {
|
||||
return x.MaxMillis
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type SchedulerConfig struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
TimeoutMillis uint32 `protobuf:"varint,1,opt,name=TimeoutMillis,proto3" json:"TimeoutMillis,omitempty"` // original traffic will not be sent right away but when scheduler want to send or pending buffer times out
|
||||
}
|
||||
|
||||
func (x *SchedulerConfig) Reset() {
|
||||
*x = SchedulerConfig{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proxy_addons_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *SchedulerConfig) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*SchedulerConfig) ProtoMessage() {}
|
||||
|
||||
func (x *SchedulerConfig) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proxy_addons_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use SchedulerConfig.ProtoReflect.Descriptor instead.
|
||||
func (*SchedulerConfig) Descriptor() ([]byte, []int) {
|
||||
return file_proxy_addons_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *SchedulerConfig) GetTimeoutMillis() uint32 {
|
||||
if x != nil {
|
||||
return x.TimeoutMillis
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_proxy_addons_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_proxy_addons_proto_rawDesc = []byte{
|
||||
0x0a, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
||||
0x22, 0x95, 0x02, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x46,
|
||||
0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12,
|
||||
0x12, 0x0a, 0x04, 0x53, 0x65, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53,
|
||||
0x65, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||
0x0e, 0x32, 0x14, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x53,
|
||||
0x65, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a,
|
||||
0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x50, 0x61, 0x64,
|
||||
0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x72, 0x61,
|
||||
0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x43,
|
||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x50, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2d,
|
||||
0x0a, 0x05, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
||||
0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x61, 0x79,
|
||||
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x39, 0x0a,
|
||||
0x09, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x1b, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x53, 0x63,
|
||||
0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x53,
|
||||
0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x61, 0x64,
|
||||
0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65,
|
||||
0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a,
|
||||
0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65,
|
||||
0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a,
|
||||
0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x4c, 0x6f,
|
||||
0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4c, 0x6f, 0x6e,
|
||||
0x67, 0x4d, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4c, 0x6f, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x18,
|
||||
0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4c, 0x6f, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x22, 0x65,
|
||||
0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a,
|
||||
0x08, 0x49, 0x73, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
|
||||
0x08, 0x49, 0x73, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x69, 0x6e,
|
||||
0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x69,
|
||||
0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x61, 0x78, 0x4d, 0x69,
|
||||
0x6c, 0x6c, 0x69, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x61, 0x78, 0x4d,
|
||||
0x69, 0x6c, 0x6c, 0x69, 0x73, 0x22, 0x37, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
|
||||
0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65,
|
||||
0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
||||
0x0d, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x2a, 0x58,
|
||||
0x0a, 0x08, 0x53, 0x65, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e,
|
||||
0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x61, 0x64, 0x64, 0x69,
|
||||
0x6e, 0x67, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x61, 0x64, 0x64,
|
||||
0x69, 0x6e, 0x67, 0x50, 0x6c, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x10, 0x02, 0x12, 0x18,
|
||||
0x0a, 0x14, 0x49, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68,
|
||||
0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x10, 0x03, 0x42, 0x40, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,
|
||||
0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x01, 0x5a, 0x1f, 0x67, 0x69,
|
||||
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72,
|
||||
0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0xaa, 0x02, 0x0a,
|
||||
0x58, 0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_proxy_addons_proto_rawDescOnce sync.Once
|
||||
file_proxy_addons_proto_rawDescData = file_proxy_addons_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_proxy_addons_proto_rawDescGZIP() []byte {
|
||||
file_proxy_addons_proto_rawDescOnce.Do(func() {
|
||||
file_proxy_addons_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_addons_proto_rawDescData)
|
||||
})
|
||||
return file_proxy_addons_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_proxy_addons_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
||||
var file_proxy_addons_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
|
||||
var file_proxy_addons_proto_goTypes = []interface{}{
|
||||
(SeedMode)(0), // 0: xray.proxy.SeedMode
|
||||
(*Addons)(nil), // 1: xray.proxy.Addons
|
||||
(*PaddingConfig)(nil), // 2: xray.proxy.PaddingConfig
|
||||
(*DelayConfig)(nil), // 3: xray.proxy.DelayConfig
|
||||
(*SchedulerConfig)(nil), // 4: xray.proxy.SchedulerConfig
|
||||
}
|
||||
var file_proxy_addons_proto_depIdxs = []int32{
|
||||
0, // 0: xray.proxy.Addons.Mode:type_name -> xray.proxy.SeedMode
|
||||
2, // 1: xray.proxy.Addons.Padding:type_name -> xray.proxy.PaddingConfig
|
||||
3, // 2: xray.proxy.Addons.Delay:type_name -> xray.proxy.DelayConfig
|
||||
4, // 3: xray.proxy.Addons.Scheduler:type_name -> xray.proxy.SchedulerConfig
|
||||
4, // [4:4] is the sub-list for method output_type
|
||||
4, // [4:4] is the sub-list for method input_type
|
||||
4, // [4:4] is the sub-list for extension type_name
|
||||
4, // [4:4] is the sub-list for extension extendee
|
||||
0, // [0:4] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_proxy_addons_proto_init() }
|
||||
func file_proxy_addons_proto_init() {
|
||||
if File_proxy_addons_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_proxy_addons_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Addons); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_proxy_addons_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*PaddingConfig); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_proxy_addons_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*DelayConfig); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_proxy_addons_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*SchedulerConfig); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_proxy_addons_proto_rawDesc,
|
||||
NumEnums: 1,
|
||||
NumMessages: 4,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_proxy_addons_proto_goTypes,
|
||||
DependencyIndexes: file_proxy_addons_proto_depIdxs,
|
||||
EnumInfos: file_proxy_addons_proto_enumTypes,
|
||||
MessageInfos: file_proxy_addons_proto_msgTypes,
|
||||
}.Build()
|
||||
File_proxy_addons_proto = out.File
|
||||
file_proxy_addons_proto_rawDesc = nil
|
||||
file_proxy_addons_proto_goTypes = nil
|
||||
file_proxy_addons_proto_depIdxs = nil
|
||||
}
|
|
@ -1,16 +1,16 @@
|
|||
syntax = "proto3";
|
||||
|
||||
package xray.proxy.vless.encoding;
|
||||
option csharp_namespace = "Xray.Proxy.Vless.Encoding";
|
||||
option go_package = "github.com/xtls/xray-core/proxy/vless/encoding";
|
||||
option java_package = "com.xray.proxy.vless.encoding";
|
||||
package xray.proxy;
|
||||
option csharp_namespace = "Xray.Proxy";
|
||||
option go_package = "github.com/xtls/xray-core/proxy";
|
||||
option java_package = "com.xray.proxy";
|
||||
option java_multiple_files = true;
|
||||
|
||||
message Addons {
|
||||
string Flow = 1;
|
||||
bytes Seed = 2;
|
||||
SeedMode Mode = 3;
|
||||
string Duration = 4; // "0-8" means apply to number of packets, "1kb-" means start applying once both side exchange 1kb data, counting two-ways
|
||||
string Duration = 4; // "0-8" means apply to number of packets, "1000b-" means start applying once both side exchange 1kb data, counting two-ways
|
||||
PaddingConfig Padding = 5;
|
||||
DelayConfig Delay = 6;
|
||||
SchedulerConfig Scheduler = 7;
|
|
@ -13,6 +13,7 @@ import (
|
|||
"math/big"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pires/go-proxyproto"
|
||||
|
@ -146,9 +147,9 @@ func NewTrafficState(userUUID []byte, flow string) *TrafficState {
|
|||
RemainingPadding: -1,
|
||||
CurrentCommand: 0,
|
||||
WriterSwitchToDirectCopy: false,
|
||||
IsPadding: true,
|
||||
};
|
||||
if len(flow) > 0 {
|
||||
state.IsPadding = true;
|
||||
state.WithinPaddingBuffers = true;
|
||||
}
|
||||
return &state
|
||||
|
@ -158,13 +159,15 @@ func NewTrafficState(userUUID []byte, flow string) *TrafficState {
|
|||
// Note Vision probably only make sense as the inner most layer of reader, since it need assess traffic state from origin proxy traffic
|
||||
type VisionReader struct {
|
||||
buf.Reader
|
||||
addons *Addons
|
||||
trafficState *TrafficState
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func NewVisionReader(reader buf.Reader, state *TrafficState, context context.Context) *VisionReader {
|
||||
func NewVisionReader(reader buf.Reader, addon *Addons, state *TrafficState, context context.Context) *VisionReader {
|
||||
return &VisionReader{
|
||||
Reader: reader,
|
||||
addons: addon,
|
||||
trafficState: state,
|
||||
ctx: context,
|
||||
}
|
||||
|
@ -177,7 +180,7 @@ func (w *VisionReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|||
w.trafficState.StartTime = time.Now()
|
||||
}
|
||||
w.trafficState.ByteReceived += int64(buffer.Len())
|
||||
if w.trafficState.WithinPaddingBuffers || w.trafficState.NumberOfPacketToFilter > 0 {
|
||||
if w.trafficState.WithinPaddingBuffers || !ShouldStopSeed(w.addons, w.trafficState) {
|
||||
mb2 := make(buf.MultiBuffer, 0, len(buffer))
|
||||
for _, b := range buffer {
|
||||
newbuffer := XtlsUnpadding(b, w.trafficState, w.ctx)
|
||||
|
@ -209,16 +212,18 @@ func (w *VisionReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|||
// Note Vision probably only make sense as the inner most layer of writer, since it need assess traffic state from origin proxy traffic
|
||||
type VisionWriter struct {
|
||||
buf.Writer
|
||||
addons *Addons
|
||||
trafficState *TrafficState
|
||||
ctx context.Context
|
||||
writeOnceUserUUID []byte
|
||||
}
|
||||
|
||||
func NewVisionWriter(writer buf.Writer, state *TrafficState, context context.Context) *VisionWriter {
|
||||
func NewVisionWriter(writer buf.Writer, addon *Addons, state *TrafficState, context context.Context) *VisionWriter {
|
||||
w := make([]byte, len(state.UserUUID))
|
||||
copy(w, state.UserUUID)
|
||||
return &VisionWriter{
|
||||
Writer: writer,
|
||||
addons: addon,
|
||||
trafficState: state,
|
||||
ctx: context,
|
||||
writeOnceUserUUID: w,
|
||||
|
@ -230,9 +235,9 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||
if w.trafficState.NumberOfPacketToFilter > 0 {
|
||||
XtlsFilterTls(mb, w.trafficState, w.ctx)
|
||||
}
|
||||
if w.trafficState.IsPadding {
|
||||
if w.trafficState.IsPadding && ShouldStartSeed(w.addons, w.trafficState){
|
||||
if len(mb) == 1 && mb[0] == nil {
|
||||
mb[0] = XtlsPadding(nil, CommandPaddingContinue, &w.writeOnceUserUUID, true, w.ctx) // we do a long padding to hide vless header
|
||||
mb[0] = XtlsPadding(nil, CommandPaddingContinue, &w.writeOnceUserUUID, true, w.addons, w.ctx) // we do a long padding to hide vless header
|
||||
} else {
|
||||
mb = ReshapeMultiBuffer(w.ctx, mb)
|
||||
longPadding := w.trafficState.IsTLS
|
||||
|
@ -243,18 +248,20 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||
}
|
||||
var command byte = CommandPaddingContinue
|
||||
if i == len(mb) - 1 {
|
||||
command = CommandPaddingEnd
|
||||
if w.trafficState.EnableXtls {
|
||||
command = CommandPaddingDirect
|
||||
w.trafficState.IsPadding = false
|
||||
} else if ShouldStopSeed(w.addons, w.trafficState) {
|
||||
command = CommandPaddingEnd
|
||||
w.trafficState.IsPadding = false
|
||||
}
|
||||
}
|
||||
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, true, w.ctx)
|
||||
w.trafficState.IsPadding = false // padding going to end
|
||||
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, true, w.addons, w.ctx)
|
||||
longPadding = false
|
||||
continue
|
||||
} else if !w.trafficState.IsTLS12orAbove && w.trafficState.NumberOfPacketToFilter <= 1 { // For compatibility with earlier vision receiver, we finish padding 1 packet early
|
||||
} else if !w.trafficState.IsTLS12orAbove && ShouldStopSeed(w.addons, w.trafficState) {
|
||||
w.trafficState.IsPadding = false
|
||||
mb[i] = XtlsPadding(b, CommandPaddingEnd, &w.writeOnceUserUUID, longPadding, w.ctx)
|
||||
mb[i] = XtlsPadding(b, CommandPaddingEnd, &w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
|
||||
break
|
||||
}
|
||||
var command byte = CommandPaddingContinue
|
||||
|
@ -264,7 +271,7 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||
command = CommandPaddingDirect
|
||||
}
|
||||
}
|
||||
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, longPadding, w.ctx)
|
||||
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -311,24 +318,24 @@ func ReshapeMultiBuffer(ctx context.Context, buffer buf.MultiBuffer) buf.MultiBu
|
|||
}
|
||||
|
||||
// XtlsPadding add padding to eliminate length signature during tls handshake
|
||||
func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, longPadding bool, ctx context.Context) *buf.Buffer {
|
||||
func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, longPadding bool, addons *Addons, ctx context.Context) *buf.Buffer {
|
||||
var contentLen int32 = 0
|
||||
var paddingLen int32 = 0
|
||||
if b != nil {
|
||||
contentLen = b.Len()
|
||||
}
|
||||
if contentLen < 900 && longPadding {
|
||||
l, err := rand.Int(rand.Reader, big.NewInt(500))
|
||||
if contentLen < int32(addons.Padding.LongMin) && longPadding {
|
||||
l, err := rand.Int(rand.Reader, big.NewInt(int64(addons.Padding.LongMax - addons.Padding.LongMin)))
|
||||
if err != nil {
|
||||
errors.LogDebugInner(ctx, err, "failed to generate padding")
|
||||
}
|
||||
paddingLen = int32(l.Int64()) + 900 - contentLen
|
||||
paddingLen = int32(l.Int64()) + int32(addons.Padding.LongMin) - contentLen
|
||||
} else {
|
||||
l, err := rand.Int(rand.Reader, big.NewInt(256))
|
||||
l, err := rand.Int(rand.Reader, big.NewInt(int64(addons.Padding.RegularMax - addons.Padding.RegularMin)))
|
||||
if err != nil {
|
||||
errors.LogDebugInner(ctx, err, "failed to generate padding")
|
||||
}
|
||||
paddingLen = int32(l.Int64())
|
||||
paddingLen = int32(l.Int64()) + int32(addons.Padding.RegularMin)
|
||||
}
|
||||
if paddingLen > buf.Size-21-contentLen {
|
||||
paddingLen = buf.Size - 21 - contentLen
|
||||
|
@ -583,3 +590,50 @@ func readV(ctx context.Context, reader buf.Reader, writer buf.Writer, timer sign
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func ShouldStartSeed(addons *Addons, trafficState *TrafficState) bool {
|
||||
if len(addons.Duration) == 0 || len(strings.Split(addons.Duration, "-")) < 2 {
|
||||
return false
|
||||
}
|
||||
start := strings.ToLower(strings.Split(addons.Duration, "-")[0])
|
||||
if len(start) == 0 {
|
||||
return true
|
||||
}
|
||||
if strings.Contains(start, "b") {
|
||||
start = strings.TrimRight(start, "b")
|
||||
i, err := strconv.Atoi(start)
|
||||
if err == nil && i <= int(trafficState.ByteSent + trafficState.ByteSent) {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
i, err := strconv.Atoi(start)
|
||||
if err == nil && i <= trafficState.NumberOfPacketSent + trafficState.NumberOfPacketReceived {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func ShouldStopSeed(addons *Addons, trafficState *TrafficState) bool {
|
||||
if len(addons.Duration) == 0 || len(strings.Split(addons.Duration, "-")) < 2 {
|
||||
return true
|
||||
}
|
||||
start := strings.ToLower(strings.Split(addons.Duration, "-")[1])
|
||||
if len(start) == 0 { // infinite
|
||||
return false
|
||||
}
|
||||
if strings.Contains(start, "b") {
|
||||
start = strings.TrimRight(start, "b")
|
||||
i, err := strconv.Atoi(start)
|
||||
if err == nil && i > int(trafficState.ByteSent + trafficState.ByteSent) {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
i, err := strconv.Atoi(start)
|
||||
if err == nil && i > trafficState.NumberOfPacketSent + trafficState.NumberOfPacketReceived {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func EncodeHeaderAddons(buffer *buf.Buffer, addons *Addons) error {
|
||||
func EncodeHeaderAddons(buffer *buf.Buffer, addons *proxy.Addons) error {
|
||||
if addons.Flow == vless.XRV || len(addons.Seed) > 0 {
|
||||
bytes, err := proto.Marshal(addons)
|
||||
if err != nil {
|
||||
|
@ -33,8 +33,8 @@ func EncodeHeaderAddons(buffer *buf.Buffer, addons *Addons) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*Addons, error) {
|
||||
addons := new(Addons)
|
||||
func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*proxy.Addons, error) {
|
||||
addons := new(proxy.Addons)
|
||||
buffer.Clear()
|
||||
if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
|
||||
return nil, errors.New("failed to read addons protobuf length").Base(err)
|
||||
|
@ -55,8 +55,8 @@ func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*Addons, error) {
|
|||
}
|
||||
|
||||
// EncodeBodyAddons returns a Writer that auto-encrypt content written by caller.
|
||||
func EncodeBodyAddons(writer buf.Writer, request *protocol.RequestHeader, requestAddons *Addons, state *proxy.TrafficState, context context.Context) buf.Writer {
|
||||
w := proxy.NewVisionWriter(writer, state, context)
|
||||
func EncodeBodyAddons(writer buf.Writer, request *protocol.RequestHeader, addons *proxy.Addons, state *proxy.TrafficState, context context.Context) buf.Writer {
|
||||
w := proxy.NewVisionWriter(writer, addons, state, context)
|
||||
if request.Command == protocol.RequestCommandUDP {
|
||||
return NewMultiLengthPacketWriter(w)
|
||||
}
|
||||
|
@ -64,8 +64,8 @@ func EncodeBodyAddons(writer buf.Writer, request *protocol.RequestHeader, reques
|
|||
}
|
||||
|
||||
// DecodeBodyAddons returns a Reader from which caller can fetch decrypted body.
|
||||
func DecodeBodyAddons(reader io.Reader, request *protocol.RequestHeader, addons *Addons, state *proxy.TrafficState, context context.Context) buf.Reader {
|
||||
r := proxy.NewVisionReader(buf.NewReader(reader), state, context)
|
||||
func DecodeBodyAddons(reader io.Reader, request *protocol.RequestHeader, addons *proxy.Addons, state *proxy.TrafficState, context context.Context) buf.Reader {
|
||||
r := proxy.NewVisionReader(buf.NewReader(reader), addons, state, context)
|
||||
if request.Command == protocol.RequestCommandUDP {
|
||||
return NewLengthPacketReader(&buf.BufferedReader{Reader: r})
|
||||
}
|
||||
|
@ -178,32 +178,46 @@ func (r *LengthPacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|||
return mb, nil
|
||||
}
|
||||
|
||||
func PopulateSeed(seed string, addons *Addons) {
|
||||
func PopulateSeed(seed string, addons *proxy.Addons) {
|
||||
if len(seed) > 0 {
|
||||
addons.Seed = []byte {1} // only turn on, more TBD
|
||||
addons.Mode = SeedMode_PaddingPlusDelay
|
||||
addons.Mode = proxy.SeedMode_PaddingPlusDelay
|
||||
addons.Duration = "0-8"
|
||||
addons.Padding = &PaddingConfig{
|
||||
addons.Padding = &proxy.PaddingConfig{
|
||||
RegularMin: 0,
|
||||
RegularMax: 256,
|
||||
LongMin: 900,
|
||||
LongMax: 1400,
|
||||
}
|
||||
addons.Delay = &DelayConfig{
|
||||
addons.Delay = &proxy.DelayConfig{
|
||||
IsRandom: true,
|
||||
MinMillis: 100,
|
||||
MaxMillis: 500,
|
||||
}
|
||||
addons.Scheduler = &SchedulerConfig{
|
||||
addons.Scheduler = &proxy.SchedulerConfig{
|
||||
TimeoutMillis: 600,
|
||||
}
|
||||
} else if addons.Flow == vless.XRV {
|
||||
addons.Seed = []byte {1} // only turn on, more TBD
|
||||
addons.Mode = proxy.SeedMode_PaddingOnly
|
||||
addons.Duration = "0-8"
|
||||
addons.Padding = &proxy.PaddingConfig{
|
||||
RegularMin: 0,
|
||||
RegularMax: 256,
|
||||
LongMin: 900,
|
||||
LongMax: 1400,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func CheckSeed(requestAddons *Addons, responseAddons *Addons) error {
|
||||
func CheckSeed(requestAddons *proxy.Addons, responseAddons *proxy.Addons) error {
|
||||
if !bytes.Equal(requestAddons.Seed, responseAddons.Seed) {
|
||||
return errors.New("Seed bytes not match", requestAddons.Seed, responseAddons.Seed)
|
||||
}
|
||||
if responseAddons.Flow == vless.XRV && len(responseAddons.Seed) == 0 && requestAddons.Mode == proxy.SeedMode_Unknown {
|
||||
// old vision server config allow empty seed from clients for backwards compatibility
|
||||
return nil
|
||||
}
|
||||
if requestAddons.Mode != responseAddons.Mode {
|
||||
return errors.New("Mode not match", requestAddons.Mode, responseAddons.Mode)
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ var addrParser = protocol.NewAddressParser(
|
|||
)
|
||||
|
||||
// EncodeRequestHeader writes encoded request header into the given writer.
|
||||
func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requestAddons *Addons) error {
|
||||
func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requestAddons *proxy.Addons) error {
|
||||
buffer := buf.StackNew()
|
||||
defer buffer.Release()
|
||||
|
||||
|
@ -62,7 +62,7 @@ func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requ
|
|||
}
|
||||
|
||||
// DecodeRequestHeader decodes and returns (if successful) a RequestHeader from an input stream.
|
||||
func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator vless.Validator) (*protocol.RequestHeader, *Addons, bool, error) {
|
||||
func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator vless.Validator) (*protocol.RequestHeader, *proxy.Addons, bool, error) {
|
||||
buffer := buf.StackNew()
|
||||
defer buffer.Release()
|
||||
|
||||
|
@ -131,7 +131,7 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat
|
|||
}
|
||||
|
||||
// EncodeResponseHeader writes encoded response header into the given writer.
|
||||
func EncodeResponseHeader(writer io.Writer, request *protocol.RequestHeader, responseAddons *Addons) error {
|
||||
func EncodeResponseHeader(writer io.Writer, request *protocol.RequestHeader, responseAddons *proxy.Addons) error {
|
||||
buffer := buf.StackNew()
|
||||
defer buffer.Release()
|
||||
|
||||
|
@ -151,7 +151,7 @@ func EncodeResponseHeader(writer io.Writer, request *protocol.RequestHeader, res
|
|||
}
|
||||
|
||||
// DecodeResponseHeader decodes and returns (if successful) a ResponseHeader from an input stream.
|
||||
func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*Addons, error) {
|
||||
func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*proxy.Addons, error) {
|
||||
buffer := buf.StackNew()
|
||||
defer buffer.Release()
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"github.com/xtls/xray-core/common/net"
|
||||
"github.com/xtls/xray-core/common/protocol"
|
||||
"github.com/xtls/xray-core/common/uuid"
|
||||
"github.com/xtls/xray-core/proxy"
|
||||
"github.com/xtls/xray-core/proxy/vless"
|
||||
. "github.com/xtls/xray-core/proxy/vless/encoding"
|
||||
)
|
||||
|
@ -37,7 +38,7 @@ func TestRequestSerialization(t *testing.T) {
|
|||
Address: net.DomainAddress("www.example.com"),
|
||||
Port: net.Port(443),
|
||||
}
|
||||
expectedAddons := &Addons{}
|
||||
expectedAddons := &proxy.Addons{}
|
||||
|
||||
buffer := buf.StackNew()
|
||||
common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons))
|
||||
|
@ -52,7 +53,7 @@ func TestRequestSerialization(t *testing.T) {
|
|||
t.Error(r)
|
||||
}
|
||||
|
||||
addonsComparer := func(x, y *Addons) bool {
|
||||
addonsComparer := func(x, y *proxy.Addons) bool {
|
||||
return (x.Flow == y.Flow) && (cmp.Equal(x.Seed, y.Seed))
|
||||
}
|
||||
if r := cmp.Diff(actualAddons, expectedAddons, cmp.Comparer(addonsComparer)); r != "" {
|
||||
|
@ -78,7 +79,7 @@ func TestInvalidRequest(t *testing.T) {
|
|||
Address: net.DomainAddress("www.example.com"),
|
||||
Port: net.Port(443),
|
||||
}
|
||||
expectedAddons := &Addons{}
|
||||
expectedAddons := &proxy.Addons{}
|
||||
|
||||
buffer := buf.StackNew()
|
||||
common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons))
|
||||
|
@ -109,7 +110,7 @@ func TestMuxRequest(t *testing.T) {
|
|||
Command: protocol.RequestCommandMux,
|
||||
Address: net.DomainAddress("v1.mux.cool"),
|
||||
}
|
||||
expectedAddons := &Addons{}
|
||||
expectedAddons := &proxy.Addons{}
|
||||
|
||||
buffer := buf.StackNew()
|
||||
common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons))
|
||||
|
@ -124,7 +125,7 @@ func TestMuxRequest(t *testing.T) {
|
|||
t.Error(r)
|
||||
}
|
||||
|
||||
addonsComparer := func(x, y *Addons) bool {
|
||||
addonsComparer := func(x, y *proxy.Addons) bool {
|
||||
return (x.Flow == y.Flow) && (cmp.Equal(x.Seed, y.Seed))
|
||||
}
|
||||
if r := cmp.Diff(actualAddons, expectedAddons, cmp.Comparer(addonsComparer)); r != "" {
|
||||
|
|
|
@ -215,7 +215,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||
}
|
||||
|
||||
var request *protocol.RequestHeader
|
||||
var requestAddons *encoding.Addons
|
||||
var requestAddons *proxy.Addons
|
||||
var err error
|
||||
|
||||
napfb := h.fallbacks
|
||||
|
@ -455,7 +455,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||
|
||||
account := request.User.Account.(*vless.MemoryAccount)
|
||||
|
||||
responseAddons := &encoding.Addons{
|
||||
responseAddons := &proxy.Addons{
|
||||
// Flow: requestAddons.Flow,
|
||||
}
|
||||
encoding.PopulateSeed(account.Seed, responseAddons)
|
||||
|
@ -536,7 +536,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||
defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly)
|
||||
|
||||
// default: clientReader := reader
|
||||
clientReader := encoding.DecodeBodyAddons(reader, request, requestAddons, trafficState, ctx)
|
||||
clientReader := encoding.DecodeBodyAddons(reader, request, responseAddons, trafficState, ctx)
|
||||
|
||||
var err error
|
||||
|
||||
|
@ -564,7 +564,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||
}
|
||||
|
||||
// default: clientWriter := bufferWriter
|
||||
clientWriter := encoding.EncodeBodyAddons(bufferWriter, request, requestAddons, trafficState, ctx)
|
||||
clientWriter := encoding.EncodeBodyAddons(bufferWriter, request, responseAddons, trafficState, ctx)
|
||||
multiBuffer, err1 := serverReader.ReadMultiBuffer()
|
||||
if err1 != nil {
|
||||
return err1 // ...
|
||||
|
|
|
@ -116,7 +116,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|||
|
||||
account := request.User.Account.(*vless.MemoryAccount)
|
||||
|
||||
requestAddons := &encoding.Addons{
|
||||
requestAddons := &proxy.Addons{
|
||||
Flow: account.Flow,
|
||||
}
|
||||
encoding.PopulateSeed(account.Seed, requestAddons)
|
||||
|
|
Loading…
Reference in a new issue