diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7cd7a6c..8d812cf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,143 +1,143 @@ name: Create Release on: - release: - types: [created] + release: + types: [created] jobs: - build: - permissions: - contents: write - strategy: - matrix: - # Include amd64 on all platforms. - goos: - # - windows - - freebsd - - openbsd - - linux - # - darwin + build: + permissions: + contents: write + strategy: + matrix: + # Include amd64 on all platforms. + goos: + # - windows + - freebsd + - openbsd + - linux + # - darwin - goarch: [ amd64, 386 ] - gotoolchain: [ "" ] - patch-assetname: [ "" ] + goarch: [amd64, 386] + gotoolchain: [""] + patch-assetname: [""] - # exclude: + # exclude: - include: - # BEGIN MacOS ARM64 - # - goos: darwin - # goarch: arm64 - # END MacOS ARM64 - # BEGIN Linux ARM 5 6 7 - - goos: linux - goarch: arm - goarm: 7 - - goos: linux - goarch: arm - goarm: 6 - - goos: linux - goarch: arm - goarm: 5 - # END Linux ARM 5 6 7 - # Windows ARM - # - goos: windows - # goarch: arm64 - # - goos: windows - # goarch: arm - # goarm: 7 - # BEGIN Other architectures - # BEGIN ARM64 - - goos: linux - goarch: arm64 - # END ARM64 - #BEGIN riscv64 & LOONG64 - # - goos: linux - # goarch: riscv64 - # - goos: linux - # goarch: loong64 - # END riscv64 & LOONG64 - # BEGIN MIPS - # - goos: linux - # goarch: mips64 - # - goos: linux - # goarch: mips64le - # - goos: linux - # goarch: mipsle - # - goos: linux - # goarch: mips - # END MIPS - # BEGIN PPC - # - goos: linux - # goarch: ppc64 - # - goos: linux - # goarch: ppc64le - # END PPC - # BEGIN FreeBSD ARM - - goos: freebsd - goarch: arm64 - - goos: freebsd - goarch: arm - goarm: 7 - # END FreeBSD ARM - # BEGIN S390X - - goos: linux - goarch: s390x - # END S390X - # END Other architectures - # BEGIN OPENBSD ARM - - goos: openbsd - goarch: arm64 - # - goos: openbsd - # goarch: arm - # goarm: 7 - # END OPENBSD ARM - fail-fast: false + include: + # BEGIN MacOS ARM64 + # - goos: darwin + # goarch: arm64 + # END MacOS ARM64 + # BEGIN Linux ARM 5 6 7 + - goos: linux + goarch: arm + goarm: 7 + - goos: linux + goarch: arm + goarm: 6 + - goos: linux + goarch: arm + goarm: 5 + # END Linux ARM 5 6 7 + # Windows ARM + # - goos: windows + # goarch: arm64 + # - goos: windows + # goarch: arm + # goarm: 7 + # BEGIN Other architectures + # BEGIN ARM64 + - goos: linux + goarch: arm64 + # END ARM64 + #BEGIN riscv64 & LOONG64 + # - goos: linux + # goarch: riscv64 + # - goos: linux + # goarch: loong64 + # END riscv64 & LOONG64 + # BEGIN MIPS + # - goos: linux + # goarch: mips64 + # - goos: linux + # goarch: mips64le + # - goos: linux + # goarch: mipsle + # - goos: linux + # goarch: mips + # END MIPS + # BEGIN PPC + # - goos: linux + # goarch: ppc64 + # - goos: linux + # goarch: ppc64le + # END PPC + # BEGIN FreeBSD ARM + - goos: freebsd + goarch: arm64 + - goos: freebsd + goarch: arm + goarm: 7 + # END FreeBSD ARM + # BEGIN S390X + - goos: linux + goarch: s390x + # END S390X + # END Other architectures + # BEGIN OPENBSD ARM + - goos: openbsd + goarch: arm64 + # - goos: openbsd + # goarch: arm + # goarm: 7 + # END OPENBSD ARM + fail-fast: false - runs-on: ubuntu-latest - env: - GOOS: ${{ matrix.goos }} - GOARCH: ${{ matrix.goarch }} - GOARM: ${{ matrix.goarm }} - CGO_ENABLED: 0 - steps: - - name: Checkout codebase - uses: actions/checkout@v4 + runs-on: ubuntu-latest + env: + GOOS: ${{ matrix.goos }} + GOARCH: ${{ matrix.goarch }} + GOARM: ${{ matrix.goarm }} + CGO_ENABLED: 0 + steps: + - name: Checkout codebase + uses: actions/checkout@v4 - - name: Show workflow information - run: | - _GOARM="${GOARM:-""}" - if [ -n "$_GOARM" ]; then - _NAME="${GOOS}-${GOARCH}-${_GOARM}" - else - _NAME="${GOOS}-${GOARCH}" - fi - echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV - echo "BINARY_NAME=pasarguard-node-${_NAME}" >> $GITHUB_ENV + - name: Show workflow information + run: | + _GOARM="${GOARM:-""}" + if [ -n "$_GOARM" ]; then + _NAME="${GOOS}-${GOARCH}-${_GOARM}" + else + _NAME="${GOOS}-${GOARCH}" + fi + echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV + echo "BINARY_NAME=pasarguard-node-${_NAME}" >> $GITHUB_ENV - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version: '1.25.7' - check-latest: true + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version: "1.26.1" + check-latest: true - - name: Get project dependencies - run: make deps + - name: Get project dependencies + run: make deps - - name: Build binary and zip - run: | - make - find . -type f -name "pasarguard-node*" -exec mv {} "./pasarguard-node-${{ env.ASSET_NAME }}" \; - # Create zip file with max compression and include README & LICENSE - zip -9 "./pasarguard-node-${{ env.ASSET_NAME }}.zip" "./pasarguard-node-${{ env.ASSET_NAME }}" README.md LICENSE + - name: Build binary and zip + run: | + make + find . -type f -name "pasarguard-node*" -exec mv {} "./pasarguard-node-${{ env.ASSET_NAME }}" \; + # Create zip file with max compression and include README & LICENSE + zip -9 "./pasarguard-node-${{ env.ASSET_NAME }}.zip" "./pasarguard-node-${{ env.ASSET_NAME }}" README.md LICENSE - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ github.event.release.upload_url }} - asset_path: ./pasarguard-node-${{ env.ASSET_NAME }}.zip - asset_name: pasarguard-node-${{ env.ASSET_NAME }}.zip - asset_content_type: application/zip + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./pasarguard-node-${{ env.ASSET_NAME }}.zip + asset_name: pasarguard-node-${{ env.ASSET_NAME }}.zip + asset_content_type: application/zip diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 9cbbd38..303860f 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -1,47 +1,47 @@ name: Test Modules on: - pull_request: - branches: - - "**" - push: - branches: - - "dev" - - "wg" + pull_request: + branches: + - "**" + push: + branches: + - "dev" + - "wg" jobs: - test: - runs-on: ubuntu-latest - env: - GOTOOLCHAIN: auto + test: + runs-on: ubuntu-latest + env: + GOTOOLCHAIN: auto - steps: - - name: Checkout codebase - uses: actions/checkout@v4 + steps: + - name: Checkout codebase + uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version: "1.25.7" - check-latest: true + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version: "1.26.1" + check-latest: true - - name: Get project dependencies - run: make deps + - name: Get project dependencies + run: make deps - - name: Install xray-core - run: make install_xray + - name: Install xray-core + run: make install_xray - - name: install wg - run: make install_wg + - name: install wg + run: make install_wg - - name: Create certificate - run: | - mkdir -p certs - make generate_server_cert - make generate_client_cert + - name: Create certificate + run: | + mkdir -p certs + make generate_server_cert + make generate_client_cert - - name: Run regular test suite - run: TEST_INTEGRATION=true go test ./... -v -p 1 + - name: Run regular test suite + run: TEST_INTEGRATION=true go test ./... -v -p 1 - - name: Run wireguard integration tests - run: sudo -E make test-integration-wireguard + - name: Run wireguard integration tests + run: sudo -E make test-integration-wireguard diff --git a/Dockerfile b/Dockerfile index 53ddf1f..63230df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.25.7-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.26.1-alpine AS builder ARG TARGETOS ARG TARGETARCH diff --git a/Dockerfile.wireguard b/Dockerfile.wireguard index b4b7af9..d56b0e3 100644 --- a/Dockerfile.wireguard +++ b/Dockerfile.wireguard @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.25.7-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.26.1-alpine AS builder ARG TARGETOS ARG TARGETARCH diff --git a/Dockerfile.xray b/Dockerfile.xray index 8d488b6..44fd869 100644 --- a/Dockerfile.xray +++ b/Dockerfile.xray @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.25.7-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.26.1-alpine AS builder ARG TARGETOS ARG TARGETARCH diff --git a/backend/xray/api/account.go b/backend/xray/api/account.go index 52ae981..efaee4a 100644 --- a/backend/xray/api/account.go +++ b/backend/xray/api/account.go @@ -3,6 +3,7 @@ package api import ( "github.com/google/uuid" "github.com/xtls/xray-core/common/serial" + hysteria "github.com/xtls/xray-core/proxy/hysteria/account" "github.com/xtls/xray-core/proxy/shadowsocks" "github.com/xtls/xray-core/proxy/shadowsocks_2022" "github.com/xtls/xray-core/proxy/trojan" @@ -178,10 +179,30 @@ func NewShadowsocksTcpAccount(user *common.User) *ShadowsocksTcpAccount { } } +type HysteriaAccount struct { + BaseAccount + Auth string `json:"auth"` +} + +func (ha *HysteriaAccount) Message() (*serial.TypedMessage, error) { + return ToTypedMessage(&hysteria.Account{Auth: ha.Auth}) +} + +func NewHysteriaAccount(user *common.User) *HysteriaAccount { + return &HysteriaAccount{ + BaseAccount: BaseAccount{ + Email: user.GetEmail(), + Level: 0, + }, + Auth: user.GetProxies().GetHysteria().GetAuth(), + } +} + type ProxySettings struct { Vmess *VmessAccount Vless *VlessAccount Trojan *TrojanAccount Shadowsocks *ShadowsocksTcpAccount Shadowsocks2022 *ShadowsocksAccount + Hysteria *HysteriaAccount } diff --git a/backend/xray/config.go b/backend/xray/config.go index bd99d7d..64419d1 100644 --- a/backend/xray/config.go +++ b/backend/xray/config.go @@ -23,6 +23,7 @@ const ( Vless = "vless" Trojan = "trojan" Shadowsocks = "shadowsocks" + Hysteria = "hysteria" ) type Config struct { @@ -188,6 +189,16 @@ func (i *Inbound) syncUsers(users []*common.User) { } } } + + case Hysteria: + for _, user := range users { + if user.GetProxies().GetHysteria() == nil { + continue + } + if slices.Contains(user.Inbounds, i.Tag) { + i.clients[user.GetEmail()] = api.NewHysteriaAccount(user) + } + } } } @@ -222,6 +233,9 @@ func (i *Inbound) updateUser(account api.Account) { } else { i.clients[email] = a } + + case *api.HysteriaAccount: + i.clients[email] = a } } @@ -272,6 +286,13 @@ func (i *Inbound) updateUsers(accounts []api.Account, removeEmails []string) { } } } + + case Hysteria: + for _, account := range accounts { + if a, ok := account.(*api.HysteriaAccount); ok { + i.clients[account.GetEmail()] = a + } + } } for _, email := range removeEmails { @@ -358,6 +379,15 @@ func (c *Config) ToBytes() ([]byte, error) { } i.Settings["clients"] = clients } + + case Hysteria: + clients := make([]*api.HysteriaAccount, 0, len(i.clients)) + for _, account := range i.clients { + if hyAccount, ok := account.(*api.HysteriaAccount); ok { + clients = append(clients, hyAccount) + } + } + i.Settings["clients"] = clients } } diff --git a/backend/xray/user.go b/backend/xray/user.go index c568940..deb6943 100644 --- a/backend/xray/user.go +++ b/backend/xray/user.go @@ -34,6 +34,10 @@ func setupUserAccount(user *common.User) (api.ProxySettings, error) { settings.Shadowsocks2022 = api.NewShadowsocksAccount(user) } + if user.GetProxies().GetHysteria() != nil { + settings.Hysteria = api.NewHysteriaAccount(user) + } + return settings, nil } @@ -120,6 +124,12 @@ func isActiveInbound(inbound *Inbound, inbounds []string, settings api.ProxySett return nil, false } return settings.Shadowsocks, true + + case Hysteria: + if settings.Hysteria == nil { + return nil, false + } + return settings.Hysteria, true } } return nil, false diff --git a/common/service.pb.go b/common/service.pb.go index 34ee375..1015135 100644 --- a/common/service.pb.go +++ b/common/service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.4 +// protoc-gen-go v1.36.10 +// protoc v3.21.12 // source: common/service.proto package common @@ -1065,6 +1065,50 @@ func (x *Wireguard) GetPeerIps() []string { return nil } +type Hysteria struct { + state protoimpl.MessageState `protogen:"open.v1"` + Auth string `protobuf:"bytes,1,opt,name=auth,proto3" json:"auth,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Hysteria) Reset() { + *x = Hysteria{} + mi := &file_common_service_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Hysteria) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Hysteria) ProtoMessage() {} + +func (x *Hysteria) ProtoReflect() protoreflect.Message { + mi := &file_common_service_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Hysteria.ProtoReflect.Descriptor instead. +func (*Hysteria) Descriptor() ([]byte, []int) { + return file_common_service_proto_rawDescGZIP(), []int{16} +} + +func (x *Hysteria) GetAuth() string { + if x != nil { + return x.Auth + } + return "" +} + type Proxy struct { state protoimpl.MessageState `protogen:"open.v1"` Vmess *Vmess `protobuf:"bytes,1,opt,name=vmess,proto3" json:"vmess,omitempty"` @@ -1072,13 +1116,14 @@ type Proxy struct { Trojan *Trojan `protobuf:"bytes,3,opt,name=trojan,proto3" json:"trojan,omitempty"` Shadowsocks *Shadowsocks `protobuf:"bytes,4,opt,name=shadowsocks,proto3" json:"shadowsocks,omitempty"` Wireguard *Wireguard `protobuf:"bytes,5,opt,name=wireguard,proto3" json:"wireguard,omitempty"` + Hysteria *Hysteria `protobuf:"bytes,6,opt,name=hysteria,proto3" json:"hysteria,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Proxy) Reset() { *x = Proxy{} - mi := &file_common_service_proto_msgTypes[16] + mi := &file_common_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1090,7 +1135,7 @@ func (x *Proxy) String() string { func (*Proxy) ProtoMessage() {} func (x *Proxy) ProtoReflect() protoreflect.Message { - mi := &file_common_service_proto_msgTypes[16] + mi := &file_common_service_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1103,7 +1148,7 @@ func (x *Proxy) ProtoReflect() protoreflect.Message { // Deprecated: Use Proxy.ProtoReflect.Descriptor instead. func (*Proxy) Descriptor() ([]byte, []int) { - return file_common_service_proto_rawDescGZIP(), []int{16} + return file_common_service_proto_rawDescGZIP(), []int{17} } func (x *Proxy) GetVmess() *Vmess { @@ -1141,6 +1186,13 @@ func (x *Proxy) GetWireguard() *Wireguard { return nil } +func (x *Proxy) GetHysteria() *Hysteria { + if x != nil { + return x.Hysteria + } + return nil +} + type User struct { state protoimpl.MessageState `protogen:"open.v1"` Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` @@ -1152,7 +1204,7 @@ type User struct { func (x *User) Reset() { *x = User{} - mi := &file_common_service_proto_msgTypes[17] + mi := &file_common_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1164,7 +1216,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_common_service_proto_msgTypes[17] + mi := &file_common_service_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1177,7 +1229,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_common_service_proto_rawDescGZIP(), []int{17} + return file_common_service_proto_rawDescGZIP(), []int{18} } func (x *User) GetEmail() string { @@ -1210,7 +1262,7 @@ type Users struct { func (x *Users) Reset() { *x = Users{} - mi := &file_common_service_proto_msgTypes[18] + mi := &file_common_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1222,7 +1274,7 @@ func (x *Users) String() string { func (*Users) ProtoMessage() {} func (x *Users) ProtoReflect() protoreflect.Message { - mi := &file_common_service_proto_msgTypes[18] + mi := &file_common_service_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1235,7 +1287,7 @@ func (x *Users) ProtoReflect() protoreflect.Message { // Deprecated: Use Users.ProtoReflect.Descriptor instead. func (*Users) Descriptor() ([]byte, []int) { - return file_common_service_proto_rawDescGZIP(), []int{18} + return file_common_service_proto_rawDescGZIP(), []int{19} } func (x *Users) GetUsers() []*User { @@ -1256,7 +1308,7 @@ type UsersChunk struct { func (x *UsersChunk) Reset() { *x = UsersChunk{} - mi := &file_common_service_proto_msgTypes[19] + mi := &file_common_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1268,7 +1320,7 @@ func (x *UsersChunk) String() string { func (*UsersChunk) ProtoMessage() {} func (x *UsersChunk) ProtoReflect() protoreflect.Message { - mi := &file_common_service_proto_msgTypes[19] + mi := &file_common_service_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1281,7 +1333,7 @@ func (x *UsersChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersChunk.ProtoReflect.Descriptor instead. func (*UsersChunk) Descriptor() ([]byte, []int) { - return file_common_service_proto_rawDescGZIP(), []int{19} + return file_common_service_proto_rawDescGZIP(), []int{20} } func (x *UsersChunk) GetUsers() []*User { @@ -1377,13 +1429,16 @@ const file_common_service_proto_rawDesc = "" + "\tWireguard\x12\x1d\n" + "\n" + "public_key\x18\x01 \x01(\tR\tpublicKey\x12\x19\n" + - "\bpeer_ips\x18\x02 \x03(\tR\apeerIps\"\xe6\x01\n" + + "\bpeer_ips\x18\x02 \x03(\tR\apeerIps\"\x1e\n" + + "\bHysteria\x12\x12\n" + + "\x04auth\x18\x01 \x01(\tR\x04auth\"\x95\x02\n" + "\x05Proxy\x12$\n" + "\x05vmess\x18\x01 \x01(\v2\x0e.service.VmessR\x05vmess\x12$\n" + "\x05vless\x18\x02 \x01(\v2\x0e.service.VlessR\x05vless\x12'\n" + "\x06trojan\x18\x03 \x01(\v2\x0f.service.TrojanR\x06trojan\x126\n" + "\vshadowsocks\x18\x04 \x01(\v2\x14.service.ShadowsocksR\vshadowsocks\x120\n" + - "\twireguard\x18\x05 \x01(\v2\x12.service.WireguardR\twireguard\"b\n" + + "\twireguard\x18\x05 \x01(\v2\x12.service.WireguardR\twireguard\x12-\n" + + "\bhysteria\x18\x06 \x01(\v2\x11.service.HysteriaR\bhysteria\"b\n" + "\x04User\x12\x14\n" + "\x05email\x18\x01 \x01(\tR\x05email\x12(\n" + "\aproxies\x18\x02 \x01(\v2\x0e.service.ProxyR\aproxies\x12\x1a\n" + @@ -1432,7 +1487,7 @@ func file_common_service_proto_rawDescGZIP() []byte { } var file_common_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_common_service_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_common_service_proto_msgTypes = make([]protoimpl.MessageInfo, 22) var file_common_service_proto_goTypes = []any{ (BackendType)(0), // 0: service.BackendType (StatType)(0), // 1: service.StatType @@ -1452,55 +1507,57 @@ var file_common_service_proto_goTypes = []any{ (*Trojan)(nil), // 15: service.Trojan (*Shadowsocks)(nil), // 16: service.Shadowsocks (*Wireguard)(nil), // 17: service.Wireguard - (*Proxy)(nil), // 18: service.Proxy - (*User)(nil), // 19: service.User - (*Users)(nil), // 20: service.Users - (*UsersChunk)(nil), // 21: service.UsersChunk - nil, // 22: service.StatsOnlineIpListResponse.IpsEntry + (*Hysteria)(nil), // 18: service.Hysteria + (*Proxy)(nil), // 19: service.Proxy + (*User)(nil), // 20: service.User + (*Users)(nil), // 21: service.Users + (*UsersChunk)(nil), // 22: service.UsersChunk + nil, // 23: service.StatsOnlineIpListResponse.IpsEntry } var file_common_service_proto_depIdxs = []int32{ 0, // 0: service.Backend.type:type_name -> service.BackendType - 19, // 1: service.Backend.users:type_name -> service.User + 20, // 1: service.Backend.users:type_name -> service.User 6, // 2: service.StatResponse.stats:type_name -> service.Stat 1, // 3: service.StatRequest.type:type_name -> service.StatType - 22, // 4: service.StatsOnlineIpListResponse.ips:type_name -> service.StatsOnlineIpListResponse.IpsEntry + 23, // 4: service.StatsOnlineIpListResponse.ips:type_name -> service.StatsOnlineIpListResponse.IpsEntry 13, // 5: service.Proxy.vmess:type_name -> service.Vmess 14, // 6: service.Proxy.vless:type_name -> service.Vless 15, // 7: service.Proxy.trojan:type_name -> service.Trojan 16, // 8: service.Proxy.shadowsocks:type_name -> service.Shadowsocks 17, // 9: service.Proxy.wireguard:type_name -> service.Wireguard - 18, // 10: service.User.proxies:type_name -> service.Proxy - 19, // 11: service.Users.users:type_name -> service.User - 19, // 12: service.UsersChunk.users:type_name -> service.User - 4, // 13: service.NodeService.Start:input_type -> service.Backend - 2, // 14: service.NodeService.Stop:input_type -> service.Empty - 2, // 15: service.NodeService.GetBaseInfo:input_type -> service.Empty - 2, // 16: service.NodeService.GetLogs:input_type -> service.Empty - 2, // 17: service.NodeService.GetSystemStats:input_type -> service.Empty - 2, // 18: service.NodeService.GetBackendStats:input_type -> service.Empty - 8, // 19: service.NodeService.GetStats:input_type -> service.StatRequest - 8, // 20: service.NodeService.GetUserOnlineStats:input_type -> service.StatRequest - 8, // 21: service.NodeService.GetUserOnlineIpListStats:input_type -> service.StatRequest - 19, // 22: service.NodeService.SyncUser:input_type -> service.User - 20, // 23: service.NodeService.SyncUsers:input_type -> service.Users - 21, // 24: service.NodeService.SyncUsersChunked:input_type -> service.UsersChunk - 3, // 25: service.NodeService.Start:output_type -> service.BaseInfoResponse - 2, // 26: service.NodeService.Stop:output_type -> service.Empty - 3, // 27: service.NodeService.GetBaseInfo:output_type -> service.BaseInfoResponse - 5, // 28: service.NodeService.GetLogs:output_type -> service.Log - 12, // 29: service.NodeService.GetSystemStats:output_type -> service.SystemStatsResponse - 11, // 30: service.NodeService.GetBackendStats:output_type -> service.BackendStatsResponse - 7, // 31: service.NodeService.GetStats:output_type -> service.StatResponse - 9, // 32: service.NodeService.GetUserOnlineStats:output_type -> service.OnlineStatResponse - 10, // 33: service.NodeService.GetUserOnlineIpListStats:output_type -> service.StatsOnlineIpListResponse - 2, // 34: service.NodeService.SyncUser:output_type -> service.Empty - 2, // 35: service.NodeService.SyncUsers:output_type -> service.Empty - 2, // 36: service.NodeService.SyncUsersChunked:output_type -> service.Empty - 25, // [25:37] is the sub-list for method output_type - 13, // [13:25] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 18, // 10: service.Proxy.hysteria:type_name -> service.Hysteria + 19, // 11: service.User.proxies:type_name -> service.Proxy + 20, // 12: service.Users.users:type_name -> service.User + 20, // 13: service.UsersChunk.users:type_name -> service.User + 4, // 14: service.NodeService.Start:input_type -> service.Backend + 2, // 15: service.NodeService.Stop:input_type -> service.Empty + 2, // 16: service.NodeService.GetBaseInfo:input_type -> service.Empty + 2, // 17: service.NodeService.GetLogs:input_type -> service.Empty + 2, // 18: service.NodeService.GetSystemStats:input_type -> service.Empty + 2, // 19: service.NodeService.GetBackendStats:input_type -> service.Empty + 8, // 20: service.NodeService.GetStats:input_type -> service.StatRequest + 8, // 21: service.NodeService.GetUserOnlineStats:input_type -> service.StatRequest + 8, // 22: service.NodeService.GetUserOnlineIpListStats:input_type -> service.StatRequest + 20, // 23: service.NodeService.SyncUser:input_type -> service.User + 21, // 24: service.NodeService.SyncUsers:input_type -> service.Users + 22, // 25: service.NodeService.SyncUsersChunked:input_type -> service.UsersChunk + 3, // 26: service.NodeService.Start:output_type -> service.BaseInfoResponse + 2, // 27: service.NodeService.Stop:output_type -> service.Empty + 3, // 28: service.NodeService.GetBaseInfo:output_type -> service.BaseInfoResponse + 5, // 29: service.NodeService.GetLogs:output_type -> service.Log + 12, // 30: service.NodeService.GetSystemStats:output_type -> service.SystemStatsResponse + 11, // 31: service.NodeService.GetBackendStats:output_type -> service.BackendStatsResponse + 7, // 32: service.NodeService.GetStats:output_type -> service.StatResponse + 9, // 33: service.NodeService.GetUserOnlineStats:output_type -> service.OnlineStatResponse + 10, // 34: service.NodeService.GetUserOnlineIpListStats:output_type -> service.StatsOnlineIpListResponse + 2, // 35: service.NodeService.SyncUser:output_type -> service.Empty + 2, // 36: service.NodeService.SyncUsers:output_type -> service.Empty + 2, // 37: service.NodeService.SyncUsersChunked:output_type -> service.Empty + 26, // [26:38] is the sub-list for method output_type + 14, // [14:26] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_common_service_proto_init() } @@ -1514,7 +1571,7 @@ func file_common_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_common_service_proto_rawDesc), len(file_common_service_proto_rawDesc)), NumEnums: 2, - NumMessages: 21, + NumMessages: 22, NumExtensions: 0, NumServices: 1, }, diff --git a/common/service.proto b/common/service.proto index 9f671c2..6feb02f 100644 --- a/common/service.proto +++ b/common/service.proto @@ -114,12 +114,17 @@ message Wireguard { repeated string peer_ips = 2; } +message Hysteria { + string auth = 1; +} + message Proxy { Vmess vmess = 1; Vless vless = 2; Trojan trojan = 3; Shadowsocks shadowsocks = 4; Wireguard wireguard = 5; + Hysteria hysteria = 6; } message User { diff --git a/common/service_grpc.pb.go b/common/service_grpc.pb.go index 561f953..e4525e5 100644 --- a/common/service_grpc.pb.go +++ b/common/service_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.1 -// - protoc v6.33.4 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v3.21.12 // source: common/service.proto package common @@ -225,40 +225,40 @@ type NodeServiceServer interface { type UnimplementedNodeServiceServer struct{} func (UnimplementedNodeServiceServer) Start(context.Context, *Backend) (*BaseInfoResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Start not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") } func (UnimplementedNodeServiceServer) Stop(context.Context, *Empty) (*Empty, error) { - return nil, status.Error(codes.Unimplemented, "method Stop not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") } func (UnimplementedNodeServiceServer) GetBaseInfo(context.Context, *Empty) (*BaseInfoResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetBaseInfo not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetBaseInfo not implemented") } func (UnimplementedNodeServiceServer) GetLogs(*Empty, grpc.ServerStreamingServer[Log]) error { - return status.Error(codes.Unimplemented, "method GetLogs not implemented") + return status.Errorf(codes.Unimplemented, "method GetLogs not implemented") } func (UnimplementedNodeServiceServer) GetSystemStats(context.Context, *Empty) (*SystemStatsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetSystemStats not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetSystemStats not implemented") } func (UnimplementedNodeServiceServer) GetBackendStats(context.Context, *Empty) (*BackendStatsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetBackendStats not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetBackendStats not implemented") } func (UnimplementedNodeServiceServer) GetStats(context.Context, *StatRequest) (*StatResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetStats not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetStats not implemented") } func (UnimplementedNodeServiceServer) GetUserOnlineStats(context.Context, *StatRequest) (*OnlineStatResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetUserOnlineStats not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetUserOnlineStats not implemented") } func (UnimplementedNodeServiceServer) GetUserOnlineIpListStats(context.Context, *StatRequest) (*StatsOnlineIpListResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetUserOnlineIpListStats not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetUserOnlineIpListStats not implemented") } func (UnimplementedNodeServiceServer) SyncUser(grpc.ClientStreamingServer[User, Empty]) error { - return status.Error(codes.Unimplemented, "method SyncUser not implemented") + return status.Errorf(codes.Unimplemented, "method SyncUser not implemented") } func (UnimplementedNodeServiceServer) SyncUsers(context.Context, *Users) (*Empty, error) { - return nil, status.Error(codes.Unimplemented, "method SyncUsers not implemented") + return nil, status.Errorf(codes.Unimplemented, "method SyncUsers not implemented") } func (UnimplementedNodeServiceServer) SyncUsersChunked(grpc.ClientStreamingServer[UsersChunk, Empty]) error { - return status.Error(codes.Unimplemented, "method SyncUsersChunked not implemented") + return status.Errorf(codes.Unimplemented, "method SyncUsersChunked not implemented") } func (UnimplementedNodeServiceServer) mustEmbedUnimplementedNodeServiceServer() {} func (UnimplementedNodeServiceServer) testEmbeddedByValue() {} @@ -271,7 +271,7 @@ type UnsafeNodeServiceServer interface { } func RegisterNodeServiceServer(s grpc.ServiceRegistrar, srv NodeServiceServer) { - // If the following call panics, it indicates UnimplementedNodeServiceServer was + // If the following call pancis, it indicates UnimplementedNodeServiceServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go.mod b/go.mod index de384b4..cda2762 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/pasarguard/node -go 1.25.7 +go 1.26 require ( github.com/go-chi/chi/v5 v5.2.5 @@ -9,7 +9,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/shirou/gopsutil/v4 v4.26.1 github.com/vishvananda/netlink v1.3.1 - github.com/xtls/xray-core v1.260204.0 + github.com/xtls/xray-core v1.260327.0 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20241231184526-a9ab2273dd10 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 @@ -17,7 +17,7 @@ require ( require ( github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apernet/quic-go v0.57.2-0.20260111184307-eec823306178 // indirect + github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/ebitengine/purego v0.9.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -27,36 +27,36 @@ require ( github.com/josharian/native v1.1.0 // indirect github.com/juju/ratelimit v1.0.2 // indirect github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mdlayher/genetlink v1.3.2 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.5.1 // indirect github.com/miekg/dns v1.1.72 // indirect - github.com/pires/go-proxyproto v0.9.2 // indirect + github.com/pires/go-proxyproto v0.11.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/quic-go/qpack v0.6.0 // indirect - github.com/refraction-networking/utls v1.8.2 // indirect + github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/sagernet/sing v0.5.1 // indirect github.com/sagernet/sing-shadowsocks v0.2.7 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect github.com/vishvananda/netns v0.0.5 // indirect - github.com/xtls/reality v0.0.0-20251014195629-e4eec4520535 // indirect + github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect - golang.org/x/crypto v0.47.0 // indirect + golang.org/x/crypto v0.49.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.31.0 // indirect - golang.org/x/net v0.49.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.40.0 // indirect - golang.org/x/text v0.33.0 // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.12.0 // indirect - golang.org/x/tools v0.40.0 // indirect + golang.org/x/tools v0.42.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect - golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect + golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect gvisor.dev/gvisor v0.0.0-20260122175437-89a5d21be8f0 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index 051cc0b..2780b76 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/apernet/quic-go v0.57.2-0.20260111184307-eec823306178 h1:bSq8n+gX4oO/qnM3MKf4kroW75n+phO9Qp6nigJKZ1E= -github.com/apernet/quic-go v0.57.2-0.20260111184307-eec823306178/go.mod h1:N1WIjPphkqs4efXWuyDNQ6OjjIK04vM3h+bEgwV+eVU= +github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22 h1:00ziBGnLWQEcR9LThDwvxOznJJquJ9bYUdmBFnawLMU= +github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22/go.mod h1:Npbg8qBtAZlsAB3FWmqwlVh5jtVG6a4DlYsOylUpvzA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -67,8 +67,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -92,8 +92,8 @@ github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCL github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pires/go-proxyproto v0.9.2 h1:H1UdHn695zUVVmB0lQ354lOWHOy6TZSpzBl3tgN0s1U= -github.com/pires/go-proxyproto v0.9.2/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= +github.com/pires/go-proxyproto v0.11.0 h1:gUQpS85X/VJMdUsYyEgyn59uLJvGqPhJV5YvG68wXH4= +github.com/pires/go-proxyproto v0.11.0/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -102,8 +102,8 @@ github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:Om github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= -github.com/refraction-networking/utls v1.8.2 h1:j4Q1gJj0xngdeH+Ox/qND11aEfhpgoEvV+S9iJ2IdQo= -github.com/refraction-networking/utls v1.8.2/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= +github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af h1:er2acxbi3N1nvEq6HXHUAR1nTWEJmQfqiGR8EVT9rfs= +github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/sagernet/sing v0.5.1 h1:mhL/MZVq0TjuvHcpYcFtmSD1BFOxZ/+8ofbNZcg1k1Y= @@ -129,10 +129,10 @@ github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= -github.com/xtls/reality v0.0.0-20251014195629-e4eec4520535 h1:nwobseOLLRtdbP6z7Z2aVI97u8ZptTgD1ofovhAKmeU= -github.com/xtls/reality v0.0.0-20251014195629-e4eec4520535/go.mod h1:vbHCV/3VWUvy1oKvTxxWJRPEWSeR1sYgQHIh6u/JiZQ= -github.com/xtls/xray-core v1.260204.0 h1:GHtCLBsqIPbjS13uIE7pqo0sQaMNbE+60t6ob4KOlwY= -github.com/xtls/xray-core v1.260204.0/go.mod h1:cxzYFZrxu1B1NtPjHsqv4UzgDvRA71mV4rXYH4KtO7Q= +github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f h1:iy2JRioxmUpoJ3SzbFPyTxHZMbR/rSHP7dOOgYaq1O8= +github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f/go.mod h1:DsJblcWDGt76+FVqBVwbwRhxyyNJsGV48gJLch0OOWI= +github.com/xtls/xray-core v1.260327.0 h1:g4TzxMwyPrxslZh6uD+FiG3lXKTrnNO+b4ky2OhogHE= +github.com/xtls/xray-core v1.260327.0/go.mod h1:OXMlhBloFry8mw0KwWLWLd3RQyXJzEYsCGlgsX36h60= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= @@ -160,8 +160,8 @@ go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/W golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= -golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= @@ -171,8 +171,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -181,16 +181,16 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -201,14 +201,13 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -220,16 +219,16 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= -golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4= -golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= +golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb h1:whnFRlWMcXI9d+ZbWg+4sHnLp52d5yiIPUxMBSt4X9A= +golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20241231184526-a9ab2273dd10 h1:3GDAcqdIg1ozBNLgPy4SLT84nfcBjr6rhGtXYtrkWLU= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20241231184526-a9ab2273dd10/go.mod h1:T97yPqesLiNrOYxkwmhMI0ZIlJDm+p0PMR8eRVeR5tQ= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=