add link export for ss & trojan

This commit is contained in:
zu1k
2020-09-04 12:02:18 +08:00
parent fb90213e33
commit ef1b6eab6b
4 changed files with 63 additions and 0 deletions

34
pkg/proxy/link_test.go Normal file
View File

@@ -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)
}

View File

@@ -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

View File

@@ -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

View File

@@ -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))
}