forked from Silverfish/proton-bridge
fix(GODT-3048): WKD Policy behavior
Ensure Bridge respects the no encrypt setting on a contact which has a WKD key.
This commit is contained in:
@ -505,12 +505,15 @@ func (s *Service) getRecipients(
|
||||
return proton.SendPreferences{}, fmt.Errorf("failed to get contact settings for %v: %w", recipient, err)
|
||||
}
|
||||
|
||||
s.log.Infof("ContactSettings=%v", contactSettings)
|
||||
|
||||
return buildSendPrefs(contactSettings, settings, pubKeys, draft.MIMEType, recType == proton.RecipientTypeInternal)
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get send preferences: %w", err)
|
||||
}
|
||||
|
||||
s.log.Infof("Settings=%v", prefs)
|
||||
recipients := make(recipients)
|
||||
|
||||
for idx, pref := range prefs {
|
||||
|
||||
@ -34,13 +34,14 @@ const (
|
||||
)
|
||||
|
||||
type contactSettings struct {
|
||||
Email string
|
||||
Keys []string
|
||||
Scheme string
|
||||
Sign bool
|
||||
SignIsSet bool
|
||||
Encrypt bool
|
||||
MIMEType rfc822.MIMEType
|
||||
Email string
|
||||
Keys []string
|
||||
Scheme string
|
||||
Sign bool
|
||||
SignIsSet bool
|
||||
Encrypt bool
|
||||
EncryptUntrusted bool
|
||||
MIMEType rfc822.MIMEType
|
||||
}
|
||||
|
||||
// newContactSettings converts the API settings into our local settings.
|
||||
@ -61,6 +62,12 @@ func newContactSettings(settings proton.ContactSettings) *contactSettings {
|
||||
metadata.Encrypt = *settings.Encrypt
|
||||
}
|
||||
|
||||
if settings.EncryptUntrusted != nil {
|
||||
metadata.EncryptUntrusted = *settings.EncryptUntrusted
|
||||
} else {
|
||||
metadata.EncryptUntrusted = true
|
||||
}
|
||||
|
||||
if settings.Scheme != nil {
|
||||
switch *settings.Scheme { // nolint:exhaustive
|
||||
case proton.PGPMIMEScheme:
|
||||
@ -426,9 +433,12 @@ func (b *sendPrefsBuilder) setExternalPGPSettingsWithWKDKeys(
|
||||
return errors.New("an API key is necessary but wasn't provided")
|
||||
}
|
||||
|
||||
// We always encrypt and sign external mail if WKD keys are present.
|
||||
b.withEncrypt(true)
|
||||
b.withSign(true)
|
||||
b.withEncrypt(vCardData.EncryptUntrusted)
|
||||
if vCardData.EncryptUntrusted {
|
||||
b.withSign(true)
|
||||
} else if vCardData.SignIsSet {
|
||||
b.withSign(vCardData.Sign)
|
||||
}
|
||||
|
||||
// If the contact has a specific Scheme preference, we set it (otherwise we
|
||||
// leave it unset to allow it to be filled in with the default value later).
|
||||
|
||||
@ -110,7 +110,22 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external",
|
||||
|
||||
contactMeta: &contactSettings{},
|
||||
contactMeta: &contactSettings{EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
|
||||
wantEncrypt: true,
|
||||
wantSign: proton.DetachedSignature,
|
||||
wantScheme: proton.PGPMIMEScheme,
|
||||
wantMIMEType: "multipart/mixed",
|
||||
wantPublicKey: testPublicKey,
|
||||
},
|
||||
|
||||
{
|
||||
name: "wkd-external",
|
||||
|
||||
contactMeta: &contactSettings{EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
@ -125,7 +140,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external with contact-specific email format",
|
||||
|
||||
contactMeta: &contactSettings{MIMEType: "text/plain"},
|
||||
contactMeta: &contactSettings{MIMEType: "text/plain", EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
@ -140,7 +155,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external with global pgp-inline scheme",
|
||||
|
||||
contactMeta: &contactSettings{},
|
||||
contactMeta: &contactSettings{EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPInlineScheme, DraftMIMEType: "text/html"},
|
||||
@ -155,7 +170,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external with contact-specific pgp-inline scheme overriding global pgp-mime setting",
|
||||
|
||||
contactMeta: &contactSettings{Scheme: pgpInline},
|
||||
contactMeta: &contactSettings{Scheme: pgpInline, EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
@ -170,7 +185,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external with contact-specific pgp-mime scheme overriding global pgp-inline setting",
|
||||
|
||||
contactMeta: &contactSettings{Scheme: pgpMIME},
|
||||
contactMeta: &contactSettings{Scheme: pgpMIME, EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPInlineScheme, DraftMIMEType: "text/html"},
|
||||
@ -185,7 +200,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
{
|
||||
name: "wkd-external with additional pinned contact public key",
|
||||
|
||||
contactMeta: &contactSettings{Keys: []string{testContactKey}},
|
||||
contactMeta: &contactSettings{Keys: []string{testContactKey}, EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
@ -201,7 +216,7 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
// NOTE: Need to figured out how to test that this calls the frontend to check for user confirmation.
|
||||
name: "wkd-external with additional conflicting contact public key",
|
||||
|
||||
contactMeta: &contactSettings{Keys: []string{testOtherContactKey}},
|
||||
contactMeta: &contactSettings{Keys: []string{testOtherContactKey}, EncryptUntrusted: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
@ -213,6 +228,51 @@ func TestPreferencesBuilder(t *testing.T) {
|
||||
wantPublicKey: testPublicKey,
|
||||
},
|
||||
|
||||
{
|
||||
name: "wkd-external-with-encrypt-and-sign-disabled",
|
||||
|
||||
contactMeta: &contactSettings{EncryptUntrusted: false},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
|
||||
wantEncrypt: false,
|
||||
wantSign: proton.NoSignature,
|
||||
wantScheme: proton.ClearScheme,
|
||||
wantMIMEType: "text/html",
|
||||
wantPublicKey: testPublicKey,
|
||||
},
|
||||
|
||||
{
|
||||
name: "wkd-external-with-encrypt-and-sign-disabled-plain-text",
|
||||
|
||||
contactMeta: &contactSettings{EncryptUntrusted: false},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/plain"},
|
||||
|
||||
wantEncrypt: false,
|
||||
wantSign: proton.NoSignature,
|
||||
wantScheme: proton.ClearScheme,
|
||||
wantMIMEType: "text/plain",
|
||||
wantPublicKey: testPublicKey,
|
||||
},
|
||||
|
||||
{
|
||||
name: "wkd-external-with-encrypt-disabled-sign-enabled",
|
||||
|
||||
contactMeta: &contactSettings{EncryptUntrusted: false, Sign: true, SignIsSet: true},
|
||||
receivedKeys: []proton.PublicKey{{PublicKey: testPublicKey}},
|
||||
isInternal: false,
|
||||
mailSettings: proton.MailSettings{PGPScheme: proton.PGPMIMEScheme, DraftMIMEType: "text/html"},
|
||||
|
||||
wantEncrypt: false,
|
||||
wantSign: proton.DetachedSignature,
|
||||
wantScheme: proton.ClearMIMEScheme,
|
||||
wantMIMEType: "multipart/mixed",
|
||||
wantPublicKey: testPublicKey,
|
||||
},
|
||||
|
||||
{
|
||||
name: "external",
|
||||
|
||||
|
||||
Reference in New Issue
Block a user