diff --git a/pkg/provider/base.go b/pkg/provider/base.go index 367165d..5894897 100644 --- a/pkg/provider/base.go +++ b/pkg/provider/base.go @@ -10,15 +10,6 @@ type Provider interface { Provide() string } -func checkInList(list []string, item string) bool { - for _, i := range list { - if item == i { - return true - } - } - return false -} - type Base struct { Proxies *proxy.ProxyList `yaml:"proxies"` Types string `yaml:"type"` diff --git a/pkg/provider/clash.go b/pkg/provider/clash.go index 9466a97..84235d0 100644 --- a/pkg/provider/clash.go +++ b/pkg/provider/clash.go @@ -3,6 +3,8 @@ package provider import ( "strings" + "github.com/zu1k/proxypool/pkg/tool" + "github.com/zu1k/proxypool/pkg/proxy" ) @@ -37,17 +39,17 @@ func checkClashSupport(p proxy.Proxy) bool { switch p.TypeName() { case "ssr": ssr := p.(*proxy.ShadowsocksR) - if checkInList(ssrCipherList, ssr.Cipher) && checkInList(ssrProtocolList, ssr.Protocol) && checkInList(ssrObfsList, ssr.Obfs) { + if tool.CheckInList(proxy.SSRCipherList, ssr.Cipher) && tool.CheckInList(ssrProtocolList, ssr.Protocol) && tool.CheckInList(ssrObfsList, ssr.Obfs) { return true } case "vmess": vmess := p.(*proxy.Vmess) - if checkInList(vmessCipherList, vmess.Cipher) { + if tool.CheckInList(vmessCipherList, vmess.Cipher) { return true } case "ss": ss := p.(*proxy.Shadowsocks) - if checkInList(ssCipherList, ss.Cipher) { + if tool.CheckInList(proxy.SSCipherList, ss.Cipher) { return true } case "trojan": @@ -58,30 +60,6 @@ func checkClashSupport(p proxy.Proxy) bool { return false } -var ssrCipherList = []string{ - "aes-128-cfb", - "aes-192-cfb", - "aes-256-cfb", - "aes-128-ctr", - "aes-192-ctr", - "aes-256-ctr", - "aes-128-ofb", - "aes-192-ofb", - "aes-256-ofb", - "des-cfb", - "bf-cfb", - "cast5-cfb", - "rc4-md5", - "chacha20-ietf", - "salsa20", - "camellia-128-cfb", - "camellia-192-cfb", - "camellia-256-cfb", - "idea-cfb", - "rc2-cfb", - "seed-cfb", -} - var ssrObfsList = []string{ "plain", "http_simple", @@ -110,20 +88,3 @@ var vmessCipherList = []string{ "chacha20-poly1305", "none", } - -var ssCipherList = []string{ - "aes-128-gcm", - "aes-192-gcm", - "aes-256-gcm", - "aes-128-cfb", - "aes-192-cfb", - "aes-256-cfb", - "aes-128-ctr", - "aes-192-ctr", - "aes-256-ctr", - "rc4-md5", - "chacha20-ietf", - "xchacha20", - "chacha20-ietf-poly1305", - "xchacha20-ietf-poly1305", -} diff --git a/pkg/provider/ssrsub.go b/pkg/provider/ssrsub.go index 3cf21e0..8d54dd0 100644 --- a/pkg/provider/ssrsub.go +++ b/pkg/provider/ssrsub.go @@ -3,6 +3,8 @@ package provider import ( "strings" + "github.com/zu1k/proxypool/pkg/proxy" + "github.com/zu1k/proxypool/pkg/tool" ) @@ -11,11 +13,18 @@ type SSRSub struct { } func (sub SSRSub) Provide() string { - sub.Types = "ssr" + sub.Types = "ssr,ss" sub.preFilter() var resultBuilder strings.Builder for _, p := range *sub.Proxies { - resultBuilder.WriteString(p.Link() + "\n") + if p.TypeName() == "ssr" { + resultBuilder.WriteString(p.Link() + "\n") + } else if p.TypeName() == "ss" { + ssr, err := proxy.SS2SSR(p.(*proxy.Shadowsocks)) + if err == nil { + resultBuilder.WriteString(ssr.Link() + "\n") + } + } } return tool.Base64EncodeString(resultBuilder.String(), false) } diff --git a/pkg/provider/sssub.go b/pkg/provider/sssub.go index 3281db8..a65c73b 100644 --- a/pkg/provider/sssub.go +++ b/pkg/provider/sssub.go @@ -22,11 +22,22 @@ type ssJson struct { } func (sub SSSub) Provide() string { - sub.Types = "ss" + sub.Types = "ss,ssr" sub.preFilter() proxies := make([]ssJson, 0, sub.Proxies.Len()) for _, p := range *sub.Proxies { - pp := p.(*proxy.Shadowsocks) + var pp *proxy.Shadowsocks + + if p.TypeName() == "ssr" { + var err error + pp, err = proxy.SSR2SS(p.(*proxy.ShadowsocksR)) + if err != nil { + continue + } + } else if p.TypeName() == "ss" { + pp = p.(*proxy.Shadowsocks) + } + proxies = append(proxies, ssJson{ Remarks: pp.Name, Server: pp.Server, diff --git a/pkg/provider/surge.go b/pkg/provider/surge.go index a4d0c72..d0cb022 100644 --- a/pkg/provider/surge.go +++ b/pkg/provider/surge.go @@ -3,6 +3,8 @@ package provider import ( "strings" + "github.com/zu1k/proxypool/pkg/tool" + "github.com/zu1k/proxypool/pkg/proxy" ) @@ -30,7 +32,7 @@ func checkSurgeSupport(p proxy.Proxy) bool { return true case *proxy.Shadowsocks: ss := p.(*proxy.Shadowsocks) - if checkInList(ssCipherList, ss.Cipher) { + if tool.CheckInList(proxy.SSCipherList, ss.Cipher) { return true } default: diff --git a/pkg/proxy/convert.go b/pkg/proxy/convert.go new file mode 100644 index 0000000..11bcdbb --- /dev/null +++ b/pkg/proxy/convert.go @@ -0,0 +1,82 @@ +package proxy + +import ( + "errors" + + "github.com/zu1k/proxypool/pkg/tool" +) + +func SS2SSR(ss *Shadowsocks) (ssr *ShadowsocksR, err error) { + if !tool.CheckInList(SSRCipherList, ss.Cipher) { + return nil, errors.New("cipher not support") + } + base := ssr.Base + base.Type = "ssr" + return &ShadowsocksR{ + Base: base, + Password: ss.Password, + Cipher: ss.Cipher, + Protocol: "origin", + Obfs: "plain", + Group: "proxy.tgbot.co", + }, nil +} + +func SSR2SS(ssr *ShadowsocksR) (ss *Shadowsocks, err error) { + if !tool.CheckInList(SSCipherList, ssr.Cipher) { + return nil, errors.New("cipher not support") + } + if ssr.Protocol != "origin" || ssr.Obfs != "plain" { + return nil, errors.New("protocol or obfs not allowed") + } + base := ssr.Base + base.Type = "ss" + return &Shadowsocks{ + Base: base, + Password: ssr.Password, + Cipher: ssr.Cipher, + Plugin: "", + PluginOpts: nil, + }, nil +} + +var SSRCipherList = []string{ + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "aes-128-ofb", + "aes-192-ofb", + "aes-256-ofb", + "des-cfb", + "bf-cfb", + "cast5-cfb", + "rc4-md5", + "chacha20-ietf", + "salsa20", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", +} + +var SSCipherList = []string{ + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "rc4-md5", + "chacha20-ietf", + "xchacha20", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", +} diff --git a/pkg/tool/check.go b/pkg/tool/check.go new file mode 100644 index 0000000..74cd054 --- /dev/null +++ b/pkg/tool/check.go @@ -0,0 +1,10 @@ +package tool + +func CheckInList(list []string, item string) bool { + for _, i := range list { + if item == i { + return true + } + } + return false +}