From ef1b6eab6b8b01866c080e9f1cbfaca85b652a6f Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 4 Sep 2020 12:02:18 +0800 Subject: [PATCH] add link export for ss & trojan --- pkg/proxy/link_test.go | 34 ++++++++++++++++++++++++++++++++++ pkg/proxy/shadowsocks.go | 7 +++++++ pkg/proxy/trojan.go | 18 ++++++++++++++++++ pkg/tool/base64.go | 4 ++++ 4 files changed, 63 insertions(+) create mode 100644 pkg/proxy/link_test.go diff --git a/pkg/proxy/link_test.go b/pkg/proxy/link_test.go new file mode 100644 index 0000000..1edea19 --- /dev/null +++ b/pkg/proxy/link_test.go @@ -0,0 +1,34 @@ +package proxy + +import ( + "fmt" + "testing" +) + +func TestSSLink(t *testing.T) { + ss, err := ParseSSLink("ss://YWVzLTI1Ni1jZmI6ZUlXMERuazY5NDU0ZTZuU3d1c3B2OURtUzIwMXRRMERAMTcyLjEwNC4xNjEuNTQ6ODA5OQ==#翻墙党223.13新加坡") + if err != nil { + t.Error(err) + } + fmt.Println(ss) + fmt.Println(ss.Link()) + ss, err = ParseSSLink(ss.Link()) + if err != nil { + t.Error(err) + } + fmt.Println(ss) +} + +func TestTrojanLink(t *testing.T) { + trojan, err := ParseTrojanLink("trojan://65474277@sqcu.hostmsu.ru:55551?allowinsecure=0&peer=mza.hkfq.xyz&mux=1&ws=0&wspath=&wshost=&ss=0&ssmethod=aes-128-gcm&sspasswd=&group=#%E9%A6%99%E6%B8%AFCN2-MZA%E8%8A%82%E7%82%B9-%E5%AE%BF%E8%BF%81%E8%81%94%E9%80%9A%E4%B8%AD%E8%BD%AC") + if err != nil { + t.Error(err) + } + fmt.Println(trojan) + fmt.Println(trojan.Link()) + trojan, err = ParseTrojanLink(trojan.Link()) + if err != nil { + t.Error(err) + } + fmt.Println(trojan) +} diff --git a/pkg/proxy/shadowsocks.go b/pkg/proxy/shadowsocks.go index 9448b95..d5160e3 100644 --- a/pkg/proxy/shadowsocks.go +++ b/pkg/proxy/shadowsocks.go @@ -65,6 +65,13 @@ func (ss Shadowsocks) Clone() Proxy { return &ss } +// https://shadowsocks.org/en/config/quick-guide.html +func (ss Shadowsocks) Link() (link string) { + payload := fmt.Sprintf("%s:%s@%s:%d", ss.Cipher, ss.Password, ss.Server, ss.Port) + payload = tool.Base64EncodeString(payload) + return fmt.Sprintf("ss://%s#%s", payload, ss.Name) +} + func ParseSSLink(link string) (*Shadowsocks, error) { if !strings.HasPrefix(link, "ss://") { return nil, ErrorNotSSRLink diff --git a/pkg/proxy/trojan.go b/pkg/proxy/trojan.go index 3cd7b4d..fab75e6 100644 --- a/pkg/proxy/trojan.go +++ b/pkg/proxy/trojan.go @@ -66,6 +66,24 @@ func (t Trojan) Clone() Proxy { return &t } +// https://p4gefau1t.github.io/trojan-go/developer/url/ +func (t Trojan) Link() (link string) { + query := url.Values{} + if t.SNI != "" { + query.Set("sni", url.QueryEscape(t.SNI)) + } + + uri := url.URL{ + Scheme: "trojan", + User: url.User(url.QueryEscape(t.Password)), + Host: net.JoinHostPort(t.Server, strconv.Itoa(t.Port)), + RawQuery: query.Encode(), + Fragment: t.Name, + } + + return uri.String() +} + func ParseTrojanLink(link string) (*Trojan, error) { if !strings.HasPrefix(link, "trojan://") && !strings.HasPrefix(link, "trojan-go://") { return nil, ErrorNotTrojanink diff --git a/pkg/tool/base64.go b/pkg/tool/base64.go index 93114ac..e9ca8cb 100644 --- a/pkg/tool/base64.go +++ b/pkg/tool/base64.go @@ -26,3 +26,7 @@ func Base64DecodeString(src string) (dst string, err error) { dst = string(dstbytes) return } + +func Base64EncodeString(origin string) (result string) { + return base64.StdEncoding.EncodeToString([]byte(origin)) +}