mirror of
https://github.com/p4gefau1t/trojan-go.git
synced 2024-04-21 12:21:34 +00:00
add api service
This commit is contained in:
+24
@@ -0,0 +1,24 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/p4gefau1t/trojan-go/log"
|
||||
"github.com/p4gefau1t/trojan-go/statistic"
|
||||
)
|
||||
|
||||
type Handler func(ctx context.Context, auth statistic.Authenticator) error
|
||||
|
||||
var handlers = map[string]Handler{}
|
||||
|
||||
func RegisterHandler(name string, handler Handler) {
|
||||
handlers[name] = handler
|
||||
}
|
||||
|
||||
func RunService(ctx context.Context, name string, auth statistic.Authenticator) error {
|
||||
if h, ok := handlers[name]; ok {
|
||||
log.Debug("api handler found", name)
|
||||
return h(ctx, auth)
|
||||
}
|
||||
log.Debug("api handler not found", name)
|
||||
return nil
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,88 @@
|
||||
syntax = "proto3";
|
||||
package trojan.api;
|
||||
option go_package = ".;service";
|
||||
|
||||
message Traffic {
|
||||
uint64 upload_traffic = 1;
|
||||
uint64 download_traffic = 2;
|
||||
}
|
||||
|
||||
message Speed {
|
||||
uint64 upload_speed = 1;
|
||||
uint64 download_speed = 2;
|
||||
}
|
||||
|
||||
message User {
|
||||
string password = 1;
|
||||
string hash = 2; //optional
|
||||
}
|
||||
|
||||
message UserStatus {
|
||||
User user = 1;
|
||||
Traffic traffic_total = 2;
|
||||
Speed speed_current = 3;
|
||||
Speed speed_limit = 4;
|
||||
int32 ip_current = 5;
|
||||
int32 ip_limit = 6;
|
||||
}
|
||||
|
||||
message GetTrafficRequest {
|
||||
User user = 1;
|
||||
}
|
||||
|
||||
message GetTrafficResponse {
|
||||
bool success = 1;
|
||||
string info = 2;
|
||||
Traffic traffic_total = 3;
|
||||
Speed speed_current = 4;
|
||||
}
|
||||
|
||||
message ListUsersRequest {
|
||||
|
||||
}
|
||||
|
||||
message ListUsersResponse {
|
||||
User user = 1;
|
||||
UserStatus status = 2;
|
||||
}
|
||||
|
||||
message GetUsersRequest {
|
||||
User user = 1;
|
||||
}
|
||||
|
||||
message GetUsersResponse {
|
||||
bool success = 1;
|
||||
string info = 2;
|
||||
User user = 3;
|
||||
UserStatus status = 4;
|
||||
}
|
||||
|
||||
message SetUsersRequest {
|
||||
User user = 1;
|
||||
enum Operation {
|
||||
Add = 0;
|
||||
Delete = 1;
|
||||
Modify = 2;
|
||||
}
|
||||
Operation operation = 2;
|
||||
Speed speed_limit = 3;
|
||||
int32 ip_limit = 4;
|
||||
}
|
||||
|
||||
message SetUsersResponse {
|
||||
bool success = 1;
|
||||
string info = 2;
|
||||
}
|
||||
|
||||
service TrojanClientService {
|
||||
rpc GetTraffic(GetTrafficRequest) returns(GetTrafficResponse){}
|
||||
}
|
||||
|
||||
service TrojanServerService {
|
||||
// list all users
|
||||
rpc ListUsers(ListUsersRequest) returns(stream ListUsersResponse){}
|
||||
// obtain specified user's info
|
||||
rpc GetUsers(stream GetUsersRequest) returns(stream GetUsersResponse){}
|
||||
// setup exsisting users' config
|
||||
rpc SetUsers(stream SetUsersRequest) returns(stream SetUsersResponse){}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/p4gefau1t/trojan-go/api"
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
"github.com/p4gefau1t/trojan-go/config"
|
||||
"github.com/p4gefau1t/trojan-go/log"
|
||||
"github.com/p4gefau1t/trojan-go/statistic"
|
||||
"github.com/p4gefau1t/trojan-go/tunnel/trojan"
|
||||
"google.golang.org/grpc"
|
||||
"net"
|
||||
)
|
||||
|
||||
type ClientAPI struct {
|
||||
TrojanClientServiceServer
|
||||
|
||||
auth statistic.Authenticator
|
||||
ctx context.Context
|
||||
uploadSpeed uint64
|
||||
downloadSpeed uint64
|
||||
lastSent uint64
|
||||
lastRecv uint64
|
||||
}
|
||||
|
||||
func (s *ClientAPI) GetTraffic(ctx context.Context, req *GetTrafficRequest) (*GetTrafficResponse, error) {
|
||||
log.Debug("API: GetTraffic")
|
||||
if req.User == nil {
|
||||
return nil, common.NewError("User is unspecified")
|
||||
}
|
||||
if req.User.Hash == "" {
|
||||
req.User.Hash = common.SHA224String(req.User.Password)
|
||||
}
|
||||
valid, user := s.auth.AuthUser(req.User.Hash)
|
||||
if !valid {
|
||||
return nil, common.NewError("User " + req.User.Hash + " not found")
|
||||
}
|
||||
sent, recv := user.GetTraffic()
|
||||
sentSpeed, recvSpeed := user.GetSpeed()
|
||||
resp := &GetTrafficResponse{
|
||||
Success: true,
|
||||
TrafficTotal: &Traffic{
|
||||
UploadTraffic: sent,
|
||||
DownloadTraffic: recv,
|
||||
},
|
||||
SpeedCurrent: &Speed{
|
||||
UploadSpeed: sentSpeed,
|
||||
DownloadSpeed: recvSpeed,
|
||||
},
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func RunClientAPI(ctx context.Context, auth statistic.Authenticator) error {
|
||||
server := grpc.NewServer()
|
||||
service := &ClientAPI{
|
||||
ctx: ctx,
|
||||
auth: auth,
|
||||
}
|
||||
RegisterTrojanClientServiceServer(server, service)
|
||||
cfg := config.FromContext(ctx, Name).(*Config)
|
||||
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.APIHost, cfg.APIPort))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Info("client-side api service is listening on", listener.Addr().String())
|
||||
errChan := make(chan error, 1)
|
||||
go func() {
|
||||
errChan <- server.Serve(listener)
|
||||
}()
|
||||
select {
|
||||
case err := <-errChan:
|
||||
return err
|
||||
case <-ctx.Done():
|
||||
server.Stop()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
api.RegisterHandler(trojan.Name+"_CLIENT", RunClientAPI)
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
"github.com/p4gefau1t/trojan-go/config"
|
||||
"github.com/p4gefau1t/trojan-go/statistic/memory"
|
||||
"google.golang.org/grpc"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestClientAPI(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
ctx = config.WithConfig(ctx, memory.Name,
|
||||
&memory.Config{
|
||||
Passwords: []string{"useless"},
|
||||
})
|
||||
port := common.PickPort("tcp", "127.0.0.1")
|
||||
ctx = config.WithConfig(ctx, Name, &Config{
|
||||
APIConfig{
|
||||
Enabled: true,
|
||||
APIHost: "127.0.0.1",
|
||||
APIPort: port,
|
||||
},
|
||||
})
|
||||
auth, err := memory.NewAuthenticator(ctx)
|
||||
common.Must(err)
|
||||
go RunClientAPI(ctx, auth)
|
||||
common.Must(auth.AddUser("hash1234"))
|
||||
valid, user := auth.AuthUser("hash1234")
|
||||
if !valid {
|
||||
t.Fail()
|
||||
}
|
||||
user.AddTraffic(1234, 5678)
|
||||
time.Sleep(time.Second)
|
||||
conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithInsecure())
|
||||
common.Must(err)
|
||||
client := NewTrojanClientServiceClient(conn)
|
||||
resp, err := client.GetTraffic(ctx, &GetTrafficRequest{User: &User{
|
||||
Hash: "hash1234",
|
||||
}})
|
||||
common.Must(err)
|
||||
if resp.TrafficTotal.DownloadTraffic != 5678 || resp.TrafficTotal.UploadTraffic != 1234 {
|
||||
t.Fail()
|
||||
}
|
||||
resp, err = client.GetTraffic(ctx, &GetTrafficRequest{})
|
||||
if err == nil {
|
||||
t.Fail()
|
||||
}
|
||||
cancel()
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package service
|
||||
|
||||
import "github.com/p4gefau1t/trojan-go/config"
|
||||
|
||||
const Name = "API_SERVICE"
|
||||
|
||||
type APIConfig struct {
|
||||
Enabled bool `json:"enabled" yaml:"enabled"`
|
||||
APIHost string `json:"api_addr" yaml:"api-addr"`
|
||||
APIPort int `json:"api_port" yaml:"api-port"`
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
APIConfig `json,yaml:"api"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
config.RegisterConfigCreator(Name, func() interface{} {
|
||||
return new(Config)
|
||||
})
|
||||
}
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
protoc ./api.proto --go_out=plugins=grpc:.
|
||||
@@ -0,0 +1,195 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/p4gefau1t/trojan-go/api"
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
"github.com/p4gefau1t/trojan-go/config"
|
||||
"github.com/p4gefau1t/trojan-go/log"
|
||||
"github.com/p4gefau1t/trojan-go/statistic"
|
||||
"github.com/p4gefau1t/trojan-go/tunnel/trojan"
|
||||
"google.golang.org/grpc"
|
||||
"io"
|
||||
"net"
|
||||
)
|
||||
|
||||
type ServerAPI struct {
|
||||
TrojanServerServiceServer
|
||||
auth statistic.Authenticator
|
||||
}
|
||||
|
||||
func (s *ServerAPI) GetUsers(stream TrojanServerService_GetUsersServer) error {
|
||||
log.Debug("API: GetUsers")
|
||||
for {
|
||||
req, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if req.User == nil {
|
||||
return common.NewError("User is unspecified")
|
||||
}
|
||||
if req.User.Hash == "" {
|
||||
req.User.Hash = common.SHA224String(req.User.Password)
|
||||
}
|
||||
valid, user := s.auth.AuthUser(req.User.Hash)
|
||||
if !valid {
|
||||
stream.Send(&GetUsersResponse{
|
||||
Success: false,
|
||||
Info: "Invalid user: " + req.User.Hash,
|
||||
})
|
||||
continue
|
||||
}
|
||||
downloadTraffic, uploadTraffic := user.GetTraffic()
|
||||
downloadSpeed, uploadSpeed := user.GetSpeed()
|
||||
downloadSpeedLimit, uploadSpeedLimit := user.GetSpeedLimit()
|
||||
ipLimit := user.GetIPLimit()
|
||||
ipCurrent := user.GetIP()
|
||||
err = stream.Send(&GetUsersResponse{
|
||||
Success: true,
|
||||
Status: &UserStatus{
|
||||
User: req.User,
|
||||
TrafficTotal: &Traffic{
|
||||
UploadTraffic: uploadTraffic,
|
||||
DownloadTraffic: downloadTraffic,
|
||||
},
|
||||
SpeedCurrent: &Speed{
|
||||
DownloadSpeed: downloadSpeed,
|
||||
UploadSpeed: uploadSpeed,
|
||||
},
|
||||
SpeedLimit: &Speed{
|
||||
DownloadSpeed: uint64(downloadSpeedLimit),
|
||||
UploadSpeed: uint64(uploadSpeedLimit),
|
||||
},
|
||||
IpCurrent: int32(ipCurrent),
|
||||
IpLimit: int32(ipLimit),
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ServerAPI) SetUsers(stream TrojanServerService_SetUsersServer) error {
|
||||
log.Debug("API: SetUsers")
|
||||
for {
|
||||
req, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if req.User == nil {
|
||||
return common.NewError("User is unspecified")
|
||||
}
|
||||
if req.User.Hash == "" {
|
||||
req.User.Hash = common.SHA224String(req.User.Password)
|
||||
}
|
||||
switch req.Operation {
|
||||
case SetUsersRequest_Add:
|
||||
err = s.auth.AddUser(req.User.Hash)
|
||||
if req.SpeedLimit != nil {
|
||||
valid, user := s.auth.AuthUser(req.User.Hash)
|
||||
if !valid {
|
||||
return common.NewError("Failed to add new user")
|
||||
}
|
||||
user.SetSpeedLimit(int(req.SpeedLimit.DownloadSpeed), int(req.SpeedLimit.UploadSpeed))
|
||||
}
|
||||
case SetUsersRequest_Delete:
|
||||
err = s.auth.DelUser(req.User.Hash)
|
||||
case SetUsersRequest_Modify:
|
||||
valid, user := s.auth.AuthUser(req.User.Hash)
|
||||
if !valid {
|
||||
err = common.NewError("Invalid user " + req.User.Hash)
|
||||
} else {
|
||||
if req.SpeedLimit.DownloadSpeed > 0 || req.SpeedLimit.UploadSpeed > 0 {
|
||||
user.SetSpeedLimit(int(req.SpeedLimit.DownloadSpeed), int(req.SpeedLimit.UploadSpeed))
|
||||
}
|
||||
if req.IpLimit > 0 {
|
||||
user.SetIPLimit(int(req.IpLimit))
|
||||
}
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
stream.Send(&SetUsersResponse{
|
||||
Success: false,
|
||||
Info: err.Error(),
|
||||
})
|
||||
continue
|
||||
}
|
||||
stream.Send(&SetUsersResponse{
|
||||
Success: true,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ServerAPI) ListUsers(req *ListUsersRequest, stream TrojanServerService_ListUsersServer) error {
|
||||
log.Debug("API: ListUsers")
|
||||
users := s.auth.ListUsers()
|
||||
for _, user := range users {
|
||||
downloadTraffic, uploadTraffic := user.GetTraffic()
|
||||
downloadSpeed, uploadSpeed := user.GetSpeed()
|
||||
downloadSpeedLimit, uploadSpeedLimit := user.GetSpeedLimit()
|
||||
ipLimit := user.GetIPLimit()
|
||||
ipCurrent := user.GetIP()
|
||||
err := stream.Send(&ListUsersResponse{
|
||||
User: &User{
|
||||
Hash: user.Hash(),
|
||||
},
|
||||
Status: &UserStatus{
|
||||
TrafficTotal: &Traffic{
|
||||
DownloadTraffic: downloadTraffic,
|
||||
UploadTraffic: uploadTraffic,
|
||||
},
|
||||
SpeedCurrent: &Speed{
|
||||
DownloadSpeed: downloadSpeed,
|
||||
UploadSpeed: uploadSpeed,
|
||||
},
|
||||
SpeedLimit: &Speed{
|
||||
DownloadSpeed: uint64(downloadSpeedLimit),
|
||||
UploadSpeed: uint64(uploadSpeedLimit),
|
||||
},
|
||||
IpLimit: int32(ipLimit),
|
||||
IpCurrent: int32(ipCurrent),
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func RunServerAPI(ctx context.Context, auth statistic.Authenticator) error {
|
||||
server := grpc.NewServer()
|
||||
service := &ServerAPI{
|
||||
auth: auth,
|
||||
}
|
||||
RegisterTrojanServerServiceServer(server, service)
|
||||
cfg := config.FromContext(ctx, Name).(*Config)
|
||||
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.APIHost, cfg.APIPort))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Info("server-side api service is listening on", listener.Addr().String())
|
||||
errChan := make(chan error, 1)
|
||||
go func() {
|
||||
errChan <- server.Serve(listener)
|
||||
}()
|
||||
select {
|
||||
case err := <-errChan:
|
||||
return err
|
||||
case <-ctx.Done():
|
||||
server.Stop()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
api.RegisterHandler(trojan.Name+"_SERVER", RunServerAPI)
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
"github.com/p4gefau1t/trojan-go/config"
|
||||
"github.com/p4gefau1t/trojan-go/statistic/memory"
|
||||
"google.golang.org/grpc"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestServerAPI(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
ctx = config.WithConfig(ctx, memory.Name,
|
||||
&memory.Config{
|
||||
Passwords: []string{},
|
||||
})
|
||||
port := common.PickPort("tcp", "127.0.0.1")
|
||||
ctx = config.WithConfig(ctx, Name, &Config{
|
||||
APIConfig{
|
||||
Enabled: true,
|
||||
APIHost: "127.0.0.1",
|
||||
APIPort: port,
|
||||
},
|
||||
})
|
||||
auth, err := memory.NewAuthenticator(ctx)
|
||||
common.Must(err)
|
||||
go RunServerAPI(ctx, auth)
|
||||
common.Must(auth.AddUser("hash1234"))
|
||||
_, user := auth.AuthUser("hash1234")
|
||||
conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithInsecure())
|
||||
common.Must(err)
|
||||
server := NewTrojanServerServiceClient(conn)
|
||||
stream1, err := server.ListUsers(ctx, &ListUsersRequest{})
|
||||
common.Must(err)
|
||||
for {
|
||||
resp, err := stream1.Recv()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
fmt.Println(resp.User.Hash)
|
||||
if resp.User.Hash != "hash1234" {
|
||||
t.Fail()
|
||||
}
|
||||
fmt.Println(resp.Status.SpeedCurrent)
|
||||
fmt.Println(resp.Status.SpeedLimit)
|
||||
}
|
||||
stream1.CloseSend()
|
||||
user.AddTraffic(1234, 5678)
|
||||
time.Sleep(time.Millisecond * 1000)
|
||||
stream2, err := server.GetUsers(ctx)
|
||||
common.Must(err)
|
||||
stream2.Send(&GetUsersRequest{
|
||||
User: &User{
|
||||
Hash: "hash1234",
|
||||
},
|
||||
})
|
||||
resp2, err := stream2.Recv()
|
||||
common.Must(err)
|
||||
if resp2.Status.TrafficTotal.DownloadTraffic != 1234 || resp2.Status.TrafficTotal.UploadTraffic != 5678 {
|
||||
t.Fail()
|
||||
}
|
||||
if resp2.Status.SpeedCurrent.DownloadSpeed != 1234 || resp2.Status.TrafficTotal.UploadTraffic != 5678 {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
stream3, err := server.SetUsers(ctx)
|
||||
stream3.Send(&SetUsersRequest{
|
||||
User: &User{
|
||||
Hash: "hash1234",
|
||||
},
|
||||
Operation: SetUsersRequest_Delete,
|
||||
})
|
||||
resp3, err := stream3.Recv()
|
||||
if err != nil || !resp3.Success {
|
||||
t.Fail()
|
||||
}
|
||||
valid, _ := auth.AuthUser("hash1234")
|
||||
if valid {
|
||||
t.Fail()
|
||||
}
|
||||
stream3.Send(&SetUsersRequest{
|
||||
User: &User{
|
||||
Hash: "newhash",
|
||||
},
|
||||
Operation: SetUsersRequest_Add,
|
||||
})
|
||||
resp3, err = stream3.Recv()
|
||||
if err != nil || !resp3.Success {
|
||||
t.Fail()
|
||||
}
|
||||
valid, user = auth.AuthUser("newhash")
|
||||
if !valid {
|
||||
t.Fail()
|
||||
}
|
||||
stream3.Send(&SetUsersRequest{
|
||||
User: &User{
|
||||
Hash: "newhash",
|
||||
},
|
||||
Operation: SetUsersRequest_Modify,
|
||||
SpeedLimit: &Speed{
|
||||
DownloadSpeed: 5000,
|
||||
UploadSpeed: 3000,
|
||||
},
|
||||
})
|
||||
go func() {
|
||||
for {
|
||||
user.AddTraffic(200, 0)
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
for {
|
||||
user.AddTraffic(0, 300)
|
||||
}
|
||||
}()
|
||||
time.Sleep(time.Second * 3)
|
||||
for i := 0; i < 3; i++ {
|
||||
stream2.Send(&GetUsersRequest{
|
||||
User: &User{
|
||||
Hash: "newhash",
|
||||
},
|
||||
})
|
||||
resp2, err = stream2.Recv()
|
||||
fmt.Println(resp2.Status.SpeedCurrent)
|
||||
fmt.Println(resp2.Status.SpeedLimit)
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
stream2.CloseSend()
|
||||
cancel()
|
||||
}
|
||||
@@ -5,7 +5,7 @@ go 1.14
|
||||
require (
|
||||
github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed
|
||||
github.com/go-sql-driver/mysql v1.5.0
|
||||
github.com/golang/protobuf v1.3.2
|
||||
github.com/golang/protobuf v1.4.1
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||
github.com/refraction-networking/utls v0.0.0-20200601200209-ada0bb9b38a0
|
||||
github.com/shadowsocks/go-shadowsocks2 v0.1.0
|
||||
@@ -15,6 +15,8 @@ require (
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3
|
||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 // indirect
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1
|
||||
google.golang.org/grpc v1.27.0
|
||||
google.golang.org/protobuf v1.24.0
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
v2ray.com/core v0.0.0-00010101000000-000000000000
|
||||
|
||||
@@ -4,7 +4,10 @@ github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed h1:eqa6queie
|
||||
github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed/go.mod h1:rA52xkgZwql9LRZXWb2arHEFP6qSR48KY2xOfWzEciQ=
|
||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
@@ -12,10 +15,22 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||
@@ -29,6 +44,7 @@ github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0=
|
||||
github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0=
|
||||
github.com/refraction-networking/utls v0.0.0-20200601200209-ada0bb9b38a0 h1:vIkvetWOJZSADSKCF9MLTsQNW2httdBmYz47dQQteP8=
|
||||
github.com/refraction-networking/utls v0.0.0-20200601200209-ada0bb9b38a0/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0=
|
||||
@@ -49,13 +65,22 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U
|
||||
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed h1:g4KENRiCMEx58Q7/ecwfT0N2o8z35Fnbsjig/Alf2T4=
|
||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
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=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
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 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
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=
|
||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
|
||||
@@ -64,19 +89,41 @@ golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
|
||||
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
|
||||
google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
h12.io/socks v1.0.0/go.mod h1:MdYbo5/eB9ka7u5dzW2Qh0iSyJENwB3KI5H5ngenFGA=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
||||
+3
-1
@@ -3,6 +3,7 @@ package proxy
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
@@ -153,7 +154,8 @@ func RegisterProxyCreator(name string, creator Creator) {
|
||||
}
|
||||
|
||||
func NewProxyFromConfigData(data []byte, isJSON bool) (*Proxy, error) {
|
||||
ctx := context.Background()
|
||||
// create a unique context for each proxy instance to avoid duplicated authenticator
|
||||
ctx := context.WithValue(context.Background(), Name+"_ID", rand.Int())
|
||||
var err error
|
||||
if isJSON {
|
||||
ctx, err = config.WithJSONConfig(context.Background(), data)
|
||||
|
||||
+12
-7
@@ -8,11 +8,6 @@ import (
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
)
|
||||
|
||||
const (
|
||||
TrafficMeterKey = "TRAFFIC_METER"
|
||||
AuthenticatorKey = "AUTHENTICATOR"
|
||||
)
|
||||
|
||||
type TrafficMeter interface {
|
||||
io.Closer
|
||||
Hash() string
|
||||
@@ -49,15 +44,25 @@ type Authenticator interface {
|
||||
type Creator func(ctx context.Context) (Authenticator, error)
|
||||
|
||||
var authCreators = map[string]Creator{}
|
||||
var createdAuth = map[context.Context]Authenticator{}
|
||||
|
||||
func RegisterAuthenticatorCreator(name string, creator Creator) {
|
||||
authCreators[name] = creator
|
||||
}
|
||||
|
||||
func NewAuthenticator(ctx context.Context, name string) (Authenticator, error) {
|
||||
// one authenticator for each context
|
||||
if auth, found := createdAuth[ctx]; found {
|
||||
return auth, nil
|
||||
}
|
||||
creator, found := authCreators[strings.ToUpper(name)]
|
||||
if !found {
|
||||
return nil, common.NewError("Auth driver name " + name + " not found")
|
||||
return nil, common.NewError("auth driver name " + name + " not found")
|
||||
}
|
||||
return creator(ctx)
|
||||
auth, err := creator(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
createdAuth[ctx] = auth
|
||||
return auth, err
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import "github.com/p4gefau1t/trojan-go/config"
|
||||
|
||||
type Config struct {
|
||||
LocalHost string `json:"local_addr" yaml:"local-addr"`
|
||||
LocalPort int `json:"local_port" yaml:"local-addr"`
|
||||
LocalPort int `json:"local_port" yaml:"local-port"`
|
||||
DNS []string `json:"dns" yaml:"dns"`
|
||||
TCP TCPConfig `json:"tcp" yaml:"tcp"`
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
v2router "v2ray.com/core/app/router"
|
||||
)
|
||||
@@ -359,6 +360,26 @@ func NewClient(ctx context.Context, underlay tunnel.Client) (*Client, error) {
|
||||
})
|
||||
}
|
||||
|
||||
cidrInfo := loadCode(cfg, "cidr:")
|
||||
for _, info := range cidrInfo {
|
||||
tmp := strings.Split(info.code, "/")
|
||||
if len(tmp) != 2 {
|
||||
return nil, common.NewError("invalid cidr:" + info.code)
|
||||
}
|
||||
ip := net.ParseIP(tmp[0])
|
||||
if ip == nil {
|
||||
return nil, common.NewError("invalid cidr ip:" + info.code)
|
||||
}
|
||||
prefix, err := strconv.ParseInt(tmp[1], 10, 32)
|
||||
if err != nil {
|
||||
return nil, common.NewError("invalid prefix").Base(err)
|
||||
}
|
||||
client.cidrs[info.strategy] = append(client.cidrs[info.strategy], &v2router.CIDR{
|
||||
Ip: ip,
|
||||
Prefix: uint32(prefix),
|
||||
})
|
||||
}
|
||||
|
||||
log.Info("router client created")
|
||||
return client, nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package router
|
||||
|
||||
import (
|
||||
"github.com/p4gefau1t/trojan-go/config"
|
||||
"os"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
@@ -21,7 +22,7 @@ type RouterConfig struct {
|
||||
|
||||
func init() {
|
||||
config.RegisterConfigCreator(Name, func() interface{} {
|
||||
return &Config{
|
||||
cfg := &Config{
|
||||
Router: RouterConfig{
|
||||
DefaultPolicy: "proxy",
|
||||
DomainStrategy: "as_is",
|
||||
@@ -29,5 +30,10 @@ func init() {
|
||||
GeoSiteFilename: "geosite.dat",
|
||||
},
|
||||
}
|
||||
if path := os.Getenv("TROJAN_GO_LOCATION_ASSET"); path != "" {
|
||||
cfg.Router.GeoIPFilename = path + "geoip.dat"
|
||||
cfg.Router.GeoSiteFilename = path + "geosite.dat"
|
||||
}
|
||||
return cfg
|
||||
})
|
||||
}
|
||||
|
||||
@@ -84,6 +84,7 @@ router:
|
||||
- "regex:proxyreg(.*)"
|
||||
- "full:proxyfull"
|
||||
- "domain:proxy.com"
|
||||
- "cidr:192.168.1.1/16"
|
||||
`
|
||||
ctx, err := config.WithYAMLConfig(context.Background(), []byte(data))
|
||||
common.Must(err)
|
||||
@@ -114,6 +115,15 @@ router:
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
_, err = client.DialConn(&tunnel.Address{
|
||||
AddressType: tunnel.IPv4,
|
||||
IP: net.ParseIP("192.168.123.123"),
|
||||
Port: 80,
|
||||
}, nil)
|
||||
if err.Error() != "mockproxy" {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
_, err = client.DialConn(&tunnel.Address{
|
||||
AddressType: tunnel.DomainName,
|
||||
DomainName: "block.com",
|
||||
|
||||
@@ -3,6 +3,8 @@ package trojan
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"github.com/p4gefau1t/trojan-go/api"
|
||||
"github.com/p4gefau1t/trojan-go/statistic/memory"
|
||||
"github.com/p4gefau1t/trojan-go/tunnel/mux"
|
||||
"net"
|
||||
"time"
|
||||
@@ -146,10 +148,13 @@ func (c *Client) DialPacket(tunnel.Tunnel) (tunnel.PacketConn, error) {
|
||||
}
|
||||
|
||||
func NewClient(ctx context.Context, client tunnel.Client) (*Client, error) {
|
||||
auth, err := statistic.NewAuthenticator(ctx, "memory")
|
||||
auth, err := statistic.NewAuthenticator(ctx, memory.Name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
go api.RunService(ctx, Name+"_CLIENT", auth)
|
||||
|
||||
log.Debug("trojan client created")
|
||||
return &Client{
|
||||
underlay: client,
|
||||
|
||||
@@ -3,6 +3,7 @@ package trojan
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/p4gefau1t/trojan-go/api"
|
||||
"github.com/p4gefau1t/trojan-go/statistic/memory"
|
||||
"github.com/p4gefau1t/trojan-go/statistic/mysql"
|
||||
"io"
|
||||
@@ -194,6 +195,8 @@ func NewServer(ctx context.Context, underlay tunnel.Server) (tunnel.Server, erro
|
||||
if cfg.MySQL.Enabled {
|
||||
auth, err = statistic.NewAuthenticator(ctx, mysql.Name)
|
||||
}
|
||||
go api.RunService(ctx, Name+"_SERVER", auth)
|
||||
|
||||
if err != nil {
|
||||
return nil, common.NewError("failed to create authenticator").Base(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user