@@ -18,7 +18,6 @@ import (
1818 "flag"
1919 "fmt"
2020 "io"
21- "net/url"
2221 "os"
2322 "os/signal"
2423 "strings"
@@ -27,7 +26,6 @@ import (
2726
2827 oss "github.com/Jigsaw-Code/outline-go-tun2socks/outline/shadowsocks"
2928 "github.com/Jigsaw-Code/outline-go-tun2socks/shadowsocks"
30- "github.com/Jigsaw-Code/outline-ss-server/client"
3129 "github.com/eycorsican/go-tun2socks/common/log"
3230 _ "github.com/eycorsican/go-tun2socks/common/log/simple" // Register a simple logger.
3331 "github.com/eycorsican/go-tun2socks/core"
@@ -70,7 +68,7 @@ func main() {
7068 args .proxyPort = flag .Int ("proxyPort" , 0 , "Shadowsocks proxy port number" )
7169 args .proxyPassword = flag .String ("proxyPassword" , "" , "Shadowsocks proxy password" )
7270 args .proxyCipher = flag .String ("proxyCipher" , "chacha20-ietf-poly1305" , "Shadowsocks proxy encryption cipher" )
73- args .proxyPrefix = flag .String ("proxyPrefix" , "" , "Shadowsocks connection prefix, URI -encoded (unsafe)" )
71+ args .proxyPrefix = flag .String ("proxyPrefix" , "" , "Shadowsocks connection prefix, UTF8 -encoded (unsafe)" )
7472 args .logLevel = flag .String ("logLevel" , "info" , "Logging level: debug|info|warn|error|none" )
7573 args .dnsFallback = flag .Bool ("dnsFallback" , false , "Enable DNS fallback over TCP (overrides the UDP handler)." )
7674 args .checkConnectivity = flag .Bool ("checkConnectivity" , false , "Check the proxy TCP and UDP connectivity and exit." )
@@ -100,8 +98,33 @@ func main() {
10098 os .Exit (oss .IllegalConfiguration )
10199 }
102100
101+ config := oss.Config {
102+ Host : * args .proxyHost ,
103+ Port : * args .proxyPort ,
104+ Password : * args .proxyPassword ,
105+ CipherName : * args .proxyCipher ,
106+ }
107+
108+ // The prefix is an 8-bit-clean byte sequence, stored in the codepoint
109+ // values of a unicode string, which arrives here encoded in UTF-8.
110+ prefixRunes := []rune (* args .proxyPrefix )
111+ config .Prefix = make ([]byte , len (prefixRunes ))
112+ for i , r := range prefixRunes {
113+ if (r & 0xFF ) != r {
114+ log .Errorf ("Character out of range: %r" , r )
115+ os .Exit (oss .IllegalConfiguration )
116+ }
117+ config .Prefix [i ] = byte (r )
118+ }
119+
120+ client , err := oss .NewClient (& config )
121+ if err != nil {
122+ log .Errorf ("Failed to construct Shadowsocks client: %v" , err )
123+ os .Exit (oss .IllegalConfiguration )
124+ }
125+
103126 if * args .checkConnectivity {
104- connErrCode , err := oss .CheckConnectivity (* args . proxyHost , * args . proxyPort , * args . proxyPassword , * args . proxyCipher )
127+ connErrCode , err := oss .CheckConnectivity (client )
105128 log .Debugf ("Connectivity checks error code: %v" , connErrCode )
106129 if err != nil {
107130 log .Errorf ("Failed to perform connectivity checks: %v" , err )
@@ -119,25 +142,14 @@ func main() {
119142 // Output packets to TUN device
120143 core .RegisterOutputFn (tunDevice .Write )
121144
122- ssclient , err := client .NewClient (* args .proxyHost , * args .proxyPort , * args .proxyPassword , * args .proxyCipher )
123- if err != nil {
124- log .Errorf ("Failed to construct Shadowsocks client: %v" , err )
125- os .Exit (oss .IllegalConfiguration )
126- }
127- prefixBytes , err := url .PathUnescape (* args .proxyPrefix )
128- if err != nil {
129- log .Errorf ("\" %s\" could not be URI-decoded" , * args .proxyPrefix )
130- os .Exit (oss .IllegalConfiguration )
131- }
132- ssclient .SetTCPSaltGenerator (client .NewPrefixSaltGenerator ([]byte (prefixBytes )))
133145 // Register TCP and UDP connection handlers
134- core .RegisterTCPConnHandler (shadowsocks .NewTCPHandler (ssclient ))
146+ core .RegisterTCPConnHandler (shadowsocks .NewTCPHandler (client ))
135147 if * args .dnsFallback {
136148 // UDP connectivity not supported, fall back to DNS over TCP.
137149 log .Debugf ("Registering DNS fallback UDP handler" )
138150 core .RegisterUDPConnHandler (dnsfallback .NewUDPHandler ())
139151 } else {
140- core .RegisterUDPConnHandler (shadowsocks .NewUDPHandler (ssclient , udpTimeout ))
152+ core .RegisterUDPConnHandler (shadowsocks .NewUDPHandler (client , udpTimeout ))
141153 }
142154
143155 // Configure LWIP stack to receive input data from the TUN device
0 commit comments