mirror of
https://github.com/p4gefau1t/trojan-go.git
synced 2024-04-21 12:21:34 +00:00
310 lines
10 KiB
Go
310 lines
10 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"crypto/x509"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/p4gefau1t/trojan-go/common"
|
|
"github.com/p4gefau1t/trojan-go/config"
|
|
"github.com/p4gefau1t/trojan-go/statistic/memory"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials"
|
|
)
|
|
|
|
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)
|
|
time.Sleep(time.Second * 3)
|
|
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.Status.User.Hash)
|
|
if resp.Status.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{
|
|
Status: &UserStatus{
|
|
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{
|
|
Status: &UserStatus{
|
|
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{
|
|
Status: &UserStatus{
|
|
User: &User{
|
|
Hash: "newhash",
|
|
},
|
|
SpeedLimit: &Speed{
|
|
DownloadSpeed: 5000,
|
|
UploadSpeed: 3000,
|
|
},
|
|
TrafficTotal: &Traffic{
|
|
DownloadTraffic: 1,
|
|
UploadTraffic: 1,
|
|
},
|
|
},
|
|
Operation: SetUsersRequest_Modify,
|
|
})
|
|
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()
|
|
}
|
|
|
|
func TestTLS(t *testing.T) {
|
|
port := common.PickPort("tcp", "127.0.0.1")
|
|
cfg := &Config{
|
|
API: APIConfig{
|
|
Enabled: true,
|
|
APIHost: "127.0.0.1",
|
|
APIPort: port,
|
|
SSL: SSLConfig{
|
|
Enabled: true,
|
|
CertPath: "server.crt",
|
|
KeyPath: "server.key",
|
|
VerifyClient: false,
|
|
ClientCertPath: []string{"client.crt"},
|
|
},
|
|
},
|
|
}
|
|
|
|
ctx := config.WithConfig(context.Background(), Name, cfg)
|
|
ctx = config.WithConfig(ctx, memory.Name,
|
|
&memory.Config{
|
|
Passwords: []string{},
|
|
})
|
|
|
|
auth, err := memory.NewAuthenticator(ctx)
|
|
common.Must(err)
|
|
go func() {
|
|
common.Must(RunServerAPI(ctx, auth))
|
|
}()
|
|
time.Sleep(time.Second)
|
|
pool := x509.NewCertPool()
|
|
certBytes, err := ioutil.ReadFile("server.crt")
|
|
pool.AppendCertsFromPEM(certBytes)
|
|
|
|
certificate, err := tls.LoadX509KeyPair("client.crt", "client.key")
|
|
common.Must(err)
|
|
creds := credentials.NewTLS(&tls.Config{
|
|
ServerName: "localhost",
|
|
RootCAs: pool,
|
|
Certificates: []tls.Certificate{certificate},
|
|
})
|
|
conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithTransportCredentials(creds))
|
|
common.Must(err)
|
|
server := NewTrojanServerServiceClient(conn)
|
|
stream, err := server.ListUsers(ctx, &ListUsersRequest{})
|
|
common.Must(err)
|
|
stream.CloseSend()
|
|
conn.Close()
|
|
}
|
|
|
|
func init() {
|
|
var serverCert = `
|
|
-----BEGIN CERTIFICATE-----
|
|
MIIDZTCCAk0CFFphZh018B5iAD9F5fV4y0AlD0LxMA0GCSqGSIb3DQEBCwUAMG8x
|
|
CzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARNYXJzMRMwEQYDVQQHDAppVHJhbnN3YXJw
|
|
MRMwEQYDVQQKDAppVHJhbnN3YXJwMRMwEQYDVQQLDAppVHJhbnN3YXJwMRIwEAYD
|
|
VQQDDAlsb2NhbGhvc3QwHhcNMjAwMzMxMTAwMDUxWhcNMzAwMzI5MTAwMDUxWjBv
|
|
MQswCQYDVQQGEwJVUzENMAsGA1UECAwETWFyczETMBEGA1UEBwwKaVRyYW5zd2Fy
|
|
cDETMBEGA1UECgwKaVRyYW5zd2FycDETMBEGA1UECwwKaVRyYW5zd2FycDESMBAG
|
|
A1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
|
|
ml44fThYMkCcT627o7ibEs7mq2WOhImjDwYijYJ1684BatrCsHJNcw8PJGTuP+tg
|
|
GdngmALjA3l+RipjaE/UK4FJrAjruphA/hOCjZfWqk8KBR4qk0OltxCMWJlp/XCM
|
|
9ny1ogFdWUlBbqThs4NWSOUESgxf/Be2njeiOrngGR31qxSiLCLBvafIhKqq/4av
|
|
Rlx0Ht770uvF97MlAj1ASAvzTZICHAfUZxEdWl0J4MBbG7SNcnMBbyAF+s60eFTa
|
|
4RGMfRGnUa2Fzz/gfjhvfSIGeLQ3JRG6sl6jkc5xe0PZzhq3UNpK0gtQ48yy9CSP
|
|
neZnrynoKks7XC2bizsr3QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAHS/xuG5+F
|
|
yGU3N6V4kv+HbKqHaXNOq4zKVsCc1k7vg4MFFpKUJKxtJYooCI8n2ypp5XRUTIGQ
|
|
bmEbVcIPqm9Rf/4vHtF0falNCwieAbXDkiEHoykRmmU1UE/ccPA7X8NO9aVLJAJO
|
|
N2Li8MH0Ixgs02pQH56eyGKoRBWPR5C3ETQ9Leqvazg6Dn1iJWvmfF0mOte5228s
|
|
mZJOntF9t8MZOJdIWGdrUHn6euRfhd0btkmL/NUDzeCTwJcuPORLxkBbCP5mTC6G
|
|
GnLS5Z4oRYgCgvT2pLtcM0r48hYjwgjXFQ4zalkW6YI9LPpqwwMhhOzINlXjBaDi
|
|
Haz8uKI4EciU
|
|
-----END CERTIFICATE-----
|
|
`
|
|
|
|
var serverKey = `
|
|
-----BEGIN RSA PRIVATE KEY-----
|
|
MIIEpAIBAAKCAQEAml44fThYMkCcT627o7ibEs7mq2WOhImjDwYijYJ1684BatrC
|
|
sHJNcw8PJGTuP+tgGdngmALjA3l+RipjaE/UK4FJrAjruphA/hOCjZfWqk8KBR4q
|
|
k0OltxCMWJlp/XCM9ny1ogFdWUlBbqThs4NWSOUESgxf/Be2njeiOrngGR31qxSi
|
|
LCLBvafIhKqq/4avRlx0Ht770uvF97MlAj1ASAvzTZICHAfUZxEdWl0J4MBbG7SN
|
|
cnMBbyAF+s60eFTa4RGMfRGnUa2Fzz/gfjhvfSIGeLQ3JRG6sl6jkc5xe0PZzhq3
|
|
UNpK0gtQ48yy9CSPneZnrynoKks7XC2bizsr3QIDAQABAoIBAFpYUo9W7qdakSFA
|
|
+NS1Mm0rkm01nteLBlfAq3BOrl030DSNm+xQuWthoOcX+yiFxVTb40qURfC+plzC
|
|
ajOepPphTJDXF7+5ZDBPktTzzLsYTzD3mstdiBtAICOqhhHCUX3hNxx91/htm1H6
|
|
Re4eK921y3DbFUIhTswCm3vrVXDc4yTXtURGllVzo40K/1Of39CpufKFdpJ81HV+
|
|
h/VW++h3o+sFV4KqcqIjClxBfDxoJpBaRlOCunTiHqZNvqO+EPqPR5zdn34werjU
|
|
xQEvPzmz+ClwnaEXQxYWgIcYQii9VNsHogDxEw4R31S7lVrUt0f0atDmGJip1lPb
|
|
E7IomAECgYEAzKQ3PzBV46nUNfVO9SODpf14Z+xYfLKouPC+Qnepwp0V0JS6zY1+
|
|
Wzskyb80drjnoQraWSEvGsX+tEWeLcnjN7JuMu/U8DPKRcQ+Q2dsVo/q4sfBOgvl
|
|
VhPNMZLfa7NIkRUx2KXku++Ep0Xtak0dskrfQrZnvhymRPyWuIMM6IECgYEAwRwL
|
|
Gt/ZZdUueE/hwT3c1hNn6igeDLOwK2t6frib+Ofw5oCAQxtTROvP1ljlnWUPkeIS
|
|
uzTusmqucalcK3lCHIsyHLwApOI/B31M971pxMVBRZ0wIbBaoarCGND7gi8JUPFR
|
|
VErGcAB5YnpRlmfLPEgw2o7DpjsDc2KmdE9oNV0CgYEAmfNEWLYtNztxGTK1treD
|
|
96ELLutf2lexlIgQKgLJ5E22tpbdPXwfvdRtpZTBjDsojj+S6hCL1lFzfv0MtZe2
|
|
5xTF0G4avKXJmti6moy4tRpJ81ehZuDCJBJ7gLrkd6qFghf2yuxqenQDUK/Lnvfq
|
|
ylGHSjHdM+lrsGRxotd8I4ECgYBoo4GA9nseqv2bQ+3YgGUBu1I7l7FwwI1decfO
|
|
ksoxfb0Tqd3WfyAH4J+mTlVdjD17lzz/JBeTpisQe+ztwa8JOIPW/ih7L/1nWYYz
|
|
V/fQH/LWfe5u0tjJcXXrbJJcYJBzw8+GFV6hoiAkNJOxJF0ENToDtAhgMuoTxAje
|
|
TYjyIQKBgQCmHkLLq0Bj3FpIOVrwo2gNvQteNPa7jkkGp4lljO8JQUHhCHDGWKEH
|
|
MUJ0EFsxS/EaQa+rW6jHhs3GyBA2TxmC783stAOOEX+hO/zpcbzdCWgp6eZ0aGMW
|
|
WS94/5WE/lwHJi8ZPSjH1AURCzXhUi4fGvBrNBtry95e+jcEvP5c0g==
|
|
-----END RSA PRIVATE KEY-----
|
|
`
|
|
var clientKey = `
|
|
-----BEGIN PRIVATE KEY-----
|
|
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDDZ6UMZRadrMN7
|
|
T8xdgFfM5F8XjF5WyQt9mVqcre+47Us1Z72K3wv5kgC8cm4oqC5RqbAndJN3lDLf
|
|
i/nvdPIB0gpQ8/jE9KunnicmF7OpCDg7I9wPaZFZNDkW97vXQz8QRyvDPRA311ZY
|
|
1ltB+nZ7kpQs4WWRUWfJNAGPqo1rY5pgcGCEwTgocZhOKyGHxO4dlVXHzmlUF3nP
|
|
cuc8ge6tIx+S/EJvAF7JJWXdm3I0ckPFw6RJN81HTr7vSgm/UWOMv9ZblMNeR4dl
|
|
errZHhqAOG9c1t0GeuYu3idkaXqITjHaz9w165v33rkVXOrsdGcZOOXEB7rycv1Q
|
|
x6+YcCyHAgMBAAECggEAYM83qTVoCAQw8SXu1SAh38QBDLShhJOkWrygdOGD0/XU
|
|
fggAkw3AbAwWy0ZSJ1hzYkgUmueZq/PDZJd/40/oGljKfaLxy/qAFNI5CRlTDFqj
|
|
KUGx4/zkYvKJmkRwTszlMJZiKx9UqqXIBMlmewCwtLZBLR8aZ+2R4tAeOeRAnkPj
|
|
5kKjOFSByyNUtyqqBZ/M5idySwhbITIc0/1kJ1ULAeMlezNdSoEjkK30ck/enUMF
|
|
ouFQMMVFnGMpwe83mPDzj4Yw6bL6u3A4wiUTzckjJW+KDdU9V2QFe0fXFGpUckGJ
|
|
hMEV8t6+4/ATaHKw8opcgg9ua/9rXOjlo+sF7zXdsQKBgQDla3wf8FH3kmH/CKn4
|
|
NeC+XR+fuNVsZrP/OFXxtXPu/kJoPropD6+5DJkSEnms0rOpHedShYMgk1cPYGUI
|
|
Ol8ISj+y7qvxTgFZJGMUzZSkTKkjUDpCcN5kENCwN9gHwf+gBv9iR/BUljcjPwmi
|
|
AZCYHRyffitZu0rKuGH/3UMFyQKBgQDaC0lYZB7wvD6LObLS85Aygv9y6SldnCEt
|
|
qzl/6NwSYK/COwd5cf9t4G0Ylku3gxU1KPgCTeyen8LwDVp0z/J0fHoQXJjulhDN
|
|
K5O3960vye8xEtqZDMQe57HYb0BluKSvcGcMP90pgoJmSDESNJ9tJrv2VEJUpSKU
|
|
XyqsLGYHzwKBgESWash9p3O1fripVW9QZD1lR9QPhTbgSYXOyNr3XY6g0yepQSyP
|
|
dQCExKqDfX7uiynPN94S7k3p3shJEEtycADhecO72QnOQVbuKvUINR0dkh9tl81P
|
|
Qx11bX6RY3OGSy8DiIxQZ4hSVG+kI/QcNadUZL9GEB3GgaizkRDWjHgJAoGAYK4u
|
|
eF30hiPBy7PqwbSzlGIXaFlQOSyYXYqVdUzH//IVHJdV6hiM/KhNV2CU9CrQRYED
|
|
7umkaHVIV25kVHU7+UCUUxrryKaLjp2q4yCUDyOHxoeom8JYV6e+aMxzjmb/xrad
|
|
SoYqx1QSA84wy/S/WAObxk54FtYd7hIAdtU87GsCgYB8CQLw7WwA5T9XW7evNFr5
|
|
kkVWJmGfxORNC7lo0L+TdpdF/OQzuMiNohq0kRy+KqsWH4EU7P6WS3svQkBNR4WY
|
|
QTC/ydb3mkaonVWZk2I1FPYyewLklwJ8lqCJ9kQ5EPNXso7NbEbeGe8M+82BSE5K
|
|
xdug4Ym572dEWNno+36LRA==
|
|
-----END PRIVATE KEY-----
|
|
`
|
|
var clientCert = `
|
|
-----BEGIN CERTIFICATE-----
|
|
MIIDTTCCAjUCFDXIjx65Pg1HFcdJJmv1JjQFzUFkMA0GCSqGSIb3DQEBCwUAMG0x
|
|
CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJOWTELMAkGA1UEBwwCTlkxDTALBgNVBAsM
|
|
BHJvb3QxFDASBgNVBAMMC0dvb2dsZSBMdGQuMR8wHQYJKoZIhvcNAQkBFhBhZG1p
|
|
bkBnb29nbGUuY29tMB4XDTIwMDcwNDAzMjMwMFoXDTIwMDgwMzAzMjMwMFowWTEL
|
|
MAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQswCQYDVQQHDAJOWTERMA8GA1UEAwwI
|
|
YXNkZi5jb20xHTAbBgkqhkiG9w0BCQEWDmFkbWluQGFzZGYuY29tMIIBIjANBgkq
|
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2elDGUWnazDe0/MXYBXzORfF4xeVskL
|
|
fZlanK3vuO1LNWe9it8L+ZIAvHJuKKguUamwJ3STd5Qy34v573TyAdIKUPP4xPSr
|
|
p54nJhezqQg4OyPcD2mRWTQ5Fve710M/EEcrwz0QN9dWWNZbQfp2e5KULOFlkVFn
|
|
yTQBj6qNa2OaYHBghME4KHGYTishh8TuHZVVx85pVBd5z3LnPIHurSMfkvxCbwBe
|
|
ySVl3ZtyNHJDxcOkSTfNR06+70oJv1FjjL/WW5TDXkeHZXq62R4agDhvXNbdBnrm
|
|
Lt4nZGl6iE4x2s/cNeub9965FVzq7HRnGTjlxAe68nL9UMevmHAshwIDAQABMA0G
|
|
CSqGSIb3DQEBCwUAA4IBAQBrwrqLoo0/26m/2xmI+F6Le7SFZB0wx0/tAgjF5T/L
|
|
W2kwLZ2pA/3FRZ+sWfwl2eiM2z3J049Yiyb/opxqPOMQsXJwKUnMlZFb7Fr2Cryf
|
|
4l5PSXTrW2itB184aHzx2DCSGHuSbZ8079r4X6JYprMb3ZbSdEeBhOGpol0F+b48
|
|
8Nuuz5u3aCiGGo8BHTb+uoKOjaux6n9scuzVBTqgDvdWZl7V/Z8rVf9y738b3m8v
|
|
cB1wthuMku55gQSCjLELWUEqkNQUQmvuCragCNY0nv7DM8aUH7ggF/QuFP6g2+M+
|
|
Gimb9UORkV8SmPTyJuOXKO33PN5o1P4ixfAy1Z/WsX4K
|
|
-----END CERTIFICATE-----
|
|
`
|
|
ioutil.WriteFile("server.crt", []byte(serverCert), 0777)
|
|
ioutil.WriteFile("server.key", []byte(serverKey), 0777)
|
|
ioutil.WriteFile("client.crt", []byte(clientCert), 0777)
|
|
ioutil.WriteFile("client.key", []byte(clientKey), 0777)
|
|
}
|