Skip to content

Commit 67149fb

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 67149fb

File tree

3 files changed

+17
-13
lines changed

3 files changed

+17
-13
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: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -604,17 +604,18 @@ fn encrypted_and_signed(
604604
mimeparser: &MimeMessage,
605605
expected_fingerprint: &Fingerprint,
606606
) -> bool {
607-
if !mimeparser.was_encrypted() {
608-
warn!(context, "Message not encrypted.",);
609-
false
610-
} else if !mimeparser.signatures.contains(expected_fingerprint) {
607+
if mimeparser
608+
.signature
609+
.as_ref()
610+
.is_some_and(|signature| signature == expected_fingerprint)
611+
{
612+
true
613+
} else {
611614
warn!(
612615
context,
613616
"Message does not match expected fingerprint {}.", expected_fingerprint,
614617
);
615618
false
616-
} else {
617-
true
618619
}
619620
}
620621

0 commit comments

Comments
 (0)