init: 1.0.0

This commit is contained in:
Chang lue Tsen
2025-04-25 12:08:29 +09:00
commit 8addcc584b
1031 changed files with 76472 additions and 0 deletions
+22
View File
@@ -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))
}
+94
View File
@@ -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
}
+23
View File
@@ -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"
}
+39
View File
@@ -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"
}
+45
View File
@@ -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"
}