@@ -18,7 +18,6 @@ import (
18
18
"flag"
19
19
"fmt"
20
20
"io"
21
- "net/url"
22
21
"os"
23
22
"os/signal"
24
23
"strings"
@@ -27,7 +26,6 @@ import (
27
26
28
27
oss "github.com/Jigsaw-Code/outline-go-tun2socks/outline/shadowsocks"
29
28
"github.com/Jigsaw-Code/outline-go-tun2socks/shadowsocks"
30
- "github.com/Jigsaw-Code/outline-ss-server/client"
31
29
"github.com/eycorsican/go-tun2socks/common/log"
32
30
_ "github.com/eycorsican/go-tun2socks/common/log/simple" // Register a simple logger.
33
31
"github.com/eycorsican/go-tun2socks/core"
@@ -70,7 +68,7 @@ func main() {
70
68
args .proxyPort = flag .Int ("proxyPort" , 0 , "Shadowsocks proxy port number" )
71
69
args .proxyPassword = flag .String ("proxyPassword" , "" , "Shadowsocks proxy password" )
72
70
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)" )
74
72
args .logLevel = flag .String ("logLevel" , "info" , "Logging level: debug|info|warn|error|none" )
75
73
args .dnsFallback = flag .Bool ("dnsFallback" , false , "Enable DNS fallback over TCP (overrides the UDP handler)." )
76
74
args .checkConnectivity = flag .Bool ("checkConnectivity" , false , "Check the proxy TCP and UDP connectivity and exit." )
@@ -100,8 +98,33 @@ func main() {
100
98
os .Exit (oss .IllegalConfiguration )
101
99
}
102
100
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
+
103
126
if * args .checkConnectivity {
104
- connErrCode , err := oss .CheckConnectivity (* args . proxyHost , * args . proxyPort , * args . proxyPassword , * args . proxyCipher )
127
+ connErrCode , err := oss .CheckConnectivity (client )
105
128
log .Debugf ("Connectivity checks error code: %v" , connErrCode )
106
129
if err != nil {
107
130
log .Errorf ("Failed to perform connectivity checks: %v" , err )
@@ -119,25 +142,14 @@ func main() {
119
142
// Output packets to TUN device
120
143
core .RegisterOutputFn (tunDevice .Write )
121
144
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 )))
133
145
// Register TCP and UDP connection handlers
134
- core .RegisterTCPConnHandler (shadowsocks .NewTCPHandler (ssclient ))
146
+ core .RegisterTCPConnHandler (shadowsocks .NewTCPHandler (client ))
135
147
if * args .dnsFallback {
136
148
// UDP connectivity not supported, fall back to DNS over TCP.
137
149
log .Debugf ("Registering DNS fallback UDP handler" )
138
150
core .RegisterUDPConnHandler (dnsfallback .NewUDPHandler ())
139
151
} else {
140
- core .RegisterUDPConnHandler (shadowsocks .NewUDPHandler (ssclient , udpTimeout ))
152
+ core .RegisterUDPConnHandler (shadowsocks .NewUDPHandler (client , udpTimeout ))
141
153
}
142
154
143
155
// Configure LWIP stack to receive input data from the TUN device
0 commit comments