1
0

GODT-2177: Use correct attachment disposition when content ID is set

This commit is contained in:
James Houlahan
2023-01-24 16:09:01 +01:00
parent f1404cd3ee
commit 60b1c4d8f7
3 changed files with 25 additions and 12 deletions

View File

@ -385,22 +385,32 @@ func createAttachments(
"mime-type": att.MIMEType, "mime-type": att.MIMEType,
}).Debug("Uploading attachment") }).Debug("Uploading attachment")
// Some client might have leave empty the content disposition or use unsupported values. switch att.Disposition {
if att.Disposition != string(proton.InlineDisposition) && att.Disposition != string(proton.AttachmentDisposition) { case proton.InlineDisposition:
att.Disposition = string(proton.AttachmentDisposition) // Some clients use inline disposition but don't set a content ID. Our API doesn't support this.
} // We could generate our own content ID, but for simplicity, we just set the disposition to attachment.
if att.ContentID == "" {
att.Disposition = proton.AttachmentDisposition
}
// Some clients use inline disposition but don't set a content ID. Our API doesn't support this. case proton.AttachmentDisposition:
// We could generate our own content ID, but for simplicity, we just set the disposition to attachment. // Nothing to do.
if att.Disposition == string(proton.InlineDisposition) && att.ContentID == "" {
att.Disposition = string(proton.AttachmentDisposition) default:
// Some clients leave the content disposition empty or use unsupported values.
// We default to inline disposition if a content ID is set, and to attachment disposition otherwise.
if att.ContentID != "" {
att.Disposition = proton.InlineDisposition
} else {
att.Disposition = proton.AttachmentDisposition
}
} }
attachment, err := client.UploadAttachment(ctx, addrKR, proton.CreateAttachmentReq{ attachment, err := client.UploadAttachment(ctx, addrKR, proton.CreateAttachmentReq{
Filename: att.Name, Filename: att.Name,
MessageID: draftID, MessageID: draftID,
MIMEType: rfc822.MIMEType(att.MIMEType), MIMEType: rfc822.MIMEType(att.MIMEType),
Disposition: proton.Disposition(att.Disposition), Disposition: att.Disposition,
ContentID: att.ContentID, ContentID: att.ContentID,
Body: att.Data, Body: att.Data,
}) })

View File

@ -66,7 +66,7 @@ type Attachment struct {
Name string Name string
ContentID string ContentID string
MIMEType string MIMEType string
Disposition string Disposition proton.Disposition
Data []byte Data []byte
} }
@ -528,7 +528,7 @@ func parseAttachment(h message.Header, body []byte) (Attachment, error) {
// If not available, try to get it from name param in content type. // If not available, try to get it from name param in content type.
// Otherwise fallback to attachment.bin. // Otherwise fallback to attachment.bin.
if disp, dispParams, err := h.ContentDisposition(); err == nil { if disp, dispParams, err := h.ContentDisposition(); err == nil {
att.Disposition = disp att.Disposition = proton.Disposition(disp)
if filename, ok := dispParams["filename"]; ok { if filename, ok := dispParams["filename"]; ok {
att.Name = filename att.Name = filename

View File

@ -25,6 +25,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/ProtonMail/go-proton-api"
"github.com/ProtonMail/proton-bridge/v3/pkg/message/parser" "github.com/ProtonMail/proton-bridge/v3/pkg/message/parser"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -631,15 +632,17 @@ func TestParseIcsAttachment(t *testing.T) {
assert.Equal(t, m.Attachments[0].MIMEType, "text/calendar") assert.Equal(t, m.Attachments[0].MIMEType, "text/calendar")
assert.Equal(t, m.Attachments[0].Name, "invite.ics") assert.Equal(t, m.Attachments[0].Name, "invite.ics")
assert.Equal(t, m.Attachments[0].ContentID, "") assert.Equal(t, m.Attachments[0].ContentID, "")
assert.Equal(t, m.Attachments[0].Disposition, "attachment") assert.Equal(t, m.Attachments[0].Disposition, proton.Disposition("attachment"))
assert.Equal(t, string(m.Attachments[0].Data), "This is an ics calendar invite") assert.Equal(t, string(m.Attachments[0].Data), "This is an ics calendar invite")
} }
func TestParsePanic(t *testing.T) { func TestParsePanic(t *testing.T) {
var err error var err error
require.NotPanics(t, func() { require.NotPanics(t, func() {
_, err = Parse(&panicReader{}) _, err = Parse(&panicReader{})
}) })
require.Error(t, err) require.Error(t, err)
} }