Skip to content

Commit 165d785

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 a89b632 commit 165d785

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
@@ -76,12 +76,12 @@ pub(crate) struct MimeMessage {
7676
pub chat_disposition_notification_to: Option<SingleInfo>,
7777
pub decrypting_failed: bool,
7878

79-
/// Set of valid signature fingerprints if a message is an
79+
/// Valid signature fingerprint if a message is an
8080
/// Autocrypt encrypted and signed message.
8181
///
8282
/// If a message is not encrypted or the signature is not valid,
83-
/// this set is empty.
84-
pub signatures: HashSet<Fingerprint>,
83+
/// this is `None`.
84+
pub signature: Option<Fingerprint>,
8585

8686
/// The addresses for which there was a gossip header
8787
/// and their respective gossiped keys.
@@ -571,7 +571,7 @@ impl MimeMessage {
571571
decrypting_failed: mail.is_err(),
572572

573573
// only non-empty if it was a valid autocrypt message
574-
signatures,
574+
signature: signatures.into_iter().next(),
575575
autocrypt_fingerprint,
576576
gossiped_keys,
577577
is_forwarded: false,
@@ -936,7 +936,7 @@ impl MimeMessage {
936936
/// This means the message was both encrypted and signed with a
937937
/// valid signature.
938938
pub fn was_encrypted(&self) -> bool {
939-
!self.signatures.is_empty()
939+
self.signature.is_some()
940940
}
941941

942942
/// 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
@@ -643,7 +643,7 @@ pub(crate) async fn receive_imf_inner(
643643
// For example, GitHub sends messages from `[email protected]`,
644644
// but uses display name of the user whose action generated the notification
645645
// as the display name.
646-
let fingerprint = mime_parser.signatures.iter().next();
646+
let fingerprint = mime_parser.signature.as_ref();
647647
let (from_id, _from_id_blocked, incoming_origin) = match from_field_to_contact_id(
648648
context,
649649
&mime_parser.from,
@@ -3649,7 +3649,10 @@ async fn has_verified_encryption(
36493649
));
36503650
}
36513651

3652-
let signed_with_verified_key = mimeparser.signatures.contains(&fingerprint);
3652+
let signed_with_verified_key = mimeparser
3653+
.signature
3654+
.as_ref()
3655+
.is_some_and(|signature| *signature == fingerprint);
36533656
if signed_with_verified_key {
36543657
Ok(Verified)
36553658
} else {

src/securejoin.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -604,17 +604,19 @@ fn encrypted_and_signed(
604604
mimeparser: &MimeMessage,
605605
expected_fingerprint: &Fingerprint,
606606
) -> bool {
607-
if !mimeparser.was_encrypted() {
607+
if let Some(signature) = mimeparser.signature.as_ref() {
608+
if signature == expected_fingerprint {
609+
true
610+
} else {
611+
warn!(
612+
context,
613+
"Message does not match expected fingerprint {expected_fingerprint}.",
614+
);
615+
false
616+
}
617+
} else {
608618
warn!(context, "Message not encrypted.",);
609619
false
610-
} else if !mimeparser.signatures.contains(expected_fingerprint) {
611-
warn!(
612-
context,
613-
"Message does not match expected fingerprint {}.", expected_fingerprint,
614-
);
615-
false
616-
} else {
617-
true
618620
}
619621
}
620622

0 commit comments

Comments
 (0)