Skip to content

Commit f844160

Browse files
authored
chore: security improvement (#203)
1 parent 2ae0634 commit f844160

3 files changed

Lines changed: 43 additions & 51 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
test:
1111
strategy:
1212
matrix:
13-
go: [ '1.15.x', '1.16.x', '1.17.x' ]
13+
go: [ '1.15.x', '1.16.x', '1.17.x', '1.18.x' ]
1414
runs-on: ubuntu-latest
1515
steps:
1616
- uses: actions/checkout@master

swagger.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ func CustomWrapHandler(config *Config, handler *webdav.Handler) gin.HandlerFunc
134134
var rexp = regexp.MustCompile(`(.*)(index\.html|doc\.json|favicon-16x16\.png|favicon-32x32\.png|/oauth2-redirect\.html|swagger-ui\.css|swagger-ui\.css\.map|swagger-ui\.js|swagger-ui\.js\.map|swagger-ui-bundle\.js|swagger-ui-bundle\.js\.map|swagger-ui-standalone-preset\.js|swagger-ui-standalone-preset\.js\.map)[\?|.]*`)
135135

136136
return func(c *gin.Context) {
137+
if c.Request.Method != http.MethodGet {
138+
c.AbortWithStatus(http.StatusMethodNotAllowed)
139+
return
140+
}
141+
137142
matches := rexp.FindStringSubmatch(c.Request.RequestURI)
138143

139144
if len(matches) != 3 {

swagger_test.go

Lines changed: 37 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ginSwagger
22

33
import (
4+
"net/http"
45
"net/http/httptest"
56
"os"
67
"testing"
@@ -26,43 +27,44 @@ func TestWrapHandler(t *testing.T) {
2627

2728
router.GET("/*any", WrapHandler(swaggerFiles.Handler, URL("https://github.com/swaggo/gin-swagger")))
2829

29-
w1 := performRequest("GET", "/index.html", router)
30-
assert.Equal(t, 200, w1.Code)
30+
assert.Equal(t, http.StatusOK, performRequest("GET", "/index.html", router).Code)
3131
}
3232

3333
func TestWrapCustomHandler(t *testing.T) {
3434
gin.SetMode(gin.TestMode)
3535
router := gin.New()
3636

37-
router.GET("/*any", CustomWrapHandler(&Config{}, swaggerFiles.Handler))
37+
router.Any("/*any", CustomWrapHandler(&Config{}, swaggerFiles.Handler))
3838

39-
w1 := performRequest("GET", "/index.html", router)
40-
assert.Equal(t, 200, w1.Code)
39+
w1 := performRequest(http.MethodGet, "/index.html", router)
40+
assert.Equal(t, http.StatusOK, w1.Code)
4141
assert.Equal(t, w1.Header()["Content-Type"][0], "text/html; charset=utf-8")
4242

43-
w2 := performRequest("GET", "/doc.json", router)
44-
assert.Equal(t, 500, w2.Code)
43+
assert.Equal(t, http.StatusInternalServerError, performRequest(http.MethodGet, "/doc.json", router).Code)
4544

4645
swag.Register(swag.Name, &mockedSwag{})
4746

48-
w2 = performRequest("GET", "/doc.json", router)
49-
assert.Equal(t, 200, w2.Code)
47+
w2 := performRequest(http.MethodGet, "/doc.json", router)
48+
assert.Equal(t, http.StatusOK, w2.Code)
49+
assert.Equal(t, w2.Header()["Content-Type"][0], "application/json; charset=utf-8")
5050

51-
w3 := performRequest("GET", "/favicon-16x16.png", router)
52-
assert.Equal(t, 200, w3.Code)
51+
w3 := performRequest(http.MethodGet, "/favicon-16x16.png", router)
52+
assert.Equal(t, http.StatusOK, w3.Code)
5353
assert.Equal(t, w3.Header()["Content-Type"][0], "image/png")
5454

55-
w4 := performRequest("GET", "/swagger-ui.css", router)
56-
assert.Equal(t, 200, w4.Code)
55+
w4 := performRequest(http.MethodGet, "/swagger-ui.css", router)
56+
assert.Equal(t, http.StatusOK, w4.Code)
5757
assert.Equal(t, w4.Header()["Content-Type"][0], "text/css; charset=utf-8")
5858

59-
w5 := performRequest("GET", "/swagger-ui-bundle.js", router)
60-
assert.Equal(t, 200, w5.Code)
59+
w5 := performRequest(http.MethodGet, "/swagger-ui-bundle.js", router)
60+
assert.Equal(t, http.StatusOK, w5.Code)
6161
assert.Equal(t, w5.Header()["Content-Type"][0], "application/javascript")
6262

63-
w6 := performRequest("GET", "/notfound", router)
64-
assert.Equal(t, 404, w6.Code)
63+
assert.Equal(t, http.StatusNotFound, performRequest(http.MethodGet, "/notfound", router).Code)
6564

65+
assert.Equal(t, http.StatusMethodNotAllowed, performRequest(http.MethodPost, "/index.html", router).Code)
66+
67+
assert.Equal(t, http.StatusMethodNotAllowed, performRequest(http.MethodPut, "/index.html", router).Code)
6668
}
6769

6870
func TestDisablingWrapHandler(t *testing.T) {
@@ -73,33 +75,20 @@ func TestDisablingWrapHandler(t *testing.T) {
7375

7476
router.GET("/simple/*any", DisablingWrapHandler(swaggerFiles.Handler, disablingKey))
7577

76-
w1 := performRequest("GET", "/simple/index.html", router)
77-
assert.Equal(t, 200, w1.Code)
78-
79-
w2 := performRequest("GET", "/simple/doc.json", router)
80-
assert.Equal(t, 200, w2.Code)
81-
82-
w3 := performRequest("GET", "/simple/favicon-16x16.png", router)
83-
assert.Equal(t, 200, w3.Code)
78+
assert.Equal(t, http.StatusOK, performRequest(http.MethodGet, "/simple/index.html", router).Code)
79+
assert.Equal(t, http.StatusOK, performRequest(http.MethodGet, "/simple/doc.json", router).Code)
8480

85-
w4 := performRequest("GET", "/simple/notfound", router)
86-
assert.Equal(t, 404, w4.Code)
81+
assert.Equal(t, http.StatusOK, performRequest(http.MethodGet, "/simple/favicon-16x16.png", router).Code)
82+
assert.Equal(t, http.StatusNotFound, performRequest(http.MethodGet, "/simple/notfound", router).Code)
8783

8884
_ = os.Setenv(disablingKey, "true")
8985

9086
router.GET("/disabling/*any", DisablingWrapHandler(swaggerFiles.Handler, disablingKey))
9187

92-
w11 := performRequest("GET", "/disabling/index.html", router)
93-
assert.Equal(t, 404, w11.Code)
94-
95-
w22 := performRequest("GET", "/disabling/doc.json", router)
96-
assert.Equal(t, 404, w22.Code)
97-
98-
w44 := performRequest("GET", "/disabling/oauth2-redirect.html", router)
99-
assert.Equal(t, 404, w44.Code)
100-
101-
w55 := performRequest("GET", "/disabling/notfound", router)
102-
assert.Equal(t, 404, w55.Code)
88+
assert.Equal(t, 404, performRequest(http.MethodGet, "/disabling/index.html", router).Code)
89+
assert.Equal(t, 404, performRequest(http.MethodGet, "/disabling/doc.json", router).Code)
90+
assert.Equal(t, 404, performRequest(http.MethodGet, "/disabling/oauth2-redirect.html", router).Code)
91+
assert.Equal(t, 404, performRequest(http.MethodGet, "/disabling/notfound", router).Code)
10392
}
10493

10594
func TestDisablingCustomWrapHandler(t *testing.T) {
@@ -110,15 +99,13 @@ func TestDisablingCustomWrapHandler(t *testing.T) {
11099

111100
router.GET("/simple/*any", DisablingCustomWrapHandler(&Config{}, swaggerFiles.Handler, disablingKey))
112101

113-
w1 := performRequest("GET", "/simple/index.html", router)
114-
assert.Equal(t, 200, w1.Code)
102+
assert.Equal(t, http.StatusOK, performRequest(http.MethodGet, "/simple/index.html", router).Code)
115103

116104
_ = os.Setenv(disablingKey, "true")
117105

118106
router.GET("/disabling/*any", DisablingCustomWrapHandler(&Config{}, swaggerFiles.Handler, disablingKey))
119107

120-
w11 := performRequest("GET", "/disabling/index.html", router)
121-
assert.Equal(t, 404, w11.Code)
108+
assert.Equal(t, http.StatusNotFound, performRequest(http.MethodGet, "/disabling/index.html", router).Code)
122109
}
123110

124111
func TestWithGzipMiddleware(t *testing.T) {
@@ -129,20 +116,20 @@ func TestWithGzipMiddleware(t *testing.T) {
129116

130117
router.GET("/*any", WrapHandler(swaggerFiles.Handler))
131118

132-
w1 := performRequest("GET", "/index.html", router)
133-
assert.Equal(t, 200, w1.Code)
119+
w1 := performRequest(http.MethodGet, "/index.html", router)
120+
assert.Equal(t, http.StatusOK, w1.Code)
134121
assert.Equal(t, w1.Header()["Content-Type"][0], "text/html; charset=utf-8")
135122

136-
w2 := performRequest("GET", "/swagger-ui.css", router)
137-
assert.Equal(t, 200, w2.Code)
123+
w2 := performRequest(http.MethodGet, "/swagger-ui.css", router)
124+
assert.Equal(t, http.StatusOK, w2.Code)
138125
assert.Equal(t, w2.Header()["Content-Type"][0], "text/css; charset=utf-8")
139126

140-
w3 := performRequest("GET", "/swagger-ui-bundle.js", router)
141-
assert.Equal(t, 200, w3.Code)
127+
w3 := performRequest(http.MethodGet, "/swagger-ui-bundle.js", router)
128+
assert.Equal(t, http.StatusOK, w3.Code)
142129
assert.Equal(t, w3.Header()["Content-Type"][0], "application/javascript")
143130

144-
w4 := performRequest("GET", "/doc.json", router)
145-
assert.Equal(t, 200, w4.Code)
131+
w4 := performRequest(http.MethodGet, "/doc.json", router)
132+
assert.Equal(t, http.StatusOK, w4.Code)
146133
assert.Equal(t, w4.Header()["Content-Type"][0], "application/json; charset=utf-8")
147134
}
148135

0 commit comments

Comments
 (0)