Skip to content

Commit 58dfd13

Browse files
committed
support subsystem, forwarding access control and optimize keep alive
- support subsystem for scp and sftp - add access control for forwarding - optimize keep alive for better reliability
1 parent e694f45 commit 58dfd13

12 files changed

Lines changed: 940 additions & 162 deletions

File tree

go.mod

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,24 @@ require (
77
github.com/alessio/shellescape v1.4.2
88
github.com/creack/pty v1.1.24
99
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
10-
github.com/quic-go/quic-go v0.56.0
11-
github.com/xtaci/kcp-go/v5 v5.6.36
12-
github.com/xtaci/smux v1.5.35
13-
golang.org/x/crypto v0.44.0
10+
github.com/quic-go/quic-go v0.57.0
11+
github.com/stretchr/testify v1.11.1
12+
github.com/xtaci/kcp-go/v5 v5.6.40
13+
github.com/xtaci/smux v1.5.43
14+
golang.org/x/crypto v0.45.0
1415
golang.org/x/sys v0.38.0
1516
)
1617

1718
require (
19+
github.com/davecgh/go-spew v1.1.1 // indirect
1820
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
1921
github.com/klauspost/reedsolomon v1.12.5 // indirect
22+
github.com/kr/text v0.2.0 // indirect
2023
github.com/pkg/errors v0.9.1 // indirect
24+
github.com/pmezard/go-difflib v1.0.0 // indirect
2125
github.com/tjfoc/gmsm v1.4.1 // indirect
2226
go.uber.org/mock v0.6.0 // indirect
2327
golang.org/x/net v0.47.0 // indirect
2428
golang.org/x/time v0.14.0 // indirect
29+
gopkg.in/yaml.v3 v3.0.1 // indirect
2530
)

go.sum

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPp
77
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
88
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
99
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
10+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
1011
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
1112
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
1213
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -35,30 +36,36 @@ github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzh
3536
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
3637
github.com/klauspost/reedsolomon v1.12.5 h1:4cJuyH926If33BeDgiZpI5OU0pE+wUHZvMSyNGqN73Y=
3738
github.com/klauspost/reedsolomon v1.12.5/go.mod h1:LkXRjLYGM8K/iQfujYnaPeDmhZLqkrGUyG9p7zs5L68=
39+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
40+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
41+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
42+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
3843
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
3944
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4045
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4146
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
4247
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
43-
github.com/quic-go/quic-go v0.56.0 h1:q/TW+OLismmXAehgFLczhCDTYB3bFmua4D9lsNBWxvY=
44-
github.com/quic-go/quic-go v0.56.0/go.mod h1:9gx5KsFQtw2oZ6GZTyh+7YEvOxWCL9WZAepnHxgAo6c=
45-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
46-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
48+
github.com/quic-go/quic-go v0.57.0 h1:AsSSrrMs4qI/hLrKlTH/TGQeTMY0ib1pAOX7vA3AdqE=
49+
github.com/quic-go/quic-go v0.57.0/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s=
50+
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
51+
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
52+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
53+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
4754
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
4855
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
49-
github.com/xtaci/kcp-go/v5 v5.6.36 h1:Rus+5N1EYd7utJHqEvePhcNx/K2/wgTh2SRC92ex8rQ=
50-
github.com/xtaci/kcp-go/v5 v5.6.36/go.mod h1:4kGdSJy7bNEBsekC5Q7O4jCpU/uKXqLled1cMsn9nkk=
56+
github.com/xtaci/kcp-go/v5 v5.6.40 h1:0zaO+ws+dXV3VpUfL7f8z0s5J075RFtjXYu9hK6UVUQ=
57+
github.com/xtaci/kcp-go/v5 v5.6.40/go.mod h1:h7RBeE7Vm9xGLE0gK1JITz09q9rO2oFqDyciQhqlgfg=
5158
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
5259
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
53-
github.com/xtaci/smux v1.5.35 h1:RosihGJBeaS8gxOZ17HNxbhONwnqQwNwusHx4+SEGhk=
54-
github.com/xtaci/smux v1.5.35/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
60+
github.com/xtaci/smux v1.5.43 h1:+H+7Ofg5GpK7T0u2Me1Ljhczc2SH+kMm4r5DVY4TfTk=
61+
github.com/xtaci/smux v1.5.43/go.mod h1:IGQ9QYrBphmb/4aTnLEcJby0TNr3NV+OslIOMrX825Q=
5562
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
5663
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
5764
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5865
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
5966
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
60-
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
61-
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
67+
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
68+
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
6269
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
6370
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
6471
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -108,6 +115,9 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
108115
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
109116
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
110117
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
118+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
119+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
120+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
111121
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
112122
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
113123
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

tsshd/bus.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func sendBusMessage(command string, msg any) error {
6565

6666
func trySendErrorMessage(format string, a ...any) {
6767
_, _ = doWithTimeout(func() (int, error) {
68-
_ = sendBusMessage("error", errorMessage{fmt.Sprintf(format, a...)})
68+
_ = sendBusMessage("error", errorMessage{Msg: fmt.Sprintf(format, a...)})
6969
return 0, nil
7070
}, 1*time.Second)
7171
}
@@ -116,36 +116,45 @@ func handleBusEvent(stream net.Conn) {
116116
case "close":
117117
exitChan <- 0
118118
return
119-
case "alive":
119+
case "alive": // work as ping in new version
120120
now := time.Now()
121121
lastAliveTime.Store(&now)
122+
_ = sendBusCommand("alive")
123+
case "alive2":
124+
err = handleAliveEvent(stream)
122125
default:
123-
err = handleUnknownEvent(stream)
126+
err = handleUnknownEvent(stream, command)
124127
}
125128
if err != nil {
126-
trySendErrorMessage("handle bus command [%s] failed: %v", command, err)
129+
trySendErrorMessage("handle bus command [%s] failed: %v. You may need to upgrade tsshd.", command, err)
127130
}
128131
}
129132
}
130133

131-
func handleUnknownEvent(stream net.Conn) error {
134+
func handleAliveEvent(stream net.Conn) error {
135+
now := time.Now()
136+
lastAliveTime.Store(&now)
137+
138+
var msg aliveMessage
139+
if err := recvMessage(stream, &msg); err != nil {
140+
return fmt.Errorf("recv alive message failed: %v", err)
141+
}
142+
143+
return sendBusMessage("alive2", msg)
144+
}
145+
146+
func handleUnknownEvent(stream net.Conn, command string) error {
132147
var msg struct{}
133148
if err := recvMessage(stream, &msg); err != nil {
134-
return fmt.Errorf("recv unknown message failed: %v", err)
149+
return fmt.Errorf("recv message for unknown command [%s] failed: %v", command, err)
135150
}
136-
return fmt.Errorf("unknown command")
151+
return fmt.Errorf("unknown command: %s", command)
137152
}
138153

139154
func keepAlive(totalTimeout time.Duration, intervalTimeout time.Duration) {
140155
if intervalTimeout <= 0 {
141156
intervalTimeout = min(totalTimeout/10, 10*time.Second)
142157
}
143-
go func() {
144-
for {
145-
_ = sendBusCommand("alive")
146-
time.Sleep(intervalTimeout)
147-
}
148-
}()
149158
for {
150159
if t := lastAliveTime.Load(); t != nil && time.Since(*t) > totalTimeout {
151160
trySendErrorMessage("tsshd keep alive timeout")

0 commit comments

Comments
 (0)