From 4866fa18bd533621d5bf028cc1d6930a7e643ccc Mon Sep 17 00:00:00 2001 From: Hocuri Date: Fri, 14 Aug 2026 13:59:08 +0200 Subject: [PATCH] --wip-- [skip ci] --- src/automatic_relay_management.rs | 12 ++++++ src/mimefactory.rs | 65 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/automatic_relay_management.rs b/src/automatic_relay_management.rs index 542a4da77..d34c30662 100644 --- a/src/automatic_relay_management.rs +++ b/src/automatic_relay_management.rs @@ -174,5 +174,17 @@ pub(crate) fn login_param_from_host(host: &str) -> EnteredLoginParam { } } +pub(crate) async fn send_key_update_messages(context: &Context) -> Result<()> { + let contacts_to_update: Vec = contacts_to_update(context).await?; + + let chunks = contacts_to_update.chunks(20); + + for chunk in chunks { + send_key_update_message(context, chunk).await?; + } + + Ok(()) +} + #[cfg(test)] mod automatic_relay_management_tests; diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 3f987ee98..e9b413e13 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -2511,6 +2511,71 @@ pub(crate) async fn render_symm_encrypted_securejoin_message( Ok(rendered_mail.message) } +pub(crate) async fn render_key_update_message( + context: &Context, + rfc724_mid: &str, +) -> Result { + let message: MimePart<'static> = MimePart::new("text/plain", "Secure-Join"); + + let mut headers = Vec::<(&'static str, HeaderType<'static>)>::new(); + + let to: Vec> = vec![hidden_recipients()]; + headers.push(( + "To", + mail_builder::headers::address::Address::new_list(to.clone()).into(), + )); + + let timestamp = time(); + let date = chrono::DateTime::::from_timestamp(timestamp, 0) + .unwrap() + .to_rfc2822(); + headers.push(("Date", mail_builder::headers::raw::Raw::new(date).into())); + + // Automatic Response headers + if context.get_config_bool(Config::Bot).await? { + headers.push(( + "Auto-Submitted", + mail_builder::headers::raw::Raw::new("auto-generated".to_string()).into(), + )); + } + + let message = add_headers_to_encrypted_part(message, headers); + + // No need to sign; key updates are applied from whatever message. + let should_sign = false; + let should_attach_pubkey = true; + let should_compress = true; + + let raw_message = part_to_bytes(message); + + let encryption = todo!(); + + let queued_mail = QueuedMail { + raw_message, + display_name: String::new(), + rfc724_mid: rfc724_mid.to_string(), + encryption, + should_attach_pubkey, + should_sign, + should_compress, + }; + + let public_key = key::load_self_public_key(context).await?; + let secret_key = key::load_self_secret_key(context).await?; + let side_effects = RenderSideEffects::default(); + + let from_addr = context.get_primary_self_addr().await?; + let rendered_mail = render_queued_mail( + queued_mail, + &public_key, + &secret_key, + from_addr, + side_effects, + )?; + + Ok(rendered_mail.message) +} + /// Renders MIME part into a vector of bytes. pub(crate) fn part_to_bytes(message: MimePart<'static>) -> Vec { let mut raw_message = Vec::new();