From 74f86da822da219db894ac7d99e1420791d3886a Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Thu, 30 Jun 2016 14:53:36 -0400 Subject: Revert "Moved file attachments to be stored in data/channels instead of data/teams/ID/channels (#3416)" (#3461) This reverts commit ed75dfc6c090bd247ab9fe2965aed82c552bbc08. --- api/file.go | 37 ++++++++++++++++++------------------- api/file_test.go | 44 +++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/api/file.go b/api/file.go index 048a48882..92bceaa80 100644 --- a/api/file.go +++ b/api/file.go @@ -149,7 +149,7 @@ func uploadFile(c *Context, w http.ResponseWriter, r *http.Request) { } } - path := "channels/" + channelId + "/users/" + c.Session.UserId + "/" + uid + "/" + filename + path := "teams/" + c.TeamId + "/channels/" + channelId + "/users/" + c.Session.UserId + "/" + uid + "/" + filename if err := WriteFile(buf.Bytes(), path); err != nil { c.Err = err @@ -172,7 +172,7 @@ func uploadFile(c *Context, w http.ResponseWriter, r *http.Request) { } func handleImages(filenames []string, fileData [][]byte, teamId, channelId, userId string) { - dest := "channels/" + channelId + "/users/" + userId + "/" + dest := "teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" for i, filename := range filenames { name := filename[:strings.LastIndex(filename, ".")] @@ -318,21 +318,18 @@ func getFileInfo(c *Context, w http.ResponseWriter, r *http.Request) { return } - cchan := Srv.Store.Channel().CheckPermissionsToNoTeam(channelId, c.Session.UserId) + cchan := Srv.Store.Channel().CheckPermissionsTo(c.TeamId, channelId, c.Session.UserId) - path := "channels/" + channelId + "/users/" + userId + "/" + filename + path := "teams/" + c.TeamId + "/channels/" + channelId + "/users/" + userId + "/" + filename var info *model.FileInfo if cached, ok := fileInfoCache.Get(path); ok { info = cached.(*model.FileInfo) } else { - err, bytes := getFileData(c.TeamId, channelId, userId, filename) - if err != nil { - c.Err = err - return - } + fileData := make(chan []byte) + go readFile(path, fileData) - newInfo, err := model.GetInfoForBytes(filename, bytes) + newInfo, err := model.GetInfoForBytes(filename, <-fileData) if err != nil { c.Err = err return @@ -359,7 +356,7 @@ func getFile(c *Context, w http.ResponseWriter, r *http.Request) { userId := params["user_id"] filename := params["filename"] - if !c.HasPermissionsToChannel(Srv.Store.Channel().CheckPermissionsToNoTeam(channelId, userId), "getFile") { + if !c.HasPermissionsToChannel(Srv.Store.Channel().CheckPermissionsTo(teamId, channelId, userId), "getFile") { return } @@ -417,6 +414,10 @@ func getFileData(teamId string, channelId string, userId string, filename string return err, nil } + if len(teamId) != 26 { + return NewInvalidParamError("getFileData", "team_id"), nil + } + if len(channelId) != 26 { return NewInvalidParamError("getFileData", "channel_id"), nil } @@ -429,19 +430,17 @@ func getFileData(teamId string, channelId string, userId string, filename string return NewInvalidParamError("getFileData", "filename"), nil } - path := "channels/" + channelId + "/users/" + userId + "/" + filename + path := "teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + filename - // try using the new path and then fall back to the old one if that doesn't work - if bytes, readErr := ReadFile(path); readErr == nil { - return nil, bytes - } else if bytes, readErr := ReadFile("teams/" + teamId + "/" + path); readErr == nil { - return nil, bytes - } else { - l4g.Error(readErr) + fileChan := make(chan []byte) + go readFile(path, fileChan) + if bytes := <-fileChan; bytes == nil { err := model.NewLocAppError("writeFileResponse", "api.file.get_file.not_found.app_error", nil, "path="+path) err.StatusCode = http.StatusNotFound return err, nil + } else { + return nil, bytes } } diff --git a/api/file_test.go b/api/file_test.go index 5dbb5b9af..fe7355122 100644 --- a/api/file_test.go +++ b/api/file_test.go @@ -23,6 +23,7 @@ import ( func TestUploadFile(t *testing.T) { th := Setup().InitBasic() Client := th.BasicClient + team := th.BasicTeam user := th.BasicUser channel := th.BasicChannel @@ -83,17 +84,17 @@ func TestUploadFile(t *testing.T) { // wait a bit for files to ready time.Sleep(5 * time.Second) - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + filename) + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + filename) if err != nil { t.Fatal(err) } - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg") + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg") if err != nil { t.Fatal(err) } - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg") + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg") if err != nil { t.Fatal(err) } @@ -108,17 +109,17 @@ func TestUploadFile(t *testing.T) { // wait a bit for files to ready time.Sleep(5 * time.Second) - path := utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + filename + path := utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + filename if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg" if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg" if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } @@ -132,6 +133,7 @@ func TestUploadFile(t *testing.T) { func TestGetFile(t *testing.T) { th := Setup().InitBasic() Client := th.BasicClient + team := th.BasicTeam user := th.BasicUser channel := th.BasicChannel @@ -205,17 +207,17 @@ func TestGetFile(t *testing.T) { filename := filenames[len(filenames)-2] + "/" + filenames[len(filenames)-1] fileId := strings.Split(filename, ".")[0] - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + filename) + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + filename) if err != nil { t.Fatal(err) } - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg") + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg") if err != nil { t.Fatal(err) } - err = bucket.Del("channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg") + err = bucket.Del("teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg") if err != nil { t.Fatal(err) } @@ -224,17 +226,17 @@ func TestGetFile(t *testing.T) { filename := filenames[len(filenames)-2] + "/" + filenames[len(filenames)-1] fileId := strings.Split(filename, ".")[0] - path := utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + filename + path := utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + filename if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_thumb.jpg" if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + team.Id + "/channels/" + channel.Id + "/users/" + user.Id + "/" + fileId + "_preview.jpg" if err := os.Remove(path); err != nil { t.Fatal("Couldn't remove file at " + path) } @@ -345,7 +347,7 @@ func TestGetPublicFile(t *testing.T) { t.Fatal("should've failed to get image with public link while not logged in after salt changed") } - if err := cleanupTestFile(filenames[0], channel.Id, th.BasicUser.Id); err != nil { + if err := cleanupTestFile(filenames[0], th.BasicTeam.Id, channel.Id, th.BasicUser.Id); err != nil { t.Fatal("failed to cleanup test file", err) } } @@ -401,7 +403,7 @@ func TestGetPublicLink(t *testing.T) { th.LoginBasic() - if err := cleanupTestFile(filenames[0], channel.Id, th.BasicUser.Id); err != nil { + if err := cleanupTestFile(filenames[0], th.BasicTeam.Id, channel.Id, th.BasicUser.Id); err != nil { t.Fatal("failed to cleanup test file", err) } } @@ -441,7 +443,7 @@ func uploadTestFile(Client *model.Client, channelId string) ([]string, error) { } } -func cleanupTestFile(fullFilename, channelId, userId string) error { +func cleanupTestFile(fullFilename, teamId, channelId, userId string) error { filenames := strings.Split(fullFilename, "/") filename := filenames[len(filenames)-2] + "/" + filenames[len(filenames)-1] fileId := strings.Split(filename, ".")[0] @@ -455,29 +457,29 @@ func cleanupTestFile(fullFilename, channelId, userId string) error { s := s3.New(auth, aws.Regions[utils.Cfg.FileSettings.AmazonS3Region]) bucket := s.Bucket(utils.Cfg.FileSettings.AmazonS3Bucket) - if err := bucket.Del("channels/" + channelId + "/users/" + userId + "/" + filename); err != nil { + if err := bucket.Del("teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + filename); err != nil { return err } - if err := bucket.Del("channels/" + channelId + "/users/" + userId + "/" + fileId + "_thumb.jpg"); err != nil { + if err := bucket.Del("teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + fileId + "_thumb.jpg"); err != nil { return err } - if err := bucket.Del("channels/" + channelId + "/users/" + userId + "/" + fileId + "_preview.jpg"); err != nil { + if err := bucket.Del("teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + fileId + "_preview.jpg"); err != nil { return err } } else { - path := utils.Cfg.FileSettings.Directory + "channels/" + channelId + "/users/" + userId + "/" + filename + path := utils.Cfg.FileSettings.Directory + "teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + filename if err := os.Remove(path); err != nil { return fmt.Errorf("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channelId + "/users/" + userId + "/" + fileId + "_thumb.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + fileId + "_thumb.jpg" if err := os.Remove(path); err != nil { return fmt.Errorf("Couldn't remove file at " + path) } - path = utils.Cfg.FileSettings.Directory + "channels/" + channelId + "/users/" + userId + "/" + fileId + "_preview.jpg" + path = utils.Cfg.FileSettings.Directory + "teams/" + teamId + "/channels/" + channelId + "/users/" + userId + "/" + fileId + "_preview.jpg" if err := os.Remove(path); err != nil { return fmt.Errorf("Couldn't remove file at " + path) } -- cgit v1.2.3-1-g7c22