GODT-2177: Use correct attachment disposition when content ID is set
This commit is contained in:
@ -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,
|
||||||
})
|
})
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user