Skip to content

Commit 8070dfc

Browse files
committed
refactor(mimeparser): store only one signature fingerprint
Messages are normally not signed with more than one key and in this case we pick an arbitrary signature later anyway.
1 parent 176a89b commit 8070dfc

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

src/mimeparser.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,12 @@ pub(crate) struct MimeMessage {
8787
pub chat_disposition_notification_to: Option<SingleInfo>,
8888
pub decrypting_failed: bool,
8989

90-
/// Set of valid signature fingerprints if a message is an
90+
/// Valid signature fingerprint if a message is an
9191
/// Autocrypt encrypted and signed message.
9292
///
9393
/// If a message is not encrypted or the signature is not valid,
94-
/// this set is empty.
95-
pub signatures: HashSet<Fingerprint>,
94+
/// this is `None`.
95+
pub signature: Option<Fingerprint>,
9696

9797
/// The addresses for which there was a gossip header
9898
/// and their respective gossiped keys.
@@ -589,7 +589,7 @@ impl MimeMessage {
589589
decrypting_failed: mail.is_err(),
590590

591591
// only non-empty if it was a valid autocrypt message
592-
signatures,
592+
signature: signatures.into_iter().last(),
593593
autocrypt_fingerprint,
594594
gossiped_keys,
595595
is_forwarded: false,
@@ -966,7 +966,7 @@ impl MimeMessage {
966966
/// This means the message was both encrypted and signed with a
967967
/// valid signature.
968968
pub fn was_encrypted(&self) -> bool {
969-
!self.signatures.is_empty()
969+
self.signature.is_some()
970970
}
971971

972972
/// Returns whether the email contains a `chat-version` header.

src/receive_imf.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ pub(crate) async fn receive_imf_inner(
642642
// For example, GitHub sends messages from `[email protected]`,
643643
// but uses display name of the user whose action generated the notification
644644
// as the display name.
645-
let fingerprint = mime_parser.signatures.iter().next();
645+
let fingerprint = mime_parser.signature.as_ref();
646646
let (from_id, _from_id_blocked, incoming_origin) = match from_field_to_contact_id(
647647
context,
648648
&mime_parser.from,
@@ -3662,7 +3662,10 @@ async fn has_verified_encryption(
36623662
));
36633663
}
36643664

3665-
let signed_with_verified_key = mimeparser.signatures.contains(&fingerprint);
3665+
let signed_with_verified_key = mimeparser
3666+
.signature
3667+
.as_ref()
3668+
.is_some_and(|signature| *signature == fingerprint);
36663669
if signed_with_verified_key {
36673670
Ok(Verified)
36683671
} else {

src/securejoin.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -623,17 +623,19 @@ fn encrypted_and_signed(
623623
mimeparser: &MimeMessage,
624624
expected_fingerprint: &Fingerprint,
625625
) -> bool {
626-
if !mimeparser.was_encrypted() {
626+
if let Some(signature) = mimeparser.signature.as_ref() {
627+
if signature == expected_fingerprint {
628+
true
629+
} else {
630+
warn!(
631+
context,
632+
"Message does not match expected fingerprint {expected_fingerprint}.",
633+
);
634+
false
635+
}
636+
} else {
627637
warn!(context, "Message not encrypted.",);
628638
false
629-
} else if !mimeparser.signatures.contains(expected_fingerprint) {
630-
warn!(
631-
context,
632-
"Message does not match expected fingerprint {}.", expected_fingerprint,
633-
);
634-
false
635-
} else {
636-
true
637639
}
638640
}
639641

0 commit comments

Comments
 (0)