From 2c27d2626e7bf1f41d64ff12cfcc1003551814e5 Mon Sep 17 00:00:00 2001 From: Harshil Sharma <18575143+harshilsharma63@users.noreply.github.com> Date: Thu, 6 Oct 2022 01:46:03 +0530 Subject: [PATCH] Fix bug where workspace era uploaded files won't load on team era codebase (#3907) * WIP * Added comment for explaination * Lint fix * move file if found in channel directory * lint fixes Co-authored-by: Scott Bishel Co-authored-by: Mattermod --- server/api/files.go | 21 ++++++++++++++++++++- server/app/files.go | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/server/api/files.go b/server/api/files.go index e6d2a57af..825ff22f1 100644 --- a/server/api/files.go +++ b/server/api/files.go @@ -2,12 +2,15 @@ package api import ( "encoding/json" + "errors" "io" "net/http" "path/filepath" "strings" "time" + "github.com/mattermost/focalboard/server/app" + "github.com/gorilla/mux" "github.com/mattermost/focalboard/server/model" "github.com/mattermost/focalboard/server/services/audit" @@ -144,10 +147,26 @@ func (a *API) handleServeFile(w http.ResponseWriter, r *http.Request) { } fileReader, err := a.app.GetFileReader(board.TeamID, boardID, filename) - if err != nil { + if err != nil && !errors.Is(err, app.ErrFileNotFound) { a.errorResponse(w, r, err) return } + + if errors.Is(err, app.ErrFileNotFound) && board.ChannelID != "" { + // prior to moving from workspaces to teams, the filepath was constructed from + // workspaceID, which is the channel ID in plugin mode. + // If a file is not found from team ID as we tried above, try looking for it via + // channel ID. + fileReader, err = a.app.GetFileReader(board.ChannelID, boardID, filename) + if err != nil { + a.errorResponse(w, r, err) + return + } + // move file to team location + // nothing to do if there is an error + _ = a.app.MoveFile(board.ChannelID, board.TeamID, boardID, filename) + } + defer fileReader.Close() http.ServeContent(w, r, filename, time.Now(), fileReader) auditRec.Success() diff --git a/server/app/files.go b/server/app/files.go index 5820937e0..081b78e14 100644 --- a/server/app/files.go +++ b/server/app/files.go @@ -17,6 +17,7 @@ import ( const emptyString = "empty" var errEmptyFilename = errors.New("IsFileArchived: empty filename not allowed") +var ErrFileNotFound = errors.New("file not found") func (a *App) SaveFile(reader io.Reader, teamID, rootID, filename string) (string, error) { // NOTE: File extension includes the dot @@ -111,6 +112,8 @@ func (a *App) GetFileReader(teamID, rootID, filename string) (filestore.ReadClos ) } } + } else if !exists { + return nil, ErrFileNotFound } reader, err := a.filesBackend.Reader(filePath) @@ -120,3 +123,18 @@ func (a *App) GetFileReader(teamID, rootID, filename string) (filestore.ReadClos return reader, nil } + +func (a *App) MoveFile(channelID, teamID, boardID, filename string) error { + oldPath := filepath.Join(channelID, boardID, filename) + newPath := filepath.Join(teamID, boardID, filename) + err := a.filesBackend.MoveFile(oldPath, newPath) + if err != nil { + a.logger.Error("ERROR moving file", + mlog.String("old", oldPath), + mlog.String("new", newPath), + mlog.Err(err), + ) + return err + } + return nil +}