refactor: make MimeMessage.get_header() return Option<&str>

This commit is contained in:
link2xt
2024-05-13 13:45:41 +00:00
parent 2779737c56
commit 5ed91e9f6e
4 changed files with 30 additions and 26 deletions

View File

@@ -556,19 +556,25 @@ impl MimeMessage {
/// Parses avatar action headers. /// Parses avatar action headers.
async fn parse_avatar_headers(&mut self, context: &Context) { async fn parse_avatar_headers(&mut self, context: &Context) {
if let Some(header_value) = self.get_header(HeaderDef::ChatGroupAvatar).cloned() { if let Some(header_value) = self.get_header(HeaderDef::ChatGroupAvatar) {
self.group_avatar = self.avatar_action_from_header(context, header_value).await; self.group_avatar = self
.avatar_action_from_header(context, header_value.to_string())
.await;
} }
if let Some(header_value) = self.get_header(HeaderDef::ChatUserAvatar).cloned() { if let Some(header_value) = self.get_header(HeaderDef::ChatUserAvatar) {
self.user_avatar = self.avatar_action_from_header(context, header_value).await; self.user_avatar = self
.avatar_action_from_header(context, header_value.to_string())
.await;
} }
} }
fn parse_videochat_headers(&mut self) { fn parse_videochat_headers(&mut self) {
if let Some(value) = self.get_header(HeaderDef::ChatContent).cloned() { if let Some(value) = self.get_header(HeaderDef::ChatContent) {
if value == "videochat-invitation" { if value == "videochat-invitation" {
let instance = self.get_header(HeaderDef::ChatWebrtcRoom).cloned(); let instance = self
.get_header(HeaderDef::ChatWebrtcRoom)
.map(|s| s.to_string());
if let Some(part) = self.parts.first_mut() { if let Some(part) = self.parts.first_mut() {
part.typ = Viewtype::VideochatInvitation; part.typ = Viewtype::VideochatInvitation;
part.param part.param
@@ -815,12 +821,14 @@ impl MimeMessage {
.map(|s| s.to_string()) .map(|s| s.to_string())
} }
pub fn get_header(&self, headerdef: HeaderDef) -> Option<&String> { pub fn get_header(&self, headerdef: HeaderDef) -> Option<&str> {
self.headers.get(headerdef.get_headername()) self.headers
.get(headerdef.get_headername())
.map(|s| s.as_str())
} }
/// Returns `Chat-Group-ID` header value if it is a valid group ID. /// Returns `Chat-Group-ID` header value if it is a valid group ID.
pub fn get_chat_group_id(&self) -> Option<&String> { pub fn get_chat_group_id(&self) -> Option<&str> {
self.get_header(HeaderDef::ChatGroupId) self.get_header(HeaderDef::ChatGroupId)
.filter(|s| validate_id(s)) .filter(|s| validate_id(s))
} }

View File

@@ -1373,11 +1373,9 @@ async fn add_parts(
let mime_in_reply_to = mime_parser let mime_in_reply_to = mime_parser
.get_header(HeaderDef::InReplyTo) .get_header(HeaderDef::InReplyTo)
.cloned()
.unwrap_or_default(); .unwrap_or_default();
let mime_references = mime_parser let mime_references = mime_parser
.get_header(HeaderDef::References) .get_header(HeaderDef::References)
.cloned()
.unwrap_or_default(); .unwrap_or_default();
// fine, so far. now, split the message into simple parts usable as "short messages" // fine, so far. now, split the message into simple parts usable as "short messages"
@@ -1437,7 +1435,7 @@ async fn add_parts(
let reaction_str = simplify::remove_footers(part.msg.as_str()); let reaction_str = simplify::remove_footers(part.msg.as_str());
set_msg_reaction( set_msg_reaction(
context, context,
&mime_in_reply_to, mime_in_reply_to,
orig_chat_id.unwrap_or_default(), orig_chat_id.unwrap_or_default(),
from_id, from_id,
sort_timestamp, sort_timestamp,
@@ -2463,7 +2461,7 @@ async fn apply_mailinglist_changes(
fn try_getting_grpid(mime_parser: &MimeMessage) -> Option<String> { fn try_getting_grpid(mime_parser: &MimeMessage) -> Option<String> {
if let Some(optional_field) = mime_parser.get_chat_group_id() { if let Some(optional_field) = mime_parser.get_chat_group_id() {
return Some(optional_field.clone()); return Some(optional_field.to_string());
} }
// Useful for undecipherable messages sent to known group. // Useful for undecipherable messages sent to known group.

View File

@@ -294,7 +294,7 @@ pub(crate) async fn handle_securejoin_handshake(
let join_vg = step.starts_with("vg-"); let join_vg = step.starts_with("vg-");
if !matches!(step.as_str(), "vg-request" | "vc-request") { if !matches!(step, "vg-request" | "vc-request") {
let mut self_found = false; let mut self_found = false;
let self_fingerprint = load_self_public_key(context).await?.fingerprint(); let self_fingerprint = load_self_public_key(context).await?.fingerprint();
for (addr, key) in &mime_message.gossiped_keys { for (addr, key) in &mime_message.gossiped_keys {
@@ -311,7 +311,7 @@ pub(crate) async fn handle_securejoin_handshake(
} }
} }
match step.as_str() { match step {
"vg-request" | "vc-request" => { "vg-request" | "vc-request" => {
/*======================================================= /*=======================================================
==== Alice - the inviter side ==== ==== Alice - the inviter side ====
@@ -487,7 +487,7 @@ pub(crate) async fn handle_securejoin_handshake(
=======================================================*/ =======================================================*/
"vc-contact-confirm" => { "vc-contact-confirm" => {
if let Some(mut bobstate) = BobState::from_db(&context.sql).await? { if let Some(mut bobstate) = BobState::from_db(&context.sql).await? {
if !bobstate.is_msg_expected(context, step.as_str()) { if !bobstate.is_msg_expected(context, step) {
warn!(context, "Unexpected vc-contact-confirm."); warn!(context, "Unexpected vc-contact-confirm.");
return Ok(HandshakeMessage::Ignore); return Ok(HandshakeMessage::Ignore);
} }
@@ -498,9 +498,7 @@ pub(crate) async fn handle_securejoin_handshake(
Ok(HandshakeMessage::Ignore) Ok(HandshakeMessage::Ignore)
} }
"vg-member-added" => { "vg-member-added" => {
let Some(member_added) = mime_message let Some(member_added) = mime_message.get_header(HeaderDef::ChatGroupMemberAdded)
.get_header(HeaderDef::ChatGroupMemberAdded)
.map(|s| s.as_str())
else { else {
warn!( warn!(
context, context,
@@ -516,7 +514,7 @@ pub(crate) async fn handle_securejoin_handshake(
return Ok(HandshakeMessage::Propagate); return Ok(HandshakeMessage::Propagate);
} }
if let Some(mut bobstate) = BobState::from_db(&context.sql).await? { if let Some(mut bobstate) = BobState::from_db(&context.sql).await? {
if !bobstate.is_msg_expected(context, step.as_str()) { if !bobstate.is_msg_expected(context, step) {
warn!(context, "Unexpected vg-member-added."); warn!(context, "Unexpected vg-member-added.");
return Ok(HandshakeMessage::Propagate); return Ok(HandshakeMessage::Propagate);
} }
@@ -571,7 +569,7 @@ pub(crate) async fn observe_securejoin_on_other_device(
info!(context, "Observing secure-join message {step:?}."); info!(context, "Observing secure-join message {step:?}.");
if !matches!( if !matches!(
step.as_str(), step,
"vg-request-with-auth" | "vc-request-with-auth" | "vg-member-added" | "vc-contact-confirm" "vg-request-with-auth" | "vc-request-with-auth" | "vg-member-added" | "vc-contact-confirm"
) { ) {
return Ok(HandshakeMessage::Ignore); return Ok(HandshakeMessage::Ignore);
@@ -642,21 +640,21 @@ pub(crate) async fn observe_securejoin_on_other_device(
ChatId::set_protection_for_contact(context, contact_id, mime_message.timestamp_sent).await?; ChatId::set_protection_for_contact(context, contact_id, mime_message.timestamp_sent).await?;
if step.as_str() == "vg-member-added" { if step == "vg-member-added" {
inviter_progress(context, contact_id, 800); inviter_progress(context, contact_id, 800);
} }
if step.as_str() == "vg-member-added" || step.as_str() == "vc-contact-confirm" { if step == "vg-member-added" || step == "vc-contact-confirm" {
inviter_progress(context, contact_id, 1000); inviter_progress(context, contact_id, 1000);
} }
if step.as_str() == "vg-request-with-auth" || step.as_str() == "vc-request-with-auth" { if step == "vg-request-with-auth" || step == "vc-request-with-auth" {
// This actually reflects what happens on the first device (which does the secure // This actually reflects what happens on the first device (which does the secure
// join) and causes a subsequent "vg-member-added" message to create an unblocked // join) and causes a subsequent "vg-member-added" message to create an unblocked
// verified group. // verified group.
ChatId::create_for_contact_with_blocked(context, contact_id, Blocked::Not).await?; ChatId::create_for_contact_with_blocked(context, contact_id, Blocked::Not).await?;
} }
if step.as_str() == "vg-member-added" { if step == "vg-member-added" {
Ok(HandshakeMessage::Propagate) Ok(HandshakeMessage::Propagate)
} else { } else {
Ok(HandshakeMessage::Ignore) Ok(HandshakeMessage::Ignore)

View File

@@ -261,7 +261,7 @@ impl BobState {
return Ok(None); return Ok(None);
} }
}; };
if !self.is_msg_expected(context, step.as_str()) { if !self.is_msg_expected(context, step) {
info!(context, "{} message out of sync for BobState", step); info!(context, "{} message out of sync for BobState", step);
return Ok(None); return Ok(None);
} }