diff --git a/protonmail/messages.go b/protonmail/messages.go index 8b27642..071bfb2 100644 --- a/protonmail/messages.go +++ b/protonmail/messages.go @@ -471,11 +471,12 @@ func (set *MessagePackageSet) Encrypt(mimeType string, signed *openpgp.Entity) ( }, nil } -func (set *MessagePackageSet) AddCleartext(addr string) error { - set.Addresses[addr] = &MessagePackage{ +func (set *MessagePackageSet) AddCleartext(addr string) (*MessagePackage, error) { + pkg := &MessagePackage{ Type: MessagePackageCleartext, Signature: set.signature, } + set.Addresses[addr] = pkg set.Type |= MessagePackageCleartext if set.BodyKey == "" || set.AttachmentKeys == nil { @@ -487,7 +488,7 @@ func (set *MessagePackageSet) AddCleartext(addr string) error { } } - return nil + return pkg, nil } func serializeEncryptedKey(symKey *packet.EncryptedKey, pub *packet.PublicKey, config *packet.Config) (string, error) { @@ -504,36 +505,37 @@ func serializeEncryptedKey(symKey *packet.EncryptedKey, pub *packet.PublicKey, c return encoded.String(), nil } -func (set *MessagePackageSet) AddInternal(addr string, pub *openpgp.Entity) error { +func (set *MessagePackageSet) AddInternal(addr string, pub *openpgp.Entity) (*MessagePackage, error) { config := &packet.Config{} encKey, ok := encryptionKey(pub, config.Now()) if !ok { - return errors.New("cannot encrypt a message to key id " + strconv.FormatUint(pub.PrimaryKey.KeyId, 16) + " because it has no encryption keys") + return nil, errors.New("cannot encrypt a message to key id " + strconv.FormatUint(pub.PrimaryKey.KeyId, 16) + " because it has no encryption keys") } bodyKey, err := serializeEncryptedKey(set.bodyKey, encKey.PublicKey, config) if err != nil { - return err + return nil, err } attachmentKeys := make(map[string]string, len(set.attachmentKeys)) for att, key := range set.attachmentKeys { attKey, err := serializeEncryptedKey(key, encKey.PublicKey, config) if err != nil { - return err + return nil, err } attachmentKeys[att] = attKey } set.Type |= MessagePackageInternal - set.Addresses[addr] = &MessagePackage{ + pkg := &MessagePackage{ Type: MessagePackageInternal, BodyKeyPacket: bodyKey, AttachmentKeyPackets: attachmentKeys, Signature: set.signature, } - return nil + set.Addresses[addr] = pkg + return pkg, nil } type OutgoingMessage struct { diff --git a/smtp/smtp.go b/smtp/smtp.go index d794903..b97120b 100644 --- a/smtp/smtp.go +++ b/smtp/smtp.go @@ -269,9 +269,14 @@ func (u *user) Send(from string, to []string, r io.Reader) error { } for _, rcpt := range plaintextRecipients { - if err := plaintextSet.AddCleartext(rcpt); err != nil { + pkg, err := plaintextSet.AddCleartext(rcpt) + if err != nil { return err } + + // Don't sign plaintext messages by default + // TODO: send inline singnature to opt-in contacts + pkg.Signature = 0 } outgoing.Packages = append(outgoing.Packages, plaintextSet) @@ -293,7 +298,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { } for rcpt, pub := range encryptedRecipients { - if err := encryptedSet.AddInternal(rcpt, pub); err != nil { + if _, err := encryptedSet.AddInternal(rcpt, pub); err != nil { return err } }