init: 1.0.0
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package quantumultx
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func BuildQuantumultX(servers []proxy.Proxy, uuid string) string {
|
||||
var uri string
|
||||
for _, s := range servers {
|
||||
switch s.Protocol {
|
||||
case "vmess":
|
||||
uri += buildVmess(s, uuid)
|
||||
case "shadowsocks":
|
||||
uri += buildShadowsocks(s, uuid)
|
||||
case "trojan":
|
||||
uri += buildTrojan(s, uuid)
|
||||
}
|
||||
}
|
||||
return base64.StdEncoding.EncodeToString([]byte(uri))
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package quantumultx
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func createVMess() proxy.Proxy {
|
||||
|
||||
return proxy.Proxy{
|
||||
Name: "Vmess",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 13002,
|
||||
Protocol: "vmess",
|
||||
Option: proxy.Vmess{
|
||||
Port: 13002,
|
||||
Transport: "websocket",
|
||||
TransportConfig: proxy.TransportConfig{
|
||||
Path: "/ws",
|
||||
Host: "test.xx.com",
|
||||
},
|
||||
Security: "none",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createSS() proxy.Proxy {
|
||||
return proxy.Proxy{
|
||||
Name: "Shadowsocks",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 10301,
|
||||
Protocol: "shadowsocks",
|
||||
Option: proxy.Shadowsocks{
|
||||
Port: 10301,
|
||||
Method: "aes-256-gcm",
|
||||
ServerKey: "123456",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createTrojan() proxy.Proxy {
|
||||
|
||||
return proxy.Proxy{
|
||||
Name: "Trojan",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 13002,
|
||||
Protocol: "trojan",
|
||||
Option: proxy.Trojan{
|
||||
Port: 13002,
|
||||
Transport: "websocket",
|
||||
TransportConfig: proxy.TransportConfig{
|
||||
Path: "/ws",
|
||||
Host: "baidu.com",
|
||||
},
|
||||
SecurityConfig: proxy.SecurityConfig{
|
||||
SNI: "baidu.com",
|
||||
AllowInsecure: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
func TestVmess(t *testing.T) {
|
||||
s := createVMess()
|
||||
vmess := buildVmess(s, "uuid")
|
||||
t.Log(vmess)
|
||||
// output:
|
||||
// vmess=127.0.0.1:13002,method=chacha20-poly1305,password=uuid,fast-open=true,udp-relay=true,tag=Vmess,tls-verification=true,obfs-uri=/ws,obfs-host=baidu.com
|
||||
}
|
||||
|
||||
func TestShadowsocks(t *testing.T) {
|
||||
s := createSS()
|
||||
shadowsocks := buildShadowsocks(s, "uuid")
|
||||
t.Log(shadowsocks)
|
||||
// output:
|
||||
// shadowsocks=127.0.0.1:10301,method=aes-256-gcm,password=uuid,fast-open=true,udp-relay=true,tag=Shadowsocks
|
||||
}
|
||||
|
||||
func TestTrojan(t *testing.T) {
|
||||
s := createTrojan()
|
||||
trojan := buildTrojan(s, "password")
|
||||
t.Log(trojan)
|
||||
// output:
|
||||
// trojan=192.168.0.1:13002,password=password,fast-open=true,udp-relay=true,tag=Trojan,obfs=wss,obfs-uri=ws,obfs-host=baidu.com
|
||||
}
|
||||
|
||||
func TestBuildQuantumultX(t *testing.T) {
|
||||
var servers []proxy.Proxy
|
||||
uri := BuildQuantumultX(servers, "uuid")
|
||||
t.Log(uri)
|
||||
|
||||
// output:
|
||||
// c2hhZG93c29ja3M9MTI3LjAuMC4xOjEwMzAxLG1ldGhvZD1hZXMtMjU2LWdjbSxwYXNzd29yZD11dWlkLGZhc3Qtb3Blbj10cnVlLHVkcC1yZWxheT10cnVlLHRhZz1TaGFkb3dzb2Nrcw0KdHJvamFuPTE5Mi4xNjguMC4xOjEzMDAyLHBhc3N3b3JkPXV1aWQsZmFzdC1vcGVuPXRydWUsdWRwLXJlbGF5PXRydWUsdGFnPVRyb2phbixvYmZzPXdzcyxvYmZzLXVyaT13cyxvYmZzLWhvc3Q9YmFpZHUuY29tDQp2bWVzcz0xMjcuMC4wLjE6MTMwMDIsbWV0aG9kPWNoYWNoYTIwLXBvbHkxMzA1LHBhc3N3b3JkPXV1aWQsZmFzdC1vcGVuPXRydWUsdWRwLXJlbGF5PXRydWUsdGFnPVZtZXNzLHRscy12ZXJpZmljYXRpb249dHJ1ZSxvYmZzLXVyaT0vd3Msb2Jmcy1ob3N0PWJhaWR1LmNvbQ0K
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package quantumultx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func buildShadowsocks(data proxy.Proxy, uuid string) string {
|
||||
ss := data.Option.(proxy.Shadowsocks)
|
||||
addr := fmt.Sprintf("%s:%d", data.Server, data.Port)
|
||||
|
||||
config := []string{
|
||||
addr,
|
||||
fmt.Sprintf("method=%s", ss.Method),
|
||||
fmt.Sprintf("password=%s", uuid),
|
||||
"fast-open=true",
|
||||
"udp-relay=true",
|
||||
fmt.Sprintf("tag=%s", data.Name),
|
||||
}
|
||||
return strings.Join(config, ",") + "\r\n"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package quantumultx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
// 生成 Trojan 配置
|
||||
func buildTrojan(data proxy.Proxy, password string) string {
|
||||
trojan := data.Option.(proxy.Trojan)
|
||||
|
||||
addr := fmt.Sprintf("trojan=%s:%d", data.Server, data.Port)
|
||||
config := []string{
|
||||
addr,
|
||||
fmt.Sprintf("password=%s", password),
|
||||
"fast-open=true",
|
||||
"udp-relay=true",
|
||||
fmt.Sprintf("tag=%s", data.Name),
|
||||
}
|
||||
|
||||
if trojan.Transport == "websocket" {
|
||||
config = append(config, "obfs=wss")
|
||||
if trojan.TransportConfig.Path != "" {
|
||||
config = append(config, fmt.Sprintf("obfs-uri=%s", trojan.TransportConfig.Path))
|
||||
}
|
||||
if trojan.TransportConfig.Host != "" {
|
||||
config = append(config, fmt.Sprintf("obfs-host=%s", trojan.TransportConfig.Host))
|
||||
}
|
||||
} else {
|
||||
config = append(config, "over-tls=true")
|
||||
if trojan.SecurityConfig.SNI != "" {
|
||||
config = append(config, fmt.Sprintf("tls-host=%s", trojan.SecurityConfig.SNI))
|
||||
}
|
||||
}
|
||||
|
||||
return strings.Join(config, ",") + "\r\n"
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package quantumultx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func buildVmess(data proxy.Proxy, uuid string) string {
|
||||
|
||||
vmess := data.Option.(proxy.Vmess)
|
||||
addr := fmt.Sprintf("vmess=%s:%d", data.Server, data.Port)
|
||||
var host string
|
||||
uriConfig := []string{
|
||||
addr,
|
||||
"method=chacha20-poly1305",
|
||||
fmt.Sprintf("password=%s", uuid),
|
||||
"fast-open=true",
|
||||
"udp-relay=true",
|
||||
fmt.Sprintf("tag=%s", data.Name),
|
||||
}
|
||||
if vmess.Security == "tls" {
|
||||
if vmess.Transport == "tcp" {
|
||||
uriConfig = append(uriConfig, "obfs=over-tls")
|
||||
}
|
||||
if vmess.SecurityConfig.AllowInsecure {
|
||||
uriConfig = append(uriConfig, "tls-verification=true")
|
||||
} else {
|
||||
uriConfig = append(uriConfig, "tls-verification=false")
|
||||
}
|
||||
if vmess.SecurityConfig.SNI != "" {
|
||||
host = vmess.SecurityConfig.SNI
|
||||
}
|
||||
}
|
||||
|
||||
if vmess.Transport == "websocket" {
|
||||
uriConfig = append(uriConfig, fmt.Sprintf("obfs-uri=%s", vmess.TransportConfig.Path))
|
||||
host = vmess.TransportConfig.Host
|
||||
}
|
||||
if host != "" {
|
||||
uriConfig = append(uriConfig, fmt.Sprintf("obfs-host=%s", host))
|
||||
}
|
||||
return strings.Join(uriConfig, ",") + "\r\n"
|
||||
}
|
||||
Reference in New Issue
Block a user