Deleting posts with files now renames the file so that public links to those files no longer work
Этот коммит содержится в:
35
api/file.go
35
api/file.go
@@ -547,6 +547,41 @@ func writeFile(f []byte, path string) *model.AppError {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func moveFile(oldPath, newPath string) *model.AppError {
|
||||||
|
if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 {
|
||||||
|
fileData := make(chan []byte)
|
||||||
|
getFileAndForget(oldPath, fileData)
|
||||||
|
fileBytes := <-fileData
|
||||||
|
|
||||||
|
if fileBytes == nil {
|
||||||
|
return model.NewLocAppError("moveFile", "api.file.move_file.get_from_s3.app_error", nil, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
var auth aws.Auth
|
||||||
|
auth.AccessKey = utils.Cfg.FileSettings.AmazonS3AccessKeyId
|
||||||
|
auth.SecretKey = utils.Cfg.FileSettings.AmazonS3SecretAccessKey
|
||||||
|
|
||||||
|
s := s3.New(auth, awsRegion())
|
||||||
|
bucket := s.Bucket(utils.Cfg.FileSettings.AmazonS3Bucket)
|
||||||
|
|
||||||
|
if err := bucket.Del(oldPath); err != nil {
|
||||||
|
return model.NewLocAppError("moveFile", "api.file.move_file.delete_from_s3.app_error", nil, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := writeFile(fileBytes, newPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL {
|
||||||
|
if err := os.Rename(utils.Cfg.FileSettings.Directory+oldPath, utils.Cfg.FileSettings.Directory+newPath); err != nil {
|
||||||
|
return model.NewLocAppError("moveFile", "api.file.move_file.rename.app_error", nil, err.Error())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return model.NewLocAppError("moveFile", "api.file.move_file.configured.app_error", nil, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func writeFileLocally(f []byte, path string) *model.AppError {
|
func writeFileLocally(f []byte, path string) *model.AppError {
|
||||||
if err := os.MkdirAll(filepath.Dir(path), 0774); err != nil {
|
if err := os.MkdirAll(filepath.Dir(path), 0774); err != nil {
|
||||||
return model.NewLocAppError("writeFile", "api.file.write_file_locally.create_dir.app_error", nil, err.Error())
|
return model.NewLocAppError("writeFile", "api.file.write_file_locally.create_dir.app_error", nil, err.Error())
|
||||||
|
|||||||
18
api/post.go
18
api/post.go
@@ -1094,6 +1094,7 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
message.Add("post", post.ToJson())
|
message.Add("post", post.ToJson())
|
||||||
|
|
||||||
PublishAndForget(message)
|
PublishAndForget(message)
|
||||||
|
DeletePostFilesAndForget(c.Session.TeamId, post)
|
||||||
|
|
||||||
result := make(map[string]string)
|
result := make(map[string]string)
|
||||||
result["id"] = postId
|
result["id"] = postId
|
||||||
@@ -1101,6 +1102,23 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeletePostFilesAndForget(teamId string, post *model.Post) {
|
||||||
|
go func() {
|
||||||
|
if len(post.Filenames) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := "teams/" + teamId + "/channels/" + post.ChannelId + "/users/" + post.UserId + "/"
|
||||||
|
for _, filename := range post.Filenames {
|
||||||
|
splitUrl := strings.Split(filename, "/")
|
||||||
|
oldPath := prefix + splitUrl[len(splitUrl)-2] + "/" + splitUrl[len(splitUrl)-1]
|
||||||
|
newPath := prefix + splitUrl[len(splitUrl)-2] + "/deleted_" + splitUrl[len(splitUrl)-1]
|
||||||
|
moveFile(oldPath, newPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
func getPostsBefore(c *Context, w http.ResponseWriter, r *http.Request) {
|
func getPostsBefore(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||||
getPostsBeforeOrAfter(c, w, r, true)
|
getPostsBeforeOrAfter(c, w, r, true)
|
||||||
}
|
}
|
||||||
|
|||||||
20
i18n/en.json
20
i18n/en.json
@@ -456,8 +456,24 @@
|
|||||||
"translation": "S3 is not supported for local storage export."
|
"translation": "S3 is not supported for local storage export."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "api.export.write_file.app_error",
|
"id": "api.file.move_file.get_from_s3.app_error",
|
||||||
"translation": "Unable to write to export file"
|
"translation": "Unable to get file from S3."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "api.file.move_file.delete_from_s3.app_error",
|
||||||
|
"translation": "Unable to delete file from S3."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "api.file.move_file.rename.app_error",
|
||||||
|
"translation": "Unable to move file locally."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "api.file.move_file.configured.app_error",
|
||||||
|
"translation": "File storage not configured properly. Please configure for either S3 or local server file storage."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "api.file.file_upload.exceeds",
|
||||||
|
"translation": "File exceeds max image size."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "api.file.file_upload.exceeds",
|
"id": "api.file.file_upload.exceeds",
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user