From fb55d3bd8bd8251bdc8ceafb8d4b0fa90cf2f014 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Wed, 8 Nov 2023 11:43:05 +0100 Subject: [PATCH] feat(GODT-3048): Add X-PM-ENCRYPT-UNTRUSTED to vcard parser --- contact_card.go | 9 +++++---- contact_test.go | 2 ++ contact_types.go | 45 ++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/contact_card.go b/contact_card.go index 2b3c6a1..16ae99d 100644 --- a/contact_card.go +++ b/contact_card.go @@ -11,10 +11,11 @@ import ( ) const ( - FieldPMScheme = "X-PM-SCHEME" - FieldPMSign = "X-PM-SIGN" - FieldPMEncrypt = "X-PM-ENCRYPT" - FieldPMMIMEType = "X-PM-MIMETYPE" + FieldPMScheme = "X-PM-SCHEME" + FieldPMSign = "X-PM-SIGN" + FieldPMEncrypt = "X-PM-ENCRYPT" + FieldPMEncryptUntrusted = "X-PM-ENCRYPT-UNTRUSTED" + FieldPMMIMEType = "X-PM-MIMETYPE" ) type Cards []*Card diff --git a/contact_test.go b/contact_test.go index 6648f74..6c5a055 100644 --- a/contact_test.go +++ b/contact_test.go @@ -49,6 +49,7 @@ func TestContactSettings(t *testing.T) { settings.SetScheme(proton.PGPInlineScheme) settings.SetSign(true) settings.SetEncrypt(true) + settings.SetEncryptUntrusted(true) settings.AddKey(key) err = contact.SetSettings(nil, "user@user", proton.CardTypeClear, settings) @@ -61,6 +62,7 @@ func TestContactSettings(t *testing.T) { require.Equal(t, *settings.Scheme, proton.PGPInlineScheme) require.Equal(t, *settings.Sign, true) require.Equal(t, *settings.Encrypt, true) + require.Equal(t, *settings.EncryptUntrusted, true) require.Equal(t, len(settings.Keys), 1) kr, err := crypto.NewKeyRing(settings.Keys[0]) require.NoError(t, err) diff --git a/contact_types.go b/contact_types.go index d857fd5..446e3bc 100644 --- a/contact_types.go +++ b/contact_types.go @@ -19,11 +19,12 @@ const ( ) type ContactSettings struct { - MIMEType *rfc822.MIMEType - Scheme *EncryptionScheme - Sign *bool - Encrypt *bool - Keys []*crypto.Key + MIMEType *rfc822.MIMEType + Scheme *EncryptionScheme + Sign *bool + Encrypt *bool + EncryptUntrusted *bool + Keys []*crypto.Key } type Contact struct { @@ -59,6 +60,13 @@ func (cs *ContactSettings) SetEncrypt(enabled bool) { *cs.Encrypt = enabled } +func (cs *ContactSettings) SetEncryptUntrusted(enabled bool) { + if cs.EncryptUntrusted == nil { + cs.EncryptUntrusted = new(bool) + } + *cs.EncryptUntrusted = enabled +} + func (cs *ContactSettings) AddKey(key *crypto.Key) { cs.Keys = append(cs.Keys, key) } @@ -128,6 +136,20 @@ func (c *Contact) GetSettings(kr *crypto.KeyRing, email string, cardType CardTyp settings.Encrypt = newPtr(encrypt) } + encryptUntrusted, err := group.Get(FieldPMEncryptUntrusted) + if err != nil { + return ContactSettings{}, err + } + + if len(encryptUntrusted) > 0 { + b, err := strconv.ParseBool(encryptUntrusted[0]) + if err != nil { + return ContactSettings{}, err + } + + settings.EncryptUntrusted = newPtr(b) + } + keys, err := group.Get(vcard.FieldKey) if err != nil { return ContactSettings{}, err @@ -227,6 +249,19 @@ func (c *Contact) SetSettings(kr *crypto.KeyRing, email string, cardType CardTyp } } + // X-PM-ENCRYPT-UNTRUSTED: + if settings.EncryptUntrusted != nil { + if *settings.EncryptUntrusted { + if err := group.Set(FieldPMEncryptUntrusted, "true", vcard.Params{}); err != nil { + return err + } + } else { + if err := group.Set(FieldPMEncryptUntrusted, "false", vcard.Params{}); err != nil { + return err + } + } + } + // KEY if settings.Keys != nil && len(settings.Keys) > 0 { var keys = ""