From ecefa6cdd1e7376046bbec82c1b47f7756fea646 Mon Sep 17 00:00:00 2001 From: Daniel Schalla Date: Mon, 25 Jun 2018 18:12:59 +0200 Subject: Implementation of File Exists Function; Delete FileInfos upon Permanent User Delete (#8958) Check if file was deleted on FS Warning message if file couldnt be removed --- utils/file_backend.go | 1 + utils/file_backend_local.go | 12 ++++++++++++ utils/file_backend_s3.go | 19 +++++++++++++++++++ utils/file_backend_test.go | 17 +++++++++++++++++ 4 files changed, 49 insertions(+) (limited to 'utils') diff --git a/utils/file_backend.go b/utils/file_backend.go index 9ed564592..368e1ba28 100644 --- a/utils/file_backend.go +++ b/utils/file_backend.go @@ -15,6 +15,7 @@ type FileBackend interface { Reader(path string) (io.ReadCloser, *model.AppError) ReadFile(path string) ([]byte, *model.AppError) + FileExists(path string) (bool, *model.AppError) CopyFile(oldPath, newPath string) *model.AppError MoveFile(oldPath, newPath string) *model.AppError WriteFile(fr io.Reader, path string) (int64, *model.AppError) diff --git a/utils/file_backend_local.go b/utils/file_backend_local.go index ec0c657a7..681ab9234 100644 --- a/utils/file_backend_local.go +++ b/utils/file_backend_local.go @@ -49,6 +49,18 @@ func (b *LocalFileBackend) ReadFile(path string) ([]byte, *model.AppError) { } } +func (b *LocalFileBackend) FileExists(path string) (bool, *model.AppError) { + _, err := os.Stat(filepath.Join(b.directory, path)) + + if os.IsNotExist(err) { + return false, nil + } else if err == nil { + return true, nil + } + + return false, model.NewAppError("ReadFile", "api.file.file_exists.exists_local.app_error", nil, err.Error(), http.StatusInternalServerError) +} + func (b *LocalFileBackend) CopyFile(oldPath, newPath string) *model.AppError { if err := CopyFile(filepath.Join(b.directory, oldPath), filepath.Join(b.directory, newPath)); err != nil { return model.NewAppError("copyFile", "api.file.move_file.rename.app_error", nil, err.Error(), http.StatusInternalServerError) diff --git a/utils/file_backend_s3.go b/utils/file_backend_s3.go index a0c46e5d3..dedcb2797 100644 --- a/utils/file_backend_s3.go +++ b/utils/file_backend_s3.go @@ -111,6 +111,25 @@ func (b *S3FileBackend) ReadFile(path string) ([]byte, *model.AppError) { } } +func (b *S3FileBackend) FileExists(path string) (bool, *model.AppError) { + s3Clnt, err := b.s3New() + + if err != nil { + return false, model.NewAppError("FileExists", "api.file.file_exists.s3.app_error", nil, err.Error(), http.StatusInternalServerError) + } + _, err = s3Clnt.StatObject(b.bucket, path, s3.StatObjectOptions{}) + + if err == nil { + return true, nil + } + + if err.(s3.ErrorResponse).Code == "NoSuchKey" { + return false, nil + } + + return false, model.NewAppError("FileExists", "api.file.file_exists.s3.app_error", nil, err.Error(), http.StatusInternalServerError) +} + func (b *S3FileBackend) CopyFile(oldPath, newPath string) *model.AppError { s3Clnt, err := b.s3New() if err != nil { diff --git a/utils/file_backend_test.go b/utils/file_backend_test.go index 7f8265d73..f7ce7ca61 100644 --- a/utils/file_backend_test.go +++ b/utils/file_backend_test.go @@ -124,6 +124,23 @@ func (s *FileBackendTestSuite) TestReadWriteFileImage() { s.EqualValues(readString, "testimage") } +func (s *FileBackendTestSuite) TestFileExists() { + b := []byte("testimage") + path := "tests/" + model.NewId() + ".png" + + _, err := s.backend.WriteFile(bytes.NewReader(b), path) + s.Nil(err) + defer s.backend.RemoveFile(path) + + res, err := s.backend.FileExists(path) + s.Nil(err) + s.True(res) + + res, err = s.backend.FileExists("tests/idontexist.png") + s.Nil(err) + s.False(res) +} + func (s *FileBackendTestSuite) TestCopyFile() { b := []byte("test") path1 := "tests/" + model.NewId() -- cgit v1.2.3-1-g7c22