diff --git a/api/application.go b/api/application.go index ff64075..736330e 100644 --- a/api/application.go +++ b/api/application.go @@ -329,6 +329,14 @@ func (a *ApplicationAPI) UploadApplicationImage(ctx *gin.Context) { ext := filepath.Ext(file.Filename) + switch ext { + case ".gif", ".png", ".jpg", ".jpeg": + // ok + default: + ctx.AbortWithError(400, errors.New("invalid file extension")) + return + } + name := generateNonExistingImageName(a.ImageDir, func() string { return generateImageName() + ext }) diff --git a/api/application_test.go b/api/application_test.go index c7fe43d..22777eb 100644 --- a/api/application_test.go +++ b/api/application_test.go @@ -398,6 +398,22 @@ func (s *ApplicationSuite) Test_UploadAppImage_WithTextFile_expectBadRequest() { assert.Equal(s.T(), s.ctx.Errors[0].Err, errors.New("file must be an image")) } +func (s *ApplicationSuite) Test_UploadAppImage_WithHtmlFileHavingImageHeader() { + s.db.User(5).App(1) + + cType, buffer, err := upload(map[string]*os.File{"file": mustOpen("../test/assets/image-header-with.html")}) + assert.Nil(s.T(), err) + s.ctx.Request = httptest.NewRequest("POST", "/irrelevant", &buffer) + s.ctx.Request.Header.Set("Content-Type", cType) + test.WithUser(s.ctx, 5) + s.ctx.Params = gin.Params{{Key: "id", Value: "1"}} + + s.a.UploadApplicationImage(s.ctx) + + assert.Equal(s.T(), 400, s.recorder.Code) + assert.Equal(s.T(), s.ctx.Errors[0].Err, errors.New("invalid file extension")) +} + func (s *ApplicationSuite) Test_UploadAppImage_expectNotFound() { s.db.User(5) diff --git a/test/assets/image-header-with.html b/test/assets/image-header-with.html new file mode 100644 index 0000000..4d05a95 Binary files /dev/null and b/test/assets/image-header-with.html differ