Browse Source

add link export for ss & trojan

zu1k 5 years ago
parent
commit
ef1b6eab6b
4 changed files with 63 additions and 0 deletions
  1. 34 0
      pkg/proxy/link_test.go
  2. 7 0
      pkg/proxy/shadowsocks.go
  3. 18 0
      pkg/proxy/trojan.go
  4. 4 0
      pkg/tool/base64.go

+ 34 - 0
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://[email protected]: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)
+}

+ 7 - 0
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

+ 18 - 0
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

+ 4 - 0
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))
+}