From feff2d5886b07090569a1c55c9218735af6bb5cc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 20 Aug 2024 01:00:10 +0300 Subject: [PATCH] bridgev2/matrix: don't delete temp file before async upload completes --- bridgev2/matrix/intent.go | 41 +++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/bridgev2/matrix/intent.go b/bridgev2/matrix/intent.go index 115d7393..daa07ea8 100644 --- a/bridgev2/matrix/intent.go +++ b/bridgev2/matrix/intent.go @@ -291,9 +291,15 @@ func (as *ASIntent) UploadMediaStream( err = fmt.Errorf("failed to create temp file: %w", err) return } + removeAndClose := func(f *os.File) { + _ = f.Close() + _ = os.Remove(f.Name()) + } + startedAsyncUpload := false defer func() { - _ = tempFile.Close() - _ = os.Remove(tempFile.Name()) + if !startedAsyncUpload { + removeAndClose(tempFile) + } }() if roomID != "" { var encrypted bool @@ -320,6 +326,11 @@ func (as *ASIntent) UploadMediaStream( err = fmt.Errorf("failed to open replacement file: %w", err) return } + defer func() { + if !startedAsyncUpload { + removeAndClose(replFile) + } + }() } else { replFile = tempFile _, err = replFile.Seek(0, io.SeekStart) @@ -345,12 +356,34 @@ func (as *ASIntent) UploadMediaStream( err = fmt.Errorf("failed to get temp file info: %w", err) return } - url, err = as.doUploadReq(ctx, file, mautrix.ReqUploadMedia{ + req := mautrix.ReqUploadMedia{ Content: tempFile, ContentLength: info.Size(), ContentType: mimeType, FileName: fileName, - }) + } + if as.Connector.Config.Homeserver.AsyncMedia { + req.DoneCallback = func() { + removeAndClose(replFile) + removeAndClose(tempFile) + } + startedAsyncUpload = true + var resp *mautrix.RespCreateMXC + resp, err = as.Matrix.UploadAsync(ctx, req) + if resp != nil { + url = resp.ContentURI.CUString() + } + } else { + var resp *mautrix.RespMediaUpload + resp, err = as.Matrix.UploadMedia(ctx, req) + if resp != nil { + url = resp.ContentURI.CUString() + } + } + if file != nil { + file.URL = url + url = "" + } return }