Skip to content

Commit d5f019b

Browse files
author
yckj0834
committed
addTlsSupport
1 parent 49c32a9 commit d5f019b

12 files changed

+167
-51
lines changed

Makefile

+15-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,21 @@ clean:
4545
rm -f 1.db
4646
rm -f tty/asset.go
4747
rm -f showme
48+
rm -f *.crt
49+
rm -f *.key
50+
rm -f *.csr
51+
rm -f tls/*
4852

4953
.PHONY: windows
5054
windows: asset
51-
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
55+
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
56+
57+
.PHONY: crt csr key
58+
crt: csr
59+
openssl x509 -req -sha256 -days 3650 -in tls/server.csr -signkey tls/server.key -out tls/server.crt
60+
61+
csr: key
62+
openssl req -nodes -new -key tls/server.key -subj "/CN=www.lflxp.cn" -out tls/server.csr
63+
64+
key: clean
65+
openssl genrsa -out tls/server.key 2048

cmd/tty.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121
)
2222

2323
var (
24+
enableTLS bool
25+
crtPath string
26+
keyPath string
2427
isProf bool
2528
isXsrf bool
2629
isAudit bool
@@ -31,6 +34,7 @@ var (
3134
username string
3235
password string
3336
port string
37+
host string
3438
)
3539

3640
// ttyCmd represents the tty command
@@ -40,7 +44,7 @@ var ttyCmd = &cobra.Command{
4044
Long: `showme tty [flags] [command] [args]
4145
eg: showme tty -w -r showme proxy http`,
4246
Run: func(cmd *cobra.Command, args []string) {
43-
tty.ServeGin(port, username, password, args, isDebug, isReconnect, isPermitWrite, isAudit, isXsrf, isProf, MaxConnections)
47+
tty.ServeGin(host, port, username, password, crtPath, keyPath, args, isDebug, isReconnect, isPermitWrite, isAudit, isXsrf, isProf, enableTLS, MaxConnections)
4448
},
4549
}
4650

@@ -58,12 +62,16 @@ func init() {
5862
// ttyCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
5963
ttyCmd.Flags().StringVarP(&username, "username", "u", "", "BasicAuth 用户名")
6064
ttyCmd.Flags().StringVarP(&password, "password", "p", "", "BasicAuth 密码")
61-
ttyCmd.Flags().StringVarP(&port, "port", "P", "8080", "http port")
65+
ttyCmd.Flags().StringVarP(&host, "host", "H", "0.0.0.0", "http bind host")
66+
ttyCmd.Flags().StringVarP(&port, "port", "P", "8080", "http bind port")
6267
ttyCmd.Flags().BoolVarP(&isDebug, "debug", "d", false, "debug log mode")
6368
ttyCmd.Flags().BoolVarP(&isReconnect, "reconnect", "r", false, "是否自动重连")
6469
ttyCmd.Flags().BoolVarP(&isPermitWrite, "write", "w", false, "是否开启写入模式")
6570
ttyCmd.Flags().BoolVarP(&isAudit, "audit", "a", false, "是否开启审计")
6671
ttyCmd.Flags().BoolVarP(&isXsrf, "xsrf", "x", false, "是否开启xsrf,默认开启")
6772
ttyCmd.Flags().BoolVarP(&isProf, "prof", "f", false, "是否开启pprof性能分析")
73+
ttyCmd.Flags().BoolVarP(&enableTLS, "tls", "t", false, "是否开启https")
74+
ttyCmd.Flags().StringVarP(&crtPath, "crt", "c", "./server.crt", "*.crt文件路径")
75+
ttyCmd.Flags().StringVarP(&keyPath, "key", "k", "./server.key", "*.key文件路径")
6876
ttyCmd.Flags().Int64VarP(&MaxConnections, "maxconnect", "m", 0, "最大连接数")
6977
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/spf13/viper v1.3.2
4646
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
4747
github.com/ugorji/go/codec v1.1.7
48+
github.com/unrolled/secure v1.0.7
4849
go.etcd.io/bbolt v1.3.3 // indirect
4950
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9
5051
golang.org/x/text v0.3.2 // indirect

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h
3838
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
3939
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
4040
github.com/codahale/chacha20 v0.0.0-20151107025005-ec07b4f69a3f/go.mod h1:2EU+1emidIWL7uTbVXfPFlgYxYo3TGHz+ElH1Tp5GT0=
41+
github.com/codegangsta/negroni v1.0.0 h1:+aYywywx4bnKXWvoWtRfJ91vC59NbEhEY03sZjQhbVY=
42+
github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0=
4143
github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
4244
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
4345
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -264,6 +266,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYy
264266
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
265267
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
266268
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
269+
github.com/unrolled/secure v1.0.7 h1:BcQHp3iKZyZCKj5gRqwQG+5urnGBF00wGgoPPwtheVQ=
270+
github.com/unrolled/secure v1.0.7/go.mod h1:uGc1OcRF8gCVBA+ANksKmvM85Hka6SZtQIbrKc3sHS4=
267271
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
268272
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
269273
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=

tls/server.crt

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
-----BEGIN CERTIFICATE-----
2-
MIICpDCCAg2gAwIBAgIJAOy9ytzo9MxUMA0GCSqGSIb3DQEBCwUAMGsxCzAJBgNV
3-
BAYTAkNOMQswCQYDVQQIDAJDUTELMAkGA1UEBwwCY3ExCzAJBgNVBAoMAnljMQsw
4-
CQYDVQQLDAJjcTEUMBIGA1UEAwwLd3d3Lmx4cC5jb20xEjAQBgkqhkiG9w0BCQEW
5-
AzFAMTAeFw0xOTA3MTcwODMzNDlaFw0xOTA4MTYwODMzNDlaMGsxCzAJBgNVBAYT
6-
AkNOMQswCQYDVQQIDAJDUTELMAkGA1UEBwwCY3ExCzAJBgNVBAoMAnljMQswCQYD
7-
VQQLDAJjcTEUMBIGA1UEAwwLd3d3Lmx4cC5jb20xEjAQBgkqhkiG9w0BCQEWAzFA
8-
MTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2whb1N8cXTDgZxuJu6tTQoed
9-
XiTg6mVAng4tKCavtE8ESJ09BMgceiKXg7UsUTqDg6DOCqqKuI4/lc99Nl/fBp+u
10-
EAkedA0t899OifjUz9gPlSK7XXnjwmFwip8U8A+ogb+oDBnZzge7vanslZQTwTF7
11-
Aj2C3T5c4yAXIAFZKNUCAwEAAaNQME4wHQYDVR0OBBYEFGm/iwSVvPMyYEMByD3Z
12-
43mKs5XcMB8GA1UdIwQYMBaAFGm/iwSVvPMyYEMByD3Z43mKs5XcMAwGA1UdEwQF
13-
MAMBAf8wDQYJKoZIhvcNAQELBQADgYEAa2mfKk/f3b1HKOLHDjJe0NH9liAe6/0G
14-
o/SCY8BBKWkYoG6Tz56o5I3KtadgXTCrc3gu0TwhXh4lKpT82U1BuKxdwKnNaMjD
15-
c8WPOy2SGyCda9916ZoC2w8OXnVgkHe7QWwmjTE+qBEA2BOdlBl2X8ixqhtOJkQh
16-
V/of3OnlsPU=
2+
MIICtTCCAZ0CFCRiP06HWBrWzUKwBC40sHjGKjkRMA0GCSqGSIb3DQEBCwUAMBcx
3+
FTATBgNVBAMMDHd3dy5sZmx4cC5jbjAeFw0yMDAzMTcwNDE1NDlaFw0zMDAzMTUw
4+
NDE1NDlaMBcxFTATBgNVBAMMDHd3dy5sZmx4cC5jbjCCASIwDQYJKoZIhvcNAQEB
5+
BQADggEPADCCAQoCggEBAOnFIzYwOg2bxfedrkmJbBBf2z7g6X4k7n6puduY4Db0
6+
8wRYChfftQ8V9LfTxReGaeJZMIcJKMmSUiSm/E9Hs52R2wSq3SXOYj4123XUB7u7
7+
yK3Bm6ldGIlYpGgePM6O7kO32llRPeMIZzgZ1NRelDrKFJ+/67pN9trV4sMjoV8s
8+
SUHp1mw2dAj2IVwCROtOvjMa4WuqY0UsND6n4p5Xp6gAYAi/yneurZL7yC9iA/zV
9+
AKN8sdxP4ahlwW0XbZqSv+1VYI3lmS2CE1Z2qyvQRDqAbu/9W+uuPPoZ7FKD8NTT
10+
3Sz3iBUpUhUGuQfoG1eKxvMl5n+hCscgxdo1AveOM1MCAwEAATANBgkqhkiG9w0B
11+
AQsFAAOCAQEAOO0Ftslt1N54RiXGaXVGFVY9R9PtgFY5qpssVlDIS08e8+V3PfDW
12+
76/JyguIMYo2LIO6sDyR83YstlPXRWN1eIaDBbQpBG2A7vk4+KH+Jm/5E6FMOEDv
13+
2Dsb6q8f2XAffFY8Ko/gbmGmX5U/fjVpqSoPaUmTH2/nABcMAKq1J3kugh04Gqid
14+
up0rjI66viagUfhN8P/0KMsxxSWctWOxyOe1YuLPrA6e1hj+lEhZAoJLIGQjKKvS
15+
GRAhoK/zG5Q7LUPAsE9dO4vThZckXv1+1fNTT6w6UxGZD50Wgdv7klIAvkqcvxKX
16+
P1uv51Sx4idM8SIZcMKKWdH3ZNvwrC1yzw==
1717
-----END CERTIFICATE-----

tls/server.csr

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN CERTIFICATE REQUEST-----
2+
MIICXDCCAUQCAQAwFzEVMBMGA1UEAwwMd3d3LmxmbHhwLmNuMIIBIjANBgkqhkiG
3+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6cUjNjA6DZvF952uSYlsEF/bPuDpfiTufqm5
4+
25jgNvTzBFgKF9+1DxX0t9PFF4Zp4lkwhwkoyZJSJKb8T0eznZHbBKrdJc5iPjXb
5+
ddQHu7vIrcGbqV0YiVikaB48zo7uQ7faWVE94whnOBnU1F6UOsoUn7/ruk322tXi
6+
wyOhXyxJQenWbDZ0CPYhXAJE606+Mxrha6pjRSw0PqfinlenqABgCL/Kd66tkvvI
7+
L2ID/NUAo3yx3E/hqGXBbRdtmpK/7VVgjeWZLYITVnarK9BEOoBu7/1b6648+hns
8+
UoPw1NPdLPeIFSlSFQa5B+gbV4rG8yXmf6EKxyDF2jUC944zUwIDAQABoAAwDQYJ
9+
KoZIhvcNAQELBQADggEBAJLvXTK73yzF0r3m6vatjnO4ozj4qW/aEytKaYFyOPnF
10+
aQtbpCLsmGwWjt4sFMkcRUFV2OzJs70E6rfrchdk/shWdmXdi7vm6oJPYUHzOaW7
11+
D0GKicOHGVx8bEOz2gewzkouH9rnkNIM5bR0cXP4BbKad9nLc605TzH73NcU4652
12+
bOHRQEtagCyGH275xyXqg+IlO9qZeo5jxSFWo6eJLcO5xqSg7w8ETVcXO2UvEJgr
13+
H8d1wwo9uf4D4XBpgVLVsTcibD04GjP+8SQbtTmQQ38JqM15eaJY2zgKvOLA7lFW
14+
4UnMi1H0MypLWtiuiN3lLZ5OjFCbnXlWq61tBaJOzU0=
15+
-----END CERTIFICATE REQUEST-----

tls/server.key

+27-16
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1-
-----BEGIN PRIVATE KEY-----
2-
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANsIW9TfHF0w4Gcb
3-
iburU0KHnV4k4OplQJ4OLSgmr7RPBEidPQTIHHoil4O1LFE6g4OgzgqqiriOP5XP
4-
fTZf3wafrhAJHnQNLfPfTon41M/YD5Uiu11548JhcIqfFPAPqIG/qAwZ2c4Hu72p
5-
7JWUE8ExewI9gt0+XOMgFyABWSjVAgMBAAECgYEA0jnlmh1CphdhatU9j0jTMwni
6-
+xc+YPsp2AoXQXBQOCmXHPL+O/atjnRhJGLh1FzrGY1f9VDWsGinkuyBa4z9CyHp
7-
TNCD0pvDrYpMT8sBiueqmkjUAsCyqzZJ/t2sMC7EdAC5JaAl8qqpHIhCYIzOkZjW
8-
emlrag01TapYZMy+dgkCQQDuv7/jnsTJgsDCgIaRt/5o1YLry128anQue+gze7Hw
9-
Keavwt7ECSVONueR+QXzct95AjTgFh5q7AicOtfIacKTAkEA6tvoCHQ0AeIKDmXu
10-
Z8AK89LcUwa11mAY69F9q9DtM/JnwuGgdQQdVsLv26xzJnCOFHttHTIPi1WXIN2p
11-
REr/9wJAbMScxjVRz8Aq0zG8nOxnEhmbgJLwzGLvNTIr8jB7Oz/Loe00kbjc7woi
12-
a6U4qdV+q+Fud1x8VRfdQFeqcNqF0wJBAIp1vRUG1QZrKbyVUXkvGgXnQWddZGSP
13-
YQHeDrX1xXJDrfKRrFRwaY+V+2zJ/VUjNFBU994nfkyJ2EBTDhCqGr8CQFElCtEZ
14-
c32Y7bmb+IJw64RuvgwnD5UuvfeTri8yNR0W1KU6aVaV2HFCBMzLLEhIIGJOVLJB
15-
h2fuMCPMc3RNLck=
16-
-----END PRIVATE KEY-----
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEA6cUjNjA6DZvF952uSYlsEF/bPuDpfiTufqm525jgNvTzBFgK
3+
F9+1DxX0t9PFF4Zp4lkwhwkoyZJSJKb8T0eznZHbBKrdJc5iPjXbddQHu7vIrcGb
4+
qV0YiVikaB48zo7uQ7faWVE94whnOBnU1F6UOsoUn7/ruk322tXiwyOhXyxJQenW
5+
bDZ0CPYhXAJE606+Mxrha6pjRSw0PqfinlenqABgCL/Kd66tkvvIL2ID/NUAo3yx
6+
3E/hqGXBbRdtmpK/7VVgjeWZLYITVnarK9BEOoBu7/1b6648+hnsUoPw1NPdLPeI
7+
FSlSFQa5B+gbV4rG8yXmf6EKxyDF2jUC944zUwIDAQABAoIBAGQVLIAUoaYV3Omo
8+
Lmf5V7Si9WC0NgL1mM3NqG6lwsiEkk53yspx0jiFM+JH3ge2Wjq36JjHiRjTdiuO
9+
+lKO5g091sDmzgtTkqgDstN9VVpAiSgqzZPy8YBL3QdeerYMZ2HCos6+g3phrJ9O
10+
H9pUK64HulCygB+hJWCHVbAp3vq5T5F80vAgQoivUXqnKqfIlxUsNGJCjFUr/1O5
11+
FaOoc5gaDjR0NV7Av+5IHUjvLTAcNes77aLOZD9BrXWNp4pa8+vpmd16WmIl7nqj
12+
Yx1D7jOty8+gTrXWQorRNftMXcifATB2b6JjQoI+hl8AxiMqgRX1NGc/5MwLKAnT
13+
JVOnkvECgYEA+xIFeLPs11v8popBdCLtJGkf/eAXFHjhP8EbLuJTZw2Ue70lZkh5
14+
wIY18TDUF4y5I9cm9/P+2k53jWMorfW1Dt4XgvIcoi7p6nkczJVBcS7HvxOtYq2c
15+
mH0MXyWKePH9po1VfonEq3Q8UqUp1zuQx2wJKjU7XlX/9hUR3e6xLcUCgYEA7lwo
16+
bUuANClH2mJJ/c9XMQelcBrLeC/VCE9qRirMgwVEJSAh/kLSeOR7IwYa1Tb/k/Uj
17+
e1QkqI58M7ekgZCD2sjdIq9vn9HUUTlNs0xQ2/2m/brO4oEVq/8uWpsm9/7lFk+1
18+
49+QCUflRgSqLtUv4ceLAR4bVMeM/AfSln4rxjcCgYAqgyWsB4NOAARqyrREjvlq
19+
leZV3ZDq5YD2g6MvsCEBLRp8TU284P7Eq7UMjwEKr8hVmkO97nGz01+I8EZeFmG/
20+
D7oZcReKGrl++1z2Azveh1ZJM3LDZ7RBWcMzhS7KRed2QS49y+QiR/9C2zaXfD2K
21+
lu+CVxsjYRqDN5Qb6SPVJQKBgQDbTF7Fb5lcZD5/Zb69jW2i5m4HXh+lTByrsKUO
22+
OYI/aTDxF0cvLzuFjnDcIFm/oQIzlm42oYu4qJ8M1gC8U8F8ISGTL+V7HQpCUH50
23+
X9plDFH/T0fYjPrra7OyGN0ZfaI3jM7EAIP8hfEjIleRDwMmrvfs504uCgpkNq5B
24+
V4PesQKBgQC4JhrE+y8pgt+FIvOVbwrAjOrm4MgJALpepHeJSquinSIyvxXIuPtZ
25+
egj2xEyV12YGAc9ZKfK6ny/1SXkgqtOXC3vPzomIRgUmNyosHK7FAqfSOd0oYW9+
26+
bUE1gej6asp/pJwPRJnB2S5mbHIcfZGo6f1tyrkjaigWmIVBd1pQUA==
27+
-----END RSA PRIVATE KEY-----

tty/Xtermjs.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ const (
2323
)
2424

2525
type Options struct {
26-
PermitWrite bool
27-
MaxConnections int64
28-
CloseSignal int
29-
Audit bool
30-
Xsrf bool
26+
PermitWrite bool
27+
MaxConnections int64
28+
CloseSignal int
29+
Audit bool
30+
Xsrf bool
31+
EnableTLS bool
32+
CrtPath, KeyPath string
3133
}
3234

3335
// 原本是命令端http server管理,这里后期可以改成gin server管理

tty/asset.go

+1-1
Large diffs are not rendered by default.

tty/static/xterm3.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,10 @@
195195

196196
{{if .Reconnect}}
197197
console.log("Recoonect Mode")
198-
ws = new ReconnectingWebSocket('ws://' + window.location.host + '/ws')
198+
ws = new ReconnectingWebSocket('{{.Protocol}}://' + window.location.host + '/ws')
199199
{{- else}}
200200
console.log("Once Mode")
201-
ws = new WebSocket('ws://' + window.location.host + '/ws')
201+
ws = new WebSocket('{{.Protocol}}://' + window.location.host + '/ws')
202202
{{- end}}
203203

204204
ws.onopen = () => {

tty/tty.go

+59-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"time"
1515

1616
"github.com/DeanThompson/ginpprof"
17+
"github.com/unrolled/secure"
1718

1819
"github.com/chenjiandongx/ginprom"
1920
assetfs "github.com/elazarl/go-bindata-assetfs"
@@ -44,7 +45,7 @@ var upGrader = websocket.Upgrader{
4445
},
4546
}
4647

47-
func ServeGin(port, username, password string, cmds []string, isdebug, isReconnect, isPermitWrite, isAudit, isXsrf, isProf bool, MaxConnections int64) {
48+
func ServeGin(host, port, username, password, crtpath, keypath string, cmds []string, isdebug, isReconnect, isPermitWrite, isAudit, isXsrf, isProf, enabletls bool, MaxConnections int64) {
4849
if isdebug {
4950
// 设置日志级别为warn以上
5051
log.SetLevel(log.DebugLevel)
@@ -65,6 +66,10 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
6566
// 使用 Recovery 中间件
6667
router.Use(gin.Recovery())
6768

69+
if enabletls {
70+
router.Use(TlsHandler(host, port))
71+
}
72+
6873
// 判断cmds输入,为空默认设置为bash
6974
if len(cmds) == 0 {
7075
cmds = append(cmds, "bash")
@@ -79,6 +84,9 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
7984
MaxConnections: MaxConnections,
8085
Audit: isAudit,
8186
Xsrf: isXsrf,
87+
EnableTLS: enabletls,
88+
CrtPath: crtpath,
89+
KeyPath: keypath,
8290
},
8391
Title: "Showme",
8492
Connections: &connections,
@@ -208,6 +216,12 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
208216
indexhtml.Add("index", t)
209217
router.HTMLRender = indexhtml
210218
apiGroup.GET("/", func(c *gin.Context) {
219+
var protocol string
220+
if xterm.Options.EnableTLS && utils.IsPathExists(xterm.Options.CrtPath) && utils.IsPathExists(xterm.Options.KeyPath) {
221+
protocol = "wss"
222+
} else {
223+
protocol = "ws"
224+
}
211225
newXsrf := utils.GetRandomSalt()
212226
log.WithField("tty.go", "212").Debugf("%s xsrftoken %s", c.Request.RemoteAddr, newXsrf)
213227
if !xterm.Options.Xsrf {
@@ -222,6 +236,7 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
222236
"Conn": *xterm.Connections + 1,
223237
"Cmd": strings.Join(cmds, " "),
224238
"Xsrf": newXsrf,
239+
"Protocol": protocol,
225240
})
226241
})
227242

@@ -232,7 +247,7 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
232247
}
233248

234249
server := &http.Server{
235-
Addr: fmt.Sprintf("0.0.0.0:%s", port),
250+
Addr: fmt.Sprintf("%s:%s", host, port),
236251
Handler: router,
237252
}
238253

@@ -256,18 +271,53 @@ func ServeGin(port, username, password string, cmds []string, isdebug, isReconne
256271
log.WithField("tty.go", "256").Println("Server exiting")
257272
}()
258273

259-
ips := utils.GetIPs()
260-
for _, ip := range ips {
261-
log.WithField("tty.go", "261").Infof("Listening and serving HTTPS on %s:%s", ip, port)
274+
if host == "0.0.0.0" {
275+
ips := utils.GetIPs()
276+
for _, ip := range ips {
277+
log.WithField("tty.go", "261").Infof("Listening and serving HTTPS on %s:%s", ip, port)
278+
}
279+
} else {
280+
log.WithField("tty.go", "261").Infof("Listening and serving HTTPS on %s:%s", host, port)
262281
}
263282

264-
if err := server.ListenAndServe(); err != nil {
265-
if err == http.ErrServerClosed {
266-
log.WithField("tty.go", "266").Println("Server closed under request")
283+
if xterm.Options.EnableTLS {
284+
if utils.IsPathExists(xterm.Options.CrtPath) && utils.IsPathExists(xterm.Options.KeyPath) {
285+
if err := server.ListenAndServeTLS(xterm.Options.CrtPath, xterm.Options.KeyPath); err != nil {
286+
if err == http.ErrServerClosed {
287+
log.WithField("tty.go", "266").Println("Server closed under request")
288+
} else {
289+
log.WithField("tty.go", "268").Fatal("Server closed unexpect", err.Error())
290+
}
291+
}
267292
} else {
268-
log.WithField("tty.go", "268").Fatal("Server closed unexpect", err.Error())
293+
log.WithField("tty.go", "277").Error("EnableTLS is true,but crt or key path is not exists")
294+
}
295+
} else {
296+
if err := server.ListenAndServe(); err != nil {
297+
if err == http.ErrServerClosed {
298+
log.WithField("tty.go", "266").Println("Server closed under request")
299+
} else {
300+
log.WithField("tty.go", "268").Fatal("Server closed unexpect", err.Error())
301+
}
269302
}
270303
}
271304

272305
log.WithField("tty.go", "272").Println("Server exiting")
273306
}
307+
308+
func TlsHandler(host, port string) gin.HandlerFunc {
309+
return func(c *gin.Context) {
310+
secureMiddleware := secure.New(secure.Options{
311+
SSLRedirect: true,
312+
SSLHost: fmt.Sprintf("%s:%s", host, port),
313+
})
314+
err := secureMiddleware.Process(c.Writer, c.Request)
315+
316+
// If there was an error, do not continue.
317+
if err != nil {
318+
return
319+
}
320+
321+
c.Next()
322+
}
323+
}

utils/common.go

+11
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,14 @@ func GetIPs() (ips []string) {
173173
}
174174
return ips
175175
}
176+
177+
func IsPathExists(path string) bool {
178+
_, err := os.Stat(path)
179+
if err == nil {
180+
return true
181+
}
182+
if os.IsNotExist(err) {
183+
return false
184+
}
185+
return false
186+
}

0 commit comments

Comments
 (0)