From 86c18fb3ae6bb629b590087bd07f64ae3f8dba79 Mon Sep 17 00:00:00 2001 From: Floris Bruynooghe Date: Tue, 4 Apr 2023 18:11:45 +0200 Subject: [PATCH 001/528] ref: More logging for ongoing and get_backup (#4289) This adds a few log items for imex::transfer::get_backup and the ongoing process to give some more insights. IO is now also paused after the ongoing process is allocated in get_backup to avoid needlessly pausing IO. --- src/context.rs | 13 +++++++++---- src/imex/transfer.rs | 10 +++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/context.rs b/src/context.rs index a9bbd01ad..cfa026d67 100644 --- a/src/context.rs +++ b/src/context.rs @@ -260,7 +260,7 @@ enum RunningState { Running { cancel_sender: Sender<()> }, /// Cancel signal has been sent, waiting for ongoing process to be freed. - ShallStop, + ShallStop { request: Instant }, /// There is no ongoing process, a new one can be allocated. Stopped, @@ -530,6 +530,9 @@ impl Context { pub(crate) async fn free_ongoing(&self) { let mut s = self.running_state.write().await; + if let RunningState::ShallStop { request } = *s { + info!(self, "Ongoing stopped in {:?}", request.elapsed()); + } *s = RunningState::Stopped; } @@ -542,9 +545,11 @@ impl Context { warn!(self, "could not cancel ongoing: {:#}", err); } info!(self, "Signaling the ongoing process to stop ASAP.",); - *s = RunningState::ShallStop; + *s = RunningState::ShallStop { + request: Instant::now(), + }; } - RunningState::ShallStop | RunningState::Stopped => { + RunningState::ShallStop { .. } | RunningState::Stopped => { info!(self, "No ongoing process to stop.",); } } @@ -554,7 +559,7 @@ impl Context { pub(crate) async fn shall_stop_ongoing(&self) -> bool { match &*self.running_state.read().await { RunningState::Running { .. } => false, - RunningState::ShallStop | RunningState::Stopped => true, + RunningState::ShallStop { .. } | RunningState::Stopped => true, } } diff --git a/src/imex/transfer.rs b/src/imex/transfer.rs index f4d693922..174e83519 100644 --- a/src/imex/transfer.rs +++ b/src/imex/transfer.rs @@ -50,7 +50,7 @@ use crate::blob::BlobDirContents; use crate::chat::{add_device_msg, delete_and_reset_all_device_msgs}; use crate::context::Context; use crate::message::{Message, Viewtype}; -use crate::qr::Qr; +use crate::qr::{self, Qr}; use crate::stock_str::backup_transfer_msg_body; use crate::{e2ee, EventType}; @@ -393,10 +393,14 @@ pub async fn get_backup(context: &Context, qr: Qr) -> Result<()> { !context.is_configured().await?, "Cannot import backups to accounts in use." ); - let _guard = context.scheduler.pause(context.clone()).await; - // Acquire global "ongoing" mutex. let cancel_token = context.alloc_ongoing().await?; + let _guard = context.scheduler.pause(context.clone()).await; + info!( + context, + "Running get_backup for {}", + qr::format_backup(&qr)? + ); let res = tokio::select! { biased; res = get_backup_inner(context, qr) => res, From 350509d5d1474e3bda0bf61a00f7fdbb2f115780 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Tue, 14 Feb 2023 13:02:57 -0300 Subject: [PATCH 002/528] Remove metadata from avatars and JPEG images before sending (#4027) If there's an Exif, rewrite the file to remove it. This implies recoding now though. --- CHANGELOG.md | 1 + src/blob.rs | 173 ++++++++++++++++++---------- test-data/image/avatar1000x1000.jpg | Bin 34841 -> 35027 bytes 3 files changed, 110 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21a540326..ea7183b93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ - Run `cargo-deny` in CI. #4101 - Check provider database with CI. #4099 - Switch to DEFERRED transactions #4100 +- Remove metadata from avatars and JPEG images before sending #4037 ### Fixes - Do not block async task executor while decrypting the messages. #4079 diff --git a/src/blob.rs b/src/blob.rs index c7a3641d2..0275149f4 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -371,7 +371,8 @@ impl<'a> BlobObject<'a> { ) -> Result> { tokio::task::block_in_place(move || { let mut img = image::open(&blob_abs).context("image recode failure")?; - let orientation = self.get_exif_orientation(context); + let exif = self.get_exif().ok(); + let orientation = exif.as_ref().map(|exif| exif_orientation(exif, context)); let mut encoded = Vec::new(); let mut changed_name = None; @@ -379,53 +380,55 @@ impl<'a> BlobObject<'a> { let do_scale = exceeds_width || encoded_img_exceeds_bytes(context, &img, max_bytes, &mut encoded)?; - let do_rotate = matches!(orientation, Ok(90) | Ok(180) | Ok(270)); + let do_rotate = matches!(orientation, Some(90) | Some(180) | Some(270)); - if do_scale || do_rotate { - if do_rotate { - img = match orientation { - Ok(90) => img.rotate90(), - Ok(180) => img.rotate180(), - Ok(270) => img.rotate270(), - _ => img, - } + if do_rotate { + img = match orientation { + Some(90) => img.rotate90(), + Some(180) => img.rotate180(), + Some(270) => img.rotate270(), + _ => img, + } + } + + if do_scale { + if !exceeds_width { + // The image is already smaller than img_wh, but exceeds max_bytes + // We can directly start with trying to scale down to 2/3 of its current width + img_wh = max(img.width(), img.height()) * 2 / 3 } - if do_scale { - if !exceeds_width { - // The image is already smaller than img_wh, but exceeds max_bytes - // We can directly start with trying to scale down to 2/3 of its current width - img_wh = max(img.width(), img.height()) * 2 / 3 - } + loop { + let new_img = img.thumbnail(img_wh, img_wh); - loop { - let new_img = img.thumbnail(img_wh, img_wh); - - if encoded_img_exceeds_bytes(context, &new_img, max_bytes, &mut encoded)? { - if img_wh < 20 { - return Err(format_err!( - "Failed to scale image to below {}B", - max_bytes.unwrap_or_default() - )); - } - - img_wh = img_wh * 2 / 3; - } else { - if encoded.is_empty() { - encode_img(&new_img, &mut encoded)?; - } - - info!( - context, - "Final scaled-down image size: {}B ({}px).", - encoded.len(), - img_wh - ); - break; + if encoded_img_exceeds_bytes(context, &new_img, max_bytes, &mut encoded)? { + if img_wh < 20 { + return Err(format_err!( + "Failed to scale image to below {}B.", + max_bytes.unwrap_or_default() + )); } + + img_wh = img_wh * 2 / 3; + } else { + if encoded.is_empty() { + encode_img(&new_img, &mut encoded)?; + } + + info!( + context, + "Final scaled-down image size: {}B ({}px).", + encoded.len(), + img_wh + ); + break; } } + } + // We also need to rewrite the file to remove metadata such as location, camera model, + // etc. if any + if do_rotate || do_scale || exif.is_some() { // The file format is JPEG now, we may have to change the file extension if !matches!(ImageFormat::from_path(&blob_abs), Ok(ImageFormat::Jpeg)) { blob_abs = blob_abs.with_extension("jpg"); @@ -446,25 +449,28 @@ impl<'a> BlobObject<'a> { }) } - pub fn get_exif_orientation(&self, context: &Context) -> Result { + pub fn get_exif(&self) -> Result { let file = std::fs::File::open(self.to_abs_path())?; let mut bufreader = std::io::BufReader::new(&file); let exifreader = exif::Reader::new(); - let exif = exifreader.read_from_container(&mut bufreader)?; - if let Some(orientation) = exif.get_field(exif::Tag::Orientation, exif::In::PRIMARY) { - // possible orientation values are described at http://sylvana.net/jpegcrop/exif_orientation.html - // we only use rotation, in practise, flipping is not used. - match orientation.value.get_uint(0) { - Some(3) => return Ok(180), - Some(6) => return Ok(90), - Some(8) => return Ok(270), - other => warn!(context, "Exif orientation value ignored: {other:?}."), - } - } - Ok(0) + Ok(exifreader.read_from_container(&mut bufreader)?) } } +fn exif_orientation(exif: &exif::Exif, context: &Context) -> i32 { + if let Some(orientation) = exif.get_field(exif::Tag::Orientation, exif::In::PRIMARY) { + // possible orientation values are described at http://sylvana.net/jpegcrop/exif_orientation.html + // we only use rotation, in practise, flipping is not used. + match orientation.value.get_uint(0) { + Some(3) => return 180, + Some(6) => return 90, + Some(8) => return 270, + other => warn!(context, "Exif orientation value ignored: {other:?}."), + } + } + 0 +} + impl<'a> fmt::Display for BlobObject<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "$BLOBDIR/{}", self.name) @@ -880,12 +886,22 @@ mod tests { async fn test_recode_image_1() { let bytes = include_bytes!("../test-data/image/avatar1000x1000.jpg"); // BALANCED_IMAGE_SIZE > 1000, the original image size, so the image is not scaled down: - send_image_check_mediaquality(Some("0"), bytes, 1000, 1000, 0, 1000, 1000) - .await - .unwrap(); + send_image_check_mediaquality( + Some("0"), + bytes, + true, // has Exif + 1000, + 1000, + 0, + 1000, + 1000, + ) + .await + .unwrap(); send_image_check_mediaquality( Some("1"), bytes, + true, // has Exif 1000, 1000, 0, @@ -903,6 +919,7 @@ mod tests { let img_rotated = send_image_check_mediaquality( Some("0"), bytes, + true, // has Exif 2000, 1800, 270, @@ -926,6 +943,7 @@ mod tests { let img_rotated = send_image_check_mediaquality( Some("0"), &bytes2, + false, // no Exif BALANCED_IMAGE_SIZE * 1800 / 2000, BALANCED_IMAGE_SIZE, 0, @@ -940,6 +958,7 @@ mod tests { let img_rotated = send_image_check_mediaquality( Some("1"), &bytes, + false, // no Exif BALANCED_IMAGE_SIZE * 1800 / 2000, BALANCED_IMAGE_SIZE, 0, @@ -956,15 +975,33 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_recode_image_3() { let bytes = include_bytes!("../test-data/image/rectangle200x180-rotated.jpg"); - let img_rotated = send_image_check_mediaquality(Some("0"), bytes, 200, 180, 270, 180, 200) - .await - .unwrap(); + let img_rotated = send_image_check_mediaquality( + Some("0"), + bytes, + true, // has Exif + 200, + 180, + 270, + 180, + 200, + ) + .await + .unwrap(); assert_correct_rotation(&img_rotated); let bytes = include_bytes!("../test-data/image/rectangle200x180-rotated.jpg"); - let img_rotated = send_image_check_mediaquality(Some("1"), bytes, 200, 180, 270, 180, 200) - .await - .unwrap(); + let img_rotated = send_image_check_mediaquality( + Some("1"), + bytes, + true, // has Exif + 200, + 180, + 270, + 180, + 200, + ) + .await + .unwrap(); assert_correct_rotation(&img_rotated); } @@ -985,9 +1022,11 @@ mod tests { assert_eq!(luma, 0); } + #[allow(clippy::too_many_arguments)] async fn send_image_check_mediaquality( media_quality_config: Option<&str>, bytes: &[u8], + has_exif: bool, original_width: u32, original_height: u32, orientation: i32, @@ -1007,7 +1046,13 @@ mod tests { check_image_size(&file, original_width, original_height); let blob = BlobObject::new_from_path(&alice, &file).await?; - assert_eq!(blob.get_exif_orientation(&alice).unwrap_or(0), orientation); + let exif = blob.get_exif(); + if has_exif { + let exif = exif.unwrap(); + assert_eq!(exif_orientation(&exif, &alice), orientation); + } else { + assert!(exif.is_err()); + } let mut msg = Message::new(Viewtype::Image); msg.set_file(file.to_str().unwrap(), None); @@ -1028,7 +1073,7 @@ mod tests { let file = bob_msg.get_file(&bob).unwrap(); let blob = BlobObject::new_from_path(&bob, &file).await?; - assert_eq!(blob.get_exif_orientation(&bob).unwrap_or(0), 0); + assert!(blob.get_exif().is_err()); let img = check_image_size(file, compressed_width, compressed_height); Ok(img) diff --git a/test-data/image/avatar1000x1000.jpg b/test-data/image/avatar1000x1000.jpg index f53eaff87782ea509db1262c21519fe10ecff34e..3437c3b395409d1d034dbb761786f597c86c8e81 100644 GIT binary patch delta 198 zcmbO^f$8!@rU|0;4;gm2R%E6zF!=g1XfZG_a4@hkN-?kkS&TsJ#V8GD2Qg|eFoVUJ z7#Ns@p=_Y4_DlvAsQM@%4Pxqm2sq6;fq{V?D8gc3WNb8nnE|MuK?I2BOk}i#NH8)n oGc159GBhw)zz8w^|9_w|ATTg6F|sl+1R@0k11m7vD9qLY0PQ&!7ytkO delta 12 UcmcaSk!j`xrU{}O&$Dy@03)~sLjV8( From 430a71288f3741c1ec31270fcc0d10f0b4337262 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Tue, 21 Feb 2023 17:55:36 -0300 Subject: [PATCH 003/528] Reduce + recode images to JPEG if they are too huge (#3956) I.e. > 500K for the balanced media quality and 130K for the worse one. This can remove animation and transparency from PNG/WebP, but then a user always can send an image as a file. Also don't reduce wide/high images if they aren't huge. Among other benefits, this way most of PNG screenshots aren't touched. Also remove Exif from all images, not from JPEGs only. --- CHANGELOG.md | 3 +- src/blob.rs | 304 ++++++++++++++++++--------------- src/chat.rs | 2 +- src/constants.rs | 6 +- test-data/image/screenshot.jpg | Bin 0 -> 591167 bytes test-data/image/screenshot.png | Bin 0 -> 366809 bytes 6 files changed, 178 insertions(+), 137 deletions(-) create mode 100644 test-data/image/screenshot.jpg create mode 100644 test-data/image/screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index ea7183b93..6ea2cd0ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ in favor of `get_next_msgs()` and `wait_next_msgs()`. - New Python bindings API `Account.wait_next_incoming_message()`. - New Python bindings APIs `Message.is_from_self()` and `Message.is_from_device()`. +- Remove metadata from avatars and JPEG images before sending #4037 +- Reduce + recode images to JPEG if they are > 500K in size #4037 ### Fixes - Fix python bindings README documentation on installing the bindings from source. @@ -113,7 +115,6 @@ - Run `cargo-deny` in CI. #4101 - Check provider database with CI. #4099 - Switch to DEFERRED transactions #4100 -- Remove metadata from avatars and JPEG images before sending #4037 ### Fixes - Do not block async task executor while decrypting the messages. #4079 diff --git a/src/blob.rs b/src/blob.rs index 0275149f4..98df31158 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -9,21 +9,17 @@ use std::path::{Path, PathBuf}; use anyhow::{format_err, Context as _, Result}; use futures::StreamExt; -use image::{DynamicImage, ImageFormat}; +use image::{DynamicImage, ImageFormat, ImageOutputFormat}; use num_traits::FromPrimitive; use tokio::io::AsyncWriteExt; use tokio::{fs, io}; use tokio_stream::wrappers::ReadDirStream; use crate::config::Config; -use crate::constants::{ - MediaQuality, BALANCED_AVATAR_SIZE, BALANCED_IMAGE_SIZE, WORSE_AVATAR_SIZE, WORSE_IMAGE_SIZE, -}; +use crate::constants::{self, MediaQuality}; use crate::context::Context; use crate::events::EventType; use crate::log::LogExt; -use crate::message; -use crate::message::Viewtype; /// Represents a file in the blob directory. /// @@ -323,66 +319,60 @@ impl<'a> BlobObject<'a> { match MediaQuality::from_i32(context.get_config_int(Config::MediaQuality).await?) .unwrap_or_default() { - MediaQuality::Balanced => BALANCED_AVATAR_SIZE, - MediaQuality::Worse => WORSE_AVATAR_SIZE, + MediaQuality::Balanced => constants::BALANCED_AVATAR_SIZE, + MediaQuality::Worse => constants::WORSE_AVATAR_SIZE, }; + let strict_limits = true; // max_bytes is 20_000 bytes: Outlook servers don't allow headers larger than 32k. // 32 / 4 * 3 = 24k if you account for base64 encoding. To be safe, we reduced this to 20k. - if let Some(new_name) = self.recode_to_size(context, blob_abs, img_wh, Some(20_000))? { + if let Some(new_name) = + self.recode_to_size(context, blob_abs, img_wh, 20_000, strict_limits)? + { self.name = new_name; } Ok(()) } - pub async fn recode_to_image_size(&self, context: &Context) -> Result<()> { + pub async fn recode_to_image_size(&mut self, context: &Context) -> Result<()> { let blob_abs = self.to_abs_path(); - if message::guess_msgtype_from_suffix(Path::new(&blob_abs)) - != Some((Viewtype::Image, "image/jpeg")) - { - return Ok(()); - } - - let img_wh = + let (img_wh, max_bytes) = match MediaQuality::from_i32(context.get_config_int(Config::MediaQuality).await?) .unwrap_or_default() { - MediaQuality::Balanced => BALANCED_IMAGE_SIZE, - MediaQuality::Worse => WORSE_IMAGE_SIZE, + MediaQuality::Balanced => ( + constants::BALANCED_IMAGE_SIZE, + constants::BALANCED_IMAGE_BYTES, + ), + MediaQuality::Worse => (constants::WORSE_IMAGE_SIZE, constants::WORSE_IMAGE_BYTES), }; - - if self - .recode_to_size(context, blob_abs, img_wh, None)? - .is_some() + let strict_limits = false; + if let Some(new_name) = + self.recode_to_size(context, blob_abs, img_wh, max_bytes, strict_limits)? { - return Err(format_err!( - "Internal error: recode_to_size(..., None) shouldn't change the name of the image" - )); + self.name = new_name; } Ok(()) } + /// If `!strict_limits`, then if `max_bytes` is exceeded, reduce the image to `img_wh` and just + /// proceed with the result. fn recode_to_size( &self, context: &Context, mut blob_abs: PathBuf, mut img_wh: u32, - max_bytes: Option, + max_bytes: usize, + strict_limits: bool, ) -> Result> { tokio::task::block_in_place(move || { - let mut img = image::open(&blob_abs).context("image recode failure")?; - let exif = self.get_exif().ok(); + let mut img = image::open(&blob_abs).context("image decode failure")?; + let (nr_bytes, exif) = self.metadata()?; let orientation = exif.as_ref().map(|exif| exif_orientation(exif, context)); let mut encoded = Vec::new(); let mut changed_name = None; - let exceeds_width = img.width() > img_wh || img.height() > img_wh; - - let do_scale = - exceeds_width || encoded_img_exceeds_bytes(context, &img, max_bytes, &mut encoded)?; - let do_rotate = matches!(orientation, Some(90) | Some(180) | Some(270)); - - if do_rotate { + if matches!(orientation, Some(90) | Some(180) | Some(270)) { img = match orientation { Some(90) => img.rotate90(), Some(180) => img.rotate180(), @@ -391,30 +381,62 @@ impl<'a> BlobObject<'a> { } } + let exceeds_wh = img.width() > img_wh || img.height() > img_wh; + let exceeds_max_bytes = nr_bytes > max_bytes as u64; + + let fmt = ImageFormat::from_path(&blob_abs); + let ofmt = match fmt { + Ok(ImageFormat::Png) if !exceeds_max_bytes => ImageOutputFormat::Png, + _ => ImageOutputFormat::Jpeg(75), + }; + // We need to rewrite images with Exif to remove metadata such as location, + // camera model, etc. + // + // TODO: Fix lost animation and transparency when recoding using the `image` crate. And + // also `Viewtype::Gif` (maybe renamed to `Animation`) should be used for animated + // images. + let do_scale = exceeds_max_bytes + || strict_limits + && (exceeds_wh + || exif.is_some() + && encoded_img_exceeds_bytes( + context, + &img, + ofmt.clone(), + max_bytes, + &mut encoded, + )?); + if do_scale { - if !exceeds_width { - // The image is already smaller than img_wh, but exceeds max_bytes - // We can directly start with trying to scale down to 2/3 of its current width - img_wh = max(img.width(), img.height()) * 2 / 3 + if !exceeds_wh { + img_wh = max(img.width(), img.height()); + // PNGs and WebPs may be huge because of animation, which is lost by the `image` + // crate when recoding, so don't scale them down. + if matches!(fmt, Ok(ImageFormat::Jpeg)) || !encoded.is_empty() { + img_wh = img_wh * 2 / 3; + } } loop { let new_img = img.thumbnail(img_wh, img_wh); - if encoded_img_exceeds_bytes(context, &new_img, max_bytes, &mut encoded)? { + if encoded_img_exceeds_bytes( + context, + &new_img, + ofmt.clone(), + max_bytes, + &mut encoded, + )? && strict_limits + { if img_wh < 20 { return Err(format_err!( "Failed to scale image to below {}B.", - max_bytes.unwrap_or_default() + max_bytes, )); } img_wh = img_wh * 2 / 3; } else { - if encoded.is_empty() { - encode_img(&new_img, &mut encoded)?; - } - info!( context, "Final scaled-down image size: {}B ({}px).", @@ -426,19 +448,19 @@ impl<'a> BlobObject<'a> { } } - // We also need to rewrite the file to remove metadata such as location, camera model, - // etc. if any - if do_rotate || do_scale || exif.is_some() { - // The file format is JPEG now, we may have to change the file extension - if !matches!(ImageFormat::from_path(&blob_abs), Ok(ImageFormat::Jpeg)) { + if do_scale || exif.is_some() { + // The file format is JPEG/PNG now, we may have to change the file extension + if !matches!(fmt, Ok(ImageFormat::Jpeg)) + && matches!(ofmt, ImageOutputFormat::Jpeg(_)) + { blob_abs = blob_abs.with_extension("jpg"); - let file_name = blob_abs.file_name().context("No avatar file name (???)")?; + let file_name = blob_abs.file_name().context("No image file name (???)")?; let file_name = file_name.to_str().context("Filename is no UTF-8 (???)")?; changed_name = Some(format!("$BLOBDIR/{file_name}")); } if encoded.is_empty() { - encode_img(&img, &mut encoded)?; + encode_img(&img, ofmt, &mut encoded)?; } std::fs::write(&blob_abs, &encoded) @@ -449,11 +471,13 @@ impl<'a> BlobObject<'a> { }) } - pub fn get_exif(&self) -> Result { + /// Returns image file size and Exif. + pub fn metadata(&self) -> Result<(u64, Option)> { let file = std::fs::File::open(self.to_abs_path())?; + let len = file.metadata()?.len(); let mut bufreader = std::io::BufReader::new(&file); - let exifreader = exif::Reader::new(); - Ok(exifreader.read_from_container(&mut bufreader)?) + let exif = exif::Reader::new().read_from_container(&mut bufreader).ok(); + Ok((len, exif)) } } @@ -558,31 +582,35 @@ impl<'a> Iterator for BlobDirIter<'a> { impl FusedIterator for BlobDirIter<'_> {} -fn encode_img(img: &DynamicImage, encoded: &mut Vec) -> anyhow::Result<()> { +fn encode_img( + img: &DynamicImage, + fmt: ImageOutputFormat, + encoded: &mut Vec, +) -> anyhow::Result<()> { encoded.clear(); let mut buf = Cursor::new(encoded); - img.write_to(&mut buf, image::ImageFormat::Jpeg)?; + img.write_to(&mut buf, fmt)?; Ok(()) } + fn encoded_img_exceeds_bytes( context: &Context, img: &DynamicImage, - max_bytes: Option, + fmt: ImageOutputFormat, + max_bytes: usize, encoded: &mut Vec, ) -> anyhow::Result { - if let Some(max_bytes) = max_bytes { - encode_img(img, encoded)?; - if encoded.len() > max_bytes { - info!( - context, - "Image size {}B ({}x{}px) exceeds {}B, need to scale down.", - encoded.len(), - img.width(), - img.height(), - max_bytes, - ); - return Ok(true); - } + encode_img(img, fmt, encoded)?; + if encoded.len() > max_bytes { + info!( + context, + "Image size {}B ({}x{}px) exceeds {}B, need to scale down.", + encoded.len(), + img.width(), + img.height(), + max_bytes, + ); + return Ok(true); } Ok(false) } @@ -595,7 +623,7 @@ mod tests { use super::*; use crate::chat::{self, create_group_chat, ProtectionStatus}; - use crate::message::Message; + use crate::message::{Message, Viewtype}; use crate::test_utils::{self, TestContext}; fn check_image_size(path: impl AsRef, width: u32, height: u32) -> image::DynamicImage { @@ -820,7 +848,11 @@ mod tests { assert_eq!(avatar_cfg, avatar_blob.to_str().map(|s| s.to_string())); check_image_size(avatar_src, 1000, 1000); - check_image_size(&avatar_blob, BALANCED_AVATAR_SIZE, BALANCED_AVATAR_SIZE); + check_image_size( + &avatar_blob, + constants::BALANCED_AVATAR_SIZE, + constants::BALANCED_AVATAR_SIZE, + ); async fn file_size(path_buf: &Path) -> u64 { let file = File::open(path_buf).await.unwrap(); @@ -828,8 +860,8 @@ mod tests { } let blob = BlobObject::new_from_path(&t, &avatar_blob).await.unwrap(); - - blob.recode_to_size(&t, blob.to_abs_path(), 1000, Some(3000)) + let strict_limits = true; + blob.recode_to_size(&t, blob.to_abs_path(), 1000, 3000, strict_limits) .unwrap(); assert!(file_size(&avatar_blob).await <= 3000); assert!(file_size(&avatar_blob).await > 2000); @@ -856,10 +888,14 @@ mod tests { let avatar_cfg = t.get_config(Config::Selfavatar).await.unwrap().unwrap(); assert_eq!( avatar_cfg, - avatar_src.with_extension("jpg").to_str().unwrap() + avatar_src.with_extension("png").to_str().unwrap() ); - check_image_size(avatar_cfg, BALANCED_AVATAR_SIZE, BALANCED_AVATAR_SIZE); + check_image_size( + avatar_cfg, + constants::BALANCED_AVATAR_SIZE, + constants::BALANCED_AVATAR_SIZE, + ); } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] @@ -885,10 +921,10 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_recode_image_1() { let bytes = include_bytes!("../test-data/image/avatar1000x1000.jpg"); - // BALANCED_IMAGE_SIZE > 1000, the original image size, so the image is not scaled down: send_image_check_mediaquality( Some("0"), bytes, + "jpg", true, // has Exif 1000, 1000, @@ -901,12 +937,13 @@ mod tests { send_image_check_mediaquality( Some("1"), bytes, + "jpg", true, // has Exif 1000, 1000, 0, - WORSE_IMAGE_SIZE, - WORSE_IMAGE_SIZE, + 1000, + 1000, ) .await .unwrap(); @@ -919,90 +956,87 @@ mod tests { let img_rotated = send_image_check_mediaquality( Some("0"), bytes, + "jpg", true, // has Exif 2000, 1800, 270, - BALANCED_IMAGE_SIZE * 1800 / 2000, - BALANCED_IMAGE_SIZE, + 1800, + 2000, ) .await .unwrap(); assert_correct_rotation(&img_rotated); let mut buf = Cursor::new(vec![]); - img_rotated - .write_to(&mut buf, image::ImageFormat::Jpeg) - .unwrap(); + img_rotated.write_to(&mut buf, ImageFormat::Jpeg).unwrap(); let bytes = buf.into_inner(); - // Do this in parallel to speed up the test a bit - // (it still takes very long though) - let bytes2 = bytes.clone(); - let join_handle = tokio::task::spawn(async move { - let img_rotated = send_image_check_mediaquality( - Some("0"), - &bytes2, - false, // no Exif - BALANCED_IMAGE_SIZE * 1800 / 2000, - BALANCED_IMAGE_SIZE, - 0, - BALANCED_IMAGE_SIZE * 1800 / 2000, - BALANCED_IMAGE_SIZE, - ) - .await - .unwrap(); - assert_correct_rotation(&img_rotated); - }); - let img_rotated = send_image_check_mediaquality( Some("1"), &bytes, + "jpg", false, // no Exif - BALANCED_IMAGE_SIZE * 1800 / 2000, - BALANCED_IMAGE_SIZE, + 1800, + 2000, 0, - WORSE_IMAGE_SIZE * 1800 / 2000, - WORSE_IMAGE_SIZE, + 1800, + 2000, ) .await .unwrap(); assert_correct_rotation(&img_rotated); - - join_handle.await.unwrap(); } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_recode_image_3() { - let bytes = include_bytes!("../test-data/image/rectangle200x180-rotated.jpg"); - let img_rotated = send_image_check_mediaquality( + async fn test_recode_image_balanced_png() { + let bytes = include_bytes!("../test-data/image/screenshot.png"); + + send_image_check_mediaquality( Some("0"), bytes, - true, // has Exif - 200, - 180, - 270, - 180, - 200, + "png", + false, // no Exif + 1920, + 1080, + 0, + 1920, + 1080, ) .await .unwrap(); - assert_correct_rotation(&img_rotated); - let bytes = include_bytes!("../test-data/image/rectangle200x180-rotated.jpg"); - let img_rotated = send_image_check_mediaquality( + send_image_check_mediaquality( Some("1"), bytes, - true, // has Exif - 200, - 180, - 270, - 180, - 200, + "png", + false, // no Exif + 1920, + 1080, + 0, + constants::WORSE_IMAGE_SIZE, + constants::WORSE_IMAGE_SIZE * 1080 / 1920, + ) + .await + .unwrap(); + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_recode_image_huge_jpg() { + let bytes = include_bytes!("../test-data/image/screenshot.jpg"); + send_image_check_mediaquality( + Some("0"), + bytes, + "jpg", + true, // has Exif + 1920, + 1080, + 0, + constants::BALANCED_IMAGE_SIZE, + constants::BALANCED_IMAGE_SIZE * 1080 / 1920, ) .await .unwrap(); - assert_correct_rotation(&img_rotated); } fn assert_correct_rotation(img: &DynamicImage) { @@ -1026,6 +1060,7 @@ mod tests { async fn send_image_check_mediaquality( media_quality_config: Option<&str>, bytes: &[u8], + extension: &str, has_exif: bool, original_width: u32, original_height: u32, @@ -1038,7 +1073,7 @@ mod tests { alice .set_config(Config::MediaQuality, media_quality_config) .await?; - let file = alice.get_blobdir().join("file.jpg"); + let file = alice.get_blobdir().join("file").with_extension(extension); fs::write(&file, &bytes) .await @@ -1046,12 +1081,12 @@ mod tests { check_image_size(&file, original_width, original_height); let blob = BlobObject::new_from_path(&alice, &file).await?; - let exif = blob.get_exif(); + let (_, exif) = blob.metadata()?; if has_exif { let exif = exif.unwrap(); assert_eq!(exif_orientation(&exif, &alice), orientation); } else { - assert!(exif.is_err()); + assert!(exif.is_none()); } let mut msg = Message::new(Viewtype::Image); @@ -1073,7 +1108,8 @@ mod tests { let file = bob_msg.get_file(&bob).unwrap(); let blob = BlobObject::new_from_path(&bob, &file).await?; - assert!(blob.get_exif().is_err()); + let (_, exif) = blob.metadata()?; + assert!(exif.is_none()); let img = check_image_size(file, compressed_width, compressed_height); Ok(img) diff --git a/src/chat.rs b/src/chat.rs index 7561c511f..188719e88 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2026,7 +2026,7 @@ async fn prepare_msg_blob(context: &Context, msg: &mut Message) -> Result<()> { if msg.viewtype == Viewtype::Text || msg.viewtype == Viewtype::VideochatInvitation { // the caller should check if the message text is empty } else if msg.viewtype.has_file() { - let blob = msg + let mut blob = msg .param .get_blob(Param::File, context, !msg.is_increation()) .await? diff --git a/src/constants.rs b/src/constants.rs index 5ebc47d55..c3eb33f1d 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -192,11 +192,15 @@ pub const DC_LP_AUTH_FLAGS: i32 = DC_LP_AUTH_OAUTH2 | DC_LP_AUTH_NORMAL; /// How many existing messages shall be fetched after configuration. pub(crate) const DC_FETCH_EXISTING_MSGS_COUNT: i64 = 100; +// max. weight of images to send w/o recoding +pub const BALANCED_IMAGE_BYTES: usize = 500_000; +pub const WORSE_IMAGE_BYTES: usize = 130_000; + // max. width/height of an avatar pub(crate) const BALANCED_AVATAR_SIZE: u32 = 256; pub(crate) const WORSE_AVATAR_SIZE: u32 = 128; -// max. width/height of images +// max. width/height of images scaled down because of being too huge pub const BALANCED_IMAGE_SIZE: u32 = 1280; pub const WORSE_IMAGE_SIZE: u32 = 640; diff --git a/test-data/image/screenshot.jpg b/test-data/image/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..276cca92a05fae82b8bb1cd403164adef46a37a6 GIT binary patch literal 591167 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%0A9=vTJ2 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 z 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 z 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�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 j@@FDk1bS{Pp5H|ls9!mk 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%0A);1!Efm#q8c!ShpDa1h1pdhCBWO0 z81}11oh!YJ3b1vZZL0dc@?Pa6q*5ZC5sx zIOp)_f}_ne5IE>7B)Is0JuMe$kwjc(f!8^!@(1SxwH8wG2Q`npzAQ{tlIH%pwr+aW zRsso41LN7X0C?7#LPUFo@ekjAm6hh{W&BEE0hm*krIH&ObksOe@PFJ`Liw7g=hVX* za8p9flq~~@7cDY89U1YH6bMJ(-Y03sV%ZVUzKXxb9#InW5R9gclV*ImPn@Iy-A`O5 z3nPhSRT3q|3ve`f{<>F=B%23FmM@F_ApWP}JBk)H3Tcx1a-#J7taPW1abX029~%(r z@GoK0Y45{c-e+>&d%?}b^pkJ0Z4B&(jvn7<9#GkqI9^f$tgV<*ISU2#nIi8v<*|XO z@AQZ)zL_Z(_pNKM*4o3}ZJTn&O_JUQRC+ihOrZH_N@WyFGJ7&NZd`+up@#~u$!ka) zp0r$8LsZ>YPWBe}L;K?K8AbwBj`ANCp*#`s^}p3p5~q|9C{+y)@qS`ydxT2(CyyspODjsf zk(1-#+BfSGH!{&)$tvqnCkxb$d?X&+0D*cmCy#gxv35?2`#6kW|wpBTZ`vUA3N)sEmsO}lH$w!U)lNRkkohbqpRe!d3~uev9op1Ynw zPraIS3gGO;ODB?7j2Wz@&(M~q-$%#%Z1ODBSKmPY8eNkhnF_CZBGa0xzCh|2|4c4- z>J`Tj6Fk47(AR+9ntTsh6|*oMvT+=IqBKwkVDm@{9wvEU55s+}_FS+kW?a?fA^<=0 znP3)?If#_p{VID52C+h9`>u0T(j*-X&ADaPr0Cykbln+DbL^VnY%IuDVK0~PQ5j0{ zg@Xow+(a1m1nzC8#RePsBj^$zDC#ceQmHmPrTr*IE{;tLWH&I~%h1JA$KU&_N-Zn> zyOIvY|DbPKKBrT$N>{7Y2)_=2W4<$9+0b$)Cm7(n+~U-G4cYVpq)E6IUuwj}<=nF0 zE04Iu^2NT&ms3>L#Rhg?G&+8^~VwAK%d1bUo=1K~9n(sh>PKDYdZP8Wk--6OTw7q~bx=e!vggG&sAw5Ky>oxfX~;LFDB*r^G8@s*t|+J%g0w?#}<`-PDE zlv$nyby$|s4o|iYCAp+7yf*GK9A5Tt;V_^c7hXKG4;4Q1wQEKsZ3b_YO4`)^H??P6 zgmqhM>pS}|$7gR`W3cKlJ)(k_Z^>yw^6{`2wuAMoop`bmMZZRdul{f>#~IVNJ}Bvg zYowCD>CB4^5dr?7CwqH8G#cnIiH$Fjr(M_8$PNW4-;n_93TL&^&)7KsLw1J?gc!iA zj4NnNWZnpT;>8pGF2D{q9BkS5)U6s$r$s7&cWU1GRN*pRRnpLbv5$3tWgS5GBIX3= zo$W!94-e>EQt~TFyX-cW zWij&ZA%bdFuc14_$+Q!8j|m3s6%e2%vPR}qXpvoKH+i#4xCtVn|yU%Dscc=3BLi zfm8Z9Cqq;FOL*UnN(VcfWa;K6|);=t=iFvBKEziKk-SB-6=H0>WX?8Q80&bF!(r4K+c|WE6?mam6Z7&3){tB?JDsDY;7R1)Arn)UBv3}A z#%%(>l{WqapuK~bW6cg-jIMs=0up64x5xcdF0)MZPM)BGS+Zhq+z5a9mj5>qp8bv_ zUXmTXH2I!gGK~TzVizsZ#`q(Hf&j$v`00cD*i6ug-UwWjE^6&lHjoTz5h?6BL`?n~ zlOxJdElgobPT_J3*Y3G2B+^U6O}}|b4P^fPT&T}5pRug|!w3U~f=9zv8_WS=YDsR501g$zN5o^=NzIxG7vv%MJaQe6K=l0 zUg|$?0NvTXCTa0pBX=+-EsuzkX9xzMbsGa|x)V+8#LG_-`>i`YR`0zKid>BQ(o!a( z7P|*2%=vV8;U2~nuBBUYH-wJe4Z?~%;N(iX!efo6Q;5i_WXim&lgj(X;5RLW-W3n? zeDvv`m@g^T>SWWg*P#m4Kaf4B+TQT)Z{h4$!+bwWzk_(G)+cYc^M*v5HH4}3-2^70 zslU4Q%`S$&iC*XJcJxDUZE7V-}x6p4T=ZpdEh94eaMkJ%Y;GX#;N$s`Ce(Q3mj=CA(*8d*$*i zD`-G?y$|z4gmveD4+vNaq8dJ+0wmR?7?WXB=Xd5$eG*vTQx%dArfe)*)E=zVkWB5C zh#x$>PMwysGz~V4DKMk-{^-+Fl3qkXbR=)=xG__+*7}@A%CE zjU#;K!4UvIr{u_Hy6tTZc%>lEGT<)&H>;mxy?x4_ci#AwVGUpYDthw|fLs)t%C!4y0?^FF11cEQ z;N^LvWB??LQ>>`1x##5SqTf@%M45CVrei#EoYAJf0pxO1C(+og^(n&!T43v%BfsOU^wIYFDC>tl*la;a85CD_`s!gSv@ zAt~{!OI)ihYZ<+3iSE?BSC*3Ej#g_U0-v^1sSlWpydbk$LDB0!Q24D-9>ul_yN^S? zj_LMsUYDwU%fgbJUD5t4JliwWUHM#J;KNyO<4t%>U(F{}{ROBxZ z9CoRlBd~J?SUeN5hcjUpz6xo=cb)rs=>OdKQS!Lp5cB_NIyw9P!UUf0t0jna&#ZVp zI)*u!9g+Rqx5OqyHLY$9-j(4iGo-8|s`?KHS}@LyMFzqH>=gJ(xI|rGFJFXMGPFs@ zG$}SZ97oc8J55KG8qzqX0Z43V>%ZCR+Xm`F1F&}_%J_Y+@F;69E2>}%OJpaC!#4l()U_dcvo_%U% z?-fVJ%kA+G9tCOulTRz<4u*m2|8==#KZ$mAW!LuFHkC}uAFaYu9}^^jN&3T~nK4^qfqXQt9+S}J-sf zl(wnd(lSF(`#nnXV#Ewt0)tK??=*eKt7{75h;M}>^h@hZS@aeVp?8nuL=UqjT@)yE zd+48R!juT3Z$B85LJJ^3kV8a_b=OZ{bp&=vTRg~~`|fotC{#*kR|;nZn_QljfQ zP*<)zV4X#QwZA|r;J8iCz8+m&5%n>gEE?>C6x0>m1Sm6O#9$!}$a z%-r6`nwA%hCZ#63_$On-f<^3m`4#&v7o?aCq zB^d12d>X7jZ2GQ{yC?6-svB4eIWh;HU3|mVbqlC{n++9wSavA3d47f1}9aNCmc4|}s}f(iI~B1G|P zSFPQ|k}F}j9VYR#@AxIdvfeYW4`Jqv-)P!8EeH(a#T4>`^mZFb;sP0)w*N+N{RQw| z74sa}WFej@9lL*VJ?RQ?L)b_%g?Bz4Y<$QSGL8fH4+1H$x1}3;E%^Qg9&jtc-b}>| zk%g!OB7;7Dfm}cYjl$>Xeb7D_nrcgkYZ(JbONFcu6Y9yLKe=*;tJhvWuV+ipiX!mS zS>DzYKr7w#dBEwlawud6Q|XS8$=ZtvL)jt%mo$ z$4emr=BmdsH~%D6`302qStD65nxgVAzzZ5+5xEzA-}%E0f47I1vHQRO5U)DwXsW8S zRXDc(C=uIMimG;JFM~Y3=ovK)P=sWP!3}SJW;*K~xW0mYhFotNnRhUn-M^5qM~g!% zFExtAFIk3MPTqFv@`MqVMQvP!*vClj(Tf)dO;xw{suVoth@-#K5js`#4QmzD8C61=dk0l2eG;~B=Jy{_Zzc|9k87QXXGoDV2JFL^A-yc+7CRG zpsu1D5rq&Wfx5ii{9W=lS#VihELP27nRpzB{xbRWx$oW`7(Iu0V98iZIf1T36t==9 zV;s59Iu5{)`0xkD19T6|2zdD@5o=bP!Bf2~dU)g8PHdUNFn@K7IJr)^F`Z(B9nskR z5?!*^@S*$ci=upcW&3AsY$57PB^!i>-tvte!7|=FtJxn-D_7DKeQ6F;_$~cP`k4IIf;U}yRd_hP^e8O~c|5D0 z7DJuX=;!em@VJh82nkiL2UcnE0YGj~^Nw?-2@7J5Rwdhq6y5Pn-^PiTt+~+Ovhc>4 zP*6h*R^Kenr6}e2y=JS{q*tkq3+q#xAd2c3^|^in^H=ORf@VkZ!PV{l3@(y<7? z6qXZM-MWW1EE$B1uV+SfanoG}oKlY=AnCLB0n=tzHMqM>i9V+K@i+hzsnonRW4Ja$ z)mYIY^TA*tH5}!=kT_mKU|iuqC0eR%vEgSc1s~c+MnX|dqjRb~ozUTe*cFjgK<+W$D&)ODmJMO=B|m0^25=PGuf_C*+4cZOSck z^ej|F@I_H=SYp>iJ|k~v7|+89SR?t+*xwZ@K;}a!;4Ju`c z)bRuiAn4`8pEMG|_WcLwA?vDl!=(_A#eKC>eri&(zN1 zh-Yydoj_f8l>-Mm*kQZWh6ak0IF2Lp-@$@@$|Zst`i?0V3zVh?+Uj+uXUulRPcFqV zqkB!GC(FW5KG-Ll7UbL2xv|GR%dUyOT_!Afzt82)^ls~Abka>c*V3CDFwr(*Llg3Veb^{Zbv zO&741#Q)b)EOtEoA;GObxniGwa7elw@Z0hWS9a&!FErM6=>-TvjxhY-nUi&*2VsGO zWVFKx!=FYW_Gvg==>$Jh183bOs8nrzPK4ct&c9P?YsOPcOtbgJ?=jG}2AKZ}LH{I& z*(9qa>$h3>pL7}T-jZX^y9-9-B@h>;@J7&E2B3AWM1hTu>R*5hTJR*;AAjX(t7({B zkofmt`#3Wr(n~GLSau1K&qdEo?G_Zx+2z#2e?%cJ;0mj_7_WWWc7tg!gYH`CL`VG6 zW?0~Qfbf;@Ka_RLe^b`Qmd$-iS`DYQuzs$d#;4;i-#dvw4tcCpyp^|o9xWtAQDTo& zf$TWOJ0+8&Y2O|t1a^NyIdTp=vjL!W^gR{3PajOuiTA|?L`R7Rl}Zv?yzGB#HAq>q ziL73B&N{g2NgMp&Vfx?QnT)3(-5%23>2xOfh`(*jzDYlS?GQ&S91Pe3TEM1MR)Xpg z$op}t-&sOvsS0}~qs@<>UJb05#j$unEJW9A-^cM07BSq;+F9FI6M&f1)yHO4Ld5Sj z_rAsLUT!fR|CppBs9%gNJR>pJ0w~A(1wE^NM&m|AR8{-D(8k$@bTts7R8-b%!@bM) zBpw){Nu}ncFXM3k@*h&u+W@b&mDRYAU{m%%)dakoU!T^1$Vfzi)61S5nYV`i-r73F z_@K=7u;@Umel0>1)LZxbq`dpJiatB)6QLi!j5G!BS=bf*7T$Eb_wpxr@^>Oqu@4fkLppSV`05Ikgn0T?jIk- z$-B!4av}rMI$EWA!>DbxA(1@HBME)pmzslb`-wYtsfSY4WNmBysiTeilA23I+7tJx zxc{Y^g4dVKzS?Y1lwFs0!xY7UxA2|}j=OFPksR~;&&hw}gnks_-1TMk33XdcEu3iD zT-24oBy0Pdn>j0KpLM#My`?=YeWHiZ2d{oQAGaWcyX|f?rNZ#2q9Ig-hofbTQFP+r z*Gd1fL?bv{BZ=P$e5~thRKMzMY_lO$h146rmlA+m+sT zoZ;jI@EY?fqkAae&C{c-^h~&P6KK~I$7GLGVnb(NfW-8A;>(EHslOM$!d6}8cMclK zXC}>ralLr3)-&a|6EtevWttj?pYB_Zl^f}UyX@D9$|<#&W8`W?t+v7JlpeayjarLO zP_&{{l#CdKrNDWfhtQ>Q+YrnKC$8$SXr-H851PXK>U-nIug;5lzbSU|Ky6l z_BSKIwo-=L5WE3|z)*`3rixiTVL&JJr&D+} zswQOWPWy*$YYbWM9CM307ZSiG?$Tr=x*a=I1W2(W#M3|Ad=}_a%fbzPuK9PD=rw$U zRFM?|&A_+RHJh^bh?(UjX4FHw)vNQZxRQA0X0RfAB~$lO=@gcFu3(pjtcSwm@4M_z zSam7APeIqQN*G&c7T6R!OxJA~r%qb!-)j#858v)k3j>LXF&OqQ5y2}Dv>)=W{8Uv( zjB+oa>2fS|lok0~d$9&}6e{75aXDoR@UbcKF&{5>(pM>O)fSRBDkD9DfM~$fT79u9 z8X5aVbje1Tew{>`q8;C_$xf{fP6@VcVrLo4h?W~J)rKDMBzt?xp^Vj6RDdOsE!0;i zIN3+Xjn_5G+Js_yTPcDg>1ucYGmO}+dCHIFA#?}h)AW2a^ZqQYaI zR6-VxT;=chq6*S}tGmArq9;!Gb$$gSB5arpY}?vQs;nUzpu|5CN66;+lzLe@+>rQI zrDJ*(VJIi+aOoQp3It0-&M_Ipae$1?~RaM7~m-V zD#CQUwQ^jmKmZs%+4qq2dNMWx(-%RT#7+dkzKJuTsZ#|!>nP^hL!Vft*Js`QfFa1FK03h zYHLb#ngZ3@7RpaYYUQpOkR*#jKjjljIb6!7RvqkA4jAU9kM3+rvMHg>X2iZ(GpSx7 z5DPH}6P`?lsoz1H$ND1rq{cD+&p45MV~|-~eLw>ttFBQDQWkdL%7}Mfn7s$!1}{A4 zet$tvd#@{xu?k`GCDL9>{A-pkzSN{Bk0F4%wOQmqi3(5LFfm(yjsfH9tCixDWj2t) z33WZU$uKoqpIpxlUzm_2N5P?#WFblyjuBXo^!z62hm6JF_?!^eM|saHFjSa20Ymk> zO`m(s+z!`7<102X7ZI#%rKkBS<14d?XJ!(K0dX#c^H9QxuX8P^+pH}sYfvmUG~IzW z6t(q2$Uv71@9R+4U<*exj=op%Spz9im986%+%0J+7wa%UcoeCRyYsQXuL{8ndXTi> zdO7elOT3I_n&=79*b=S*lL1pKu&5Fd|IL|$Fv*=M6)<6ez$iVf*NBqnET`-jqAX zygQ4<`m8RKnOBvQzHtOaomGWFNdIx2zY4AztlD;J(cgoQzUb)LN+(CNYj~ENExdFF z;kfW`|7_Y`q~bf+Vx7eG)S!ySjnEZ(3h#wH-YX<%WaPjKJOH%S+xw9HLR$gER zmCOh-$ugXk#EYY|l+80u?!~{wRL97}zFk(6lb0;*_StK1jNwGQfTbe})TylIxo+Le zv^|FtKhQ4(z*T%_ydy6CGX$lz5YWwNq7ipqJFApyhQ~X%;ZP%q%kdFKfM{b7nj}^12iF-u@ z`N+!fR^>O}YyB=%)+Bwz7_ax^29>+ipEYI)=J6=z!Kq)`gIMekAF;7d^GuCvdFzvQ z^5^A38JQW~LuFK>o*Qw@b@K>N{D~o=!eTmw&(4k1dp4ICcpW>y)Sn+PR6`o+fkm&I zKfYiVz6K_LaTpFX{X;=wfX3ZMHGe+$Nr^A=6u&O6f3u}30Z$Zc_5_M1^u z+Y?&;=3{~g8kWbZDel4<=st?Kw>JkA4=V(GyEV{ko|XJMo7c2 z;1!nmiJIcZAC}zseKE5Se!h0qjGh%-7+_q|i&OEbU6d2L@rV^wc#zsG+KP9}NHu?9 z@a`sCt#;HXfA+EN4b3}{ZD4ZA$1QlHCey5N@T&*Xs+9Gm4z=As3om$m@Qnr{)Wf2! zirBiV)Y4gab*bLieJ1xOLwvtZqG3ztzzfj(Jaa?!7hpX?qkrK!`roa@y0@*wc(!t> zm#(j_wVBw(wq?5Cyxbj=k|&!dYm31jdHv_3qK)f|=hg1NMyO3M{8GX)x=SUQ7u^&z zMAvfO!{1QWd!!VW*o`ixjiiXEyh|QfgV84fs7b#~xJYtR{kOF`W3gwxu6Z>qQ-5oY zFpYPRyjuO!H#v;u6$aqhXHZYsMquLwOv^%0P7|^f`6jK$HKyOa{w8wd7v{m4t0RxE z^~uI(6JxA!cC8>JLR%O&n^^Qs zU_p`t4Grgn*VraJLQ49c|Bt)34r;4y+r5*JK=9xWA-Fq5S_m%1U0b}k6)%MZcXw%n zJH?9^w-$;!6m9WRN?T|t{dnK^x$pbgd*0de&FuZnH?#j*Gs&!6*IMgZN!EED$ML)0 zhreqEcWFSXJlQ%7l-g~zDxdZlXy2*qCsdpcX=Hy*&|C(9&xWsGC81I{r%77G;sOLl zMybBG$LHXc*e$4tt5lM&$A}GV364 zSoI=6yuLRS{@Xn-#)(AnS!`xRy(H2?*@s7H)LfhKWsJZy$nHxJUBPb}A441))IvCI zQ3S)eS)qbr{+kgI9^(fTkc1^A`n3X#@C=XhV%x`gQO%2f`@T9-B&w(d)C-LKd}%&g zY)+Q+euxCZLw977eQ=$_b6H83!awrJnDl{qF(%a`=-1H5AnPR%i^734b%iDlw+>z~ z)=9~=p*hwqSdLq-K*9pZc(Pp+2vrLJG3wAsl^h9i)((Xh)KBe0e zqOG-oXzV1do7?6x7%U}{NlW6f1NjcYU4p*K%UFaq6}rj+p<-TlMsdigkRi&5-7xrF z2n5cMV}f~dIF~wDD-WFr2qvwjp?bzZUE#fWA7Bmg2{)$LSvOE)*p(EL7=s{V9EpN4r`lY7M~^{>&ChV3Dl_#>(uGk6k@4j!S{ zn}R&CBP!jGb%gx?hRvmOVJ4_Rx_A0(sM{1bf>X2IBm72w5!lBMc^fiSYgl4N(DF2EcDo&zcD${wjqCcbqMUl45D4I8hR6}V z6G&#x;DuLixXs;Bm;Qxq&Pt;nF^54)>Q`?b`ch)4m0~H_Us++}Oo5yN9w3@c$$&>6 z`{EujhDQKcel>?$>xw1b5PW#>bZZ(W!7NtG^%IM`2Ee^Xiq^u0%xh$HyEUWa&yWZH z*m*a^dOZ(U%6<-s7p4E~3saDnj0H{d9%WD%$&We*Q;xDM@Bai}(=ub3L-qV5%*xUxXXM}M zKQ&|@dEX{t_qM~4F60m32k4aQT1Zv;gC5U0qt(aU&NvI5x9_`{hQ}L>u3?@#vNqJS3Orr(D9*~I|Exg>=T&5tmrBS%+Qi-0&D(!VAV1v|$$;iavG&nH z9XW~s&((e<-4iXWq?gnoCuOD|>y8Md*z!Aj4e6q!_yp25d!x^<=eS<%YfvEcK@`6* zOhePh+4zg>Ni{|cx_Qw2egG#_t}(m;s%%m?%ma5Xgez^l-c+af0v7p%<9PA`%R-t$ zwTO+JbRAJ&s3^svQ9OJdN?O2Mkj`<$M!+G>KN+87Dn|BxEu1R|(X zv$O>Zta2#{55=ssWoeTMk`TF~O|m76oCofL@-vHo>Ip%3?9;J@TiJGyUXP6(+R0+G z#=cw~!;5r(w-76A9fy8Z&_hO3y zZ^nD)0I5ifW;v)-BPnW`!|!eXk!q!ii|?g8jSy!l@|Zd=?sF0d3mFTw{TEdj*T+mo zKDJYO>weUAvS_Hbi`K zLSOkNDrF;Pt){CR-)&@4GQN~60f;PA;UA2k-TAnQ-Sp2Va{tfcX6I}i(rARlgyK~D(amxpm{{nUG>}#=syB9}6FmvT zuft~vVuq(7ut7?-L@5dkgq`Ozco`yooQ;PW^AST0F%zxRc-xD}s)%wl^>qF0|0-R6 zBvwCt9Xb2{%audCVQlq}$gJxc@t5TAs5V!FX~=|Z(ER~UekJaBw2k@}X{k;=_6-q% zex#we;;iU1&&n(dD4{)Rmgqk*Gn0HZ;YvNM01JmzxVV##Bjgo+wx1B?ywq8`FSd(V zkd=?~JVP%Td(k2}X9P+%Vg11JQ_-klsQfVpzTC4l4)Q#E#u`vAI?#dWGA$HJHs29+o8_{<;4HNr2u(Mv1DUsSI=umd zofGd~f3S=BAc>S0+e}n(roReqHA(w7Jvsw`HG3X!|SkYaGh&{ z^0%-r!n*~imQ}Qxe5PV-&HQ+G9Xa=iNNE_Ov&fun7wnFs^eU1dI!T860|hV}B|l54 zh9LoTH8@TO%xy)+`Rrb&o=5Ca_vBT@(lmX~e zC&-cU(D6}?chOhq!ai+=A4ND#-KX=&J}0HFEzST)c_k?vi#(5$#mP3+Sp~W5iyu6l z3k8lIzj)iejI`N!OnJ@eO5bA%PzKKbEOo2gq5yk{)0MKq=;B~p{+PY=+D{`9Kr8E( z@P@SXYT_~iH?W=>4YF2gr7b6NqHH4*#`$?3=_YTcvx?C>48_&>c%RamhR1p2!f0zR ztvJV@C2_*(D7CQVIH_XB>;Aw?@^u^lXk$lPOE}lZ8fw_B#4_2G9$eYRwMg~~5cdtm z1W>aLzzWxj;iOHm>*#ty`&xk)2|C382S6bC3dAcnm-&p=BG>o>2bo}aiS)!BlH{apxLAuIC3U- zIaY=~@))5sssmcwC1ri*2lu2B*W*Nwtm(&@tK3zIL}hX=R8ynk0mtzplNQp#CCEyb zT198-7)}AwJl;6+X)=mAA7k}t141dmyCcy$z>B3iv-QQQx+kL;NeAW5Vo6gS!)v5+ z7+*pu1@#f5SQ}-iDC;UU)!rTKJ2y@{ilXXTMbBLQd8cM8!DxWR%p;_y9u$pbm_;t? zp&DBF2M{xo;Lkq!hBNQJ{JOCYZBHa{UtaW_ZOGvg4Zuv#(jDr3K9cT6waK77q^`zz1JFbR*Eo z*Mg&>n#Qt;p52|gVadO8H?|s)ZIF-^a zR?JXNVq~3xMIA75S1ga5=OBr_6K71zyu%UkMO688n+FTN?M-!cA`f50yCv)tvw&XfWRF4y zr0iGRxfUpLVNba;%erSlwEi_PGIjQCA~nlwKzeJTH+09(SmWOzy@BlU7lz z8L9nKFUKo=HxY41ENS9>4q1#A7hl&VxzWMMeE0)M-4ozi-)Px&40Z zN7}KnrPsTs${1gp8|o?UUpYo_67F85p`@U+LChT)b%^XIFF?Tk_31Hlpw{+35ioyG zW|U3`=(qD)#o*afq}>`G*D50o-rZwsj)y?Bdsn`G$p$mgs?TRF<{tup)mKqIu0IP> zg5MjA!Kqz-83uVbYpyb;6O(mCxv% zs=3YqYDp#E-#?GNEf~4r+|X_tT&{t3ew@HR`wic}O%v@DB|>@ifucx?YQ3vRb!$=R+w}t6$pK$O00Zi2yKW{B{`v+!gqm#KmfsUjP z@=)G8-HnC;>W-CJg@tzka4uXfb?Vu*a>JN!T$Y|AbrFWTbfkKl=`yrF*0B-Cc84)c zRKWN{($^2!zhQf`kUs>^=@C~!DnLRL+t9mqSy2kS>T~L~M+Bap(4ltj_B$ebT}3*3 zEJ$D}ZafH&Gfx59)VAfToV=`^pzb`wh(8aw)_4&%HGsctIo+*Gp)s%RTZ^7?%HSk^ z{RglYh(F;^%eQC!iYS*o+--Eg6Z(l`&rKM2ReI03l-UUDD*F?02k6yA^w(sf`Cqhd zD5+IDRrq)F3fK}!?=hGU?3?2!zXV>mjXUwuE31f0;Vu*U_4t$bI1L!S!Rk+@3mk0u z-L`CqQJ(@++n_WJ|L)TLmf({hNizPubmMrFdh2;@6nLB4=W(Td=Br#PhPgp9UFWbr z9|JHUakf7v{vwZrkj${P8*~F;9cSlpGF~BW2RXC8n&7jS;f(x|K-}3d4^N}e4djL` z=CZ+r+}SiPS(_WW=W*@5ei0$%={M>e+iafM*UsL zHnE{2khkYkjnz%Fv0%Yn-RUGF-*Tv2Y5u+v&)?9`gcrHjzaOg)CO?-56o$u!CFUGF z7ghwU)|VT*00=C81Sl~{{?im-dufN_Ynz)h6VbGbdq=@zW$aF3#zk)@A4GV3F5z~6 zY97b`KG{cAd&x?mu4CsT8?0YFy#{)O(aIciIE)9;L@8O>Av^e%PWWUqc?5rp(L)Fs zmK8N3U)^rRTZz2-9qowaZ{s53)53u*Gp8(7Nt>-9|r!Rp+61Rs`)K{0lZx zAd1q8&>_>e6snp|Gh42nDc_*rL}eS2WUdA%uU2`AY}=2t(Gz=wG6>`K6%20EMod7} zX(!T`vHK8308Z*Nf8n9KBQ1*U1yI`JqTgip)ooi8uue6R06A_FPuYyTHCh5@KqmjP_4!kpn z6O`v6(_+uVev}VDwN|~OJ`|sUTCJFBS@4X{Wib8$m>&x+7Rr-a*R`AyjmM2M3xwmw z96g}trG94q2LQgQ&Z7$|09DKN{FBDRBlk=SwkX>eY*kKXVAhg}Kx1cRaTKi9QpY-G zC5e!W)QCEf5w=vNyT$0~M;?Jl?!*(wZ z0m#r;+J0t-W+=L6C|YwSEE!niGax!?zPBq#w7H&gzka|v>=J*oY^zWFnf(OuvZ|O- zgJsVoR@{`f-~+n{gZEu11jTSMpn4foYm;`g@TnXDU-YjQIbT<}$m3X%a=bNK>ZBo| z)D@hnir3t%EQC8hNBf?c;bE_6Dnbo&pWJI0!B27?%s}-qg87`X4LiWiL5D@Egn2#uPE-P?)I#k z$Tx{DN&B+3E=@KwxiN=xruyVfxpr#pwjnOiWuC0&-pgOJ>GmsnpU;&))N<+&ts(i) zakeHHB(mD6y0%|nq>Sugc?Bd%4ZrsVYZ!N9q&*InI{r=c`J1T6G)z16#YoN++>|FB z6t0|!>pr1Yh@wl#7mAm*Rbk!FjNkw^VKyJz`JbfktsI#mVpaF5OcC%ROnDsJT=d|i zDiXa>{v3aBc5op@#=A4ut2ll~7JsK>3-c)5f4>O$;P{*Lyr1S)M-snYkKhl$PWJuIcNoeWr<1`pOO`|<_G9|bk<%TsC*O2#Wg#)+fMGngnHld} zH8i?-Uey2frDR1$7+9};;rf4$&-nvT4T%jv{VoorDPku$C1BlwS7Mf@R+5OFJHO{aIwxBl{pB}B zqU8KTiO0cz0Lmd(gwQ6~Zm;MNO!|3TGpZg1CHq~APi#y*W#>hvL*-XPq5`GX zYUO{UA8K-U7UuijjU^?jbRUZK?KgTWn zujI)SljTK_>pOf6Ww0)829*!|9i>^HYNIp>*)i1uXMiS32cK$j`4>++rlC_g$9W*? zt!+YoY?;JC3UAGWA-?%eE>T}aS8GN5gi#Qh|015gSdRc;!drj2KEgjIr_8BTEuc>| ztW#c|3$V0EG$nP?F>(M_rp(9^HZ+Imb90r5TTRX8{O6|)UKtq18oQR6y|v0~tW)$s z!EP7XQ#OUhVCx!IPHq~7NcHmInf@S>Z1&SP|I4?~Rhy0dK@ zSoqau3Hre!vA@0M@S#j0KO(UnZerzDL}n;ZLln9#;`GuIXk+RYDZgbHE0c5d#};_U`(q9-=XB=VuAf5ks9v)TICJoLj(Eu z+2sjC`Jz&shkOZA$cgI5FKaAYL1nwy%+ErN>}@l zEu-nbP!z+KEOdNKcZp*uOnemF@hGc}zUH?N+}zu6Y5ZI48&bz;f1 z&H4w0SXFu-0<5ac*8N%NrM1ZO7SMhl^jRi_2L{*gs^~N&}hu&cHLznzb8Z*F-cfT-1oJD4KqYi0if-|hb}gjND{H6$L99Wkr3-QC4lPiAZ(@L zm^U0x%lPu1l5ABN)?EEJ=`I~Lr2r(D9V72z`mg+;oE=1oB}8D&lz7o4e9p|=S1|Az zg_@&My~_ptFFANF<#0^NcaFp4L@SwTY3&r#Pop`PnadoVG}ceNqc1+d-AG}C3MK}r zTpyfkPN+E|en!y1@bUp)={JDlff&S*a{FKB?FyTauu4}sr?YB_GI3tE(%`1OF8IGx z|KreE80tB+koj^vC-P}0jB^1 z;@GMQnUsnmZB)){H@gk(7NH->%+`Z3&#C4Ggf0Lj5Bd>ho6#n|7PZ><6w{U>r)%Bk z46Plvz>5u-qSTJI))`UkuvOKkG_FX>q%N0p@d~c0w+rLM1U=rXIaY*GoAqVe4{C?)n7ET&4r+R^nW%q_ ze~l0#^Hm*6wMTV>9p~f2ceDNaPTHWdz7!%5w2U_Jg)7})`D9EO`w$5k-r%KxXZ;dBCF(B*-(*8afZ%Y25JQ)1^*c5%8_EogO zU{${l!~K@xn=ALSB6|As6XB~?haNBhWYtu1m*Fv8&fY*-CUV^JdrMrHa5?Ny8E%QK zxk5LAp9M>t@-@hHjv$DVVbTJq4zW)Rm?nA+Z&n}fUJQ}54)O4%9D%+iF|R3or^<|( z=4%GT({*!&qvZupR4L@2E(jPOwslSCY5rM(Bdy)LEwQ#3LtUekAIF> zdnkPOCn2+_*%|52dI z$uFEy_LIbY$XlrLC#hgCW;IJP{=i^prHkn!z=j%y zy$R~uY?-t5Ws2%DULd?%O2RE|Y(bPU&WrL)G2NG>)76XKXY6lAxb5q)&1uzW$Jz3K zmh55}Z_G77@amO=pjg4kd)_z8G>Lg)*28*LoZMMP7Qraa_nxX%{zZ!n#$w^0eAM^? zED^~|-U8E9Lk}k3skUwt?v+O5k3H9tw54m;kMnz=K|{P~p1i$4trbK-7|t3bx+>3D zjR*phe(gqAh94}d9DtMthtL*-fFFsR@+-@R3A%qZ-dN;AJW`26h_`*==8m;+RGc)St<8P5+4~|q zDlghb5nnoc-!Y|+*Zv!o7>J}zSE|}lTILxVmhC4N8bHO29` z0wLLDgj@RX^Q*5)H{9ZDKp^dw z+39FNjN=m}CpBarIj~C9>;>4eYp>hE8%>6zn1f}_RrzrbZ=lM^_r^&H!LqL-YfhT0 zRLK&{OEf{Du;Z|L(?@{8OYA!?!FojOi;j5^%=a)kZ=dG?q=V5>2@D#bQbpq_LOcX$ z3NVWOGwgt6b!W*AP(!t0q1TJLqvSp0^C&>8%zlYS$G7{V8S%OIo))xsCus-8u%uetV>@iSq!wW*xi%fFEAMXc0cBuaZWN?y`eAtQ`z-T6gS0;EJVoO2+ zZQ{(YOm36t5%gwX@1};<#AwAE0qdc@*;tqg7=&=@6D7q>Qm^A91}ccr`?Ek02uwB&duH*KvOkpp5Qn4uo0=z*CmCVN)z)g4m&LqpLLb}j!SOrO0K158gEBDjR!@kk14BHZ zVX~wI#K6c`I8VF!-Lwqs?iF*Y3Gqr=d&?Q4z*y(o=qKTEf@wt3l0y(h=MM6qH<6uY z?}_v+e1cv6Syw8xIiOuNoy9xsJ7gu=>i)auh5V!t6#^Z?vQPE=rTA_X5ik-J>)Pr@ zW;${T`8De_s}L&XS8F2Qo052s(SQkO&l$m_NFQ0&M*O=AswlA-<`~8$PLVXn{A9X|V2FGB+0jkav}@ zJ(8O48};u+hT^LOfa2|lbVO7cxlh;$xE(DY34j7XH$ozucL_EOSVs6}yRJO(@nI(h zi?j0UE%+2xZoZh+V+s1;O0QySPk+U?X4@4rXLyzH13~@eeK7=wMh%7~3tkeD-UhHt zY@zy_^PPJhbHfJ_0YAC}3GfB5nEzx*X*f`f`sEcdRn z;C|lY4<{08Vo^Z^iL9qFfkHWS4>jFOkYPvKeG2n__uvh*VT(3e$zgDaQRe(Nf^Dh< z5QAB-qkV&M3K7B1X%pqHrQf(!=eJ@VDU759PNcg11;badwM;{3%#dh00)p%Vi5+lm zr~qC>7!=5jnS@-)_=pObNQu?|Dxr)Fh*gg}iwOJyLtEZvta87gwA`9E9hKuOM!G4b z>f`@_wgYjj_w`Xg|9~V1goYMJv z_ApFl+`nLOx$h^c4PGnsd4AIHt{Ui`1Z9b>y)y7CyLNoR&2z+AvqvPf1_oqMh&+8* zeotUC`6)0<$i75i^@yvvRvSe%k`XYeg?sHD_DdGhli zy{9Cq?kjZpUgR@RcoazG6U3D^4e0fB&@j9j<6}Z;-@)p%w5qKm>Mw{x5X@LFP1)pD zMrrsgX}`iKC;Ea!_2AbxmX8b{OE`>tJKY;7>Z$54ytiFdH9UAx=FWK25ng5XBt_Mn zv2fcjZ$9jifIbmO3;y;M)v(z%cVz+U7*q?Jx;jFQDQpy;Wv>rA#{Xp_`c8$@rDH%G z*0nw+qo7(L%@v%Ga(%2Z@XhhPSixIkf@t37s3%QNUNr(}<7Ji0znPITN1UOH3Vm$y zb>F4YX6>PN6%HdCFOuDd2C&?+x$#y-SYot>9@$_+=y6WTffS`VdZ)FpFzhrcHX)3( zYUDCBsr^yAmBi=YPO>St$DJ}1;wEy^WM$$+4e0pZys6Z1T%H)LYla51b1vfajHP+0 z*xFaB+pqdVcy?0?w|FRcH=Wy`zE`sO9+EntR#EaX&zGwu!(cFs_PHA zNe;47Pf<9_VX5o<%B8->kKr_YE>+hSQJbK-Z}6x=;DI=ttl6WKysw-VGu@TWiE0hx zwm3k2uP5q%xk>y(e;auS!(CK-i+1`_o4`<2^u($t&LC1SVxt@{x-MfigcIADQbg)> zu~&3)6Tc?l;xV);vyYYV3}lj`=8a+zZOduJ12NQ+B&&IK$YG&4@o4qfZ$=s``aEZ2 z5uH9ky6#Zzw)`1?-bD#V5;4vtY=0cZ^x7>h^#zKTvF-F)sd%Ir)RVSUJut-qx*6Xu zoeg9SE?9Pwne~l|_5C?Gj)thNdo2Z8kzC9zCx(074E$xypqZkCY(N+g@b$j0uJ;!% zzi(0am#;~OGZ-14RGM@SazO0P-y!pH_j??{NaSFYb*b?XbKHUDk+{;^O zpl6bPqIt$ZiE72P=np)6)k|%)8+BCVD_aAC?k#1CKK^PY14tjKGP!rt$%??sWo^99 zBD_`=)vhe1B2p!2`9U>LASLza`k+o2)Fv?hFceWN}ZDnHJ*+oXzvE zxOk&n-v_gVbFJE}!It|vO`nG}RBzFynV0$)Ymczcz@j+uRwFuO}|fh|Ejz8 z)N*p!u^W=CnPwagk4q>Yh1QbaRsOKHYb>Zwzr@R`HyPop7wP>V7`xL)A_0@;zw`cL z*{6gsGs7JDU;cm6SL9I-_|P?~sCihU0bh_d$nn+z|9c%m*j^3_LGmQyhb z96rT#GwWYAN}x&SjBNRtAH+1D8XjU52IrP{4$(4`N_dRNaeO1A;C`J^AdDsKUJiM{ za`c&igps1_83f#u7*58O`3#x+fbo`ga6zhk8FMNfgX$#(kx)l)vFEaK=wMu_pUw3P z`zS0?6bQAQh@Ek8a|u`N`A?JiNTR{kly|+frA;_TuNSvYf}YR~$BINf%QnL0d=Fbq zj`AEz?`G1MNpuq{&xii2`hRQ9d8c58z z@HP;8iaMYpeR%=X0?$MXwC<1Ol7ABMiFqFZrX(y;M=vUT4r3KK67W@);>h&Jz?5vg ziG&KsjJCd55t=^@tfEx~nI{k;oZOa;!ZM-yzi4SFresY$3tWi8m>(=f)<&|1WLd&~uh98ydO0L3|`K8!M;GJh=-s;1MPg~qei(|L3TzIUL z9JXtU(@t$DuH*@tMm31BCkEAStWmt0mIw1rYNKdL7Kudq^N;Ki zO@k;8#aXT#=I$EO$_P(?dJu1|>ZW6oojT3@SLa;KFilD6bmh{M$I}Ycz(~huBo_*Q z0GG>oI&|>rex1lIyF(FbHczOB`<4ad$mgf7)tzEFHa1fUrKCh_JeR=^10)$V;$msY z=2kCxCtLGYY+3gJLWam4Uu;;s&LuZdi-Sm#KUJD8&^geAV?-Q6GRuJ4<&RT(xA|~) ze-~I*zM@yVEP7?}1H@}D;17l1rAL_*lrF)L+V?u_hb?rbTQpLg78+&ovk93^H5mZ9 zWuDR+wYv6Ff|_SiwBCYBq!C$VUs?CsBt8Xzej%*fW@DAUac8o9&FRI;1}FkaR%OmT z7=0le_35NUlMZoDNvS63O~9e2SA)2E5#Gh40&rJN+@`mv>ahFkk&Xt~)Ev@gR*{4f zy)unayhCq;-|A1tRz=tPoWpixOo=^Zd&YQ(L=%Cp2}2PNf9RNfm^7{XU_U(#)In?l z{6jmM@@T+O`0|Oc-dO`R8|_idgCC85t}i$cf>6$Q7TQwCJ4(aYfV=r8_amOS0kV4c!@~M59>2qH#XAqXsty zJY%z&2}2F6qV()2(NL!8g5sV#2)pg8_bHm`A90Z~%;Hv_Z@}v!EG`Dqw+*(0+-(6n*oq}I)6mY+-eOJ;auDZw*W75aYQl&enwuNp zejPWM2EqD`)?Yo4%LF-#-La=R6dOrjA1Gq!hJ2wb1!D1=9`j_jXYR8;=))&|G1VC4 zM{*Yr@(XWgW`LDbjWbvumTq&Jz;y~XmrS%eLG1)%*yW#=U`Qj}v1+wx-#*or6KlwS zA~z@wW~h9F(XzR>7HizD=t`B-v_}gGlQ|G>PuO2|IEq$~RTF;WM^p)uqx^10Pt$aA zQOV~v?b9_J^ar5BYE6zW0ibX)?N*2fd#W*`^iJztR3x=2t>DNoUli9A7l;wSFtml%GE}1)>9{}qcdO($x5}ECO`$au{ z?u{URUW&|n{-)EOj;e#12SYerFQ>$cu$7nb%>DqfnH5?n#@@cVS1Z&R!I=>^C}E~3 zI0FH;ow1ga=6RvHzM^%&zg1N~cz6cHK9LZlYUub1+Nr5!c>Ve-NAY3bayHVV@21S& z5go|_C}DV)Zm2)RObXBu_&)I$!a2cWQW@bqs^8^YfWm-qjy~(!W+bP0>s~ z7D-`JIzMB%?Xtftbe_2EL`udo?}lam!|#?X4}musj>GFiDr5Oue*4%sZ_~UH0gNmw zzwfYk95&IYqmJJXCwJ8Zz90Q>tm(h*y#Ha@pGKrttEs$tf0>}n+3%Z8C3Z_}G*xOs zmhC6S%5?y-=3?S;~m z7i$&HVSU>g94QXNH;lzROFHF|;!CHA_2jp+J`>2LO+GKb6y1#l%;CkD+|UEU^)EjM zw|$>43i~*If4P3||9HjPhHnb-CjBF#S%XK;`K+y~u4_0q9?vk6x!Kt@p}@+M#BpY` zZnJhM&ZxHyi1^0hlk=BfCP39jfblf0k0{G7v1C5mZ#{*3*`(P(15YN)S+G=)LA$J) zf&{)SJ>t|T>?Wbip?K-!rK|7zpY58)^aP?iZoTwE*TTzq*2|_Tixa$x2$O8+^e1?n z6KOWNCxkF|p5dnEv3IS%q(nKdO*xi0}>J%a7!#HI{NUp(X;@ z4e)%W{m4|*&j$vx*k{$|3}BabiRv6*lfsoAo=?8KmPDKADiTfDexq`%Qk*~7cxQE? z+~Zp*T%CnQd}?i{^NBDfT1Ieu=B{07!reyHV0Ky_SB#BT%Ab&Et_NdrRShaS)Z;fl ze+?H@^3qPQs;x1%1h@{Jp(e-;w8j@F(}Y!oq-`K9uR&KlR*?IY$x}G#L|8*1LxKde z7htPZDfS_6x8oZ2~;Tc%Ri*lsjfjiT2FOQ0=$2BwTFc%e4 zl(As}bg)ZjoC8SwKBwMl=n?&xkGsLisZ4!Fk=TN7*ZBiy$ySFT&nEqZ-_@Wl5RU;L z@WF4_mBrcQy?b1|zK^`nd3mLtC??rRk}7fGyVcDLP1|loQIX=7QcMV(Z+dEuq6^w;*6-c`3g^WUqI^(ouqa5&;J3PZ4PcgS zo#;`4CF0?CdpU76#z1*FR??~ySw#uW9K&ffTtV65h(Sj@P_j^J4=hEE1Ph2*B#mf{mcRGQj8b)FN&~rOvcQjf|F_it{wXIif1p!8(vEQ7m^}po!_B3I zc5^~smNv_e@IJ1UN!cuKq+G4t7a(7f-ThDwwz zbcC!e){_3Tt%BUZI!8Pveua2 zVykvssV@B&JL%CQm;qZ!-WD+ z^8XuRd3?jrY4SG)6z3#+5YjYxPe$N}V5Owx%O6fmn{rnX5ptN$&=I!1LGYU2O2yvw zK*<>J6~hd_v|CcONR`6&98>=vz(8vbvyUY{4vr38!~m6H^}u%GMXoTUDnzjB;XL2w zia4a4`knc1uu;T8@`%ZOfHxJ{9j~sAYd7RG1IfMeI(kIg>pn1iom|R1^(?R)fy>IQ z$RGD;UDfh?1TFqb9Vm#L8@l$t(H4Y}jEc0n|i%a>Kk7Hy65^mOLMe*g{* z35+mng%|A_a#iQ@*z=HQ7#XZzo2NeUB4z|Wo={~9zGA#ED zb%82_DuIIGbNY4=9GW!qBRt@1CD#L=oD@G7QT?2hUdNq2mb>Sr5o+}emP|^?Kr99Bh2EWyI>M?*JOGA%<9NKt7}4Yc0=Y;nz4F-fyRg~!Db=hJ()a0egik-d zgUJ)blBuC#^aa>yC5pCpfVFi&UR~FhdL7HNV z4}Q3e6V=oF-YG~&t*dw~+cv$lYWK3n?6%pmrGnbyHg|g_79I0mMJ+2?ANrl~{XqX^ z!C=Yx$jsD));*0;~GdgOOW8_LqIXa!|ps zA1+g|7y#nc=aY?;>kOP_Hwry^*qv^2~1B~+i)^6=}z0whVTl(1@HLpJYFwcrJ2Mm`+yrJP2 zp{5%(-~o$B_7{hXqRdjbi{jG_wKA@LD6Q0=yI%Zo&ultlbg2IOk2%MeQR|0#q_x91 zf_OTj<2J4#D!IEK{O2*md7I~@e5?ahPHWS>TksjG6tIm=X8y2`Ky9QIBtdnM0hOA; z>A=7|7d(mtx0+lN^1L3!Q4;LvnRGIqTb#edyq1W& z)y|2V6s&{Pbgq`SeWrBa<|f6&>Vs|;J(M3I$}OPF zQT$`liz64LR)pufl+;8y%um68w0vQ{*>@7_2!kcz#TBCOBA zi@1{$QUF)6qqneI2bcH#H0^QU{n}a%TbO>P-FGbAD{n`7+&et>_q^o3DwcYJDyvb@ z4!DIsiH;lP!i)l%K#uTR8NP7J6aOR;8n=E?Gm~E$8mcz;7FCt)?B+6S*C9b(FW(S1ZxNcx-A_qBKX$0HX9?=q~mHum{<|vfS z4|qsT=u53rDlN0y11>iy@^StLPs<0-o}O1yO0mz{>Na zSKpU80uNGt83;wR4%=4nzGObbmKl&|mhtXZ`1lm@JcbF0Em4_O7%TMOX1vzL zrevD*1vWhuH=Bn3C&b~d$j#1$^Xy0|1nZrFYERtADx}HsS@>~dCAOxJ+IK2(Zlmr< zqDYiSmscA}EANxnN=j9o%+y!<23)i{DmC=+BS*jfAM)Nas;Nb7+f5*W&;x|tLhn_Y zAdt{Ip?B#>7m%hDL+`yKXy_g3U8HxF4$`EFAV^VAKwur#yZ2u1Gsb()IN$H{7edI) zn3*H2B(_V)U_|}&}SwhSG4{#w<5oEdfib( z%Ij1D9wd0+GsP6fY#U+bDp|t82Jw0z(bxs9 zTXw2~JHbr5|EomD!Q^{MKK-=-vF%h$cgob%-^)cq5N7IXLJSkyBH($4P=ne7{kuSICG8j6A`#A16c zHQ7ANm{(FMm25JwVGrHaZdh*Md5|UX*YOGzvKw742d;K=d8W~TvSQ($po#oGlvx#ByJPSRuxAvXO(p;M-hnS65R9ah_O4iZ zSiPT;T(yzt7_Cd8BQJ-ShIpc!hjKTzzOi3*^gZ#~4=$}6fR{)asfW$e4(mJBRDE)M<6^23#dha~b8-?+1+^RM# z`eB-aJb`U%Poo_YaBjtdqALGj5rv8r9>BX>t|%=Vo3v<)58bN6pwoGX6Wy>gCM`vYdrb#5D{Xn~U}>`_uy zS;Dsd2j#H4%9CIH9qvM48jr}G1j8E>pK3B;D;kQYD%~#?CWR-v$Ii@KDs(4%s<6AL zH#@0sG)mTm8o&(;YdxsBqvAyCBN%WR#F#1(lpo%Q*M;yQRq#0709|xWf}0ZDeI3ub zaMJ=~6e^wxK-oK`PoopAFS3NF$p%-1&sT(L|x*heVc} zI(8XzF$E%Z=;Y0i?ipfCqF%$T$~^Ld`C&MMsk#68A(a#5(jF>k`<3OKp(>Ul#ZWfR zD*h{i)>vk_Pf!1aFF{7p!Vz@7pPuaEJ$m>Tz@}fV=H8UOGpC!vSVHfznX4}?h)OR6 zi?O(&1B{-dY$EdsA_ed?*Oga1f^=I$zs~ILUJjN+{FNLQ>hV8-^mt)ng)C-X&;mHRObPYZcCbJ9Wi^C&n2e9Iv zB#vpdLV#@A)tShu0Qn=r@UD68(^G9F{bw}+zXVebOt%|~0ytI=ijN(l98d&4o=AGF zNBzYuf)k21))aa~T_Hy84&O9+8}GKRp5XPth_u5-Bk&)=DK^!J(e9S18^IK!{1L^U z5_GG>*7BWI%oR@LZW}A7{h-+aa1uANK4zTd*&13W2Ju!+A;w|1w_|kkHIOsnZ^9o` z+Ec(j?l;t~3+fmwDDOP>r`~V#T~AmMU{Y6KF39ZV0^0J8t0hc9H@v?9T(tT{a~OzI ztfkLqo>$vRd;uhac^A%LWhL5P(cQi?eK+z^(B*FD#@ea@q7rD#9{jGL@qwZhE1LIh zk;EOM^UHRRx1X5v5FUNGvcVZ$p+E|iJ4xrD=T+!J9=!nLtUGJ4pL){7tYUixMhbs` zZ2+sf2zI7>Pc!bJsE+XX^4v_n?;MD7)z_Q<$zxbivg>o&vYQ)fR-`3=6ib7tSxH!i z1IYq4%!0Ziif3-|!@bKrT2J*=SRDt2W@l~lG$2OCG~Nyp+l;^utp&awWJDSJ05KOS zwbd%KYkKtvjOeUrS3lh>#^l@j zAL2*a>+dK{K7B+S(O(#(zyd41d3#MYgHMA5R zfLj$e%5HpxozG(D#6_;WGm@?+R&f_QoB{Yl8WMSR^gpIe-n=UDPIKP7ER~^a`O>j! zrp>#gFnt)})1j9>4#g&rB*#wiGOF42JYQ9^Z4^_5@tDZfATm&{IL`n}jE>j+E+1jN zfZv(DFC{{Mw`N%OJ!f6dAuECYE`uC+bdT$`PE_DiSZPlynY%zqDPsAiifot#xw7KAIGHYS*=90pGD|pz z6&^Ti*nX%{W|=_lLu*!FvUzO5HE4o&wZt5^_)=ck`yRZ-B{54KX&dITNN#Q=5-R>jaNeE-{0K&(n}6o?)R_l6{E!MWq~Chq?i z1ucdrZ%UeTAxNG>YA-O|IM#XX^Rpolt`i({SmBq>5uyi<$` zIQEpoR(l~esR?!$!Lck@#-}GCns!CM;vU=yS5lkhWw_-B{plo@$bbUZ1`DZTrk)A*%YIXAsGOL)19G5Df&xXzhzeC5h`Z$=cfl_5o_w7DMp{HziB zV}O;tCQ+v@S5K*4NzW6iUhfSEnnhY=ooM?#rsRCa7WuJeTH99svN#@)eDjvth6j~o zVDfo~D7H}C)RO|G@*<@cA3Xs2;;IQPET-J zu+4BPMtt-2j#|i90`tpiv97~TS^y8oyqEa+m$<$HJf+X;*`RsR(vsw!Qb{ zHz{^*j2z_H>-wgX87kfU%wxN7#Wrdkh=iPtcehiZP$!kkW69LQ6NLw?M4>01Df)rx zVvA(wOkwvaXY@=bTfHHVRK1z4={8z6|dtuZ{=Zmbi4j zceONcJ(dJVzd4*$#qw?_!KU(k9m=joGY$ZuX_Z|?HCJ~SbkNJ)i7Pr&B8GR3&SdW-uk? z>fM*0gRTnoQ~=digJbXpF%s&Ww^*erh+hgB)ZZbg4{TjeE+14`OrQO?#V+Vy|M+S> z-80uj^^Ys1FeR{hqEOqdp#I)gnmqcu*>&}Nbpi@-^=edQjCdmk=>@2Kv_Pq z+f`E5rXGv8_V1<)J`ct|8YusCMJjk$<=W!^q)EA{_c3DTcKCO|ldF{TLHB^_zneP( zbXPhQ~axK`F^TX zlF1MdBZjqlPr!?+{lXQ1qPK=SD?*i%rYP}-w3&#>fhBAl>DUiq!R>oE#KpU2Ju{HA~EI&?|ZVwNiv%jf$e4>wV4`o}m{sUhNdk3@NB0gD3p_ zUdF1!6Do6|XFIqP9?JS;;d3Rb1~H*rQ9}690dFWz>!I2Mu>l99-#tTL1-H%jRbGEq ztwBSDYae;ptCb>6b8w0j6o=d>UJQo?M=)=OvkoF-{%5DT;{DYjBW1)Q{hGS_Qv)1) zmgEWg&hY4GEY5~!0|87%K?NoOi#c{nImZkZI7)f#Zz%ZRqpj~MR1*cvB-<#n=MU9iI1|jUK4*dVB5B^T>1J~83^x0S zM&{F6!c8IS(RiUC^22NC<^d-SfHVU!-Jx3!;y8TApqbsN2Jw;ajPl@iZmpPx*T}K52Xv;t z`lzcEso)}|{RrSbinsyB$j2QYx1t|bU&uG4$|CvxZV_EvjZ&xww!7tf)tSU_QnNn@ z8twh^EYS@mZb@U_t?Sx|EdF`@`C+tLUAp7Xu3^(y_cO(ox3b%)ODj*P$AbIMTUn89 zR=m9xiGv@}5N-&71FcG%Ge%nDB7S3H}kAWw;0*I=AdnM3z#3Y2;7Wj@g0wiJ~Kv;5| zwVlnkQS>|7D>-mlkubc_p7Q{w7HsR|5E{98jwZ6*tRSEM-1vm{b4-|5nEuG5%P?^Q z3ba}5SE*%Oh`^lH5ijcr==00OjM(VzEA%mvEP_VdT zLf07CXro?g^3Dn^v*Lx9ftUPX!d?X1g40*IP1R3YrR%%|iag?Q_b%zK3ma>thch}h zb+2&9WU?RjM-or`x_520y`?Q8yFx6|64A#@nfbNagH4q7UOm{R=YY^7&msmwuKML; zYkSyk3b?4H`_E>$xHZG2C9cb<(CZm#M)791i)&F(H;+6_V3($qt_Z|(*K~;`!bvy; znmq0t^S?|~*Ppmui0YYTyD?il&-+#?Iq-bnL^eIgCxjtyBwL+T?|%Z2E8YKF%y1VR z(9!4uEHfWKQ&K|vh3YR+JVe#AYE8f2VeUQxP`r8WsD#Yr+jmYs2 z+Klq-t2+q!fB*b1fLZ-(VV;81UftiaeW!!ES4T=$SQpXl2`vN_R__chb^7sm^Xvie z*YbNg^uIE-U+oj1!3IK~>|@8sm%`m9BspFRNMz7a`ME_FYA5^S6HlrjIZsNACv zy?I#KoK$qgk~X9|lOwz4eyK<1I~QBnf$E#8++&d9${3yest?2s%SKGwL=Dr5wit?K zzO-ur4>Ix)Xfi32sdgJP$|Oo^J4_SaFhZzH9_qL6&Xt7Ku1_df@oAKYzBo-`^j)_2 zXHR>8tWRA9@;SjQ!JP7h$&q#~4Zy9+-32vrFgfz}(qu?BiGsW(veCfyWD(lSv(5M2 z;l6s+O1wZAkQ70#(=@!xW_A+wT~A)CR9M#}Om(77UfQ~;+EdxF*NW80@lcl3l#t8e zFMy;9E>wdSD-I$>`T2|Uxq^}O?PZb-cG1D~AdS+tun7Vp20d%;a!z6J-P9^5g)s_= zU&Kdj#;cLydH*x+&iTnicGOOgbl&s?_`(Wd2}b4f??If?xg_&F9>Up@?vc6nBftBk?S3eqLq_z^`b`nYW4I%j#Wq zAsTYdx2&}wSJ$ngM9-f2%p3h@D!%~;apI(`M0~4F@j%jWiB`BFXBBLcqi4}%!g!4h zDP-;)lv2m5^Qvuf@kQe!k@RS z{Xb?8+)Sgv`&HROuG)e)7piuwwxVnDUIv!=+H6yyC zJ4=^~hMT8EutsB|vKA;s+HZEE!-kCvFPG%0IrPcoUr=BoDF?9Gk~`SMT9>k--@V50 zih11SY}gLqw633A@4s+|r-AYT6l%{{h(|vK`EZ${XKkGxZ#YgpPUk>}_TkmqAQf1j zxVsiP5rIeQFS31mE&OX=c$72xvcJtx z+5nDdKI_ zuNZlp`UaCqJYA~Od(U+b|D8G7%%GQD=rPBqk^U~RWY9*(Dt1YPIbI&Dn1nO{IzWbA zzps0w zg`2?ta@n9X3d1HU0@*)khqb?Ho&p3gi(NFQ?20U*`5F8c{xB0#BZf`lu%?^@ydy}3 zDVvomDw$eIn+=~+zlr`}MXlgss0dA1S-t#mnaQP~fyp0T3yXl^!~n&6ggas>yP3N) zQqtY8+W1Z!bnA!~c4W)x8xmK!honVw6_0>&bXu5MibfbK*(*-0XEt=@Ae$$K+17#2 zYksckLYRMKZZQcPNN5?2l+iw;RwF?X{G7b02?(s4>odW6dVwEg2X-)9-othjvhi?c z{;B|}1Pc>;L#sm(67ZzhCmA&}L9quZUyd9gkU7;R;Du5^*{e{Kv#j(jHWEnjEX0EbMEms#E9@ zJ(g)GuXi3+w#fh>zsk}Sg@beBhWm23OcDyp&6`ZT^qVX1)gvkEp1vBPEO@? zW~EQYsS?kxoz{;J_zyI_<=7x7@C}YDTm{Y-^Glv|;4tfh_ADSTwwXDu=f*`65kZWH zi})~2D5{lIm-?ms@C%fJv}#B9>(+-Xf;l9D(eh(<4YN-Sv;<-F0~I<*-0A|ofTnP_ z;z6n!0U+zrcvmG}(j@=@SmVgtY(|e8bke&w#tcD^k{c{<5?0csdqhIljJigGrUd-( zgvF*SE&eM#`-7m+I&EP8-heel@D1R!zvdd867-((lrn1Hk4AU$qeensLvtuN9l8JQ zLkjGeBnBYM9EZN^%7P>C!M^CsZ{c;!T*@u}y%P)2PDO|woHqauR6713R|_T<*|{=$ zCZlRY0WTx}UDU!J2>tuD9#N|ek6sQMzE2Drv_CkJ;`R2pCv_ot)-$tclcLAK%Z_wO zwBxN4yToO;L;1~GKlmwD{VuL$rjGgPQ9c5J&wY@(E;?Go$R3k}#V;)RyH`_;3_mJG zBMr@ej6W4`OYTAT5O1;95&{Rk`et45rAXl$YM5-1A}PNyD7u~cHy$M7a{QDecQW=T zJQ%HdG%Gwm1#e&?62U3rRxpe3HV1=uocx zN%A|aIU5mGi@E2gz07{l5+ENrg!>mDMc>P*@!RD%>f4~w!xx8f?`;1$&$6&T*qL=N zRa^3Gy`t_jHEQhyd`ud1poC)xhpQ@^p)>@w2b6-;I7t=@R>YKEFjjq64!9nVN zHav0fu=BJ+#jR=rtB6%;pjc+tb^gt-UL%wj{CeloF_yC54elXsp`+ZynQ537<%WzA z4N(Ytjy}Hj)}Ifp|L|b;_#gp7ur<=@k#pQygjucKEF^x{*aqA+c%6zp-=lDZrwc%_ zi@|9iPJvRZCeBRl1?Em!V_)7z5u*~WKucV&&`SS6DNa7PA3NQ?CSxY&rFk+pD#`_q zju=L7`Dd`U4pKZNc-)0hmD+@2;dbsrICruNELlHz{&|7RygaRDls%+TEfE8UYxeN; zC(aj)^^5l@cE&P$6yAoc#s>D5B*pbqk?TIl_5>{hRwA;)d{3z4AwUiwD93F<^0B}JF zEGb6;xw#VEd#_|Eyzu}JETe#v%VtxbyL3$+TZIYWDEu23^Iw;d|Ag?G|Hv8SHG`U7 zk}F25eQB5NqD9-!!d}^U<%o-?z#E-pWIDcM6>OdYa0l-e5Jkk0Uz^h+cZUCI=7;?0 z`lp@dj)OEA$gGJXK)Ju(L49pALK`4iKw4{_NN`l9Zj=ByiKN11P#trom;X$PsO)yr z55<TVV{eNC*alF(9LL@I=6q&qcvn-f|25FK`)kW`QF}uZ=tIF8adGn5?^9G>} zsXyyotItZ&jD=E7EnN8xZR{ElvYF2!`{?nRR!(Ui9YjR<@*SbJotuaiz0Q9T(+e#+{0?e zyGG=M;jcjAHL~>IpY=YT@mZJ@J1(e)4mG>YtMG#B)#lxl(scZV6CE5vZHyv9KLNY% z59f&CAI6_`s-h8!AQX0eV7%+z36CD5OWOzU>i9g;89GudT*C%@)u&aTWQGt8O{+>ys-bVP(0JqG zS#we}0s=z)U_vwVnb@JhAZ$!nHgg3E*2;iibc7h|d$^!sDC=WPD4v8F{fRLj zfHda23lmnI0WCnca7`rGJwmB;g8R!eYl(d+S4Y}k@0TF9%i=D@nPE$8Ut3wmIJzAF(7oh=8)?t1~>mFz-=a*OwJ9vb|5-1&oef|_VBPjz#eeecpu`1RwWbFN}t z`Ln*<``|3^tOEqP;}PC4j)4-o1M zad1*!o$x5v4gJV6b}6__EJf$LSwz8QGtzg`L5#u4TQPZ8`XBuD?bH73TlOyBif-F zttX6qJK$0p(zB_9lQ3=4_zd*l4gr1Bz-qFo`{8!x)nXP)c4dj0TK<&kW;1vo_@|N0 zJm~Z@RfJ*_=H)i#+G}63f=eoN{B%PjgqADm#Y5$yzEjBOH)*d3qb=H-0kl8IzZIYS z-V_aNB^@lNOv+!5TELlAu)paAVBwI<6Wdp~_Ug$qM;g7y5Jn9s_ddh4VRYm}L)xNT zPB4@#2nAdf;q7P+b*=A3OXViB&<=yH#v(AoRi7yF#HeVpf6dG>%nfU4!lSKy zYA$AX!pC%0-helS7>M4|n<1$&ViukxLfJ`fYv)A${-1n32h1_d%3Xe)ClX#OVzioW*oX$7?D?@+{u~#(?-7aKiqU2&SU-npM~OBEoxp zOeadA&cX~p6zJeLeGz<;C$j?C(w-a9c2{u4b}noT*#H2s@d|N848%6LnW6pFk5D)Y zHpSL5sAyeoR|T1gvYA?%9ePWC`;SV_y(gM{5`_P>3p^3CeAImyxpaM!8LNTR;pQ8l zuk|+=KfAu7uAfv%R*8|qz@f@})^lKalzWGD`=6Bj&f?IyXj&ib9KihPoBe+NPGv3C zZ=H@=dNQiN08KG>(Z|<=_kzyc0D*LW5cRivU)8vAoQH>zrQq6`U`6DBa{)c-BV=Yu z1_iy3R}&!k5+w$1&G_;wHKZG6 zWz~QCqeHP=ve7SRB%zb}))FI8B5bOA@WcV9=NwO2jpE%``U+${*&Do9C?D7{ z3g?f#=eEX@!pBGH!^bbQs+`yjZCyzfdcyt1Hd-$ve?@$#Rc$6;Gy#RdwB=qF05k)#sEh=IMiellu}T4Y z-Q4;(s2Ad~E7{nT%d^yTL;XR?!xWuQK8MA83K8jP7rev}+U_Sz0R2ISstWRl%4~x( z*6Qvj5&q|4k+DpX&M{M&z8O@_W=;5jqa)T=qHMwf6CoshXOQ0#5GIhHdomk5gRaPa6=6ltz(Z4l?KC|JOSD*t^9D+FJMailf#G;gnzv!(HaehoD z*G*q!VW6LRXSc2BGKTU)$K`Q*QL9z)HXiI*KE|<~hvJ_yIa={RJztSO-@d8&kC~f= z76?}YZr=(Ea!_-uw7!$$d{4oMAPP8&^;&WB)x9%}5a(<~^)*WnRc0%t-{eadBYaYt-M&pOrZ4+@DlkW}Uk(a)Sk7gX$?P^H%Gup*5 zR`!2CUBrqhXpMV6Yzr$T5JPr8ImeAQ6jFq|&cVIu zYqWf5`(DfJS6d${;VJXs)aFIXoT`;4(XuPkMIb;*KMV-yEY-Ju`C?~iHH?`c zm=ssF{RtMNpC1;q{rc?)Rz~)cw%WrDDT~&lqnwla3?H-oS%5=;iTpF#zznwA;t6j$ z$(hEkpGkxG#f>kXuI-#zYYCMIia$&c2@dA$u#k=Y#Eoivn=Jcw$Et?w^haPkh(bZo zOC;C0883bMND{{ZjOO}EmDog_O#;OJ$(sF+&+}uD{3YlYlVKSf@r}W})Gl*hzFuX$ zj@EbEBP2AkCnmha;twfC&atPsG|VS@I8|^*ea9ci^N-fZyzhylU<6K9w<@%poH7_rz+aT3ScS2@s&h|Li1d-f`q!g zqbgiuA`Huw@(5u zcH-pdg6=%aP5uNYAwP%33fo8fpI}(?9mAfHqH_n& zF%JMZNtD!>sM5Ok_HPd~LR8Ww6rmT<7WKy}9m;C~3gb+fbq*S!&E&jO>qspEZ=-u8 z4)tI#6~(Mgy%T`^m#%)U%c0A*B0IHtQS#0Z%ZL5VNZMWkB@S~YwC=O1xkakhdjiH}TF3{DpKy>-#z=PYGoQ{OQ0UJfDdHorasNxW|< zOG=Ue;*NXntjWl-_WZs*eua&l+!f(qm>EkRt)39&yZXGCBzCd}?-vl!&-5x^#Cj@! z7l&Xf_`Gc^6Uo(j0Qc4w|6{O_3m0X4MQ(j6m^Gdjj!9AcPU|k1leFC$3knOJUTCS#cn~^l05XVpI7?nlM@E1T>fd}Z6r$X;=HkVB}*17y&R_x-IHilBc`q$g|o=Wxh zA6LIIQS{Q%3-w~S<;@3Z+l@xhFenkj0j+@#8RVscR_PC3E7_mw{Vw24VbRTVRWcKt z!Z>%q%3kL31G|PHQ@eUBRv=mN@lE6Z*JZI+e*tVav%+-vj|414BOOG2fXbQuvUzxr z1rl8sCS3keW0Ch{VWIkB>jKLUcfkdIf7QU2RCzQLsQ% zFv0Qm^W2j|Cj!0cJdulG0Vf+k9|xTf-6&g_;&-yv>`8Hk=h3*`QS134NP0JE2Z00M zZqfIpuw&9+tlOa#EPO)s^7QnAZ?jYtv731?6NwMx=bwS!EQWT(;wAx$bCidHVH7&O(0)YVhB(m3V7@;dAEZF`UW>; zqrOQiPwnSr#JUK!Ghnm52SSVKwHqF|t5dlIQXUS|;iQbm_4M@+qrfA zI-Esk)bC)+wr%~*s?ulyue#>(O}yDF^@h0eD>$7I>MQkkhGy=h@x&Ol8j-~)u#I7Q zieSzq)GV_4Q!VHf_2m1J1wuyI0x{uf`^+H(%Q9~{i9%5mqmVVPZW*n8p3=G-q*fq@ z8@CTn7+YoL$7!wCYWaDhpJs7COia9wQuC$gk_JTRwV})tPo3#tZL`CSJur4nA6BK z?!`#(69rC|2rXBXrKhOWM6Eop{fN0(0Fq5cAB|6A!`-9jbb#r}e7$dcIi zJxSEvkmc%jxpI(Qxbr-Q zU3U*LLm7$!VUPNm4G zcp=CmW}lD1kanT|r5rh98&3l3Br89yNM_bsZ5IM3nZ_{X2Ur~ymNjHy_u7Tzxrmkt zKtrhp+?8br^6J#;uNenV2B&QXygZBK zi({TvJthPhVrz+x({kv?hq|2kQ7qcrZ_BNhI}mqfg~p5hu_gRdtqHKf+t~AgmWKQV zIGSG;PHS;=d9k6RBr_b?X#f*1F4^_OS&bl>qUlu8_>rMY_4zp@1=NS-l$FI5BpeTv z7k0WAeIYVj)-l(97H|-l!JW2{tvqV>G?Y-G*(+2j@S>KD>kX;ldDkz|n!XZJ(N^i# z|5b9Z`lQKQMAK#!Frg{-7hpW)!d1q;{q6#xn(nf`p%_7R`<1VqQiP%x5C*1OoXGTp zuCu{Gda~SctO67RvsI8p@|@v!_bfSHmw)n2C2HpTn9MzIbKc0QdS zn0I%f8Va?_uI=ibHr$1Y>+Ez`cDRHFhG9ArIvT9A3O9q?7)UBFk{c%Lw{6Sj6{`Fr!XDWV-wx{11n^=d+$s!(()`3+ z0l)MPX=)I!^}z;;aH|ENb;y#B{Lb=e|U{Tg9G^H_J(XQoe+l^j-Ub`*}+E zcM&;Q^=xAAeB-r<8~DB9>r^Ay8ucY3w%+%i#>ox7aMM1j$^#99ffBohjEgKY!;_iq z3u-y;BQn-K?m2O^@w3}woe}k4dUu1e-N_=ybCwobapH!ll}eLn)d(LCSDKAkJUu>> zIc&jgRNIMCS}VcK`6XsA*(|#*2H)p3HNzQWB2)mu7+*a;g)I^j z&Y{lTsZ>QpES4=!#WaOH{X+4G54^n8ND_3j%hZQ%#nHJqCtAzL0-MvRTCt@w$f%YV z<`?pQ{1Mbr93($C{(`eCLt_(9MU|6jD^yd=P>v@WwB5d0dZ=OHx zexk&M>S$4{Ul+z^3PZ(tCk7G3F7cJiXM7Ips?sNO+eSHyBao}1(eiiSJ;694#?(1w z{D`cI)etSmk7UP$^TzQRB8+YviG1GF$EJpL`&)HO)9ts^)^5XzH!O`@4Zb+{iwaWK z3t+jzl}5An_gfzCJ&n0MbQJyQCyI&~5g}<%V%iw_h($_3Hvu^Y1?G#HUeROInR z;B`0-P(p%M>RKcH>;Ctr{zBxx=SN(1S9B;~p2<00o`VW=;TQuq&0Hb>n7-M1r@$IH z-dT+>S|$1X^?P!5CkcevPw;2tk;vc_jEh)pvJu7)qC8YcykT+NHXX0aN_h-|a;`5B zsVFsuP!h-#hG0%{ZF4x8>rm0EqKIz25 zk=boy#cxW8qZajDl~a%jdc>Jn?jvX{%JaUPdgUg6OeTuRtFZj%(424n-Sm#1PK)@E z{Ih(co05|iJ#AxapWO?-1{`e5og(sD0O?|@vBz6tNA3;Btv$?-03Dy2c`!_iMW!93 zDGKpWZZa&!j>(H^nJ4@CxSi-PfDZFY@pLUVL0NWfNKv1Lg6P`-S7`qD?9-({5 z+{`lje7%jXJ3dRG+K|W}i&GZ_ByI(Ne)3vxC+$~RSXYqb6Wr{qq3qBFSvUtNE z8>tt4nJ^OyRdL~D>dDN)EI4Z+QXSu#f#V((tC{QJ2fe}XEzT!?mtOtreaHd`NnP9l ze%Ds9HIu_TV7ePuxl@4cXqC`+{5&R&N>3vf-wmEadEwbFtYoF)Fd`uGqBP^r+(G*f zx0Cg?XOslR6!(gvL`9zR(t%8VUvV!%lP4g3^8Qf{Q#ojOzR5neK1A^*{kQdh?!v`Z z%sk89&ZLfdTE4u&K6!tA_4)53eci3STgAuA5bpM+U1Lit4L!qI#$*A{@~mrcxtFCS z$WU-8oYX$U!E++J6`!{04!9t=qIwm&$U;;m%dgWt^G1;}1O7|lXKtzD)~`$K#VCs( z7|cj*xklC2lbw^2>iNnzO>2D2h5X8CT&5e4awh2Rz1pNDcmiN)R2EM9=b#2?GGbO~ zpbS5VjXJ-gvP;a)f_B?*gz>xFWP*ON2$;|ChKw#uQYl^mSZRzUlZeT=rXupxNICFK zaM(a3@Y~ehNGCHFdfRXx+*Qe`B4(h!6O-GKgozrAYLv8U?6*yWB?#JG@Z7{q7~s9| z)quF-7l40D(JORJAcD6rylOQBO2(_CVDZ)QI*j;CiPZbIKOw;% zeo0zb-M^Ak#16qf#;V8m@H(2HNBQdV&vi7boKxzQVDXU66qw}WGO*pma@dr|gfmZ5ZA|r25X7yOH?_h1u}vN6F{5to8Uy$H zP4Nh534n6$`~{#B--xQvC1s~htmlMLHmhI1iug!w5@AbO$$Ra<^t2}%Kdn;hQ)oq+ zHKj@d?Oy;*AE&qgDDJ^;i+}sqUQVnWrr#Ec!&!CGVs#q+0#t4N$D!7`LLl*3q$uwm zLWy(=%HxI*PNX(7u_#3L41>S_@ zBpoR?n<bF>D2xDy*Q?Q9s=fhVOi$^+N(X)1S(fQaW^|+!Yzyuu=C)5K+Ppqcgy1 zzj*L1tA{<#O&S+`>Px1jRmY+h^PGMjFlbaJFndz>0OJBuPb%UC1mdEd0Gl@resOx_ zm?F;CsF$vQlWks(FX~iYQ7}UOws5B^55#hD)uWhRs0lyX!qr8wCdI1M6umh2HPTx2 zhCxPe-^P5SZ6xhx<4eqfiVyK#su-SppCPGv#}5Vbn$m73`-OlRP*R!(8U9V zgKpp<-jKR3aBwvcW!S)M;BLIJR6vPXzC27fkz@vYN9r3}CGI6yzH@igiM%yl`=SrY zqbcgwPFxMgk0(O_$$J(SLF2g)W(S*4!JK0whb2&SyuGmW;q&h-Xq|k*pLP$1Wz&AP zar>w-LV;?VEv;M09;L`B5V<8|HjWci_k?m64IrWxPkBM@AU#lYv^C!amN21kDXMsA zgT#pQNuyzX@(x;H><&rbRF7D8D-VArPdtTx`O_j^LcQox1eVcmsimG+9j;iuHwWyHVALH(AL$qBbPPDJH^$TmN+GWH+t7=)ra zw`=OUCmsHoe5{)TMbawEwkD6^v%3Zpxis9EdB-A{qTnxps4%#+cdvG2WtCYG?=sNv z4Y1>cEw@4`6MoDOSZ8Q=TE0|%V)AWQH|t+FMe~&3tNor#H`II3iUU1idSrC4@{RlA zMWLk6AY7iF{As&xZus%_(XZBKg(KG-`V&`rw%=4d)WvZF8d`w+L@Z)MKes`OB0O*O zDWiFw{BCFZEuIoe*Z5>r8Cz~NpWs{h(vG=dIThCUk5xy`H_^|P3Mr@X%TV8iO`?7n zb%6}}!RO>yh35Lu57k)ky7$b|Dg@T)56Onf`d^0~fFy8yP%&C@iXqCIKRzj;KK?ut zJED2E<5u^j$>?p|PE~7W43ZBhiKlgHlvUKvFRoJMKQ}m?K%qaL{*rWRd(=j(wV~;; z&CfRc+8o|{ej|+TCc$Tp08TJd4CthiWv($Qe&>`v`m0=}1Mev>2O6rCq$qqLzjp*RtK z_Deo*MD>_6r#ys2eCq}Y1MZv@Ee69Weq3!vdE_$VK7}t52)1w;ZQ!0;)~l*vHCU7G zMwU)!-NSp#eX7uEBHb=B7Ccf_pf`z=>leXa3I3zcm2QW3j}uISVWh`l{e&Bo42d@X%$4$Fv%RTAI#)COuw$N)-X6eWwm zTvDQZN!AEkVHd@^dWGqmA}ZoX_2%i+ImJzyz3z}4l9zRlltr2=@-}{KXgYP^H**39 zcRin-DLyby3k;u?J8jj~@U@=m;?f$MtZH)7GuXFtH%hI8Dv8CT=8Wz`&~B)*%}FF_ zSzB|lDs*8O_XULnPEHjqXsCSPw>&{_lqi4OL;$y>W(8TbNV>ghk@IQ1F07y3`w_)- z0fLkuE)dZU+*D-ZZs4xa&kti)Fd@|yaArWzVFOKYPVWY_++_8WWcH(}$xZGMfOw6F zfZB_VOj^pdq`M)Q(lYziWDva;MZ^#4A!bpEXgBfqfvH-LjwlhJmp0-HND1|4Atbte zGw(4`lye(t(yr437#^(fRWbK9=hWKj-}GLJq(8~eG=nVKUF%Cfmy(zGNIw2{QvVGe zQ}BPW^&VVJb^p3{5|R*lLhl3!y(3LfNa$U96OPwWe{aw#l^_yx7CsVvS7l< zH)`AJ^3tvs&?=E zjVr@@Cyx7F(k3tam)Y3TZp;1FQ4VlI)=%`ZW0>#mS_q0FinYc&hXcYruN$kHnV zGwo9x#PeT3QzK4!usUW-*(X|Gjk2)khk~!J&6rITwm%==J`u z+aHVSBz<6ID6gRs84>w}H~?b;5^cCW%tE>&z=|#*WJRRPJ=5wu!SCr$7#rilb32nuz3X-5w)p` zZ>VBoqJgE4RB~KiY72bfKGJx9EaDHD#4Zi6B?JgC31^M&%wqMAXuU*CTB@AD_rv|L zCF&SMXA}`u+QT0hbTg67@J^8sVo2w#JSBUWter)YDJ3-px0jkM&AR*Y`A+Wx<4yfn$^(f40QA;0 zx~+o)hElyeb|P5WwMoF=bd71r;dP6^c$kWXQpw9+BpqqAqU77dVw5I`yXkdcq~z@q z)ZzDfPioR9F6tfY4~iHLmM_%7weRo{WFu8Y&ru2&xiw2XH01zjc!EORV3NUTH5YR6XJ z?9}-#xkGUhjt_{DO}9;*9^1$yfG5?rLu5fb_n{V*p4m(B$~<1PKfh7}F*=6UPnI5g zkaL~hB*I93Qs7XY0{Zb0`Y_4g5gY|*Nquso)f@&Pw=SB4)^+XTExjS59+2yU)N!^n z&bC}gPN?2L0AC#3e(flF5WPMb)<^moa8O|{CO58X<#IrP1) zQeyM9*H{{L|M57ZHe(_TKuQY`N;~I&Sh!Wx=nw|Vq4lcJQ~msHtKL8k@pw<^(-~_5 zr@S&WDMQaaj9NeW&EyG`_s{F8VFyqe(1fD0=HYPO4}y!UB^<8BvhkW$#7b=mU6fQ1 zk{&l{{OG8M?gc+1W))O72iJ$mb!s6Jbn3%sJiGD=O4fwaM)Hv>y-!+z7L3q#hI>jicZ~h3w;`f+Ne)pDp6L6{cSz`DR-T0 z*z0-ZyI#LbuSv@c%%^Zr;25qYwrGxWaq_Z23wO~J{KY;3RMwNT-bM+=-Dl%t=UP2E zw^BrE{E9wZ*nUOw1j}$SaCpq4vh5DOx=!YBELsPL1==;uYG<)V@ig;r{t;sOBS+@k zFEFT|yKE}X)YEhuQ3$M4nMC_;Db4&3hVt>7^DETNY8412V#sLsWq9Ql>pm!0Q>0E_ zwBlOG_itAC^g)FvJ&{o2{rRvg=i7jkwURO=`eT{Cmm%SoAIFpmgmxf*Z)MRk&T=#; z)y6F3_clywD)sDsDdE4f=REM1rNCOaae$-{dj6+@G4+^FKlsUE_MBKN)fB!Ed>TFE&776wp81z8LWy^^N~|ln*@(rJBEiwl7R< z)K=$-;fb{#8GexOFP5TUS(zY2E@12D?y&cG&o~q5 z#Pk&Pm0-eEiB$2!AivXfI;%Au40#s)x+bynUzJkzRR+ggCfoX1OQH|b3YOur*V*T` z{r0^;6Qh)6X`FYGL|I_6eJlGS?}rKn<9>~cSRfuP^A zBsXR)bMW{&bxP6N;CI+xQnE8xctp?}36^fzO4wTl?p{^=41ng1sX@$V_A~y(pZRjL zeSqW?=sRWgRY+TUACXQKo(!vQ=ry)o&-u}cK*Ltj2JIcticx&i0b3PTH_E0afCJ-% z**BH>V|-tJ4i)7m|IK{fXF1&foRpJ){GmbIQ1S-_0aSl!6NeICw9o2%PX_Xcs;l5$ z8YXX@SJ9`7<|-5t=qzKFW+rWQ!z13lvs>hwR;BL0-{37?1xiZK-wPp|Lf3QCwvW_q zmB~Nigszuu_nXpJpwf`KRMVP)U33Bw#)e^nr0j;KMrCf1X#S%!O+qlnL3|=d%cz+s zmIwHmkPO7~j_R*PBPu@f|Ft+++cGLDQ#ttIfE{0xVf~F;Losnxm z$EBV?qea#-wYfSDVS_KeOH?B{sg1q<|IhJ0WN5tj1=q9Y z>BWPt=sC$ck2vMK3af4bwm1vz)Hd)6<%_I!69W+jRS8e4->lUAW@!r3_aBh*71hx; z7~C@}W97D~Sa~8XCY1U9(mG_AfrW%C*4H8+sr92t)&imiHfQ`e`(742AHV0&xRJ)h zBki(Oe=mo4jAbI~ok#EmYtJdsQXRA#C{Yn&#r`Et_>M<*NC3|hJu+2Pn5mKa(d0U*d7AxPX++~g;gLUm<%7jN0>R6B7A^-;2z`Bo=3 zctSxRwPuMtahf>_BM(U`u!4YoQ2(%Frv;$Og9X9@?;)k0IkHI8@sJDsRn??L0%VKG z2FipfT(B|9%mbT*Lf2PXCg`|tBab8=`UK0cteT|hAW~>SAl7P_h#Y7^pZX0)G=_?x_-v8!}dMSD8CgJOQJf69^mnQ}K@oKQ` zy^vMXuQS2Q%fz&Ru-?}5BUMhw@C4BII~YI6umx^QK4DZQf#C5mT5*j@Unf(3>zbKu zw*{KYr|CJg1ntEZFbi}-ZEZ|7QwhTW04})!r@6#M`mE(}SgCcZ2^~{4ACM3JY|qRy z;UZ_ZDT19HG+g#%%FyMim%qn{!08c;*#fntH#<)!`k@FuV2HW@LCF zp&7>G!fR-Zs6EC2Ag8w|16r*`C?(b#BuBK)B83`e_?J$Bh`=7(lE@B72YyuyvKhT(tZiJ7!D~}`yw?#GW8vPH3xhGbEnm&_4;>Mt8_w) zKE0G92~I9oHN1yPF@}T8#S2WQU|6(G9C~SKHk+%)pMAh+xKMqv2ht0 z2S^&;?vrJViuGmIXIg%1-LOC;B}GRqwEEeWAD|ym`m79W{;^t148V>hN2oQCeL9won_jlpqR|Jkq;xrrWA3&a;R zY54=ENqD`>S=Th8WY+x0snbPY{OfN+4`NdCN&cIt%DZQ3b}?Gz09l=%(K&@tNGKLS zL@TJtrN*p!GHA8?Esk`-%9D|ETZBs`(PY1kNzOooTo1~SGy9k#hX@8d>Uwq|EwA^oNQNx zih1Zyjz!5rRq^V~0zGTx*Fh%SC6IvGfIOSHo!kEaZf3{F&i-tZjNn)3^o?91yGYuG za)U+_iL2cr!JL~cj9+kUPMmdIj2?7MWrKohp#TH`B<^nw$_MPa_J#GG5Hl??G z6E$fw!PW{erRlY*^_Zj{vNFSW?U2tXL7Y1!Jwz4x11vD zw7!7n@D4g3l0HC)QVOLsd{#FOREEfIu!IK9Q$v1t!8mF@5`8dn8?^LcIhB55 zigRE&-p-`Re}_PEY(deNh@VND%bD5i+i3yZ_{)lzuAZ;jomXFnFqQ4l-WskJbZ%C; zLqiR~*Z^uQ=`*YR00r7*(+R}7I^YPS*hN_A^ECLI_>^(-oan%P#|Mq~Du=c`l+~78 zgu3lK>Qo(X1!CU9*R=#Sbear0I2)f~jCmPpNH!T;+EOSVw36SH%Vi}IJ_Sa4n#?R> z1AK)Pb(>+m)w(e$l}J+wN}LFZs*kYG(wOp`oM!>ljRHhMeZb28Di}JGYyh6C$7H}Y zEu6zEZG;DoXGiAbsfpE##oyd(6t?~-qJ=BEQg=mW`7)=o?^bghnb~#kZEA}oJSFjc zDRIN6*b3j2w8{QJBR@j_M&CkN=uL%q>=Y$dEId*P?PzKX`Tr0zh=XIZE&7FMs+|r# ze*T17DwiTD_54Uu7N58UeYcWt{E7CP6$L-*ayuLwKDVo(>Md}RaK^pUnNZwdBvrPK zIr#&Pu!vU9bpDq*(Z6F>k53bQA2H@QIzs1S6ymV$>0A(z`aY~o^d;b2pp!q%O<025 zD~_#y1}B93mlH6!xNL_B%eCwQe<|F*5c=Dz#KB8%+JSjhXA!5n;PQM2&hLwJ_R+7Zl~{BKsQU&BcWK=}Vy;e1MFEh;2)H^Kz zffUcG2c)iw#)(W#{sE+hmsv!l?o^u*R`in91_#YMo;}ukP{kW0z@o{PtfzusoDF&v-9>jr2(MRqSKc($#9^Fy+LVqBpB?V`P>DgZSwQgx@ z%^UGXZJgZ1B@eL5U}EhLypw*))Md!|{J!ixl8>8K+7)<(V+{oa&V-%tMWsJ4KTPRD zeAX6UKzmUNxj7+`0^D57=|8}gMNZkN2pH^YuJM?B={Km+Y?VG!oJ5ypr1j*ucHE&) zPBZ|p%Sqqw6v;m@_y8y8NzJUm`A$Cc3(^f04#5*TdVC+x!3|II0U@G)24ae+UAS8G5q@HY*A9-#E@A&H=2 zzZ4jX6UQ-oj~aH*oYKG-z=rn1N37((=_Ki1#=aaP$csQ= zVFGnaBad5`3vJ;S`CfRcL$A{G|3X?X;!z+)b1a{kr&PFbfhWz|xo^4uL7*cUJ1hn^ zMOdm-n3n7R0jwvl-k71~Ct)`rR$J!t>w{pp_oq`Vkei zl}|T=xmddO9xPyZ&!QSqom+^QO*^^UplY1N*m9_dTuBe#hLV z#Yv%8mLKK-Gk}I|Y`(T`eMj{Y#C4GsVU$_R%up=Xp@&pAL!8G$YYWZskxX@(N$Dls z65bn(c?&+^RV-Dr3W=|k;;la{5;IQ`jB3DMI@noSlY+7{{qJZckwM~7{GIpd zb(<#|AU^ZY%+Tc=s^ieWBxUe!46VR1}|E}{HELcQ*H|IlsG zNKkY*!igfW7$%%Yb~=3aMtH#kJhOSNl)xTIYYM z5MfclPl7eh0#jkR7GtkUF$Ea#9bPG7nyv!27G%}%{m>;4W*&xx-<{XQD50A6cG-iY zFq*#AnUG59gn#?ybyt?-Um5GK;NIC)VwGVfC^IoV)XmyXyo&scHPp(-u* zUaA8ox*>5fbE1o@Y$a@QirwzKvZ^<)gbKaX<*22=w-v&q=!p~FC(yuG40_HJx&Ipm zUDXXLhmM?|oqSL|!`NxuXj{mWL7Mpb@NCZskx$;bbs(gK4j^B`2t&)2=o!bQ&m?UI ziR2W4(79w1(`F!5L6x(=KhC!_px9ERY(h5%K`8FO{@1Q~>g5e2_ z;qu`-=GU*aLy}l6{czM07pPKLit|g)-1Bn#2yw81_9F%f>&P?ChAGOkL{o_>Js~%J zBJo>|T%D&!B**R}ny^rk1A5EWvqYey8ioi=-Kj#m2}Hb!;5Q5geWs#H-H=j4NkAWd zXZ)V>H$EP1Ba@U*HR0(fAjVu{-(P++S2yAPE-}(30$^RV8e#GB4v6E*izJ*z9+E=V ztp*+x;x;`ND^Q&sW2S-U>}Zx=UDw|XssIlY&#YrKi!CF|^qBh`uRt%Dn#F^8VimZZ z9NX4s`N_1oiW$L$r>5gsnyv>`*-XE)X(;l(dFQk`C!CTF_PQ+EA{gk9DQlye9)ev+ zAvVmm;Hk!VT$g8M_@m7wE;Hf1ljWZw1T1u2YFmlr)J6>;Z@-8kdqSn_%o`z#c$Nv& z{k#%`>N4mdmWbM1!As%DqO3ghe_Na!3MX1@ychr*dMLlu2170xzpIdlJZPxEwnPPL z`V*P$vg-Q_7TJ*#VrU22dcK$ha{%=6M<^aZq>6n@r`^Sw26c1FscF}$Gf4sC^nwz{E{k7rms`oJW= zn!^nz-E#^|f&AE%(Tc?=`^=)rLia1TPu|MQh!L=|XW)fb5C!d-5J-+O?oQtyH1hPB zJYe+uGxb-+*)~x)SDA+<+6PQn|40k6Mz`Htosx^VVzPkj@RFGpTPrDvv^Cwfx7D0H z!raq$Ip3E=WI|*R=rtd->kZ2pwb-&b`ny5A^pQCBZLRC}wlLwYEI-kQx89QU0$DOnDMrC-XOy4t`MMX|_ zhWpb66&Pd5u%Xyw74Cuf80$thRZ#kI;w{+E7#2Y7OJeneuQWJ+9E_!}l&B`yE+0>K za{z7ZXk8x?S#BIkMEy{7umW3!T)N4rg$L-Q>Z+E}lRAE6MVq*Hakj8rDHv8ZlfMm- ziQXKpS7kYgI~XLQVHO7q3@sSg(UlB!N5E-S{Kr={+%vnlX-V>xzH;hRMJYBYbv+!^ zW>14fdo||L^uLR{@wiA$`>eJ)tZBc05IgGNHl~BwF9kJOI|LD>l(T>tPZIh*kqN8@ zDPM}+a)}>SeH(5#eqpC^JH%6YcS@vbj*|{aVE*rd=!S(|Y~105{EKsY@pKb&$N7nl zFWmVQzbtw~2GVSe>uLN9}|QQ2>$=$6;suZr|zOQ;9`0o*1|LYPtkL>b4Rs~RwkN$n2|P!f|> ze_Ez@(C4JL$2NQz^iw@b-)sb=`n;QUEvQ{vnTp_^C>G=2P^6m^5}i<$)%u*DFg&KTd?r+zfJh~sD``&$o5}lX~3>TPCN7TLnrGWFy%oRnOFTIJqHa2KAlQO zQ%YU)9xnYiddtH71PN5(p$)NluG~GRA*s(EQ!LwZFh(MOiag>3hw4{Z|dPMef{ zgZF}|c3$KybXt&y^PQ=zs`SuFZy1=2@XU0_TJSqzsz#vrcaCc>iU~ksjIaLP+uv#& zDbjcRoqC^ioB1_#CWLMGqEE#AA3)|IyFiuDXWHet*caH6W>$sbz~pzm+G3@m%7~?p+9bv{ax$=fOdK)os%Z8woB3=g!!k(idBV*7Xd3f+;iDIt@E;}Sc*2AC zY+!);f#t@3Ei%pUCb|KB? zI&`3F%u^G%OYhIX{s16^w^1a1lH(1kO5;OwZ%tZrebiF*eqOh>S*VJsO+0*XQ;6%HJH*BuFs{V3@J0U(aK$yRA7w)%qG3P37-bllk2<%y*JZ&-rb;|i zAeO{thBckLI%kwxa~(bO^|>DtH8qqmgYww)B&(}7r^cM$RO((P?ZLw-*wO<_-Pnih zmEAP8Qc=hBt9cRu{{T4SV>dvRFWIMkG3{RSb~PymQT@3N@^4tY%{o}`H+s*SD>|q<~C5rRW9JuQHhH9r`0gUhGqamd~z`dyc(qB=CYS5+vpbl**8&`BY92_;2!1bN<)ttB>h`R>fxz=~@ zh0-2Sh36xEgLl#%T5%rKM2<3~DGdI*_E+k;=FOZSr0UL1@N!l5n(x=iN0xiHnt>~y zz?TWawhtC3w8}Vr%dr_5MleayliukjS*!v{u!=Fr2#4^a@f0*JLlHX*k1*#Df#jU* z(cVSG#m!XV*u$dmpmkoZ{+v9o-^C=tL6oAS{w@YnGu%8F^(fL658}p zFKmSdqL;sARg3cyp>*kOSbA5LCBnp!NhmsR+;{6j@UIqF&~jE(AIVIb=|2F4QEB$& z!s`eE-K7c%1nevkgkWWHU+zK;HL)3AnH|zF-WsO&c|V*gi2<%$l1#|C8jOB>+KYDu zogu2;DK#wOR->>aD?Lmv3)33|bni=RX~JSrd&Zw2|7SihLMEpQbZI$DG0&1eTX}kgVqxH zT1afG3LYe7cec85HB#RSb3-gbfE%&5Yx54g#@lBE@?L*oFO-Bu-{kY$KR-W_#sC)5 zrs?7V3ei)fHv#Wh11(V}gRG_4ZMdA#>AjC2CX$zpbGQ7_OVW-$uLfxnY$8n#tmapx zKDAgWMi5u~4G>1lnKKd#NT0CZHnop*4&IN)zV`RIqeat=d#ZMm<8-0YnkMsg%Yi`1 z&@Nxmu&a$0asi+i&kV=@~t^sqOY5%*o;&1*X##Lw;aZlj;T{G6@@R^uLXNR z(Zj)c%xmlG&&xtIa+XIUTv6x>fKf$kbvLg5j(Yn3pS~NrkyuRi6`L;I#!>?SD3B^t zbeliW6$=l9~OS?!cruvQUvfUEuU1|B!aZT z8q)qYo!{1;^21=X!wjI6wLEsI$=+QtCN=TP$|(oe(l}cTU9pWhEpZbkf=%x84Gf6$ z2d1YFoqHZf)%0-Vwslhk(IwI4D4YeXYCtQZ8#+YpGt8(Q0sHp;vfoqQfaY7=^3uL;QPduEP|ps?s>rO$#T zY>@3qWOas@;|uM{&Ci=adD`bM-&Hhg^1#>1lYAO;`Wr_W<=UDEmChjkPZ5e?Z5Jq} z-mqTBBh%gDHwM=pqTYuu&{z%t6eHV5$M;>A<+s%UATKi3U&=au;FlV4eQJ0j#uwK& zl_s7pCMU{y`wMDZxu#9>jw)j;^Z3Npl6e0kv$-_q#-`Da_jnew3WS)&D;FsgW0Yl| z_}*sga(MX%psJ*jnLT6+NNXhpaeuhPTgc_Y+|9mvhZ;pkEIp5 zs-5ZS+N&G1M0uxy#2(p{&t=F^MYP5N{U*tH-U0sD;hJ%hx4%Gif<125vpfi14b{jLheMNCWIa+^=d6knv1v-k&K zh%)uBI=OmEKpcx|!%u39fqu$WtKJMk;d z^vfp@*j7FC9{`|a(aH!^ycc2Xj(H?}&P(uiP@{vjgoHJq9nE|WDc%ZILxqjP)o7SG zfM1eh;YORWK7to}NRDS@ijpJ!RzLLc(^2^6ntl!HWMEh|co&iU`q11tGH%oI z1v^$-rBtm}*%BNj@sq;Qr#I+@FQ=_8E#Wl~3VBK^MIp7XHSzh-MDIaOtwrI<`5dLN ziJ^fCwWEe|p+;QO7n672QXLh@C{j*AM4+s6*t;>I55-b_(Vcz1f6U4UoAve~^;B&&^fjxtl^_^90Rn zhNOI;eNK&ea!Vc$a};`1N0M&8b*-k2%?h{Z1sqs%mpwg#%@{<4KT=ah%rz`u6R_5N zQ7SpotXBm?HEBom+#J4pv*mo^Q@!rwCa5zF-Chfhq7GQ+J{Jv&A%pwDIFu(9Wg3uxR8n_P8 z_U}Ki{5A;bbJvxw;^}=|OwQd^o;XM<{ywl9M3dVs{xj#n#{@s&-cS%PyYDwBxo?z9 zBdbaRVGMm`FGR8mB*r+>PyHHBnOM#-LB9!o(^S`BQH(eWE)5C%UL8iNF`1Ii_DyOL z4)F9F(9$F|VKz#^0+e??(pUblRi$lzGi;xII~oB3U#o2S^QR0r##w!b{R4>pSYh+Q$-z==ZeiEhuj&k^#XK&j^!91AOCEk$y{FDA{8|YdQvVM4Bg97 zUU=S(vjzC#OQNlLdz!d+ytL60*rW2yADfyEn;@G>3&TCTVQ*#FI)&##%OlcKbt?Z# zgkVS8_^pXgv9t!0fleQxU=mR&(mnvMk-e&3jZ;yTJKMaGJGXSoy|(Ttoj)k+?$;LO z8gIiQlebI%6W^&E{z%GCm+_+MYB8{8+q69+nPY+RJukragHmX zdVE|_250Cw+EysJW_?$l5Hoo@w|u;@2%H;Sk@%EkAM$GdK44=R!InTBg$whej1(A@`WHnB+^j_MH^> zm!5xmA5ASa)4Ighu!TV#d1j&S;@*FGlM3|Hv7<1HuKP$aPX{67)unrqnkQZ&)vNZI z?!SwW8m@o47QLxj&d$A?LYm>~T%zh(_PMl5G8F6{xbiF|22KnY@c&Nnaey2R#Y&Su zikXvQY%Y>_qx=3DZ%U)pa{9#LFVCT?3An<&R^%r3yz$=>4f^6#uNaU~!sU1l@pE&` zQkO3A60yq)D_{nlx%4|=zV}iyX>Rbu%C^EHHI*9(+GUcTPZKa# zAq|Naf z_R#}ODBt4-(Y5xqE?%;pWV2YBdn5|cKu+d40E_wgsyIwlo0qjSs<{E9(>|67=-qGy z7#)Rt=f_b6M92vq5e)#-bzEl*OGTUfdKJW_T3~h|+g^|PXvA;mFyEE9?FQF<}Op_j? zJl?a_|45ZTYNP zuxrvartD!R*xnWZV2K?(Y_;oJQP& zQ^Sr?@$!8lT>;|fE%r~nfc}+bJD2d=TXQz8t%4S_Y!_rb&%L*v;9-CouF4|-8jt^R z6<<<6U8GqDL3Q0a3pkF+3xw;TMv4JqVwE-8zU6vR1w`_(Ho3e!+F zhNF$?Q*PoR_C8p%FE1l5|+xFVp<0MdFAUPJYwK`J#ZJM+)a=jI1t04w5q?L7z)PA;e6 ziC-k`czzI)B=h>CUaw1y0qKjcw=?-wV+ik+3xEIO)aT~0;7_cHuc!NSx9dJXgxt>i z*(6%zQ9jdnkKBV&0e(Dx#a#+FWM#}Og6s|1vS;X|dcu_+*2Sz=@pTNI4|$LJk;@5* zYi7OKwi&F$I#iNlh?zDT9TrSG;Kjy{N}bpb0~S00&>VCro^&S_b~ZUUEjXAWYhL zOCs0hHSb>#U;8GK)6vuG13Bh3M9@w00d|v@g)zgW(PL zcdHxYOyjJ-a(+?%I4Q$1oh}mZ_|d#7fsIr0Ys2uq5v1jfS|7Vj&$~m|)M;S*9gfmO zsmzYa*p+-?*T*_G{#%`Z=UVDBbaBUnvT#R(rSbHNJVKAOGHC~eOt}uSWq?`;LlK?p zy^mAP_yG)R^6HWtb;^jUFOu1Q*Qz7jsOG>!kxh#f+ESURglWU4;j3;eZ2*Ja-K;d$ zq5E)1QSH+E4)kCIrzxEQkb!&>CP-LdIzH>iuIs$|>9gXYi};Gay^ugkIHSOO3Nv}# zrVSs%@-Yim%HU!S^bAe@sCL`0wQf|BCMZ2k1TxRa&p}BMRc-A`)w!ye&B6S zX)vyRVTEboL$?)tC6Dfblh8P<1sCZqsLwjaf*D_(t;s<7I%-TY76lb)#URYGs)oDl zzIEUPDzZE=uig?zRhP=O(_I&$;7-{SbRxDo zxgmPVg$}n|yLqpv4(~^ONHz*G9JHgz_iC7(Z37||(JOK+g6GWOL1sd9k?6gk@&V$yuBHmtu)Iy=JE?2Aq#th`K_j(zqs z2Nubb;W3eu*hy}33kZu#nD?2&FNNA|E$K3)Nf+J+L-W<`8_lFn{GAck+wA>`&7HQQ zF(cK$J=9S;!M7>g5#v&dSP;mk-WfEzZ;y*{Dbj4)n?eN3;MtNvUB44X!<==X^A z?-&P=l#2Hyn~iZ4AdWxmhxZ!8^0nzDqi)^zsE@-5h-v3hxB7_OKIDvv=sUY-cMmzY zs;#{v)cX&Bk?Yo0@P*6cc@mnQLe6nFFToLKoMh}A1NX$c8% zQRYKAv$KuW-L$u`vYA!oa}WS6W8d`LZ7{{niaY1SQeA8h(UsYD;iz2Cnfaw6`HW2% zBy53rWAi^Z-E;KhhkZ&wcd_~Eoxbr~eza``*{=gO+U)pPxW6IHnY!z!{Jd>rt=8K7 zeW{})O6bKtLc7@aiQqvOR@ui1T)^wJtCT;h3G>cjJUnzJ(JQf^Z#AoV_KTR+Q%g;- zM52{l$^w&a(Vfxy=`DYDORL=B%@M1$bAGzv_FA^E1`((x;8V=IreI&EjT& zSGFwa_uwKw!uLXl{s9Ou#($n5UgOoGdHaB${{lG4wpSwijcEhqwH0l5nL)1Cx2!}*D3pf4?sZamc zNlF?vY)rtnE!>~e>p{Mt7*LQ$YMYvHru z*gP)%&xJx~+cn0dMgn?WZGH?2qsc0pWUYaKoG`SrkAQ)w^?eSHM6C=p3crZY5#j>k zK%|r#u?hDAp8N!}oP=~723rwT%)W7;3XQbl@e?o+s^-(J+y^xHybu|1T^UmUiBTg` zC#BZseHn#^iN1LHOdG*PfNLdm^?%rbK;zT`I`pFV@8Z@nFhqrIA@-Y`NA(nEgcsCy zM#ImrA#sxw)IkQ+3t3n_jB{bf0I1Qh8Ko?zBb4`aq){)3dy+&kif*^ z%@`r*!tR2UV-{h&ANX-(8(SI+NnL7y=vB(&kHsX}4~l9xz4S^_J}d9bDaI4W9_MKEBJs0^M*qUt+<3RmNNn3gf*V&*-hB@ zx~l?Wwy3g9rMh&cpW)-n;YVHA%eYl;ITAA%?rkNpIgk1WkgAqFM=JlGD5!iAd;-yP zDxDswmQu;5TNS3Hc9%!p>w87ctN1~QH?l&N#-TEj^HM9`nxe?UHpCIQQb;JIM=i8- z-})F>NUL3+RO+k@Q4Tkc)hwOuOi0|mp%N!B$))!*&kpT**=Mau?ZuezJ1?}|d&aBk z3J-siZfLB`FEeU5aZ2%9m!znwh)kF*ll}#MP1sTU_9xC3q*Vn6u;PW)3 zGyd6srfdYEY$n$6NF+id{9E#D_EtJSNPX!7HvI$e$xRU57p3)F`Nejq{3GU;EotSd zC`sC;E|o}|8ZCG9UQW|(T~Oy z7Sb-@Y24F>Na0+mm=7Lnlkv35>U`v*79HQo_*Mg*EbH*4@^8ptba8&~vV zGzHZ@7loV%f2eMpE-3LtY?$(;&xbEYFY6&>aSogtN z|1#hofGE|)VBV*TgcD&PRYjcr0-$#-)axqyi`^f7=kGydDTn#@MNniVZ2Mvb{JBIS zfKC>B2D;l@t%k6G2{B!GeuSV7p;x_SPE!CM-S%7K$ME(L8gNIa@k%AXTf*)fxglou z@Fv}=(P2cO!hEdyO;%kkF-&vULMjF?QC!1EQiiLKMl4aV-Wg{E5cS5%_a8#4Da3VR zYO$<$9BL&BhsQl&$a?wdSe3>praFoZ;%8GlMydKPy6PVFZ$8YWPe4?-ukkPOg1mk* zKcz9HA6rjVHkMes{dX^jn9nlJi87o4&aRz?5y1N@`T8j(7HDFX`-%6)x(SjsocGsi z$u)tPep1}2IrqFBnkE*_ZMIL=^+?Zj5={ZZKpbZUK(DjU= zBf%NvbGK47odg?M(BcZ#b-$3G+!4*2ERg))AkW~Uw(oj^;+yWoPu;1Y!LwDqQ3q?_ z=~HmLh6W7`mncW1supKI7YDWFC;eT}1*G zTyzA!NoTersYr|)&RmVy*?+7H~5 z{-SHfE2J`)rm#o(e$c$@hqns4KLr$j8ic7~6(DrW)w)h4B;53R2D>3`_xD#4?4;We zSu|eHVNA4NsU*@3p$JS%=_j(xtE$UIgVSW#NP^F}EdY+qzbk4ZkT%)v8=e@O-}j0y za@tCY*S+RZVw+s&JA_7#CaYYIEH$zUxD`E~brA$X);_;dyoJ_AznAR;o9L8L?c^Vu! zjkPycNFpB{+lRcq|M39UHxrvbsCXPVfYF<3CJ>r3#s&*ZyEU7A@zo@3pMVlv=Lagz zrASqm>!T89%8xa#eQvh@vOqB>sO18&0SMWFGc^^deu}XLu@j-m?@XS^G78<^YiSM$ zzjKeQw8{D2`B0){JJ6b0hA~IoP!CBz31+N8y=UMWDRHKCmNx#tsY>;J`|P>grPmVC zmJ>Jpf|V|zW|lhk{daQFIVpH`lTDo--LJKWm0Hs49getus z2rYC-=psTWVkpw235p>E2)!36(xeH9(xfS&7aK?wM2h9m1q1{|ygBE7&v$>^U;Ee0 z-fL#fnpu0^^}fpG%=XMWrq)3*%5FC;svTpTuJROtS!h+u-8o_5qEz~X>h9<`juEVx z<-RULLWRt1S=jCiD%p#}nFW$}Y!No+%1Rw8jnCLp6|zknUD>;XI}}!DxEYX*04Xw7 znDwy=B-F)Xbr%#PVO4Z82I)M4?Sm=oV$A65IN*)pL8aQ_iiQ9Z!V2^^)Z%A69g697GUK z7LX-ZnVau5cISMd+u%l-J%YyaC4k&f2TowM*7vqs1v+lB$vaeN``LX8wdEB@OmaNE z;gGgm^aTu1Wv`JxS+3Yb0;jmf8Lmb|dgv+%cO<{6g?N44))iZeJ5f(jMQpP_WN=oP z@(F)8lJ4#4Gs5@vqDZn2=O#wz^5_Uv1uc2mJQ zp0$jBLLZpuoHmzcCmehIA@K)5e5Q-{gH4}OK;*5!RnJVbxR_smd#Zj71}8dLIbkT3 zsHSqJ&ZhlRLt@?|c#AW~4wfgj+3p>L$)X_BWS-SCIZC@|YNji1lvOmK6%SWt zEu#m%2vddYc^qy4hQ6S2|Kd?`_v!|npj$K?(R17l9k z7%^OiyMo>?)>7KUKTB4($`nBTi5zX7_+_IZP_n$kZ=T=}$!+wA)UlP6ypF^0(@}Su zSlCz+O!~@yy*b5bXuklWzq(p*z+4s?dgYLl2Ksb2W~>DSG$OYQ-8w9p?YZDU(sMBJ z#NT)00^2$pwur)1OrVCt(3EV7;{*Z7--4U$^GwpKm_SGvx9|kp`x6aEC@*7Y4WxiE z%49l(5{|(p^-0-yVsHd;u9?TZHsM!9*L_nmzzo*w?_#}^g9ajNHtuy9>W**!0dyOm zf4|mN1Mxjiek?bbmE0D>@8Y@oSJB0(pl8Mb1uH^0mU$JtfP7lB!DCkfy&f$R8I@AB z;??cke#mQHo0Gt4y9Ax%9RZ#}Wn;cLln2(oh&64k&favZ2V{5x#4I5#TQra*OV~5| zfgZC4sRExnyx6_)nor=imUD;Ji0X!>K$`$3L@+3CI&e30O@|vO0gKVkxnzu^s~i&g z%QygRVl7PMHe4H!rWje&o?eM|_MPLwUfj z?bDJ*^y$ix?i&@X3+5_PWkl}mrY+_~feM(_z?cC!_8RX(5AAnBS~h8RJEeWznvVNF zQ=?Kel)e>4D?aTh@ucaRQ6?F8(K)3JHMKBTGO3tsQ<*{hUm?gBzUcSzDHJ1{R5y;@ zQrgPc9E`++GGP$YCUELWYG3G4(wedMh~W39OL|bZ%H{yrYmfO?#una;3Zf4{A1RI#?l zr5CSw*E`Xr#G;F6|398A>?zR}q_`b}_ogq5KYQ(2fMOto2F^z8&Q(eRHSy0p46+`? z#EQM)vvaC(x0{{d4Lo{WQ@ArXw0j96bpDjE7KC>e=_i*&)l&6W4YDa$iTI)Avv^rM zVGyTmtx=nBPx3Xcp97d8eXnDjPo|CJzy$yfTaZgSVm@w`m@vV={B-`_z;-yLUF~7; zLxZX{+laLPk^%hzEcmvXCo!S@%-k2%Zy=1Xnt2l z3Scl6-oIYw6a*`qDLQ zma1`dVjx0Gb!>h_3(b{g2x~iWIf&l6adJ(giF`^Cm(IU7y8fX4)5R1(2kU*78vna{UVv8bf6BE-+9$l|=wSSD13s9kxz4R*o4HDtaabbv4Bbh2P~GDB~v+=+Ufckm{yk(;?aPTvmGSLG^|F5w(5-}6FyAL4n- z)MRlP_rc-}=7w|O$Z6zz@k06~=^Z(bzA`P|69Y|*CDNGkmSdr6)MO_oC{tUNWC=65 zz<64ch#%Dp`FP*2(W6e?B?EvN0209;7#&ei)F5;fMY=QI{iM8ev5US}?tJCDU=v&J z+>pjk@1AR1-W`tzys$i-j`Q3QcYizoVGY>u%*LM6NqWI|J~*4I74t1sDvt=uZEF|0 zr@=J}T}QkaFs52@Egnf&G{f5>*dBhY{DgYx9WCqX%5}Zp+rW%wa#VU?GvL=lhFEU; z+kC5w5$<60lnA5`)$eCsdTb6U-K6_h3*nJzl2_#vqshThfC zdG8o;!4}o~7f#t3bSDO!x0QWq+FyLhiktf-Sq9@$^Y(Ok<(XqF`Zhe&irDOL^E0y& zoyue8l$Ur3{7kd(NwOLf4c#*BS052uI}itXu$P4QFY}}gJ(9b*gUhst`uSFGtEcO3 zQ@?UT5P)vrWA6;Lxe|WzpI)@n711r@bDoOmTC1ugl7UZl??ft(nmgE)ygU;jOz2Qp zT*1Ju15BU1KS9?nsg~&>0h}0Sozc?uasE*ukGv7clDnz_T@ZvNA4n8%l9!yH<2 zUxeGbSupKgj3x`5^aoHjKpDELMheXmt=ZKfg=R?cV8Yndtah1w`NUBtX*#4Edwib9 z8@x>mXI@9|Cw)@opPIDrKd90J01QwDi6`j)ZK{5kBIJYxYQ&)IN^|g&quZd&Bby(m z=ycqe-+ix&Uw?n$QSo+Ir}@sWGyAWNSv#D1V5YEA5?&{GBT1KJLoVUFA(F#_^kqza#Slmzq@Hh|&xRrAd?62~6YQZN7SnPAw*$sQ!vQ zJ*U37GRl-=2tMljEvU$eOHTIl(g~Wy0Z=NWE7tXS7^eD8893S5X==2WTA<50@R2GR z5zSr#Dc*OCbE7!Cx`j{)0_=(~HR=eyqkd#axpo#8S+^qpC11eV3qFui#q4^l4sx=R zRQN{i(K@i@2KQbnZ<{2@wB3b%|3Sqblr>W>p}YV!80H`K+Asn3sRZ)d1&*%FF3_n#- zV#dJDXWoZ>D<%2qVsZ2ApcU8P(q!j2!S8%`?v{N>WKSfHxc2M({tUR?bxy)hRzc@0 zL`da69=mc;S+NYdAocy<43m{E?K9|u41^%Bva*=?_wQ6yTg_y6Yw~oL9ho;TY>zz(Rxfd-D(5bX^KS_E|Y^XJbzW1#*%= z$rM|rt>Wi8^>G>(hhyy74*zj@whvwI8E&vOaU*s?CwnUR;)88LLf%=vjl9)M|%PK@9s_46`?6ZEyw?B$+N zR@68B2ETNadE%Swy_Ay?hFs$CFFMIdq;t%)jmh1AUGw*~)GV>|>IX@lFTxX0x|0nl zRqSV#Ms?(FZUqxcV+9u|Z_udp(D>i=|DQ0Rgg@*z85FIb`o#E#Rb*V-X+vEe$fetE zv8}joE@VrF6OWOnEH`HRwX>-u68Vk`S2Tola2tn|uFk(6ULZ~!xYIn;h1upi?nKEE zH?xfOpDX>A;~TeaEDuxu)ay7Jtd<13)AlYHhi(uFm}^dbad+k3FlHi$&WGuhjesdJ zR_%8*o~m-EbN&94b7~nv`udWeQq+icP+Le42b-vOQE8XNxP?56KbO@XK#C}W`LtN$ z2ZtDmp!4#z#;kN0t^C9SeM!NphDeFZE$4kIONuY73t|s*e?``*5(16dUqizwEO&Y(6S{f_!9RIA7X6=~~MC;JYha2#KO zK1V3Lt)mrHRjD?l6X1l6&43ZjxLZ^Ph9ZeVjG%-R%Gns<6a(^FUtka>-rvT~f71AsPEdLTNhIJ!mCSz!H@MZ5 zUy(tU^C_kH<=izEv~>Kz@(x;$2MjAYyp8wr=(bLVcn`gJi{&?4ga(n&QQS!|P~+{T|)vZkZAo3MGA2>B?Npy^X-WN42Dp=nu8X9#-IGlTTT z)XRR^rwhl?FrmetI2(-G(~2Y#HY{_#wz*zCtVQkeeh+O34SF>9 zrTs4IoElTH!=xiif7YF7IROO09%UwPuojP$ZSllW?p05p)|hXL?0f6@XwuJ}CY}^@ zGA4|w*2QD7ktTOb)vghQvJm1se8#IAY7}D!r-B)+!J$~!s_%TWb!s7zr%z7x8D#53 zNt#nuQ#^bOh>2fLG+!^V8nNr8=XF_{|EITDjTE1=+S#*@Y^Xng5$e6(JCEtF3^XaR z(TFDi%X;C;J`=WL)kv(yyMS8<^Zd6g7bN}8bs`*N17@?E&Y5osJ{eDKU2sCb|i+9elTJOXiO;4^fHv+e^)oTw_r@r**Hw z`-ZRDx(Q!+ayAP}U^$GRcEPVL}48W;=EjJcFd7<8d!5^zWJ2mm}}+!LSCb< zSA)vdr#bGok#RJzqe%E$@*}_gh&y!`p3G5qj6^}@ga}rNa&^l8=_@p&fw(HQ zFujP&Xxgl=eZteaqM=iZdT^y{k6Sqil1zLfDg~X@qrBH9<^Xhq17cuiZnhh<8g=gZ z9w}S9JkysrVWSsywTH-@;CF^O_TNZhw&R(4H^IIK(8Ymk&`9j(SJ7s;pJl+6dGSu` zW>xzXrjytp?@-99@SKb`^SFYVe#vcp^y=FbWRCGpDQ&;eiq}bf`J`rfGV728R#H7L zuXBigt47GyvChy?ao`b77;7AAcXXyu&O6@nqgswcaCM`r;ST+1qy{>&58h_dSR4Aq zfDg~x?K=L<`sPfuW??=gJO&K9V-o)l==L1o1G>^SMzO6|v?|_gks|oq0gpsYC3mo< zuvdKrV6VaNIaX6$nx686;x)R&ptuLBCYIht8XN=&y}s-tCu%NssV+Zl`~||+h9=i* zkaB;AK*jB53OY;ww0{wLchvFyP$5(Y?~ZX4L6E;h4!=fPOjwTDVVU`=ccVZ(8 z6l;f@#!~}cuN<w+gIfU;GX9x$0XeOp( zQg5pp@#yrCcjJ^&*|GdvqCciH)i)Y&fQ%Rk@A&ivVJ>Eq!Hd=6LSFE`P^;oD-K#ZU z)oVCwr4ADAZBP$F|0WEmnSDkagfsF{r|BUBXDuZE*59|~mQ#V@i9bC)xstrs#DQxS z!rAUKH76iXjc&h^^b~{$lUhHVEUC=3TF1*8_yLh>t{;fWev*7#^n+DcjH?jP1CWgQ z-`pV>{Ag3HR^roF5P7F*;aKb1-=}4sYF$*hfZ`5N_ASS5)wYipO3N<-X@sO4y-sEA zU(erkL1<@F1<|Y}PMz&UMa!(nfHK$*?g?wD7Ff^3!DNz|;A2rCWmHGOpYxd!c>DdPp-U~C8FFuRL;ZQ#bxQmXWtZ@M|z$~$fKC^8pDsodPyKXe2 zVrTgyAkGxW0^kF#+`5lcK)J(xme9JrG#ErrnK6IK?@#RC%*6PG%53>??0Nkt$J$ci z{p6mrHWU^kur*RjHWRo)>wQmBE2>6~(*tMvckEk*GOUBEA^m6Xv6iTe2eZ<`mL--q z8eFjxD3$MYT|+$cgl+z_>n?*HB0>y8MpvV6wN_|AJ!|FXYdYnu5E^-bO&2cuh%qQ?(D)-36#=4pWrlWTlg~f_@0xo2*W=*!bbd7!Y?iC5Pql!Dd-S8bwOw zhOXXM(blB@kp9StIrC=01(e$m`(KnJIUKeX*%w$h}2IB+^K@d0+eu?Zz!4}ztaVk-((Vf;SS!)kIK6cH!sZ8s^vJiqV+`g17|iF4 zWcG)E8|vsSfUkt@!N!gN0GP!i3seh**cR@a7X%Cwx(9#D?>9_V`6ZFdm!v{Rm;06Q zL`?!xmTOHt*Txg!Ok*2CR!FS8C+VX*byc(h;XF|SKRY4Zr-?MWc zZqwTr$Ry_W2us0$%6zsI+pV|zAcvquGJM&@Bq|e z&wbKeN8d;)diW*VxrbQJm?>JlGbZ#GI?i5DZPXk5xkS;B$!;sRdmVCJ?=@Z3#ybC^ZHt#^&-0- zbpj-j>sGM_dJmev^Gar-lkMqB_jPt@ojQclAt5c@-7z3C(jg@!AT8b9(%sTs(%toK^m+cz zdCxiPTkp#nVd9>>_r3GFexbjd%p26l1dkCA5KzV6iYOo;AbmtYc)$(058g2->sOuHOUAc!_sPlUeMoc6 z?}cL&)10o(&XK6-QFe;k`kN*7lUUgH3#{>CxN?yqW~Ne@Fni~jSo$90o{_V?w- z8Z{4(`kFLoKCKTJ-KR_qm zGRWUyGji=qLMLGU&ZOkDvKBuz*@BE*w}=UcL!iQ!3ao#Ms+45s;9y}25?jjGtO*Yf zheOFqL>Z&!iV7{Gr-UjUc-l^CrmQt)3=9O;`i}Pr+Y_?8yO~rIs;VH#9}Af;ahFDO zvKJSp>_%R^621qDtVr7A``(}bUjAg-PK(-vNvlU(S_v2DOtI)>C_Vf$3MMqJt7|A- zQea0rJRu<>E-oU@Re!wjD(hW=`vsjShE%vx9;cHd=kDZav0KIIz0$22^~(t(!Pc!@ zo$jw0+f!~9xf&%IHMO;&RBov^n*}w~x1>1JyaNZI^2XhWrVrz_E+t~AO=R#|wf^F`~KH`JiEkDd(6au9OO4$;>ZbdRCU_eQ_iPM0+37idREbDXAypyoNR zQ#qK>)w_EhyJ&}QCYsTLg69S2b?;BgY0s5=HeAIT)k>wj4IeP23qQ(Q?5pK(Ss;b; z+S&1F^fP#UajkpLNOHXrjqZLRezi5BB6xi?bbIM3HS{rx!M8vikJY_W_TDtFUWH{a zzR(S)qP@eVqms?O#Sh5Q{g>!>gA(md^wv%4fZ`Wo%oJy3UGL7=l5P8+rsj6~Asy3*9cY!^r?2qzscNKz4HSA- zY4e;IeXw+Ong@>NY`RwW%B5ku+}69e$qwVIam>qOJ^U~<+E(&`$~{e8@(_Niv(va*RM zkHl?lRXhZfheZwbA*m@_t<~KQc`Jtpv^gB62l@&HYt~iZPPpznnhJ+vR-3t0V7i*R z+zrW9UlHNkOZK)C7sYiGgr)pfSM$FNG&xh{omM2QP3f7KzfAbjQPNVidhBM_*c8;T zaQdhw7d{IPkHlHc%PNba7PnCdhaowbWF;qiF@?cH2n>4u;PNwtQGvKWUSIZSUd zI&(Ty?IO$uePsz!DR4~W-rq|W?i1g)Thlr}dN;Guz4JBAdgrhn?f8;_xW7tuyrvliOFd$R|xI4uZd$&2jmNzrKRZapr~ zMu|$G@@LBta2Xnzx0OeIeD^Rho5nKpkb^VaTOY%})aP3s;c2&AFQA7!i+cFb=qnRR zk;nBp*DQvZsH#$SlU4o1?fDvA&hZusll^l6dLquATscxW>&aG;Z!)h#w)wej0HwEr zLJZTRrTW`Ma`6oEcV;={G;d%R>`+>dzHeSkb<6u-G=0LZGKHe_jZQsp&hIhRcWh-a zzI^F^(CJ@Q6@zRntf|=)^h`&uEk;ef3QDH^qFnU_r?-xTII;?@`9w*k?y;#2^b=S< zn$ptWrM}kN(Xf^0+#X1-bVj&mMGhGE5D`5`qhX+V^DV{?J?t&LAu=cNwAX-H2d<%sYk5yqX+iDKAKs2t~wqdZ_!TBF08> zaBIS3w?6)?U5M4q@wtE+*c3yRl^5-F+Q#u6l05V2>0+&yA&2FrGrT!!0v_#Xa12ol zs)>oX1Kah1l73$E~WeNfMCl+WEExI!N}h?4$&0DfP_6UR2H*N?&Ir>V1te7-u*ILB)0(Ug_S zP6UbRNuof17%qt!yl!flp8oEINcV|Wv-)UJ=w^SQVvZaR$t$;CAL{7o8I0$&`3#Mt zNIglc$w%=$eh9-+@>_{8H-dKZ1d0AIt4)MICQmBgb^_7&Idnci}~AJl>CvHEQuWUF|yxbwa=K(}i_oLepfTg)G!&RJ13W2b7h9 z&kwrCGZV>6Cu@6pGIr|;4=NhS;LKH~oR(=8<(;CUU}+G&2~G4^eRg@s%WUE2kCD`E z06+VR1csn-_j#ZfyC8D&rF?ocBL3Qa7H@SYhy51aiKBH3p=ypTZbQ)Hq{2q35tMoT(|3 z%?f=JtPmAhDP_BJ_`>G`_AGXe0rerMeVWU%dMReWG`{}QvN7OkhY2HoL<{N@5lGdQ zW+I!1oZQf2tJmP*0=htCsdEuCIXNo@g~|S6T5Di}Jgz_)J$NW^=F zij$6eA9{LX!ncq46R-OpmzX}S-`&?Xn}>D%G9g=f&Zdu{uoxA(_3 zPs=?&JX`AdKH%p4D_6$@rwu#M8wnK(;n*DyD>arMX!L@R<-ht;Yj0wtMSSSq3T84S zn0mYJG{#e9ZSQ>6ovn$axQ00#mvLlllts3&Ft&Fa37y)|$jwd!bWjFni@(3SKb$E_ zElL6|w>RH}RW)tMPOz~lotHP1EL?`iG--#NnxdQJ`k0LJi$pWA`+%Hwzj^zzsgOOb z&Mg0G$ky*SBo0?LR2ir&n2UB*ff%6U5E`i*5ly795@k~*93Sd_*a(OhPzM8(o`b>? zI71{vEaX<+t^s?l$Cuh;C^C$j9`3>*F0+dC&?RDUh7^Mh*Fc5TaC-A}et$ans{m_R z`Qy~one<0uZ{pR|6Dn%94s(4kwx+TF4w9^8HDa~Rrm}~%_4F}IO0;;-P-h+S`esOS zePYHB5OA!|H(g9l=3iay*(@EEl`W=G=D+&bPsr=aei*?UN7-L@Zn$6T5)l|k6#dfC z(9|--WsBuf-Cx7f)GE`0(=e7_-n|x9$8V!cE{gHBukTfCkETgvtFBTOh!D9RAG!W^ z*~SnHv3Hl;I9?42`6}SX8$wc{@_NdAwVV?iWXbhf;AH>pQMib819oIDjK>7r%ELTM8)0A`2Mm&u!X#ep;?zq zm$klen#8>WZ5)m7CUCjdjZsLl$btI8Wc@)GnSmI ziSJCwX{&GEomzV25AHhGx(#$LiQdvVd$ztjsgEz_izJfE7Ho^lQyM1qU)5Gg=50?_ z!)#(SU?h5M#=cmU_wGG&J3Y~;{7%nkIa5(!e6kfJ;8yF}lbZ9I)bK@D{wp}q%S$e2 zPUFe=y8AzW`Xv%OWx>U;F>rsGrFIMUTmIOUhFi`Y|DEYZmQt^{cE?|b=?@Ld^6kRK zp?7^!>j{|(+Su4BF_L}xo;fvJ0(Nl}Ym}7Wu}>a|iEv0WZBzfAG)j$^*L9mZth+3l zX=-jGI~%O~lZ~L>Ue468XV{x&re{q}XDg%J?)9{cGTQH&YtzLQv{lBUwIK)h5vl0t z(zHl84TJ2m?Z=s+IipG{HR|SYmvF6u;4|SiKiHywpjE>RIOU4Jlfq6dwL_XegXVzv zy*(%sQ`(H4{s9?TuAPlDzqmp;h+9_$k-!`n9r44$`jW|M@2knk7yYuo(B6@NfUwoy zA4Y`xCrFrW`qSB$E%8ODh6qb@)r&U`w*@v+<%x%DH6EAS$+uVS@furg;~*FrG2OOG z7?VH~mqZbll+-GJ;WS;Df8}1VY7IghQPo3kwG)*+$1UEEARP;uA5oMxNUsS3yTUw~ zu&agr#M&kI$f-*Ej-JZE1~Amq+WB)R<|U)BbAy9ogC6r-3MnjMr}G2K^e3LuU}7jA&R5mO_q#HWo(2BW#lSfM==D?xkprf@M_1$ zTJ5)*ttwf&atR>KcRz`(BfkszzdS-TVJ3ys=8WDDFd3X5WLQk8o$jRPDhH5OcXyfQ z3u(x6!m33W3*OhoRYi=A{8IKjWW(})^yGI>FBm%YQPa!a@;%?6CT#yj!`|wv!8eO7 zB21nuzGUJO3eS0T+2ZK}(=V1nk7r-z`gBrh7pEDV?)-vXO1*rEHF4JsRA+2_nND->7zyEA0%hx2DzWL=cDE2I*p`?%0Wp#@2;1)?)VE_VLgiV<2gf+{4^kA$KbJq3hlshLB>u);`yz4 z37mE0L&NXJa&4a1wDcyqdzSd(Q0QZM|_+ z+SMb8qP*ts`#+=jUY=%(vx3e2bwT|Gi_cBJPyyr1>+QieJnkNE)#8>!EGF#w?{0DI zX^sk8L$+IORqXjf4Br8jBqTWFplqy5B@Zm>v#T>6yBJE#SB;fKd|fK}J>6a4RKOAM z!eesmiLW-4Udbs)bl+kb`tXHGlh=KQH`F&MIwoP}td|S4f-6PZ# z6JAy}HjlpNAllcq?Tls|9UD`rJ;JgmY3+~24hz$1xFs6)!QZlF(J1E!-G<)1k z5K;tNu`yrTM0mtjc`S$Li_PVB5+y4X#iY8(jn%gNGpL9~e>n4vp#jJ)>?)@_a$kUB zB~7cJQk5gFD_Wb{o;UHWi0TV}6g<#HEBlqq4m$q~IvA zurFn%@8VI?R`JDnyfHU-c^@@6II{)pq^3=*!D>S zf{ENDrc+=t!NTWRh79S0`O8bpGtz68yp z6o*|cafz-oBEFWf2DurfC#b0B?=ncye3`<&@Xic0+|FF4i{90SaB<%g=_nx(Wm?dw z`Td9?d-df`Tl8B?JLa2}xz)PRzXiW(dcgh)LYAW@t(y1q2Q6B(Tc(~(AUQ-&k3w1= zU;_ECtTUVM(6Ywe&#?QGADGSO>S43BF3DrN@8QV5=R)}eaqF&{kV<=3S?P|C$99hw zibZ!G^{QCbhM2mZ7LVSb$EdjhEI?<;4g-R=CpPyh9M$AtOb-6jUMF%K#=uDHvW6nRr5ax z*j3b@=mDXz4vqTz-wXFb|ARSci~s$`^yWWR2r>VGDNx^64gK>e(tkeval64#q`??3 zIP*V0{a6ojt-D04Q1{`Y^;P)4s=mJW@2Y?2wB@OvH#OOm7+o?T|Ec=pC8E@;yF(WN zVSt9SqzZtCHvr^&3i;>jFvNep900`}ps>9#6F>uV!ih!6t|n zFRA`rJo3MbZ`7KS6;iFP4o`yp`ls!(|J>P$sn9Jy3m+dT|MY)8J#*sy(=@QBD}m$^ zBs)i?CN~m)!d(D1BK~`T3tQ09WHc%VLjT>LMjw#>1rgVh;|7+Ll%y-HC!qc9kdJPU zrvDjkO03SL+p9G`qPw&Y{G4J{BK~Wz|Gv@qvPr$haXTU8?+t&fQF-?c`|zhR`_5z; z109_>Ee@;tvh6t$%4YruIPUFsGynisQKHbLyAJTbliHMU>%_C+bhi^38R5J+8 z#S7Fe7dMtCd1Oyi4u(E-6;aJ=kWTWr3FewadoGvA-iP{CwQmyICw38C_7E1r`$Tx&?HS`k1=SMwh(zb>H*#{7lR z-FspdtL&b>2{}toaa-IiF8F}@e=c0l>YM`ct#DT|S6AAcz|(i*y<_zvu`|4U6{oA`|iq<_f=SAcP-%b zZfbC->RvewJy70LIV@i4^jrwJ^5PD~6`v+#SxoUARx(m%!Q9xz~DqO@sW+}H?>qGu!jB=$otODfdQ z@2NiqG>OGzOoBO{}y515e7Qsm_148dn1Cnf#fFa38< zu{Pzhcnq8O@;kEkq~bw&#*(sLv->DttJj8Lf9U@N{d?X=W^k_=ht_4mc>1#c0SWsD1a0!7 z-C4VxZ?uePZ1>{5)UXTPA*Abw3WvXw&KQe<;H`=#3de= zl>8gnZ-=PbxnP0&G=Jm`0MV884{QW{|D9HV@ia{Dk6UOsn)AmGj-PK9L{2>CFbFu! zTiAiOiuhRxJ2|)n4G@iu{n&Ij`%w>ztk?WnggP2M?DgL$7_u6a+!_YX8{Yo=8Oh_C zA6S|wl#L#XP2F4{v@pc@e-*MwNi-5aib!RQJh156%Z5c%DI%N1+`1o_7s;@6PYt1-`&5JD%1b~MBL zlX`H*pC9EhZL5;BsuXe+Fmax?tTFT$-ivl4Wn*hfj=sbZb8t8wFVbrd zC7GL^eu49t3d_G$*X8V`R9V|8*i|LKOj#^d#U~2H~xomrp zUfoUs8LH2_!!TAamK~=7tzZn5Ri@8ueL5MxXY?U;+RJEFlJ*gI3-6R$VsyjL1mq z&p#Q!xlGTP0r^CNqpwU`dH?mQ7b5Z4BL@{cVTTRHiGvj!@ki-t%eUkZgeKDbo-?X?g=t@6FRv{e5C1J@OP0`$ z{I@TS?vYz@6+4IhN>o(X8MNcW|JDNJ-{MsNL&>-^x-Zpu^Z0KxTq(F5P-@dV2om)? z76ljqCPDCf#sakpMpAx$u#{#Dgk{=6-VwF+B30i;wT%mBbGYe$5O35^+~F@63u72KGo}i?O=unQ z-b?Lm_2Fm;KMPhq4g3huX;9f-)qD4@!FQSEB!cFiIWK7a5?LSGaOYCkj}>8-yG&>v z;REm;L}|=U?RL(!jlYd^BvyE!Tsnosm@|aNaTz8TKd0~xNP0617~GO`onNyYRxgRP zd&MBO8B!c7YZuViKRB%3@XpqLbe)njILK~MGAZ+tU+KUed0RYml=m!JJMra9jwy3? zX>6RR;n_Y)n8G`@y}bq3y2Oli+*BK5nLZ&Vtx_ZY@n6(@*7N=mH0nWOaT%zTs(GVB z?ANcAM!#!&WDTwx$CXc-qsS(>Rxf8T*Pkt-zz5ob2@||+VwV|zq6i2SBO)=HmGuM) zTUfY$@)K|_l*$8bFYA(+@In;QsFN5j{YqLa^XSvxG}Kx%qQ5%`#cpk&3k|SK z8<)`(7Xu{6_QiIO_RXjB7p|kC!=+`JYtc>Kl1Z?y>*zSIOV^g2ds?lp;}rKda-{0o+k;C^j^@4F#~c>6D-KCuBlUI@C``{o>cyVK-qPQDc0_b}oRILWGXK zl-0!7dvH#8pE`@%xct;5Z+Xs|!6*gCk74Y}PsXqJh}>fAj=4XPfVOsXF^0&hI_xwz z$S(c+*d>BG>SkSbR-|L`{^tHJUi}m|9{?7r8g52!$~Uf0J!Pbh#^oFZ?~d5h6)Btb zD|IU(KYu#d$;9eRO>aVime}w8(1LCTLP5Mh*{aQoIkXOaDdE_fYP6OX(3>OCkQoPa zf~i^;vEZ(pp>o6!ZtezQDrq)4gxw&shWVEA~j zBc+ttimDUKW1#FZBi@Of=B31A0(>|iQYt$oBlr$^=|26$bN*4MDU7k3o{n6l0mn#c zj%AEs5l5PuG;C|3l%#|tbB7r#YfLwtoM=sqJt4rM!6JjV@Xvmq{{SBdSzQ$s7f1B| zgaN(J=wxDRt7SyqI)2t zKw=0;tB8(;1(PiD+qdU9I5-3ZlM@sE7!s0_n{y2fO&@+_ zWmUNzZ*+uF#JZTmzr3ZKtg>4JXhehUN|$sz=k?iAC_{zmx&bJ{gF2setLjmB(V- zOR&n7$6v(lJV5I16*&=PJb8maC2q?KK(zR`BK!M)C|GWmFs87*bcM}hC}21i*ZM>u z``+FF2A}e{nee5sAM*H(kvy0N7OUMRxo>~8bkc0}{fIw=WtOBQ2-i!huIHOtw#=fwn8Z07zZ4%LX#K^w{AR&+ES94@6Htup?5xcntaPvp2Hx)yjcuv z7YpV+%oI|ssSyzC*aCvk7g*_1s&v^oHlgS;Ga~jYr>$z5kq>!OT!T_724V|KG#JR z?ikT2Hq7sfdET)pl%V%pytvtXc6i9Pc1aB%H=uaXK7QhxJ?uPiq1hL`p}ts(i7|p1 zlN^4g!I<*Hj0pqFy6U8J$2rW;O<+W%XxzBO1oE>U?pL5g3O^getH*>q=<&=`W`O=E zDzZ60SaET2k(ZahckiBQnd@>#*olU)&l8v1>r<6Hwc|d%UH-FqZ>?W{v6lB{)74QV z&!2O-l{bVl-`CRxl%&bUiMoGtT2xjQ&uUTomKBw4RaRX>`2@2WYq)D&Rcfk1e`3f| zd+f`|R_Gs^bvLtF1HQI*3@|4^Z>*LTRh>`AadiEJf`sG^DJeSvn76rRO@|pAP@=Ye zVo~W>tgu8aW;;VbpfBjP1Ll*E#iN$%S(Uq>!}UX`pXx}AI96-BUFFyg5*7{hWRMs% z6?6K^pxw>q!c|9K|9j4E+ZOYi$*ZMM@O65R^UvgdT0(D~+Gog?_+EiRg>OzO?nof- zIp^lf&_~0y9{nrf?GYV!$xeJ8ebkcb>I!<}%+n5nzz}KG7s^pxHdXkSpMN`QDKI-c z?9$&MZ)vud|D}Q;L>%4DsXxZWuaTOs%?8*poYz3|b^iJ_ILd|}er=s&LjQIvJ*I;a z=<`$K!^}h3h_tzW9JC~%`Bprn+Ow48B6*uL>s}w!sDfHn$4zB-_}0ytYeaXZY%Bu? zNKBJ+zLT2l>jFtnkGs7#xjoX{-Tn(;hyGE1o$(*?MX~}0JHPMnMri7SRuW=M<r#MCDYmHHHz!$Ju2d2#;n#49bd)g zmu3?!LTh%=WDmwrE7nJb{>aM!Tj$sS=3EZi4&)17RozoNk)wLJc2^e~?b=rySDZxC-t66X0gzJ`O>-OkTycdt zOHmSIlvgu*7$U|Prtu3-uTACGE4wJ%igoFcY86`z{$l0 zLR*i?Qj;9zyh-;%HjC<-nw*@RrNu=oeu3q`FtKy0OFLQsWkjOKq_#NmaXhy?X%z3x zTUGLCGbZiwhEXLYe{5``21C2gKegs$T)eyhVWCifPRQmX`lRpSqC=7ZAK>R!H>pxg zq(wi^uSPApzr<+PGb_Xn|B4&_^=qxU>Q1E%KzdEI{!GhD z(X{FYTh{8WFDgZ;8jy8bn`Re;RhpdxEkotm$rP%3IW5ZLA)-XnKD2s7#XNN*Q;USi zXcc~|+4G870w65Y-dL1OPisDv5Ecf#@2ve;pWBmmONJaRltx@)=o?@A^yXXDyy`fD z!QQ#PD`#Hk<#+9?d*>;Y+%Rd>!>`ohFioP8@>e8Gbb?J|D~wS7&@oy^6@( z2qc&QQ(4OLMP72eL9VpOzm5;L_Zt~7{@t^gW?_HWXSkhCXpu&*Kxd1?nTkr5mNoD` z64!9h2rk!k5Sd{io#&=b#~_NS=%nh@>q8K#Bop1ajMcdj5TI5^Og3W33WLFV6Si7f zmJ$-$d3kB$80F~EOUqs!Ew;0Ezf&mZ;MlgXC{w_BEf2s;LQ~7fdbc;%s;a7h{)5y(q`VMlf)c@`hnkBkZ@UEbs!I4{2#>S4YFL)DfNLoVQCPw?AySXOn=OFG5yu zq8{d^tGkE}5+RT&?Ka%bvRHX|c(}S=WJt%?=KkU95IziWs?PvEl}Wt~`&7#(L^E84 z`&*i5V9c@0GyjQ+g!WLU=X`C`>LZTxuZDhp4&nLqUwHob!47jN)%seKsq$ZSZge?O zgSrS|PK3nMK{VsdsN!hC>p?M1oO7dakG`{{4@8osl z>0?`|Frnb2C3uq7^bsQ^SNYN`^sRTY;k9c3sr~4v^qfccw2%Rwprg5ys%raSs*lej zkTDlA0*xM4RV@&a0umO$FTa#;kH0S7c!r=HlX90G&Gy7dgr#TK;mswc_lZVAOdJ}HOE~b ztmz*avbEV(i|-sULlR0vi{WgsHxGiJAI3ZFZ1H#|lKU|v!3?b)x0G{?!@6RsnK5-g zRMXb@=$>83pR5#bVF56~kX6a^ip8L8qd)_Ql;T?+qFBnqJsNc17#h;s+EyPNS{Rm8 zr=v-VmbZHz2_g0+ZZL zqee)DQxiA#scN|9&jnlZ5^@7J{j{4&)IsIovV#=~=$kze{w^pLqf}7*({{?v=niC5 z`Exac^K4r48(n@yZXIAtL~zQt^ewJ*R#K?3knG);MhnF6};%yzF{@& zi5c0vMavj8#(;Kqc2>}G-W}E-=b`|&RBZ1+C3KnF5MCQu_@QY9U8r=9G=kaF;}k${ zNiIIkOM{fpxXiw~uPd})19?W4`|)T*sDK#3lY?|gAT;vD2xn4-8nZ_g)F}hO2Gp;4 z4ag^#3=kMmTJUe0kPJL;?E1dHW|s!T+14Mc_akRh(hHwhy;(&W=q^^GkrP5_u;g(i zfezQE#E?ZCSR67tI(4*Ea8Uw7l$(Gm9g`m)4K3#_9sRaKyKe$L3n z${@+9=d-l^CAaGD3P_hcK0bcRR3|cJzHhfGqOU()D)LcV7D)=J5iEiKAwUt5DKtY3 z)f}PvoArRb9JO`tICZPrV1nvbrnmigA@Clco$mH)q&}*<*mxN*u&c5)GNxUTJ(_uQ z_QsGWET)}=5CV8+Hi0|MgShMT7X76jDLP@S`V*~S@f z;i>4Fl(6K^kH(bZJ9R-Q7OBB1!JMhmk)&8}-I(OxsM5jm5*g+LutaKKk$ipmE~Zx^ zkV=N~am~3^UYDr_TWksY z0@2Ol`!*cUwN+nyWl+g~fP_SIe#Y;cE*VWM>F^6a-BVz9F;EUE(A*Y{?!+<}6 zHVPOy5Kbj=Tnm=Qi-xEqGZJ~QfA8fw|FSeg`feip4m-u9)1vCoXGUBkf>L@|!)qSk z=_#4AvYI8UUmvaWJ}M`g8W?}8`l8AE5f4+8^%NuB+1*wsVK*jv?e=hw8q2d>heQSm zocK`MAD*}BgvkvB;}9}v4o6w3-{Rs$y(2uK2IU2{^KBv>&g+<|$+vY{I3&9Vl^P)5 zopj?X7=N+(6PyBf(P5SAwJR{1wAI64p?jR#3OkR`um`?dZD9{M@nWC@s$Ban1iM;c z0x$pct{bA^eO|kx-{pu%z-D82(eMi=6D9nQGC@$#y;zeDqKzTO_}Q}~|K z4R2=42ykxxR~ruk@Gu74T%3mqLQ54^YzY_R#n+3 z&@(wBjomWij#8_X2ZVk)ia5UAb;Cu|NwlAsIXQ=LsKmt=9=kHx-)SbM|09Wbe)*u3 zE#~82Y!w0hh69-J{`1rL(xyP>)tZyT(=0^~x-O`EJ0EX-gDc0I;xYItu92 zcAWA5P+cCO%Zb*&dZqU+VlHsIt6$~m)AMv%XlfB{6sR;oeGvWfry*kw}TJYK&X{a z>(cQVNLurw?%1k0AV)=Qw6=n9zK05jm zBgu)N+}vcczAp5$eG<-(RI>68PQ;y*fxB3^C2yHT~its~U3N zVxmP&1}_gG;u9oK*}eDNRH!uHbcQg?N>Nbl+;XxeN%P#ieUymU?mFi}`_|;DzYU4= zt1N>M=fZeIk*uStWnA%`hl5*DcIEEEU+8f6*~aG7$!@gJVNgT320@h#MG9^2%b0;9 z%cFWtxF=-eWyy8Ih#rD)hBm#t?d_d-2COYzXbE!bsSVu z!RwC)Zl{=|&4OWidY{_kud=Vy@7_$TuRkt>ko&;BUr~GJ)<&#r&MT>gct}QO{ zy77dbT~b2d;?hc@RB;N)P+WXleGct_s`9=}h>8Oyi!^3d8Jza50pTNd0)jU_A?D2N zkq*(Kk10yXOPrqzJ%{|6z&~b6>5jaRfEX1JomeWQ_{T!GORSxStXTm8FC@~r$;jNN zxkH+rqo_N9&Ka5+*wcZ*`y{iMh$t@LaY~Ik4had12fuHB1q}#IK>R!qMuCco3S#n3PjUsQqbGzg?F7*wcN){s!~KVm$N z?7WbUTV{#=x7YAeXNZzcMxuCkKBeDnaANvlsL(O<8s6PHbgJf*`*B$-qm&Y7t$!al z&NQQxEQlKP_@RE}Kf<@Lq^rbu6-~Fx2{uq80%-!VLHgSzkpNpTZy!WkXUUMy7$#)!ivxgEN5 z^L(DT($`52A;oH0bYj#DfIz;?@<&coSk3v8c$^({GxaA4HK+tLMmScKZkd}5Mx+I2 z#JVCOAz8WXy><`xA&q(I;ChXh`sTLD#7f*j@=)^3uN_xm*#7dOhz&Wk<1GP)GG4TfAN&fmf;A zokukMH62~g)@bE!gHibZ1G^4WlT($mHatJT+#E~tTtd}Rj8sY|02vxU%ZRZN|2G3* z2BX+NzP<~=dz!Z^(OnTV=L%VeHervNv(698q8T4%W`Il&vwP)PjT3O#(S^UzF1k;q zZ)%~my!=BpNelwi(QJF^(Uzk4aIt2^%z_-k>sGuFyPA&cwG~F-EK^OU1)gPSCN>SF zhU;3wM?b$0S&?+X#cKWadr*)C59u`bJbnnJz0(xHvm_%&CtVgrZr75G43nOPM9l2) zB4kWy0IRB!4T~to)pyboXwy>&EBbQ`8cODe)tkOMpSb>iXn!cKZxDvU)q!M(A7;;1 z$?1mRt%i~U>p}NuvgL0YcRR~cBEUDdz(|vD8ZFcGWkD)E$jQCV8QIQ@c>Yc3Y z)7C%?=pRrHAwsdFNKEznw-`Pa;}003a_N$iOgBr5!gGRfroA);)gOw9iM$+Il)!j~ z|779bJqQ`ldmMzl!GK11T&F|w4F9bKaPW~jS?v`bLgnCi4iCtbLVgPIu(ZR_H4;#nSSxIso=Keg+11p2)IARrLQ~GS8 z$W~X~o~6ujV)ivznv7vdiis~2aT60=d9`ptF-)1+;Ye_{8Uf79mRpXiB%gtv$lh;v zsx%!T!WZ)oYQ7|7^DNqn^i6 z?->F0v{OKtgrR1!K9n978=J~yvH18iySU@>>g2mJB_+N3E7p^&Oh_Il6I%&Tg!x=; zTS1b)=rj}axG0c=OZCa^7pqUS3N20-)?&KYwOr z$_6ejVL}0}3_Ma=m%!hgPEWVKw7(ddqtlJ6Dc##Lts!n(oK<#Q@rI=CVAm5Jc4?9S zYOkX+0+OsvBOTrw!!q8^kqbi=9xotyH`5doqovB66kRiq3FRQX>88A@95V|Sm+}0o08)u)#=5gmPkyjN#uNf(59jp*)aQOeylZG5cR7JA z21)RoQs>59A(O#*t0?YxljQ8^oxAXYH_3T{=OAUQki&-e?PbF?wM@@5_8)7Dt%ZZB zs?S-WfR|tDec3;2H@3E)&>KIWpgtRac!y(EqPS=w#<9Nh6T?ma47`3{_q_9^)wy->eQ>8}v_2{gw7 zNJ{T9D3hYKGl|y&$D`kX@zAVWC<6{T95|(x(#o0X>A{2myl@u#RudBF$et4*<^?DU z81RuX;8si*_BCbF+EP0B&S4fKis-Csv-kZqB#<>8Q(8S=s7XEiTMzottSQCk+cE^tPUFbmB5%5dXzRAm}u8vb*efiHeAL=%Vw7Wf$huutTV{vU=oJ64u<)!3 zSbwkP=K;G}p5%ElE_XH$tp7b>0od5*SjgJ+W%N;7Xt6w|^>_>p&i(O%yFGVt=apnVUpk2Nk@52!nL z-5-0$x>B1A)wfEhVnU($7-Z~JrV_3q7d@Y15xpOUppx)$dF-6|nT0Yg*qt$^t=xcP#NvF{c-U)ZXNj~~pbT06R(?{9vmz-l5O8#>cQ>OO}5~)Q;%QbZLMSOR(NN47@V!H zR_$^5(xI2&^;fP`W%DeOXx@`;6*yyJ88dI_p7!FMv2 zg3~r@SWviVUcAQ;aLCq^_hNlU4gOOMR^M(8c1~6+-#pEnj?VRq?Fy|L9w!9%iew`4 zH1Tkr@y+&Cpb===G&9rml^Nbbdq##c($K(F@neaHIF$=lkH_TgWa)zIaF>NSd7B~9 z)kn&jT21?IRt~UHP`;!D4;NM2oyzI_t9-vBh!&}AI62v|{y08ob9?ERFW_O&*|}tE zcUV*X|1tI!P*FzR-{=Di%pF+x&iOe4A0&^xzH)F zp}`55nwpA?j8w}(K`{6mBx?xwIzq#q#-m*d8rSz{Bj*G-b73$tQhz65vHNbsX`9882GNhNSy0Si|P#UKzj zsjS;FyG;K%w;|}}cvk1o!~Wtg*g&fR)?-#nE4@xY2#`MnzSbQdZhN@%jU?-nz%9&p%j>E@GbeJO*6S$6amk1u;2e zq%a2r4v&wpOq+(^8QaYj5B|%h`iJ%4b-G`Vw3uukz*P@vo!zThIXNbKjC9_U-tAGq zUfTvcUleF;evijrpoN;Yk*CP)brP0Wsl0N+@A6HUuF~HAWU3?Ptz^;I&6vxfp>&GV zo<-r8KWZ^q<--FLG(hUa{p7Cw%#7^#9%3j)7(V`^B$uR$Agj5_!bbb$kb?X-Ssm{t zzH|D7W{ViS(})#Ic_KpFtr%a$QMqTCRfr=dKWjM4L14zOqMoU+N`oVw@Q6$)ZIFgB z`V$wk76&N}O?7#>MvkIpQQP)y6~7Rfp0VBWc{1_mbisOCu~l}R8JL%sipp4D5?_*e z3&lA=evrf2Ln%Z$whrPQo;}3E!=Vj4t=uCweJK$ZF&$UWVoDaFlu6h1ZsnP!xR3nT zY!TCU80dAUKA}&IRd>v1$E~cWX_hK3PVgLbKZqIe^u5AF#Sfj1(<~}b(Hxb2FxS!F zFDEBAUtt?kKs_ku4X~v3loiiRk(kgl$M|VLQEE;{P(x)^xx@9r><>8Vvj+mBfzXUhE>;`tt^Ld zS-~CEdA@@Us&BcSFPJEU_N}`7z<)?CzI%_J4a6lB6cktGkIogMV8zAdftA?RUme%G z6&?<}s#?S%%zr7X9)<46Q8TZgA1QcLXa7$|NI7rEA&WtGuEJ7td#*8Z^zD<^fWiV| z31V_-k6jK+<DG!o0Tzjec(*rB?L@!ZgLj$ex4B(M1_s_+>;1pTtZ)yn5RW-SV*|W~ z_BtFM9?(H$)RA75|E~LmT8$%0g+(31OZqa3dY|Ui*G6JpMjdaiD_xWe+BD8>DbvWE zUl7A@%bnIgz8f|F`7>oQHVQ!n5wsN_IHb=f^aNd+9sV5F1O6pj}_$@y*A_647kUOE>O99v3}4FgwqF zJ5GN7#B(CPr%j~%7P8y(0i%JVKFKt$S-J0B5Fnc~Lc@TvVV2?(jP|bd7v!(}T=@CK z7*R1(?5;^tRNGq`w3JTdRifi4hDWw4MST%}9$#Okn3%>vHez~YkWz1a>;9&jfkLw)Gd@$3+QHJp9GwN*n!Lq4xx5tp_!ErluJkDJ z-!yCfyOAER&OY<#*~LVL-6Cr;^o_XJZ7qsi*!{TTD2xZ2;{9VDO)YSc^)1b za9Rr+rLvuPb(+n2vYQ#<7JbtDCq*IBw=S~8&UML*@NXPZdJJR z(|mgCeZOOL-llMe#bvyab<`%c0KH;9fBwAM?H?WO2RzUoSF8|?Q4i`H=^hywKwu#F z`v$ix)8X8k!i!wpn zVBD-#PmegbT$+b)ZAhU>8nk^FaH|+L%`3FmV9<|xOBz#c-s^TGnWrJJa{Y&|SnX^` zDyThJ=6X3~`|6^@QB{rDmHJlAJ%^iW@NPD@92a(501 z#gR}U&X!wRwbv%0?VHf#_ORa~Or*Xwv zi#D}Gxipw|8y}AZG#^f#y1(&@@$Kgvtf);#G|`w^bRjymYqE~m|M>Siz_q0n&TvcC zDDqqm;=1X-Jr}Cx1zRl`jA>LU1lOzFca@i?_k|9G+v&(m*-uk9_l&rmnAQ*5a|nf) z4&b{Jt`vfTuIESKd$;z~&n>BVnriLv;%-6J1yy(@u+_yF8XA7}@tN6T02d|m*?Z=0 zy??Ncg12WlJS!vkq2qh8#Pj4I*7J=jVG@7ehW8!;Upr$bV_zFII}kygjiSJkG&9R5 zgq?aC_#H_4@y(}l&80qAQZfGY_hUZ9O?`5A<;O>UN_0SLY;5g-i#prHPv}DUcUj}? z70E((ukQZl?rC6lQ%V{JL>bsxW;qQU zdjprn@p7Ez7^bfC{Yf3Bl~Y?=xd|-tNHWvx_&KAl%}8mQX6CD7Xi}|3ed)f1vgS!e z!KqeftHMY{rKW|l4TSR4boBI>RigZ*`-aZ)@;O%RWZXCJGfE_vF+2 z?K6joq}^Cwmz68VDmqB*Kg*qUO9Lm~Ac}2qG~U~iw_w<{x4nlLCh~;cRN)p+=iunr z+`N*DJ<(rbxCe|waHs;}T$_a@C``@=;Xn-(+k=_A-H6}+Mw*OBoj z;eMJ}Nn$%`YSgkhj!CO^0uKCT7Lv%|vJX&2BGB54V})z=cL z@m_5#Nz6y-IyHb?_ZQNANO)+a9o(+*q!6R*LkRtd_{4MO(jUPeI+$GTZ=$Q+vsJ?> z-RS*gjrcQ`+~9lW6X=7xdL;W+T!*m{jZsZdYg1>E>*@*pr5PWO8#RjT9J{NcYAHLX zjIGg;;#N+yM70ivv1VWPO6Ha2#(bH>Bm+^|hohAI+XlD2*_piBrq8D_NZrBsr_(H- zUkp)a(Z3F;lI@cgT5g5wPreh7`jRCY%|6l0nk|>&dAKAd7k!Vv^sr@b@YSmgM+RZ* zqC#mEnu&)49+dR-+kl`3X#c0#2h}deYZ4?LI1dN@PV0?5mD);$u)>1|Nah)O8tBo| zn{3GhrsrP$)b%B{*L4(ahXRH~-*U(>4u@4chUte)5LmX7_}oU*dc~i#(8QR%^ldi~ z)Y5=8UFqK9mwwEc_xLkeId#$OyBicFt=RDe)3v=N_U&7yLUrupF8ZShHObfJi{b3} zNLbilS0t6mj-RcUW6&Xl83w-Ki4(w;`lju#R>NYlr3A6W#H4ubH-0KmIY%c#gMR-M zj#hi|Rpfd^F-GWGiNl)s_;*{mbrWq!&?C2#cj~t{U<6YMF@C>KrOl6^ik7i5O(P8M zvYbXP))*aoFu?9sNMI~=75$`%+)CLV7x^~}pZ)31k4eL|vi+{6Y2EtU@fO{ zcB{Fu$!LVzIw^M57`V+%)Y~U6uvN#b(<+$nhQ$aE3?G z80tgsK|{fdA3uIjCp&+RyE@@nh7}VX{o7A+}`|w(JE%k<3uGVCr3tRD&(2O_x1OqKncAn zs;W*$E0Pc@8X6iV=DvsEzxgctp{NvWfbV|fE}9_OkeMhvo}V6evlx2Kc~yb{AyVH* zTS3Gm=Pi=euIekUlv2WiU0!qZW3Z)Un}B~&Fnr=0fYgR!b5?X*RH>3PNgEW&X~d2t z{(_WD_!))$?vDsf5B!rHI3zqt>-I%kHxmWY^Oh%coMlE#3J1x8TnYxHXSbd$7c1ZJ z(O?FJ1QKq=6pCfiO^ysBBVd7`*Jxr3nUcvC)~ZB^kSghWw3gkGz1afKqs{>dVm-w3 zmexv+&h!k!!NK11b7;W2C-$d5wzg_yuF|UrY9wK>oQNB5Z@PA;r!V&DaNWKo9X;pl zF`i(72JoJ;nzFo_wtrdxtbF4;Qw}%RemPy7fV z@%pY)nqEXVOMsuywp8(2G9$JV-~5qeM6n!uiV5#KBc_O>EOHNtZvmolareX$xe`&l zAHVa9b()RKqduX`#v13j(YZ0ptFt_^=$^FuW+#Z4;{OSolK;UBOW07y=C5Id_f``# z4>qwmajmaN_mH5ov?br}?C$3gFOfTtA#ah)SRC#=E+Ry4Z~FIJCc8UDvzM6{of0A> zdWfy(TJ?nKU<}GOuGZY4XT#P#EkC!JP@-OQ@R+=W_@5muTubcF>(n+D-4^SY8c*cu z2{wN_M@RC0;qfE_8M{J8wKRGE_Nq8udq2hNcKe;~e&L*YCiB~r$UcPNX$&`S4~a*| z&rc0nL+I00?F*U9cXE?KDMlGooSBtXq+NdsxV3?8xZPUMgNF~@){~t0)t|^&@R!!R z$v-x0LIir)+@lp*+MWy57P}NP1Y40NH#jwkBdE190S#uAf zL2=mnstAXTcKdc%;uAm=J8w%iUS7#rgvt#haF->ciaOA&vQr)H2%}yDUgv1jZ-L`5|3oQhv ztENM&sC#Prr3gRMoCw_(p2>BUkAv=2%YTBM+{hn6bwc*%Qb)Am;bNUVt48ySO@FNG zNuW1u=j~TQ=Sm(04sr)sE*;OBrN~h%*yOj6Df%4J0?sV zF>BJD4`O_fypso*8P(7r%IxqGu;@%c*ApUKcDx3c)7~nuu6movFui!Tq#zslU_9Bz z1I=q|(G^j4&PUMB+lf(?%chTrUq20h&L+y``-xNJIeNw0WBg1pb2|b6*cRRj#(d?mV z-t@rq?EJj(xR0+phPkAqWc|Dw1>Yw;b{lc#ApB<#Gn*Q?nX}Me6B^h^xy2kFu z-HHZN{j6tDkD(DWZ0wy+02i(~TcsqZN(WyCq{?O{asSz?z4WXJX>4XFI;~Mj;IfQY zU_kbMSw7j{{SdmRWi__a39)ScnU8oHFpl!bR@+?kBP$B2@s^VArv;dUgOqIY_u3{% zTUR$FAwd&J=UDY~WULzw+X%qZa)=OpE<|Z^fQgAP*&q!Fdy5DJ$#ZYZtWWc2rC)ZvYl(KG`gtIG{ z6_pYvc&x~VHtE>!v^c*O$w2wvGt zI?X?EZPZ`u0a1Q7`1Rns<2*%1<34n?szOUy)zS$tXQS0Xt(m{p%NG_6Qt2(2y=jQ( z$;(F=A$ZC08aMl1P8!~O&GY_c73%Gk?Z?@xw5@L;8n&29k6i)zXR#bS4 z568}M%GtLME$e{QSQ?l{dxK4zDbuj!Xw9`q+0qYaUD0N3^O<7mfxuA73fe6 zqSXhD4|D1K0jV{JOj5p_0qF=8j(m#V!I5=d14xi(UV&z&$|c%8h=rcwHLca{F6?l* z-Fl{mm6kSdxsE|b+uzTR6m-M~IFaGYxRMfUQPD5d^rxh_|Dt4u3;bB2PZ1HCPasLg z_cWcQltUXptQCg)ph0H}p3Y`xUon{maC#SQ)l~BM z1TWcqYE|)k{hQZ(Mt4ih>4hJD@kuKejZ3|5J7J57k2`0mzVP_W90mbL@F4}(kj2`c zbgJo6Q7Bci%xHhEYRof3ob~Atnb&#Xo3z}Ss-nH02pAzbZ)Az9tddk=o>rG7SN&dF zm?VxGMVXT`UYkPz&6$p`3usN&>;KWd#bqQt8ccL89g6r=ua20d^$ z3OVk?0;J%$m&>>>k;mm|MJk5Lfs2yA)NQSpzjT%ur!aQ5dj>D{OE&U($Z>yS9Bp9q zdFv(ZI_-7)1rlWX!V+G!r9BFl&>*Q#-ND(-w5;SD|Fp{+kB`INH}7R+WKk+)E8sd-XS`>_~5+AO`P;G%dHbPVRGTbm;Xe! zU@Db>X|(om8~@=Yij#Y6S6>qd&fS z_hpha;KOoTt$`j^D<#A`2@Gft9>nujF8PvVK6$bm4+27Z-YdoS^N@r%9ySeJqJ2Ce zIUei6TQ$saj_@{63JE>F`e}EaVz3tbMzOKTQx#rJ4ws1KaqQa5OscHX7$?h_e$EY0 znNLV=wPetH2Mq-8JT-q8{e<%Bm@imeP-~2Jp`K=Z z@&YXmpB?TSK=LAUJn0Sb9!-C#(}Xg<_Vbq?P>=P1Y#1WN^8bcOGB+D}(6Sd-f7IgW zCjUd!ZJRx|&{rgCe~^-0^GX0H(hG&z(wi2vR3s@cX9 zjN>yAQj5xFM)fVF>Nr0(PBck$*h}&7!XB-ma=IA!NI zW}?SNMm{op35CMeESEhN3024cnsREYw&SukZAtYb2Gd7rogOWZw6vXjLz1yRZ>Oy zZaLn#xzq2xaz{Vq3$QXe z$8Y~e3;Uc^pzC>VIGV3av<~|-=QfMqR?(w{OM@PHXb27Hj=@G|rn`Stipu3?ZQWry zse}XpT->HP)2gGb&h0FsG2eH%jt&#sBc66jewwW(tV_^yYP35g;?Zq#=~>IVFQqGV zeBniX6*D}FSx;ac<~lf}D5V>)x7@wBmU&p&{hn|3E45=v{X^NEJz^YtW)nu?<5l+| z;i_H-qK&vk?Db{rb?kGcmBGspP#Ru@9IyL357E$?zPJo>ye0AtUUGK_kK};w4YwPE z-`m8;5i3Hw9kg_H*X+3U^got%wn&GwYwN$PB={begoYwH#zT;K3baSOosCYOe(**bUHWa^4@b*tv;l#> z0nwo6&pGOy=3x%>aufj`>q#dqEdiF(FK`)ZUME;25@SeX9K~dNA_easNwGCV}1M$!~`Qcjs76hU&De;XCH$qsibF`yVJCNlOv8YXBm+x zktwL|Qx!G-sM2((BR1Yh``-3_mZQFU4yN3K-H3fDtM9s06=3=Bh1KM0C{8Q|UdNyD zN*LkZ9y?gUc22|ovxlkgTX%HEG`yoRqw!+!xH7o_#8Eh>Y{_kn8vFPs`(~Mg&nMKx zXB`m-CtqFb$NJDO(4luy>3xlE#q%AWWaT2>NQ^m}_-yzn#kR-0nHEWX!jG|$kSO_e z(sW8Hr!z{tgx`BhJ65FWHNAZb_;_dj2O%iXv2uQIRu(AqNUit#OSA?Zo;^0$pKAog z*cE8tqPul~=M3h?b9R#fX4q93*f|##-j}K|I6TLsASX8fn-=K7G6hQ33F^{+h_+=g zdqisrPJ08c0TYMnm3&(K{Dt|`ZUIh+yQoiUo9U6OL1@-*g`54O1M1(i$O=93Z$^iH zKmAG$dqzt@T0W++jWHs|=#S`qFmk|Fl9DH+MZ(VU#z{-HzGN(d3#Dvki|qr_her|w zO2^8-g~{Yv47yf#EF2tUTwKdi zs1Sdm6RFP<%yjT0Fc})WW#Ir8MAq7nwG?diqjP})nC`7xt(sj`{0X-^Ipl)MQX?_n zV;q(CoxS`nyVD9V5WF)xEM^_r>6>&Lyy?|k%{D6*ObxEvk)7}3Y&>jYI_G624a-AQ z)}SjW8f|UUhq$e|``3>|Uy~(aR9r84<0;xIV2qP^lAitVA$$|>4nHX<7cr7~5RV7} zFr6|?>c;i31oIpJMkmcrhNJkSSjDeT7y~hIkX_3%xPPiYD?RvfJg$wwz?Y9=>O7>E zV|v2#7mVI}rT3o|rP3pRj{fr{1d1% zsZpR`+l~yKKX&P!jMlxVF6KBe{PU&9wz1}qH4L`U`uU{AzSvtTEb>BmOu#7uBB zv6?2Nd3k_>h?816DcfC~CS&d3S;g4Fe;Q z-E<*e`Gwf_0y1F3e3JMc>blZ;=x=W?;BpB) zSxl`AY%Xc#HzMh}=56JqFkQh*nuX3YxfW$Jvub67ua+LJ8iY7RA(wYrD#`JGJj@88 z>7R=kj(Q&O9FQM*wRu_?T&$$5>R}cyG+|fyP8+JYMF1gXm9xm%dH5Tz=Rral!z~RwoR1rwsCL}*4zm0=i(*8}erNoh{y� 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�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

alF^gYx{>~{wR{k}E4F5o85HVOl^7WXR5Vp=!1 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

!w(U3^eEjA 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 z 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¥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 P-m=TG$}+i9hIjuL(|mqg literal 0 HcmV?d00001 From 4dfe34eedcef59b31d7b66b7301c71e832887d5c Mon Sep 17 00:00:00 2001 From: iequidoo Date: Sat, 15 Apr 2023 21:05:37 -0400 Subject: [PATCH 004/528] fix review comments --- src/blob.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/blob.rs b/src/blob.rs index 98df31158..579a2ad4e 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -372,14 +372,12 @@ impl<'a> BlobObject<'a> { let mut encoded = Vec::new(); let mut changed_name = None; - if matches!(orientation, Some(90) | Some(180) | Some(270)) { - img = match orientation { - Some(90) => img.rotate90(), - Some(180) => img.rotate180(), - Some(270) => img.rotate270(), - _ => img, - } - } + img = match orientation { + Some(90) => img.rotate90(), + Some(180) => img.rotate180(), + Some(270) => img.rotate270(), + _ => img, + }; let exceeds_wh = img.width() > img_wh || img.height() > img_wh; let exceeds_max_bytes = nr_bytes > max_bytes as u64; @@ -387,7 +385,10 @@ impl<'a> BlobObject<'a> { let fmt = ImageFormat::from_path(&blob_abs); let ofmt = match fmt { Ok(ImageFormat::Png) if !exceeds_max_bytes => ImageOutputFormat::Png, - _ => ImageOutputFormat::Jpeg(75), + _ => { + let jpeg_quality = 75; + ImageOutputFormat::Jpeg(jpeg_quality) + } }; // We need to rewrite images with Exif to remove metadata such as location, // camera model, etc. From 2b8888350ba6bda1eec94462e34e914ea81c841d Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 16 Apr 2023 00:37:39 +0000 Subject: [PATCH 005/528] Debug logging refactoring Move DebugLogging into debug logging module. Remove Context.send_log_event(). Use blocking_read() instead of try_read() to get read lock on debug_logging() in synchronous code. Do not try to log events while holding a lock on DebugLogging. --- src/context.rs | 47 ++++--------------------------- src/debug_logging.rs | 66 ++++++++++++++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 61 deletions(-) diff --git a/src/context.rs b/src/context.rs index 833e68e9f..1babc592e 100644 --- a/src/context.rs +++ b/src/context.rs @@ -12,13 +12,12 @@ use anyhow::{bail, ensure, Context as _, Result}; use async_channel::{self as channel, Receiver, Sender}; use ratelimit::Ratelimit; use tokio::sync::{Mutex, Notify, RwLock}; -use tokio::task; use crate::chat::{get_chat_cnt, ChatId}; use crate::config::Config; use crate::constants::DC_VERSION_STR; use crate::contact::Contact; -use crate::debug_logging::DebugEventLogData; +use crate::debug_logging::DebugLogging; use crate::events::{Event, EventEmitter, EventType, Events}; use crate::key::{DcKey, SignedPublicKey}; use crate::login_param::LoginParam; @@ -247,17 +246,6 @@ pub struct InnerContext { pub(crate) debug_logging: RwLock>, } -#[derive(Debug)] -pub(crate) struct DebugLogging { - /// The message containing the logging xdc - pub(crate) msg_id: MsgId, - /// Handle to the background task responsible for sending - pub(crate) loop_handle: task::JoinHandle<()>, - /// Channel that log events should be sent to. - /// A background loop will receive and handle them. - pub(crate) sender: Sender, -} - /// The state of ongoing process. #[derive(Debug)] enum RunningState { @@ -449,41 +437,18 @@ impl Context { /// Emits a single event. pub fn emit_event(&self, event: EventType) { - if self - .debug_logging - .try_read() - .ok() - .map(|inner| inner.is_some()) - == Some(true) { - self.send_log_event(event.clone()).ok(); - }; + let lock = tokio::task::block_in_place(|| self.debug_logging.blocking_read()); + if let Some(debug_logging) = &*lock { + debug_logging.log_event(event.clone()); + } + } self.events.emit(Event { id: self.id, typ: event, }); } - pub(crate) fn send_log_event(&self, event: EventType) -> anyhow::Result<()> { - if let Ok(lock) = self.debug_logging.try_read() { - if let Some(DebugLogging { - msg_id: xdc_id, - sender, - .. - }) = &*lock - { - let event_data = DebugEventLogData { - time: time(), - msg_id: *xdc_id, - event, - }; - - sender.try_send(event_data).ok(); - } - } - Ok(()) - } - /// Emits a generic MsgsChanged event (without chat or message id) pub fn emit_msgs_changed_without_ids(&self) { self.emit_event(EventType::MsgsChanged { diff --git a/src/debug_logging.rs b/src/debug_logging.rs index d7c93f0e4..5b5982e25 100644 --- a/src/debug_logging.rs +++ b/src/debug_logging.rs @@ -2,17 +2,41 @@ use crate::{ chat::ChatId, config::Config, - context::{Context, DebugLogging}, + context::Context, message::{Message, MsgId, Viewtype}, param::Param, + tools::time, webxdc::StatusUpdateItem, Event, EventType, }; -use async_channel::{self as channel, Receiver}; +use async_channel::{self as channel, Receiver, Sender}; use serde_json::json; use std::path::PathBuf; use tokio::task; +#[derive(Debug)] +pub(crate) struct DebugLogging { + /// The message containing the logging xdc + pub(crate) msg_id: MsgId, + /// Handle to the background task responsible for sending + pub(crate) loop_handle: task::JoinHandle<()>, + /// Channel that log events should be sent to. + /// A background loop will receive and handle them. + pub(crate) sender: Sender, +} + +impl DebugLogging { + pub(crate) fn log_event(&self, event: EventType) { + let event_data = DebugEventLogData { + time: time(), + msg_id: self.msg_id, + event, + }; + + self.sender.try_send(event_data).ok(); + } +} + /// Store all information needed to log an event to a webxdc. pub struct DebugEventLogData { pub time: i64, @@ -112,24 +136,26 @@ pub(crate) async fn set_debug_logging_xdc(ctx: &Context, id: Option) -> a Some(msg_id.to_string().as_ref()), ) .await?; - let debug_logging = &mut *ctx.debug_logging.write().await; - match debug_logging { - // Switch logging xdc - Some(debug_logging) => debug_logging.msg_id = msg_id, - // Bootstrap background loop for message forwarding - None => { - let (sender, debug_logging_recv) = channel::bounded(1000); - let loop_handle = { - let ctx = ctx.clone(); - task::spawn( - async move { debug_logging_loop(&ctx, debug_logging_recv).await }, - ) - }; - *debug_logging = Some(DebugLogging { - msg_id, - loop_handle, - sender, - }); + { + let debug_logging = &mut *ctx.debug_logging.write().await; + match debug_logging { + // Switch logging xdc + Some(debug_logging) => debug_logging.msg_id = msg_id, + // Bootstrap background loop for message forwarding + None => { + let (sender, debug_logging_recv) = channel::bounded(1000); + let loop_handle = { + let ctx = ctx.clone(); + task::spawn(async move { + debug_logging_loop(&ctx, debug_logging_recv).await + }) + }; + *debug_logging = Some(DebugLogging { + msg_id, + loop_handle, + sender, + }); + } } } info!(ctx, "replacing logging webxdc"); From 2b7ee85e3055886f19a08291913c919d8cc0bb92 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 16 Apr 2023 18:07:56 +0000 Subject: [PATCH 006/528] debug_logging: use Context.emit_event() --- src/debug_logging.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/debug_logging.rs b/src/debug_logging.rs index 5b5982e25..998b0ab76 100644 --- a/src/debug_logging.rs +++ b/src/debug_logging.rs @@ -7,7 +7,7 @@ use crate::{ param::Param, tools::time, webxdc::StatusUpdateItem, - Event, EventType, + EventType, }; use async_channel::{self as channel, Receiver, Sender}; use serde_json::json; @@ -72,12 +72,9 @@ pub async fn debug_logging_loop(context: &Context, events: Receiver { - context.events.emit(Event { - id: context.id, - typ: EventType::WebxdcStatusUpdate { - msg_id, - status_update_serial: serial, - }, + context.emit_event(EventType::WebxdcStatusUpdate { + msg_id, + status_update_serial: serial, }); } } From 4716fcef940bc15d57a9c60a33e03edf947b2507 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 16 Apr 2023 18:48:06 +0000 Subject: [PATCH 007/528] Use sync RwLock for debug_logging This avoids the need for potentially expensive block_in_place(), but is unlikely to actually block the thread as holding write lock is rare. --- src/context.rs | 9 ++++++--- src/debug_logging.rs | 4 ++-- src/message.rs | 2 +- src/scheduler.rs | 7 ++++++- src/webxdc.rs | 4 ++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/context.rs b/src/context.rs index 1babc592e..c0a4b8621 100644 --- a/src/context.rs +++ b/src/context.rs @@ -243,7 +243,10 @@ pub struct InnerContext { pub(crate) last_error: std::sync::RwLock, /// If debug logging is enabled, this contains all necessary information - pub(crate) debug_logging: RwLock>, + /// + /// Standard RwLock instead of [`tokio::sync::RwLock`] is used + /// because the lock is used from synchronous [`Context::emit_event`]. + pub(crate) debug_logging: std::sync::RwLock>, } /// The state of ongoing process. @@ -382,7 +385,7 @@ impl Context { creation_time: std::time::SystemTime::now(), last_full_folder_scan: Mutex::new(None), last_error: std::sync::RwLock::new("".to_string()), - debug_logging: RwLock::new(None), + debug_logging: std::sync::RwLock::new(None), }; let ctx = Context { @@ -438,7 +441,7 @@ impl Context { /// Emits a single event. pub fn emit_event(&self, event: EventType) { { - let lock = tokio::task::block_in_place(|| self.debug_logging.blocking_read()); + let lock = self.debug_logging.read().expect("RwLock is poisoned"); if let Some(debug_logging) = &*lock { debug_logging.log_event(event.clone()); } diff --git a/src/debug_logging.rs b/src/debug_logging.rs index 998b0ab76..7b343a35f 100644 --- a/src/debug_logging.rs +++ b/src/debug_logging.rs @@ -134,7 +134,7 @@ pub(crate) async fn set_debug_logging_xdc(ctx: &Context, id: Option) -> a ) .await?; { - let debug_logging = &mut *ctx.debug_logging.write().await; + let debug_logging = &mut *ctx.debug_logging.write().expect("RwLock is poisoned"); match debug_logging { // Switch logging xdc Some(debug_logging) => debug_logging.msg_id = msg_id, @@ -162,7 +162,7 @@ pub(crate) async fn set_debug_logging_xdc(ctx: &Context, id: Option) -> a ctx.sql .set_raw_config(Config::DebugLogging.as_ref(), None) .await?; - *ctx.debug_logging.write().await = None; + *ctx.debug_logging.write().expect("RwLock is poisoned") = None; info!(ctx, "removing logging webxdc"); } } diff --git a/src/message.rs b/src/message.rs index ea72a8c99..52642ed44 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1425,7 +1425,7 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { let logging_xdc_id = context .debug_logging .read() - .await + .expect("RwLock is poisoned") .as_ref() .map(|dl| dl.msg_id); diff --git a/src/scheduler.rs b/src/scheduler.rs index 840824f09..1c2bf861a 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -105,7 +105,12 @@ impl SchedulerState { // to allow for clean shutdown. context.new_msgs_notify.notify_one(); - if let Some(debug_logging) = context.debug_logging.read().await.as_ref() { + if let Some(debug_logging) = context + .debug_logging + .read() + .expect("RwLock is poisoned") + .as_ref() + { debug_logging.loop_handle.abort(); } let prev_state = std::mem::replace(&mut *inner, new_state); diff --git a/src/webxdc.rs b/src/webxdc.rs index cf143da12..2a8217667 100644 --- a/src/webxdc.rs +++ b/src/webxdc.rs @@ -2466,9 +2466,9 @@ sth_for_the = "future""# include_bytes!("../test-data/webxdc/minimal.xdc"), ) .await?; - assert!(alice.debug_logging.read().await.is_none()); + assert!(alice.debug_logging.read().unwrap().is_none()); send_msg(&alice, chat_id, &mut instance).await?; - assert!(alice.debug_logging.read().await.is_some()); + assert!(alice.debug_logging.read().unwrap().is_some()); alice.emit_event(EventType::Info("hi".to_string())); alice From 9150e9fb381483df59a744a64de3ef50a5d88651 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 17 Apr 2023 10:48:35 +0000 Subject: [PATCH 008/528] Update crossbeam-channel from 0.5.7 to 0.5.8 0.5.7 is yanked. --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d9f4fa9c..0db873364 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -836,9 +836,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", From 179b9ba2cb58511a5b5d9f822c97697f15510b02 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 17 Apr 2023 10:41:17 +0000 Subject: [PATCH 009/528] Update to released async-imap 0.8.0 It fixes important bug in `ensure_capacity()` that sometimes resulted in erroneous detection of EOF in IMAP response. --- CHANGELOG.md | 6 ++++++ Cargo.lock | 26 +++++++------------------- Cargo.toml | 2 +- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3d6775d9..e1f0932d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Fixes + +- Updated `async-imap` to v0.8.0 to fix erroneous EOF detection in long IMAP responses. + ## [1.112.6] - 2023-04-04 ### Changes diff --git a/Cargo.lock b/Cargo.lock index 0db873364..3c9945e30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -189,12 +189,12 @@ dependencies = [ [[package]] name = "async-imap" -version = "0.6.0" -source = "git+https://github.com/async-email/async-imap?branch=master#90270474a5a494669e7c63c13471d189afdc98ae" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d11e163a705d0c809dfc886eee95df5117c758539c940c0fe9aa3aa4da5388ce" dependencies = [ "async-channel", - "async-native-tls 0.4.0", - "base64 0.13.1", + "base64 0.21.0", "byte-pool", "chrono", "futures", @@ -218,18 +218,6 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-native-tls" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" -dependencies = [ - "native-tls", - "thiserror", - "tokio", - "url", -] - [[package]] name = "async-native-tls" version = "0.5.0" @@ -494,9 +482,9 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byte-pool" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c7230ddbb427b1094d477d821a99f3f54d36333178eeb806e279bcdcecf0ca" +checksum = "c2f1b21189f50b5625efa6227cf45e9d4cfdc2e73582df2b879e9689e78a7158" dependencies = [ "crossbeam-queue", "stable_deref_trait", @@ -1067,7 +1055,7 @@ dependencies = [ "anyhow", "async-channel", "async-imap", - "async-native-tls 0.5.0", + "async-native-tls", "async-smtp", "async_zip", "backtrace", diff --git a/Cargo.toml b/Cargo.toml index 5deca72b8..c3b91d1a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ ratelimit = { path = "./deltachat-ratelimit" } anyhow = "1" async-channel = "1.8.0" -async-imap = { git = "https://github.com/async-email/async-imap", branch = "master", default-features = false, features = ["runtime-tokio"] } +async-imap = { version = "0.8.0", default-features = false, features = ["runtime-tokio"] } async-native-tls = { version = "0.5", default-features = false, features = ["runtime-tokio"] } async-smtp = { version = "0.9", default-features = false, features = ["runtime-tokio"] } async_zip = { version = "0.0.11", default-features = false, features = ["deflate", "fs"] } From 0b832fb9de2eb2c1f110f1b9550cdff2ef76e033 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 17 Apr 2023 15:18:37 +0000 Subject: [PATCH 010/528] Prepare 1.112.7 --- CHANGELOG.md | 4 +++- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 4 ++-- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 4 ++-- 9 files changed, 17 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1f0932d8..781fee77e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## [1.112.7] - 2023-04-17 ### Fixes @@ -2379,3 +2379,5 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.3]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.2...v1.112.3 [1.112.4]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.3...v1.112.4 [1.112.5]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.4...v1.112.5 +[1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 +[1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 diff --git a/Cargo.lock b/Cargo.lock index 3c9945e30..87198de03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.6" +version = "1.112.7" dependencies = [ "ansi_term", "anyhow", @@ -1123,7 +1123,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.112.6" +version = "1.112.7" dependencies = [ "anyhow", "async-channel", @@ -1146,7 +1146,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.112.6" +version = "1.112.7" dependencies = [ "ansi_term", "anyhow", @@ -1161,7 +1161,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.112.6" +version = "1.112.7" dependencies = [ "anyhow", "deltachat", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.112.6" +version = "1.112.7" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index c3b91d1a2..cbd021e2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.112.6" +version = "1.112.7" edition = "2021" license = "MPL-2.0" rust-version = "1.64" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index f6ed211e4..674dbbe93 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.112.6" +version = "1.112.7" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 3360e7368..0007a7b60 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.112.6" +version = "1.112.7" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index e2743bba7..7409bbe60 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.112.6" -} + "version": "1.112.7" +} \ No newline at end of file diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index c6cee05cf..4546ec4b9 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.112.6" +version = "1.112.7" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 5edba509b..fb94b10bf 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.112.6" +version = "1.112.7" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 6716b8c01..d4be1a946 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.112.6" -} + "version": "1.112.7" +} \ No newline at end of file From 21349abed8712a917719fe9ed5fd0da10a9ed309 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 17 Apr 2023 16:07:05 +0000 Subject: [PATCH 011/528] Fix newlines with `prettier` --- deltachat-jsonrpc/typescript/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 7409bbe60..22f28e581 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -56,4 +56,4 @@ "type": "module", "types": "dist/deltachat.d.ts", "version": "1.112.7" -} \ No newline at end of file +} diff --git a/package.json b/package.json index d4be1a946..cc84325ba 100644 --- a/package.json +++ b/package.json @@ -61,4 +61,4 @@ }, "types": "node/dist/index.d.ts", "version": "1.112.7" -} \ No newline at end of file +} From 538db538879085829a85a9ba3e06b626aef98093 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 16 Apr 2023 18:27:28 +0000 Subject: [PATCH 012/528] accounts: comment fixes --- src/accounts.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/accounts.rs b/src/accounts.rs index 082057595..9c214b371 100644 --- a/src/accounts.rs +++ b/src/accounts.rs @@ -18,6 +18,7 @@ use crate::stock_str::StockStrings; pub struct Accounts { dir: PathBuf, config: Config, + /// Map from account ID to the account. accounts: BTreeMap, /// Event channel to emit account manager errors. @@ -78,12 +79,12 @@ impl Accounts { }) } - /// Get an account by its `id`: + /// Returns an account by its `id`: pub fn get_account(&self, id: u32) -> Option { self.accounts.get(&id).cloned() } - /// Get the currently selected account. + /// Returns the currently selected account. pub fn get_selected_account(&self) -> Option { let id = self.config.get_selected_account(); self.accounts.get(&id).cloned() @@ -97,14 +98,14 @@ impl Accounts { } } - /// Select the given account. + /// Selects the given account. pub async fn select_account(&mut self, id: u32) -> Result<()> { self.config.select_account(id).await?; Ok(()) } - /// Add a new account and opens it. + /// Adds a new account and opens it. /// /// Returns account ID. pub async fn add_account(&mut self) -> Result { @@ -139,7 +140,7 @@ impl Accounts { Ok(account_config.id) } - /// Remove an account. + /// Removes an account. pub async fn remove_account(&mut self, id: u32) -> Result<()> { let ctx = self .accounts @@ -160,7 +161,7 @@ impl Accounts { Ok(()) } - /// Migrate an existing account into this structure. + /// Migrates an existing account into this structure. /// /// Returns the ID of new account. pub async fn migrate_account(&mut self, dbfile: PathBuf) -> Result { From f267f6f7563f62484d62621bbea9c5d9f30c6c26 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 16 Apr 2023 00:00:20 +0000 Subject: [PATCH 013/528] Move event payloads to a submodule --- src/events.rs | 259 +----------------------------------------- src/events/payload.rs | 258 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 261 insertions(+), 256 deletions(-) create mode 100644 src/events/payload.rs diff --git a/src/events.rs b/src/events.rs index ade9fe8db..977d3f62c 100644 --- a/src/events.rs +++ b/src/events.rs @@ -1,15 +1,10 @@ //! # Events specification. -use std::path::PathBuf; - use async_channel::{self as channel, Receiver, Sender, TrySendError}; -use serde::Serialize; -use crate::chat::ChatId; -use crate::contact::ContactId; -use crate::ephemeral::Timer as EphemeralTimer; -use crate::message::MsgId; -use crate::webxdc::StatusUpdateSerial; +mod payload; + +pub use self::payload::EventType; /// Event channel. #[derive(Debug, Clone)] @@ -110,251 +105,3 @@ pub struct Event { /// These are documented in `deltachat.h` as the `DC_EVENT_*` constants. pub typ: EventType, } - -/// Event payload. -#[derive(Debug, Clone, PartialEq, Eq, Serialize)] -pub enum EventType { - /// The library-user may write an informational string to the log. - /// - /// This event should *not* be reported to the end-user using a popup or something like - /// that. - Info(String), - - /// Emitted when SMTP connection is established and login was successful. - SmtpConnected(String), - - /// Emitted when IMAP connection is established and login was successful. - ImapConnected(String), - - /// Emitted when a message was successfully sent to the SMTP server. - SmtpMessageSent(String), - - /// Emitted when an IMAP message has been marked as deleted - ImapMessageDeleted(String), - - /// Emitted when an IMAP message has been moved - ImapMessageMoved(String), - - /// Emitted before going into IDLE on the Inbox folder. - ImapInboxIdle, - - /// Emitted when an new file in the $BLOBDIR was created - NewBlobFile(String), - - /// Emitted when an file in the $BLOBDIR was deleted - DeletedBlobFile(String), - - /// The library-user should write a warning string to the log. - /// - /// This event should *not* be reported to the end-user using a popup or something like - /// that. - Warning(String), - - /// The library-user should report an error to the end-user. - /// - /// As most things are asynchronous, things may go wrong at any time and the user - /// should not be disturbed by a dialog or so. Instead, use a bubble or so. - /// - /// However, for ongoing processes (eg. configure()) - /// or for functions that are expected to fail (eg. dc_continue_key_transfer()) - /// it might be better to delay showing these events until the function has really - /// failed (returned false). It should be sufficient to report only the *last* error - /// in a messasge box then. - Error(String), - - /// An action cannot be performed because the user is not in the group. - /// Reported eg. after a call to - /// dc_set_chat_name(), dc_set_chat_profile_image(), - /// dc_add_contact_to_chat(), dc_remove_contact_from_chat(), - /// dc_send_text_msg() or another sending function. - ErrorSelfNotInGroup(String), - - /// Messages or chats changed. One or more messages or chats changed for various - /// reasons in the database: - /// - Messages sent, received or removed - /// - Chats created, deleted or archived - /// - A draft has been set - /// - MsgsChanged { - /// Set if only a single chat is affected by the changes, otherwise 0. - chat_id: ChatId, - - /// Set if only a single message is affected by the changes, otherwise 0. - msg_id: MsgId, - }, - - /// Reactions for the message changed. - ReactionsChanged { - /// ID of the chat which the message belongs to. - chat_id: ChatId, - - /// ID of the message for which reactions were changed. - msg_id: MsgId, - - /// ID of the contact whose reaction set is changed. - contact_id: ContactId, - }, - - /// There is a fresh message. Typically, the user will show an notification - /// when receiving this message. - /// - /// There is no extra #DC_EVENT_MSGS_CHANGED event send together with this event. - IncomingMsg { - /// ID of the chat where the message is assigned. - chat_id: ChatId, - - /// ID of the message. - msg_id: MsgId, - }, - - /// Downloading a bunch of messages just finished. - IncomingMsgBunch { - /// List of incoming message IDs. - msg_ids: Vec, - }, - - /// Messages were seen or noticed. - /// chat id is always set. - MsgsNoticed(ChatId), - - /// A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to - /// DC_STATE_OUT_DELIVERED, see dc_msg_get_state(). - MsgDelivered { - /// ID of the chat which the message belongs to. - chat_id: ChatId, - - /// ID of the message that was successfully sent. - msg_id: MsgId, - }, - - /// A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to - /// DC_STATE_OUT_FAILED, see dc_msg_get_state(). - MsgFailed { - /// ID of the chat which the message belongs to. - chat_id: ChatId, - - /// ID of the message that could not be sent. - msg_id: MsgId, - }, - - /// A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to - /// DC_STATE_OUT_MDN_RCVD, see dc_msg_get_state(). - MsgRead { - /// ID of the chat which the message belongs to. - chat_id: ChatId, - - /// ID of the message that was read. - msg_id: MsgId, - }, - - /// Chat changed. The name or the image of a chat group was changed or members were added or removed. - /// Or the verify state of a chat has changed. - /// See dc_set_chat_name(), dc_set_chat_profile_image(), dc_add_contact_to_chat() - /// and dc_remove_contact_from_chat(). - /// - /// This event does not include ephemeral timer modification, which - /// is a separate event. - ChatModified(ChatId), - - /// Chat ephemeral timer changed. - ChatEphemeralTimerModified { - /// Chat ID. - chat_id: ChatId, - - /// New ephemeral timer value. - timer: EphemeralTimer, - }, - - /// Contact(s) created, renamed, blocked or deleted. - /// - /// @param data1 (int) If set, this is the contact_id of an added contact that should be selected. - ContactsChanged(Option), - - /// Location of one or more contact has changed. - /// - /// @param data1 (u32) contact_id of the contact for which the location has changed. - /// If the locations of several contacts have been changed, - /// eg. after calling dc_delete_all_locations(), this parameter is set to `None`. - LocationChanged(Option), - - /// Inform about the configuration progress started by configure(). - ConfigureProgress { - /// Progress. - /// - /// 0=error, 1-999=progress in permille, 1000=success and done - progress: usize, - - /// Progress comment or error, something to display to the user. - comment: Option, - }, - - /// Inform about the import/export progress started by imex(). - /// - /// @param data1 (usize) 0=error, 1-999=progress in permille, 1000=success and done - /// @param data2 0 - ImexProgress(usize), - - /// A file has been exported. A file has been written by imex(). - /// This event may be sent multiple times by a single call to imex(). - /// - /// A typical purpose for a handler of this event may be to make the file public to some system - /// services. - /// - /// @param data2 0 - ImexFileWritten(PathBuf), - - /// Progress information of a secure-join handshake from the view of the inviter - /// (Alice, the person who shows the QR code). - /// - /// These events are typically sent after a joiner has scanned the QR code - /// generated by dc_get_securejoin_qr(). - SecurejoinInviterProgress { - /// ID of the contact that wants to join. - contact_id: ContactId, - - /// Progress as: - /// 300=vg-/vc-request received, typically shown as "bob@addr joins". - /// 600=vg-/vc-request-with-auth received, vg-member-added/vc-contact-confirm sent, typically shown as "bob@addr verified". - /// 800=contact added to chat, shown as "bob@addr securely joined GROUP". Only for the verified-group-protocol. - /// 1000=Protocol finished for this contact. - progress: usize, - }, - - /// Progress information of a secure-join handshake from the view of the joiner - /// (Bob, the person who scans the QR code). - /// The events are typically sent while dc_join_securejoin(), which - /// may take some time, is executed. - SecurejoinJoinerProgress { - /// ID of the inviting contact. - contact_id: ContactId, - - /// Progress as: - /// 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." - /// (Bob has verified alice and waits until Alice does the same for him) - progress: usize, - }, - - /// The connectivity to the server changed. - /// This means that you should refresh the connectivity view - /// and possibly the connectivtiy HTML; see dc_get_connectivity() and - /// dc_get_connectivity_html() for details. - ConnectivityChanged, - - /// The user's avatar changed. - SelfavatarChanged, - - /// Webxdc status update received. - WebxdcStatusUpdate { - /// Message ID. - msg_id: MsgId, - - /// Status update ID. - status_update_serial: StatusUpdateSerial, - }, - - /// Inform that a message containing a webxdc instance has been deleted. - WebxdcInstanceDeleted { - /// ID of the deleted message. - msg_id: MsgId, - }, -} diff --git a/src/events/payload.rs b/src/events/payload.rs new file mode 100644 index 000000000..3820651a6 --- /dev/null +++ b/src/events/payload.rs @@ -0,0 +1,258 @@ +//! # Event payloads. + +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +use crate::chat::ChatId; +use crate::contact::ContactId; +use crate::ephemeral::Timer as EphemeralTimer; +use crate::message::MsgId; +use crate::webxdc::StatusUpdateSerial; + +/// Event payload. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub enum EventType { + /// The library-user may write an informational string to the log. + /// + /// This event should *not* be reported to the end-user using a popup or something like + /// that. + Info(String), + + /// Emitted when SMTP connection is established and login was successful. + SmtpConnected(String), + + /// Emitted when IMAP connection is established and login was successful. + ImapConnected(String), + + /// Emitted when a message was successfully sent to the SMTP server. + SmtpMessageSent(String), + + /// Emitted when an IMAP message has been marked as deleted + ImapMessageDeleted(String), + + /// Emitted when an IMAP message has been moved + ImapMessageMoved(String), + + /// Emitted before going into IDLE on the Inbox folder. + ImapInboxIdle, + + /// Emitted when an new file in the $BLOBDIR was created + NewBlobFile(String), + + /// Emitted when an file in the $BLOBDIR was deleted + DeletedBlobFile(String), + + /// The library-user should write a warning string to the log. + /// + /// This event should *not* be reported to the end-user using a popup or something like + /// that. + Warning(String), + + /// The library-user should report an error to the end-user. + /// + /// As most things are asynchronous, things may go wrong at any time and the user + /// should not be disturbed by a dialog or so. Instead, use a bubble or so. + /// + /// However, for ongoing processes (eg. configure()) + /// or for functions that are expected to fail (eg. dc_continue_key_transfer()) + /// it might be better to delay showing these events until the function has really + /// failed (returned false). It should be sufficient to report only the *last* error + /// in a messasge box then. + Error(String), + + /// An action cannot be performed because the user is not in the group. + /// Reported eg. after a call to + /// dc_set_chat_name(), dc_set_chat_profile_image(), + /// dc_add_contact_to_chat(), dc_remove_contact_from_chat(), + /// dc_send_text_msg() or another sending function. + ErrorSelfNotInGroup(String), + + /// Messages or chats changed. One or more messages or chats changed for various + /// reasons in the database: + /// - Messages sent, received or removed + /// - Chats created, deleted or archived + /// - A draft has been set + /// + MsgsChanged { + /// Set if only a single chat is affected by the changes, otherwise 0. + chat_id: ChatId, + + /// Set if only a single message is affected by the changes, otherwise 0. + msg_id: MsgId, + }, + + /// Reactions for the message changed. + ReactionsChanged { + /// ID of the chat which the message belongs to. + chat_id: ChatId, + + /// ID of the message for which reactions were changed. + msg_id: MsgId, + + /// ID of the contact whose reaction set is changed. + contact_id: ContactId, + }, + + /// There is a fresh message. Typically, the user will show an notification + /// when receiving this message. + /// + /// There is no extra #DC_EVENT_MSGS_CHANGED event send together with this event. + IncomingMsg { + /// ID of the chat where the message is assigned. + chat_id: ChatId, + + /// ID of the message. + msg_id: MsgId, + }, + + /// Downloading a bunch of messages just finished. + IncomingMsgBunch { + /// List of incoming message IDs. + msg_ids: Vec, + }, + + /// Messages were seen or noticed. + /// chat id is always set. + MsgsNoticed(ChatId), + + /// A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to + /// DC_STATE_OUT_DELIVERED, see dc_msg_get_state(). + MsgDelivered { + /// ID of the chat which the message belongs to. + chat_id: ChatId, + + /// ID of the message that was successfully sent. + msg_id: MsgId, + }, + + /// A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to + /// DC_STATE_OUT_FAILED, see dc_msg_get_state(). + MsgFailed { + /// ID of the chat which the message belongs to. + chat_id: ChatId, + + /// ID of the message that could not be sent. + msg_id: MsgId, + }, + + /// A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to + /// DC_STATE_OUT_MDN_RCVD, see dc_msg_get_state(). + MsgRead { + /// ID of the chat which the message belongs to. + chat_id: ChatId, + + /// ID of the message that was read. + msg_id: MsgId, + }, + + /// Chat changed. The name or the image of a chat group was changed or members were added or removed. + /// Or the verify state of a chat has changed. + /// See dc_set_chat_name(), dc_set_chat_profile_image(), dc_add_contact_to_chat() + /// and dc_remove_contact_from_chat(). + /// + /// This event does not include ephemeral timer modification, which + /// is a separate event. + ChatModified(ChatId), + + /// Chat ephemeral timer changed. + ChatEphemeralTimerModified { + /// Chat ID. + chat_id: ChatId, + + /// New ephemeral timer value. + timer: EphemeralTimer, + }, + + /// Contact(s) created, renamed, blocked or deleted. + /// + /// @param data1 (int) If set, this is the contact_id of an added contact that should be selected. + ContactsChanged(Option), + + /// Location of one or more contact has changed. + /// + /// @param data1 (u32) contact_id of the contact for which the location has changed. + /// If the locations of several contacts have been changed, + /// eg. after calling dc_delete_all_locations(), this parameter is set to `None`. + LocationChanged(Option), + + /// Inform about the configuration progress started by configure(). + ConfigureProgress { + /// Progress. + /// + /// 0=error, 1-999=progress in permille, 1000=success and done + progress: usize, + + /// Progress comment or error, something to display to the user. + comment: Option, + }, + + /// Inform about the import/export progress started by imex(). + /// + /// @param data1 (usize) 0=error, 1-999=progress in permille, 1000=success and done + /// @param data2 0 + ImexProgress(usize), + + /// A file has been exported. A file has been written by imex(). + /// This event may be sent multiple times by a single call to imex(). + /// + /// A typical purpose for a handler of this event may be to make the file public to some system + /// services. + /// + /// @param data2 0 + ImexFileWritten(PathBuf), + + /// Progress information of a secure-join handshake from the view of the inviter + /// (Alice, the person who shows the QR code). + /// + /// These events are typically sent after a joiner has scanned the QR code + /// generated by dc_get_securejoin_qr(). + SecurejoinInviterProgress { + /// ID of the contact that wants to join. + contact_id: ContactId, + + /// Progress as: + /// 300=vg-/vc-request received, typically shown as "bob@addr joins". + /// 600=vg-/vc-request-with-auth received, vg-member-added/vc-contact-confirm sent, typically shown as "bob@addr verified". + /// 800=contact added to chat, shown as "bob@addr securely joined GROUP". Only for the verified-group-protocol. + /// 1000=Protocol finished for this contact. + progress: usize, + }, + + /// Progress information of a secure-join handshake from the view of the joiner + /// (Bob, the person who scans the QR code). + /// The events are typically sent while dc_join_securejoin(), which + /// may take some time, is executed. + SecurejoinJoinerProgress { + /// ID of the inviting contact. + contact_id: ContactId, + + /// Progress as: + /// 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." + /// (Bob has verified alice and waits until Alice does the same for him) + progress: usize, + }, + + /// The connectivity to the server changed. + /// This means that you should refresh the connectivity view + /// and possibly the connectivtiy HTML; see dc_get_connectivity() and + /// dc_get_connectivity_html() for details. + ConnectivityChanged, + + /// The user's avatar changed. + SelfavatarChanged, + + /// Webxdc status update received. + WebxdcStatusUpdate { + /// Message ID. + msg_id: MsgId, + + /// Status update ID. + status_update_serial: StatusUpdateSerial, + }, + + /// Inform that a message containing a webxdc instance has been deleted. + WebxdcInstanceDeleted { + /// ID of the deleted message. + msg_id: MsgId, + }, +} From 2ef5f2eb524fbe46668f637d278539ada3f89c6e Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 17 Apr 2023 17:38:49 +0000 Subject: [PATCH 014/528] scheduler: use oneshot channel for "started" notifications The senders are not used more than once. --- src/scheduler.rs | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/scheduler.rs b/src/scheduler.rs index 1c2bf861a..796222702 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -323,7 +323,11 @@ pub(crate) struct Scheduler { recently_seen_loop: RecentlySeenLoop, } -async fn inbox_loop(ctx: Context, started: Sender<()>, inbox_handlers: ImapConnectionHandlers) { +async fn inbox_loop( + ctx: Context, + started: oneshot::Sender<()>, + inbox_handlers: ImapConnectionHandlers, +) { use futures::future::FutureExt; info!(ctx, "starting inbox loop"); @@ -335,8 +339,8 @@ async fn inbox_loop(ctx: Context, started: Sender<()>, inbox_handlers: ImapConne let ctx1 = ctx.clone(); let fut = async move { let ctx = ctx1; - if let Err(err) = started.send(()).await { - warn!(ctx, "inbox loop, missing started receiver: {}", err); + if let Err(()) = started.send(()) { + warn!(ctx, "inbox loop, missing started receiver"); return; }; @@ -600,7 +604,7 @@ async fn fetch_idle( async fn simple_imap_loop( ctx: Context, - started: Sender<()>, + started: oneshot::Sender<()>, inbox_handlers: ImapConnectionHandlers, folder_meaning: FolderMeaning, ) { @@ -616,8 +620,8 @@ async fn simple_imap_loop( let fut = async move { let ctx = ctx1; - if let Err(err) = started.send(()).await { - warn!(&ctx, "simple imap loop, missing started receiver: {}", err); + if let Err(()) = started.send(()) { + warn!(&ctx, "simple imap loop, missing started receiver"); return; } @@ -635,7 +639,11 @@ async fn simple_imap_loop( .await; } -async fn smtp_loop(ctx: Context, started: Sender<()>, smtp_handlers: SmtpConnectionHandlers) { +async fn smtp_loop( + ctx: Context, + started: oneshot::Sender<()>, + smtp_handlers: SmtpConnectionHandlers, +) { use futures::future::FutureExt; info!(ctx, "starting smtp loop"); @@ -648,8 +656,8 @@ async fn smtp_loop(ctx: Context, started: Sender<()>, smtp_handlers: SmtpConnect let ctx1 = ctx.clone(); let fut = async move { let ctx = ctx1; - if let Err(err) = started.send(()).await { - warn!(&ctx, "smtp loop, missing started receiver: {}", err); + if let Err(()) = started.send(()) { + warn!(&ctx, "smtp loop, missing started receiver"); return; } @@ -721,7 +729,7 @@ impl Scheduler { pub async fn start(ctx: Context) -> Result { let (smtp, smtp_handlers) = SmtpConnectionState::new(); - let (smtp_start_send, smtp_start_recv) = channel::bounded(1); + let (smtp_start_send, smtp_start_recv) = oneshot::channel(); let (ephemeral_interrupt_send, ephemeral_interrupt_recv) = channel::bounded(1); let (location_interrupt_send, location_interrupt_recv) = channel::bounded(1); @@ -729,7 +737,7 @@ impl Scheduler { let mut start_recvs = Vec::new(); let (conn_state, inbox_handlers) = ImapConnectionState::new(&ctx).await?; - let (inbox_start_send, inbox_start_recv) = channel::bounded(1); + let (inbox_start_send, inbox_start_recv) = oneshot::channel(); let handle = { let ctx = ctx.clone(); task::spawn(inbox_loop(ctx, inbox_start_send, inbox_handlers)) @@ -750,7 +758,7 @@ impl Scheduler { ] { if should_watch? { let (conn_state, handlers) = ImapConnectionState::new(&ctx).await?; - let (start_send, start_recv) = channel::bounded(1); + let (start_send, start_recv) = oneshot::channel(); let ctx = ctx.clone(); let handle = task::spawn(simple_imap_loop(ctx, start_send, handlers, meaning)); oboxes.push(SchedBox { @@ -797,7 +805,7 @@ impl Scheduler { }; // wait for all loops to be started - if let Err(err) = try_join_all(start_recvs.iter().map(|r| r.recv())).await { + if let Err(err) = try_join_all(start_recvs).await { bail!("failed to start scheduler: {}", err); } From 3f615c8de68964f0465b7840dff76214318462f6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 11:05:59 +0000 Subject: [PATCH 015/528] Update h2 from 0.3.17 to 0.3.18 Version 0.3.17 is yanked. --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd823383b..365145795 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2164,9 +2164,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" dependencies = [ "bytes", "fnv", From 37503dd3e838bfcdcfd784dce705b169700e0066 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 12:52:36 +0000 Subject: [PATCH 016/528] JSON-RPC: add `get_http_blob` API --- CHANGELOG.md | 5 +++ deltachat-jsonrpc/src/api/mod.rs | 11 ++++++ src/configure.rs | 1 - src/configure/auto_mozilla.rs | 2 +- src/configure/auto_outlook.rs | 2 +- src/configure/read_url.rs | 44 ----------------------- src/http.rs | 24 ------------- src/lib.rs | 3 +- src/net.rs | 5 ++- src/net/http.rs | 62 ++++++++++++++++++++++++++++++++ src/oauth2.rs | 4 +-- src/qr.rs | 2 +- 12 files changed, 88 insertions(+), 77 deletions(-) delete mode 100644 src/configure/read_url.rs delete mode 100644 src/http.rs create mode 100644 src/net/http.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 781fee77e..b2e78974b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +### Changes +- Add `get_http_blob` JSON-RPC API. + ## [1.112.7] - 2023-04-17 ### Fixes diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 3ed2605e9..de51d2b37 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -1610,6 +1610,17 @@ impl CommandApi { Ok(general_purpose::STANDARD_NO_PAD.encode(blob)) } + /// Makes an HTTP GET request and returns base64-encoded contents. + /// + /// `url` is the HTTP or HTTPS URL. + async fn get_http_blob(&self, account_id: u32, url: String) -> Result { + let ctx = self.get_context(account_id).await?; + let blob = deltachat::net::read_url_blob(&ctx, &url).await?; + + use base64::{engine::general_purpose, Engine as _}; + Ok(general_purpose::STANDARD_NO_PAD.encode(blob)) + } + /// Forward messages to another chat. /// /// All types of messages can be forwarded, diff --git a/src/configure.rs b/src/configure.rs index eb69ad25c..eb929440e 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -2,7 +2,6 @@ mod auto_mozilla; mod auto_outlook; -mod read_url; mod server_params; use anyhow::{bail, ensure, Context as _, Result}; diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index d53b5a8c5..b71055d81 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -6,10 +6,10 @@ use std::str::FromStr; use quick_xml::events::{BytesStart, Event}; -use super::read_url::read_url; use super::{Error, ServerParams}; use crate::context::Context; use crate::login_param::LoginParam; +use crate::net::read_url; use crate::provider::{Protocol, Socket}; #[derive(Debug)] diff --git a/src/configure/auto_outlook.rs b/src/configure/auto_outlook.rs index 8d42fd353..c1cfbe416 100644 --- a/src/configure/auto_outlook.rs +++ b/src/configure/auto_outlook.rs @@ -7,9 +7,9 @@ use std::io::BufRead; use quick_xml::events::Event; -use super::read_url::read_url; use super::{Error, ServerParams}; use crate::context::Context; +use crate::net::read_url; use crate::provider::{Protocol, Socket}; /// Result of parsing a single `Protocol` tag. diff --git a/src/configure/read_url.rs b/src/configure/read_url.rs deleted file mode 100644 index d164a7007..000000000 --- a/src/configure/read_url.rs +++ /dev/null @@ -1,44 +0,0 @@ -use anyhow::{anyhow, format_err}; - -use crate::context::Context; -use crate::socks::Socks5Config; - -pub async fn read_url(context: &Context, url: &str) -> anyhow::Result { - match read_url_inner(context, url).await { - Ok(s) => { - info!(context, "Successfully read url {}", url); - Ok(s) - } - Err(e) => { - info!(context, "Can't read URL {}: {:#}", url, e); - Err(format_err!("Can't read URL {}: {:#}", url, e)) - } - } -} - -pub async fn read_url_inner(context: &Context, url: &str) -> anyhow::Result { - let socks5_config = Socks5Config::from_database(&context.sql).await?; - let client = crate::http::get_client(socks5_config)?; - let mut url = url.to_string(); - - // Follow up to 10 http-redirects - for _i in 0..10 { - let response = client.get(&url).send().await?; - if response.status().is_redirection() { - let headers = response.headers(); - let header = headers - .get_all("location") - .iter() - .last() - .ok_or_else(|| anyhow!("Redirection doesn't have a target location"))? - .to_str()?; - info!(context, "Following redirect to {}", header); - url = header.to_string(); - continue; - } - - return response.text().await.map_err(Into::into); - } - - Err(format_err!("Followed 10 redirections")) -} diff --git a/src/http.rs b/src/http.rs deleted file mode 100644 index 8eed8b55e..000000000 --- a/src/http.rs +++ /dev/null @@ -1,24 +0,0 @@ -//! # HTTP module. - -use std::time::Duration; - -use anyhow::Result; - -use crate::socks::Socks5Config; - -const HTTP_TIMEOUT: Duration = Duration::from_secs(30); - -pub(crate) fn get_client(socks5_config: Option) -> Result { - let builder = reqwest::ClientBuilder::new().timeout(HTTP_TIMEOUT); - let builder = if let Some(socks5_config) = socks5_config { - let proxy = reqwest::Proxy::all(socks5_config.to_url())?; - builder.proxy(proxy) - } else { - // Disable usage of "system" proxy configured via environment variables. - // It is enabled by default in `reqwest`, see - // - // for documentation. - builder.no_proxy() - }; - Ok(builder.build()?) -} diff --git a/src/lib.rs b/src/lib.rs index 51a72a1d5..23947813c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,7 +68,6 @@ mod decrypt; pub mod download; mod e2ee; pub mod ephemeral; -mod http; mod imap; pub mod imex; mod scheduler; @@ -104,7 +103,7 @@ mod dehtml; mod authres; mod color; pub mod html; -mod net; +pub mod net; pub mod plaintext; pub mod summary; diff --git a/src/net.rs b/src/net.rs index a0f3a3313..d4d529770 100644 --- a/src/net.rs +++ b/src/net.rs @@ -1,4 +1,4 @@ -///! # Common network utilities. +//! # Common network utilities. use std::net::{IpAddr, SocketAddr}; use std::pin::Pin; use std::str::FromStr; @@ -12,9 +12,12 @@ use tokio_io_timeout::TimeoutStream; use crate::context::Context; use crate::tools::time; +pub(crate) mod http; pub(crate) mod session; pub(crate) mod tls; +pub use http::{read_url, read_url_blob}; + async fn connect_tcp_inner(addr: SocketAddr, timeout_val: Duration) -> Result { let tcp_stream = timeout(timeout_val, TcpStream::connect(addr)) .await diff --git a/src/net/http.rs b/src/net/http.rs new file mode 100644 index 000000000..3dd49b40a --- /dev/null +++ b/src/net/http.rs @@ -0,0 +1,62 @@ +//! # HTTP module. + +use std::time::Duration; + +use anyhow::{anyhow, Result}; + +use crate::context::Context; +use crate::socks::Socks5Config; + +const HTTP_TIMEOUT: Duration = Duration::from_secs(30); + +/// Retrieves the text contents of URL using HTTP GET request. +pub async fn read_url(context: &Context, url: &str) -> Result { + Ok(read_url_inner(context, url).await?.text().await?) +} + +/// Retrieves the binary contents of URL using HTTP GET request. +pub async fn read_url_blob(context: &Context, url: &str) -> Result> { + Ok(read_url_inner(context, url).await?.bytes().await?.into()) +} + +async fn read_url_inner(context: &Context, url: &str) -> Result { + let socks5_config = Socks5Config::from_database(&context.sql).await?; + let client = get_client(socks5_config)?; + let mut url = url.to_string(); + + // Follow up to 10 http-redirects + for _i in 0..10 { + let response = client.get(&url).send().await?; + if response.status().is_redirection() { + let headers = response.headers(); + let header = headers + .get_all("location") + .iter() + .last() + .ok_or_else(|| anyhow!("Redirection doesn't have a target location"))? + .to_str()?; + info!(context, "Following redirect to {}", header); + url = header.to_string(); + continue; + } + + return Ok(response); + } + + Err(anyhow!("Followed 10 redirections")) +} + +pub(crate) fn get_client(socks5_config: Option) -> Result { + let builder = reqwest::ClientBuilder::new().timeout(HTTP_TIMEOUT); + let builder = if let Some(socks5_config) = socks5_config { + let proxy = reqwest::Proxy::all(socks5_config.to_url())?; + builder.proxy(proxy) + } else { + // Disable usage of "system" proxy configured via environment variables. + // It is enabled by default in `reqwest`, see + // + // for documentation. + builder.no_proxy() + }; + Ok(builder.build()?) +} diff --git a/src/oauth2.rs b/src/oauth2.rs index 2fe8795b4..f3e5dfe5e 100644 --- a/src/oauth2.rs +++ b/src/oauth2.rs @@ -160,7 +160,7 @@ pub(crate) async fn get_oauth2_access_token( // ... and POST let socks5_config = Socks5Config::from_database(&context.sql).await?; - let client = crate::http::get_client(socks5_config)?; + let client = crate::net::http::get_client(socks5_config)?; let response: Response = match client.post(post_url).form(&post_param).send().await { Ok(resp) => match resp.json().await { @@ -291,7 +291,7 @@ impl Oauth2 { // "picture": "https://lh4.googleusercontent.com/-Gj5jh_9R0BY/AAAAAAAAAAI/AAAAAAAAAAA/IAjtjfjtjNA/photo.jpg" // } let socks5_config = Socks5Config::from_database(&context.sql).await.ok()?; - let client = match crate::http::get_client(socks5_config) { + let client = match crate::net::http::get_client(socks5_config) { Ok(cl) => cl, Err(err) => { warn!(context, "failed to get HTTP client: {}", err); diff --git a/src/qr.rs b/src/qr.rs index 920776b5e..7bbe73ce6 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -534,7 +534,7 @@ struct CreateAccountErrorResponse { async fn set_account_from_qr(context: &Context, qr: &str) -> Result<()> { let url_str = &qr[DCACCOUNT_SCHEME.len()..]; let socks5_config = Socks5Config::from_database(&context.sql).await?; - let response = crate::http::get_client(socks5_config)? + let response = crate::net::http::get_client(socks5_config)? .post(url_str) .send() .await?; From 6a6ceb68756432d3154aeb875a2215d5dd00bd1e Mon Sep 17 00:00:00 2001 From: Hocuri Date: Tue, 18 Apr 2023 16:08:19 +0200 Subject: [PATCH 017/528] Add send_recv() to test_utils.rs link2xt approved orally --- src/test_utils.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/test_utils.rs b/src/test_utils.rs index 003b3578c..4dc780371 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -106,9 +106,17 @@ impl TestContextManager { /// - Let the other TestContext receive it and accept the chat /// - Assert that the message arrived pub async fn send_recv_accept(&self, from: &TestContext, to: &TestContext, msg: &str) { + let received_msg = self.send_recv(from, to, msg).await; + received_msg.chat_id.accept(to).await.unwrap(); + } + + /// - Let one TestContext send a message + /// - Let the other TestContext receive it + /// - Assert that the message arrived + pub async fn send_recv(&self, from: &TestContext, to: &TestContext, msg: &str) -> Message { let received_msg = self.try_send_recv(from, to, msg).await; assert_eq!(received_msg.text.as_ref().unwrap(), msg); - received_msg.chat_id.accept(to).await.unwrap(); + received_msg } /// - Let one TestContext send a message From a8b790a5db574d885b4e4109b2074bd464207455 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Sat, 15 Apr 2023 20:06:05 -0400 Subject: [PATCH 018/528] deltachat-rpc-server: Drop Accounts object when terminating (#4323) Otherwise it continues to keep the sender side of the event emitter which prevents events_task from stopping. --- deltachat-rpc-server/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/deltachat-rpc-server/src/main.rs b/deltachat-rpc-server/src/main.rs index 87df5fdf4..a4e99fe2c 100644 --- a/deltachat-rpc-server/src/main.rs +++ b/deltachat-rpc-server/src/main.rs @@ -115,6 +115,7 @@ async fn main() -> Result<()> { // NB: Events are drained by events_task. canceler.cancel(); accounts.read().await.stop_io().await; + drop(accounts); drop(state); let (r0, r1) = tokio::join!(events_task, send_task); for r in [r0, r1] { From 4aae48b0a1d9d1104ce5958d8a6508a81c6ad9a0 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Thu, 13 Apr 2023 22:17:22 -0400 Subject: [PATCH 019/528] Gracefully terminate deltachat-rpc-server on ctrl-c and SIGTERM (#4323) --- CHANGELOG.md | 3 +- deltachat-rpc-server/src/main.rs | 59 ++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57281bbaf..d0074a528 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ - maybe_add_time_based_warnings(): Use release date instead of the provider DB update one - Remove confusing log line "ignoring unsolicited response Recent(…)" #3934 - Cleanly terminate deltachat-rpc-server. - Also terminate on ctrl-c. + I.e. on EOF in stdin. - Refactorings #4317 - Add JSON-RPC API `can_send()`. - New `dc_get_next_msgs()` and `dc_wait_next_msgs()` C APIs. @@ -24,6 +24,7 @@ - New Python bindings APIs `Message.is_from_self()` and `Message.is_from_device()`. - Remove metadata from avatars and JPEG images before sending #4037 - Reduce + recode images to JPEG if they are > 500K in size #4037 +- Gracefully terminate deltachat-rpc-server on ctrl-c and SIGTERM. ### Fixes - Fix python bindings README documentation on installing the bindings from source. diff --git a/deltachat-rpc-server/src/main.rs b/deltachat-rpc-server/src/main.rs index a4e99fe2c..419f4deb4 100644 --- a/deltachat-rpc-server/src/main.rs +++ b/deltachat-rpc-server/src/main.rs @@ -11,13 +11,26 @@ use deltachat_jsonrpc::api::events::event_to_json_rpc_notification; use deltachat_jsonrpc::api::{Accounts, CommandApi}; use futures_lite::stream::StreamExt; use tokio::io::{self, AsyncBufReadExt, BufReader}; + +#[cfg(target_family = "unix")] +use tokio::signal::unix as signal_unix; + use tokio::sync::RwLock; use tokio::task::JoinHandle; use tokio_util::sync::CancellationToken; use yerpc::{RpcClient, RpcSession}; #[tokio::main(flavor = "multi_thread")] -async fn main() -> Result<()> { +async fn main() { + let r = main_impl().await; + // From tokio documentation: + // "For technical reasons, stdin is implemented by using an ordinary blocking read on a separate + // thread, and it is impossible to cancel that read. This can make shutdown of the runtime hang + // until the user presses enter." + std::process::exit(if r.is_ok() { 0 } else { 1 }); +} + +async fn main_impl() -> Result<()> { let mut args = env::args_os(); let _program_name = args.next().context("no command line arguments found")?; if let Some(first_arg) = args.next() { @@ -35,6 +48,11 @@ async fn main() -> Result<()> { return Err(anyhow!("Unrecognized argument {:?}", arg)); } + // Install signal handlers early so that the shutdown is graceful starting from here. + let _ctrl_c = tokio::signal::ctrl_c(); + #[cfg(target_family = "unix")] + let mut sigterm = signal_unix::signal(signal_unix::SignalKind::terminate())?; + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let path = std::env::var("DC_ACCOUNTS_PATH").unwrap_or_else(|_| "accounts".to_string()); @@ -48,10 +66,12 @@ async fn main() -> Result<()> { let (client, mut out_receiver) = RpcClient::new(); let session = RpcSession::new(client.clone(), state.clone()); - let canceler = CancellationToken::new(); + let main_cancel = CancellationToken::new(); // Events task converts core events to JSON-RPC notifications. + let cancel = main_cancel.clone(); let events_task: JoinHandle> = tokio::spawn(async move { + let _cancel_guard = cancel.clone().drop_guard(); let mut r = Ok(()); while let Some(event) = events.recv().await { if r.is_err() { @@ -60,16 +80,16 @@ async fn main() -> Result<()> { let event = event_to_json_rpc_notification(event); r = client.send_notification("event", Some(event)).await; } - r?; Ok(()) }); // Send task prints JSON responses to stdout. - let cancelable = canceler.clone(); + let cancel = main_cancel.clone(); let send_task: JoinHandle> = tokio::spawn(async move { + let _cancel_guard = cancel.clone().drop_guard(); loop { let message = tokio::select! { - _ = cancelable.cancelled() => break, + _ = cancel.cancelled() => break, message = out_receiver.next() => match message { None => break, Some(message) => serde_json::to_string(&message)?, @@ -81,12 +101,32 @@ async fn main() -> Result<()> { Ok(()) }); + let cancel = main_cancel.clone(); + let sigterm_task: JoinHandle> = tokio::spawn(async move { + #[cfg(target_family = "unix")] + { + let _cancel_guard = cancel.clone().drop_guard(); + tokio::select! { + _ = cancel.cancelled() => (), + _ = sigterm.recv() => { + log::info!("got SIGTERM"); + } + } + } + let _ = cancel; + Ok(()) + }); + // Receiver task reads JSON requests from stdin. + let cancel = main_cancel.clone(); let recv_task: JoinHandle> = tokio::spawn(async move { + let _cancel_guard = cancel.clone().drop_guard(); let stdin = io::stdin(); let mut lines = BufReader::new(stdin).lines(); + loop { let message = tokio::select! { + _ = cancel.cancelled() => break, _ = tokio::signal::ctrl_c() => { log::info!("got ctrl-c event"); break; @@ -108,17 +148,14 @@ async fn main() -> Result<()> { Ok(()) }); - // Wait for the end of stdin / ctrl-c. - recv_task.await?.ok(); - // See "Thread safety" section in deltachat-ffi/deltachat.h for explanation. // NB: Events are drained by events_task. - canceler.cancel(); + main_cancel.cancelled().await; accounts.read().await.stop_io().await; drop(accounts); drop(state); - let (r0, r1) = tokio::join!(events_task, send_task); - for r in [r0, r1] { + let (r0, r1, r2, r3) = tokio::join!(events_task, send_task, sigterm_task, recv_task); + for r in [r0, r1, r2, r3] { r??; } From 3c774b02e59f12f16bacad26cb21405d5a644b56 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 24 Oct 2022 23:04:03 +0000 Subject: [PATCH 020/528] Only reset status to "" if a text/plain part without signature is received Otherwise sending a message without plaintext part resets the signature. It is particularly dangerous in multidevice case, because it's easy to accidentally reset the signature on your other device with a non-text message. --- CHANGELOG.md | 1 + src/mimeparser.rs | 8 +++++++- src/receive_imf.rs | 37 +++++++++++++++++-------------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0074a528..b0ef8b5fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ - Show a warning if quota list is empty #4261 - Update "accounts.toml" atomically - Don't let blocking be bypassed using groups #4316 +- Do not reset status on other devices when sending signed reaction messages #3692 ## [1.112.7] - 2023-04-17 diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 455c5733f..d67324455 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -90,6 +90,9 @@ pub(crate) struct MimeMessage { pub(crate) delivery_report: Option, /// Standard USENET signature, if any. + /// + /// `None` means no text part was received, empty string means a text part without a footer is + /// received. pub(crate) footer: Option, // if this flag is set, the parts/text/etc. are just close to the original mime-message; @@ -1059,6 +1062,7 @@ impl MimeMessage { } }; + let is_plaintext = mime_type == mime::TEXT_PLAIN; let mut dehtml_failed = false; let SimplifiedText { @@ -1139,7 +1143,9 @@ impl MimeMessage { self.is_forwarded = true; } - self.footer = footer; + if self.footer.is_none() && is_plaintext { + self.footer = Some(footer.unwrap_or_default()); + } } _ => {} } diff --git a/src/receive_imf.rs b/src/receive_imf.rs index c3b2712bf..b321c2f67 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -309,28 +309,25 @@ pub(crate) async fn receive_imf_inner( } } - // Always update the status, even if there is no footer, to allow removing the status. - // - // Ignore MDNs though, as they never contain the signature even if user has set it. // Ignore footers from mailinglists as they are often created or modified by the mailinglist software. - if mime_parser.mdn_reports.is_empty() - && !mime_parser.is_mailinglist_message() - && is_partial_download.is_none() - && from_id != ContactId::UNDEFINED - && context - .update_contacts_timestamp(from_id, Param::StatusTimestamp, sent_timestamp) - .await? - { - if let Err(err) = contact::set_status( - context, - from_id, - mime_parser.footer.clone().unwrap_or_default(), - mime_parser.was_encrypted(), - mime_parser.has_chat_version(), - ) - .await + if let Some(footer) = &mime_parser.footer { + if !mime_parser.is_mailinglist_message() + && from_id != ContactId::UNDEFINED + && context + .update_contacts_timestamp(from_id, Param::StatusTimestamp, sent_timestamp) + .await? { - warn!(context, "Cannot update contact status: {err:#}."); + if let Err(err) = contact::set_status( + context, + from_id, + footer.to_string(), + mime_parser.was_encrypted(), + mime_parser.has_chat_version(), + ) + .await + { + warn!(context, "Cannot update contact status: {err:#}."); + } } } From 903633f4228afb5b565ddccb22ad010bb6da393c Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 12:25:16 +0000 Subject: [PATCH 021/528] Add regression test --- src/reaction.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/reaction.rs b/src/reaction.rs index d8ad4b5bb..1af05b0c9 100644 --- a/src/reaction.rs +++ b/src/reaction.rs @@ -287,12 +287,14 @@ pub async fn get_msg_reactions(context: &Context, msg_id: MsgId) -> Result Result<()> { + let mut tcm = TestContextManager::new(); + let alice1 = tcm.alice().await; + let alice2 = tcm.alice().await; + + alice1 + .set_config(Config::Selfstatus, Some("New status")) + .await?; + + let alice2_msg = tcm.send_recv(&alice1, &alice2, "Hi!").await; + assert_eq!( + alice2.get_config(Config::Selfstatus).await?.as_deref(), + Some("New status") + ); + + // Alice reacts to own message from second device, + // first device receives rection. + { + send_reaction(&alice2, alice2_msg.id, "👍").await?; + let msg = alice2.pop_sent_msg().await; + alice1.recv_msg(&msg).await; + } + + // Check that the status is still the same. + assert_eq!( + alice1.get_config(Config::Selfstatus).await?.as_deref(), + Some("New status") + ); + Ok(()) + } } From a806a218bf58cf2cf22aa6077e02f0a8810ccf10 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Tue, 18 Apr 2023 20:52:01 +0200 Subject: [PATCH 022/528] Clippy; remove forgotten dbg! (#4338) --- src/imex/transfer.rs | 4 ++-- src/qr.rs | 2 +- src/receive_imf/tests.rs | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/imex/transfer.rs b/src/imex/transfer.rs index 4d939b75c..e3433e398 100644 --- a/src/imex/transfer.rs +++ b/src/imex/transfer.rs @@ -103,7 +103,7 @@ impl BackupProvider { let context_dir = context .get_blobdir() .parent() - .ok_or(anyhow!("Context dir not found"))?; + .ok_or_else(|| anyhow!("Context dir not found"))?; let dbfile = context_dir.join(DBFILE_BACKUP_NAME); if fs::metadata(&dbfile).await.is_ok() { fs::remove_file(&dbfile).await?; @@ -497,7 +497,7 @@ async fn on_blob( let context_dir = context .get_blobdir() .parent() - .ok_or(anyhow!("Context dir not found"))?; + .ok_or_else(|| anyhow!("Context dir not found"))?; let dbfile = context_dir.join(DBFILE_BACKUP_NAME); if fs::metadata(&dbfile).await.is_ok() { fs::remove_file(&dbfile).await?; diff --git a/src/qr.rs b/src/qr.rs index f40b3786e..d13366860 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -500,7 +500,7 @@ fn decode_webrtc_instance(_context: &Context, qr: &str) -> Result { fn decode_backup(qr: &str) -> Result { let payload = qr .strip_prefix(DCBACKUP_SCHEME) - .ok_or(anyhow!("invalid DCBACKUP scheme"))?; + .ok_or_else(|| anyhow!("invalid DCBACKUP scheme"))?; let ticket: iroh::provider::Ticket = payload.parse().context("invalid DCBACKUP payload")?; Ok(Qr::Backup { ticket }) } diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index cf64ee3b5..44d3b8d9d 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -367,7 +367,6 @@ async fn test_no_message_id_header() { ) .await .unwrap(); - dbg!(&received); assert!(received.is_none()); assert!(!t From d97bdd9fd085fceddd6d3852c96e1be871b0bf9a Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 10:59:17 +0000 Subject: [PATCH 023/528] Add more links to `configure` documentation --- src/configure.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/configure.rs b/src/configure.rs index 71e19dd56..4f8f1781a 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -1,4 +1,13 @@ -//! Email accounts autoconfiguration process module. +//! # Email accounts autoconfiguration process. +//! +//! The module provides automatic lookup of configuration +//! for email providers based on the built-in [provider database], +//! [Mozilla Thunderbird Autoconfiguration protocol] +//! and [Outlook's Autodiscover]. +//! +//! [provider database]: crate::provider +//! [Mozilla Thunderbird Autoconfiguration protocol]: auto_mozilla +//! [Outlook's Autodiscover]: auto_outlook mod auto_mozilla; mod auto_outlook; From 663df6bdfdce20d0a6bc4a5ae632162cfd150130 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 15:30:28 +0000 Subject: [PATCH 024/528] Replace 404 link with a web archive version --- src/configure/auto_mozilla.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index d53b5a8c5..eb93b03e9 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -1,6 +1,6 @@ //! # Thunderbird's Autoconfiguration implementation //! -//! Documentation: +//! Documentation: use std::io::BufRead; use std::str::FromStr; From ede4e8109e716575fd91dd7a9eb47071c11ee3e6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 18 Apr 2023 17:06:46 +0000 Subject: [PATCH 025/528] Release 1.113.0 --- CHANGELOG.md | 45 +++++++++++------------ Cargo.lock | 10 ++--- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- node/constants.js | 1 + node/lib/constants.ts | 1 + package.json | 2 +- release-date.in | 2 +- 12 files changed, 37 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0ef8b5fa..0bc466860 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,37 +1,36 @@ # Changelog -## [Unreleased] +## [1.113.0] - 2023-04-18 + +### Added +- New JSON-RPC API `can_send()`. +- New `dc_get_next_msgs()` and `dc_wait_next_msgs()` C APIs. + New `get_next_msgs()` and `wait_next_msgs()` JSON-RPC API. + These APIs can be used by bots to get all unprocessed messages + in the order of their arrival and wait for them without relying on events. +- New Python bindings API `Account.wait_next_incoming_message()`. +- New Python bindings APIs `Message.is_from_self()` and `Message.is_from_device()`. ### Changes - Increase MSRV to 1.65.0. #4236 - Remove upper limit on the attachment size. #4253 - Update rPGP to 0.10.1. #4236 -- Compress `mime_headers` column with HTML emails stored in database -- Strip BIDI characters in system messages, files, group names and contact names #3479 -- maybe_add_time_based_warnings(): Use release date instead of the provider DB update one -- Remove confusing log line "ignoring unsolicited response Recent(…)" #3934 -- Cleanly terminate deltachat-rpc-server. - I.e. on EOF in stdin. -- Refactorings #4317 -- Add JSON-RPC API `can_send()`. -- New `dc_get_next_msgs()` and `dc_wait_next_msgs()` C APIs. - New `get_next_msgs()` and `wait_next_msgs()` JSON-RPC API. - These APIs can be used by bots to get all unprocessed messages - in the order of their arrival and wait for them without relying on events. +- Compress HTML emails stored in the `mime_headers` column of the database. +- Strip BIDI characters in system messages, files, group names and contact names. #3479 +- Use release date instead of the provider database update date in `maybe_add_time_based_warnings()`. +- Gracefully terminate `deltachat-rpc-server` on Ctrl+C (`SIGINT`), `SIGTERM` and EOF. - Async Python API `get_fresh_messages_in_arrival_order()` is deprecated in favor of `get_next_msgs()` and `wait_next_msgs()`. -- New Python bindings API `Account.wait_next_incoming_message()`. -- New Python bindings APIs `Message.is_from_self()` and `Message.is_from_device()`. -- Remove metadata from avatars and JPEG images before sending #4037 -- Reduce + recode images to JPEG if they are > 500K in size #4037 -- Gracefully terminate deltachat-rpc-server on ctrl-c and SIGTERM. +- Remove metadata from avatars and JPEG images before sending. #4037 +- Recode PNG and other supported image formats to JPEG if they are > 500K in size. #4037 ### Fixes +- Don't let blocking be bypassed using groups. #4316 +- Show a warning if quota list is empty. #4261 +- Do not reset status on other devices when sending signed reaction messages. #3692 +- Update `accounts.toml` atomically. - Fix python bindings README documentation on installing the bindings from source. -- Show a warning if quota list is empty #4261 -- Update "accounts.toml" atomically -- Don't let blocking be bypassed using groups #4316 -- Do not reset status on other devices when sending signed reaction messages #3692 +- Remove confusing log line "ignoring unsolicited response Recent(…)". #3934 ## [1.112.7] - 2023-04-17 @@ -2403,7 +2402,6 @@ For a full list of changes, please see our closed Pull Requests: https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed -[unreleased]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...HEAD [1.111.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.110.0...v1.111.0 [1.112.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.111.0...v1.112.0 [1.112.1]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.0...v1.112.1 @@ -2413,3 +2411,4 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.5]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.4...v1.112.5 [1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 +[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.113.0 diff --git a/Cargo.lock b/Cargo.lock index 365145795..6bc23f2f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1144,7 +1144,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.7" +version = "1.113.0" dependencies = [ "ansi_term", "anyhow", @@ -1218,7 +1218,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.112.7" +version = "1.113.0" dependencies = [ "anyhow", "async-channel", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.112.7" +version = "1.113.0" dependencies = [ "ansi_term", "anyhow", @@ -1256,7 +1256,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.112.7" +version = "1.113.0" dependencies = [ "anyhow", "deltachat", @@ -1281,7 +1281,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.112.7" +version = "1.113.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index 961da7f1c..60ba547a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.112.7" +version = "1.113.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 674dbbe93..87e59d519 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.112.7" +version = "1.113.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 205ec6622..9c54cff1f 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.112.7" +version = "1.113.0" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 22f28e581..eac53436a 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.112.7" + "version": "1.113.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 7487bd32a..90443a222 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.112.7" +version = "1.113.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 8e4f9ac9e..fbe7c1dca 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.112.7" +version = "1.113.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/node/constants.js b/node/constants.js index 7752a3dd0..3c8816502 100644 --- a/node/constants.js +++ b/node/constants.js @@ -151,6 +151,7 @@ module.exports = { DC_STR_AEAP_EXPLANATION_AND_LINK: 123, DC_STR_ARCHIVEDCHATS: 40, DC_STR_AUDIO: 11, + DC_STR_BACKUP_TRANSFER_MSG_BODY: 163, DC_STR_BACKUP_TRANSFER_QR: 162, DC_STR_BAD_TIME_MSG_BODY: 85, DC_STR_BROADCAST_LIST: 115, diff --git a/node/lib/constants.ts b/node/lib/constants.ts index 2452ce754..8b6a61ebb 100644 --- a/node/lib/constants.ts +++ b/node/lib/constants.ts @@ -151,6 +151,7 @@ export enum C { DC_STR_AEAP_EXPLANATION_AND_LINK = 123, DC_STR_ARCHIVEDCHATS = 40, DC_STR_AUDIO = 11, + DC_STR_BACKUP_TRANSFER_MSG_BODY = 163, DC_STR_BACKUP_TRANSFER_QR = 162, DC_STR_BAD_TIME_MSG_BODY = 85, DC_STR_BROADCAST_LIST = 115, diff --git a/package.json b/package.json index cc84325ba..1e2e82366 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.112.7" + "version": "1.113.0" } diff --git a/release-date.in b/release-date.in index 5dc1be6ba..98684ad68 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-04-04 \ No newline at end of file +2023-04-18 \ No newline at end of file From f68a2fc387ba07d68ac7c7a3c8cc216172417968 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 19 Apr 2023 23:33:19 +0000 Subject: [PATCH 026/528] JSON-RPC: return mimetype and encoding for HTTP blobs --- CHANGELOG.md | 2 +- Cargo.lock | 5 ++-- Cargo.toml | 1 + deltachat-jsonrpc/src/api/mod.rs | 11 ++++---- deltachat-jsonrpc/src/api/types/http.rs | 29 ++++++++++++++++++++ deltachat-jsonrpc/src/api/types/mod.rs | 1 + src/net.rs | 2 +- src/net/http.rs | 36 +++++++++++++++++++++++-- 8 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 deltachat-jsonrpc/src/api/types/http.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index b2e78974b..656f583af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased ### Changes -- Add `get_http_blob` JSON-RPC API. +- Add `get_http_response` JSON-RPC API. ## [1.112.7] - 2023-04-17 diff --git a/Cargo.lock b/Cargo.lock index 87198de03..1d9b43fb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1080,6 +1080,7 @@ dependencies = [ "libc", "log", "mailparse", + "mime", "num-derive", "num-traits", "num_cpus", @@ -2591,9 +2592,9 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" diff --git a/Cargo.toml b/Cargo.toml index cbd021e2c..e3519b421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,7 @@ kamadak-exif = "0.5" lettre_email = { git = "https://github.com/deltachat/lettre", branch = "master" } libc = "0.2" mailparse = "0.14" +mime = "0.3.17" num_cpus = "1.15" num-derive = "0.3" num-traits = "0.2" diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index de51d2b37..d161dcd48 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -43,6 +43,7 @@ use types::account::Account; use types::chat::FullChat; use types::chat_list::ChatListEntry; use types::contact::ContactObject; +use types::http::HttpResponse; use types::message::MessageData; use types::message::MessageObject; use types::provider_info::ProviderInfo; @@ -1610,15 +1611,13 @@ impl CommandApi { Ok(general_purpose::STANDARD_NO_PAD.encode(blob)) } - /// Makes an HTTP GET request and returns base64-encoded contents. + /// Makes an HTTP GET request and returns a response. /// /// `url` is the HTTP or HTTPS URL. - async fn get_http_blob(&self, account_id: u32, url: String) -> Result { + async fn get_http_response(&self, account_id: u32, url: String) -> Result { let ctx = self.get_context(account_id).await?; - let blob = deltachat::net::read_url_blob(&ctx, &url).await?; - - use base64::{engine::general_purpose, Engine as _}; - Ok(general_purpose::STANDARD_NO_PAD.encode(blob)) + let response = deltachat::net::read_url_blob(&ctx, &url).await?.into(); + Ok(response) } /// Forward messages to another chat. diff --git a/deltachat-jsonrpc/src/api/types/http.rs b/deltachat-jsonrpc/src/api/types/http.rs new file mode 100644 index 000000000..3b9d29509 --- /dev/null +++ b/deltachat-jsonrpc/src/api/types/http.rs @@ -0,0 +1,29 @@ +use deltachat::net::HttpResponse as CoreHttpResponse; +use serde::Serialize; +use typescript_type_def::TypeDef; + +#[derive(Serialize, TypeDef)] +pub struct HttpResponse { + /// base64-encoded response body. + blob: String, + + /// MIME type, e.g. "text/plain" or "text/html". + mimetype: Option, + + /// Encoding, e.g. "utf-8". + encoding: Option, +} + +impl From for HttpResponse { + fn from(response: CoreHttpResponse) -> Self { + use base64::{engine::general_purpose, Engine as _}; + let blob = general_purpose::STANDARD_NO_PAD.encode(response.blob); + let mimetype = response.mimetype; + let encoding = response.encoding; + HttpResponse { + blob, + mimetype, + encoding, + } + } +} diff --git a/deltachat-jsonrpc/src/api/types/mod.rs b/deltachat-jsonrpc/src/api/types/mod.rs index 2d783990e..ace49f14e 100644 --- a/deltachat-jsonrpc/src/api/types/mod.rs +++ b/deltachat-jsonrpc/src/api/types/mod.rs @@ -2,6 +2,7 @@ pub mod account; pub mod chat; pub mod chat_list; pub mod contact; +pub mod http; pub mod location; pub mod message; pub mod provider_info; diff --git a/src/net.rs b/src/net.rs index d4d529770..3e80c40e8 100644 --- a/src/net.rs +++ b/src/net.rs @@ -16,7 +16,7 @@ pub(crate) mod http; pub(crate) mod session; pub(crate) mod tls; -pub use http::{read_url, read_url_blob}; +pub use http::{read_url, read_url_blob, Response as HttpResponse}; async fn connect_tcp_inner(addr: SocketAddr, timeout_val: Duration) -> Result { let tcp_stream = timeout(timeout_val, TcpStream::connect(addr)) diff --git a/src/net/http.rs b/src/net/http.rs index 3dd49b40a..cbee57959 100644 --- a/src/net/http.rs +++ b/src/net/http.rs @@ -3,20 +3,52 @@ use std::time::Duration; use anyhow::{anyhow, Result}; +use mime::Mime; use crate::context::Context; use crate::socks::Socks5Config; const HTTP_TIMEOUT: Duration = Duration::from_secs(30); +/// HTTP(S) GET response. +#[derive(Debug)] +pub struct Response { + /// Response body. + pub blob: Vec, + + /// MIME type exntracted from the `Content-Type` header, if any. + pub mimetype: Option, + + /// Encoding extracted from the `Content-Type` header, if any. + pub encoding: Option, +} + /// Retrieves the text contents of URL using HTTP GET request. pub async fn read_url(context: &Context, url: &str) -> Result { Ok(read_url_inner(context, url).await?.text().await?) } /// Retrieves the binary contents of URL using HTTP GET request. -pub async fn read_url_blob(context: &Context, url: &str) -> Result> { - Ok(read_url_inner(context, url).await?.bytes().await?.into()) +pub async fn read_url_blob(context: &Context, url: &str) -> Result { + let response = read_url_inner(context, url).await?; + let content_type = response + .headers() + .get(reqwest::header::CONTENT_TYPE) + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.parse::().ok()); + let mimetype = content_type + .as_ref() + .map(|mime| mime.essence_str().to_string()); + let encoding = content_type.as_ref().and_then(|mime| { + mime.get_param(mime::CHARSET) + .map(|charset| charset.as_str().to_string()) + }); + let blob: Vec = response.bytes().await?.into(); + Ok(Response { + blob, + mimetype, + encoding, + }) } async fn read_url_inner(context: &Context, url: &str) -> Result { From a8d4cbd5c15a019a0e23fa5caac22ba85cfad885 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 19 Apr 2023 19:38:37 +0000 Subject: [PATCH 027/528] Add C API to get HTTP responses --- CHANGELOG.md | 1 + deltachat-ffi/deltachat.h | 59 +++++++++++++++++++++++++- deltachat-ffi/src/lib.rs | 88 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 656f583af..88244f85d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Changes - Add `get_http_response` JSON-RPC API. +- Add C API to get HTTP responses. ## [1.112.7] - 2023-04-17 diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index c901ab738..b18d62296 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -25,6 +25,7 @@ typedef struct _dc_event dc_event_t; typedef struct _dc_event_emitter dc_event_emitter_t; typedef struct _dc_jsonrpc_instance dc_jsonrpc_instance_t; typedef struct _dc_backup_provider dc_backup_provider_t; +typedef struct _dc_http_response dc_http_response_t; // Alias for backwards compatibility, use dc_event_emitter_t instead. typedef struct _dc_event_emitter dc_accounts_event_emitter_t; @@ -5057,6 +5058,63 @@ int dc_provider_get_status (const dc_provider_t* prov void dc_provider_unref (dc_provider_t* provider); +/** + * Return an HTTP(S) GET response. + * This function can be used to download remote content for HTML emails. + * + * @memberof dc_context_t + * @param context The context object to take proxy settings from. + * @param url HTTP or HTTPS URL. + * @return The response must be released using dc_http_response_unref() after usage. + * NULL is returned on errors. + */ +dc_http_response_t* dc_get_http_response (const dc_context_t* context, const char* url); + +/** + * Returns HTTP response MIME type as a string, e.g. "text/plain" or "text/html". + * + * @memberof dc_http_response_t + * @param response HTTP response as returned by dc_get_http_response(). + * @return The string which must be released using dc_str_unref() after usage. May be NULL. + */ +char* dc_http_response_get_mimetype (const dc_http_response_t* response); + +/** + * Returns HTTP response encoding, e.g. "utf-8". + * + * @memberof dc_http_response_t + * @param response HTTP response as returned by dc_get_http_response(). + * @return The string which must be released using dc_str_unref() after usage. May be NULL. + */ +char* dc_http_response_get_encoding (const dc_http_response_t* response); + +/** + * Returns HTTP response contents. + * + * @memberof dc_http_response_t + * @param response HTTP response as returned by dc_get_http_response(). + * @return The blob which must be released using dc_str_unref() after usage. NULL is never returned. + */ +uint8_t* dc_http_response_get_blob (const dc_http_response_t* response); + +/** + * Returns HTTP response content size. + * + * @memberof dc_http_response_t + * @param response HTTP response as returned by dc_get_http_response(). + * @return The blob size. + */ +size_t dc_http_response_get_size (const dc_http_response_t* response); + +/** + * Free an HTTP response object. + * + * @memberof dc_http_response_t + * @param response HTTP response as returned by dc_get_http_response(). + */ +void dc_http_response_unref (const dc_http_response_t* response); + + /** * @class dc_lot_t * @@ -5534,7 +5592,6 @@ void dc_reactions_unref (dc_reactions_t* reactions); */ - /** * @class dc_jsonrpc_instance_t * diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 968616a5d..23dc6de5c 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -31,6 +31,7 @@ use deltachat::ephemeral::Timer as EphemeralTimer; use deltachat::imex::BackupProvider; use deltachat::key::DcKey; use deltachat::message::MsgId; +use deltachat::net::read_url_blob; use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg}; use deltachat::reaction::{get_msg_reactions, send_reaction, Reactions}; use deltachat::stock_str::StockMessage; @@ -4467,6 +4468,93 @@ pub unsafe extern "C" fn dc_provider_unref(provider: *mut dc_provider_t) { // this may change once we start localizing string. } +// dc_http_response_t + +pub type dc_http_response_t = net::HttpResponse; + +#[no_mangle] +pub unsafe extern "C" fn dc_get_http_response( + context: *const dc_context_t, + url: *const libc::c_char, +) -> *mut dc_http_response_t { + if context.is_null() || url.is_null() { + eprintln!("ignoring careless call to dc_get_http_response()"); + return ptr::null_mut(); + } + + let context = &*context; + let url = to_string_lossy(url); + if let Ok(response) = block_on(read_url_blob(context, &url)).log_err(context, "read_url_blob") { + Box::into_raw(Box::new(response)) + } else { + ptr::null_mut() + } +} + +#[no_mangle] +pub unsafe extern "C" fn dc_http_response_get_mimetype( + response: *const dc_http_response_t, +) -> *mut libc::c_char { + if response.is_null() { + eprintln!("ignoring careless call to dc_http_response_get_mimetype()"); + return ptr::null_mut(); + } + + let response = &*response; + response.mimetype.strdup() +} + +#[no_mangle] +pub unsafe extern "C" fn dc_http_response_get_encoding( + response: *const dc_http_response_t, +) -> *mut libc::c_char { + if response.is_null() { + eprintln!("ignoring careless call to dc_http_response_get_encoding()"); + return ptr::null_mut(); + } + + let response = &*response; + response.encoding.strdup() +} + +#[no_mangle] +pub unsafe extern "C" fn dc_http_response_get_blob( + response: *const dc_http_response_t, +) -> *mut libc::c_char { + if response.is_null() { + eprintln!("ignoring careless call to dc_http_response_get_blob()"); + return ptr::null_mut(); + } + + let response = &*response; + let blob_len = response.blob.len(); + let ptr = libc::malloc(blob_len); + libc::memcpy(ptr, response.blob.as_ptr() as *mut libc::c_void, blob_len); + ptr as *mut libc::c_char +} + +#[no_mangle] +pub unsafe extern "C" fn dc_http_response_get_size( + response: *const dc_http_response_t, +) -> libc::size_t { + if response.is_null() { + eprintln!("ignoring careless call to dc_http_response_get_size()"); + return 0; + } + + let response = &*response; + response.blob.len() +} + +#[no_mangle] +pub unsafe extern "C" fn dc_http_response_unref(response: *mut dc_http_response_t) { + if response.is_null() { + eprintln!("ignoring careless call to dc_http_response_unref()"); + return; + } + drop(Box::from_raw(response)); +} + // -- Accounts /// Reader-writer lock wrapper for accounts manager to guarantee thread safety when using From 0e9f8c47261e2084eac7b545edddca050bf28cfd Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 20 Apr 2023 15:52:54 +0200 Subject: [PATCH 028/528] describe dc_http_response_t, needed for doxygen's @memberof --- deltachat-ffi/deltachat.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index b18d62296..a08067b84 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -5070,6 +5070,15 @@ void dc_provider_unref (dc_provider_t* provider); */ dc_http_response_t* dc_get_http_response (const dc_context_t* context, const char* url); + +/** + * @class dc_http_response_t + * + * An object containing an HTTP(S) GET response. + * Created by dc_get_http_response(). + */ + + /** * Returns HTTP response MIME type as a string, e.g. "text/plain" or "text/html". * From fa95b269a5b8cbdc22f4dd87b4201764dedff379 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 14:03:47 +0000 Subject: [PATCH 029/528] Backport new set_core_version.py --- scripts/set_core_version.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/scripts/set_core_version.py b/scripts/set_core_version.py index 7bc888d1b..cd6303cc9 100755 --- a/scripts/set_core_version.py +++ b/scripts/set_core_version.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import datetime import json import os import pathlib @@ -56,7 +57,8 @@ def update_package_json(relpath, newversion): json_data = json.loads(f.read()) json_data["version"] = newversion with open(p, "w") as f: - f.write(json.dumps(json_data, sort_keys=True, indent=2)) + json.dump(json_data, f, sort_keys=True, indent=2) + f.write("\n") def main(): @@ -90,15 +92,25 @@ def main(): ffi_toml = read_toml_version("deltachat-ffi/Cargo.toml") assert core_toml == ffi_toml, (core_toml, ffi_toml) + today = datetime.date.today().isoformat() + if "alpha" not in newversion: - for line in open("CHANGELOG.md"): + changelog_name = "CHANGELOG.md" + changelog_tmpname = changelog_name + ".tmp" + changelog_tmp = open(changelog_tmpname, "w") + found = False + for line in open(changelog_name): ## 1.25.0 - if line.startswith("## [") and line[4:].strip().startswith(newversion): - break - else: + if line == f"## [{newversion}]\n": + line = f"## [{newversion}] - {today}\n" + found = True + changelog_tmp.write(line) + if not found: raise SystemExit( - f"CHANGELOG.md contains no entry for version: {newversion}" + f"{changelog_name} contains no entry for version: {newversion}" ) + changelog_tmp.close() + os.rename(changelog_tmpname, changelog_name) for toml_filename in toml_list: replace_toml_version(toml_filename, newversion) @@ -106,6 +118,9 @@ def main(): for json_filename in json_list: update_package_json(json_filename, newversion) + with open("release-date.in", "w") as f: + f.write(today) + print("running cargo check") subprocess.call(["cargo", "check"]) From 3a8df3e673dd0a6b3b1efc979acd2677c37ab001 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 12:32:52 +0000 Subject: [PATCH 030/528] Do not use println! in JSON-RPC This may break the output of deltachat-rpc-server --- CHANGELOG.md | 6 ++++++ deltachat-jsonrpc/src/api/mod.rs | 2 -- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bc466860..b06c8e826 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Fixes +- JSON-RPC: do not print to stdout on failure to find an account. + + ## [1.113.0] - 2023-04-18 ### Added diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index cc994ed63..5418862c9 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -205,8 +205,6 @@ impl CommandApi { let context_option = self.accounts.read().await.get_account(id); if let Some(ctx) = context_option { accounts.push(Account::from_context(&ctx, id).await?) - } else { - println!("account with id {id} doesn't exist anymore"); } } Ok(accounts) From 2701c135db732f7c9f7f6770d8aa0def1d7cf121 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 14:10:34 +0000 Subject: [PATCH 031/528] Prepare 1.112.8 --- CHANGELOG.md | 2 +- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 4 ++-- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 4 ++-- release-date.in | 1 + 10 files changed, 16 insertions(+), 15 deletions(-) create mode 100644 release-date.in diff --git a/CHANGELOG.md b/CHANGELOG.md index 88244f85d..00c290869 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## [1.112.8] - 2023-04-20 ### Changes - Add `get_http_response` JSON-RPC API. diff --git a/Cargo.lock b/Cargo.lock index 1d9b43fb0..56a68e36d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.7" +version = "1.112.8" dependencies = [ "ansi_term", "anyhow", @@ -1124,7 +1124,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.112.7" +version = "1.112.8" dependencies = [ "anyhow", "async-channel", @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.112.7" +version = "1.112.8" dependencies = [ "ansi_term", "anyhow", @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.112.7" +version = "1.112.8" dependencies = [ "anyhow", "deltachat", @@ -1186,7 +1186,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.112.7" +version = "1.112.8" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index e3519b421..971208643 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.112.7" +version = "1.112.8" edition = "2021" license = "MPL-2.0" rust-version = "1.64" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 674dbbe93..bf7c46d26 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.112.7" +version = "1.112.8" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 0007a7b60..7947619da 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.112.7" +version = "1.112.8" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 7409bbe60..8a266051d 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.112.7" -} \ No newline at end of file + "version": "1.112.8" +} diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 4546ec4b9..5632d5cd2 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.112.7" +version = "1.112.8" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index fb94b10bf..adf829c87 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.112.7" +version = "1.112.8" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index d4be1a946..14bee1111 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.112.7" -} \ No newline at end of file + "version": "1.112.8" +} diff --git a/release-date.in b/release-date.in new file mode 100644 index 000000000..c0762cd07 --- /dev/null +++ b/release-date.in @@ -0,0 +1 @@ +2023-04-20 \ No newline at end of file From 40484e875e7f449a3a02011d9d8112ff7e045250 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 15:23:20 +0000 Subject: [PATCH 032/528] deltachat-ffi: update read_url_blob for new .log_err() --- deltachat-ffi/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 4b1f859e9..c567ac50d 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -4589,7 +4589,10 @@ pub unsafe extern "C" fn dc_get_http_response( let context = &*context; let url = to_string_lossy(url); - if let Ok(response) = block_on(read_url_blob(context, &url)).log_err(context, "read_url_blob") { + if let Ok(response) = block_on(read_url_blob(context, &url)) + .context("read_url_blob") + .log_err(context) + { Box::into_raw(Box::new(response)) } else { ptr::null_mut() From e7aab5c67c304890041d4756b66983896e39b4b9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 15:40:09 +0000 Subject: [PATCH 033/528] Remove newline from release-date.in --- release-date.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-date.in b/release-date.in index faca32070..c0762cd07 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-04-20 +2023-04-20 \ No newline at end of file From 514074de8bcd22c3181317e19238131d328ef3a1 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 20 Apr 2023 10:03:13 +0000 Subject: [PATCH 034/528] JSON-RPC: retrieve events via long polling This way is more compatible to JSON-RPC libraries that do not support receiving notifications from the server and allows describing event types in the OpenRPC specification. Event thread converting events to notifications in the FFI is removed, so it is now possible to construct a dc_jsonrpc_instance_t while still retrieving events via dc_event_emitter_t. --- CHANGELOG.md | 6 + deltachat-ffi/src/lib.rs | 23 +--- deltachat-jsonrpc/src/api/events.rs | 117 ++++++++---------- deltachat-jsonrpc/src/api/mod.rs | 11 ++ deltachat-jsonrpc/src/webserver.rs | 8 -- deltachat-jsonrpc/typescript/src/client.ts | 36 +++--- deltachat-jsonrpc/typescript/src/lib.ts | 1 - .../src/deltachat_rpc_client/rpc.py | 34 +++-- deltachat-rpc-server/src/main.rs | 26 +--- 9 files changed, 120 insertions(+), 142 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc145bb4a..d55022256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +### Changes +- JSON-RPC: Use long polling instead of server-sent notifications to retrieve events. + This better corresponds to JSON-RPC 2.0 server-client distinction + and is expected to simplify writing new bindings + because dispatching events can be done on higher level. + ### Fixes - JSON-RPC: do not print to stdout on failure to find an account. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index c567ac50d..ebbe0d119 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -4967,7 +4967,6 @@ pub unsafe extern "C" fn dc_accounts_get_event_emitter( #[cfg(feature = "jsonrpc")] mod jsonrpc { use deltachat_jsonrpc::api::CommandApi; - use deltachat_jsonrpc::events::event_to_json_rpc_notification; use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcSession}; use super::*; @@ -4975,7 +4974,6 @@ mod jsonrpc { pub struct dc_jsonrpc_instance_t { receiver: OutReceiver, handle: RpcSession, - event_thread: JoinHandle>, } #[no_mangle] @@ -4988,28 +4986,12 @@ mod jsonrpc { } let account_manager = &*account_manager; - let events = block_on(account_manager.read()).get_event_emitter(); let cmd_api = deltachat_jsonrpc::api::CommandApi::from_arc(account_manager.inner.clone()); let (request_handle, receiver) = RpcClient::new(); - let handle = RpcSession::new(request_handle.clone(), cmd_api); + let handle = RpcSession::new(request_handle, cmd_api); - let event_thread = spawn(async move { - while let Some(event) = events.recv().await { - let event = event_to_json_rpc_notification(event); - request_handle - .send_notification("event", Some(event)) - .await?; - } - let res: Result<(), anyhow::Error> = Ok(()); - res - }); - - let instance = dc_jsonrpc_instance_t { - receiver, - handle, - event_thread, - }; + let instance = dc_jsonrpc_instance_t { receiver, handle }; Box::into_raw(Box::new(instance)) } @@ -5020,7 +5002,6 @@ mod jsonrpc { eprintln!("ignoring careless call to dc_jsonrpc_unref()"); return; } - (*jsonrpc_instance).event_thread.abort(); drop(Box::from_raw(jsonrpc_instance)); } diff --git a/deltachat-jsonrpc/src/api/events.rs b/deltachat-jsonrpc/src/api/events.rs index ddbbcebca..9c36e5b53 100644 --- a/deltachat-jsonrpc/src/api/events.rs +++ b/deltachat-jsonrpc/src/api/events.rs @@ -1,19 +1,28 @@ -use deltachat::{Event, EventType}; +use deltachat::{Event as CoreEvent, EventType as CoreEventType}; use serde::Serialize; -use serde_json::{json, Value}; use typescript_type_def::TypeDef; -pub fn event_to_json_rpc_notification(event: Event) -> Value { - let id: JSONRPCEventType = event.typ.into(); - json!({ - "event": id, - "contextId": event.id, - }) +#[derive(Serialize, TypeDef)] +pub struct Event { + /// Event payload. + event: EventType, + + /// Account ID. + context_id: u32, +} + +impl From for Event { + fn from(event: CoreEvent) -> Self { + Event { + event: event.typ.into(), + context_id: event.id, + } + } } #[derive(Serialize, TypeDef)] -#[serde(tag = "type", rename = "Event")] -pub enum JSONRPCEventType { +#[serde(tag = "type")] +pub enum EventType { /// The library-user may write an informational string to the log. /// /// This event should *not* be reported to the end-user using a popup or something like @@ -286,27 +295,27 @@ pub enum JSONRPCEventType { }, } -impl From for JSONRPCEventType { - fn from(event: EventType) -> Self { - use JSONRPCEventType::*; +impl From for EventType { + fn from(event: CoreEventType) -> Self { + use EventType::*; match event { - EventType::Info(msg) => Info { msg }, - EventType::SmtpConnected(msg) => SmtpConnected { msg }, - EventType::ImapConnected(msg) => ImapConnected { msg }, - EventType::SmtpMessageSent(msg) => SmtpMessageSent { msg }, - EventType::ImapMessageDeleted(msg) => ImapMessageDeleted { msg }, - EventType::ImapMessageMoved(msg) => ImapMessageMoved { msg }, - EventType::ImapInboxIdle => ImapInboxIdle, - EventType::NewBlobFile(file) => NewBlobFile { file }, - EventType::DeletedBlobFile(file) => DeletedBlobFile { file }, - EventType::Warning(msg) => Warning { msg }, - EventType::Error(msg) => Error { msg }, - EventType::ErrorSelfNotInGroup(msg) => ErrorSelfNotInGroup { msg }, - EventType::MsgsChanged { chat_id, msg_id } => MsgsChanged { + CoreEventType::Info(msg) => Info { msg }, + CoreEventType::SmtpConnected(msg) => SmtpConnected { msg }, + CoreEventType::ImapConnected(msg) => ImapConnected { msg }, + CoreEventType::SmtpMessageSent(msg) => SmtpMessageSent { msg }, + CoreEventType::ImapMessageDeleted(msg) => ImapMessageDeleted { msg }, + CoreEventType::ImapMessageMoved(msg) => ImapMessageMoved { msg }, + CoreEventType::ImapInboxIdle => ImapInboxIdle, + CoreEventType::NewBlobFile(file) => NewBlobFile { file }, + CoreEventType::DeletedBlobFile(file) => DeletedBlobFile { file }, + CoreEventType::Warning(msg) => Warning { msg }, + CoreEventType::Error(msg) => Error { msg }, + CoreEventType::ErrorSelfNotInGroup(msg) => ErrorSelfNotInGroup { msg }, + CoreEventType::MsgsChanged { chat_id, msg_id } => MsgsChanged { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, - EventType::ReactionsChanged { + CoreEventType::ReactionsChanged { chat_id, msg_id, contact_id, @@ -315,92 +324,76 @@ impl From for JSONRPCEventType { msg_id: msg_id.to_u32(), contact_id: contact_id.to_u32(), }, - EventType::IncomingMsg { chat_id, msg_id } => IncomingMsg { + CoreEventType::IncomingMsg { chat_id, msg_id } => IncomingMsg { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, - EventType::IncomingMsgBunch { msg_ids } => IncomingMsgBunch { + CoreEventType::IncomingMsgBunch { msg_ids } => IncomingMsgBunch { msg_ids: msg_ids.into_iter().map(|id| id.to_u32()).collect(), }, - EventType::MsgsNoticed(chat_id) => MsgsNoticed { + CoreEventType::MsgsNoticed(chat_id) => MsgsNoticed { chat_id: chat_id.to_u32(), }, - EventType::MsgDelivered { chat_id, msg_id } => MsgDelivered { + CoreEventType::MsgDelivered { chat_id, msg_id } => MsgDelivered { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, - EventType::MsgFailed { chat_id, msg_id } => MsgFailed { + CoreEventType::MsgFailed { chat_id, msg_id } => MsgFailed { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, - EventType::MsgRead { chat_id, msg_id } => MsgRead { + CoreEventType::MsgRead { chat_id, msg_id } => MsgRead { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, - EventType::ChatModified(chat_id) => ChatModified { + CoreEventType::ChatModified(chat_id) => ChatModified { chat_id: chat_id.to_u32(), }, - EventType::ChatEphemeralTimerModified { chat_id, timer } => { + CoreEventType::ChatEphemeralTimerModified { chat_id, timer } => { ChatEphemeralTimerModified { chat_id: chat_id.to_u32(), timer: timer.to_u32(), } } - EventType::ContactsChanged(contact) => ContactsChanged { + CoreEventType::ContactsChanged(contact) => ContactsChanged { contact_id: contact.map(|c| c.to_u32()), }, - EventType::LocationChanged(contact) => LocationChanged { + CoreEventType::LocationChanged(contact) => LocationChanged { contact_id: contact.map(|c| c.to_u32()), }, - EventType::ConfigureProgress { progress, comment } => { + CoreEventType::ConfigureProgress { progress, comment } => { ConfigureProgress { progress, comment } } - EventType::ImexProgress(progress) => ImexProgress { progress }, - EventType::ImexFileWritten(path) => ImexFileWritten { + CoreEventType::ImexProgress(progress) => ImexProgress { progress }, + CoreEventType::ImexFileWritten(path) => ImexFileWritten { path: path.to_str().unwrap_or_default().to_owned(), }, - EventType::SecurejoinInviterProgress { + CoreEventType::SecurejoinInviterProgress { contact_id, progress, } => SecurejoinInviterProgress { contact_id: contact_id.to_u32(), progress, }, - EventType::SecurejoinJoinerProgress { + CoreEventType::SecurejoinJoinerProgress { contact_id, progress, } => SecurejoinJoinerProgress { contact_id: contact_id.to_u32(), progress, }, - EventType::ConnectivityChanged => ConnectivityChanged, - EventType::SelfavatarChanged => SelfavatarChanged, - EventType::WebxdcStatusUpdate { + CoreEventType::ConnectivityChanged => ConnectivityChanged, + CoreEventType::SelfavatarChanged => SelfavatarChanged, + CoreEventType::WebxdcStatusUpdate { msg_id, status_update_serial, } => WebxdcStatusUpdate { msg_id: msg_id.to_u32(), status_update_serial: status_update_serial.to_u32(), }, - EventType::WebxdcInstanceDeleted { msg_id } => WebxdcInstanceDeleted { + CoreEventType::WebxdcInstanceDeleted { msg_id } => WebxdcInstanceDeleted { msg_id: msg_id.to_u32(), }, } } } - -#[cfg(test)] -#[test] -fn generate_events_ts_types_definition() { - let events = { - let mut buf = Vec::new(); - let options = typescript_type_def::DefinitionFileOptions { - root_namespace: None, - ..typescript_type_def::DefinitionFileOptions::default() - }; - typescript_type_def::write_definition_file::<_, JSONRPCEventType>(&mut buf, options) - .unwrap(); - String::from_utf8(buf).unwrap() - }; - std::fs::write("typescript/generated/events.ts", events).unwrap(); -} diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 41dff098b..19a1ef109 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -49,6 +49,7 @@ use types::message::MessageObject; use types::provider_info::ProviderInfo; use types::webxdc::WebxdcMessageInfo; +use self::events::Event; use self::types::message::MessageLoadResult; use self::types::{ chat::{BasicChat, JSONRPCChatVisibility, MuteDuration}, @@ -165,6 +166,16 @@ impl CommandApi { get_info() } + /// Get the next event. + async fn get_next_event(&self) -> Result { + let event_emitter = self.accounts.read().await.get_event_emitter(); + event_emitter + .recv() + .await + .map(|event| event.into()) + .context("event channel is closed") + } + // --------------------------------------------- // Account Management // --------------------------------------------- diff --git a/deltachat-jsonrpc/src/webserver.rs b/deltachat-jsonrpc/src/webserver.rs index 9231069c5..df8f92135 100644 --- a/deltachat-jsonrpc/src/webserver.rs +++ b/deltachat-jsonrpc/src/webserver.rs @@ -6,7 +6,6 @@ use yerpc::axum::handle_ws_rpc; use yerpc::{RpcClient, RpcSession}; mod api; -use api::events::event_to_json_rpc_notification; use api::{Accounts, CommandApi}; const DEFAULT_PORT: u16 = 20808; @@ -44,12 +43,5 @@ async fn main() -> Result<(), std::io::Error> { async fn handler(ws: WebSocketUpgrade, Extension(api): Extension) -> Response { let (client, out_receiver) = RpcClient::new(); let session = RpcSession::new(client.clone(), api.clone()); - tokio::spawn(async move { - let events = api.accounts.read().await.get_event_emitter(); - while let Some(event) = events.recv().await { - let event = event_to_json_rpc_notification(event); - client.send_notification("event", Some(event)).await.ok(); - } - }); handle_ws_rpc(ws, out_receiver, session).await } diff --git a/deltachat-jsonrpc/typescript/src/client.ts b/deltachat-jsonrpc/typescript/src/client.ts index 9efbab964..783ed7bad 100644 --- a/deltachat-jsonrpc/typescript/src/client.ts +++ b/deltachat-jsonrpc/typescript/src/client.ts @@ -1,7 +1,6 @@ import * as T from "../generated/types.js"; import * as RPC from "../generated/jsonrpc.js"; import { RawClient } from "../generated/client.js"; -import { Event } from "../generated/events.js"; import { WebsocketTransport, BaseTransport, Request } from "yerpc"; import { TinyEmitter } from "@deltachat/tiny-emitter"; @@ -36,27 +35,30 @@ export class BaseDeltaChat< rpc: RawClient; account?: T.Account; private contextEmitters: { [key: number]: TinyEmitter } = {}; + + private eventTask: Promise; + constructor(public transport: Transport) { super(); this.rpc = new RawClient(this.transport); - this.transport.on("request", (request: Request) => { - const method = request.method; - if (method === "event") { - const event = request.params! as DCWireEvent; - //@ts-ignore - this.emit(event.event.type, event.contextId, event.event as any); - this.emit("ALL", event.contextId, event.event as any); + this.eventTask = this.eventLoop(); + } - if (this.contextEmitters[event.contextId]) { - this.contextEmitters[event.contextId].emit( - event.event.type, - //@ts-ignore - event.event as any - ); - this.contextEmitters[event.contextId].emit("ALL", event.event); - } + async eventLoop(): Promise { + while (true) { + const event = await this.rpc.getNextEvent(); + this.emit(event.event.type, event.context_id, event.event as any); + this.emit("ALL", event.context_id, event.event as any); + + if (this.contextEmitters[event.context_id]) { + this.contextEmitters[event.context_id].emit( + event.event.type, + //@ts-ignore + event.event as any + ); + this.contextEmitters[event.context_id].emit("ALL", event.event as any); } - }); + } } async listAccounts(): Promise { diff --git a/deltachat-jsonrpc/typescript/src/lib.ts b/deltachat-jsonrpc/typescript/src/lib.ts index 473d2bd33..de357a1ea 100644 --- a/deltachat-jsonrpc/typescript/src/lib.ts +++ b/deltachat-jsonrpc/typescript/src/lib.ts @@ -1,6 +1,5 @@ export * as RPC from "../generated/jsonrpc.js"; export * as T from "../generated/types.js"; -export * from "../generated/events.js"; export { RawClient } from "../generated/client.js"; export * from "./client.js"; export * as yerpc from "yerpc"; diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py index f15c1a29a..57e26dd0b 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py @@ -23,7 +23,9 @@ class Rpc: self.event_queues: Dict[int, asyncio.Queue] # Map from request ID to `asyncio.Future` returning the response. self.request_events: Dict[int, asyncio.Future] + self.closing: bool self.reader_task: asyncio.Task + self.events_task: asyncio.Task async def start(self) -> None: self.process = await asyncio.create_subprocess_exec( @@ -35,10 +37,15 @@ class Rpc: self.id = 0 self.event_queues = {} self.request_events = {} + self.closing = False self.reader_task = asyncio.create_task(self.reader_loop()) + self.events_task = asyncio.create_task(self.events_loop()) async def close(self) -> None: """Terminate RPC server process and wait until the reader loop finishes.""" + self.closing = True + await self.stop_io_for_all_accounts() + await self.events_task self.process.terminate() await self.reader_task @@ -58,21 +65,28 @@ class Rpc: if "id" in response: fut = self.request_events.pop(response["id"]) fut.set_result(response) - elif response["method"] == "event": - # An event notification. - params = response["params"] - account_id = params["contextId"] - if account_id not in self.event_queues: - self.event_queues[account_id] = asyncio.Queue() - await self.event_queues[account_id].put(params["event"]) else: print(response) + async def get_queue(self, account_id: int) -> asyncio.Queue: + if account_id not in self.event_queues: + self.event_queues[account_id] = asyncio.Queue() + return self.event_queues[account_id] + + async def events_loop(self) -> None: + """Requests new events and distributes them between queues.""" + while True: + if self.closing: + return + event = await self.get_next_event() + account_id = event["context_id"] + queue = await self.get_queue(account_id) + await queue.put(event["event"]) + async def wait_for_event(self, account_id: int) -> Optional[dict]: """Waits for the next event from the given account and returns it.""" - if account_id in self.event_queues: - return await self.event_queues[account_id].get() - return None + queue = await self.get_queue(account_id) + return await queue.get() def __getattr__(self, attr: str): async def method(*args, **kwargs) -> Any: diff --git a/deltachat-rpc-server/src/main.rs b/deltachat-rpc-server/src/main.rs index 419f4deb4..a635dddb5 100644 --- a/deltachat-rpc-server/src/main.rs +++ b/deltachat-rpc-server/src/main.rs @@ -7,7 +7,6 @@ use std::sync::Arc; use anyhow::{anyhow, Context as _, Result}; use deltachat::constants::DC_VERSION_STR; -use deltachat_jsonrpc::api::events::event_to_json_rpc_notification; use deltachat_jsonrpc::api::{Accounts, CommandApi}; use futures_lite::stream::StreamExt; use tokio::io::{self, AsyncBufReadExt, BufReader}; @@ -58,7 +57,6 @@ async fn main_impl() -> Result<()> { let path = std::env::var("DC_ACCOUNTS_PATH").unwrap_or_else(|_| "accounts".to_string()); log::info!("Starting with accounts directory `{}`.", path); let accounts = Accounts::new(PathBuf::from(&path)).await?; - let events = accounts.get_event_emitter(); log::info!("Creating JSON-RPC API."); let accounts = Arc::new(RwLock::new(accounts)); @@ -68,21 +66,6 @@ async fn main_impl() -> Result<()> { let session = RpcSession::new(client.clone(), state.clone()); let main_cancel = CancellationToken::new(); - // Events task converts core events to JSON-RPC notifications. - let cancel = main_cancel.clone(); - let events_task: JoinHandle> = tokio::spawn(async move { - let _cancel_guard = cancel.clone().drop_guard(); - let mut r = Ok(()); - while let Some(event) = events.recv().await { - if r.is_err() { - continue; - } - let event = event_to_json_rpc_notification(event); - r = client.send_notification("event", Some(event)).await; - } - Ok(()) - }); - // Send task prints JSON responses to stdout. let cancel = main_cancel.clone(); let send_task: JoinHandle> = tokio::spawn(async move { @@ -148,16 +131,13 @@ async fn main_impl() -> Result<()> { Ok(()) }); - // See "Thread safety" section in deltachat-ffi/deltachat.h for explanation. - // NB: Events are drained by events_task. main_cancel.cancelled().await; accounts.read().await.stop_io().await; drop(accounts); drop(state); - let (r0, r1, r2, r3) = tokio::join!(events_task, send_task, sigterm_task, recv_task); - for r in [r0, r1, r2, r3] { - r??; - } + send_task.await??; + sigterm_task.await??; + recv_task.await??; Ok(()) } From 1b8bfef441df0cd13134565d0ec8149426fc759f Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 24 Apr 2023 23:18:55 +0200 Subject: [PATCH 035/528] jsonrpc: make event loop in ts client optional (#4347) * jsonrpc: make event loop in ts client optional * jsonrpc: ts: fix tests and make specifying `startEventLoop` mandatory * add changelog entry * Update CHANGELOG.md --- CHANGELOG.md | 1 + deltachat-jsonrpc/typescript/src/client.ts | 25 ++++++++++++++------- deltachat-jsonrpc/typescript/test/basic.ts | 2 +- deltachat-jsonrpc/typescript/test/online.ts | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d55022256..b46b2f8b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This better corresponds to JSON-RPC 2.0 server-client distinction and is expected to simplify writing new bindings because dispatching events can be done on higher level. +- JSON-RPC: TS: Client now has a mandatory argument whether you want to start listening for events. ### Fixes - JSON-RPC: do not print to stdout on failure to find an account. diff --git a/deltachat-jsonrpc/typescript/src/client.ts b/deltachat-jsonrpc/typescript/src/client.ts index 783ed7bad..97c4a8364 100644 --- a/deltachat-jsonrpc/typescript/src/client.ts +++ b/deltachat-jsonrpc/typescript/src/client.ts @@ -36,12 +36,15 @@ export class BaseDeltaChat< account?: T.Account; private contextEmitters: { [key: number]: TinyEmitter } = {}; + //@ts-ignore private eventTask: Promise; - constructor(public transport: Transport) { + constructor(public transport: Transport, startEventLoop: boolean) { super(); this.rpc = new RawClient(this.transport); - this.eventTask = this.eventLoop(); + if (startEventLoop) { + this.eventTask = this.eventLoop(); + } } async eventLoop(): Promise { @@ -77,10 +80,12 @@ export class BaseDeltaChat< export type Opts = { url: string; + startEventLoop: boolean; }; export const DEFAULT_OPTS: Opts = { url: "ws://localhost:20808/ws", + startEventLoop: true, }; export class DeltaChat extends BaseDeltaChat { opts: Opts; @@ -88,20 +93,24 @@ export class DeltaChat extends BaseDeltaChat { this.transport.close(); } constructor(opts?: Opts | string) { - if (typeof opts === "string") opts = { url: opts }; - if (opts) opts = { ...DEFAULT_OPTS, ...opts }; - else opts = { ...DEFAULT_OPTS }; + if (typeof opts === "string") { + opts = { ...DEFAULT_OPTS, url: opts }; + } else if (opts) { + opts = { ...DEFAULT_OPTS, ...opts }; + } else { + opts = { ...DEFAULT_OPTS }; + } const transport = new WebsocketTransport(opts.url); - super(transport); + super(transport, opts.startEventLoop); this.opts = opts; } } export class StdioDeltaChat extends BaseDeltaChat { close() {} - constructor(input: any, output: any) { + constructor(input: any, output: any, startEventLoop: boolean) { const transport = new StdioTransport(input, output); - super(transport); + super(transport, startEventLoop); } } diff --git a/deltachat-jsonrpc/typescript/test/basic.ts b/deltachat-jsonrpc/typescript/test/basic.ts index 1589a733d..1c430f3f5 100644 --- a/deltachat-jsonrpc/typescript/test/basic.ts +++ b/deltachat-jsonrpc/typescript/test/basic.ts @@ -12,7 +12,7 @@ describe("basic tests", () => { before(async () => { serverHandle = await startServer(); - dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout); + dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout, true); // dc.on("ALL", (event) => { //console.log("event", event); // }); diff --git a/deltachat-jsonrpc/typescript/test/online.ts b/deltachat-jsonrpc/typescript/test/online.ts index 418f14679..3ab6cb820 100644 --- a/deltachat-jsonrpc/typescript/test/online.ts +++ b/deltachat-jsonrpc/typescript/test/online.ts @@ -27,7 +27,7 @@ describe("online tests", function () { this.skip(); } serverHandle = await startServer(); - dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout); + dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout, true); dc.on("ALL", (contextId, { type }) => { if (type !== "Info") console.log(contextId, type); From edfdbbdc90e97de92b5f86a74ecddb3be6a8aa9a Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 24 Apr 2023 22:31:17 +0000 Subject: [PATCH 036/528] Release 1.114.0 --- CHANGELOG.md | 3 ++- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b46b2f8b6..76a4313a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## [1.114.0] - 2023-04-24 ### Changes - JSON-RPC: Use long polling instead of server-sent notifications to retrieve events. @@ -2431,3 +2431,4 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 [1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.113.0 +[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 diff --git a/Cargo.lock b/Cargo.lock index e462de808..c4e3ed733 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1144,7 +1144,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.113.0" +version = "1.114.0" dependencies = [ "ansi_term", "anyhow", @@ -1219,7 +1219,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.113.0" +version = "1.114.0" dependencies = [ "anyhow", "async-channel", @@ -1242,7 +1242,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.113.0" +version = "1.114.0" dependencies = [ "ansi_term", "anyhow", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.113.0" +version = "1.114.0" dependencies = [ "anyhow", "deltachat", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.113.0" +version = "1.114.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index 4d3d42494..de429e590 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.113.0" +version = "1.114.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 87e59d519..3975fedac 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.113.0" +version = "1.114.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 9c54cff1f..2b6c6bedc 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.113.0" +version = "1.114.0" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index eac53436a..3a9094121 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.113.0" + "version": "1.114.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 90443a222..7f12f1157 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.113.0" +version = "1.114.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index fbe7c1dca..f7fd73fbd 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.113.0" +version = "1.114.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 1e2e82366..5898750b7 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.113.0" + "version": "1.114.0" } diff --git a/release-date.in b/release-date.in index c0762cd07..adcf29f01 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-04-20 \ No newline at end of file +2023-04-24 \ No newline at end of file From ea8ee4e67da12930ee124a7100bbea3c0e33ab47 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sat, 7 Jan 2023 02:00:48 +0100 Subject: [PATCH 037/528] jsonrpc: Remove message id from chatlist item (#3071) Why? because desktop currently fetches the chatlist multiple times, even though it just needs the chatlistitem for one chat. Note: @r10s was worried before that exposing the method to get a single updated chatlistitem could lead to race conditions where the chatlist item is newer than the chatlist order. But I don't think this will change anything for desktop besides making it a little faster (because currently desktop fetches the whole chatlist instead of just the entry it needs when an entry updates). --- CHANGELOG.md | 8 +++++++ deltachat-jsonrpc/src/api/mod.rs | 19 ++++++---------- deltachat-jsonrpc/src/api/types/chat_list.rs | 22 ++++++------------- .../typescript/example/example.ts | 2 +- .../src/deltachat_rpc_client/account.py | 2 +- src/chatlist.rs | 19 ++++++++++++++++ 6 files changed, 43 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76a4313a5..b074c36bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## Unreleased + +### Changes +- BREAKING: jsonrpc: + - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` + - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` + + ## [1.114.0] - 2023-04-24 ### Changes diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 19a1ef109..98942a855 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -41,7 +41,6 @@ pub mod types; use num_traits::FromPrimitive; use types::account::Account; use types::chat::FullChat; -use types::chat_list::ChatListEntry; use types::contact::ContactObject; use types::http::HttpResponse; use types::message::MessageData; @@ -549,7 +548,7 @@ impl CommandApi { list_flags: Option, query_string: Option, query_contact_id: Option, - ) -> Result> { + ) -> Result> { let ctx = self.get_context(account_id).await?; let list = Chatlist::try_load( &ctx, @@ -558,12 +557,9 @@ impl CommandApi { query_contact_id.map(ContactId::new), ) .await?; - let mut l: Vec = Vec::with_capacity(list.len()); + let mut l: Vec = Vec::with_capacity(list.len()); for i in 0..list.len() { - l.push(ChatListEntry( - list.get_chat_id(i)?.to_u32(), - list.get_msg_id(i)?.unwrap_or_default().to_u32(), - )); + l.push(list.get_chat_id(i)?.to_u32()); } Ok(l) } @@ -571,19 +567,18 @@ impl CommandApi { async fn get_chatlist_items_by_entries( &self, account_id: u32, - entries: Vec, + entries: Vec, ) -> Result> { - // todo custom json deserializer for ChatListEntry? let ctx = self.get_context(account_id).await?; let mut result: HashMap = HashMap::with_capacity(entries.len()); - for entry in entries.iter() { + for &entry in entries.iter() { result.insert( - entry.0, + entry, match get_chat_list_item_by_id(&ctx, entry).await { Ok(res) => res, Err(err) => ChatListItemFetchResult::Error { - id: entry.0, + id: entry, error: format!("{err:#}"), }, }, diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index 83b84dd3d..c98b6d932 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -1,23 +1,18 @@ use anyhow::Result; +use deltachat::chat::{Chat, ChatId}; +use deltachat::chatlist::get_last_message_for_chat; use deltachat::constants::*; use deltachat::contact::{Contact, ContactId}; use deltachat::{ chat::{get_chat_contacts, ChatVisibility}, chatlist::Chatlist, }; -use deltachat::{ - chat::{Chat, ChatId}, - message::MsgId, -}; use num_traits::cast::ToPrimitive; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; -#[derive(Deserialize, Serialize, TypeDef)] -pub struct ChatListEntry(pub u32, pub u32); - #[derive(Serialize, TypeDef)] #[serde(tag = "type")] pub enum ChatListItemFetchResult { @@ -56,14 +51,9 @@ pub enum ChatListItemFetchResult { pub(crate) async fn get_chat_list_item_by_id( ctx: &deltachat::context::Context, - entry: &ChatListEntry, + entry: u32, ) -> Result { - let chat_id = ChatId::new(entry.0); - let last_msgid = match entry.1 { - 0 => None, - _ => Some(MsgId::new(entry.1)), - }; - + let chat_id = ChatId::new(entry); let fresh_message_counter = chat_id.get_fresh_msg_cnt(ctx).await?; if chat_id.is_archived_link() { @@ -72,6 +62,8 @@ pub(crate) async fn get_chat_list_item_by_id( }); } + let last_msgid = get_last_message_for_chat(ctx, chat_id).await?; + let chat = Chat::load_from_db(ctx, chat_id).await?; let summary = Chatlist::get_summary2(ctx, chat_id, last_msgid, Some(&chat)).await?; diff --git a/deltachat-jsonrpc/typescript/example/example.ts b/deltachat-jsonrpc/typescript/example/example.ts index 0caa2de06..d7b038e0c 100644 --- a/deltachat-jsonrpc/typescript/example/example.ts +++ b/deltachat-jsonrpc/typescript/example/example.ts @@ -67,7 +67,7 @@ async function run() { null, null ); - for (const [chatId, _messageId] of chats) { + for (const chatId of chats) { const chat = await client.rpc.getFullChatById(selectedAccount, chatId); write($main, `

${chat.name}

`); const messageIds = await client.rpc.getMessageIds( diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/account.py b/deltachat-rpc-client/src/deltachat_rpc_client/account.py index 4c44079f7..c3f29995c 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/account.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/account.py @@ -177,7 +177,7 @@ class Account: entries = await self._rpc.get_chatlist_entries(self.id, flags, query, contact and contact.id) if not snapshot: - return [Chat(self, entry[0]) for entry in entries] + return [Chat(self, entry) for entry in entries] items = await self._rpc.get_chatlist_items_by_entries(self.id, entries) chats = [] diff --git a/src/chatlist.rs b/src/chatlist.rs index ddd60c072..718918807 100644 --- a/src/chatlist.rs +++ b/src/chatlist.rs @@ -362,6 +362,25 @@ pub async fn get_archived_cnt(context: &Context) -> Result { Ok(count) } +/// Gets the last message of a chat, the message that would also be displayed in the ChatList +/// Used for passing to `deltachat::chatlist::Chatlist::get_summary2` +pub async fn get_last_message_for_chat( + context: &Context, + chat_id: ChatId, +) -> Result> { + context + .sql + .query_get_value( + "SELECT id + FROM msgs + WHERE chat_id=?2 + AND (hidden=0 OR state=?1) + ORDER BY timestamp DESC, id DESC LIMIT 1", + (MessageState::OutDraft, chat_id), + ) + .await +} + #[cfg(test)] mod tests { use super::*; From bf958ce6c1f9869eb5438a13af2472440164cb99 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sat, 7 Jan 2023 22:36:47 +0100 Subject: [PATCH 038/528] More context for chat and chatlist errors (#3932) --- deltachat-jsonrpc/src/api/types/chat.rs | 9 ++++++--- deltachat-jsonrpc/src/api/types/chat_list.rs | 11 +++++++---- src/chatlist.rs | 8 ++++++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index f5a5c3bcd..277817b8f 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -1,6 +1,6 @@ use std::time::{Duration, SystemTime}; -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, bail, Context as _, Result}; use deltachat::chat::{self, get_chat_contacts, ChatVisibility}; use deltachat::chat::{Chat, ChatId}; use deltachat::constants::Chattype; @@ -53,7 +53,9 @@ impl FullChat { contacts.push( ContactObject::try_from_dc_contact( context, - Contact::load_from_db(context, *contact_id).await?, + Contact::load_from_db(context, *contact_id) + .await + .context("failed to load contact")?, ) .await?, ) @@ -73,7 +75,8 @@ impl FullChat { let was_seen_recently = if chat.get_type() == Chattype::Single { match contact_ids.get(0) { Some(contact) => Contact::load_from_db(context, *contact) - .await? + .await + .context("failed to load contact for was_seen_recently")? .was_seen_recently(), None => false, } diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index c98b6d932..f9fb5ae8d 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use deltachat::chat::{Chat, ChatId}; use deltachat::chatlist::get_last_message_for_chat; use deltachat::constants::*; @@ -64,8 +64,10 @@ pub(crate) async fn get_chat_list_item_by_id( let last_msgid = get_last_message_for_chat(ctx, chat_id).await?; - let chat = Chat::load_from_db(ctx, chat_id).await?; - let summary = Chatlist::get_summary2(ctx, chat_id, last_msgid, Some(&chat)).await?; + let chat = Chat::load_from_db(ctx, chat_id).await.context("chat")?; + let summary = Chatlist::get_summary2(ctx, chat_id, last_msgid, Some(&chat)) + .await + .context("summary")?; let summary_text1 = summary.prefix.map_or_else(String::new, |s| s.to_string()); let summary_text2 = summary.text.to_owned(); @@ -93,7 +95,8 @@ pub(crate) async fn get_chat_list_item_by_id( let contact = chat_contacts.get(0); let was_seen_recently = match contact { Some(contact) => Contact::load_from_db(ctx, *contact) - .await? + .await + .context("contact")? .was_seen_recently(), None => false, }; diff --git a/src/chatlist.rs b/src/chatlist.rs index 718918807..1f515f3a2 100644 --- a/src/chatlist.rs +++ b/src/chatlist.rs @@ -311,13 +311,17 @@ impl Chatlist { }; let (lastmsg, lastcontact) = if let Some(lastmsg_id) = lastmsg_id { - let lastmsg = Message::load_from_db(context, lastmsg_id).await?; + let lastmsg = Message::load_from_db(context, lastmsg_id) + .await + .context("loading message failed")?; if lastmsg.from_id == ContactId::SELF { (Some(lastmsg), None) } else { match chat.typ { Chattype::Group | Chattype::Broadcast | Chattype::Mailinglist => { - let lastcontact = Contact::load_from_db(context, lastmsg.from_id).await?; + let lastcontact = Contact::load_from_db(context, lastmsg.from_id) + .await + .context("loading contact failed")?; (Some(lastmsg), Some(lastcontact)) } Chattype::Single | Chattype::Undefined => (Some(lastmsg), None), From 432046225a6338b2b2257a857faa259beb05f129 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 27 Apr 2023 10:27:29 +0000 Subject: [PATCH 039/528] Fix 1.114.0 link in the changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b074c36bb..256b2509b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2439,4 +2439,4 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 [1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.113.0 -[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 +[1.114.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 From eb28899cd056fbac0b4987b9eb44661ae1de80ca Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 27 Apr 2023 10:28:38 +0000 Subject: [PATCH 040/528] Add 1.112.8 link to the changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 256b2509b..359ab0d20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2438,5 +2438,6 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.5]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.4...v1.112.5 [1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 -[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.113.0 +[1.112.8]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.112.8 +[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.8...v1.113.0 [1.114.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 From 158541f05ce320ef944c261c4cb803d5ec265522 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 29 Apr 2023 13:53:57 +0000 Subject: [PATCH 041/528] Document deltachat_rpc_client installation --- deltachat-rpc-client/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/deltachat-rpc-client/README.md b/deltachat-rpc-client/README.md index 4ce7aa7c4..d799a5ef2 100644 --- a/deltachat-rpc-client/README.md +++ b/deltachat-rpc-client/README.md @@ -5,9 +5,23 @@ and provides asynchronous interface to it. ## Getting started -To use Delta Chat RPC client, first build a `deltachat-rpc-server` with `cargo build -p deltachat-rpc-server`. +To use Delta Chat RPC client, first build a `deltachat-rpc-server` with `cargo build -p deltachat-rpc-server` +or download a prebuilt release. Install it anywhere in your `PATH`. +[Create a virtual environment](https://docs.python.org/3/library/venv.html) +if you don't have one already and activate it. +``` +$ python -m venv env +$ . env/bin/activate +``` + +Install `deltachat-rpc-client` from source: +``` +$ cd deltachat-rpc-client +$ pip install . +``` + ## Testing 1. Build `deltachat-rpc-server` with `cargo build -p deltachat-rpc-server`. From 1687794b81d2baff22010e32d32eecdc10b6a0ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:57:42 +0000 Subject: [PATCH 042/528] cargo: bump uuid from 1.3.0 to 1.3.2 Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.3.0 to 1.3.2. - [Release notes](https://github.com/uuid-rs/uuid/releases) - [Commits](https://github.com/uuid-rs/uuid/compare/1.3.0...1.3.2) --- updated-dependencies: - dependency-name: uuid dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e3ed733..40b579ff8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5275,9 +5275,9 @@ checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" [[package]] name = "uuid" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" dependencies = [ "getrandom 0.2.8", "serde", From 7710467571618fa27210354951faf64855549069 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:59:05 +0000 Subject: [PATCH 043/528] cargo: bump libc from 0.2.140 to 0.2.142 Bumps [libc](https://github.com/rust-lang/libc) from 0.2.140 to 0.2.142. - [Release notes](https://github.com/rust-lang/libc/releases) - [Commits](https://github.com/rust-lang/libc/compare/0.2.140...0.2.142) --- updated-dependencies: - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e3ed733..464a2b227 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2660,9 +2660,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "libm" From 4b0a30eb666efc39de7a9a67736882b8d001f303 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 22:00:52 +0000 Subject: [PATCH 044/528] cargo: bump reqwest from 0.11.16 to 0.11.17 Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.16 to 0.11.17. - [Release notes](https://github.com/seanmonstar/reqwest/releases) - [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md) - [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.16...v0.11.17) --- updated-dependencies: - dependency-name: reqwest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e3ed733..cdb40b9e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3900,9 +3900,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" dependencies = [ "base64 0.21.0", "bytes", diff --git a/Cargo.toml b/Cargo.toml index de429e590..6c9a90051 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,7 @@ qrcodegen = "1.7.0" quick-xml = "0.28" rand = "0.8" regex = "1.7" -reqwest = { version = "0.11.16", features = ["json"] } +reqwest = { version = "0.11.17", features = ["json"] } rusqlite = { version = "0.29", features = ["sqlcipher"] } rust-hsluv = "0.1" sanitize-filename = "0.4" From f5de3be97759989427d32cd5da0abab5f56c8236 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 22:02:36 +0000 Subject: [PATCH 045/528] cargo: bump tokio-stream from 0.1.12 to 0.1.14 Bumps [tokio-stream](https://github.com/tokio-rs/tokio) from 0.1.12 to 0.1.14. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Changelog](https://github.com/tokio-rs/tokio/blob/tokio-0.1.14/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-stream-0.1.12...tokio-0.1.14) --- updated-dependencies: - dependency-name: tokio-stream dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e3ed733..a7d0a15f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4895,9 +4895,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", diff --git a/Cargo.toml b/Cargo.toml index de429e590..62d6d7c6b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ textwrap = "0.16.0" thiserror = "1" tokio = { version = "1", features = ["fs", "rt-multi-thread", "macros"] } tokio-io-timeout = "1.2.0" -tokio-stream = { version = "0.1.11", features = ["fs"] } +tokio-stream = { version = "0.1.14", features = ["fs"] } tokio-tar = { version = "0.3" } # TODO: integrate tokio into async-tar tokio-util = "0.7.7" toml = "0.7" From 0e1faed6e5b2236e152b2f0291098be6a0f2b3a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 22:03:16 +0000 Subject: [PATCH 046/528] cargo: bump futures-lite from 1.12.0 to 1.13.0 Bumps [futures-lite](https://github.com/smol-rs/futures-lite) from 1.12.0 to 1.13.0. - [Release notes](https://github.com/smol-rs/futures-lite/releases) - [Changelog](https://github.com/smol-rs/futures-lite/blob/master/CHANGELOG.md) - [Commits](https://github.com/smol-rs/futures-lite/compare/v1.12.0...v1.13.0) --- updated-dependencies: - dependency-name: futures-lite dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e3ed733..5d1bd0b80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2036,9 +2036,9 @@ checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ "fastrand", "futures-core", diff --git a/Cargo.toml b/Cargo.toml index de429e590..7e11a8d31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ encoded-words = { git = "https://github.com/async-email/encoded-words", branch = escaper = "0.1" fast-socks5 = "0.8" futures = "0.3" -futures-lite = "1.12.0" +futures-lite = "1.13.0" hex = "0.4.0" humansize = "2" image = { version = "0.24.6", default-features=false, features = ["gif", "jpeg", "ico", "png", "pnm", "webp", "bmp"] } @@ -97,7 +97,7 @@ uuid = { version = "1", features = ["serde", "v4"] } [dev-dependencies] ansi_term = "0.12.0" criterion = { version = "0.4.0", features = ["async_tokio"] } -futures-lite = "1.12" +futures-lite = "1.13" log = "0.4" pretty_env_logger = "0.4" proptest = { version = "1", default-features = false, features = ["std"] } diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index f7fd73fbd..2de3c55c0 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -15,7 +15,7 @@ deltachat = { path = "..", default-features = false } anyhow = "1" env_logger = { version = "0.10.0" } -futures-lite = "1.12.0" +futures-lite = "1.13.0" log = "0.4" serde_json = "1.0.95" serde = { version = "1.0", features = ["derive"] } From 64b25d9ec0fd0657a2afd2717805e59f5a58055b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 01:54:04 +0000 Subject: [PATCH 047/528] cargo: bump serde_json from 1.0.95 to 1.0.96 Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.95 to 1.0.96. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.95...v1.0.96) --- updated-dependencies: - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a420c9bc..dca1cc9d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4318,9 +4318,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 2b6c6bedc..d924343b2 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -20,7 +20,7 @@ tempfile = "3.3.0" log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } -serde_json = "1.0.95" +serde_json = "1.0.96" yerpc = { version = "0.4.3", features = ["anyhow_expose"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } tokio = { version = "1.27.0" } diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 2de3c55c0..9676c0da5 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -17,7 +17,7 @@ anyhow = "1" env_logger = { version = "0.10.0" } futures-lite = "1.13.0" log = "0.4" -serde_json = "1.0.95" +serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.27.0", features = ["io-std"] } tokio-util = "0.7.7" From 542ec4cac418ba27b1decc682bcc8aaa56c11b3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 01:54:07 +0000 Subject: [PATCH 048/528] cargo: bump anyhow from 1.0.70 to 1.0.71 Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.70 to 1.0.71. - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.70...1.0.71) --- updated-dependencies: - dependency-name: anyhow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a420c9bc..5dc44afc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,9 +114,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" dependencies = [ "backtrace", ] From 7e51b9686fee34f1f44ab4211163107ea8dd7797 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 01:54:26 +0000 Subject: [PATCH 049/528] cargo: bump quick-xml from 0.28.1 to 0.28.2 Bumps [quick-xml](https://github.com/tafia/quick-xml) from 0.28.1 to 0.28.2. - [Release notes](https://github.com/tafia/quick-xml/releases) - [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md) - [Commits](https://github.com/tafia/quick-xml/compare/v0.28.1...v0.28.2) --- updated-dependencies: - dependency-name: quick-xml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a420c9bc..a2ae9885d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3645,9 +3645,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.28.1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" dependencies = [ "memchr", ] From a3240452ffde2315eb6cebb75ed0948a795be34e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 10:54:42 +0000 Subject: [PATCH 050/528] cargo: bump tokio-util from 0.7.7 to 0.7.8 Bumps [tokio-util](https://github.com/tokio-rs/tokio) from 0.7.7 to 0.7.8. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-util-0.7.7...tokio-util-0.7.8) --- updated-dependencies: - dependency-name: tokio-util dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58b19c196..8ecfb20e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4933,9 +4933,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", diff --git a/Cargo.toml b/Cargo.toml index edafece85..0cb1f09b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -88,7 +88,7 @@ tokio = { version = "1", features = ["fs", "rt-multi-thread", "macros"] } tokio-io-timeout = "1.2.0" tokio-stream = { version = "0.1.14", features = ["fs"] } tokio-tar = { version = "0.3" } # TODO: integrate tokio into async-tar -tokio-util = "0.7.7" +tokio-util = "0.7.8" toml = "0.7" trust-dns-resolver = "0.22" url = "2" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 9676c0da5..14c901dbc 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.27.0", features = ["io-std"] } -tokio-util = "0.7.7" +tokio-util = "0.7.8" yerpc = { version = "0.4.0", features = ["anyhow_expose"] } [features] From 134c9ada6824a15e4b0a2b8d9da87cacdfa483d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 10:54:57 +0000 Subject: [PATCH 051/528] cargo: bump syn from 2.0.13 to 2.0.15 Bumps [syn](https://github.com/dtolnay/syn) from 2.0.13 to 2.0.15. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.13...2.0.15) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58b19c196..16c0ef51e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -270,7 +270,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] @@ -1277,7 +1277,7 @@ name = "deltachat_derive" version = "2.0.0" dependencies = [ "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] @@ -2057,7 +2057,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] @@ -4313,7 +4313,7 @@ checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] @@ -4620,9 +4620,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.13" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -4752,7 +4752,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] @@ -4865,7 +4865,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.15", ] [[package]] From fe9534ed7d5190ffc3ffbd760720b4c81a891d19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 10:55:01 +0000 Subject: [PATCH 052/528] cargo: bump serde from 1.0.159 to 1.0.160 Bumps [serde](https://github.com/serde-rs/serde) from 1.0.159 to 1.0.160. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.159...v1.0.160) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58b19c196..c287f1681 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4280,9 +4280,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] @@ -4307,9 +4307,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", From 6a00338f79020b9ab4f6985c459008c584f4eb13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 10:48:24 +0000 Subject: [PATCH 053/528] cargo: bump tokio from 1.27.0 to 1.28.0 Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.27.0 to 1.28.0. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.27.0...tokio-1.28.0) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 86 +++++++++++++++++++++++++++++---- deltachat-jsonrpc/Cargo.toml | 4 +- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 79 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd66e2a48..b8653a65f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4830,9 +4830,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" dependencies = [ "autocfg", "bytes", @@ -4844,7 +4844,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -4859,9 +4859,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", @@ -5503,12 +5503,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] @@ -5518,7 +5518,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -5527,21 +5536,42 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.32.0" @@ -5554,6 +5584,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.32.0" @@ -5566,6 +5602,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.32.0" @@ -5578,6 +5620,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.32.0" @@ -5590,12 +5638,24 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.32.0" @@ -5608,6 +5668,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "winnow" version = "0.4.1" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index d924343b2..b8454ee91 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -23,7 +23,7 @@ futures = { version = "0.3.28" } serde_json = "1.0.96" yerpc = { version = "0.4.3", features = ["anyhow_expose"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } -tokio = { version = "1.27.0" } +tokio = { version = "1.28.0" } sanitize-filename = "0.4" walkdir = "2.3.3" base64 = "0.21" @@ -33,7 +33,7 @@ axum = { version = "0.6.12", optional = true, features = ["ws"] } env_logger = { version = "0.10.0", optional = true } [dev-dependencies] -tokio = { version = "1.27.0", features = ["full", "rt-multi-thread"] } +tokio = { version = "1.28.0", features = ["full", "rt-multi-thread"] } [features] diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 14c901dbc..08140ee1b 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -19,7 +19,7 @@ futures-lite = "1.13.0" log = "0.4" serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.27.0", features = ["io-std"] } +tokio = { version = "1.28.0", features = ["io-std"] } tokio-util = "0.7.8" yerpc = { version = "0.4.0", features = ["anyhow_expose"] } From f57be7187ed848b6e45109d694ac082704033f23 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 5 May 2023 13:23:44 +0000 Subject: [PATCH 054/528] Update deny.toml --- deny.toml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/deny.toml b/deny.toml index e2f70f17d..4464a2894 100644 --- a/deny.toml +++ b/deny.toml @@ -49,12 +49,15 @@ skip = [ { name = "syn", version = "1.0.109" }, { name = "time", version = "<0.3" }, { name = "wasi", version = "<0.11" }, - { name = "windows_aarch64_msvc", version = "<0.42" }, - { name = "windows_i686_gnu", version = "<0.42" }, - { name = "windows_i686_msvc", version = "<0.42" }, - { name = "windows-sys", version = "<0.45" }, - { name = "windows_x86_64_gnu", version = "<0.42" }, - { name = "windows_x86_64_msvc", version = "<0.42" }, + { name = "windows_aarch64_gnullvm", version = "<0.48" }, + { name = "windows_aarch64_msvc", version = "<0.48" }, + { name = "windows_i686_gnu", version = "<0.48" }, + { name = "windows_i686_msvc", version = "<0.48" }, + { name = "windows-sys", version = "<0.48" }, + { name = "windows-targets", version = "<0.48" }, + { name = "windows_x86_64_gnullvm", version = "<0.48" }, + { name = "windows_x86_64_gnu", version = "<0.48" }, + { name = "windows_x86_64_msvc", version = "<0.48" }, ] From ba36d09c700bd967c246b1a5720b2a1d0d31e9b4 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 5 May 2023 12:49:23 +0000 Subject: [PATCH 055/528] Make the bots automatically accept group chat contact requests --- CHANGELOG.md | 2 ++ src/receive_imf.rs | 8 +++++++- src/receive_imf/tests.rs | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 359ab0d20..d7464eacc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - BREAKING: jsonrpc: - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` +### Fixes +- Make the bots automatically accept group chat contact requests. #4377 ## [1.114.0] - 2023-04-24 diff --git a/src/receive_imf.rs b/src/receive_imf.rs index b321c2f67..812327b18 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -557,7 +557,13 @@ async fn add_parts( blocked: Blocked::Request, }) if is_bot => Blocked::Not, Some(ChatIdBlocked { id: _, blocked }) => blocked, - None => Blocked::Request, + None => { + if is_bot { + Blocked::Not + } else { + Blocked::Request + } + } }; if chat_id.is_none() { diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index 44d3b8d9d..1fda38221 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -2980,6 +2980,17 @@ async fn test_auto_accept_for_bots() -> Result<()> { Ok(()) } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_auto_accept_group_for_bots() -> Result<()> { + let t = TestContext::new_alice().await; + t.set_config(Config::Bot, Some("1")).await.unwrap(); + receive_imf(&t, GRP_MAIL, false).await?; + let msg = t.get_last_msg().await; + let chat = chat::Chat::load_from_db(&t, msg.chat_id).await?; + assert!(!chat.is_contact_request()); + Ok(()) +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_no_private_reply_to_blocked_account() -> Result<()> { let mut tcm = TestContextManager::new(); From 625ecaa9b5f150d93fa008ed2ff704f314e7865d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 20:31:03 +0000 Subject: [PATCH 056/528] cargo: bump axum from 0.6.12 to 0.6.18 Bumps [axum](https://github.com/tokio-rs/axum) from 0.6.12 to 0.6.18. - [Release notes](https://github.com/tokio-rs/axum/releases) - [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/axum/compare/axum-v0.6.12...axum-v0.6.18) --- updated-dependencies: - dependency-name: axum dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- deltachat-jsonrpc/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8653a65f..69dfd12e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -306,9 +306,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.12" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f8ccfd9221ee7d1f3d4b33e1f8319b3a81ed8f61f2ea40b37b859794b4491" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" dependencies = [ "async-trait", "axum-core", @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f958c80c248b34b9a877a643811be8dbca03ca5ba827f2b63baf3a81e5fc4e" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", "bytes", diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index b8454ee91..b7bc8f055 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -29,7 +29,7 @@ walkdir = "2.3.3" base64 = "0.21" # optional dependencies -axum = { version = "0.6.12", optional = true, features = ["ws"] } +axum = { version = "0.6.18", optional = true, features = ["ws"] } env_logger = { version = "0.10.0", optional = true } [dev-dependencies] From 6af631e8df104f37f1c4be9ce169e7f99bdc066e Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 5 May 2023 17:17:56 +0000 Subject: [PATCH 057/528] Add JSON-RPC API to get reactions --- CHANGELOG.md | 1 + deltachat-jsonrpc/src/api/mod.rs | 18 +++++++++++++++++- .../src/deltachat_rpc_client/message.py | 9 ++++++++- deltachat-rpc-client/tests/test_something.py | 4 ++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7464eacc..957ff1f93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - BREAKING: jsonrpc: - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` +- JSON-RPC: add API to get reactions outside the message snapshot ### Fixes - Make the bots automatically accept group chat contact requests. #4377 diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 98942a855..6f7c1353a 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -24,7 +24,7 @@ use deltachat::{ provider::get_provider_info, qr, qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg}, - reaction::send_reaction, + reaction::{get_msg_reactions, send_reaction}, securejoin, stock_str::StockMessage, webxdc::StatusUpdateSerial, @@ -46,6 +46,7 @@ use types::http::HttpResponse; use types::message::MessageData; use types::message::MessageObject; use types::provider_info::ProviderInfo; +use types::reactions::JSONRPCReactions; use types::webxdc::WebxdcMessageInfo; use self::events::Event; @@ -1721,6 +1722,21 @@ impl CommandApi { Ok(message_id.to_u32()) } + /// Returns reactions to the message. + async fn get_message_reactions( + &self, + account_id: u32, + message_id: u32, + ) -> Result> { + let ctx = self.get_context(account_id).await?; + let reactions = get_msg_reactions(&ctx, MsgId::new(message_id)).await?; + if reactions.is_empty() { + Ok(None) + } else { + Ok(Some(reactions.into())) + } + } + async fn send_msg(&self, account_id: u32, chat_id: u32, data: MessageData) -> Result { let ctx = self.get_context(account_id).await?; let mut message = Message::new(if let Some(viewtype) = data.viewtype { diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/message.py b/deltachat-rpc-client/src/deltachat_rpc_client/message.py index 5ec30961a..38a0b11f7 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/message.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/message.py @@ -1,6 +1,6 @@ import json from dataclasses import dataclass -from typing import TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Optional, Union from ._utils import AttrDict from .contact import Contact @@ -35,6 +35,13 @@ class Message: snapshot["message"] = self return snapshot + async def get_reactions(self) -> Optional[AttrDict]: + """Get message reactions.""" + reactions = await self._rpc.get_message_reactions(self.account.id, self.id) + if reactions: + return AttrDict(reactions) + return None + async def mark_seen(self) -> None: """Mark the message as seen.""" await self._rpc.markseen_msgs(self.account.id, [self.id]) diff --git a/deltachat-rpc-client/tests/test_something.py b/deltachat-rpc-client/tests/test_something.py index d17c28a16..20f7acaae 100644 --- a/deltachat-rpc-client/tests/test_something.py +++ b/deltachat-rpc-client/tests/test_something.py @@ -239,6 +239,10 @@ async def test_message(acfactory) -> None: await message.mark_seen() await message.send_reaction("😎") + reactions = await message.get_reactions() + assert reactions + snapshot = await message.get_snapshot() + assert reactions == snapshot.reactions @pytest.mark.asyncio() From 7918a6801e1db28d9211d88dda14976351c51785 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 5 May 2023 10:51:04 +0000 Subject: [PATCH 058/528] scripts/deny.sh: update package cache before running `cargo deny` --- scripts/deny.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/deny.sh b/scripts/deny.sh index 1b6c9ac0b..05c508b23 100755 --- a/scripts/deny.sh +++ b/scripts/deny.sh @@ -1,2 +1,6 @@ #!/bin/sh + +# Update package cache without changing the lockfile. +cargo update --dry-run + cargo deny --workspace --all-features check -D warnings From ce0e5416e64c4a4dc27be3af1da2d5ba8f6f7146 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 21:24:47 +0000 Subject: [PATCH 059/528] cargo: bump human-panic from 1.1.3 to 1.1.4 Bumps [human-panic](https://github.com/rust-cli/human-panic) from 1.1.3 to 1.1.4. - [Release notes](https://github.com/rust-cli/human-panic/releases) - [Changelog](https://github.com/rust-cli/human-panic/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-cli/human-panic/compare/v1.1.3...v1.1.4) --- updated-dependencies: - dependency-name: human-panic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8653a65f..bbfff6cb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2307,9 +2307,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "human-panic" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6557b29bbdc9d6c7a5cdbe2962e78eaf48115e8d55b0b62282956981c1f605" +checksum = "c16465f6227e18e5a64eba488245d7b2974d4db0c4404ca5a69b550defa18d0a" dependencies = [ "backtrace", "os_info", From afba63603e962ff2995a5139ae32043b3da23b01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 May 2023 11:36:44 +0000 Subject: [PATCH 060/528] cargo: bump dirs from 5.0.0 to 5.0.1 Bumps [dirs](https://github.com/soc/dirs-rs) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/soc/dirs-rs/releases) - [Commits](https://github.com/soc/dirs-rs/commits) --- updated-dependencies: - dependency-name: dirs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 021fa2f24..a90ad7245 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1422,9 +1422,9 @@ dependencies = [ [[package]] name = "dirs" -version = "5.0.0" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dece029acd3353e3a58ac2e3eb3c8d6c35827a892edc6cc4138ef9c33df46ecd" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ "dirs-sys", ] @@ -1441,13 +1441,14 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", + "option-ext", "redox_users", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -3153,6 +3154,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "os_info" version = "3.6.0" From 3efbe5b1ef5a7afe9ba66fc41042d9afe22883a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 May 2023 13:31:29 +0000 Subject: [PATCH 061/528] cargo: bump regex from 1.7.3 to 1.8.1 (#4361) --- Cargo.lock | 20 +++++++++++++------- Cargo.toml | 2 +- deny.toml | 1 + 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a90ad7245..da259390c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -60,9 +60,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -3610,7 +3610,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax", + "regex-syntax 0.6.29", "unarray", ] @@ -3881,13 +3881,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.3" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.1", ] [[package]] @@ -3896,7 +3896,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.29", ] [[package]] @@ -3905,6 +3905,12 @@ version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + [[package]] name = "reqwest" version = "0.11.17" diff --git a/Cargo.toml b/Cargo.toml index 0cb1f09b2..ac2bf9246 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,7 +69,7 @@ pretty_env_logger = { version = "0.4", optional = true } qrcodegen = "1.7.0" quick-xml = "0.28" rand = "0.8" -regex = "1.7" +regex = "1.8" reqwest = { version = "0.11.17", features = ["json"] } rusqlite = { version = "0.29", features = ["sqlcipher"] } rust-hsluv = "0.1" diff --git a/deny.toml b/deny.toml index 4464a2894..91a21cf19 100644 --- a/deny.toml +++ b/deny.toml @@ -41,6 +41,7 @@ skip = [ { name = "rand_core", version = "<0.6" }, { name = "rand", version = "<0.8" }, { name = "redox_syscall", version = "0.2.16" }, + { name = "regex-syntax", version = "0.6.29" }, { name = "sec1", version = "0.3.0" }, { name = "sha2", version = "<0.10" }, { name = "signature", version = "1.6.4" }, From 5c3df7e4524bbadb2aa8abf24c92521d255d32ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Mon, 8 May 2023 12:49:19 +0200 Subject: [PATCH 062/528] jsonrpc: use camel-case for Event struct and move events.rs to types folder (#4372) * use camel-case for Event struct and move events.rs to types folder --------- Co-authored-by: link2xt --- deltachat-jsonrpc/src/api/mod.rs | 3 +-- deltachat-jsonrpc/src/api/{ => types}/events.rs | 1 + deltachat-jsonrpc/src/api/types/mod.rs | 1 + deltachat-jsonrpc/src/lib.rs | 1 - deltachat-jsonrpc/typescript/src/client.ts | 10 +++++----- deltachat-rpc-client/src/deltachat_rpc_client/rpc.py | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename deltachat-jsonrpc/src/api/{ => types}/events.rs (99%) diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 6f7c1353a..825925378 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -35,13 +35,13 @@ use tokio::sync::{watch, Mutex, RwLock}; use walkdir::WalkDir; use yerpc::rpc; -pub mod events; pub mod types; use num_traits::FromPrimitive; use types::account::Account; use types::chat::FullChat; use types::contact::ContactObject; +use types::events::Event; use types::http::HttpResponse; use types::message::MessageData; use types::message::MessageObject; @@ -49,7 +49,6 @@ use types::provider_info::ProviderInfo; use types::reactions::JSONRPCReactions; use types::webxdc::WebxdcMessageInfo; -use self::events::Event; use self::types::message::MessageLoadResult; use self::types::{ chat::{BasicChat, JSONRPCChatVisibility, MuteDuration}, diff --git a/deltachat-jsonrpc/src/api/events.rs b/deltachat-jsonrpc/src/api/types/events.rs similarity index 99% rename from deltachat-jsonrpc/src/api/events.rs rename to deltachat-jsonrpc/src/api/types/events.rs index 9c36e5b53..37e8c6317 100644 --- a/deltachat-jsonrpc/src/api/events.rs +++ b/deltachat-jsonrpc/src/api/types/events.rs @@ -3,6 +3,7 @@ use serde::Serialize; use typescript_type_def::TypeDef; #[derive(Serialize, TypeDef)] +#[serde(rename_all = "camelCase")] pub struct Event { /// Event payload. event: EventType, diff --git a/deltachat-jsonrpc/src/api/types/mod.rs b/deltachat-jsonrpc/src/api/types/mod.rs index ace49f14e..8143be73d 100644 --- a/deltachat-jsonrpc/src/api/types/mod.rs +++ b/deltachat-jsonrpc/src/api/types/mod.rs @@ -2,6 +2,7 @@ pub mod account; pub mod chat; pub mod chat_list; pub mod contact; +pub mod events; pub mod http; pub mod location; pub mod message; diff --git a/deltachat-jsonrpc/src/lib.rs b/deltachat-jsonrpc/src/lib.rs index bb4ea9cf6..16592bd88 100644 --- a/deltachat-jsonrpc/src/lib.rs +++ b/deltachat-jsonrpc/src/lib.rs @@ -1,5 +1,4 @@ pub mod api; -pub use api::events; pub use yerpc; #[cfg(test)] diff --git a/deltachat-jsonrpc/typescript/src/client.ts b/deltachat-jsonrpc/typescript/src/client.ts index 97c4a8364..d2065cba3 100644 --- a/deltachat-jsonrpc/typescript/src/client.ts +++ b/deltachat-jsonrpc/typescript/src/client.ts @@ -50,16 +50,16 @@ export class BaseDeltaChat< async eventLoop(): Promise { while (true) { const event = await this.rpc.getNextEvent(); - this.emit(event.event.type, event.context_id, event.event as any); - this.emit("ALL", event.context_id, event.event as any); + this.emit(event.event.type, event.contextId, event.event as any); + this.emit("ALL", event.contextId, event.event as any); - if (this.contextEmitters[event.context_id]) { - this.contextEmitters[event.context_id].emit( + if (this.contextEmitters[event.contextId]) { + this.contextEmitters[event.contextId].emit( event.event.type, //@ts-ignore event.event as any ); - this.contextEmitters[event.context_id].emit("ALL", event.event as any); + this.contextEmitters[event.contextId].emit("ALL", event.event as any); } } } diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py index 57e26dd0b..72642625f 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py @@ -79,7 +79,7 @@ class Rpc: if self.closing: return event = await self.get_next_event() - account_id = event["context_id"] + account_id = event["contextId"] queue = await self.get_queue(account_id) await queue.put(event["event"]) From 0d30e66dda5632c3e1ed30891b31adc47a3e5e1a Mon Sep 17 00:00:00 2001 From: meganoahj Date: Mon, 8 May 2023 19:44:43 +0200 Subject: [PATCH 063/528] add thumbnail for image in chatlist item (#4311) * add thumbnail for image in chatlist item * added preview for stickers and gifs also * added last_message_type and last_message_id to ChatListItemFetchResult addresses link2ext comment * code optimization fixes: https://github.com/deltachat/deltachat-core-rust/pull/4311#discussion_r1162791672 * code formatting * fix clippy * add changelog entry --------- Co-authored-by: meganoahj Co-authored-by: Simon Laux --- CHANGELOG.md | 3 +++ deltachat-jsonrpc/src/api/types/chat_list.rs | 19 ++++++++++++++++--- src/summary.rs | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 957ff1f93..66f8ef02c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +### Added +- jsonrpc: `ChatListItemFetchResult` gets new properties: `summary_preview_image`, `last_message_type` and `last_message_id` + ### Changes - BREAKING: jsonrpc: - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index f9fb5ae8d..5c63b5def 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -12,6 +12,7 @@ use serde::Serialize; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; +use super::message::MessageViewtype; #[derive(Serialize, TypeDef)] #[serde(tag = "type")] @@ -26,6 +27,8 @@ pub enum ChatListItemFetchResult { summary_text1: String, summary_text2: String, summary_status: u32, + /// showing preview if last chat message is image + summary_preview_image: Option, is_protected: bool, is_group: bool, fresh_message_counter: usize, @@ -42,6 +45,8 @@ pub enum ChatListItemFetchResult { /// contact id if this is a dm chat (for view profile entry in context menu) dm_chat_contact: Option, was_seen_recently: bool, + last_message_type: Option, + last_message_id: Option, }, #[serde(rename_all = "camelCase")] ArchiveLink { fresh_message_counter: usize }, @@ -72,6 +77,8 @@ pub(crate) async fn get_chat_list_item_by_id( let summary_text1 = summary.prefix.map_or_else(String::new, |s| s.to_string()); let summary_text2 = summary.text.to_owned(); + let summary_preview_image = summary.thumbnail_path; + let visibility = chat.get_visibility(); let avatar_path = chat @@ -79,12 +86,15 @@ pub(crate) async fn get_chat_list_item_by_id( .await? .map(|path| path.to_str().unwrap_or("invalid/path").to_owned()); - let last_updated = match last_msgid { + let (last_updated, message_type) = match last_msgid { Some(id) => { let last_message = deltachat::message::Message::load_from_db(ctx, id).await?; - Some(last_message.get_timestamp() * 1000) + ( + Some(last_message.get_timestamp() * 1000), + Some(last_message.get_viewtype().into()), + ) } - None => None, + None => (None, None), }; let chat_contacts = get_chat_contacts(ctx, chat_id).await?; @@ -119,6 +129,7 @@ pub(crate) async fn get_chat_list_item_by_id( summary_text1, summary_text2, summary_status: summary.state.to_u32().expect("impossible"), // idea and a function to transform the constant to strings? or return string enum + summary_preview_image, is_protected: chat.is_protected(), is_group: chat.get_type() == Chattype::Group, fresh_message_counter, @@ -133,5 +144,7 @@ pub(crate) async fn get_chat_list_item_by_id( is_broadcast: chat.get_type() == Chattype::Broadcast, dm_chat_contact, was_seen_recently, + last_message_type: message_type, + last_message_id: last_msgid.map(|id| id.to_u32()), }) } diff --git a/src/summary.rs b/src/summary.rs index 8a22b4b54..d27bf9aa0 100644 --- a/src/summary.rs +++ b/src/summary.rs @@ -50,6 +50,9 @@ pub struct Summary { /// Message state. pub state: MessageState, + + /// Message preview image path + pub thumbnail_path: Option, } impl Summary { @@ -90,11 +93,22 @@ impl Summary { text = stock_str::reply_noun(context).await } + let thumbnail_path = if msg.viewtype == Viewtype::Image + || msg.viewtype == Viewtype::Gif + || msg.viewtype == Viewtype::Sticker + { + msg.get_file(context) + .and_then(|path| path.to_str().map(|p| p.to_owned())) + } else { + None + }; + Self { prefix, text, timestamp: msg.get_timestamp(), state: msg.state, + thumbnail_path, } } From e50d7724e3cbec91d318b49948587db33c2c467e Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 6 May 2023 18:56:36 +0000 Subject: [PATCH 064/528] feat: build deltachat-rpc-server releases for x86_64 macOS --- .github/workflows/deltachat-rpc-server.yml | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index bba139e30..9d3ae523a 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -84,9 +84,28 @@ jobs: path: target/${{ matrix.target}}/release/${{ matrix.path }} if-no-files-found: error + build_macos: + name: Build deltachat-rpc-server for macOS + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup rust target + run: rustup target add x86_64-apple-darwin + + - name: Build + run: cargo build --release --package deltachat-rpc-server --target x86_64-apple-darwin --features vendored + + - name: Upload binary + uses: actions/upload-artifact@v3 + with: + name: deltachat-rpc-server-x86_64-macos + path: target/x86_64-apple-darwin/release/deltachat-rpc-server + if-no-files-found: error + publish: name: Upload binaries to the release - needs: ["build_linux", "build_windows"] + needs: ["build_linux", "build_windows", "build_macos"] permissions: contents: write runs-on: "ubuntu-latest" @@ -97,7 +116,7 @@ jobs: - name: Compose dist/ directory run: | mkdir dist - for x in x86_64 i686 aarch64 armv7 win32.exe win64.exe; do + for x in x86_64 i686 aarch64 armv7 win32.exe win64.exe x86_64-macos; do mv "deltachat-rpc-server-$x"/* "dist/deltachat-rpc-server-$x" done From a0c51b3c3ad549a8ec531533056630e1ddd44ca9 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 9 May 2023 11:57:49 +0200 Subject: [PATCH 065/528] fix: jsonrpc: typescript client: fix types of events in event emitter (#4373) * fix: jsonrpc: typescript client: fix types of events in event emitter * add ts ignore to remove ts error (when building in ts5) doing the types right via casting is to complicated IMO and has no real benefit here. --- CHANGELOG.md | 3 ++ deltachat-jsonrpc/typescript/src/client.ts | 34 ++++++++++------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66f8ef02c..e4980a1f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,13 @@ - BREAKING: jsonrpc: - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` + - `Event`: `context_id` property is now called `contextId` - JSON-RPC: add API to get reactions outside the message snapshot ### Fixes - Make the bots automatically accept group chat contact requests. #4377 +### Fixes +- jsonrpc: typescript client: fix types of events in event emitter ## [1.114.0] - 2023-04-24 diff --git a/deltachat-jsonrpc/typescript/src/client.ts b/deltachat-jsonrpc/typescript/src/client.ts index d2065cba3..1a51b5e04 100644 --- a/deltachat-jsonrpc/typescript/src/client.ts +++ b/deltachat-jsonrpc/typescript/src/client.ts @@ -1,33 +1,28 @@ import * as T from "../generated/types.js"; +import { EventType } from "../generated/types.js"; import * as RPC from "../generated/jsonrpc.js"; import { RawClient } from "../generated/client.js"; import { WebsocketTransport, BaseTransport, Request } from "yerpc"; import { TinyEmitter } from "@deltachat/tiny-emitter"; -type DCWireEvent = { - event: T; - contextId: number; -}; -// export type Events = Record< -// Event["type"] | "ALL", -// (event: DeltaChatEvent) => void -// >; - -type Events = { ALL: (accountId: number, event: Event) => void } & { - [Property in Event["type"]]: ( +type Events = { ALL: (accountId: number, event: EventType) => void } & { + [Property in EventType["type"]]: ( accountId: number, - event: Extract + event: Extract ) => void; }; -type ContextEvents = { ALL: (event: Event) => void } & { - [Property in Event["type"]]: ( - event: Extract +type ContextEvents = { ALL: (event: EventType) => void } & { + [Property in EventType["type"]]: ( + event: Extract ) => void; }; -export type DcEvent = Event; -export type DcEventType = Extract; +export type DcEvent = EventType; +export type DcEventType = Extract< + EventType, + { type: T } +>; export class BaseDeltaChat< Transport extends BaseTransport @@ -50,8 +45,9 @@ export class BaseDeltaChat< async eventLoop(): Promise { while (true) { const event = await this.rpc.getNextEvent(); - this.emit(event.event.type, event.contextId, event.event as any); - this.emit("ALL", event.contextId, event.event as any); + //@ts-ignore + this.emit(event.event.type, event.contextId, event.event); + this.emit("ALL", event.contextId, event.event); if (this.contextEmitters[event.contextId]) { this.contextEmitters[event.contextId].emit( From aa212b2b7ecb7279dbccc847176e3eec80fa93a8 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 9 May 2023 12:22:32 +0200 Subject: [PATCH 066/528] jsonrpc: `MessageSearchResult`, always include `chat_name`(not an option anymore), also add `author_id` and `chat_type` (#4374) * jsonrpc: `MessageSearchResult`, always include `chat_name`(not an option anymore), also add `author_id` and `chat_type` * replace .ok_or_else with anyhow context --- CHANGELOG.md | 6 ++++ deltachat-jsonrpc/src/api/types/chat.rs | 12 ++----- deltachat-jsonrpc/src/api/types/message.rs | 40 +++++++++++++++++----- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4980a1f1..0d834be66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,19 @@ - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` - `Event`: `context_id` property is now called `contextId` +- jsonrpc: expand `MessageSearchResult`: + - always include `chat_name`(not an option anymore) + - add `author_id`, `chat_type`, `chat_color`, `is_chat_protected`, `is_chat_contact_request`, `is_chat_archived` + - `author_name` now contains the overridden sender name. - JSON-RPC: add API to get reactions outside the message snapshot + ### Fixes - Make the bots automatically accept group chat contact requests. #4377 ### Fixes - jsonrpc: typescript client: fix types of events in event emitter + ## [1.114.0] - 2023-04-24 ### Changes diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index 277817b8f..a658e26f3 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -1,6 +1,6 @@ use std::time::{Duration, SystemTime}; -use anyhow::{anyhow, bail, Context as _, Result}; +use anyhow::{bail, Context as _, Result}; use deltachat::chat::{self, get_chat_contacts, ChatVisibility}; use deltachat::chat::{Chat, ChatId}; use deltachat::constants::Chattype; @@ -92,10 +92,7 @@ impl FullChat { is_protected: chat.is_protected(), profile_image, //BLOBS ? archived: chat.get_visibility() == chat::ChatVisibility::Archived, - chat_type: chat - .get_type() - .to_u32() - .ok_or_else(|| anyhow!("unknown chat type id"))?, // TODO get rid of this unwrap? + chat_type: chat.get_type().to_u32().context("unknown chat type id")?, is_unpromoted: chat.is_unpromoted(), is_self_talk: chat.is_self_talk(), contacts, @@ -158,10 +155,7 @@ impl BasicChat { is_protected: chat.is_protected(), profile_image, //BLOBS ? archived: chat.get_visibility() == chat::ChatVisibility::Archived, - chat_type: chat - .get_type() - .to_u32() - .ok_or_else(|| anyhow!("unknown chat type id"))?, // TODO get rid of this unwrap? + chat_type: chat.get_type().to_u32().context("unknown chat type id")?, is_unpromoted: chat.is_unpromoted(), is_self_talk: chat.is_self_talk(), color, diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index 44d2a1f05..13cb3cbd4 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -1,7 +1,7 @@ -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context as _, Result}; use deltachat::chat::Chat; use deltachat::chat::ChatItem; -use deltachat::constants::Chattype; +use deltachat::chat::ChatVisibility; use deltachat::contact::Contact; use deltachat::context::Context; use deltachat::download; @@ -443,9 +443,17 @@ impl MessageNotificationInfo { pub struct MessageSearchResult { id: u32, author_profile_image: Option, + /// if sender name if overridden it will show it as ~alias author_name: String, author_color: String, - chat_name: Option, + author_id: u32, + chat_profile_image: Option, + chat_color: String, + chat_name: String, + chat_type: u32, + is_chat_protected: bool, + is_chat_contact_request: bool, + is_chat_archived: bool, message: String, timestamp: i64, } @@ -460,17 +468,31 @@ impl MessageSearchResult { Some(path_buf) => path_buf.to_str().map(|s| s.to_owned()), None => None, }; + let chat_profile_image = match chat.get_profile_image(context).await? { + Some(path_buf) => path_buf.to_str().map(|s| s.to_owned()), + None => None, + }; + + let author_name = if let Some(name) = message.get_override_sender_name() { + format!("~{name}") + } else { + sender.get_display_name().to_owned() + }; + let chat_color = color_int_to_hex_string(chat.get_color(context).await?); Ok(Self { id: msg_id.to_u32(), author_profile_image: profile_image, - author_name: sender.get_display_name().to_owned(), + author_name, author_color: color_int_to_hex_string(sender.get_color()), - chat_name: if chat.get_type() == Chattype::Single { - Some(chat.get_name().to_owned()) - } else { - None - }, + author_id: sender.id.to_u32(), + chat_name: chat.get_name().to_owned(), + chat_color, + chat_type: chat.get_type().to_u32().context("unknown chat type id")?, + chat_profile_image, + is_chat_protected: chat.is_protected(), + is_chat_contact_request: chat.is_contact_request(), + is_chat_archived: chat.get_visibility() == ChatVisibility::Archived, message: message.get_text().unwrap_or_default(), timestamp: message.get_timestamp(), }) From d3236e79fd1d9a12ada5eee62a829905d61b56ea Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 8 May 2023 10:59:15 +0000 Subject: [PATCH 067/528] fix: fetch at most 100 existing messages even if EXISTS was not received According to RFC 3501, EXISTS must always be sent in response to SELECT. But if the server does not send it for some reason, async-imap uses the default value, so we will essentially fetch `1:*` and downloading all messages may take a long time. --- CHANGELOG.md | 1 + src/imap.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d834be66..586dbffe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ### Fixes - Make the bots automatically accept group chat contact requests. #4377 +- Fetch at most 100 existing messages even if EXISTS was not received. #4383 ### Fixes - jsonrpc: typescript client: fix types of events in event emitter diff --git a/src/imap.rs b/src/imap.rs index a82b45a0a..332e51545 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1324,8 +1324,8 @@ impl Imap { // Fetch last DC_FETCH_EXISTING_MSGS_COUNT (100) messages. // Sequence numbers are sequential. If there are 1000 messages in the inbox, // we can fetch the sequence numbers 900-1000 and get the last 100 messages. - let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT); - let set = format!("{first}:*"); + let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT + 1); + let set = format!("{first}:{exists}"); let mut list = session .fetch(&set, PREFETCH_FLAGS) .await From b7bbb3ee9ad36d2de88ffbd092288e1db9814905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= <39526136+Septias@users.noreply.github.com> Date: Tue, 9 May 2023 21:15:09 +0200 Subject: [PATCH 068/528] Allow sending a raw webxdc status update (#4386) - create new api endpoint Co-authored-by: bjoern * renaming function --------- Co-authored-by: septias Co-authored-by: bjoern --- CHANGELOG.md | 1 + src/webxdc.rs | 113 +++++++++++++++++++++++++++++++------------------- 2 files changed, 71 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 586dbffe3..98acb8be5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added - jsonrpc: `ChatListItemFetchResult` gets new properties: `summary_preview_image`, `last_message_type` and `last_message_id` +- New rust API `send_webxdc_status_update_struct` to send a `StatusUpdateItem` ### Changes - BREAKING: jsonrpc: diff --git a/src/webxdc.rs b/src/webxdc.rs index 2a8217667..d4398fdf6 100644 --- a/src/webxdc.rs +++ b/src/webxdc.rs @@ -4,6 +4,7 @@ use std::convert::TryFrom; use std::path::Path; use anyhow::{anyhow, bail, ensure, format_err, Result}; + use deltachat_derive::FromSql; use lettre_email::mime; use lettre_email::PartBuilder; @@ -143,17 +144,25 @@ struct StatusUpdates { /// Update items as sent on the wire and as stored in the database. #[derive(Debug, Serialize, Deserialize)] -pub(crate) struct StatusUpdateItem { - pub(crate) payload: Value, +pub struct StatusUpdateItem { + /// The playload of the status update. + pub payload: Value, + /// Optional short info message that will be displayed in the chat. + /// For example "Alice added an item" or "Bob voted for option x". #[serde(skip_serializing_if = "Option::is_none")] - pub(crate) info: Option, + pub info: Option, + /// The new name of the editing document. + /// This is not needed if the webxdc doesn't edit documents. #[serde(skip_serializing_if = "Option::is_none")] - pub(crate) document: Option, + pub document: Option, + /// Optional summary of the status update which will be shown next to the + /// app icon. This should be short and can be something like "8 votes" + /// for a voting app. #[serde(skip_serializing_if = "Option::is_none")] - pub(crate) summary: Option, + pub summary: Option, } /// Update items as passed to the UIs. @@ -230,14 +239,14 @@ impl Context { let valid = match async_zip::read::fs::ZipFileReader::new(path).await { Ok(archive) => { if find_zip_entry(archive.file(), "index.html").is_none() { - info!(self, "{} misses index.html", filename); + warn!(self, "{} misses index.html", filename); false } else { true } } Err(_) => { - info!(self, "{} cannot be opened as zip-file", filename); + warn!(self, "{} cannot be opened as zip-file", filename); false } }; @@ -289,23 +298,11 @@ impl Context { async fn create_status_update_record( &self, instance: &mut Message, - update_str: &str, + status_update_item: StatusUpdateItem, timestamp: i64, can_info_msg: bool, from_id: ContactId, ) -> Result { - let update_str = strip_rtlo_characters(update_str.trim()); - if update_str.is_empty() { - bail!("create_status_update_record: empty update."); - } - - let status_update_item: StatusUpdateItem = - if let Ok(item) = serde_json::from_str::(&update_str) { - item - } else { - bail!("create_status_update_record: no valid update item."); - }; - if can_info_msg { if let Some(ref info) = status_update_item.info { if let Some(info_msg_id) = @@ -404,6 +401,26 @@ impl Context { instance_msg_id: MsgId, update_str: &str, descr: &str, + ) -> Result<()> { + let status_update_item: StatusUpdateItem = + if let Ok(item) = serde_json::from_str::(update_str) { + item + } else { + bail!("create_status_update_record: no valid update item."); + }; + + self.send_webxdc_status_update_struct(instance_msg_id, status_update_item, descr) + .await?; + Ok(()) + } + + /// Sends a status update for an webxdc instance. + /// Also see [Self::send_webxdc_status_update] + pub async fn send_webxdc_status_update_struct( + &self, + instance_msg_id: MsgId, + status_update: StatusUpdateItem, + descr: &str, ) -> Result<()> { let mut instance = Message::load_from_db(self, instance_msg_id).await?; if instance.viewtype != Viewtype::Webxdc { @@ -420,10 +437,10 @@ impl Context { MessageState::Undefined | MessageState::OutPreparing | MessageState::OutDraft ); - let status_update_serial = self + let status_update_serial: StatusUpdateSerial = self .create_status_update_record( &mut instance, - update_str, + status_update, create_smeared_timestamp(self), send_now, ContactId::SELF, @@ -552,7 +569,7 @@ impl Context { for update_item in updates.updates { self.create_status_update_record( &mut instance, - &serde_json::to_string(&update_item)?, + update_item, timestamp, can_info_msg, from_id, @@ -801,6 +818,8 @@ impl Message { #[cfg(test)] mod tests { + use serde_json::json; + use super::*; use crate::chat::{ add_contact_to_chat, create_broadcast_list, create_group_chat, forward_msgs, @@ -1235,7 +1254,12 @@ mod tests { let update_id1 = t .create_status_update_record( &mut instance, - "\n\n{\"payload\": {\"foo\":\"bar\"}}\n", + StatusUpdateItem { + payload: json!({"foo": "bar"}), + info: None, + document: None, + summary: None, + }, 1640178619, true, ContactId::SELF, @@ -1248,19 +1272,15 @@ mod tests { ); assert!(t - .create_status_update_record(&mut instance, "\n\n\n", 1640178619, true, ContactId::SELF) + .send_webxdc_status_update(instance.id, "\n\n\n", "") .await .is_err()); + assert!(t - .create_status_update_record( - &mut instance, - "bad json", - 1640178619, - true, - ContactId::SELF - ) + .send_webxdc_status_update(instance.id, "bad json", "") .await .is_err()); + assert_eq!( t.get_webxdc_status_updates(instance.id, StatusUpdateSerial(0)) .await?, @@ -1270,7 +1290,12 @@ mod tests { let update_id2 = t .create_status_update_record( &mut instance, - r#"{"payload" : { "foo2":"bar2"}}"#, + StatusUpdateItem { + payload: json!({"foo2": "bar2"}), + info: None, + document: None, + summary: None, + }, 1640178619, true, ContactId::SELF, @@ -1282,7 +1307,12 @@ mod tests { ); t.create_status_update_record( &mut instance, - r#"{"payload":true}"#, + StatusUpdateItem { + payload: Value::Bool(true), + info: None, + document: None, + summary: None, + }, 1640178619, true, ContactId::SELF, @@ -1296,15 +1326,12 @@ mod tests { {"payload":true,"serial":3,"max_serial":3}]"# ); - let _update_id3 = t - .create_status_update_record( - &mut instance, - r#"{"payload" : 1, "sender": "that is not used"}"#, - 1640178619, - true, - ContactId::SELF, - ) - .await?; + t.send_webxdc_status_update( + instance.id, + r#"{"payload" : 1, "sender": "that is not used"}"#, + "", + ) + .await?; assert_eq!( t.get_webxdc_status_updates(instance.id, update_id2).await?, r#"[{"payload":true,"serial":3,"max_serial":4}, From 15ce54edfbb129de9f149be9cf1ff0fc0bbb2e0a Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 4 Apr 2023 15:25:17 +0000 Subject: [PATCH 069/528] Update set_core_version.py with new release process --- scripts/set_core_version.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/set_core_version.py b/scripts/set_core_version.py index cd6303cc9..afb113903 100755 --- a/scripts/set_core_version.py +++ b/scripts/set_core_version.py @@ -128,11 +128,15 @@ def main(): subprocess.call(["git", "add", "-u"]) # subprocess.call(["cargo", "update", "-p", "deltachat"]) - print("after commit, on master make sure to: ") - print("") + print("After commit, make sure to:") + print() print(f" git tag -a v{newversion}") print(f" git push origin v{newversion}") - print("") + print(f" gh release create v{newversion} -n ''") + print() + print("Merge release branch into `master` if the release") + print("is made on a stable branch.") + print() if __name__ == "__main__": From 86472aba2c380e9fc4e9c7cadaf5e3ba404377c4 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 14:32:38 +0000 Subject: [PATCH 070/528] refactor: iterate over msg_ids without .iter() --- src/message.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/message.rs b/src/message.rs index 52642ed44..670268418 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1399,8 +1399,8 @@ pub async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result Result<()> { - for msg_id in msg_ids.iter() { - let msg = Message::load_from_db(context, *msg_id).await?; + for &msg_id in msg_ids { + let msg = Message::load_from_db(context, msg_id).await?; if msg.location_id > 0 { delete_poi_location(context, msg.location_id).await?; } @@ -1410,7 +1410,7 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { .with_context(|| format!("Unable to trash message {msg_id}"))?; if msg.viewtype == Viewtype::Webxdc { - context.emit_event(EventType::WebxdcInstanceDeleted { msg_id: *msg_id }); + context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); } let target = context.get_delete_msgs_target().await?; @@ -1430,7 +1430,7 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { .map(|dl| dl.msg_id); if let Some(id) = logging_xdc_id { - if id == *msg_id { + if id == msg_id { set_debug_logging_xdc(context, None).await?; } } From e216dfd65502dbeb4a50bae1d12070fb4626d8f8 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 12:17:06 +0000 Subject: [PATCH 071/528] fix: delete `smtp` rows when message sending is cancelled --- CHANGELOG.md | 3 +-- src/smtp.rs | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98acb8be5..5afe6ef06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,9 +20,8 @@ ### Fixes - Make the bots automatically accept group chat contact requests. #4377 - Fetch at most 100 existing messages even if EXISTS was not received. #4383 - -### Fixes - jsonrpc: typescript client: fix types of events in event emitter +- delete `smtp` rows when message sending is cancelled #4391 ## [1.114.0] - 2023-04-24 diff --git a/src/smtp.rs b/src/smtp.rs index bc6e29e90..f56ed0988 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -575,6 +575,11 @@ pub(crate) async fn send_msg_to_smtp( context, "Sending of message {} was cancelled by the user.", msg_id ); + context + .sql + .execute("DELETE FROM smtp WHERE id=?", (rowid,)) + .await + .context("failed to remove cancelled message from smtp table")?; return Ok(()); } From 2328ba54be1891c3c2f58bdf473dcf2915663bc9 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Wed, 10 May 2023 18:18:42 +0200 Subject: [PATCH 072/528] feat: Generate our changelogs using git-cliff (#4393) --- .github/mergeable.yml | 25 ++++----------- cliff.toml | 75 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 cliff.toml diff --git a/.github/mergeable.yml b/.github/mergeable.yml index 9eeb3615c..5d3dbaac3 100644 --- a/.github/mergeable.yml +++ b/.github/mergeable.yml @@ -1,26 +1,15 @@ version: 2 mergeable: - when: pull_request.* - name: "Changelog check" + name: "Conventional Commits" validate: - - do: or - validate: - - do: description - must_include: - regex: "#skip-changelog" - - do: and - validate: - - do: dependent - changed: - file: "src/**" - required: ["CHANGELOG.md"] - - do: dependent - changed: - file: "deltachat-ffi/src/**" - required: ["CHANGELOG.md"] + - do: title + begins_with: + match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo'] + fail: - do: checks status: "action_required" payload: - title: Changelog might need an update - summary: "Check if CHANGELOG.md needs an update or add #skip-changelog to the PR description." + title: PR title should follow conventional commits + summary: "PR title should follow https://conventionalcommits.org. E.g. start with 'feat:' (for Features / Changes), 'fix:' (for Fixes), 'api:' (for API-Changes), 'api!:' (for breaking API-Changes) 'refactor:' (for Refactor), 'perf:' (for Performance), 'test:' (for Tests), 'style:' (for Styling), 'chore:' (for Miscellaneous Tasks)" diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 000000000..27d39dc0d --- /dev/null +++ b/cliff.toml @@ -0,0 +1,75 @@ +# configuration file for git-cliff +# see https://github.com/orhun/git-cliff#configuration-file + + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/deltachat/deltachat-core-rust/PR/${2}))"}, # replace pull request / issue numbers +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features / Changes"}, + { message = "^fix", group = "Fixes"}, + { message = "^api", group = "API-Changes" }, + { message = "^refactor", group = "Refactor"}, + { message = "^perf", group = "Performance"}, + { message = "^test", group = "Tests"}, + { message = "^style", group = "Styling"}, + { message = "^chore\\(release\\): prepare for", skip = true}, + { message = "^chore", group = "Miscellaneous Tasks"}, +# { body = ".*security", group = "Security"}, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = true +# filter out the commits that are not matched by commit parsers +filter_commits = true +# glob pattern for matching git tags +tag_pattern = "v[0-9]*" +# regex for skipping tags +#skip_tags = "v0.1.0-beta.1" +# regex for ignoring tags +ignore_tags = "" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "oldest" +# limit the number of commits included in the changelog. +# limit_commits = 42 + + +[changelog] +# changelog header +header = """ +# Changelog\n +""" +# template for the changelog body +# https://tera.netlify.app/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | upper_first }} + {% for commit in commits %} + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ + {% for footer in commit.footers %}{% if 'BREAKING CHANGE' in footer.token %} + {% raw %} {% endraw %}- {{ footer.value }}\ + {% endif %}{% endfor %}\ + {% endfor %} +{% endfor %}\n +""" +# remove the leading and trailing whitespace from the template +trim = true +# changelog footer +footer = """ + +""" From 4a593a8d7efb984319587a697cb7bb07d37835f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Thu, 11 May 2023 14:29:43 +0200 Subject: [PATCH 073/528] api!:jsonrpc: sort reactions in descending order (#4388) convert `JSONRPCReactions.reactions` to a `Vec` with unique reactions and their count, sorted in descending order. --------- Co-authored-by: link2xt --- CHANGELOG.md | 1 + deltachat-jsonrpc/src/api/types/reactions.rs | 47 +++++++++++++++----- src/reaction.rs | 35 +++++++++++++-- 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5afe6ef06..d9c47ceb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - BREAKING: jsonrpc: - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` + - `JSONRPCReactions.reactions` is now a `Vec` with unique reactions and their count, sorted in descending order. - `Event`: `context_id` property is now called `contextId` - jsonrpc: expand `MessageSearchResult`: - always include `chat_name`(not an option anymore) diff --git a/deltachat-jsonrpc/src/api/types/reactions.rs b/deltachat-jsonrpc/src/api/types/reactions.rs index 8717ebdc2..d068b23c5 100644 --- a/deltachat-jsonrpc/src/api/types/reactions.rs +++ b/deltachat-jsonrpc/src/api/types/reactions.rs @@ -1,23 +1,37 @@ use std::collections::BTreeMap; +use deltachat::contact::ContactId; use deltachat::reaction::Reactions; use serde::Serialize; use typescript_type_def::TypeDef; +/// A single reaction emoji. +#[derive(Serialize, TypeDef)] +#[serde(rename = "Reaction", rename_all = "camelCase")] +pub struct JSONRPCReaction { + /// Emoji. + emoji: String, + + /// Emoji frequency. + count: usize, + + /// True if we reacted with this emoji. + is_from_self: bool, +} + /// Structure representing all reactions to a particular message. #[derive(Serialize, TypeDef)] #[serde(rename = "Reactions", rename_all = "camelCase")] pub struct JSONRPCReactions { /// Map from a contact to it's reaction to message. reactions_by_contact: BTreeMap>, - /// Unique reactions and their count - reactions: BTreeMap, + /// Unique reactions and their count, sorted in descending order. + reactions: Vec, } impl From for JSONRPCReactions { fn from(reactions: Reactions) -> Self { let mut reactions_by_contact: BTreeMap> = BTreeMap::new(); - let mut unique_reactions: BTreeMap = BTreeMap::new(); for contact_id in reactions.contacts() { let reaction = reactions.get(contact_id); @@ -30,18 +44,29 @@ impl From for JSONRPCReactions { .map(|emoji| emoji.to_owned()) .collect(); reactions_by_contact.insert(contact_id.to_u32(), emojis.clone()); - for emoji in emojis { - if let Some(x) = unique_reactions.get_mut(&emoji) { - *x += 1; - } else { - unique_reactions.insert(emoji, 1); - } - } + } + + let self_reactions = reactions_by_contact.get(&ContactId::SELF.to_u32()); + + let mut reactions_v = Vec::new(); + for (emoji, count) in reactions.emoji_sorted_by_frequency() { + let is_from_self = if let Some(self_reactions) = self_reactions { + self_reactions.contains(&emoji) + } else { + false + }; + + let reaction = JSONRPCReaction { + emoji, + count, + is_from_self, + }; + reactions_v.push(reaction) } JSONRPCReactions { reactions_by_contact, - reactions: unique_reactions, + reactions: reactions_v, } } } diff --git a/src/reaction.rs b/src/reaction.rs index 1af05b0c9..530619519 100644 --- a/src/reaction.rs +++ b/src/reaction.rs @@ -14,6 +14,7 @@ //! possible to remove all reactions by sending an empty string as a reaction, //! even though RFC 9078 requires at least one emoji to be sent. +use std::cmp::Ordering; use std::collections::BTreeMap; use std::fmt; @@ -116,10 +117,9 @@ impl Reactions { pub fn is_empty(&self) -> bool { self.reactions.is_empty() } -} -impl fmt::Display for Reactions { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + /// Returns a map from emojis to their frequencies. + pub fn emoji_frequencies(&self) -> BTreeMap { let mut emoji_frequencies: BTreeMap = BTreeMap::new(); for reaction in self.reactions.values() { for emoji in reaction.emojis() { @@ -129,6 +129,30 @@ impl fmt::Display for Reactions { .or_insert(1); } } + emoji_frequencies + } + + /// Returns a vector of emojis + /// sorted in descending order of frequencies. + /// + /// This function can be used to display the reactions in + /// the message bubble in the UIs. + pub fn emoji_sorted_by_frequency(&self) -> Vec<(String, usize)> { + let mut emoji_frequencies: Vec<(String, usize)> = + self.emoji_frequencies().into_iter().collect(); + emoji_frequencies.sort_by(|(a, a_count), (b, b_count)| { + match a_count.cmp(b_count).reverse() { + Ordering::Equal => a.cmp(b), + other => other, + } + }); + emoji_frequencies + } +} + +impl fmt::Display for Reactions { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let emoji_frequencies = self.emoji_sorted_by_frequency(); let mut first = true; for (emoji, frequency) in emoji_frequencies { if !first { @@ -481,6 +505,11 @@ Content-Disposition: reaction\n\ let reactions = get_msg_reactions(&alice, alice_msg.sender_msg_id).await?; assert_eq!(reactions.to_string(), "👍2 😀1"); + assert_eq!( + reactions.emoji_sorted_by_frequency(), + vec![("👍".to_string(), 2), ("😀".to_string(), 1)] + ); + Ok(()) } From 68aa15950a7c51c009d5195b815d9e100f5e2382 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 11 May 2023 15:43:52 +0000 Subject: [PATCH 074/528] fix: fix PR URL template in git-cliff configuration (#4396) --- cliff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cliff.toml b/cliff.toml index 27d39dc0d..b00c18982 100644 --- a/cliff.toml +++ b/cliff.toml @@ -11,7 +11,7 @@ filter_unconventional = true split_commits = false # regex for preprocessing the commit messages commit_preprocessors = [ - { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/deltachat/deltachat-core-rust/PR/${2}))"}, # replace pull request / issue numbers + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/deltachat/deltachat-core-rust/pull/${2}))"}, # replace pull request / issue numbers ] # regex for parsing and grouping commits commit_parsers = [ From b2c299fa8294fba85bd314515cc924885d8b5a80 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Thu, 11 May 2023 18:43:22 +0200 Subject: [PATCH 075/528] fix: Don't put a double dot at the end of error messages (#4398) --- src/receive_imf.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 812327b18..b592fc3ba 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2084,7 +2084,7 @@ async fn check_verified_properties( ) -> Result<()> { let contact = Contact::load_from_db(context, from_id).await?; - ensure!(mimeparser.was_encrypted(), "This message is not encrypted."); + ensure!(mimeparser.was_encrypted(), "This message is not encrypted"); if mimeparser.get_header(HeaderDef::ChatVerified).is_none() { // we do not fail here currently, this would exclude (a) non-deltas @@ -2117,7 +2117,7 @@ async fn check_verified_properties( if let Some(peerstate) = peerstate { ensure!( peerstate.has_verified_key(&mimeparser.signatures), - "The message was sent with non-verified encryption." + "The message was sent with non-verified encryption" ); } } From c4534ff6217ac2d53512a2e3d747112793274d8f Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 14:41:58 +0000 Subject: [PATCH 076/528] feat: improve SMTP logging --- src/smtp.rs | 6 ++++-- src/smtp/send.rs | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/smtp.rs b/src/smtp.rs index f56ed0988..5360e0294 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -549,7 +549,7 @@ pub(crate) async fn send_msg_to_smtp( } info!( context, - "Try number {} to send message {} over SMTP", retries, msg_id + "Try number {retries} to send message {msg_id} (entry {rowid}) over SMTP" ); let recipients_list = recipients @@ -573,7 +573,7 @@ pub(crate) async fn send_msg_to_smtp( { info!( context, - "Sending of message {} was cancelled by the user.", msg_id + "Sending of message {msg_id} (entry {rowid}) was cancelled by the user." ); context .sql @@ -651,6 +651,8 @@ pub(crate) async fn send_smtp_messages(context: &Context, connection: &mut Smtp) }, ) .await?; + + info!(context, "Selected rows from SMTP queue: {rowids:?}."); for rowid in rowids { send_msg_to_smtp(context, connection, rowid) .await diff --git a/src/smtp/send.rs b/src/smtp/send.rs index b1b25b7a7..c66e3f844 100644 --- a/src/smtp/send.rs +++ b/src/smtp/send.rs @@ -64,9 +64,11 @@ impl Smtp { if let Some(ref mut transport) = self.transport { transport.send(mail).await.map_err(Error::SmtpSend)?; - context.emit_event(EventType::SmtpMessageSent(format!( - "Message len={message_len_bytes} was smtp-sent to {recipients_display}" - ))); + let info_msg = format!( + "Message len={message_len_bytes} was SMTP-sent to {recipients_display}" + ); + info!(context, "{info_msg}."); + context.emit_event(EventType::SmtpMessageSent(info_msg)); self.last_success = Some(std::time::SystemTime::now()); } else { warn!( From c5b6bad9560ef2eb9f07f915f2a1982c0e28c531 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 11:41:55 +0000 Subject: [PATCH 077/528] fix: recreate `smtp` table with AUTOINCREMENT This ensures the rows cannot be confused accidentally when referred by row_id. --- CHANGELOG.md | 1 + src/sql/migrations.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9c47ceb8..654d160dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Make the bots automatically accept group chat contact requests. #4377 - Fetch at most 100 existing messages even if EXISTS was not received. #4383 - jsonrpc: typescript client: fix types of events in event emitter +- Recreate `smtp` table with AUTOINCREMENT `id`. #4390 - delete `smtp` rows when message sending is cancelled #4391 diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index 9493164ea..7a6e1f2a3 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -711,6 +711,24 @@ CREATE INDEX smtp_messageid ON imap(rfc724_mid); ) .await?; } + if dbversion < 101 { + // Recreate `smtp` table with autoincrement. + // rfc724_mid index is not recreated, because it is not used. + sql.execute_migration( + "DROP TABLE smtp; + CREATE TABLE smtp ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + rfc724_mid TEXT NOT NULL, -- Message-ID + mime TEXT NOT NULL, -- SMTP payload + msg_id INTEGER NOT NULL, -- ID of the message in `msgs` table + recipients TEXT NOT NULL, -- List of recipients separated by space + retries INTEGER NOT NULL DEFAULT 0 -- Number of failed attempts to send the message + ); + ", + 101, + ) + .await?; + } let new_version = sql .get_raw_config_int(VERSION_CFG) From c7a250da31feb65e181070e5859bd3795ef4c4a7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 8 May 2023 10:59:15 +0000 Subject: [PATCH 078/528] fix: fetch at most 100 existing messages even if EXISTS was not received According to RFC 3501, EXISTS must always be sent in response to SELECT. But if the server does not send it for some reason, async-imap uses the default value, so we will essentially fetch `1:*` and downloading all messages may take a long time. --- src/imap.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 6e3437fc0..f8729ece8 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1324,8 +1324,8 @@ impl Imap { // Fetch last DC_FETCH_EXISTING_MSGS_COUNT (100) messages. // Sequence numbers are sequential. If there are 1000 messages in the inbox, // we can fetch the sequence numbers 900-1000 and get the last 100 messages. - let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT); - let set = format!("{first}:*"); + let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT + 1); + let set = format!("{first}:{exists}"); let mut list = session .fetch(&set, PREFETCH_FLAGS) .await From 991089d98e20b5b50f692d8ccf72ec9cbf2bea15 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 14:41:58 +0000 Subject: [PATCH 079/528] feat: improve SMTP logging --- src/smtp.rs | 6 ++++-- src/smtp/send.rs | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/smtp.rs b/src/smtp.rs index 26402b325..659adba89 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -552,7 +552,7 @@ pub(crate) async fn send_msg_to_smtp( } info!( context, - "Try number {} to send message {} over SMTP", retries, msg_id + "Try number {retries} to send message {msg_id} (entry {rowid}) over SMTP" ); let recipients_list = recipients @@ -576,7 +576,7 @@ pub(crate) async fn send_msg_to_smtp( { info!( context, - "Sending of message {} was cancelled by the user.", msg_id + "Sending of message {msg_id} (entry {rowid}) was cancelled by the user." ); return Ok(()); } @@ -649,6 +649,8 @@ pub(crate) async fn send_smtp_messages(context: &Context, connection: &mut Smtp) }, ) .await?; + + info!(context, "Selected rows from SMTP queue: {rowids:?}."); for rowid in rowids { send_msg_to_smtp(context, connection, rowid) .await diff --git a/src/smtp/send.rs b/src/smtp/send.rs index b1b25b7a7..c66e3f844 100644 --- a/src/smtp/send.rs +++ b/src/smtp/send.rs @@ -64,9 +64,11 @@ impl Smtp { if let Some(ref mut transport) = self.transport { transport.send(mail).await.map_err(Error::SmtpSend)?; - context.emit_event(EventType::SmtpMessageSent(format!( - "Message len={message_len_bytes} was smtp-sent to {recipients_display}" - ))); + let info_msg = format!( + "Message len={message_len_bytes} was SMTP-sent to {recipients_display}" + ); + info!(context, "{info_msg}."); + context.emit_event(EventType::SmtpMessageSent(info_msg)); self.last_success = Some(std::time::SystemTime::now()); } else { warn!( From 9fc1fe74ad3dbf7cb737ddecdcbaa480b5c44fc3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 12:17:06 +0000 Subject: [PATCH 080/528] fix: delete `smtp` rows when message sending is cancelled --- src/smtp.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/smtp.rs b/src/smtp.rs index 659adba89..1bdf8c704 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -578,6 +578,11 @@ pub(crate) async fn send_msg_to_smtp( context, "Sending of message {msg_id} (entry {rowid}) was cancelled by the user." ); + context + .sql + .execute("DELETE FROM smtp WHERE id=?", (rowid,)) + .await + .context("failed to remove cancelled message from smtp table")?; return Ok(()); } From e4f4dacaf005f4eb793615d31753e3e02524e2e9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 12 May 2023 10:10:40 +0000 Subject: [PATCH 081/528] chore(release): prepare for 1.112.9 --- CHANGELOG.md | 11 +++++++++++ Cargo.lock | 10 +++++----- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c290869..6cd9e08f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [1.112.9] - 2023-05-12 + +### Fixes + +- Fetch at most 100 existing messages even if EXISTS was not received. +- Delete `smtp` rows when message sending is cancelled. + +### Changes + +- Improve SMTP logging. + ## [1.112.8] - 2023-04-20 ### Changes diff --git a/Cargo.lock b/Cargo.lock index 56a68e36d..31d64f26e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.8" +version = "1.112.9" dependencies = [ "ansi_term", "anyhow", @@ -1124,7 +1124,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.112.8" +version = "1.112.9" dependencies = [ "anyhow", "async-channel", @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.112.8" +version = "1.112.9" dependencies = [ "ansi_term", "anyhow", @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.112.8" +version = "1.112.9" dependencies = [ "anyhow", "deltachat", @@ -1186,7 +1186,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.112.8" +version = "1.112.9" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index 971208643..946470d5d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.112.8" +version = "1.112.9" edition = "2021" license = "MPL-2.0" rust-version = "1.64" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index bf7c46d26..f9b9afd1e 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.112.8" +version = "1.112.9" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 7947619da..5c160d6e1 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.112.8" +version = "1.112.9" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 8a266051d..1a30a2cba 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.112.8" + "version": "1.112.9" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 5632d5cd2..cd1c102ff 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.112.8" +version = "1.112.9" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index adf829c87..5cf9161a4 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.112.8" +version = "1.112.9" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 14bee1111..cf4c24ea9 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.112.8" + "version": "1.112.9" } diff --git a/release-date.in b/release-date.in index c0762cd07..554b7f5f6 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-04-20 \ No newline at end of file +2023-05-12 \ No newline at end of file From e3c01d76c410390c1f6902650c7b81884557d0ee Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 10 May 2023 13:16:36 +0000 Subject: [PATCH 082/528] fix: do not return an error from send_msg_to_smtp if retry limit is exceeded This prevents sending the other messages for which the limit was not exceeded. --- src/smtp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/smtp.rs b/src/smtp.rs index 5360e0294..5916cad2b 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -545,7 +545,7 @@ pub(crate) async fn send_msg_to_smtp( .execute("DELETE FROM smtp WHERE id=?", (rowid,)) .await .context("failed to remove message with exceeded retry limit from smtp table")?; - bail!("Number of retries exceeded the limit"); + return Ok(()); } info!( context, From 9ed36d4e05d5081f63c407c4eafe31401207f9c5 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Thu, 11 May 2023 20:29:54 +0200 Subject: [PATCH 083/528] api: rust: add `get_msg_read_receipts(context, msg_id)` - get the contacts that send read receipts for a message --- src/message.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/message.rs b/src/message.rs index 670268418..4f5b5203d 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1086,6 +1086,26 @@ impl MessageState { } } +/// Returns contacts that sent read receipts and the time of reading. +pub async fn get_msg_read_receipts( + context: &Context, + msg_id: MsgId, +) -> Result> { + context + .sql + .query_map( + "SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?", + (msg_id,), + |row| { + let contact_id: ContactId = row.get(0)?; + let ts: i64 = row.get(1)?; + Ok((contact_id, ts)) + }, + |rows| rows.collect::, _>>().map_err(Into::into), + ) + .await +} + /// Returns detailed message information in a multi-line text form. pub async fn get_msg_info(context: &Context, msg_id: MsgId) -> Result { let msg = Message::load_from_db(context, msg_id).await?; From fb8b9f60cea1a0ffd2de57d647c9c1947fa472b3 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Thu, 11 May 2023 20:34:51 +0200 Subject: [PATCH 084/528] api: jsonrpc: new `MessageReadReceipt` type and `get_message_read_receipts(account_id, message_id)` jsonrpc method --- deltachat-jsonrpc/src/api/mod.rs | 22 ++++++++++++++++++++-- deltachat-jsonrpc/src/api/types/message.rs | 7 +++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 825925378..b71718299 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -4,6 +4,7 @@ use std::{collections::HashMap, str::FromStr}; use anyhow::{anyhow, bail, ensure, Context, Result}; pub use deltachat::accounts::Accounts; +use deltachat::message::get_msg_read_receipts; use deltachat::qr::Qr; use deltachat::{ chat::{ @@ -43,8 +44,7 @@ use types::chat::FullChat; use types::contact::ContactObject; use types::events::Event; use types::http::HttpResponse; -use types::message::MessageData; -use types::message::MessageObject; +use types::message::{MessageData, MessageObject, MessageReadReceipt}; use types::provider_info::ProviderInfo; use types::reactions::JSONRPCReactions; use types::webxdc::WebxdcMessageInfo; @@ -1118,6 +1118,24 @@ impl CommandApi { get_msg_info(&ctx, MsgId::new(message_id)).await } + /// Returns contacts that sent read receipts and the time of reading. + async fn get_message_read_receipts( + &self, + account_id: u32, + message_id: u32, + ) -> Result> { + let ctx = self.get_context(account_id).await?; + let receipts = get_msg_read_receipts(&ctx, MsgId::new(message_id)) + .await? + .iter() + .map(|(contact_id, ts)| MessageReadReceipt { + contact_id: contact_id.to_u32(), + timestamp: *ts, + }) + .collect(); + Ok(receipts) + } + /// Asks the core to start downloading a message fully. /// This function is typically called when the user hits the "Download" button /// that is shown by the UI in case `download_state` is `'Available'` or `'Failure'` diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index 13cb3cbd4..d4baf7721 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -536,3 +536,10 @@ pub struct MessageData { pub override_sender_name: Option, pub quoted_message_id: Option, } + +#[derive(Serialize, TypeDef)] +#[serde(rename_all = "camelCase")] +pub struct MessageReadReceipt { + pub contact_id: u32, + pub timestamp: i64, +} From 67480999c0db0ccb02110ee25cdcec76b0cc51d6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 12 May 2023 15:43:30 +0000 Subject: [PATCH 085/528] feat: do not cut incoming text if "bot" config is set --- deltachat-ffi/deltachat.h | 5 ++-- src/mimeparser.rs | 61 ++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 3125344a4..419282037 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -461,8 +461,9 @@ char* dc_get_blobdir (const dc_context_t* context); * If no type is prefixed, the videochat is handled completely in a browser. * - `bot` = Set to "1" if this is a bot. * Prevents adding the "Device messages" and "Saved messages" chats, - * adds Auto-Submitted header to outgoing messages - * and accepts contact requests automatically (calling dc_accept_chat() is not needed for bots). + * adds Auto-Submitted header to outgoing messages, + * accepts contact requests automatically (calling dc_accept_chat() is not needed for bots) + * and does not cut large incoming text messages. * - `last_msg_id` = database ID of the last message processed by the bot. * This ID and IDs below it are guaranteed not to be returned * by dc_get_next_msgs() and dc_wait_next_msgs(). diff --git a/src/mimeparser.rs b/src/mimeparser.rs index d67324455..4e23d7698 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -15,6 +15,7 @@ use once_cell::sync::Lazy; use crate::aheader::{Aheader, EncryptPreference}; use crate::blob::BlobObject; +use crate::config::Config; use crate::constants::{DC_DESIRED_TEXT_LINES, DC_DESIRED_TEXT_LINE_LEN}; use crate::contact::{addr_cmp, addr_normalize, ContactId}; use crate::context::Context; @@ -1114,15 +1115,22 @@ impl MimeMessage { (simplified_txt, top_quote) }; - // Truncate text if it has too many lines - let (simplified_txt, was_truncated) = truncate_by_lines( - simplified_txt, - DC_DESIRED_TEXT_LINES, - DC_DESIRED_TEXT_LINE_LEN, - ); - if was_truncated { - self.is_mime_modified = was_truncated; - } + let is_bot = context.get_config_bool(Config::Bot).await?; + + let simplified_txt = if is_bot { + simplified_txt + } else { + // Truncate text if it has too many lines + let (simplified_txt, was_truncated) = truncate_by_lines( + simplified_txt, + DC_DESIRED_TEXT_LINES, + DC_DESIRED_TEXT_LINE_LEN, + ); + if was_truncated { + self.is_mime_modified = was_truncated; + } + simplified_txt + }; if !simplified_txt.is_empty() || simplified_quote.is_some() { let mut part = Part { @@ -3290,24 +3298,37 @@ On 2020-10-25, Bob wrote: } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_mime_modified_large_plain() { + async fn test_mime_modified_large_plain() -> Result<()> { let t = TestContext::new_alice().await; static REPEAT_TXT: &str = "this text with 42 chars is just repeated.\n"; static REPEAT_CNT: usize = 2000; // results in a text of 84k, should be more than DC_DESIRED_TEXT_LEN let long_txt = format!("From: alice@c.de\n\n{}", REPEAT_TXT.repeat(REPEAT_CNT)); - - let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref(), None) - .await - .unwrap(); assert_eq!(long_txt.matches("just repeated").count(), REPEAT_CNT); assert!(long_txt.len() > DC_DESIRED_TEXT_LEN); - assert!(mimemsg.is_mime_modified); - assert!( - mimemsg.parts[0].msg.matches("just repeated").count() - <= DC_DESIRED_TEXT_LEN / REPEAT_TXT.len() - ); - assert!(mimemsg.parts[0].msg.len() <= DC_DESIRED_TEXT_LEN + DC_ELLIPSIS.len()); + + { + let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref(), None).await?; + assert!(mimemsg.is_mime_modified); + assert!( + mimemsg.parts[0].msg.matches("just repeated").count() + <= DC_DESIRED_TEXT_LEN / REPEAT_TXT.len() + ); + assert!(mimemsg.parts[0].msg.len() <= DC_DESIRED_TEXT_LEN + DC_ELLIPSIS.len()); + } + + t.set_config(Config::Bot, Some("1")).await?; + + { + let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref(), None).await?; + assert!(!mimemsg.is_mime_modified); + assert_eq!( + format!("{}\n", mimemsg.parts[0].msg), + REPEAT_TXT.repeat(REPEAT_CNT) + ); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] From ce729263a5e7dd8ecb2540c7e0bec9ea7d14b697 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 12 May 2023 13:49:22 +0000 Subject: [PATCH 086/528] chore(release): prepare for v1.115.0 --- CHANGELOG.md | 60 +++++++++++++++-------- Cargo.lock | 10 ++-- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 53 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812f66e93..ac34331c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,29 +1,47 @@ # Changelog -## Unreleased +## [1.115.0] - 2023-05-12 -### Added -- jsonrpc: `ChatListItemFetchResult` gets new properties: `summary_preview_image`, `last_message_type` and `last_message_id` -- New rust API `send_webxdc_status_update_struct` to send a `StatusUpdateItem` +### JSON-RPC API Changes -### Changes -- BREAKING: jsonrpc: - - `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries` - - `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries` - - `JSONRPCReactions.reactions` is now a `Vec` with unique reactions and their count, sorted in descending order. - - `Event`: `context_id` property is now called `contextId` -- jsonrpc: expand `MessageSearchResult`: - - always include `chat_name`(not an option anymore) - - add `author_id`, `chat_type`, `chat_color`, `is_chat_protected`, `is_chat_contact_request`, `is_chat_archived` +- Sort reactions in descending order ([#4388](https://github.com/deltachat/deltachat-core-rust/pull/4388)). +- Add API to get reactions outside the message snapshot. +- `get_chatlist_items_by_entries` now takes only chatids instead of `ChatListEntries`. +- `get_chatlist_entries` now returns `Vec` of chatids instead of `ChatListEntries`. +- `JSONRPCReactions.reactions` is now a `Vec` with unique reactions and their count, sorted in descending order. +- `Event`: `context_id` property is now called `contextId`. +- Expand `MessageSearchResult`: + - Always include `chat_name`(not an option anymore). + - Add `author_id`, `chat_type`, `chat_color`, `is_chat_protected`, `is_chat_contact_request`, `is_chat_archived`. - `author_name` now contains the overridden sender name. -- JSON-RPC: add API to get reactions outside the message snapshot +- `ChatListItemFetchResult` gets new properties: `summary_preview_image`, `last_message_type` and `last_message_id` +- New `MessageReadReceipt` type and `get_message_read_receipts(account_id, message_id)` jsonrpc method. + +### API Changes + +- New rust API `send_webxdc_status_update_struct` to send a `StatusUpdateItem`. +- Add `get_msg_read_receipts(context, msg_id)` - get the contacts that send read receipts for a message. + +### Features / Changes + +- Build deltachat-rpc-server releases for x86\_64 macOS. +- Generate changelogs using git-cliff ([#4393](https://github.com/deltachat/deltachat-core-rust/pull/4393), [#4396](https://github.com/deltachat/deltachat-core-rust/pull/4396)). +- Improve SMTP logging. +- Do not cut incoming text if "bot" config is set. ### Fixes -- Make the bots automatically accept group chat contact requests. #4377 -- Fetch at most 100 existing messages even if EXISTS was not received. #4383 -- jsonrpc: typescript client: fix types of events in event emitter -- Recreate `smtp` table with AUTOINCREMENT `id`. #4390 -- delete `smtp` rows when message sending is cancelled #4391 + +- JSON-RPC: typescript client: fix types of events in event emitter ([#4373](https://github.com/deltachat/deltachat-core-rust/pull/4373)). +- Fetch at most 100 existing messages even if EXISTS was not received ([#4383](https://github.com/deltachat/deltachat-core-rust/pull/4383)). +- Don't put a double dot at the end of error messages ([#4398](https://github.com/deltachat/deltachat-core-rust/pull/4398)). +- Recreate `smtp` table with AUTOINCREMENT `id` ([#4390](https://github.com/deltachat/deltachat-core-rust/pull/4390)). +- Do not return an error from `send_msg_to_smtp` if retry limit is exceeded. +- Make the bots automatically accept group chat contact requests ([#4377](https://github.com/deltachat/deltachat-core-rust/pull/4377)). +- Delete `smtp` rows when message sending is cancelled ([#4391](https://github.com/deltachat/deltachat-core-rust/pull/4391)). + +### Refactor + +- Iterate over `msg_ids` without .iter(). ## [1.112.9] - 2023-05-12 @@ -2467,5 +2485,7 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.6]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.5...v1.112.6 [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 [1.112.8]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.112.8 -[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.8...v1.113.0 +[1.112.9]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.8...v1.112.9 +[1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.9...v1.113.0 [1.114.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 +[1.115.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.114.0...v1.115.0 diff --git a/Cargo.lock b/Cargo.lock index da259390c..7545582b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1144,7 +1144,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.114.0" +version = "1.115.0" dependencies = [ "ansi_term", "anyhow", @@ -1219,7 +1219,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.114.0" +version = "1.115.0" dependencies = [ "anyhow", "async-channel", @@ -1242,7 +1242,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.114.0" +version = "1.115.0" dependencies = [ "ansi_term", "anyhow", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.114.0" +version = "1.115.0" dependencies = [ "anyhow", "deltachat", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.114.0" +version = "1.115.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index ac2bf9246..0ff02606f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.114.0" +version = "1.115.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 3975fedac..39faa6cc3 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.114.0" +version = "1.115.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index b7bc8f055..918e123a3 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.114.0" +version = "1.115.0" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 3a9094121..dd9be70e7 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.114.0" + "version": "1.115.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 7f12f1157..6ef28ef05 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.114.0" +version = "1.115.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 08140ee1b..b1f8151fb 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.114.0" +version = "1.115.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 5898750b7..fec827f3c 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.114.0" + "version": "1.115.0" } diff --git a/release-date.in b/release-date.in index adcf29f01..554b7f5f6 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-04-24 \ No newline at end of file +2023-05-12 \ No newline at end of file From 3b381c48620917231daf9ee8c20c8d8871e4abef Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 15:33:26 +0000 Subject: [PATCH 087/528] docs: update instructions for python devenv --- python/README.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/README.rst b/python/README.rst index da1b25c7e..c5f048912 100644 --- a/python/README.rst +++ b/python/README.rst @@ -74,7 +74,9 @@ Developing the bindings If you want to develop or debug the bindings, you can create a testing development environment using `tox`:: - tox -c python --devenv env + export DCC_RS_DEV="$PWD" + export DCC_RS_TARGET=debug + tox -c python --devenv env -e py . env/bin/activate Inside this environment the bindings are installed From 53449ea5b3a6972f319088018d65e8ce223e43ea Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:25:22 +0000 Subject: [PATCH 088/528] build(git-cliff): remove git-cliff footer --- cliff.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cliff.toml b/cliff.toml index b00c18982..031763064 100644 --- a/cliff.toml +++ b/cliff.toml @@ -69,7 +69,3 @@ body = """ """ # remove the leading and trailing whitespace from the template trim = true -# changelog footer -footer = """ - -""" From 4b7ff6f0030ab70c1d291fbe5b03b7cb41d7e8aa Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:27:02 +0000 Subject: [PATCH 089/528] build(git-cliff): add period at the end of changelog entry titles Make it consistent with the rest of the changelog. --- cliff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cliff.toml b/cliff.toml index 031763064..5c9183715 100644 --- a/cliff.toml +++ b/cliff.toml @@ -60,7 +60,7 @@ body = """ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}.\ {% for footer in commit.footers %}{% if 'BREAKING CHANGE' in footer.token %} {% raw %} {% endraw %}- {{ footer.value }}\ {% endif %}{% endfor %}\ From 3bd16ba04563a1b6c19a764387359c66a8a102cf Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:33:49 +0000 Subject: [PATCH 090/528] build(git-cliff): add "Build system" section --- cliff.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/cliff.toml b/cliff.toml index 5c9183715..c4fd25e32 100644 --- a/cliff.toml +++ b/cliff.toml @@ -24,6 +24,7 @@ commit_parsers = [ { message = "^style", group = "Styling"}, { message = "^chore\\(release\\): prepare for", skip = true}, { message = "^chore", group = "Miscellaneous Tasks"}, + { message = "^build", group = "Build system"}, # { body = ".*security", group = "Security"}, ] # protect breaking changes from being skipped due to matching a skipping commit_parser From 8796e0472a9684f8ba16d6e0fe134e41e1d359c9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:34:11 +0000 Subject: [PATCH 091/528] build(git-cliff): add scope to changelog entries --- cliff.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cliff.toml b/cliff.toml index c4fd25e32..a5ad40a96 100644 --- a/cliff.toml +++ b/cliff.toml @@ -61,7 +61,9 @@ body = """ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}.\ + - {% if commit.breaking %}[**breaking**] {% endif %}\ + {% if commit.scope %}{{ commit.scope }}: {% endif %}\ + {{ commit.message | upper_first }}.\ {% for footer in commit.footers %}{% if 'BREAKING CHANGE' in footer.token %} {% raw %} {% endraw %}- {{ footer.value }}\ {% endif %}{% endfor %}\ From bb45c249a394989ea5d514d857ae1ac61efd1fe4 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:34:39 +0000 Subject: [PATCH 092/528] build(git-cliff): add unconventional commits to "Other" section --- cliff.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cliff.toml b/cliff.toml index a5ad40a96..839ef4809 100644 --- a/cliff.toml +++ b/cliff.toml @@ -6,7 +6,7 @@ # parse the commits based on https://www.conventionalcommits.org conventional_commits = true # filter out the commits that are not conventional -filter_unconventional = true +filter_unconventional = false # process each line of a commit as an individual commit split_commits = false # regex for preprocessing the commit messages @@ -25,6 +25,7 @@ commit_parsers = [ { message = "^chore\\(release\\): prepare for", skip = true}, { message = "^chore", group = "Miscellaneous Tasks"}, { message = "^build", group = "Build system"}, + { message = ".*", group = "Other"}, # { body = ".*security", group = "Security"}, ] # protect breaking changes from being skipped due to matching a skipping commit_parser From 92d58571500b0e13fd722f38f28bd3ee5bdf15ed Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:35:03 +0000 Subject: [PATCH 093/528] build(git-cliff): update the link to configuration documentation --- cliff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cliff.toml b/cliff.toml index 839ef4809..0a4400a10 100644 --- a/cliff.toml +++ b/cliff.toml @@ -1,5 +1,5 @@ # configuration file for git-cliff -# see https://github.com/orhun/git-cliff#configuration-file +# see https://git-cliff.org/docs/configuration/ [git] From 081178d623ceab0f758cf3c2f186caf1887b958b Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:39:12 +0000 Subject: [PATCH 094/528] ci(mergeable): allow PR titles to start with "ci" and "build" --- .github/mergeable.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/mergeable.yml b/.github/mergeable.yml index 5d3dbaac3..d4206f26a 100644 --- a/.github/mergeable.yml +++ b/.github/mergeable.yml @@ -5,7 +5,7 @@ mergeable: validate: - do: title begins_with: - match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo'] + match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo', 'build', 'ci'] fail: - do: checks From 55fcd589dba5e416cec0e09bff11804c98b2ec55 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 12:40:29 +0000 Subject: [PATCH 095/528] build(git-cliff): put "ci" commits into "CI" section of changelog --- cliff.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/cliff.toml b/cliff.toml index 0a4400a10..0e07e9191 100644 --- a/cliff.toml +++ b/cliff.toml @@ -25,6 +25,7 @@ commit_parsers = [ { message = "^chore\\(release\\): prepare for", skip = true}, { message = "^chore", group = "Miscellaneous Tasks"}, { message = "^build", group = "Build system"}, + { message = "^ci", group = "CI"}, { message = ".*", group = "Other"}, # { body = ".*security", group = "Security"}, ] From 50431d8cfe2dec1b8bc6de94b70105ca85160f52 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 May 2023 15:34:12 +0000 Subject: [PATCH 096/528] build(git-cliff): add "Documentation" section --- cliff.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/cliff.toml b/cliff.toml index 0e07e9191..0e1ed7438 100644 --- a/cliff.toml +++ b/cliff.toml @@ -25,6 +25,7 @@ commit_parsers = [ { message = "^chore\\(release\\): prepare for", skip = true}, { message = "^chore", group = "Miscellaneous Tasks"}, { message = "^build", group = "Build system"}, + { message = "^docs", group = "Documentation"}, { message = "^ci", group = "CI"}, { message = ".*", group = "Other"}, # { body = ".*security", group = "Security"}, From 2e6f98f4e4def7fce7823aea2551c002b4f6d859 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 9 May 2023 19:10:58 +0000 Subject: [PATCH 097/528] api: add dc_jsonrpc_blocking_call() --- Cargo.lock | 5 +++-- deltachat-ffi/Cargo.toml | 1 + deltachat-ffi/deltachat.h | 12 ++++++++++++ deltachat-ffi/src/lib.rs | 27 ++++++++++++++++++++++++++- deltachat-jsonrpc/Cargo.toml | 2 +- python/tests/test_4_lowlevel.py | 17 +++++++++++++++++ 6 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7545582b6..b3a006e0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1295,6 +1295,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", + "yerpc", ] [[package]] @@ -5754,9 +5755,9 @@ dependencies = [ [[package]] name = "yerpc" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a0257f42e6bdc187f37074723b6094da3502cee21ae517b3c54d2c37d506e7" +checksum = "b2c26a804eaa30c1ff1a296dc6dd1a7d7c622750dafcd0d6b2ed5e3c5c3beb22" dependencies = [ "anyhow", "async-channel", diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 39faa6cc3..5ccf92bcb 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -25,6 +25,7 @@ anyhow = "1" thiserror = "1" rand = "0.8" once_cell = "1.17.0" +yerpc = { version = "0.4.4", features = ["anyhow_expose"] } [features] default = ["vendored"] diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 419282037..af8cac124 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -5720,6 +5720,18 @@ void dc_jsonrpc_request(dc_jsonrpc_instance_t* jsonrpc_instance, const char* req */ char* dc_jsonrpc_next_response(dc_jsonrpc_instance_t* jsonrpc_instance); +/** + * Make a JSON-RPC call and return a response. + * + * @memberof dc_jsonrpc_instance_t + * @param jsonrpc_instance jsonrpc instance as returned from dc_jsonrpc_init(). + * @param method JSON-RPC method name, e.g. `check_email_validity`. + * @param params JSON-RPC method parameters, e.g. `["alice@example.org"]`. + * @return JSON-RPC response as string, must be freed using dc_str_unref() after usage. + * On error, NULL is returned. + */ +char* dc_jsonrpc_blocking_call(dc_jsonrpc_instance_t* jsonrpc_instance, const char *method, const char *params); + /** * @class dc_event_emitter_t * diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index ebbe0d119..320f5c23f 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -4967,7 +4967,7 @@ pub unsafe extern "C" fn dc_accounts_get_event_emitter( #[cfg(feature = "jsonrpc")] mod jsonrpc { use deltachat_jsonrpc::api::CommandApi; - use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcSession}; + use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcServer, RpcSession}; use super::*; @@ -5039,4 +5039,29 @@ mod jsonrpc { .map(|result| serde_json::to_string(&result).unwrap_or_default().strdup()) .unwrap_or(ptr::null_mut()) } + + #[no_mangle] + pub unsafe extern "C" fn dc_jsonrpc_blocking_call( + jsonrpc_instance: *mut dc_jsonrpc_instance_t, + method: *const libc::c_char, + params: *const libc::c_char, + ) -> *mut libc::c_char { + if jsonrpc_instance.is_null() { + eprintln!("ignoring careless call to dc_jsonrpc_blocking_call()"); + return ptr::null_mut(); + } + let api = &*jsonrpc_instance; + let method = to_string_lossy(method); + let params = to_string_lossy(params); + let params: Option = match serde_json::from_str(¶ms) { + Ok(params) => Some(params), + Err(_) => None, + }; + let params = params.map(yerpc::Params::into_value).unwrap_or_default(); + let res = block_on(api.handle.server().handle_request(method, params)); + match res { + Ok(res) => res.to_string().strdup(), + Err(_) => ptr::null_mut(), + } + } } diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 918e123a3..767a0ee90 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -21,7 +21,7 @@ log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } serde_json = "1.0.96" -yerpc = { version = "0.4.3", features = ["anyhow_expose"] } +yerpc = { version = "0.4.4", features = ["anyhow_expose"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } tokio = { version = "1.28.0" } sanitize-filename = "0.4" diff --git a/python/tests/test_4_lowlevel.py b/python/tests/test_4_lowlevel.py index 84a751ea4..1c3f15bea 100644 --- a/python/tests/test_4_lowlevel.py +++ b/python/tests/test_4_lowlevel.py @@ -9,6 +9,7 @@ from deltachat.testplugin import ( create_dict_from_files_in_path, write_dict_to_dir, ) +from deltachat.cutil import from_optional_dc_charpointer # from deltachat.account import EventLogger @@ -215,3 +216,19 @@ def test_logged_ac_process_ffi_failure(acfactory): assert "ac_process_ffi_event" in res assert "ZeroDivisionError" in res assert "Traceback" in res + + +def test_jsonrpc_blocking_call(tmpdir): + accounts_fname = tmpdir.join("accounts") + accounts = ffi.gc( + lib.dc_accounts_new(ffi.NULL, accounts_fname.strpath.encode("ascii")), + lib.dc_accounts_unref, + ) + jsonrpc = ffi.gc(lib.dc_jsonrpc_init(accounts), lib.dc_jsonrpc_unref) + res = from_optional_dc_charpointer( + lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice@example.org"]'), + ) + assert res == "true" + + res = from_optional_dc_charpointer(lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice"]')) + assert res == "false" From f9dc8edbcbb7632b50d45b4c3b47dd011440a80b Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 16 May 2023 10:31:25 +0000 Subject: [PATCH 098/528] feat: add more context to message loading errors --- deltachat-jsonrpc/src/api/types/message.rs | 22 +++++++++++++++------- src/message.rs | 4 +++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index d4baf7721..b030e7616 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Context as _, Result}; +use anyhow::{Context as _, Result}; use deltachat::chat::Chat; use deltachat::chat::ChatItem; use deltachat::chat::ChatVisibility; @@ -114,8 +114,12 @@ impl MessageObject { pub async fn from_msg_id(context: &Context, msg_id: MsgId) -> Result { let message = Message::load_from_db(context, msg_id).await?; - let sender_contact = Contact::load_from_db(context, message.get_from_id()).await?; - let sender = ContactObject::try_from_dc_contact(context, sender_contact).await?; + let sender_contact = Contact::load_from_db(context, message.get_from_id()) + .await + .context("failed to load sender contact")?; + let sender = ContactObject::try_from_dc_contact(context, sender_contact) + .await + .context("failed to load sender contact object")?; let file_bytes = message.get_filebytes(context).await?.unwrap_or_default(); let override_sender_name = message.get_override_sender_name(); @@ -132,7 +136,9 @@ impl MessageObject { let quote = if let Some(quoted_text) = message.quoted_text() { match message.quoted_message(context).await? { Some(quote) => { - let quote_author = Contact::load_from_db(context, quote.get_from_id()).await?; + let quote_author = Contact::load_from_db(context, quote.get_from_id()) + .await + .context("failed to load quote author contact")?; Some(MessageQuote::WithMessage { text: quoted_text, message_id: quote.get_id().to_u32(), @@ -160,7 +166,9 @@ impl MessageObject { None }; - let reactions = get_msg_reactions(context, msg_id).await?; + let reactions = get_msg_reactions(context, msg_id) + .await + .context("failed to load message reactions")?; let reactions = if reactions.is_empty() { None } else { @@ -180,7 +188,7 @@ impl MessageObject { state: message .get_state() .to_u32() - .ok_or_else(|| anyhow!("state conversion to number failed"))?, + .context("state conversion to number failed")?, error: message.error(), timestamp: message.get_timestamp(), @@ -203,7 +211,7 @@ impl MessageObject { videochat_type: match message.get_videochat_type() { Some(vct) => Some( vct.to_u32() - .ok_or_else(|| anyhow!("state conversion to number failed"))?, + .context("videochat type conversion to number failed")?, ), None => None, }, diff --git a/src/message.rs b/src/message.rs index 4f5b5203d..0be211e36 100644 --- a/src/message.rs +++ b/src/message.rs @@ -537,7 +537,9 @@ impl Message { /// Returns the size of the file in bytes, if applicable. pub async fn get_filebytes(&self, context: &Context) -> Result> { if let Some(path) = self.param.get_path(Param::File, context)? { - Ok(Some(get_filebytes(context, &path).await?)) + Ok(Some(get_filebytes(context, &path).await.with_context( + || format!("failed to get {} size in bytes", path.display()), + )?)) } else { Ok(None) } From 24d52c59097ba18f1534a7025b0d3171017ddfbc Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 16 May 2023 22:47:28 +0000 Subject: [PATCH 099/528] build(set_core_version.py): expect release date in the changelog git-cliff adds the date to the changelog automatically, so set_core_version.py only needs to check that the date is in place. --- scripts/set_core_version.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/scripts/set_core_version.py b/scripts/set_core_version.py index afb113903..0958c1669 100755 --- a/scripts/set_core_version.py +++ b/scripts/set_core_version.py @@ -7,6 +7,7 @@ import pathlib import re import subprocess from argparse import ArgumentParser +from pathlib import Path rex = re.compile(r'version = "(\S+)"') @@ -95,22 +96,14 @@ def main(): today = datetime.date.today().isoformat() if "alpha" not in newversion: - changelog_name = "CHANGELOG.md" - changelog_tmpname = changelog_name + ".tmp" - changelog_tmp = open(changelog_tmpname, "w") found = False - for line in open(changelog_name): - ## 1.25.0 - if line == f"## [{newversion}]\n": - line = f"## [{newversion}] - {today}\n" + for line in Path("CHANGELOG.md").open(): + if line == f"## [{newversion}] - {today}\n": found = True - changelog_tmp.write(line) if not found: raise SystemExit( f"{changelog_name} contains no entry for version: {newversion}" ) - changelog_tmp.close() - os.rename(changelog_tmpname, changelog_name) for toml_filename in toml_list: replace_toml_version(toml_filename, newversion) From f024f396bf2bc1dc6998f31e489b742d90635265 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 16 May 2023 22:50:48 +0000 Subject: [PATCH 100/528] docs: document release process in RELEASE.md --- RELEASE.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 RELEASE.md diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 000000000..8a93946b4 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,18 @@ +# Releasing a new version of DeltaChat core + +For example, to release version 1.116.0 of the core, do the following steps. + +1. Resolve all [blocker issues](https://github.com/deltachat/deltachat-core-rust/labels/blocker). + +2. Update the changelog: `git cliff --unreleased --tag 1.116.0 --prepend CHANGELOG.md` or `git cliff -u -t 1.116.0 -p CHANGELOG.md`. + +3. Update the version by running `scripts/set_core_version.py 1.116.0`. + +4. Commit the changes as `chore(release): prepare for 1.116.0`. + Optionally, use a separate branch like `prep-1.116.0` for this commit and open a PR for review. + +5. Tag the release: `git tag -a v1.116.0`. + +6. Push the release tag: `git push origin v1.116.0`. + +7. Create a GitHub release: `gh release create v1.116.0 -n ''`. From 3a29a555bfb717b37be69402a2796cea22ec5bf6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 17 May 2023 15:25:18 +0000 Subject: [PATCH 101/528] test(python): make `test_mdn_asymmetric` less flaky Normally the message has UID 1, but this is not true when account is reused. In this case the message may be "Marked messages 2 in folder DeltaChat as seen." and the test times out waiting for "Marked messages 1 in folder DeltaChat as seen." --- python/tests/test_1_online.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index 85e1774bd..c2df18b5a 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -703,7 +703,7 @@ def test_mdn_asymmetric(acfactory, lp): assert len(chat.get_messages()) == 1 # Wait for the message to be marked as seen on IMAP. - ac1._evtracker.get_info_contains("Marked messages 1 in folder DeltaChat as seen.") + ac1._evtracker.get_info_contains("Marked messages [0-9]+ in folder DeltaChat as seen.") # MDN is received even though MDNs are already disabled assert msg_out.is_out_mdn_received() From 10b2aa535087ee13ab06b0eb9f60ed24a46b68ea Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 19 May 2023 09:25:27 +0000 Subject: [PATCH 102/528] chore: remove release.toml We are not using cargo-release at the moment. --- release.toml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 release.toml diff --git a/release.toml b/release.toml deleted file mode 100644 index 21181de6c..000000000 --- a/release.toml +++ /dev/null @@ -1,3 +0,0 @@ -pre-release-commit-message = "chore({{crate_name}}): release {{version}}" -pro-release-commit-message = "chore({{crate_name}}): starting development cycle for {{next_version}}" -no-dev-version = true \ No newline at end of file From d27e3d085e3211f52a98f812efe6d7936b734d73 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 19 May 2023 11:03:26 +0000 Subject: [PATCH 103/528] ci: remove incorrect comment --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0659c359..e17ddb211 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -222,7 +222,6 @@ jobs: fail-fast: false matrix: include: - # Currently used Rust version. - os: ubuntu-latest python: 3.11 - os: macos-latest From 0dd9e3a77ef301ae3e2cfc24d2b40a29ed4f7d9b Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 20 May 2023 10:34:02 +0000 Subject: [PATCH 104/528] docs: add contributing guidelines Co-authored-by: Hocuri --- .github/mergeable.yml | 4 +-- CONTRIBUTING.md | 70 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/.github/mergeable.yml b/.github/mergeable.yml index d4206f26a..0c06cb8bd 100644 --- a/.github/mergeable.yml +++ b/.github/mergeable.yml @@ -5,11 +5,11 @@ mergeable: validate: - do: title begins_with: - match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo', 'build', 'ci'] + match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo', 'build', 'ci', 'docs'] fail: - do: checks status: "action_required" payload: title: PR title should follow conventional commits - summary: "PR title should follow https://conventionalcommits.org. E.g. start with 'feat:' (for Features / Changes), 'fix:' (for Fixes), 'api:' (for API-Changes), 'api!:' (for breaking API-Changes) 'refactor:' (for Refactor), 'perf:' (for Performance), 'test:' (for Tests), 'style:' (for Styling), 'chore:' (for Miscellaneous Tasks)" + summary: "PR title should follow https://conventionalcommits.org. See https://github.com/deltachat/deltachat-core-rust/blob/master/CONTRIBUTING.md for details." diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..b1b23ba45 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contributing guidelines + +## Reporting bugs + +If you found a bug, [report it on GitHub](https://github.com/deltachat/deltachat-core-rust/issues). +If the bug you found is specific to +[Android](https://github.com/deltachat/deltachat-android/issues), +[iOS](https://github.com/deltachat/deltachat-ios/issues) or +[Desktop](https://github.com/deltachat/deltachat-desktop/issues), +report it to the corresponding repository. + +## Proposing features + +If you have a feature request, create a new topic on the [forum](https://support.delta.chat/). + +## Contributing code + +If you want to contribute a code, [open a pull request](https://github.com/deltachat/deltachat-core-rust/pulls). + +You can find the list of good first issues +and a link to this guide +on the contributing page: + +### Coding conventions + +We format the code using `rustfmt`. Run `cargo fmt` prior to committing the code. +Run `scripts/clippy.sh` to check the code for common mistakes with [Clippy]. + +Commit messages follow the [Conventional Commits] notation. +We use [git-cliff] to generate the changelog from commit messages before the release. + +With **`git cliff --unreleased`**, you can check how the changelog entry for your commit will look. + +The following prefix types are used: +- `feat`: Features, e.g. "feat: Pause IO for BackupProvider". If you are unsure what's the category of your commit, you can often just use `feat`. +- `fix`: Bug fixes, e.g. "fix: delete `smtp` rows when message sending is cancelled" +- `api`: API changes, e.g. "api(rust): add `get_msg_read_receipts(context, msg_id)`" +- `refactor`: Refactorings, e.g. "refactor: iterate over `msg_ids` without `.iter()`" +- `perf`: Performance improvements, e.g. "perf: improve SQLite performance with `PRAGMA synchronous=normal`" +- `test`: Test changes and improvements to the testing framework. +- `build`: Build system and tool configuration changes, e.g. "build(git-cliff): put "ci" commits into "CI" section of changelog" +- `ci`: CI configuration changes, e.g. "ci: limit artifact retention time for `libdeltachat.a` to 1 day" +- `docs`: Documentation changes, e.g. "docs: add contributing guidelines" +- `chore`: miscellaneous tasks, e.g. "chore: add `.DS_Store` to `.gitignore`" + +Release preparation commits are marked as "chore(release): prepare for vX.Y.Z". + +#### Breaking Changes + +Use a `!` to mark breaking changes, e.g. "api!: Remove `dc_chat_can_send`". + +Alternatively, breaking changes can go into the commit description, e.g.: + +``` +fix: Fix race condition and db corruption when a message was received during backup + +BREAKING CHANGE: You have to call `dc_stop_io()`/`dc_start_io()` before/after `dc_imex(DC_IMEX_EXPORT_BACKUP)` +``` + +#### Multiple Changes in one PR + +If you have multiple changes in one PR, create multiple conventional commits, and then do a rebase merge. Otherwise, you should usually do a squash merge. + +[Clippy]: https://doc.rust-lang.org/clippy/ +[Conventional Commits]: https://www.conventionalcommits.org/ +[git-cliff]: https://git-cliff.org/ + +## Other ways to contribute + +For other ways to contribute, refer to the [website](https://delta.chat/en/contribute). From c7ad0b1f4f511d851e8d1edf4f7c5f0d3d2b0e41 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 19 May 2023 19:25:45 +0000 Subject: [PATCH 105/528] test: make `test_group_with_removed_message_id` less flaky It failed in CI once, apparently because "Gr." was generated inside the group ID. --- src/chat.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index 188719e88..d5649b005 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -5147,9 +5147,11 @@ mod tests { // Alice has an SMTP-server replacing the `Message-ID:`-header (as done eg. by outlook.com). let sent_msg = alice.pop_sent_msg().await; let msg = sent_msg.payload(); - assert_eq!(msg.match_indices("Gr.").count(), 2); + assert_eq!(msg.match_indices("Message-ID: Date: Fri, 19 May 2023 16:47:12 +0000 Subject: [PATCH 106/528] ci: require Python 3.8 for deltachat-rpc-client With Python 3.7 asynchronous tests randomly fail with "RuntimeError: Event loop is closed" during shutdown. Backtrace of the error includes `SafeChildWatcher` calls. Python 3.8 has replaced `SafeChildWatcher` with a new `ThreadedChildWatcher` by default [1] as a bugfix for "asyncio.create_subprocess_exec() only works with main event loop" bug [2]. Python 3.7 scheduled end of life is 2023-06-27 according to . [1] https://github.com/python/cpython/pull/14344 [2] https://bugs.python.org/issue35621 --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e17ddb211..ed1e3a2f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -233,11 +233,12 @@ jobs: - os: macos-latest python: pypy3.9 - # Minimum Supported Python Version = 3.7 - # This is the minimum version for which manylinux Python wheels are - # built. Test it with minimum supported Rust version. + # Minimum Supported Python Version = 3.8 + # + # Python 3.7 has at least one known bug related to starting subprocesses + # in asyncio programs: - os: ubuntu-latest - python: 3.7 + python: 3.8 runs-on: ${{ matrix.os }} steps: From b9b0d20e8d73db0183a356a49230b6dd23672a12 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 22 May 2023 00:10:33 +0200 Subject: [PATCH 107/528] test: Add golden tests infrastructure (#4395) --- Cargo.lock | 44 +++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/test_utils.rs | 66 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 96 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b3a006e0d..d186d0c17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -977,6 +977,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -1183,6 +1193,7 @@ dependencies = [ "parking_lot", "percent-encoding", "pgp", + "pretty_assertions", "pretty_env_logger", "proptest", "qrcodegen", @@ -1400,6 +1411,12 @@ dependencies = [ "cipher", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.9.0" @@ -3201,6 +3218,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "output_vt100" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" +dependencies = [ + "winapi", +] + [[package]] name = "overload" version = "0.1.1" @@ -3545,6 +3571,18 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "pretty_assertions" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +dependencies = [ + "ctor", + "diff", + "output_vt100", + "yansi", +] + [[package]] name = "pretty_env_logger" version = "0.4.0" @@ -5744,6 +5782,12 @@ dependencies = [ "libc", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "yasna" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 0ff02606f..02a35fed5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -104,6 +104,7 @@ proptest = { version = "1", default-features = false, features = ["std"] } tempfile = "3" testdir = "0.7.3" tokio = { version = "1", features = ["parking_lot", "rt-multi-thread", "macros"] } +pretty_assertions = "1.3.0" [workspace] members = [ diff --git a/src/test_utils.rs b/src/test_utils.rs index 4dc780371..d6278e206 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -3,8 +3,10 @@ //! This private module is only compiled for test runs. #![allow(clippy::indexing_slicing)] use std::collections::BTreeMap; +use std::fmt::Write; use std::ops::{Deref, DerefMut}; use std::panic; +use std::path::Path; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -12,11 +14,12 @@ use ansi_term::Color; use async_channel::{self as channel, Receiver, Sender}; use chat::ChatItem; use once_cell::sync::Lazy; +use pretty_assertions::assert_eq; use rand::Rng; use tempfile::{tempdir, TempDir}; use tokio::runtime::Handle; use tokio::sync::RwLock; -use tokio::task; +use tokio::{fs, task}; use crate::chat::{ self, add_to_chat_contacts_table, create_group_chat, Chat, ChatId, MessageListOptions, @@ -285,7 +288,7 @@ impl TestContext { println!("\n========== Chats of {}: ==========", self.name()); if let Ok(chats) = Chatlist::try_load(self, 0, None, None).await { for (chat, _) in chats.iter() { - self.print_chat(*chat).await; + print!("{}", self.display_chat(*chat).await); } } println!(); @@ -624,6 +627,28 @@ impl TestContext { res } + #[allow(unused)] + pub async fn golden_test_chat(&self, chat_id: ChatId, filename: &str) { + let filename = Path::new("test-data/golden/").join(filename); + + let actual = self.display_chat(chat_id).await; + + // We're using `unwrap_or_default()` here so that if the file doesn't exist, + // it can be created using `write` below. + let expected = fs::read(&filename).await.unwrap_or_default(); + let expected = String::from_utf8(expected).unwrap(); + if (std::env::var("UPDATE_GOLDEN_TESTS") == Ok("1".to_string())) && actual != expected { + fs::write(&filename, &actual) + .await + .unwrap_or_else(|e| panic!("Error writing {filename:?}: {e}")); + } else { + assert_eq!( + actual, expected, + "To update the expected value, run `UPDATE_GOLDEN_TESTS=1 cargo test`" + ); + } + } + /// Prints out the entire chat to stdout. /// /// You can use this to debug your test by printing the entire chat conversation. @@ -631,7 +656,9 @@ impl TestContext { // merge them to a public function in the `deltachat` crate. #[allow(dead_code)] #[allow(clippy::indexing_slicing)] - pub async fn print_chat(&self, chat_id: ChatId) { + async fn display_chat(&self, chat_id: ChatId) -> String { + let mut res = String::new(); + let msglist = chat::get_chat_msgs_ex( self, chat_id, @@ -662,7 +689,8 @@ impl TestContext { } else { format!("{} member(s)", members.len()) }; - println!( + writeln!( + res, "{}#{}: {} [{}]{}{}{} {}", sel_chat.typ, sel_chat.get_id(), @@ -686,32 +714,38 @@ impl TestContext { } else { "" }, - ); + ) + .unwrap(); let mut lines_out = 0; for msg_id in msglist { if msg_id == MsgId::new(DC_MSG_ID_DAYMARKER) { - println!( + writeln!(res, "--------------------------------------------------------------------------------" - ); + ) + .unwrap(); lines_out += 1 } else if !msg_id.is_special() { if lines_out == 0 { - println!( + writeln!(res, "--------------------------------------------------------------------------------", - ); + ).unwrap(); lines_out += 1 } let msg = Message::load_from_db(self, msg_id).await.unwrap(); - log_msg(self, "", &msg).await; + write_msg(self, "", &msg, &mut res).await; } } if lines_out > 0 { - println!( + writeln!( + res, "--------------------------------------------------------------------------------" - ); + ) + .unwrap(); } + + res } pub async fn create_group_with_members( @@ -1041,7 +1075,7 @@ fn print_event(event: &Event) { /// Logs an individual message to stdout. /// /// This includes a bunch of the message meta-data as well. -async fn log_msg(context: &Context, prefix: &str, msg: &Message) { +async fn write_msg(context: &Context, prefix: &str, msg: &Message, buf: &mut String) { let contact = match Contact::get_by_id(context, msg.get_from_id()).await { Ok(contact) => contact, Err(e) => { @@ -1061,7 +1095,8 @@ async fn log_msg(context: &Context, prefix: &str, msg: &Message) { _ => "", }; let msgtext = msg.get_text(); - println!( + writeln!( + buf, "{}{}{}{}: {} (Contact#{}): {} {}{}{}{}{}", prefix, msg.get_id(), @@ -1095,7 +1130,8 @@ async fn log_msg(context: &Context, prefix: &str, msg: &Message) { "" }, statestr, - ); + ) + .unwrap(); } #[cfg(test)] From 5b435d11c72495ff2fbde60af7a0795b33757e16 Mon Sep 17 00:00:00 2001 From: "Franz Heinzmann (Frando)" Date: Fri, 25 Nov 2022 15:24:25 +0100 Subject: [PATCH 108/528] feat(jsonrpc): generate OpenRPC definitions When running `cargo test` in the deltachat-jsonrpc folder, a new file `openrpc/openrpc.json` will be created with an [OpenRPC](https://spec.open-rpc.org/) definition. It can be copy-pasted into the [OpenRPC playground](https://playground.open-rpc.org/) and used to generate clients in other languages. --- Cargo.lock | 51 +++++++++++++++++-- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 3 +- deltachat-jsonrpc/src/api/mod.rs | 6 ++- deltachat-jsonrpc/src/api/types/account.rs | 2 +- deltachat-jsonrpc/src/api/types/chat.rs | 8 +-- deltachat-jsonrpc/src/api/types/chat_list.rs | 7 ++- deltachat-jsonrpc/src/api/types/contact.rs | 2 +- deltachat-jsonrpc/src/api/types/events.rs | 4 +- deltachat-jsonrpc/src/api/types/http.rs | 2 +- deltachat-jsonrpc/src/api/types/location.rs | 2 +- deltachat-jsonrpc/src/api/types/message.rs | 25 +++++---- .../src/api/types/provider_info.rs | 2 +- deltachat-jsonrpc/src/api/types/qr.rs | 2 +- deltachat-jsonrpc/src/api/types/reactions.rs | 4 +- deltachat-jsonrpc/src/api/types/webxdc.rs | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- 17 files changed, 88 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d186d0c17..2d7ac9ab5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1242,6 +1242,7 @@ dependencies = [ "log", "num-traits", "sanitize-filename", + "schemars", "serde", "serde_json", "tempfile", @@ -1514,6 +1515,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + [[package]] name = "ecdsa" version = "0.14.8" @@ -4248,6 +4255,30 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "schemars" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -4368,6 +4399,17 @@ dependencies = [ "syn 2.0.15", ] +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "serde_json" version = "1.0.96" @@ -5799,9 +5841,9 @@ dependencies = [ [[package]] name = "yerpc" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c26a804eaa30c1ff1a296dc6dd1a7d7c622750dafcd0d6b2ed5e3c5c3beb22" +checksum = "30fc983d32883ecb563227a2dcdcbe8567decd9c533b5ecca7e3099e2f7d4c96" dependencies = [ "anyhow", "async-channel", @@ -5811,6 +5853,7 @@ dependencies = [ "futures", "futures-util", "log", + "schemars", "serde", "serde_json", "tokio", @@ -5821,9 +5864,9 @@ dependencies = [ [[package]] name = "yerpc_derive" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd53ff9053698697b92c2535bf7ecb983fd5d546d690b7c725e5070d6d9a620" +checksum = "6d6b8ce490e8719fe84d7d80ad4d58572b2ea9d7a83d156f6afd6ab3ad5cfb94" dependencies = [ "convert_case 0.5.0", "darling 0.14.3", diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 5ccf92bcb..5d97eb66b 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -25,7 +25,7 @@ anyhow = "1" thiserror = "1" rand = "0.8" once_cell = "1.17.0" -yerpc = { version = "0.4.4", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose"] } [features] default = ["vendored"] diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 767a0ee90..14d01f29a 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -15,13 +15,14 @@ required-features = ["webserver"] anyhow = "1" deltachat = { path = ".." } num-traits = "0.2" +schemars = "0.8.11" serde = { version = "1.0", features = ["derive"] } tempfile = "3.3.0" log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } serde_json = "1.0.96" -yerpc = { version = "0.4.4", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose", "openrpc"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } tokio = { version = "1.28.0" } sanitize-filename = "0.4" diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index b71718299..fca691f29 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -144,7 +144,11 @@ impl CommandApi { } } -#[rpc(all_positional, ts_outdir = "typescript/generated")] +#[rpc( + all_positional, + ts_outdir = "typescript/generated", + openrpc_outdir = "openrpc" +)] impl CommandApi { /// Test function. async fn sleep(&self, delay: f64) { diff --git a/deltachat-jsonrpc/src/api/types/account.rs b/deltachat-jsonrpc/src/api/types/account.rs index 8e0f80aef..d27a53723 100644 --- a/deltachat-jsonrpc/src/api/types/account.rs +++ b/deltachat-jsonrpc/src/api/types/account.rs @@ -6,7 +6,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum Account { #[serde(rename_all = "camelCase")] diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index a658e26f3..d5f0b8c0b 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -13,7 +13,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; use super::contact::ContactObject; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct FullChat { id: u32, @@ -121,7 +121,7 @@ impl FullChat { /// - can_send /// /// used when you only need the basic metadata of a chat like type, name, profile picture -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct BasicChat { id: u32, @@ -166,7 +166,7 @@ impl BasicChat { } } -#[derive(Clone, Serialize, Deserialize, TypeDef)] +#[derive(Clone, Serialize, Deserialize, TypeDef, schemars::JsonSchema)] pub enum MuteDuration { NotMuted, Forever, @@ -191,7 +191,7 @@ impl MuteDuration { } } -#[derive(Clone, Serialize, Deserialize, TypeDef)] +#[derive(Clone, Serialize, Deserialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "ChatVisibility")] pub enum JSONRPCChatVisibility { Normal, diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index 5c63b5def..c7603de46 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -8,13 +8,16 @@ use deltachat::{ chatlist::Chatlist, }; use num_traits::cast::ToPrimitive; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; use super::message::MessageViewtype; -#[derive(Serialize, TypeDef)] +#[derive(Deserialize, Serialize, TypeDef, schemars::JsonSchema)] +pub struct ChatListEntry(pub u32, pub u32); + +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum ChatListItemFetchResult { #[serde(rename_all = "camelCase")] diff --git a/deltachat-jsonrpc/src/api/types/contact.rs b/deltachat-jsonrpc/src/api/types/contact.rs index d67fc7fb1..53b0ef67c 100644 --- a/deltachat-jsonrpc/src/api/types/contact.rs +++ b/deltachat-jsonrpc/src/api/types/contact.rs @@ -6,7 +6,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Contact", rename_all = "camelCase")] pub struct ContactObject { address: String, diff --git a/deltachat-jsonrpc/src/api/types/events.rs b/deltachat-jsonrpc/src/api/types/events.rs index 37e8c6317..892302a4f 100644 --- a/deltachat-jsonrpc/src/api/types/events.rs +++ b/deltachat-jsonrpc/src/api/types/events.rs @@ -2,7 +2,7 @@ use deltachat::{Event as CoreEvent, EventType as CoreEventType}; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct Event { /// Event payload. @@ -21,7 +21,7 @@ impl From for Event { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum EventType { /// The library-user may write an informational string to the log. diff --git a/deltachat-jsonrpc/src/api/types/http.rs b/deltachat-jsonrpc/src/api/types/http.rs index 3b9d29509..9121a677e 100644 --- a/deltachat-jsonrpc/src/api/types/http.rs +++ b/deltachat-jsonrpc/src/api/types/http.rs @@ -2,7 +2,7 @@ use deltachat::net::HttpResponse as CoreHttpResponse; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub struct HttpResponse { /// base64-encoded response body. blob: String, diff --git a/deltachat-jsonrpc/src/api/types/location.rs b/deltachat-jsonrpc/src/api/types/location.rs index 374e408d8..f610b42d3 100644 --- a/deltachat-jsonrpc/src/api/types/location.rs +++ b/deltachat-jsonrpc/src/api/types/location.rs @@ -2,7 +2,7 @@ use deltachat::location::Location; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Location", rename_all = "camelCase")] pub struct JsonrpcLocation { pub location_id: u32, diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index b030e7616..7ebcccc46 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -10,8 +10,7 @@ use deltachat::message::MsgId; use deltachat::message::Viewtype; use deltachat::reaction::get_msg_reactions; use num_traits::cast::ToPrimitive; -use serde::Deserialize; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; @@ -19,14 +18,14 @@ use super::contact::ContactObject; use super::reactions::JSONRPCReactions; use super::webxdc::WebxdcMessageInfo; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase", tag = "variant")] pub enum MessageLoadResult { Message(MessageObject), LoadingError { error: String }, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Message", rename_all = "camelCase")] pub struct MessageObject { id: u32, @@ -86,7 +85,7 @@ pub struct MessageObject { reactions: Option, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "kind")] enum MessageQuote { JustText { @@ -238,7 +237,7 @@ impl MessageObject { } } -#[derive(Serialize, Deserialize, TypeDef)] +#[derive(Serialize, Deserialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Viewtype")] pub enum MessageViewtype { Unknown, @@ -314,7 +313,7 @@ impl From for Viewtype { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub enum DownloadState { Done, Available, @@ -333,7 +332,7 @@ impl From for DownloadState { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub enum SystemMessageType { Unknown, GroupNameChanged, @@ -388,7 +387,7 @@ impl From for SystemMessageType { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageNotificationInfo { id: u32, @@ -446,7 +445,7 @@ impl MessageNotificationInfo { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageSearchResult { id: u32, @@ -507,7 +506,7 @@ impl MessageSearchResult { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase", rename = "MessageListItem", tag = "kind")] pub enum JSONRPCMessageListItem { Message { @@ -533,7 +532,7 @@ impl From for JSONRPCMessageListItem { } } -#[derive(Deserialize, TypeDef)] +#[derive(Deserialize, Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageData { pub text: Option, @@ -545,7 +544,7 @@ pub struct MessageData { pub quoted_message_id: Option, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageReadReceipt { pub contact_id: u32, diff --git a/deltachat-jsonrpc/src/api/types/provider_info.rs b/deltachat-jsonrpc/src/api/types/provider_info.rs index 1cc5a7d46..43b868444 100644 --- a/deltachat-jsonrpc/src/api/types/provider_info.rs +++ b/deltachat-jsonrpc/src/api/types/provider_info.rs @@ -3,7 +3,7 @@ use num_traits::cast::ToPrimitive; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct ProviderInfo { pub before_login_hint: String, diff --git a/deltachat-jsonrpc/src/api/types/qr.rs b/deltachat-jsonrpc/src/api/types/qr.rs index 607b495ec..d53ebeab5 100644 --- a/deltachat-jsonrpc/src/api/types/qr.rs +++ b/deltachat-jsonrpc/src/api/types/qr.rs @@ -2,7 +2,7 @@ use deltachat::qr::Qr; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Qr", rename_all = "camelCase")] #[serde(tag = "type")] pub enum QrObject { diff --git a/deltachat-jsonrpc/src/api/types/reactions.rs b/deltachat-jsonrpc/src/api/types/reactions.rs index d068b23c5..37739c848 100644 --- a/deltachat-jsonrpc/src/api/types/reactions.rs +++ b/deltachat-jsonrpc/src/api/types/reactions.rs @@ -6,7 +6,7 @@ use serde::Serialize; use typescript_type_def::TypeDef; /// A single reaction emoji. -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Reaction", rename_all = "camelCase")] pub struct JSONRPCReaction { /// Emoji. @@ -20,7 +20,7 @@ pub struct JSONRPCReaction { } /// Structure representing all reactions to a particular message. -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Reactions", rename_all = "camelCase")] pub struct JSONRPCReactions { /// Map from a contact to it's reaction to message. diff --git a/deltachat-jsonrpc/src/api/types/webxdc.rs b/deltachat-jsonrpc/src/api/types/webxdc.rs index f89310667..71db9ed93 100644 --- a/deltachat-jsonrpc/src/api/types/webxdc.rs +++ b/deltachat-jsonrpc/src/api/types/webxdc.rs @@ -8,7 +8,7 @@ use typescript_type_def::TypeDef; use super::maybe_empty_string_to_option; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "WebxdcMessageInfo", rename_all = "camelCase")] pub struct WebxdcMessageInfo { /// The name of the app. diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index b1f8151fb..48146f39b 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -21,7 +21,7 @@ serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.28.0", features = ["io-std"] } tokio-util = "0.7.8" -yerpc = { version = "0.4.0", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose"] } [features] default = ["vendored"] From dd29fae49b0cc9a95cc5bf049b338f052acd5d4a Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 31 May 2023 19:00:20 +0000 Subject: [PATCH 109/528] fix: update `h2` to fix RUSTSEC-2023-0034 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31d64f26e..52e2ea0a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1974,9 +1974,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.16" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", From 3eddc9164cb32e6b0777bbfbc4d75da4f4cec94e Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 24 May 2023 22:01:58 +0000 Subject: [PATCH 110/528] fix: disable `fetch_existing_msgs` setting by default This caused too many problems after switching the default setting for `show_emails` from DC_SHOW_EMAILS_OFF to DC_SHOW_EMAILS_ALL in There is a topic on the forum with multiple requests to revert this setting due to old emails being downloaded. --- src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 035caf314..277adc6cb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -145,7 +145,7 @@ pub enum Config { /// If set to "1", on the first time `start_io()` is called after configuring, /// the newest existing messages are fetched. /// Existing recipients are added to the contact database regardless of this setting. - #[strum(props(default = "1"))] + #[strum(props(default = "0"))] FetchExistingMsgs, /// If set to "1", then existing messages are considered to be already fetched. From 0f579c6415adca6fbc54e5db454dfac4dfc05df7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 1 Jun 2023 12:24:18 +0000 Subject: [PATCH 111/528] chore(release): prepare for 1.112.10 --- CHANGELOG.md | 7 +++++++ Cargo.lock | 10 +++++----- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 20 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cd9e08f0..07b4fc00f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.112.10] - 2023-06-01 + +### Fixes + +- Disable `fetch_existing_msgs` setting by default. +- Update `h2` to fix RUSTSEC-2023-0034. + ## [1.112.9] - 2023-05-12 ### Fixes diff --git a/Cargo.lock b/Cargo.lock index 52e2ea0a3..011e95bca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.9" +version = "1.112.10" dependencies = [ "ansi_term", "anyhow", @@ -1124,7 +1124,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.112.9" +version = "1.112.10" dependencies = [ "anyhow", "async-channel", @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.112.9" +version = "1.112.10" dependencies = [ "ansi_term", "anyhow", @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.112.9" +version = "1.112.10" dependencies = [ "anyhow", "deltachat", @@ -1186,7 +1186,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.112.9" +version = "1.112.10" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index 946470d5d..2ed1bfd7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.112.9" +version = "1.112.10" edition = "2021" license = "MPL-2.0" rust-version = "1.64" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index f9b9afd1e..1cacc02c1 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.112.9" +version = "1.112.10" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 5c160d6e1..6fd864e42 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.112.9" +version = "1.112.10" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 1a30a2cba..7a7191414 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.112.9" + "version": "1.112.10" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index cd1c102ff..884441481 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.112.9" +version = "1.112.10" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 5cf9161a4..35616a064 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.112.9" +version = "1.112.10" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index cf4c24ea9..dd73a5df3 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.112.9" + "version": "1.112.10" } diff --git a/release-date.in b/release-date.in index 554b7f5f6..4c3400c52 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-05-12 \ No newline at end of file +2023-06-01 \ No newline at end of file From 646ace8e7a2aa2dac32c10c42d3a4b2c6457fcf7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 1 Jun 2023 12:54:12 +0000 Subject: [PATCH 112/528] chore: add link to the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20b10345e..bc5cc9b99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2493,6 +2493,7 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.112.7]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.6...v1.112.7 [1.112.8]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.7...v1.112.8 [1.112.9]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.8...v1.112.9 +[1.112.10]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.9...v1.112.10 [1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.9...v1.113.0 [1.114.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 [1.115.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.114.0...v1.115.0 From f2b02b7bb0c0cfbdeb32cad0966c20c66ae13bbd Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 1 Jun 2023 19:50:42 +0000 Subject: [PATCH 113/528] docs: document how to get Concourse CI secrets from `pass` --- scripts/concourse/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/concourse/README.md b/scripts/concourse/README.md index b022d9bc4..ad1882f41 100644 --- a/scripts/concourse/README.md +++ b/scripts/concourse/README.md @@ -12,10 +12,15 @@ where `secret.yml` contains the following secrets: ``` c.delta.chat: private_key: | - -----BEGIN RSA PRIVATE KEY----- + -----BEGIN OPENSSH PRIVATE KEY----- ... - -----END RSA PRIVATE KEY----- + -----END OPENSSH PRIVATE KEY----- devpi: login: dc password: ... ``` + +Secrets can be read from the password manager: +``` +fly -t b1 set-pipeline -c docs_wheels.yml -p docs_wheels -l <(pass show delta/b1.delta.chat/secret.yml) +``` From 31e19ca56c63d7051aecf88b667e6288d2cffd3d Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 10:28:58 +0000 Subject: [PATCH 114/528] chore(cargo): bump regex from 1.8.1 to 1.8.3 --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 179ac7273..3ad10f7fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3927,13 +3927,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-syntax 0.7.2", ] [[package]] @@ -3953,9 +3953,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "reqwest" From 136e9179e9dbfb1d37c533f24821d1f326482b24 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 10:30:34 +0000 Subject: [PATCH 115/528] ci(dependabot): use `chore` prefix for dependency updates --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4225c7453..9623db596 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,5 +5,5 @@ updates: schedule: interval: "monthly" commit-message: - prefix: "cargo" + prefix: "chore(cargo)" open-pull-requests-limit: 50 From fc82d728fc58907180a667775e433485f95f9a74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 10:31:34 +0000 Subject: [PATCH 116/528] cargo: bump reqwest from 0.11.17 to 0.11.18 Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.17 to 0.11.18. - [Release notes](https://github.com/seanmonstar/reqwest/releases) - [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md) - [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.17...v0.11.18) --- updated-dependencies: - dependency-name: reqwest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ad10f7fb..423d38353 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3959,9 +3959,9 @@ checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "reqwest" -version = "0.11.17" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64 0.21.0", "bytes", diff --git a/Cargo.toml b/Cargo.toml index 02a35fed5..d71352848 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,7 @@ qrcodegen = "1.7.0" quick-xml = "0.28" rand = "0.8" regex = "1.8" -reqwest = { version = "0.11.17", features = ["json"] } +reqwest = { version = "0.11.18", features = ["json"] } rusqlite = { version = "0.29", features = ["sqlcipher"] } rust-hsluv = "0.1" sanitize-filename = "0.4" From 5340a7d0339f9667ceb3eb8ff985139fb4f750b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 10:31:52 +0000 Subject: [PATCH 117/528] cargo: bump syn from 2.0.15 to 2.0.18 Bumps [syn](https://github.com/dtolnay/syn) from 2.0.15 to 2.0.18. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.15...2.0.18) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ad10f7fb..f534b5a37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -270,7 +270,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -1289,7 +1289,7 @@ name = "deltachat_derive" version = "2.0.0" dependencies = [ "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -2083,7 +2083,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -3635,9 +3635,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.55" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0dd4be24fcdcfeaa12a432d588dc59bbad6cad3510c67e74a2b6b2fc950564" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] @@ -3755,9 +3755,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -4396,7 +4396,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -4714,9 +4714,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -4846,7 +4846,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -4959,7 +4959,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] From 4255ae4c2d4a1e2c5c7178043aac3fbf29fe3ca8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 11:05:57 +0000 Subject: [PATCH 118/528] cargo: bump log from 0.4.17 to 0.4.18 Bumps [log](https://github.com/rust-lang/log) from 0.4.17 to 0.4.18. - [Release notes](https://github.com/rust-lang/log/releases) - [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/log/compare/0.4.17...0.4.18) --- updated-dependencies: - dependency-name: log dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 7 ++----- deltachat-repl/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9f613ecf..f8184a4a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2747,12 +2747,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "lru-cache" diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 6ef28ef05..f0c06d7c0 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -9,7 +9,7 @@ ansi_term = "0.12.1" anyhow = "1" deltachat = { path = "..", features = ["internals"]} dirs = "5" -log = "0.4.16" +log = "0.4.18" pretty_env_logger = "0.4" rusqlite = "0.29" rustyline = "11" From de3c82ef4368929a284bf19e0db8d2a8cf0dbbf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:49:25 +0000 Subject: [PATCH 119/528] cargo: bump toml from 0.7.3 to 0.7.4 Bumps [toml](https://github.com/toml-rs/toml) from 0.7.3 to 0.7.4. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.7.3...toml-v0.7.4) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8184a4a6..6bb9721d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4429,9 +4429,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" dependencies = [ "serde", ] @@ -5038,9 +5038,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" dependencies = [ "serde", "serde_spanned", @@ -5050,18 +5050,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ "indexmap", "serde", @@ -5767,9 +5767,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] From 472195c7d92e780c246e3cdcc1bf8da663625c15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:26:34 +0000 Subject: [PATCH 120/528] cargo: bump serde from 1.0.160 to 1.0.163 Bumps [serde](https://github.com/serde-rs/serde) from 1.0.160 to 1.0.163. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.160...v1.0.163) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6bb9721d0..2d2ba525f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4360,9 +4360,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] @@ -4387,9 +4387,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", From 3b6d21301b92bb638603e222509020a6cd07d999 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 16:50:15 +0000 Subject: [PATCH 121/528] ci: remove broken `node-delete-preview.yml` workflow Old previews should be deleted by the cronjob running on the `download.delta.chat` server. --- .github/workflows/node-delete-preview.yml | 31 ----------------------- 1 file changed, 31 deletions(-) delete mode 100644 .github/workflows/node-delete-preview.yml diff --git a/.github/workflows/node-delete-preview.yml b/.github/workflows/node-delete-preview.yml deleted file mode 100644 index 34ba9477f..000000000 --- a/.github/workflows/node-delete-preview.yml +++ /dev/null @@ -1,31 +0,0 @@ -# documentation: https://github.com/deltachat/sysadmin/tree/master/download.delta.chat -name: Delete node PR previews - -on: - pull_request: - types: [closed] - -jobs: - delete: - runs-on: ubuntu-latest - - steps: - - name: Get Pull Request ID - id: getid - run: | - export PULLREQUEST_ID=$(jq .number < $GITHUB_EVENT_PATH) - echo "prid=$PULLREQUEST_ID" >> $GITHUB_OUTPUT - - name: Renaming - run: | - # create empty file to copy it over the outdated deliverable on download.delta.chat - echo "This preview build is outdated and has been removed." > empty - cp empty deltachat-node-${{ steps.getid.outputs.prid }}.tar.gz - - name: Replace builds with dummy files - uses: horochx/deploy-via-scp@v1.0.1 - with: - user: ${{ secrets.USERNAME }} - key: ${{ secrets.SSH_KEY }} - host: "download.delta.chat" - port: 22 - local: "deltachat-node-${{ steps.getid.outputs.prid }}.tar.gz" - remote: "/var/www/html/download/node/preview/" From 55bc556bcfad1b3c39688c74f843d09a9280fc95 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 17:00:27 +0000 Subject: [PATCH 122/528] ci: use working-directory instead of `cd` command --- .../workflows/jsonrpc-client-npm-package.yml | 7 +++--- .github/workflows/jsonrpc.yml | 25 ++++++++----------- .github/workflows/node-docs.yml | 2 +- .github/workflows/node-package.yml | 7 +++--- .github/workflows/node-tests.yml | 15 +++++------ 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/.github/workflows/jsonrpc-client-npm-package.yml b/.github/workflows/jsonrpc-client-npm-package.yml index 57ec35095..8d371c6d6 100644 --- a/.github/workflows/jsonrpc-client-npm-package.yml +++ b/.github/workflows/jsonrpc-client-npm-package.yml @@ -38,13 +38,12 @@ jobs: node --version echo $DELTACHAT_JSONRPC_TAR_GZ - name: Install dependencies without running scripts - run: | - cd deltachat-jsonrpc/typescript - npm install --ignore-scripts + working-directory: deltachat-jsonrpc/typescript + run: npm install --ignore-scripts - name: Package shell: bash + working-directory: deltachat-jsonrpc/typescript run: | - cd deltachat-jsonrpc/typescript npm run build npm pack . ls -lah diff --git a/.github/workflows/jsonrpc.yml b/.github/workflows/jsonrpc.yml index 692150cd7..5f55ab529 100644 --- a/.github/workflows/jsonrpc.yml +++ b/.github/workflows/jsonrpc.yml @@ -22,24 +22,19 @@ jobs: - name: Add Rust cache uses: Swatinem/rust-cache@v2 - name: npm install - run: | - cd deltachat-jsonrpc/typescript - npm install + working-directory: deltachat-jsonrpc/typescript + run: npm install - name: Build TypeScript, run Rust tests, generate bindings - run: | - cd deltachat-jsonrpc/typescript - npm run build + working-directory: deltachat-jsonrpc/typescript + run: npm run build - name: Run integration tests - run: | - cd deltachat-jsonrpc/typescript - npm run test + working-directory: deltachat-jsonrpc/typescript + run: npm run test env: DCC_NEW_TMP_EMAIL: ${{ secrets.DCC_NEW_TMP_EMAIL }} - name: make sure websocket server version still builds - run: | - cd deltachat-jsonrpc - cargo build --bin deltachat-jsonrpc-server --features webserver + working-directory: deltachat-jsonrpc + run: cargo build --bin deltachat-jsonrpc-server --features webserver - name: Run linter - run: | - cd deltachat-jsonrpc/typescript - npm run prettier:check + working-directory: deltachat-jsonrpc/typescript + run: npm run prettier:check diff --git a/.github/workflows/node-docs.yml b/.github/workflows/node-docs.yml index 1cd1a60d4..1778d7d74 100644 --- a/.github/workflows/node-docs.yml +++ b/.github/workflows/node-docs.yml @@ -17,8 +17,8 @@ jobs: node-version: 16.x - name: npm install and generate documentation + working-directory: node run: | - cd node npm i --ignore-scripts npx typedoc mv docs js diff --git a/.github/workflows/node-package.yml b/.github/workflows/node-package.yml index 7575de84d..da2139e96 100644 --- a/.github/workflows/node-package.yml +++ b/.github/workflows/node-package.yml @@ -46,13 +46,12 @@ jobs: - name: Install dependencies & build if: steps.cache.outputs.cache-hit != 'true' - run: | - cd node - npm install --verbose + working-directory: node + run: npm install --verbose - name: Build Prebuild + working-directory: node run: | - cd node npm run prebuildify tar -zcvf "${{ matrix.os }}.tar.gz" -C prebuilds . diff --git a/.github/workflows/node-tests.yml b/.github/workflows/node-tests.yml index 62ab1d0fd..c12c6d780 100644 --- a/.github/workflows/node-tests.yml +++ b/.github/workflows/node-tests.yml @@ -52,25 +52,22 @@ jobs: - name: Install dependencies & build if: steps.cache.outputs.cache-hit != 'true' - run: | - cd node - npm install --verbose + working-directory: node + run: npm install --verbose - name: Test timeout-minutes: 10 if: runner.os != 'Windows' - run: | - cd node - npm run test + working-directory: node + run: npm run test env: DCC_NEW_TMP_EMAIL: ${{ secrets.DCC_NEW_TMP_EMAIL }} NODE_OPTIONS: "--force-node-api-uncaught-exceptions-policy=true" - name: Run tests on Windows, except lint timeout-minutes: 10 if: runner.os == 'Windows' - run: | - cd node - npm run test:mocha + working-directory: node + run: npm run test:mocha env: DCC_NEW_TMP_EMAIL: ${{ secrets.DCC_NEW_TMP_EMAIL }} NODE_OPTIONS: "--force-node-api-uncaught-exceptions-policy=true" From 8ea8ee02edad13be47773873733d33d70e8a13f3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 18:41:17 +0000 Subject: [PATCH 123/528] ci: add top comments to GH Actions workflows --- .github/workflows/ci.yml | 4 ++++ .github/workflows/deltachat-rpc-server.yml | 8 +++++++- .github/workflows/dependabot.yml | 3 +++ .github/workflows/node-docs.yml | 5 +++++ .github/workflows/node-tests.yml | 3 +++ .github/workflows/repl.yml | 3 ++- .github/workflows/upload-ffi-docs.yml | 4 ++++ 7 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed1e3a2f2..9605fe5e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,3 +1,7 @@ +# GitHub Actions workflow to +# lint Rust and Python code +# and run Rust tests, Python tests and async Python tests. + name: Rust CI # Cancel previously started workflow runs diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 9d3ae523a..59530701c 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -1,4 +1,10 @@ -# Manually triggered action to build deltachat-rpc-server binaries. +# GitHub Actions workflow +# to build `deltachat-rpc-server` binaries +# and upload them to the release. +# +# The workflow is automatically triggered on releases. +# It can also be triggered manually +# to produce binary artifacts for testing. name: Build deltachat-rpc-server binaries diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index 174f6096e..3c24454fa 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -1,3 +1,6 @@ +# GitHub Actions workflow +# to automatically approve PRs made by Dependabot. + name: Dependabot auto-approve on: pull_request diff --git a/.github/workflows/node-docs.yml b/.github/workflows/node-docs.yml index 1778d7d74..86ff68eee 100644 --- a/.github/workflows/node-docs.yml +++ b/.github/workflows/node-docs.yml @@ -1,3 +1,8 @@ +# GitHub Actions workflow to build +# Node.js bindings documentation +# and upload it to the web server. +# Built documentation is available at + name: Generate & upload node.js documentation on: diff --git a/.github/workflows/node-tests.yml b/.github/workflows/node-tests.yml index c12c6d780..5ae053ef8 100644 --- a/.github/workflows/node-tests.yml +++ b/.github/workflows/node-tests.yml @@ -1,3 +1,6 @@ +# GitHub Actions workflow +# to test Node.js bindings. + name: "node.js tests" # Cancel previously started workflow runs diff --git a/.github/workflows/repl.yml b/.github/workflows/repl.yml index a3d391fe2..ee71ef2f9 100644 --- a/.github/workflows/repl.yml +++ b/.github/workflows/repl.yml @@ -1,4 +1,5 @@ -# Manually triggered action to build a Windows repl.exe which users can +# Manually triggered GitHub Actions workflow +# to build a Windows repl.exe which users can # download to debug complex bugs. name: Build Windows REPL .exe diff --git a/.github/workflows/upload-ffi-docs.yml b/.github/workflows/upload-ffi-docs.yml index c230b715e..9acca2f98 100644 --- a/.github/workflows/upload-ffi-docs.yml +++ b/.github/workflows/upload-ffi-docs.yml @@ -1,3 +1,7 @@ +# GitHub Actions workflow +# to build `deltachat_fii` crate documentation +# and upload it to + name: Build & Deploy Documentation on cffi.delta.chat on: From b06c8baa9ce0ef1181a29c80668e312fcc2be429 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 4 Jun 2023 09:17:07 +0000 Subject: [PATCH 124/528] chore(cargo): bump pretty_env_logger from 0.4.0 to 0.5.0 --- Cargo.lock | 34 ++++++---------------------------- Cargo.toml | 4 ++-- deltachat-repl/Cargo.toml | 2 +- deny.toml | 2 -- 4 files changed, 9 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d2ba525f..dce0f44b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1237,7 +1237,7 @@ dependencies = [ "axum", "base64 0.21.0", "deltachat", - "env_logger 0.10.0", + "env_logger", "futures", "log", "num-traits", @@ -1274,7 +1274,7 @@ dependencies = [ "anyhow", "deltachat", "deltachat-jsonrpc", - "env_logger 0.10.0", + "env_logger", "futures-lite", "log", "serde", @@ -1791,26 +1791,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" dependencies = [ - "humantime 2.1.0", + "humantime", "is-terminal", "log", "regex", @@ -2354,15 +2341,6 @@ dependencies = [ "libm 0.2.6", ] -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - [[package]] name = "humantime" version = "2.1.0" @@ -3589,11 +3567,11 @@ dependencies = [ [[package]] name = "pretty_env_logger" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ - "env_logger 0.7.1", + "env_logger", "log", ] diff --git a/Cargo.toml b/Cargo.toml index d71352848..bdd8c7635 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ once_cell = "1.17.0" percent-encoding = "2.2" parking_lot = "0.12" pgp = { version = "0.10", default-features = false } -pretty_env_logger = { version = "0.4", optional = true } +pretty_env_logger = { version = "0.5", optional = true } qrcodegen = "1.7.0" quick-xml = "0.28" rand = "0.8" @@ -99,7 +99,7 @@ ansi_term = "0.12.0" criterion = { version = "0.4.0", features = ["async_tokio"] } futures-lite = "1.13" log = "0.4" -pretty_env_logger = "0.4" +pretty_env_logger = "0.5" proptest = { version = "1", default-features = false, features = ["std"] } tempfile = "3" testdir = "0.7.3" diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index f0c06d7c0..88285999d 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -10,7 +10,7 @@ anyhow = "1" deltachat = { path = "..", features = ["internals"]} dirs = "5" log = "0.4.18" -pretty_env_logger = "0.4" +pretty_env_logger = "0.5" rusqlite = "0.29" rustyline = "11" tokio = { version = "1", features = ["fs", "rt-multi-thread", "macros"] } diff --git a/deny.toml b/deny.toml index 91a21cf19..aadc55123 100644 --- a/deny.toml +++ b/deny.toml @@ -28,10 +28,8 @@ skip = [ { name = "digest", version = "<0.10" }, { name = "ed25519-dalek", version = "1.0.1" }, { name = "ed25519", version = "1.5.3" }, - { name = "env_logger", version = "<0.10" }, { name = "getrandom", version = "<0.2" }, { name = "hermit-abi", version = "<0.3" }, - { name = "humantime", version = "<2.1" }, { name = "idna", version = "<0.3" }, { name = "libm", version = "0.1.4" }, { name = "pem-rfc7468", version = "0.6.0" }, From 31f27660746d28ea605991e4fd2dbffd65319a65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 10:33:01 +0000 Subject: [PATCH 125/528] cargo: bump base64 from 0.21.0 to 0.21.2 Bumps [base64](https://github.com/marshallpierce/rust-base64) from 0.21.0 to 0.21.2. - [Changelog](https://github.com/marshallpierce/rust-base64/blob/master/RELEASE-NOTES.md) - [Commits](https://github.com/marshallpierce/rust-base64/compare/v0.21.0...v0.21.2) --- updated-dependencies: - dependency-name: base64 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dce0f44b8..9dead8c6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -209,7 +209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d11e163a705d0c809dfc886eee95df5117c758539c940c0fe9aa3aa4da5388ce" dependencies = [ "async-channel", - "base64 0.21.0", + "base64 0.21.2", "byte-pool", "chrono", "futures", @@ -312,7 +312,7 @@ checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" dependencies = [ "async-trait", "axum-core", - "base64 0.21.0", + "base64 0.21.2", "bitflags 1.3.2", "bytes", "futures-util", @@ -403,9 +403,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" @@ -1164,7 +1164,7 @@ dependencies = [ "async-smtp", "async_zip", "backtrace", - "base64 0.21.0", + "base64 0.21.2", "brotli", "chrono", "criterion", @@ -1235,7 +1235,7 @@ dependencies = [ "anyhow", "async-channel", "axum", - "base64 0.21.0", + "base64 0.21.2", "deltachat", "env_logger", "futures", @@ -2533,7 +2533,7 @@ checksum = "e4fb9858c8cd3dd924a5da5bc511363845a9bcfdfac066bb2ef8454eb6111546" dependencies = [ "abao", "anyhow", - "base64 0.21.0", + "base64 0.21.2", "blake3", "bytes", "default-net", @@ -3346,7 +3346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a79d6411154d1a9908e7a2c4bac60a5742f6125823c2c30780c7039aef02f0" dependencies = [ "aes", - "base64 0.21.0", + "base64 0.21.2", "bitfield", "block-padding", "blowfish", @@ -3938,7 +3938,7 @@ version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "bytes", "encoding_rs", "futures-core", @@ -4158,7 +4158,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", ] [[package]] From bae61746f86c0a70985c1a569f97c6a4e33e36d1 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 3 Jun 2023 16:36:44 +0000 Subject: [PATCH 126/528] fix: build deltachat-node prebuilds on Debian 10 This reduces glibc version requirement and makes sure it does not increase as Ubuntu version on CI runners is updated. --- .github/workflows/node-package.yml | 80 +++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/.github/workflows/node-package.yml b/.github/workflows/node-package.yml index da2139e96..50256ec04 100644 --- a/.github/workflows/node-package.yml +++ b/.github/workflows/node-package.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, macos-latest, windows-latest] + os: [macos-latest, windows-latest] steps: - name: Checkout uses: actions/checkout@v3 @@ -61,10 +61,76 @@ jobs: name: ${{ matrix.os }} path: node/${{ matrix.os }}.tar.gz + prebuild-linux: + name: Prebuild Linux + runs-on: ubuntu-latest + container: debian:10 + steps: + # Working directory is owned by 1001:1001 by default. + # Change it to our user. + - name: Change working directory owner + run: chown root:root . + + - name: Checkout + uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "16" + - run: apt-get update + + # Python is needed for node-gyp + - name: Install curl, python and compilers + run: apt-get install -y curl build-essential python3 + - name: Install Rust + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + - name: System info + run: | + rustc -vV + rustup -vV + cargo -vV + npm --version + node --version + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: | + ${{ env.APPDATA }}/npm-cache + ~/.npm + key: ${{ matrix.os }}-node-${{ hashFiles('**/package.json') }} + + - name: Cache cargo index + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry/ + ~/.cargo/git + target + key: ${{ matrix.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}-2 + + - name: Install dependencies & build + if: steps.cache.outputs.cache-hit != 'true' + working-directory: node + run: npm install --verbose + + - name: Build Prebuild + working-directory: node + run: | + npm run prebuildify + tar -zcvf "linux.tar.gz" -C prebuilds . + + - name: Upload Prebuild + uses: actions/upload-artifact@v3 + with: + name: linux + path: node/linux.tar.gz + pack-module: - needs: prebuild + needs: [prebuild, prebuild-linux] name: Package deltachat-node and upload to download.delta.chat - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: Install tree run: sudo apt install tree @@ -95,10 +161,10 @@ jobs: npm --version node --version echo $DELTACHAT_NODE_TAR_GZ - - name: Download Ubuntu prebuild + - name: Download Linux prebuild uses: actions/download-artifact@v1 with: - name: ubuntu-20.04 + name: linux - name: Download macOS prebuild uses: actions/download-artifact@v1 with: @@ -110,11 +176,11 @@ jobs: - shell: bash run: | mkdir node/prebuilds - tar -xvzf ubuntu-20.04/ubuntu-20.04.tar.gz -C node/prebuilds + tar -xvzf linux/linux.tar.gz -C node/prebuilds tar -xvzf macos-latest/macos-latest.tar.gz -C node/prebuilds tar -xvzf windows-latest/windows-latest.tar.gz -C node/prebuilds tree node/prebuilds - rm -rf ubuntu-20.04 macos-latest windows-latest + rm -rf linux macos-latest windows-latest - name: Install dependencies without running scripts run: | npm install --ignore-scripts From bcd6c226f6e418a8f72d2dff1414f4a2e904ae51 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 4 Jun 2023 13:30:24 +0000 Subject: [PATCH 127/528] ci: document why node prebuilds are built in a container --- .github/workflows/node-package.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/node-package.yml b/.github/workflows/node-package.yml index 50256ec04..41c4ff25d 100644 --- a/.github/workflows/node-package.yml +++ b/.github/workflows/node-package.yml @@ -64,6 +64,9 @@ jobs: prebuild-linux: name: Prebuild Linux runs-on: ubuntu-latest + + # Build Linux prebuilds inside a container with old glibc for backwards compatibility. + # Debian 10 contained glibc 2.28 at the time of the writing (2023-06-04): https://packages.debian.org/buster/libc6 container: debian:10 steps: # Working directory is owned by 1001:1001 by default. From d96b78390932726338c81fddd81aadae63f793f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 13:41:48 +0000 Subject: [PATCH 128/528] cargo: bump chrono from 0.4.24 to 0.4.26 Bumps [chrono](https://github.com/chronotope/chrono) from 0.4.24 to 0.4.26. - [Release notes](https://github.com/chronotope/chrono/releases) - [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md) - [Commits](https://github.com/chronotope/chrono/compare/v0.4.24...v0.4.26) --- updated-dependencies: - dependency-name: chrono dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9dead8c6c..50dd1b94e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,6 +88,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -655,13 +661,13 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "time 0.1.45", "wasm-bindgen", From dd30f6ab7ddeae98c651a62ee567d085674915ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:24:16 +0000 Subject: [PATCH 129/528] cargo: bump tokio from 1.28.0 to 1.28.2 Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.28.0 to 1.28.2. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.28.0...tokio-1.28.2) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- deltachat-jsonrpc/Cargo.toml | 4 ++-- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50dd1b94e..41a5b8581 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4905,9 +4905,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 14d01f29a..3e562debd 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -24,7 +24,7 @@ futures = { version = "0.3.28" } serde_json = "1.0.96" yerpc = { version = "0.5.1", features = ["anyhow_expose", "openrpc"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } -tokio = { version = "1.28.0" } +tokio = { version = "1.28.2" } sanitize-filename = "0.4" walkdir = "2.3.3" base64 = "0.21" @@ -34,7 +34,7 @@ axum = { version = "0.6.18", optional = true, features = ["ws"] } env_logger = { version = "0.10.0", optional = true } [dev-dependencies] -tokio = { version = "1.28.0", features = ["full", "rt-multi-thread"] } +tokio = { version = "1.28.2", features = ["full", "rt-multi-thread"] } [features] diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 48146f39b..b54a8e620 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -19,7 +19,7 @@ futures-lite = "1.13.0" log = "0.4" serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.28.0", features = ["io-std"] } +tokio = { version = "1.28.2", features = ["io-std"] } tokio-util = "0.7.8" yerpc = { version = "0.5.1", features = ["anyhow_expose"] } From 88a62e1f6e9ed1cf88bfbc02ea3dcbcc9155405f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:24:50 +0000 Subject: [PATCH 130/528] chore(cargo): bump libc from 0.2.142 to 0.2.145 Bumps [libc](https://github.com/rust-lang/libc) from 0.2.142 to 0.2.145. - [Release notes](https://github.com/rust-lang/libc/releases) - [Commits](https://github.com/rust-lang/libc/compare/0.2.142...0.2.145) --- updated-dependencies: - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50dd1b94e..f140d402f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2670,9 +2670,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.142" +version = "0.2.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" [[package]] name = "libm" From bc521a685dce9972d05fb3a8550a99b18427ec48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 18:11:23 +0000 Subject: [PATCH 131/528] chore(cargo): bump once_cell from 1.17.1 to 1.18.0 Bumps [once_cell](https://github.com/matklad/once_cell) from 1.17.1 to 1.18.0. - [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md) - [Commits](https://github.com/matklad/once_cell/compare/v1.17.1...v1.18.0) --- updated-dependencies: - dependency-name: once_cell dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f96426e0d..af230d435 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3089,9 +3089,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oorandom" diff --git a/Cargo.toml b/Cargo.toml index bdd8c7635..cd4f11adb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,7 +61,7 @@ mime = "0.3.17" num_cpus = "1.15" num-derive = "0.3" num-traits = "0.2" -once_cell = "1.17.0" +once_cell = "1.18.0" percent-encoding = "2.2" parking_lot = "0.12" pgp = { version = "0.10", default-features = false } diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 5d97eb66b..0934b58ec 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -24,7 +24,7 @@ tokio = { version = "1", features = ["rt-multi-thread"] } anyhow = "1" thiserror = "1" rand = "0.8" -once_cell = "1.17.0" +once_cell = "1.18.0" yerpc = { version = "0.5.1", features = ["anyhow_expose"] } [features] From 4beba8ce3c890d3d1ff9b8f9bc73952e5340a801 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 19:22:36 +0000 Subject: [PATCH 132/528] chore(gitattributes): configure LF line endings for JavaScript files --- .gitattributes | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitattributes b/.gitattributes index 1359bb5fc..ccc76301f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,6 +2,14 @@ # ensures this even if the user has not set core.autocrlf. * text=auto +# Checkout JavaScript files with LF line endings +# to prevent `prettier` from reporting errors on Windows. +*.js eol=lf +*.jsx eol=lf +*.ts eol=lf +*.tsx eol=lf +*.json eol=lf + # This directory contains email messages verbatim, and changing CRLF to # LF will corrupt them. test-data/** text=false From e0b16444886cede8cf8d6ad8b41b5bd26674be68 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 2 Jun 2023 18:49:53 +0000 Subject: [PATCH 133/528] ci: run node.js lint on Windows --- .github/workflows/node-tests.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/node-tests.yml b/.github/workflows/node-tests.yml index 5ae053ef8..6581be005 100644 --- a/.github/workflows/node-tests.yml +++ b/.github/workflows/node-tests.yml @@ -60,17 +60,8 @@ jobs: - name: Test timeout-minutes: 10 - if: runner.os != 'Windows' working-directory: node run: npm run test env: DCC_NEW_TMP_EMAIL: ${{ secrets.DCC_NEW_TMP_EMAIL }} NODE_OPTIONS: "--force-node-api-uncaught-exceptions-policy=true" - - name: Run tests on Windows, except lint - timeout-minutes: 10 - if: runner.os == 'Windows' - working-directory: node - run: npm run test:mocha - env: - DCC_NEW_TMP_EMAIL: ${{ secrets.DCC_NEW_TMP_EMAIL }} - NODE_OPTIONS: "--force-node-api-uncaught-exceptions-policy=true" From 84888fa4c401ce2b4fc385d78102777643467607 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 22:42:06 +0000 Subject: [PATCH 134/528] cargo: bump proptest from 1.1.0 to 1.2.0 Bumps [proptest](https://github.com/proptest-rs/proptest) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/proptest-rs/proptest/releases) - [Changelog](https://github.com/proptest-rs/proptest/blob/master/CHANGELOG.md) - [Commits](https://github.com/proptest-rs/proptest/compare/v1.1.0...v1.2.0) --- updated-dependencies: - dependency-name: proptest dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af230d435..1099aac1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3625,15 +3625,14 @@ dependencies = [ [[package]] name = "proptest" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f1b898011ce9595050a68e60f90bad083ff2987a695a42357134c8381fba70" +checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" dependencies = [ "bitflags 1.3.2", "byteorder", "lazy_static", "num-traits", - "quick-error 2.0.1", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", @@ -3671,12 +3670,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quick-xml" version = "0.28.2" @@ -3982,7 +3975,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" dependencies = [ "hostname", - "quick-error 1.2.3", + "quick-error", ] [[package]] From f917c7de6b76e4e17e1d476d782f281daaad85c8 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 5 Jun 2023 10:12:27 +0000 Subject: [PATCH 135/528] chore(cargo): bump criterion from 0.4.0 to 0.5.1 --- Cargo.lock | 63 +++++++++++++++++++++--------------------------------- Cargo.toml | 2 +- deny.toml | 5 ----- 3 files changed, 25 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af230d435..569248e4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -118,6 +118,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + [[package]] name = "anyhow" version = "1.0.71" @@ -293,17 +299,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -713,24 +708,29 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.23" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "b4ed2379f8603fa2b7509891660e802b88c70a79a6427a70abb5968054de2c28" dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstyle", "bitflags 1.3.2", "clap_lex", - "indexmap", - "textwrap", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "clipboard-win" @@ -860,20 +860,20 @@ dependencies = [ [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", "clap", "criterion-plot", "futures", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -2231,15 +2231,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.2.6" @@ -3177,12 +3168,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "os_str_bytes" -version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" - [[package]] name = "ouroboros" version = "0.15.6" diff --git a/Cargo.toml b/Cargo.toml index cd4f11adb..54f2f03b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -96,7 +96,7 @@ uuid = { version = "1", features = ["serde", "v4"] } [dev-dependencies] ansi_term = "0.12.0" -criterion = { version = "0.4.0", features = ["async_tokio"] } +criterion = { version = "0.5.1", features = ["async_tokio"] } futures-lite = "1.13" log = "0.4" pretty_env_logger = "0.5" diff --git a/deny.toml b/deny.toml index aadc55123..ede60fe78 100644 --- a/deny.toml +++ b/deny.toml @@ -2,9 +2,6 @@ unmaintained = "allow" ignore = [ "RUSTSEC-2020-0071", - - # Only affects windows if using non-default allocator (and unmaintained). - "RUSTSEC-2021-0145", ] [bans] @@ -17,8 +14,6 @@ skip = [ { name = "base64", version = "<0.21" }, { name = "bitflags", version = "1.3.2" }, { name = "block-buffer", version = "<0.10" }, - { name = "clap_lex", version = "0.2.4" }, - { name = "clap", version = "3.2.23" }, { name = "convert_case", version = "0.4.0" }, { name = "curve25519-dalek", version = "3.2.0" }, { name = "darling_core", version = "<0.14" }, From 59588b319ef7ddb6b53b5f93072762aab9bd5549 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:14:10 +0000 Subject: [PATCH 136/528] cargo: bump uuid from 1.3.2 to 1.3.3 Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.3.2 to 1.3.3. - [Release notes](https://github.com/uuid-rs/uuid/releases) - [Commits](https://github.com/uuid-rs/uuid/compare/1.3.2...1.3.3) --- updated-dependencies: - dependency-name: uuid dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 569248e4f..f97cbdee6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5335,9 +5335,9 @@ checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" [[package]] name = "uuid" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" +checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" dependencies = [ "getrandom 0.2.8", "serde", From 5eaa9eeed2419df1f1ee7f67148d97593ad0a4e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 11:04:55 +0000 Subject: [PATCH 137/528] chore(cargo): bump percent-encoding from 2.2.0 to 2.3.0 Bumps [percent-encoding](https://github.com/servo/rust-url) from 2.2.0 to 2.3.0. - [Release notes](https://github.com/servo/rust-url/releases) - [Commits](https://github.com/servo/rust-url/compare/v2.2.0...v2.3.0) --- updated-dependencies: - dependency-name: percent-encoding dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8900674f..b8d74598e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3326,9 +3326,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pgp" diff --git a/Cargo.toml b/Cargo.toml index 54f2f03b7..bd74635a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ num_cpus = "1.15" num-derive = "0.3" num-traits = "0.2" once_cell = "1.18.0" -percent-encoding = "2.2" +percent-encoding = "2.3" parking_lot = "0.12" pgp = { version = "0.10", default-features = false } pretty_env_logger = { version = "0.5", optional = true } From b2993242e44c498d10d083802a949ceda4596914 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 30 May 2023 14:04:17 +0000 Subject: [PATCH 138/528] docs(python): document pytest fixtures These docstrings are displayed by `pytest --fixtures` when `deltachat` package is installed from PyPI. --- python/src/deltachat/testplugin.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/python/src/deltachat/testplugin.py b/python/src/deltachat/testplugin.py index 192afb508..6ac62f43b 100644 --- a/python/src/deltachat/testplugin.py +++ b/python/src/deltachat/testplugin.py @@ -137,6 +137,9 @@ def pytest_report_header(config, startdir): @pytest.fixture(scope="session") def testprocess(request): + """Return live account configuration manager. + + The returned object is a :class:`TestProcess` object.""" return TestProcess(pytestconfig=request.config) @@ -231,6 +234,8 @@ def write_dict_to_dir(dic, target_dir): @pytest.fixture() def data(request): + """Test data.""" + class Data: def __init__(self) -> None: # trying to find test data heuristically @@ -614,6 +619,7 @@ class ACFactory: @pytest.fixture() def acfactory(request, tmpdir, testprocess, data): + """Account factory.""" am = ACFactory(request=request, tmpdir=tmpdir, testprocess=testprocess, data=data) yield am if hasattr(request.node, "rep_call") and request.node.rep_call.failed: @@ -686,11 +692,14 @@ class BotProcess: @pytest.fixture() def tmp_db_path(tmpdir): + """Return a path inside the temporary directory where the database can be created.""" return tmpdir.join("test.db").strpath @pytest.fixture() def lp(): + """Log printer fixture.""" + class Printer: def sec(self, msg: str) -> None: print() From 3442748be75564042991ee6c9f58a51830164db9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 5 Jun 2023 13:03:03 +0000 Subject: [PATCH 139/528] ci: update clippy to 1.70.0 --- .github/workflows/ci.yml | 2 +- deltachat-rpc-server/src/main.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9605fe5e5..9f7008c3c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: name: Lint Rust runs-on: ubuntu-latest env: - RUSTUP_TOOLCHAIN: 1.68.2 + RUSTUP_TOOLCHAIN: 1.70.0 steps: - uses: actions/checkout@v3 - name: Install rustfmt and clippy diff --git a/deltachat-rpc-server/src/main.rs b/deltachat-rpc-server/src/main.rs index a635dddb5..e3d0b0b20 100644 --- a/deltachat-rpc-server/src/main.rs +++ b/deltachat-rpc-server/src/main.rs @@ -1,7 +1,7 @@ +//! Delta Chat core RPC server. +//! +//! It speaks JSON Lines over stdio. use std::env; -///! Delta Chat core RPC server. -///! -///! It speaks JSON Lines over stdio. use std::path::PathBuf; use std::sync::Arc; From 7a160033b68ab40b53c472cfb92eeddda8b084e2 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 5 Jun 2023 19:07:23 +0000 Subject: [PATCH 140/528] chore(release): prepare for 1.116.0 --- CHANGELOG.md | 50 +++++++++++++++++++++++ Cargo.lock | 10 ++--- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 63 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc5cc9b99..4cb344793 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,55 @@ # Changelog +## [1.116.0] - 2023-06-05 + +### API-Changes + +- Add `dc_jsonrpc_blocking_call()`. + +### Changes + +- Generate OpenRPC definitions for JSON-RPC. +- Add more context to message loading errors. + +### Fixes + +- Build deltachat-node prebuilds on Debian 10. + +### Documentation + +- Document release process in `RELEASE.md`. +- Add contributing guidelines `CONTRIBUTING.md`. +- Update instructions for python devenv. +- python: Document pytest fixtures. + +### Tests + +- python: Make `test_mdn_asymmetric` less flaky. +- Make `test_group_with_removed_message_id` less flaky. +- Add golden tests infrastructure ([#4395](https://github.com/deltachat/deltachat-core-rust/pull/4395)). + +### Build system + +- git-cliff: Changelog generation improvements. +- `set_core_version.py`: Expect release date in the changelog. + +### CI + +- Require Python 3.8 for deltachat-rpc-client. +- mergeable: Allow PR titles to start with "ci" and "build". +- Remove incorrect comment. +- dependabot: Use `chore` prefix for dependency updates. +- Remove broken `node-delete-preview.yml` workflow. +- Add top comments to GH Actions workflows. +- Run node.js lint on Windows. +- Update clippy to 1.70.0. + +### Miscellaneous Tasks + +- Remove release.toml. +- gitattributes: Configure LF line endings for JavaScript files. +- Update dependencies + ## [1.112.10] - 2023-06-01 ### Fixes diff --git a/Cargo.lock b/Cargo.lock index b8d74598e..15900472a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.115.0" +version = "1.116.0" dependencies = [ "ansi_term", "anyhow", @@ -1236,7 +1236,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.115.0" +version = "1.116.0" dependencies = [ "anyhow", "async-channel", @@ -1260,7 +1260,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.115.0" +version = "1.116.0" dependencies = [ "ansi_term", "anyhow", @@ -1275,7 +1275,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.115.0" +version = "1.116.0" dependencies = [ "anyhow", "deltachat", @@ -1300,7 +1300,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.115.0" +version = "1.116.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index bd74635a5..1c8c0ff89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.115.0" +version = "1.116.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 0934b58ec..3e33bfded 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.115.0" +version = "1.116.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 3e562debd..092dd9c30 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.115.0" +version = "1.116.0" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index dd9be70e7..51b412b41 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.115.0" + "version": "1.116.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 88285999d..80a3826da 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.115.0" +version = "1.116.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index b54a8e620..6a8054bbe 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.115.0" +version = "1.116.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index fec827f3c..419a8fb06 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.115.0" + "version": "1.116.0" } diff --git a/release-date.in b/release-date.in index 4c3400c52..9fc505c6a 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-06-01 \ No newline at end of file +2023-06-05 \ No newline at end of file From 22d0a4bb322e0925d90b92b7e412ad2257498e0f Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 6 Jun 2023 18:31:59 +0000 Subject: [PATCH 141/528] build: use Rust 1.70.0 to compile deltachat-rpc-server releases --- scripts/zig-rpc-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/zig-rpc-server.sh b/scripts/zig-rpc-server.sh index e411b20bb..ee96905bb 100755 --- a/scripts/zig-rpc-server.sh +++ b/scripts/zig-rpc-server.sh @@ -8,7 +8,7 @@ set -e unset RUSTFLAGS # Pin Rust version to avoid uncontrolled changes in the compiler and linker flags. -export RUSTUP_TOOLCHAIN=1.68.1 +export RUSTUP_TOOLCHAIN=1.70.0 ZIG_VERSION=0.11.0-dev.2213+515e1c93e From a2599ef08a6aa7599246746bd299d0d63d162e02 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 6 Jun 2023 14:30:30 +0000 Subject: [PATCH 142/528] ci: run `cargo check` with musl libc --- .github/workflows/ci.yml | 4 ++++ scripts/zig-musl-check.sh | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100755 scripts/zig-musl-check.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f7008c3c..cd2d085b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,6 +38,10 @@ jobs: - name: Check run: cargo check --workspace --all-targets --all-features + # Check with musl libc target which is used for `deltachat-rpc-server` releases. + - name: Check musl + run: scripts/zig-musl-check.sh + cargo_deny: name: cargo deny runs-on: ubuntu-latest diff --git a/scripts/zig-musl-check.sh b/scripts/zig-musl-check.sh new file mode 100755 index 000000000..1e4afd6db --- /dev/null +++ b/scripts/zig-musl-check.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Run `cargo check` with musl libc. +# This requires `zig` to compile vendored openssl. + +set -x +set -e + +unset RUSTFLAGS + +# Pin Rust version to avoid uncontrolled changes in the compiler and linker flags. +export RUSTUP_TOOLCHAIN=1.70.0 + +ZIG_VERSION=0.11.0-dev.2213+515e1c93e + +# Download Zig +rm -fr "$ZIG_VERSION" "zig-linux-x86_64-$ZIG_VERSION.tar.xz" +wget "https://ziglang.org/builds/zig-linux-x86_64-$ZIG_VERSION.tar.xz" +tar xf "zig-linux-x86_64-$ZIG_VERSION.tar.xz" +export PATH="$PWD/zig-linux-x86_64-$ZIG_VERSION:$PATH" + +rustup target add x86_64-unknown-linux-musl +CC="$PWD/scripts/zig-cc" \ +TARGET_CC="$PWD/scripts/zig-cc" \ +CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER="$PWD/scripts/zig-cc" \ +LD="$PWD/scripts/zig-cc" \ +ZIG_TARGET="x86_64-linux-musl" \ +cargo check --release --target x86_64-unknown-linux-musl -p deltachat_ffi --features jsonrpc From 91bf87fa80c05cb3f0d49523b2cbfa7016e11e54 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 6 Jun 2023 14:47:21 +0000 Subject: [PATCH 143/528] fix: update from yanked `libc` 0.2.145 to 0.2.146 https://github.com/rust-lang/libc/issues/3264 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 15900472a..634d081f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2661,9 +2661,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.145" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libm" From 6eb8abe535540652ed430823d0dbc918513fdb6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Mon, 20 Mar 2023 14:48:37 +0100 Subject: [PATCH 144/528] feat: new group membership update algorithm New algorithm improves group consistency in cases of missing messages, restored old backups and replies from classic MUAs. Co-authored-by: Hocuri Co-authored-by: link2xt --- src/chat.rs | 6 +- src/mimeparser.rs | 4 + src/receive_imf.rs | 235 ++++++++++++++++++++-------------- src/receive_imf/tests.rs | 270 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 418 insertions(+), 97 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index d5649b005..829b0d423 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1400,6 +1400,7 @@ impl Chat { } /// Returns true if the chat is promoted. + /// This means a message has been sent to it and it _not_ only exists on the users device. pub fn is_promoted(&self) -> bool { !self.is_unpromoted() } @@ -2969,6 +2970,7 @@ pub(crate) async fn remove_from_chat_contacts_table( } /// Adds a contact to the chat. +/// If the group is promoted, also sends out a system message to all group members pub async fn add_contact_to_chat( context: &Context, chat_id: ChatId, @@ -2990,7 +2992,7 @@ pub(crate) async fn add_contact_to_chat_ex( chat_id.reset_gossiped_timestamp(context).await?; - /*this also makes sure, not contacts are added to special or normal chats*/ + // this also makes sure, no contacts are added to special or normal chats let mut chat = Chat::load_from_db(context, chat_id).await?; ensure!( chat.typ == Chattype::Group || chat.typ == Chattype::Broadcast, @@ -3012,7 +3014,7 @@ pub(crate) async fn add_contact_to_chat_ex( context.emit_event(EventType::ErrorSelfNotInGroup( "Cannot add contact to group; self not in group.".into(), )); - bail!("can not add contact because our account is not part of it"); + bail!("can not add contact because the account is not part of the group/broadcast"); } if from_handshake && chat.param.get_int(Param::Unpromoted).unwrap_or_default() == 1 { diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 4e23d7698..c40389502 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -63,6 +63,8 @@ pub(crate) struct MimeMessage { /// Whether the From address was repeated in the signed part /// (and we know that the signer intended to send from this address) pub from_is_signed: bool, + /// The List-Post address is only set for mailing lists. Users can send + /// messages to this address to post them to the list. pub list_post: Option, pub chat_disposition_notification_to: Option, pub decryption_info: DecryptionInfo, @@ -768,6 +770,8 @@ impl MimeMessage { !self.signatures.is_empty() } + /// Returns whether the email contains a `chat-version` header. + /// This indicates that the email is a DC-email. pub(crate) fn has_chat_version(&self) -> bool { self.header.contains_key("chat-version") } diff --git a/src/receive_imf.rs b/src/receive_imf.rs index b592fc3ba..4c38e3cf2 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -1641,86 +1641,136 @@ async fn apply_group_changes( return Ok(None); } - let mut recreate_member_list = false; let mut send_event_chat_modified = false; - + let mut removed_id = None; let mut better_msg = None; - let removed_id; - if let Some(removed_addr) = mime_parser - .get_header(HeaderDef::ChatGroupMemberRemoved) - .cloned() - { - removed_id = Contact::lookup_id_by_addr(context, &removed_addr, Origin::Unknown).await?; - recreate_member_list = true; - match removed_id { - Some(contact_id) => { - better_msg = if contact_id == from_id { - Some(stock_str::msg_group_left(context, from_id).await) - } else { - Some(stock_str::msg_del_member(context, &removed_addr, from_id).await) - }; + + // True if a Delta Chat client has explicitly added our current primary address. + let self_added = + if let Some(added_addr) = mime_parser.get_header(HeaderDef::ChatGroupMemberAdded) { + context.get_primary_self_addr().await? == *added_addr + } else { + false + }; + + // Whether to allow any changes to the member list at all. + let allow_member_list_changes = + if chat::is_contact_in_chat(context, chat_id, ContactId::SELF).await? || self_added { + // Reject old group changes. + chat_id + .update_timestamp(context, Param::MemberListTimestamp, sent_timestamp) + .await? + } else { + // Member list changes are not allowed if we're not in the group + // and are not explicitly added. + // This message comes from a Delta Chat that restored an old backup + // or the message is a MUA reply to an old message. + false + }; + + // Whether to rebuild the member list from scratch. + let recreate_member_list = if allow_member_list_changes { + // Recreate member list if the message comes from a MUA as these messages do _not_ set add/remove headers. + // Always recreate membership list if self has been added. + if !mime_parser.has_chat_version() || self_added { + true + } else { + match mime_parser.get_header(HeaderDef::InReplyTo) { + // If we don't know the referenced message, we missed some messages. + // Maybe they added/removed members, so we need to recreate our member list. + Some(reply_to) => rfc724_mid_exists(context, reply_to).await?.is_none(), + None => false, } - None => warn!(context, "Removed {removed_addr:?} has no contact_id."), } } else { - removed_id = None; - if let Some(added_member) = mime_parser - .get_header(HeaderDef::ChatGroupMemberAdded) - .cloned() - { - better_msg = Some(stock_str::msg_add_member(context, &added_member, from_id).await); - recreate_member_list = true; - } else if let Some(old_name) = mime_parser - .get_header(HeaderDef::ChatGroupNameChanged) - // See create_or_lookup_group() for explanation - .map(|s| s.trim()) - { - if let Some(grpname) = mime_parser - .get_header(HeaderDef::ChatGroupName) - // See create_or_lookup_group() for explanation - .map(|grpname| grpname.trim()) - .filter(|grpname| grpname.len() < 200) - { - if chat_id - .update_timestamp(context, Param::GroupNameTimestamp, sent_timestamp) - .await? - { - info!(context, "Updating grpname for chat {chat_id}."); - context - .sql - .execute( - "UPDATE chats SET name=? WHERE id=?;", - (strip_rtlo_characters(grpname), chat_id), - ) - .await?; + false + }; + + if let Some(removed_addr) = mime_parser.get_header(HeaderDef::ChatGroupMemberRemoved) { + removed_id = Contact::lookup_id_by_addr(context, removed_addr, Origin::Unknown).await?; + if let Some(contact_id) = removed_id { + if allow_member_list_changes { + // Remove a single member from the chat. + if !recreate_member_list { + chat::remove_from_chat_contacts_table(context, chat_id, contact_id).await?; send_event_chat_modified = true; } - better_msg = - Some(stock_str::msg_grp_name(context, old_name, grpname, from_id).await); + better_msg = if contact_id == from_id { + Some(stock_str::msg_group_left(context, from_id).await) + } else { + Some(stock_str::msg_del_member(context, removed_addr, from_id).await) + }; + } else { + info!( + context, + "Ignoring removal of {removed_addr:?} from {chat_id}." + ); } - } else if let Some(value) = mime_parser.get_header(HeaderDef::ChatContent) { - if value == "group-avatar-changed" { - if let Some(avatar_action) = &mime_parser.group_avatar { - // this is just an explicit message containing the group-avatar, - // apart from that, the group-avatar is send along with various other messages - better_msg = match avatar_action { - AvatarAction::Delete => { - Some(stock_str::msg_grp_img_deleted(context, from_id).await) - } - AvatarAction::Change(_) => { - Some(stock_str::msg_grp_img_changed(context, from_id).await) - } - }; + } else { + warn!(context, "Removed {removed_addr:?} has no contact id.") + } + } else if let Some(added_addr) = mime_parser.get_header(HeaderDef::ChatGroupMemberAdded) { + if allow_member_list_changes { + // Add a single member to the chat. + if !recreate_member_list { + if let Some(contact_id) = + Contact::lookup_id_by_addr(context, added_addr, Origin::Unknown).await? + { + chat::add_to_chat_contacts_table(context, chat_id, &[contact_id]).await?; + send_event_chat_modified = true; + } else { + warn!(context, "Added {added_addr:?} has no contact id.") } } - } - } - if !mime_parser.has_chat_version() { - // If a classical MUA user adds someone to TO/CC, then the DC user shall - // see this addition and have the new recipient in the member list. - recreate_member_list = true; + better_msg = Some(stock_str::msg_add_member(context, added_addr, from_id).await); + } else { + info!(context, "Ignoring addition of {added_addr:?} to {chat_id}."); + } + } else if let Some(old_name) = mime_parser + .get_header(HeaderDef::ChatGroupNameChanged) + // See create_or_lookup_group() for explanation + .map(|s| s.trim()) + { + if let Some(grpname) = mime_parser + .get_header(HeaderDef::ChatGroupName) + // See create_or_lookup_group() for explanation + .map(|grpname| grpname.trim()) + .filter(|grpname| grpname.len() < 200) + { + if chat_id + .update_timestamp(context, Param::GroupNameTimestamp, sent_timestamp) + .await? + { + info!(context, "Updating grpname for chat {chat_id}."); + context + .sql + .execute( + "UPDATE chats SET name=? WHERE id=?;", + (strip_rtlo_characters(grpname), chat_id), + ) + .await?; + send_event_chat_modified = true; + } + + better_msg = Some(stock_str::msg_grp_name(context, old_name, grpname, from_id).await); + } + } else if let Some(value) = mime_parser.get_header(HeaderDef::ChatContent) { + if value == "group-avatar-changed" { + if let Some(avatar_action) = &mime_parser.group_avatar { + // this is just an explicit message containing the group-avatar, + // apart from that, the group-avatar is send along with various other messages + better_msg = match avatar_action { + AvatarAction::Delete => { + Some(stock_str::msg_grp_img_deleted(context, from_id).await) + } + AvatarAction::Change(_) => { + Some(stock_str::msg_grp_img_changed(context, from_id).await) + } + }; + } + } } if mime_parser.get_header(HeaderDef::ChatVerified).is_some() { @@ -1734,49 +1784,46 @@ async fn apply_group_changes( chat_id .inner_set_protection(context, ProtectionStatus::Protected) .await?; - recreate_member_list = true; } } - // add members to group/check members + // Recreate the member list. if recreate_member_list { - if chat::is_contact_in_chat(context, chat_id, ContactId::SELF).await? - && !chat::is_contact_in_chat(context, chat_id, from_id).await? - { + if !chat::is_contact_in_chat(context, chat_id, from_id).await? { warn!( context, "Contact {from_id} attempts to modify group chat {chat_id} member list without being a member." ); - } else if chat_id - .update_timestamp(context, Param::MemberListTimestamp, sent_timestamp) - .await? - { - let mut members_to_add = vec![]; - if removed_id.is_some() - || !chat::is_contact_in_chat(context, chat_id, ContactId::SELF).await? - { - // Members could have been removed while we were - // absent. We can't use existing member list and need to - // start from scratch. + } else { + // Only delete old contacts if the sender is not a classical MUA user: + // Classical MUA users usually don't intend to remove users from an email + // thread, so if they removed a recipient then it was probably by accident. + if mime_parser.has_chat_version() { context .sql .execute("DELETE FROM chats_contacts WHERE chat_id=?;", (chat_id,)) .await?; - - members_to_add.push(ContactId::SELF); } + let mut members_to_add = HashSet::new(); + members_to_add.extend(to_ids); + members_to_add.insert(ContactId::SELF); + if !from_id.is_special() { - members_to_add.push(from_id); + members_to_add.insert(from_id); } - members_to_add.extend(to_ids); - if let Some(removed_id) = removed_id { - members_to_add.retain(|id| *id != removed_id); - } - members_to_add.dedup(); - info!(context, "Adding {members_to_add:?} to chat id={chat_id}."); - chat::add_to_chat_contacts_table(context, chat_id, &members_to_add).await?; + if let Some(removed_id) = removed_id { + members_to_add.remove(&removed_id); + } + + info!( + context, + "Recreating chat {chat_id} with members {members_to_add:?}." + ); + + chat::add_to_chat_contacts_table(context, chat_id, &Vec::from_iter(members_to_add)) + .await?; send_event_chat_modified = true; } } diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index 1fda38221..680f58bb6 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -2,7 +2,10 @@ use tokio::fs; use super::*; use crate::aheader::EncryptPreference; -use crate::chat::get_chat_contacts; +use crate::chat::{ + add_contact_to_chat, add_to_chat_contacts_table, create_group_chat, get_chat_contacts, + is_contact_in_chat, remove_contact_from_chat, send_text_msg, +}; use crate::chat::{get_chat_msgs, ChatItem, ChatVisibility}; use crate::chatlist::Chatlist; use crate::constants::DC_GCL_NO_SPECIALS; @@ -3302,3 +3305,268 @@ async fn test_mua_user_adds_recipient_to_single_chat() -> Result<()> { Ok(()) } + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_sync_member_list_on_rejoin() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = tcm.alice().await; + + let bob_id = Contact::create(&alice, "", "bob@example.net").await?; + let claire_id = Contact::create(&alice, "", "claire@example.de").await?; + + let alice_chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "foos").await?; + add_contact_to_chat(&alice, alice_chat_id, bob_id).await?; + add_contact_to_chat(&alice, alice_chat_id, claire_id).await?; + + send_text_msg(&alice, alice_chat_id, "populate".to_string()).await?; + let add = alice.pop_sent_msg().await; + let bob = tcm.bob().await; + bob.recv_msg(&add).await; + let bob_chat_id = bob.get_last_msg().await.chat_id; + assert_eq!(get_chat_contacts(&bob, bob_chat_id).await?.len(), 3); + + // remove bob from chat + remove_contact_from_chat(&alice, alice_chat_id, bob_id).await?; + let remove_bob = alice.pop_sent_msg().await; + bob.recv_msg(&remove_bob).await; + + // remove any other member + remove_contact_from_chat(&alice, alice_chat_id, claire_id).await?; + alice.pop_sent_msg().await; + + // readd bob + add_contact_to_chat(&alice, alice_chat_id, bob_id).await?; + let add2 = alice.pop_sent_msg().await; + bob.recv_msg(&add2).await; + + // number of members in chat should have updated + assert_eq!(get_chat_contacts(&bob, bob_chat_id).await?.len(), 2); + Ok(()) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_dont_recreate_contacts_on_add_remove() -> Result<()> { + let alice = TestContext::new_alice().await; + let bob = TestContext::new_bob().await; + + let alice_chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "Group").await?; + + add_contact_to_chat( + &alice, + alice_chat_id, + Contact::create(&alice, "bob", "bob@example.net").await?, + ) + .await?; + + send_text_msg(&alice, alice_chat_id, "populate".to_string()).await?; + let bob_chat_id = bob.recv_msg(&alice.pop_sent_msg().await).await.chat_id; + bob_chat_id.accept(&bob).await?; + + // alice adds a member + add_contact_to_chat( + &alice, + alice_chat_id, + Contact::create(&alice, "fiona", "fiona@example.net").await?, + ) + .await?; + + // bob adds a member. + let bob_blue = Contact::create(&bob, "blue", "blue@example.net").await?; + add_contact_to_chat(&bob, bob_chat_id, bob_blue).await?; + + alice.recv_msg(&bob.pop_sent_msg().await).await; + + // bob didn't receive the addition of fiona, but alice doesn't overwrite her own + // contact list with the one from bob which only has three members instead of four. + assert_eq!(get_chat_contacts(&alice, alice_chat_id).await?.len(), 4); + + // bob removes a member. + remove_contact_from_chat(&bob, bob_chat_id, bob_blue).await?; + + alice.recv_msg(&bob.pop_sent_msg().await).await; + + // Bobs chat only has two members after the removal of blue, because he still + // didn't receive the addition of fiona. But that doesn't overwrite alice' + // memberlist. + assert_eq!(get_chat_contacts(&alice, alice_chat_id).await?.len(), 3); + + Ok(()) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_recreate_contact_list_on_missing_message() -> Result<()> { + let alice = TestContext::new_alice().await; + let bob = TestContext::new_bob().await; + let chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "Group").await?; + let alice_fiona = Contact::create(&alice, "fiona", "fiona@example.net").await?; + // create chat with three members + add_to_chat_contacts_table( + &alice, + chat_id, + &[ + Contact::create(&alice, "bob", "bob@example.net").await?, + alice_fiona, + ], + ) + .await?; + + send_text_msg(&alice, chat_id, "populate".to_string()).await?; + let bob_chat_id = bob.recv_msg(&alice.pop_sent_msg().await).await.chat_id; + bob_chat_id.accept(&bob).await?; + + // bob removes a member + let bob_contact_fiona = Contact::create(&bob, "fiona", "fiona@example.net").await?; + remove_contact_from_chat(&bob, bob_chat_id, bob_contact_fiona).await?; + let remove_msg = bob.pop_sent_msg().await; + + // bob adds a new member + let bob_blue = Contact::create(&bob, "blue", "blue@example.net").await?; + add_contact_to_chat(&bob, bob_chat_id, bob_blue).await?; + + let add_msg = bob.pop_sent_msg().await; + + // alice only receives the addition of the member + alice.recv_msg(&add_msg).await; + + // since we missed a message, a new contact list should be build + assert_eq!(get_chat_contacts(&alice, chat_id).await?.len(), 3); + + // readd fiona + add_contact_to_chat(&alice, chat_id, alice_fiona).await?; + + alice.recv_msg(&remove_msg).await; + + // delayed removal of fiona shouldn't remove her + assert_eq!(get_chat_contacts(&alice, chat_id).await?.len(), 4); + + Ok(()) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_dont_readd_with_normal_msg() -> Result<()> { + let alice = TestContext::new_alice().await; + let bob = TestContext::new_bob().await; + + let alice_chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "Group").await?; + + add_contact_to_chat( + &alice, + alice_chat_id, + Contact::create(&alice, "bob", "bob@example.net").await?, + ) + .await?; + + send_text_msg(&alice, alice_chat_id, "populate".to_string()).await?; + let bob_chat_id = bob.recv_msg(&alice.pop_sent_msg().await).await.chat_id; + bob_chat_id.accept(&bob).await?; + + remove_contact_from_chat(&bob, bob_chat_id, ContactId::SELF).await?; + assert_eq!(get_chat_contacts(&bob, bob_chat_id).await?.len(), 1); + + add_contact_to_chat( + &alice, + alice_chat_id, + Contact::create(&alice, "fiora", "fiora@example.net").await?, + ) + .await?; + + bob.recv_msg(&alice.pop_sent_msg().await).await; + + // Alice didn't receive Bobs leave message, but bob shouldn't readded himself just because of that. + assert!(!is_contact_in_chat(&bob, bob_chat_id, ContactId::SELF).await?); + Ok(()) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_mua_cant_remove() -> Result<()> { + let alice = TestContext::new_alice().await; + + // Alice creates chat with 3 contacts + let msg = receive_imf( + &alice, + b"Subject: =?utf-8?q?Message_from_alice=40example=2Eorg?=\r\n\ + From: alice@example.org\r\n\ + To: , , \r\n\ + Date: Mon, 12 Dec 2022 14:30:39 +0000\r\n\ + Message-ID: \r\n\ + Chat-Version: 1.0\r\n\ + \r\n\ + tst\r\n", + false, + ) + .await? + .unwrap(); + let alice_chat = Chat::load_from_db(&alice, msg.chat_id).await?; + assert_eq!(alice_chat.typ, Chattype::Group); + + // Bob uses a classical MUA to answer, removing a recipient. + let bob_removes = receive_imf( + &alice, + b"Subject: Re: Message from alice\r\n\ + From: \r\n\ + To: , \r\n\ + Date: Mon, 12 Dec 2022 14:32:39 +0000\r\n\ + Message-ID: \r\n\ + In-Reply-To: \r\n\ + \r\n\ + Hi back!\r\n", + false, + ) + .await? + .unwrap(); + assert_eq!(bob_removes.chat_id, alice_chat.id); + let group_chat = Chat::load_from_db(&alice, bob_removes.chat_id).await?; + assert_eq!(group_chat.typ, Chattype::Group); + assert_eq!( + chat::get_chat_contacts(&alice, group_chat.id).await?.len(), + 4 + ); + Ok(()) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_mua_can_add() -> Result<()> { + let alice = TestContext::new_alice().await; + + // Alice creates chat with 3 contacts + let msg = receive_imf( + &alice, + b"Subject: =?utf-8?q?Message_from_alice=40example=2Eorg?=\r\n\ + From: alice@example.org\r\n\ + To: , , \r\n\ + Date: Mon, 12 Dec 2022 14:30:39 +0000\r\n\ + Message-ID: \r\n\ + Chat-Version: 1.0\r\n\ + \r\n\ + Hi!\r\n", + false, + ) + .await? + .unwrap(); + let alice_chat = Chat::load_from_db(&alice, msg.chat_id).await?; + assert_eq!(alice_chat.typ, Chattype::Group); + + // Bob uses a classical MUA to answer, adding a recipient. + let bob_adds = receive_imf( + &alice, + b"Subject: Re: Message from alice\r\n\ + From: \r\n\ + To: , , , \r\n\ + Date: Mon, 12 Dec 2022 14:32:39 +0000\r\n\ + Message-ID: \r\n\ + In-Reply-To: \r\n\ + \r\n\ + Hi back!\r\n", + false, + ) + .await? + .unwrap(); + + let group_chat = Chat::load_from_db(&alice, bob_adds.chat_id).await?; + assert_eq!(group_chat.typ, Chattype::Group); + assert_eq!( + chat::get_chat_contacts(&alice, group_chat.id).await?.len(), + 5 + ); + Ok(()) +} From 9be871ccf6dcf09fda76bf4dada94b72f7426348 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 5 Jun 2023 12:11:03 +0000 Subject: [PATCH 145/528] fix: emit DC_EVENT_MSGS_CHANGED without IDs when the message expires Specifying msg IDs that cannot be loaded in the event payload results in an error when the UI tries to load the message. Instead, emit an event without IDs to make the UI reload the whole messagelist. --- src/ephemeral.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ephemeral.rs b/src/ephemeral.rs index 22c3b6303..0ccd17d26 100644 --- a/src/ephemeral.rs +++ b/src/ephemeral.rs @@ -429,7 +429,7 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu if !rows.is_empty() { info!(context, "Attempting to delete {} messages.", rows.len()); - let (msgs_changed, webxdc_deleted) = context + let (_msgs_changed, webxdc_deleted) = context .sql .transaction(|transaction| { let mut msgs_changed = Vec::with_capacity(rows.len()); @@ -455,9 +455,7 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu }) .await?; - for (chat_id, msg_id) in msgs_changed { - context.emit_msgs_changed(chat_id, msg_id); - } + context.emit_msgs_changed_without_ids(); for msg_id in webxdc_deleted { context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); From 33a014eea4b9f4af18bb1619c1c143fe574e4fd8 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 5 Jun 2023 21:41:53 +0000 Subject: [PATCH 146/528] feat: add MsgDeleted event --- deltachat-ffi/deltachat.h | 9 +++++++++ deltachat-ffi/src/lib.rs | 6 +++++- deltachat-jsonrpc/src/api/types/events.rs | 11 +++++++++++ python/tests/test_1_online.py | 3 +++ src/ephemeral.rs | 6 +++++- src/events/payload.rs | 21 +++++++++++++++++++++ src/message.rs | 5 +++++ 7 files changed, 59 insertions(+), 2 deletions(-) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index af8cac124..5dcd263e2 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -6079,6 +6079,15 @@ void dc_event_unref(dc_event_t* event); #define DC_EVENT_MSG_READ 2015 +/** + * A single message is deleted. + * + * @param data1 (int) chat_id + * @param data2 (int) msg_id + */ +#define DC_EVENT_MSG_DELETED 2016 + + /** * Chat changed. The name or the image of a chat group was changed or members were added or removed. * Or the verify state of a chat has changed. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 320f5c23f..d35e19e04 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -527,6 +527,7 @@ pub unsafe extern "C" fn dc_event_get_id(event: *mut dc_event_t) -> libc::c_int EventType::MsgDelivered { .. } => 2010, EventType::MsgFailed { .. } => 2012, EventType::MsgRead { .. } => 2015, + EventType::MsgDeleted { .. } => 2016, EventType::ChatModified(_) => 2020, EventType::ChatEphemeralTimerModified { .. } => 2021, EventType::ContactsChanged(_) => 2030, @@ -574,6 +575,7 @@ pub unsafe extern "C" fn dc_event_get_data1_int(event: *mut dc_event_t) -> libc: | EventType::MsgDelivered { chat_id, .. } | EventType::MsgFailed { chat_id, .. } | EventType::MsgRead { chat_id, .. } + | EventType::MsgDeleted { chat_id, .. } | EventType::ChatModified(chat_id) | EventType::ChatEphemeralTimerModified { chat_id, .. } => chat_id.to_u32() as libc::c_int, EventType::ContactsChanged(id) | EventType::LocationChanged(id) => { @@ -631,7 +633,8 @@ pub unsafe extern "C" fn dc_event_get_data2_int(event: *mut dc_event_t) -> libc: | EventType::IncomingMsg { msg_id, .. } | EventType::MsgDelivered { msg_id, .. } | EventType::MsgFailed { msg_id, .. } - | EventType::MsgRead { msg_id, .. } => msg_id.to_u32() as libc::c_int, + | EventType::MsgRead { msg_id, .. } + | EventType::MsgDeleted { msg_id, .. } => msg_id.to_u32() as libc::c_int, EventType::SecurejoinInviterProgress { progress, .. } | EventType::SecurejoinJoinerProgress { progress, .. } => *progress as libc::c_int, EventType::ChatEphemeralTimerModified { timer, .. } => timer.to_u32() as libc::c_int, @@ -674,6 +677,7 @@ pub unsafe extern "C" fn dc_event_get_data2_str(event: *mut dc_event_t) -> *mut | EventType::MsgDelivered { .. } | EventType::MsgFailed { .. } | EventType::MsgRead { .. } + | EventType::MsgDeleted { .. } | EventType::ChatModified(_) | EventType::ContactsChanged(_) | EventType::LocationChanged(_) diff --git a/deltachat-jsonrpc/src/api/types/events.rs b/deltachat-jsonrpc/src/api/types/events.rs index 892302a4f..0cfb02a84 100644 --- a/deltachat-jsonrpc/src/api/types/events.rs +++ b/deltachat-jsonrpc/src/api/types/events.rs @@ -174,6 +174,13 @@ pub enum EventType { msg_id: u32, }, + /// A single message is deleted. + #[serde(rename_all = "camelCase")] + MsgDeleted { + chat_id: u32, + msg_id: u32, + }, + /// Chat changed. The name or the image of a chat group was changed or members were added or removed. /// Or the verify state of a chat has changed. /// See setChatName(), setChatProfileImage(), addContactToChat() @@ -347,6 +354,10 @@ impl From for EventType { chat_id: chat_id.to_u32(), msg_id: msg_id.to_u32(), }, + CoreEventType::MsgDeleted { chat_id, msg_id } => MsgDeleted { + chat_id: chat_id.to_u32(), + msg_id: msg_id.to_u32(), + }, CoreEventType::ChatModified(chat_id) => ChatModified { chat_id: chat_id.to_u32(), }, diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index c2df18b5a..39b9ef097 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -396,9 +396,12 @@ def test_forward_messages(acfactory, lp): lp.sec("ac2: check new chat has a forwarded message") assert chat3.is_promoted() messages = chat3.get_messages() + assert len(messages) == 1 msg = messages[-1] assert msg.is_forwarded() ac2.delete_messages(messages) + ev = ac2._evtracker.get_matching("DC_EVENT_MSG_DELETED") + assert ev.data2 == messages[0].id assert not chat3.get_messages() diff --git a/src/ephemeral.rs b/src/ephemeral.rs index 0ccd17d26..46922a0e4 100644 --- a/src/ephemeral.rs +++ b/src/ephemeral.rs @@ -429,7 +429,7 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu if !rows.is_empty() { info!(context, "Attempting to delete {} messages.", rows.len()); - let (_msgs_changed, webxdc_deleted) = context + let (msgs_changed, webxdc_deleted) = context .sql .transaction(|transaction| { let mut msgs_changed = Vec::with_capacity(rows.len()); @@ -455,6 +455,10 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu }) .await?; + for (chat_id, msg_id) in msgs_changed { + context.emit_event(EventType::MsgDeleted { chat_id, msg_id }) + } + context.emit_msgs_changed_without_ids(); for msg_id in webxdc_deleted { diff --git a/src/events/payload.rs b/src/events/payload.rs index 3820651a6..531447f2c 100644 --- a/src/events/payload.rs +++ b/src/events/payload.rs @@ -145,6 +145,27 @@ pub enum EventType { msg_id: MsgId, }, + /// A single message was deleted. + /// + /// This event means that the message will no longer appear in the messagelist. + /// UI should remove the message from the messagelist + /// in response to this event if the message is currently displayed. + /// + /// The message may have been explicitly deleted by the user or expired. + /// Internally the message may have been removed from the database, + /// moved to the trash chat or hidden. + /// + /// This event does not indicate the message + /// deletion from the server. + MsgDeleted { + /// ID of the chat where the message was prior to deletion. + /// Never 0 or trash chat. + chat_id: ChatId, + + /// ID of the deleted message. Never 0. + msg_id: MsgId, + }, + /// Chat changed. The name or the image of a chat group was changed or members were added or removed. /// Or the verify state of a chat has changed. /// See dc_set_chat_name(), dc_set_chat_profile_image(), dc_add_contact_to_chat() diff --git a/src/message.rs b/src/message.rs index 0be211e36..563f18890 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1431,6 +1431,11 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { .await .with_context(|| format!("Unable to trash message {msg_id}"))?; + context.emit_event(EventType::MsgDeleted { + chat_id: msg.chat_id, + msg_id, + }); + if msg.viewtype == Viewtype::Webxdc { context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); } From e6d9a49187786fe1da72e6163c0684e3beca46b0 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 6 Jun 2023 15:55:47 +0000 Subject: [PATCH 147/528] api: emit DC_EVENT_MSGS_CHANGED per chat when messages are deleted --- src/ephemeral.rs | 10 ++++++++-- src/message.rs | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ephemeral.rs b/src/ephemeral.rs index 46922a0e4..c9ea6891b 100644 --- a/src/ephemeral.rs +++ b/src/ephemeral.rs @@ -63,6 +63,7 @@ //! ephemeral message timers or global `delete_server_after` setting. use std::cmp::max; +use std::collections::BTreeSet; use std::convert::{TryFrom, TryInto}; use std::num::ParseIntError; use std::str::FromStr; @@ -455,11 +456,16 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu }) .await?; + let mut modified_chat_ids = BTreeSet::new(); + for (chat_id, msg_id) in msgs_changed { - context.emit_event(EventType::MsgDeleted { chat_id, msg_id }) + context.emit_event(EventType::MsgDeleted { chat_id, msg_id }); + modified_chat_ids.insert(chat_id); } - context.emit_msgs_changed_without_ids(); + for modified_chat_id in modified_chat_ids { + context.emit_msgs_changed(modified_chat_id, MsgId::new(0)); + } for msg_id in webxdc_deleted { context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); diff --git a/src/message.rs b/src/message.rs index 563f18890..93ef2cad2 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1421,6 +1421,8 @@ pub async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result Result<()> { + let mut modified_chat_ids = BTreeSet::new(); + for &msg_id in msg_ids { let msg = Message::load_from_db(context, msg_id).await?; if msg.location_id > 0 { @@ -1440,6 +1442,8 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); } + modified_chat_ids.insert(msg.chat_id); + let target = context.get_delete_msgs_target().await?; context .sql @@ -1463,9 +1467,11 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { } } - if !msg_ids.is_empty() { - context.emit_msgs_changed_without_ids(); + for modified_chat_id in modified_chat_ids { + context.emit_msgs_changed(modified_chat_id, MsgId::new(0)); + } + if !msg_ids.is_empty() { // Run housekeeping to delete unused blobs. context.set_config(Config::LastHousekeeping, None).await?; } From 437f8c48c4865723a84fe3e62e139ac136bfa452 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 7 Jun 2023 15:06:49 +0000 Subject: [PATCH 148/528] api(python): make Contact.is_verified() return bool --- python/src/deltachat/contact.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/src/deltachat/contact.py b/python/src/deltachat/contact.py index f49b91fbc..7b1ea4f7b 100644 --- a/python/src/deltachat/contact.py +++ b/python/src/deltachat/contact.py @@ -71,9 +71,9 @@ class Contact: """Unblock this contact. Messages from this contact will be retrieved (again).""" return lib.dc_block_contact(self.account._dc_context, self.id, False) - def is_verified(self): + def is_verified(self) -> bool: """Return True if the contact is verified.""" - return lib.dc_contact_is_verified(self._dc_contact) + return lib.dc_contact_is_verified(self._dc_contact) == 2 def get_verifier(self, contact): """Return the address of the contact that verified the contact.""" From 9ab9d2eb7bb790e94dfc3757852938401788f0c1 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 7 Jun 2023 16:26:53 +0000 Subject: [PATCH 149/528] fix: ignore address case when comparing the To: field to Autocrypt-Gossip: --- src/mimeparser.rs | 2 +- src/receive_imf.rs | 2 +- src/securejoin.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mimeparser.rs b/src/mimeparser.rs index c40389502..9259cc5b0 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -1752,7 +1752,7 @@ async fn update_gossip_peerstates( .handle_fingerprint_change(context, message_time) .await?; - gossiped_addr.insert(header.addr.clone()); + gossiped_addr.insert(header.addr.to_lowercase()); } Ok(gossiped_addr) diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 4c38e3cf2..7d80b1f1e 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2211,7 +2211,7 @@ async fn check_verified_properties( let peerstate = Peerstate::from_addr(context, &to_addr).await?; // mark gossiped keys (if any) as verified - if mimeparser.gossiped_addr.contains(&to_addr) { + if mimeparser.gossiped_addr.contains(&to_addr.to_lowercase()) { if let Some(mut peerstate) = peerstate { // if we're here, we know the gossip key is verified: // - use the gossip-key as verified-key if there is no verified-key diff --git a/src/securejoin.rs b/src/securejoin.rs index f854b7d98..2d34b7c2f 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -583,7 +583,7 @@ pub(crate) async fn observe_securejoin_on_other_device( let addr = Contact::load_from_db(context, contact_id) .await? .get_addr() - .to_string(); + .to_lowercase(); if mime_message.gossiped_addr.contains(&addr) { let mut peerstate = match Peerstate::from_addr(context, &addr).await? { Some(p) => p, From e948ec3256bbf7729782be228400ecfae2b9aab0 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 7 Jun 2023 13:17:24 +0000 Subject: [PATCH 150/528] test: regression test for case-sensitive comparison of gossip header to contact address --- python/tests/test_1_online.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index 39b9ef097..84b85014d 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -1587,6 +1587,39 @@ def test_qr_join_chat(acfactory, lp): ac1._evtracker.wait_securejoin_inviter_progress(1000) +def test_qr_email_capitalization(acfactory, lp): + """Regression test for a bug + that resulted in failure to propagate verification via gossip in a verified group + when the database already contained the contact with a different email address capitalization. + """ + + ac1, ac2, ac3 = acfactory.get_online_accounts(3) + + # ac1 adds ac2 as a contact with an email address in uppercase. + ac2_addr_uppercase = ac2.get_config("addr").upper() + lp.sec(f"ac1 creates a contact for ac2 ({ac2_addr_uppercase})") + ac1.create_contact(ac2_addr_uppercase) + + lp.sec("ac3 creates a verified group with a QR code") + chat = ac3.create_group_chat("hello", verified=True) + qr = chat.get_join_qr() + + lp.sec("ac1 joins a verified group via a QR code") + ac1_chat = ac1.qr_join_chat(qr) + msg = ac1._evtracker.wait_next_incoming_message() + assert msg.text == "Member Me ({}) added by {}.".format(ac1.get_config("addr"), ac3.get_config("addr")) + assert len(ac1_chat.get_contacts()) == 2 + + lp.sec("ac2 joins a verified group via a QR code") + ac2.qr_join_chat(qr) + ac1._evtracker.wait_next_incoming_message() + + # ac1 should see both ac3 and ac2 as verified. + assert len(ac1_chat.get_contacts()) == 3 + for contact in ac1_chat.get_contacts(): + assert contact.is_verified() + + def test_set_get_contact_avatar(acfactory, data, lp): lp.sec("configuring ac1 and ac2") ac1, ac2 = acfactory.get_online_accounts(2) From 96467667930ea77cc0a36ee0152419a034256ae1 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 7 Jun 2023 22:39:25 +0000 Subject: [PATCH 151/528] build: disable unused `brotli` feature "ffi-api" --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1c8c0ff89..4364a2d83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ async-smtp = { version = "0.9", default-features = false, features = ["runtime-t async_zip = { version = "0.0.12", default-features = false, features = ["deflate", "fs"] } backtrace = "0.3" base64 = "0.21" -brotli = "3.3" +brotli = { version = "3.3", default-features=false, features = ["std"] } chrono = { version = "0.4", default-features=false, features = ["clock", "std"] } email = { git = "https://github.com/deltachat/rust-email", branch = "master" } encoded-words = { git = "https://github.com/async-email/encoded-words", branch = "master" } From 915008d4742320c60c1cbdaf5fe2fa840f179925 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 8 Jun 2023 12:14:31 +0000 Subject: [PATCH 152/528] build: use 1 codegen-units for release builds --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 4364a2d83..85649bf97 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ opt-level = "z" lto = true panic = 'abort' opt-level = "z" +codegen-units = 1 [patch.crates-io] quinn-udp = { git = "https://github.com/quinn-rs/quinn", branch="main" } From 1a62b6d77fe62f0bd04726df622bf8d4aaafe5af Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 9 Jun 2023 22:20:46 +0000 Subject: [PATCH 153/528] refactor: rename MimeMessage.header into MimeMessage.headers --- src/mimeparser.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 9259cc5b0..61d0a30f3 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -52,7 +52,7 @@ pub(crate) struct MimeMessage { pub parts: Vec, /// Message headers. - header: HashMap, + headers: HashMap, /// Addresses are normalized and lowercased: pub recipients: Vec, @@ -386,7 +386,7 @@ impl MimeMessage { let mut parser = MimeMessage { parts: Vec::new(), - header: headers, + headers, recipients, list_post, from, @@ -692,7 +692,7 @@ impl MimeMessage { self.parts.push(part); } - if self.header.contains_key("auto-submitted") { + if self.headers.contains_key("auto-submitted") { for part in &mut self.parts { part.param.set(Param::Bot, "1"); } @@ -773,11 +773,11 @@ impl MimeMessage { /// Returns whether the email contains a `chat-version` header. /// This indicates that the email is a DC-email. pub(crate) fn has_chat_version(&self) -> bool { - self.header.contains_key("chat-version") + self.headers.contains_key("chat-version") } pub(crate) fn has_headers(&self) -> bool { - !self.header.is_empty() + !self.headers.is_empty() } pub(crate) fn get_subject(&self) -> Option { @@ -787,7 +787,7 @@ impl MimeMessage { } pub fn get_header(&self, headerdef: HeaderDef) -> Option<&String> { - self.header.get(headerdef.get_headername()) + self.headers.get(headerdef.get_headername()) } fn parse_mime_recursive<'a>( From 4767f1ce743d2170142c3cc126838d55505eb807 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Thu, 8 Jun 2023 13:29:29 +0200 Subject: [PATCH 154/528] docs: readme remove legacy from dc-node, mark napi as experimental --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 937967a1c..9dec8d468 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,8 @@ Language bindings are available for: - **C** \[[📂 source](./deltachat-ffi) | [📚 docs](https://c.delta.chat)\] - **Node.js** - - over cffi (legacy): \[[📂 source](./node) | [📦 npm](https://www.npmjs.com/package/deltachat-node) | [📚 docs](https://js.delta.chat)\] - - over jsonrpc built with napi.rs: \[[📂 source](https://github.com/deltachat/napi-jsonrpc) | [📦 npm](https://www.npmjs.com/package/@deltachat/napi-jsonrpc)\] + - over cffi: \[[📂 source](./node) | [📦 npm](https://www.npmjs.com/package/deltachat-node) | [📚 docs](https://js.delta.chat)\] + - over jsonrpc built with napi.rs (experimental): \[[📂 source](https://github.com/deltachat/napi-jsonrpc) | [📦 npm](https://www.npmjs.com/package/@deltachat/napi-jsonrpc)\] - **Python** \[[📂 source](./python) | [📦 pypi](https://pypi.org/project/deltachat) | [📚 docs](https://py.delta.chat)\] - **Go** - over jsonrpc: \[[📂 source](https://github.com/deltachat/deltachat-rpc-client-go/)\] From 0d0e223238bd54f19a50eddcf7466732a383a3e4 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 30 May 2023 15:31:23 +0000 Subject: [PATCH 155/528] test(python): replace legacy `tmpdir` fixture with `tmp_path` --- python/tests/stress_test_db.py | 2 +- python/tests/test_0_complex_or_slow.py | 18 +++--- python/tests/test_1_online.py | 85 +++++++++++++------------- python/tests/test_2_increation.py | 19 +++--- python/tests/test_3_offline.py | 78 +++++++++++------------ python/tests/test_4_lowlevel.py | 38 ++++++------ 6 files changed, 121 insertions(+), 119 deletions(-) diff --git a/python/tests/stress_test_db.py b/python/tests/stress_test_db.py index 43a04116a..9a793a816 100644 --- a/python/tests/stress_test_db.py +++ b/python/tests/stress_test_db.py @@ -8,7 +8,7 @@ import pytest import deltachat -def test_db_busy_error(acfactory, tmpdir): +def test_db_busy_error(acfactory): starttime = time.time() log_lock = threading.RLock() diff --git a/python/tests/test_0_complex_or_slow.py b/python/tests/test_0_complex_or_slow.py index 736c0d1dd..32d9b82a0 100644 --- a/python/tests/test_0_complex_or_slow.py +++ b/python/tests/test_0_complex_or_slow.py @@ -494,7 +494,7 @@ def test_multidevice_sync_seen(acfactory, lp): assert "Expires: " in ac1_clone_message.get_message_info() -def test_see_new_verified_member_after_going_online(acfactory, tmpdir, lp): +def test_see_new_verified_member_after_going_online(acfactory, tmp_path, lp): """The test for the bug #3836: - Alice has two devices, the second is offline. - Alice creates a verified group and sends a QR invitation to Bob. @@ -507,9 +507,10 @@ def test_see_new_verified_member_after_going_online(acfactory, tmpdir, lp): for ac in [ac1, ac1_offl]: ac.set_config("bcc_self", "1") acfactory.bring_accounts_online() - dir = tmpdir.mkdir("exportdir") - ac1.export_self_keys(dir.strpath) - ac1_offl.import_self_keys(dir.strpath) + dir = tmp_path / "exportdir" + dir.mkdir() + ac1.export_self_keys(str(dir)) + ac1_offl.import_self_keys(str(dir)) ac1_offl.stop_io() lp.sec("ac1: create verified-group QR, ac2 scans and joins") @@ -541,7 +542,7 @@ def test_see_new_verified_member_after_going_online(acfactory, tmpdir, lp): ac1.set_config("bcc_self", "0") -def test_use_new_verified_group_after_going_online(acfactory, tmpdir, lp): +def test_use_new_verified_group_after_going_online(acfactory, tmp_path, lp): """Another test for the bug #3836: - Bob has two devices, the second is offline. - Alice creates a verified group and sends a QR invitation to Bob. @@ -556,9 +557,10 @@ def test_use_new_verified_group_after_going_online(acfactory, tmpdir, lp): for ac in [ac2, ac2_offl]: ac.set_config("bcc_self", "1") acfactory.bring_accounts_online() - dir = tmpdir.mkdir("exportdir") - ac2.export_self_keys(dir.strpath) - ac2_offl.import_self_keys(dir.strpath) + dir = tmp_path / "exportdir" + dir.mkdir() + ac2.export_self_keys(str(dir)) + ac2_offl.import_self_keys(str(dir)) ac2_offl.stop_io() lp.sec("ac1: create verified-group QR, ac2 scans and joins") diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index 84b85014d..b412b1d45 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -13,7 +13,7 @@ from deltachat.message import Message from deltachat.tracker import ImexTracker -def test_basic_imap_api(acfactory, tmpdir): +def test_basic_imap_api(acfactory, tmp_path): ac1, ac2 = acfactory.get_online_accounts(2) chat12 = acfactory.get_accepted_chat(ac1, ac2) @@ -28,7 +28,7 @@ def test_basic_imap_api(acfactory, tmpdir): imap2.mark_all_read() assert imap2.get_unread_cnt() == 0 - imap2.dump_imap_structures(tmpdir, logfile=sys.stdout) + imap2.dump_imap_structures(tmp_path, logfile=sys.stdout) imap2.shutdown() @@ -72,35 +72,37 @@ def test_configure_canceled(acfactory): pass -def test_configure_unref(tmpdir): +def test_configure_unref(tmp_path): """Test that removing the last reference to the context during ongoing configuration does not result in use-after-free.""" from deltachat.capi import ffi, lib - path = tmpdir.mkdir("test_configure_unref").join("dc.db").strpath - dc_context = lib.dc_context_new(ffi.NULL, path.encode("utf8"), ffi.NULL) + path = tmp_path / "test_configure_unref" + path.mkdir() + dc_context = lib.dc_context_new(ffi.NULL, str(path / "dc.db").encode("utf8"), ffi.NULL) lib.dc_set_config(dc_context, "addr".encode("utf8"), "foo@x.testrun.org".encode("utf8")) lib.dc_set_config(dc_context, "mail_pw".encode("utf8"), "abc".encode("utf8")) lib.dc_configure(dc_context) lib.dc_context_unref(dc_context) -def test_export_import_self_keys(acfactory, tmpdir, lp): +def test_export_import_self_keys(acfactory, tmp_path, lp): ac1, ac2 = acfactory.get_online_accounts(2) - dir = tmpdir.mkdir("exportdir") - export_files = ac1.export_self_keys(dir.strpath) + dir = tmp_path / "exportdir" + dir.mkdir() + export_files = ac1.export_self_keys(str(dir)) assert len(export_files) == 2 for x in export_files: - assert x.startswith(dir.strpath) + assert x.startswith(str(dir)) (key_id,) = ac1._evtracker.get_info_regex_groups(r".*xporting.*KeyId\((.*)\).*") ac1._evtracker.consume_events() lp.sec("exported keys (private and public)") - for name in os.listdir(dir.strpath): - lp.indent(dir.strpath + os.sep + name) + for name in dir.iterdir(): + lp.indent(str(dir / name)) lp.sec("importing into existing account") - ac2.import_self_keys(dir.strpath) + ac2.import_self_keys(str(dir)) (key_id2,) = ac2._evtracker.get_info_regex_groups(r".*stored.*KeyId\((.*)\).*") assert key_id2 == key_id @@ -156,20 +158,19 @@ def test_one_account_send_bcc_setting(acfactory, lp): assert len(list(ac1.direct_imap.conn.fetch(AND(seen=True)))) == 1 -def test_send_file_twice_unicode_filename_mangling(tmpdir, acfactory, lp): +def test_send_file_twice_unicode_filename_mangling(tmp_path, acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) chat = acfactory.get_accepted_chat(ac1, ac2) basename = "somedäüta.html.zip" - p = os.path.join(tmpdir.strpath, basename) - with open(p, "w") as f: - f.write("some data") + p = tmp_path / basename + p.write_text("some data") def send_and_receive_message(): lp.sec("ac1: prepare and send attachment + text to ac2") msg1 = Message.new_empty(ac1, "file") msg1.set_text("withfile") - msg1.set_file(p) + msg1.set_file(str(p)) chat.send_msg(msg1) lp.sec("ac2: receive message") @@ -189,21 +190,20 @@ def test_send_file_twice_unicode_filename_mangling(tmpdir, acfactory, lp): assert msg.filename != msg2.filename -def test_send_file_html_attachment(tmpdir, acfactory, lp): +def test_send_file_html_attachment(tmp_path, acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) chat = acfactory.get_accepted_chat(ac1, ac2) basename = "test.html" content = "textdata" - p = os.path.join(tmpdir.strpath, basename) - with open(p, "w") as f: - # write wrong html to see if core tries to parse it - # (it shouldn't as it's a file attachment) - f.write(content) + p = tmp_path / basename + # write wrong html to see if core tries to parse it + # (it shouldn't as it's a file attachment) + p.write_text(content) lp.sec("ac1: prepare and send attachment + text to ac2") - chat.send_file(p, mime_type="text/html") + chat.send_file(str(p), mime_type="text/html") lp.sec("ac2: receive message") ev = ac2._evtracker.get_matching("DC_EVENT_INCOMING_MSG") @@ -1207,7 +1207,7 @@ def test_quote_encrypted(acfactory, lp): assert msg_in.is_encrypted() == quoted_msg.is_encrypted() -def test_quote_attachment(tmpdir, acfactory, lp): +def test_quote_attachment(tmp_path, acfactory, lp): """Test that replies with an attachment and a quote are received correctly.""" ac1, ac2 = acfactory.get_online_accounts(2) @@ -1222,15 +1222,14 @@ def test_quote_attachment(tmpdir, acfactory, lp): assert received_message.text == "hi" basename = "attachment.txt" - p = os.path.join(tmpdir.strpath, basename) - with open(p, "w") as f: - f.write("data to send") + p = tmp_path / basename + p.write_text("data to send") lp.sec("ac2 sends a reply to ac1") chat2 = received_message.create_chat() reply = Message.new_empty(ac2, "file") reply.set_text("message reply") - reply.set_file(p) + reply.set_file(str(p)) reply.quote = received_message chat2.send_msg(reply) @@ -1337,7 +1336,7 @@ def test_send_and_receive_image(acfactory, lp, data): assert m == msg_in -def test_reaction_to_partially_fetched_msg(acfactory, lp, tmpdir): +def test_reaction_to_partially_fetched_msg(acfactory, lp, tmp_path): """See https://github.com/deltachat/deltachat-core-rust/issues/3688 "Partially downloaded messages are received out of order". @@ -1372,10 +1371,9 @@ def test_reaction_to_partially_fetched_msg(acfactory, lp, tmpdir): lp.sec("sending small+large messages from ac1 to ac2") msgs = [] msgs.append(chat.send_text("hi")) - path = tmpdir.join("large") - with open(path, "wb") as fout: - fout.write(os.urandom(download_limit + 1)) - msgs.append(chat.send_file(path.strpath)) + path = tmp_path / "large" + path.write_bytes(os.urandom(download_limit + 1)) + msgs.append(chat.send_file(str(path))) lp.sec("sending a reaction to the large message from ac1 to ac2") react_str = "\N{THUMBS UP SIGN}" @@ -1434,7 +1432,7 @@ def test_reactions_for_a_reordering_move(acfactory, lp): assert reactions.get_by_contact(contacts[0]) == react_str -def test_import_export_online_all(acfactory, tmpdir, data, lp): +def test_import_export_online_all(acfactory, tmp_path, data, lp): (ac1,) = acfactory.get_online_accounts(1) lp.sec("create some chat content") @@ -1446,10 +1444,10 @@ def test_import_export_online_all(acfactory, tmpdir, data, lp): chat1.send_image(original_image_path) # Add another 100KB file that ensures that the progress is smooth enough - path = tmpdir.join("attachment.txt") - with open(path, "w") as file: + path = tmp_path / "attachment.txt" + with path.open("w") as file: file.truncate(100000) - chat1.send_file(path.strpath) + chat1.send_file(str(path)) def assert_account_is_proper(ac): contacts = ac.get_contacts(query="some1") @@ -1467,12 +1465,13 @@ def test_import_export_online_all(acfactory, tmpdir, data, lp): assert_account_is_proper(ac1) - backupdir = tmpdir.mkdir("backup") + backupdir = tmp_path / "backup" + backupdir.mkdir() lp.sec(f"export all to {backupdir}") with ac1.temp_plugin(ImexTracker()) as imex_tracker: ac1.stop_io() - ac1.imex(backupdir.strpath, const.DC_IMEX_EXPORT_BACKUP) + ac1.imex(str(backupdir), const.DC_IMEX_EXPORT_BACKUP) # check progress events for export assert imex_tracker.wait_progress(1, progress_upper_limit=249) @@ -1490,7 +1489,7 @@ def test_import_export_online_all(acfactory, tmpdir, data, lp): ac2 = acfactory.get_unconfigured_account() lp.sec("get latest backup file") - path2 = ac2.get_latest_backupfile(backupdir.strpath) + path2 = ac2.get_latest_backupfile(str(backupdir)) assert path2 == path lp.sec("import backup and check it's proper") @@ -1508,10 +1507,10 @@ def test_import_export_online_all(acfactory, tmpdir, data, lp): lp.sec(f"Second-time export all to {backupdir}") ac1.stop_io() - path2 = ac1.export_all(backupdir.strpath) + path2 = ac1.export_all(str(backupdir)) assert os.path.exists(path2) assert path2 != path - assert ac2.get_latest_backupfile(backupdir.strpath) == path2 + assert ac2.get_latest_backupfile(str(backupdir)) == path2 def test_ac_setup_message(acfactory, lp): diff --git a/python/tests/test_2_increation.py b/python/tests/test_2_increation.py index c7e35119a..761b3eb86 100644 --- a/python/tests/test_2_increation.py +++ b/python/tests/test_2_increation.py @@ -30,25 +30,26 @@ def wait_msgs_changed(account, msgs_list): class TestOnlineInCreation: - def test_increation_not_blobdir(self, tmpdir, acfactory, lp): + def test_increation_not_blobdir(self, tmp_path, acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) chat = ac1.create_chat(ac2) lp.sec("Creating in-creation file outside of blobdir") - assert tmpdir.strpath != ac1.get_blobdir() - src = tmpdir.join("file.txt").ensure(file=1) + assert str(tmp_path) != ac1.get_blobdir() + src = tmp_path / "file.txt" + src.touch() with pytest.raises(Exception): - chat.prepare_message_file(src.strpath) + chat.prepare_message_file(str(src)) - def test_no_increation_copies_to_blobdir(self, tmpdir, acfactory, lp): + def test_no_increation_copies_to_blobdir(self, tmp_path, acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) chat = ac1.create_chat(ac2) lp.sec("Creating file outside of blobdir") - assert tmpdir.strpath != ac1.get_blobdir() - src = tmpdir.join("file.txt") - src.write("hello there\n") - chat.send_file(src.strpath) + assert str(tmp_path) != ac1.get_blobdir() + src = tmp_path / "file.txt" + src.write_text("hello there\n") + chat.send_file(str(src)) blob_src = os.path.join(ac1.get_blobdir(), "file.txt") assert os.path.exists(blob_src), "file.txt not copied to blobdir" diff --git a/python/tests/test_3_offline.py b/python/tests/test_3_offline.py index e9a297681..50a95ed61 100644 --- a/python/tests/test_3_offline.py +++ b/python/tests/test_3_offline.py @@ -52,18 +52,18 @@ def test_parse_system_add_remove(msgtext, res): class TestOfflineAccountBasic: - def test_wrong_db(self, tmpdir): - p = tmpdir.join("hello.db") - p.write("123") - account = Account(p.strpath) + def test_wrong_db(self, tmp_path): + p = tmp_path / "hello.db" + p.write_text("123") + account = Account(str(p)) assert not account.is_open() - def test_os_name(self, tmpdir): - p = tmpdir.join("hello.db") + def test_os_name(self, tmp_path): + p = tmp_path / "hello.db" # we can't easily test if os_name is used in X-Mailer # outgoing messages without a full Online test # but we at least check Account accepts the arg - ac1 = Account(p.strpath, os_name="solarpunk") + ac1 = Account(str(p), os_name="solarpunk") ac1.get_info() def test_preconfigure_keypair(self, acfactory, data): @@ -496,22 +496,22 @@ class TestOfflineChat: contact = msg.get_sender_contact() assert contact == ac1.get_self_contact() - def test_import_export_on_unencrypted_acct(self, acfactory, tmpdir): - backupdir = tmpdir.mkdir("backup") + def test_import_export_on_unencrypted_acct(self, acfactory, tmp_path): + backupdir = tmp_path / "backup" + backupdir.mkdir() ac1 = acfactory.get_pseudo_configured_account() chat = ac1.create_contact("some1 ").create_chat() # send a text message msg = chat.send_text("msg1") # send a binary file - bin = tmpdir.join("some.bin") - with bin.open("w") as f: - f.write("\00123" * 10000) - msg = chat.send_file(bin.strpath) + bin = tmp_path / "some.bin" + bin.write_bytes(b"\00123" * 10000) + msg = chat.send_file(str(bin)) contact = msg.get_sender_contact() assert contact == ac1.get_self_contact() - assert not backupdir.listdir() + assert not list(backupdir.iterdir()) ac1.stop_io() - path = ac1.export_all(backupdir.strpath) + path = ac1.export_all(str(backupdir)) assert os.path.exists(path) ac2 = acfactory.get_unconfigured_account() ac2.import_all(path) @@ -525,27 +525,27 @@ class TestOfflineChat: assert messages[0].text == "msg1" assert os.path.exists(messages[1].filename) - def test_import_export_on_encrypted_acct(self, acfactory, tmpdir): + def test_import_export_on_encrypted_acct(self, acfactory, tmp_path): passphrase1 = "passphrase1" passphrase2 = "passphrase2" - backupdir = tmpdir.mkdir("backup") + backupdir = tmp_path / "backup" + backupdir.mkdir() ac1 = acfactory.get_pseudo_configured_account(passphrase=passphrase1) chat = ac1.create_contact("some1 ").create_chat() # send a text message msg = chat.send_text("msg1") # send a binary file - bin = tmpdir.join("some.bin") - with bin.open("w") as f: - f.write("\00123" * 10000) - msg = chat.send_file(bin.strpath) + bin = tmp_path / "some.bin" + bin.write_bytes(b"\00123" * 10000) + msg = chat.send_file(str(bin)) contact = msg.get_sender_contact() assert contact == ac1.get_self_contact() - assert not backupdir.listdir() + assert not list(backupdir.iterdir()) ac1.stop_io() - path = ac1.export_all(backupdir.strpath) + path = ac1.export_all(str(backupdir)) assert os.path.exists(path) ac2 = acfactory.get_unconfigured_account(closed=True) @@ -580,27 +580,27 @@ class TestOfflineChat: assert messages[0].text == "msg1" assert os.path.exists(messages[1].filename) - def test_import_export_with_passphrase(self, acfactory, tmpdir): + def test_import_export_with_passphrase(self, acfactory, tmp_path): passphrase = "test_passphrase" wrong_passphrase = "wrong_passprase" - backupdir = tmpdir.mkdir("backup") + backupdir = tmp_path / "backup" + backupdir.mkdir() ac1 = acfactory.get_pseudo_configured_account() chat = ac1.create_contact("some1 ").create_chat() # send a text message msg = chat.send_text("msg1") # send a binary file - bin = tmpdir.join("some.bin") - with bin.open("w") as f: - f.write("\00123" * 10000) - msg = chat.send_file(bin.strpath) + bin = tmp_path / "some.bin" + bin.write_bytes(b"\00123" * 10000) + msg = chat.send_file(str(bin)) contact = msg.get_sender_contact() assert contact == ac1.get_self_contact() - assert not backupdir.listdir() + assert not list(backupdir.iterdir()) ac1.stop_io() - path = ac1.export_all(backupdir.strpath, passphrase) + path = ac1.export_all(str(backupdir), passphrase) assert os.path.exists(path) ac2 = acfactory.get_unconfigured_account() @@ -619,7 +619,7 @@ class TestOfflineChat: assert messages[0].text == "msg1" assert os.path.exists(messages[1].filename) - def test_import_encrypted_bak_into_encrypted_acct(self, acfactory, tmpdir): + def test_import_encrypted_bak_into_encrypted_acct(self, acfactory, tmp_path): """ Test that account passphrase isn't lost if backup failed to be imported. See https://github.com/deltachat/deltachat-core-rust/issues/3379 @@ -627,24 +627,24 @@ class TestOfflineChat: acct_passphrase = "passphrase1" bak_passphrase = "passphrase2" wrong_passphrase = "wrong_passprase" - backupdir = tmpdir.mkdir("backup") + backupdir = tmp_path / "backup" + backupdir.mkdir() ac1 = acfactory.get_pseudo_configured_account() chat = ac1.create_contact("some1 ").create_chat() # send a text message msg = chat.send_text("msg1") # send a binary file - bin = tmpdir.join("some.bin") - with bin.open("w") as f: - f.write("\00123" * 10000) - msg = chat.send_file(bin.strpath) + bin = tmp_path / "some.bin" + bin.write_bytes(b"\00123" * 10000) + msg = chat.send_file(str(bin)) contact = msg.get_sender_contact() assert contact == ac1.get_self_contact() - assert not backupdir.listdir() + assert not list(backupdir.iterdir()) ac1.stop_io() - path = ac1.export_all(backupdir.strpath, bak_passphrase) + path = ac1.export_all(str(backupdir), bak_passphrase) assert os.path.exists(path) ac2 = acfactory.get_unconfigured_account(closed=True) diff --git a/python/tests/test_4_lowlevel.py b/python/tests/test_4_lowlevel.py index 1c3f15bea..ac7ce1f12 100644 --- a/python/tests/test_4_lowlevel.py +++ b/python/tests/test_4_lowlevel.py @@ -1,4 +1,3 @@ -import os from queue import Queue from deltachat import capi, const, cutil, register_global_plugin @@ -65,16 +64,17 @@ class TestACSetup: assert pc._account2state[ac1] == pc.IDLEREADY assert pc._account2state[ac2] == pc.IDLEREADY - def test_store_and_retrieve_configured_account_cache(self, acfactory, tmpdir): + def test_store_and_retrieve_configured_account_cache(self, acfactory, tmp_path): ac1 = acfactory.get_pseudo_configured_account() holder = acfactory._acsetup.testprocess assert holder.cache_maybe_store_configured_db_files(ac1) assert not holder.cache_maybe_store_configured_db_files(ac1) - acdir = tmpdir.mkdir("newaccount") + acdir = tmp_path / "newaccount" + acdir.mkdir() addr = ac1.get_config("addr") - target_db_path = acdir.join("db").strpath - assert holder.cache_maybe_retrieve_configured_db_files(addr, target_db_path) - assert len(os.listdir(acdir)) >= 2 + target_db_path = acdir / "db" + assert holder.cache_maybe_retrieve_configured_db_files(addr, str(target_db_path)) + assert sum(1 for _ in acdir.iterdir()) >= 2 def test_liveconfig_caching(acfactory, monkeypatch): @@ -112,20 +112,20 @@ def test_dc_close_events(acfactory): shutdowns.get(timeout=2) -def test_wrong_db(tmpdir): - p = tmpdir.join("hello.db") +def test_wrong_db(tmp_path): + p = tmp_path / "hello.db" # write an invalid database file - p.write("x123" * 10) + p.write_bytes(b"x123" * 10) - context = lib.dc_context_new(ffi.NULL, p.strpath.encode("ascii"), ffi.NULL) + context = lib.dc_context_new(ffi.NULL, str(p).encode("ascii"), ffi.NULL) assert not lib.dc_context_is_open(context) -def test_empty_blobdir(tmpdir): - db_fname = tmpdir.join("hello.db") +def test_empty_blobdir(tmp_path): + db_fname = tmp_path / "hello.db" # Apparently some client code expects this to be the same as passing NULL. ctx = ffi.gc( - lib.dc_context_new(ffi.NULL, db_fname.strpath.encode("ascii"), b""), + lib.dc_context_new(ffi.NULL, str(db_fname).encode("ascii"), b""), lib.dc_context_unref, ) assert ctx != ffi.NULL @@ -174,10 +174,10 @@ def test_provider_info_none(): assert lib.dc_provider_new_from_email(ctx, cutil.as_dc_charpointer("email@unexistent.no")) == ffi.NULL -def test_get_info_open(tmpdir): - db_fname = tmpdir.join("test.db") +def test_get_info_open(tmp_path): + db_fname = tmp_path / "test.db" ctx = ffi.gc( - lib.dc_context_new(ffi.NULL, db_fname.strpath.encode("ascii"), ffi.NULL), + lib.dc_context_new(ffi.NULL, str(db_fname).encode("ascii"), ffi.NULL), lib.dc_context_unref, ) info = cutil.from_dc_charpointer(lib.dc_get_info(ctx)) @@ -218,10 +218,10 @@ def test_logged_ac_process_ffi_failure(acfactory): assert "Traceback" in res -def test_jsonrpc_blocking_call(tmpdir): - accounts_fname = tmpdir.join("accounts") +def test_jsonrpc_blocking_call(tmp_path): + accounts_fname = tmp_path / "accounts" accounts = ffi.gc( - lib.dc_accounts_new(ffi.NULL, accounts_fname.strpath.encode("ascii")), + lib.dc_accounts_new(ffi.NULL, str(accounts_fname).encode("ascii")), lib.dc_accounts_unref, ) jsonrpc = ffi.gc(lib.dc_jsonrpc_init(accounts), lib.dc_jsonrpc_unref) From cbe16711043988f48fe0f76ff795e2a150d50720 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 13 Jun 2023 16:51:53 +0000 Subject: [PATCH 156/528] ci(concourse): install devpi in a virtual environment This commit solves the "error: externally-managed-environment" which started appearing since Debian 12 release. `debian` is used as an Docker image to run devpi. --- scripts/concourse/docs_wheels.yml | 42 ++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/scripts/concourse/docs_wheels.yml b/scripts/concourse/docs_wheels.yml index 3f461ad20..c8f3b5b34 100644 --- a/scripts/concourse/docs_wheels.yml +++ b/scripts/concourse/docs_wheels.yml @@ -153,11 +153,13 @@ jobs: - -ec - | apt-get update -y - apt-get install -y --no-install-recommends python3-pip python3-setuptools - pip3 install devpi - devpi use https://m.devpi.net/dc/master - devpi login ((devpi.login)) --password ((devpi.password)) - devpi upload py-wheels/*manylinux201* + apt-get install -y --no-install-recommends python3-pip python3-setuptools python3-venv + python3 -m venv env + env/bin/pip install --upgrade pip + env/bin/pip install devpi + env/bin/devpi use https://m.devpi.net/dc/master + env/bin/devpi login ((devpi.login)) --password ((devpi.password)) + env/bin/devpi upload py-wheels/*manylinux201* - name: python-aarch64 plan: @@ -224,10 +226,12 @@ jobs: - | apt-get update -y apt-get install -y --no-install-recommends python3-pip python3-setuptools - pip3 install devpi - devpi use https://m.devpi.net/dc/master - devpi login ((devpi.login)) --password ((devpi.password)) - devpi upload py-wheels/*manylinux201* + python3 -m venv env + env/bin/pip install --upgrade pip + env/bin/pip install devpi + env/bin/devpi use https://m.devpi.net/dc/master + env/bin/devpi login ((devpi.login)) --password ((devpi.password)) + env/bin/devpi upload py-wheels/*manylinux201* - name: python-musl-x86_64 plan: @@ -294,10 +298,12 @@ jobs: - | apt-get update -y apt-get install -y --no-install-recommends python3-pip python3-setuptools - pip3 install devpi - devpi use https://m.devpi.net/dc/master - devpi login ((devpi.login)) --password ((devpi.password)) - devpi upload py-wheels/*musllinux_1_1_x86_64* + python3 -m venv env + env/bin/pip install --upgrade pip + env/bin/pip install devpi + env/bin/devpi use https://m.devpi.net/dc/master + env/bin/devpi login ((devpi.login)) --password ((devpi.password)) + env/bin/devpi upload py-wheels/*musllinux_1_1_x86_64* - name: python-musl-aarch64 plan: @@ -364,7 +370,9 @@ jobs: - | apt-get update -y apt-get install -y --no-install-recommends python3-pip python3-setuptools - pip3 install devpi - devpi use https://m.devpi.net/dc/master - devpi login ((devpi.login)) --password ((devpi.password)) - devpi upload py-wheels/*musllinux_1_1_aarch64* + python3 -m venv env + env/bin/pip install --upgrade pip + env/bin/pip install devpi + env/bin/devpi use https://m.devpi.net/dc/master + env/bin/devpi login ((devpi.login)) --password ((devpi.password)) + env/bin/devpi upload py-wheels/*musllinux_1_1_aarch64* From 53ab8a3b351ad0ad399bd3087656b00e846cdeca Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 13 Jun 2023 17:41:37 +0000 Subject: [PATCH 157/528] fix: update to async-imap 0.9.0 to remove deprecated `ouroboros` dependency `ouroboros` is deprecated with a security advisory recommending switch to `self_cell` crate: https://rustsec.org/advisories/RUSTSEC-2023-0042 async-imap 0.9.0 depends on `self_cell` instead of `ouroboros`. --- Cargo.lock | 47 +++++++++-------------------------------------- Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 634d081f5..251bee6a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - [[package]] name = "abao" version = "0.2.0" @@ -67,12 +61,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -216,9 +204,9 @@ dependencies = [ [[package]] name = "async-imap" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11e163a705d0c809dfc886eee95df5117c758539c940c0fe9aa3aa4da5388ce" +checksum = "da93622739d458dd9a6abc1abf0e38e81965a5824a3b37f9500437c82a8bb572" dependencies = [ "async-channel", "base64 0.21.2", @@ -229,8 +217,8 @@ dependencies = [ "log", "nom", "once_cell", - "ouroboros", "pin-utils", + "self_cell", "stop-token", "thiserror", "tokio", @@ -3168,29 +3156,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "ouroboros" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" -dependencies = [ - "aliasable", - "ouroboros_macro", -] - -[[package]] -name = "ouroboros_macro" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" -dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "output_vt100" version = "0.1.3" @@ -4311,6 +4276,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "semver" version = "1.0.16" diff --git a/Cargo.toml b/Cargo.toml index 85649bf97..c8a595c5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ ratelimit = { path = "./deltachat-ratelimit" } anyhow = "1" async-channel = "1.8.0" -async-imap = { version = "0.8.0", default-features = false, features = ["runtime-tokio"] } +async-imap = { version = "0.9.0", default-features = false, features = ["runtime-tokio"] } async-native-tls = { version = "0.5", default-features = false, features = ["runtime-tokio"] } async-smtp = { version = "0.9", default-features = false, features = ["runtime-tokio"] } async_zip = { version = "0.0.12", default-features = false, features = ["deflate", "fs"] } From 8214b2b8c1dbc66736f9b536e47e0ab6364c94af Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 14 Jun 2023 13:51:37 +0000 Subject: [PATCH 158/528] docs: document how conventional commits interact with squash merges --- CONTRIBUTING.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b1b23ba45..5bb9ea6f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,13 @@ If you have a feature request, create a new topic on the [forum](https://support ## Contributing code -If you want to contribute a code, [open a pull request](https://github.com/deltachat/deltachat-core-rust/pulls). +If you want to contribute a code, [open a Pull Request](https://github.com/deltachat/deltachat-core-rust/pulls). + +If you have write access to the repository, +push a branch named `/` +so it is clear who is responsible for the branch, +and open a PR proposing to merge the change. +Otherwise fork the repository and create a branch in your fork. You can find the list of good first issues and a link to this guide @@ -45,6 +51,11 @@ The following prefix types are used: Release preparation commits are marked as "chore(release): prepare for vX.Y.Z". +If you intend to squash merge the PR from the web interface, +make sure the PR title follows the conventional commits notation +as it will end up being a commit title. +Otherwise make sure each commit title follows the conventional commit notation. + #### Breaking Changes Use a `!` to mark breaking changes, e.g. "api!: Remove `dc_chat_can_send`". @@ -65,6 +76,17 @@ If you have multiple changes in one PR, create multiple conventional commits, an [Conventional Commits]: https://www.conventionalcommits.org/ [git-cliff]: https://git-cliff.org/ +### Reviewing + +Once a PR has an approval and passes CI, it can be merged. + +PRs from a branch created in the main repository, i.e. authored by those who have write access, are merged by their authors. +This is to ensure that PRs are merged as intended by the author, +e.g. as a squash merge, by rebasing from the web interface or manually from the command line. + +If you do not have access to the repository and created a PR from a fork, +ask the maintainers to merge the PR and say how it should be merged. + ## Other ways to contribute For other ways to contribute, refer to the [website](https://delta.chat/en/contribute). From 5ac2d1b8cb2626b25f165e561644cb29f323e2e9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 14 Jun 2023 13:52:58 +0000 Subject: [PATCH 159/528] ci: remove mergeable configuration Mergeable is disabled because it was requiring that PR title follows conventional commit notation even when PR consisted of multiple commits and was not planned to be squash merged. --- .github/mergeable.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/mergeable.yml diff --git a/.github/mergeable.yml b/.github/mergeable.yml deleted file mode 100644 index 0c06cb8bd..000000000 --- a/.github/mergeable.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: 2 -mergeable: - - when: pull_request.* - name: "Conventional Commits" - validate: - - do: title - begins_with: - match: ['feat', 'fix', 'api', 'refactor', 'perf', 'test', 'style', 'chore', 'cargo', 'build', 'ci', 'docs'] - - fail: - - do: checks - status: "action_required" - payload: - title: PR title should follow conventional commits - summary: "PR title should follow https://conventionalcommits.org. See https://github.com/deltachat/deltachat-core-rust/blob/master/CONTRIBUTING.md for details." From c3f352aff109914e5e2a15895fd63e3c56108338 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 13 Jun 2023 12:16:00 +0000 Subject: [PATCH 160/528] fix(dehtml): skip links with empty text --- src/dehtml.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/dehtml.rs b/src/dehtml.rs index 9f786a71a..dba2c14c0 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -165,9 +165,13 @@ fn dehtml_endtag_cb(event: &BytesEnd, dehtml: &mut Dehtml) { } "a" => { if let Some(ref last_href) = dehtml.last_href.take() { - dehtml.strbuilder += "]("; - dehtml.strbuilder += last_href; - dehtml.strbuilder += ")"; + if dehtml.strbuilder.ends_with('[') { + dehtml.strbuilder.truncate(dehtml.strbuilder.len() - 1); + } else { + dehtml.strbuilder += "]("; + dehtml.strbuilder += last_href; + dehtml.strbuilder += ")"; + } } } "b" | "strong" => { @@ -323,9 +327,10 @@ mod tests { ("& bar", "& bar"), // Despite missing ', this should be shown: ("
", "No link: "), ( - "", - "[](https://get.delta.chat/)", + "No link: ", + "No link: ", ), ("\nfat text", "*fat text*"), // Invalid html (at least DC should show the text if the html is invalid): From 768f8175e689cbd96e594138522d2df78d87fe5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= <39526136+Septias@users.noreply.github.com> Date: Thu, 15 Jun 2023 15:35:57 +0200 Subject: [PATCH 161/528] api(rust): Add api endpoint `get_status_update` (#4468) * start * derive default * make some webxdc file public * shorten code * Add from for chatid * reduce changes to a bare minimum * fix nested errors * @hocuris fixes * fix @link2xt changes --------- Co-authored-by: septias --- src/webxdc.rs | 54 +++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/webxdc.rs b/src/webxdc.rs index d4398fdf6..c98ed30f2 100644 --- a/src/webxdc.rs +++ b/src/webxdc.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; use std::path::Path; -use anyhow::{anyhow, bail, ensure, format_err, Result}; +use anyhow::{anyhow, bail, ensure, format_err, Context as _, Result}; use deltachat_derive::FromSql; use lettre_email::mime; @@ -53,20 +53,20 @@ const WEBXDC_SENDING_LIMIT: u64 = 655360; const WEBXDC_RECEIVING_LIMIT: u64 = 4194304; /// Raw information read from manifest.toml -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Default)] #[non_exhaustive] -struct WebxdcManifest { +pub struct WebxdcManifest { /// Webxdc name, used on icons or page titles. - name: Option, + pub name: Option, /// Minimum API version required to run this webxdc. - min_api: Option, + pub min_api: Option, /// Optional URL of webxdc source code. - source_code_url: Option, + pub source_code_url: Option, /// If the webxdc requests network access. - request_internet_access: Option, + pub request_internet_access: Option, } /// Parsed information from WebxdcManifest and fallbacks. @@ -143,7 +143,7 @@ struct StatusUpdates { } /// Update items as sent on the wire and as stored in the database. -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Default)] pub struct StatusUpdateItem { /// The playload of the status update. pub payload: Value, @@ -391,6 +391,21 @@ impl Context { Ok(status_update_serial) } + /// Returns the update_item with `status_update_serial` from the webxdc with message id `msg_id`. + pub async fn get_status_update( + &self, + msg_id: MsgId, + status_update_serial: StatusUpdateSerial, + ) -> Result { + self.sql + .query_get_value( + "SELECT update_item FROM msgs_status_updates WHERE id=? AND msg_id=? ", + (status_update_serial.0, msg_id), + ) + .await? + .context("get_status_update: no update item found.") + } + /// Sends a status update for an webxdc instance. /// /// If the instance is a draft, @@ -748,25 +763,10 @@ impl Message { ensure!(self.viewtype == Viewtype::Webxdc, "No webxdc instance."); let mut archive = self.get_webxdc_archive(context).await?; - let mut manifest = if let Ok(bytes) = get_blob(&mut archive, "manifest.toml").await { - if let Ok(manifest) = parse_webxdc_manifest(&bytes) { - manifest - } else { - WebxdcManifest { - name: None, - min_api: None, - source_code_url: None, - request_internet_access: None, - } - } - } else { - WebxdcManifest { - name: None, - min_api: None, - source_code_url: None, - request_internet_access: None, - } - }; + let mut manifest = get_blob(&mut archive, "manifest.toml") + .await + .map(|bytes| parse_webxdc_manifest(&bytes).unwrap_or_default()) + .unwrap_or_default(); if let Some(ref name) = manifest.name { let name = name.trim(); From 65bff8339f6da50e4a8dc77e39a586d978f784b7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 14:27:45 +0000 Subject: [PATCH 162/528] chore: update generated node files --- node/constants.js | 1 + node/events.js | 1 + node/lib/constants.ts | 2 ++ 3 files changed, 4 insertions(+) diff --git a/node/constants.js b/node/constants.js index 3c8816502..d55d92782 100644 --- a/node/constants.js +++ b/node/constants.js @@ -48,6 +48,7 @@ module.exports = { DC_EVENT_LOCATION_CHANGED: 2035, DC_EVENT_MSGS_CHANGED: 2000, DC_EVENT_MSGS_NOTICED: 2008, + DC_EVENT_MSG_DELETED: 2016, DC_EVENT_MSG_DELIVERED: 2010, DC_EVENT_MSG_FAILED: 2012, DC_EVENT_MSG_READ: 2015, diff --git a/node/events.js b/node/events.js index d27fd1829..5a24586a2 100644 --- a/node/events.js +++ b/node/events.js @@ -22,6 +22,7 @@ module.exports = { 2010: 'DC_EVENT_MSG_DELIVERED', 2012: 'DC_EVENT_MSG_FAILED', 2015: 'DC_EVENT_MSG_READ', + 2016: 'DC_EVENT_MSG_DELETED', 2020: 'DC_EVENT_CHAT_MODIFIED', 2021: 'DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED', 2030: 'DC_EVENT_CONTACTS_CHANGED', diff --git a/node/lib/constants.ts b/node/lib/constants.ts index 8b6a61ebb..cacbd570d 100644 --- a/node/lib/constants.ts +++ b/node/lib/constants.ts @@ -48,6 +48,7 @@ export enum C { DC_EVENT_LOCATION_CHANGED = 2035, DC_EVENT_MSGS_CHANGED = 2000, DC_EVENT_MSGS_NOTICED = 2008, + DC_EVENT_MSG_DELETED = 2016, DC_EVENT_MSG_DELIVERED = 2010, DC_EVENT_MSG_FAILED = 2012, DC_EVENT_MSG_READ = 2015, @@ -307,6 +308,7 @@ export const EventId2EventName: { [key: number]: string } = { 2010: 'DC_EVENT_MSG_DELIVERED', 2012: 'DC_EVENT_MSG_FAILED', 2015: 'DC_EVENT_MSG_READ', + 2016: 'DC_EVENT_MSG_DELETED', 2020: 'DC_EVENT_CHAT_MODIFIED', 2021: 'DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED', 2030: 'DC_EVENT_CONTACTS_CHANGED', From 92e34d67e627b11bac7fa9ef7671ea5fe75d39bf Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 14:32:09 +0000 Subject: [PATCH 163/528] chore: add `openrpc.json` to `.gitignore` --- deltachat-jsonrpc/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/deltachat-jsonrpc/.gitignore b/deltachat-jsonrpc/.gitignore index c12c4a8ba..33653476a 100644 --- a/deltachat-jsonrpc/.gitignore +++ b/deltachat-jsonrpc/.gitignore @@ -1,3 +1,4 @@ +openrpc/openrpc.json accounts/ .cargo \ No newline at end of file From 00cb72f04db7d805723a82dee4b67573c7c1b937 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 13:45:39 +0000 Subject: [PATCH 164/528] fix(dehtml): do not insert unnecessary newlines when parsing

tags Previously, parsing of `

Foo

Bar

` resulted in `\n\nFoo\n\n\n\nBar\n\n`. Now it results in `Foo\n\nBar`. --- src/dehtml.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/dehtml.rs b/src/dehtml.rs index dba2c14c0..03b40b3f5 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -152,7 +152,7 @@ fn dehtml_endtag_cb(event: &BytesEnd, dehtml: &mut Dehtml) { .to_lowercase(); match tag.as_str() { - "p" | "table" | "td" | "style" | "script" | "title" | "pre" => { + "style" | "script" | "title" | "pre" => { dehtml.strbuilder += &dehtml.append_prefix("\n\n"); dehtml.add_text = AddText::YesRemoveLineEnds; } @@ -200,7 +200,9 @@ fn dehtml_starttag_cb( match tag.as_str() { "p" | "table" | "td" => { - dehtml.strbuilder += &dehtml.append_prefix("\n\n"); + if !dehtml.strbuilder.is_empty() { + dehtml.strbuilder += &dehtml.append_prefix("\n\n"); + } dehtml.add_text = AddText::YesRemoveLineEnds; } #[rustfmt::skip] @@ -353,6 +355,21 @@ mod tests { assert_eq!(plain, "line1\n\r\r\rline2\nline3"); } + #[test] + fn test_dehtml_parse_p() { + let html = "

Foo

Bar

"; + let plain = dehtml(html).unwrap(); + assert_eq!(plain, "Foo\n\nBar"); + + let html = "

Foo

Bar"; + let plain = dehtml(html).unwrap(); + assert_eq!(plain, "Foo\n\nBar"); + + let html = "

Foo

Bar

Baz"; + let plain = dehtml(html).unwrap(); + assert_eq!(plain, "Foo\n\nBar\n\nBaz"); + } + #[test] fn test_dehtml_parse_href() { let html = "text Date: Thu, 15 Jun 2023 16:39:19 +0000 Subject: [PATCH 165/528] chore(release): prepare for 1.117.0 --- CHANGELOG.md | 81 +++++++++++++++++++++++ Cargo.lock | 10 +-- Cargo.toml | 2 +- deltachat-ffi/Cargo.toml | 2 +- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-jsonrpc/typescript/package.json | 2 +- deltachat-repl/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- package.json | 2 +- release-date.in | 2 +- 10 files changed, 94 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cb344793..1984b44eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,86 @@ # Changelog +## [1.117.0] - 2023-06-15 + +### Features + +- New group membership update algorithm. + + New algorithm improves group consistency + in cases of missing messages, + restored old backups and replies from classic MUAs. + +- Add `DC_EVENT_MSG_DELETED` event. + + This event notifies the UI about the message + being deleted from the messagelist, e.g. when the message expires + or the user deletes it. + +### Fixes + +- Emit `DC_EVENT_MSGS_CHANGED` without IDs when the message expires. + + Specifying msg IDs that cannot be loaded in the event payload + results in an error when the UI tries to load the message. + Instead, emit an event without IDs + to make the UI reload the whole messagelist. + +- Ignore address case when comparing the `To:` field to `Autocrypt-Gossip:`. + + This bug resulted in failure to propagate verification + if the contact list already contained a new verified group member + with a non-lowercase address. + +- dehtml: skip links with empty text. + + Links like `` in HTML mails are now skipped + instead of being converted to a link without a label like `[](https://delta.chat/)`. + +- dehtml: Do not insert unnecessary newlines when parsing `

` tags. + +- Update from yanked `libc` 0.2.145 to 0.2.146. +- Update to async-imap 0.9.0 to remove deprecated `ouroboros` dependency. + +### API-Changes + +- Emit `DC_EVENT_MSGS_CHANGED` per chat when messages are deleted. + + Previously a single event with zero chat ID was emitted. + +- python: make `Contact.is_verified()` return bool. + +- rust: add API endpoint `get_status_update` ([#4468](https://github.com/deltachat/deltachat-core-rust/pull/4468)). + +- rust: make `WebxdcManifest` type public. + +### Build system + +- Use Rust 1.70.0 to compile deltachat-rpc-server releases. +- Disable unused `brotli` feature `ffi-api` and use 1 codegen-units for release builds to reduce the size of the binaries. + +### CI + +- Run `cargo check` with musl libc. +- concourse: Install devpi in a virtual environment. +- Remove [mergeable](https://mergeable.us/) configuration. + +### Documentation + +- README: mark napi.rs bindings as experimental. CFFI bindings are not legacy and are the recommended Node.js bindings currently. +- CONTRIBUTING: document how conventional commits interact with squash merges. + +### Refactor + +- Rename `MimeMessage.header` into `MimeMessage.headers`. + +- Derive `Default` trait for `WebxdcManifest`. + +### Tests + +- Regression test for case-sensitive comparison of gossip header to contact address. +- Multiple new group consistency tests in Rust. +- python: Replace legacy `tmpdir` fixture with `tmp_path`. + ## [1.116.0] - 2023-06-05 ### API-Changes diff --git a/Cargo.lock b/Cargo.lock index 251bee6a5..24a4c1819 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1148,7 +1148,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.116.0" +version = "1.117.0" dependencies = [ "ansi_term", "anyhow", @@ -1224,7 +1224,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.116.0" +version = "1.117.0" dependencies = [ "anyhow", "async-channel", @@ -1248,7 +1248,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.116.0" +version = "1.117.0" dependencies = [ "ansi_term", "anyhow", @@ -1263,7 +1263,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.116.0" +version = "1.117.0" dependencies = [ "anyhow", "deltachat", @@ -1288,7 +1288,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.116.0" +version = "1.117.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index c8a595c5c..56553e32a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.116.0" +version = "1.117.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 3e33bfded..afd84eace 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.116.0" +version = "1.117.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 092dd9c30..2ed473555 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.116.0" +version = "1.117.0" description = "DeltaChat JSON-RPC API" edition = "2021" default-run = "deltachat-jsonrpc-server" diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index 51b412b41..bfc3857c0 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -55,5 +55,5 @@ }, "type": "module", "types": "dist/deltachat.d.ts", - "version": "1.116.0" + "version": "1.117.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 80a3826da..7b4f4017d 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.116.0" +version = "1.117.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 6a8054bbe..55cbf5693 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.116.0" +version = "1.117.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 419a8fb06..dda0b4b00 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit" }, "types": "node/dist/index.d.ts", - "version": "1.116.0" + "version": "1.117.0" } diff --git a/release-date.in b/release-date.in index 9fc505c6a..182773697 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-06-05 \ No newline at end of file +2023-06-15 \ No newline at end of file From 4d6dfa120e124e3c11897300f9ae26047f621c1f Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 17:18:04 +0000 Subject: [PATCH 166/528] docs: add missing links for 1.116.0 and 1.117.0 to the changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1984b44eb..0a9589cdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2628,3 +2628,5 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.113.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.112.9...v1.113.0 [1.114.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.113.0...v1.114.0 [1.115.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.114.0...v1.115.0 +[1.116.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.115.0...v1.116.0 +[1.117.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.116.0...v1.117.0 From b4209fac2e14ad83592cdafa42fd9d21cd1ff112 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 19:13:26 +0000 Subject: [PATCH 167/528] ci(concourse): install venv before trying to use it This is a follow-up to cbe16711043988f48fe0f76ff795e2a150d50720 I changed `apt-get` arguments for x86_64 glibc builds, but forgot to change it for x86_64 musl, aarch64 glibc and aarch64 musl. Because of this, `upload-wheels` task failed with a message: ``` The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command. apt install python3.11-venv You may need to use sudo with that command. After installing the python3-venv package, recreate your virtual environment. ``` --- scripts/concourse/docs_wheels.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/concourse/docs_wheels.yml b/scripts/concourse/docs_wheels.yml index c8f3b5b34..cc65d00fd 100644 --- a/scripts/concourse/docs_wheels.yml +++ b/scripts/concourse/docs_wheels.yml @@ -225,7 +225,7 @@ jobs: - -ec - | apt-get update -y - apt-get install -y --no-install-recommends python3-pip python3-setuptools + apt-get install -y --no-install-recommends python3-pip python3-setuptools python3-venv python3 -m venv env env/bin/pip install --upgrade pip env/bin/pip install devpi @@ -297,7 +297,7 @@ jobs: - -ec - | apt-get update -y - apt-get install -y --no-install-recommends python3-pip python3-setuptools + apt-get install -y --no-install-recommends python3-pip python3-setuptools python3-venv python3 -m venv env env/bin/pip install --upgrade pip env/bin/pip install devpi @@ -369,7 +369,7 @@ jobs: - -ec - | apt-get update -y - apt-get install -y --no-install-recommends python3-pip python3-setuptools + apt-get install -y --no-install-recommends python3-pip python3-setuptools python3-venv python3 -m venv env env/bin/pip install --upgrade pip env/bin/pip install devpi From d538d29b94dad8446ca9d37f7cbaaa57f05e2fc9 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 16 Jun 2023 14:35:37 +0000 Subject: [PATCH 168/528] docs: document how to regenerate Node.js constants before the release --- RELEASE.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 8a93946b4..b9f50e9ca 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -4,15 +4,18 @@ For example, to release version 1.116.0 of the core, do the following steps. 1. Resolve all [blocker issues](https://github.com/deltachat/deltachat-core-rust/labels/blocker). -2. Update the changelog: `git cliff --unreleased --tag 1.116.0 --prepend CHANGELOG.md` or `git cliff -u -t 1.116.0 -p CHANGELOG.md`. +2. Run `npm run build:core:constants` in the root of the repository + and commit generated `node/constants.js`, `node/events.js` and `node/lib/constants.js`. -3. Update the version by running `scripts/set_core_version.py 1.116.0`. +3. Update the changelog: `git cliff --unreleased --tag 1.116.0 --prepend CHANGELOG.md` or `git cliff -u -t 1.116.0 -p CHANGELOG.md`. -4. Commit the changes as `chore(release): prepare for 1.116.0`. +4. Update the version by running `scripts/set_core_version.py 1.116.0`. + +5. Commit the changes as `chore(release): prepare for 1.116.0`. Optionally, use a separate branch like `prep-1.116.0` for this commit and open a PR for review. -5. Tag the release: `git tag -a v1.116.0`. +6. Tag the release: `git tag -a v1.116.0`. -6. Push the release tag: `git push origin v1.116.0`. +7. Push the release tag: `git push origin v1.116.0`. -7. Create a GitHub release: `gh release create v1.116.0 -n ''`. +8. Create a GitHub release: `gh release create v1.116.0 -n ''`. From 5659c1b9c29c5320c1d10ea054552bbd4a90def8 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 9 Jun 2023 22:29:44 +0000 Subject: [PATCH 169/528] refactor: do not treat messages without headers as a special case --- src/mimeparser.rs | 4 ---- src/receive_imf.rs | 6 ------ 2 files changed, 10 deletions(-) diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 61d0a30f3..30293456d 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -776,10 +776,6 @@ impl MimeMessage { self.headers.contains_key("chat-version") } - pub(crate) fn has_headers(&self) -> bool { - !self.headers.is_empty() - } - pub(crate) fn get_subject(&self) -> Option { self.get_header(HeaderDef::Subject) .filter(|s| !s.is_empty()) diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 7d80b1f1e..385139c44 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -138,12 +138,6 @@ pub(crate) async fn receive_imf_inner( Ok(mime_parser) => mime_parser, }; - // we can not add even an empty record if we have no info whatsoever - if !mime_parser.has_headers() { - warn!(context, "receive_imf: no headers found."); - return Ok(None); - } - info!(context, "Received message has Message-Id: {rfc724_mid}"); // check, if the mail is already in our database. From dd806b2d88d7ed06fb8e674c5504933b504e1b29 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 19 Jun 2023 15:36:37 +0000 Subject: [PATCH 170/528] test: add `make-python-testenv.sh` script This scripts makes it easy to (re)create python testing environment. --- scripts/README.md | 4 ++++ scripts/make-python-testenv.sh | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100755 scripts/make-python-testenv.sh diff --git a/scripts/README.md b/scripts/README.md index 6b2baac37..4ce3ddc32 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -18,6 +18,10 @@ and an own build machine. - `remote_tests_rust.sh` rsyncs to the build machine and runs `run-rust-test.sh` remotely on the build machine. +- `make-python-testenv.sh` creates or updates local python test development environment. + Reusing the same environment is faster than running `run-python-test.sh` which always + recreates environment from scratch and runs additional lints. + - `run-doxygen.sh` generates C-docs which are then uploaded to https://c.delta.chat/ - `run_all.sh` builds Python wheels diff --git a/scripts/make-python-testenv.sh b/scripts/make-python-testenv.sh new file mode 100755 index 000000000..baff40d4c --- /dev/null +++ b/scripts/make-python-testenv.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Script to create or update a python development environment. +# It rebuilds the core and bindings as needed. +# +# After running the script, you can either +# run `pytest` directly with `env/bin/pytest python/` +# or activate the environment with `. env/bin/activacte` +# and run `pytest` from there. +set -euo pipefail + +export DCC_RS_TARGET=debug +export DCC_RS_DEV="$PWD" +cargo build -p deltachat_ffi --features jsonrpc + +if test -d env; then + env/bin/pip install -e python --force-reinstall +else + tox -e py --devenv env + env/bin/pip install --upgrade pip +fi From fcec81b4c10f4359adc153520ca696b5283657e6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 20 Jun 2023 23:37:41 +0000 Subject: [PATCH 171/528] chore(cargo): update `openssl` to 0.10.55 This fixes https://rustsec.org/advisories/RUSTSEC-2023-0044 --- Cargo.lock | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24a4c1819..8a4294345 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3086,9 +3086,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.48" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -3127,11 +3127,10 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.83" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ - "autocfg", "cc", "libc", "openssl-src", From 70efd0f10a4abef0c262020d5ac2aa8f83a9918e Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 20 Jun 2023 23:25:05 +0000 Subject: [PATCH 172/528] refactor: use `with` statement with multiple contexts Otherwise `ruff` check SIM117 fails. --- .../src/deltachat_rpc_client/pytestplugin.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py b/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py index 86ae86afd..9b207ecfa 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py @@ -16,9 +16,8 @@ async def get_temp_credentials() -> dict: # Replace default 5 minute timeout with a 1 minute timeout. timeout = aiohttp.ClientTimeout(total=60) - async with aiohttp.ClientSession() as session: - async with session.post(url, timeout=timeout) as response: - return json.loads(await response.text()) + async with aiohttp.ClientSession() as session, session.post(url, timeout=timeout) as response: + return json.loads(await response.text()) class ACFactory: From 323e44da04a1a666ab189ae6ba158ebfc4d65847 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 21 Jun 2023 23:46:40 +0000 Subject: [PATCH 173/528] test: make plaintext to HTML conversion tests non-async --- src/plaintext.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/plaintext.rs b/src/plaintext.rs index 2808e68a8..22780e993 100644 --- a/src/plaintext.rs +++ b/src/plaintext.rs @@ -107,8 +107,8 @@ impl PlainText { mod tests { use super::*; - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_plain_to_html() { + #[test] + fn test_plain_to_html() { let html = PlainText { text: r##"line 1 line 2 @@ -137,8 +137,8 @@ line with https://link-mid-of-line.org here!"#.to_string(), flowed: false, @@ -158,8 +158,8 @@ line with <http://encapsulated.l ); } - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_plain_to_html_nolink() { + #[test] + fn test_plain_to_html_nolink() { let html = PlainText { text: r#"line with nohttp://no.link here"#.to_string(), flowed: false, @@ -179,8 +179,8 @@ line with nohttp://no.link here
); } - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_plain_to_html_mailto() { + #[test] + fn test_plain_to_html_mailto() { let html = PlainText { text: r#"just an address: foo@bar.org another@one.de"#.to_string(), flowed: false, @@ -200,8 +200,8 @@ just an address:
foo@bar.org quote \n>still quote\n >no quote".to_string(), flowed: true, @@ -224,8 +224,8 @@ line still line
); } - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_plain_to_html_flowed_delsp() { + #[test] + fn test_plain_to_html_flowed_delsp() { let html = PlainText { text: "line \nstill line\n>quote \n>still quote\n >no quote".to_string(), flowed: true, @@ -248,8 +248,8 @@ linestill line
); } - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_plain_to_html_fixed() { + #[test] + fn test_plain_to_html_fixed() { let html = PlainText { text: "line \nstill line\n>quote \n>still quote\n >no quote".to_string(), flowed: false, From efa37dd2837904578c5fc15d35ceec7dc93ea6b3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 22 Jun 2023 00:27:49 +0000 Subject: [PATCH 174/528] fix: preserve indentation when converting plaintext to HTML --- src/plaintext.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/plaintext.rs b/src/plaintext.rs index 22780e993..afd75b981 100644 --- a/src/plaintext.rs +++ b/src/plaintext.rs @@ -96,7 +96,12 @@ impl PlainText { line += "
\n"; } - ret += &*line; + let len_with_indentation = line.len(); + let line = line.trim_start_matches(' '); + for _ in line.len()..len_with_indentation { + ret += " "; + } + ret += line; } ret += "\n"; ret @@ -267,7 +272,32 @@ line
still line
>quote
>still quote
- >no quote
+ >no quote
+ +"# + ); + } + + #[test] + fn test_plain_to_html_indentation() { + let html = PlainText { + text: "def foo():\n pass\n\ndef bar(x):\n return x + 5".to_string(), + flowed: false, + delsp: false, + } + .to_html(); + assert_eq!( + html, + r#" + + + + +def foo():
+    pass
+
+def bar(x):
+    return x + 5
"# ); From 7b49fb2eb6be5483832d736fb0d1fdf22ce0dd98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 22:55:25 +0000 Subject: [PATCH 175/528] chore(deps): bump openssl from 0.10.48 to 0.10.55 in /fuzz Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.48 to 0.10.55. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.48...openssl-v0.10.55) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- fuzz/Cargo.lock | 128 +++++++++++++++++------------------------------- 1 file changed, 46 insertions(+), 82 deletions(-) diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index e9033c1cf..097b7ac9b 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - [[package]] name = "abao" version = "0.2.0" @@ -60,19 +54,13 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -189,12 +177,11 @@ dependencies = [ [[package]] name = "async-imap" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8379e2f1cdeb79afd2006932d7e8f64993fc0f7386d0ebc37231c90b05968c25" +checksum = "da93622739d458dd9a6abc1abf0e38e81965a5824a3b37f9500437c82a8bb572" dependencies = [ "async-channel", - "async-native-tls 0.4.0", "base64 0.21.0", "byte-pool", "chrono", @@ -203,25 +190,13 @@ dependencies = [ "log", "nom", "once_cell", - "ouroboros", "pin-utils", + "self_cell", "stop-token", "thiserror", "tokio", ] -[[package]] -name = "async-native-tls" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" -dependencies = [ - "native-tls", - "thiserror", - "tokio", - "url", -] - [[package]] name = "async-native-tls" version = "0.5.0" @@ -556,9 +531,9 @@ checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "byte-pool" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c7230ddbb427b1094d477d821a99f3f54d36333178eeb806e279bcdcecf0ca" +checksum = "c2f1b21189f50b5625efa6227cf45e9d4cfdc2e73582df2b879e9689e78a7158" dependencies = [ "crossbeam-queue", "stable_deref_trait", @@ -951,12 +926,12 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.112.6" +version = "1.117.0" dependencies = [ "anyhow", "async-channel", "async-imap", - "async-native-tls 0.5.0", + "async-native-tls", "async-smtp", "async_zip", "backtrace", @@ -979,6 +954,7 @@ dependencies = [ "lettre_email", "libc", "mailparse 0.14.0", + "mime", "num-derive", "num-traits", "num_cpus", @@ -1244,7 +1220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" dependencies = [ "serde", - "signature 1.6.4", + "signature 2.1.0", ] [[package]] @@ -1701,9 +1677,9 @@ checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ "fastrand", "futures-core", @@ -2397,9 +2373,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -2651,9 +2627,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -2663,9 +2639,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.48" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -2704,11 +2680,10 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.83" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ - "autocfg", "cc", "libc", "openssl-src", @@ -2716,29 +2691,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "ouroboros" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbb50b356159620db6ac971c6d5c9ab788c9cc38a6f49619fca2a27acb062ca" -dependencies = [ - "aliasable", - "ouroboros_macro", -] - -[[package]] -name = "ouroboros_macro" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0d9d1a6191c4f391f87219d1ea42b23f09ee84d64763cd05ee6ea88d9f384d" -dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.107", -] - [[package]] name = "overload" version = "0.1.1" @@ -2865,9 +2817,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pgp" @@ -3316,13 +3268,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.0" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.2", ] [[package]] @@ -3331,7 +3283,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.28", ] [[package]] @@ -3341,10 +3293,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] -name = "reqwest" -version = "0.11.16" +name = "regex-syntax" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "reqwest" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64 0.21.0", "bytes", @@ -3690,6 +3648,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "semver" version = "1.0.17" @@ -4249,9 +4213,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", @@ -4275,9 +4239,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", From 0d8a76593ab42febfb21019b52ca49f7d509fb3a Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Wed, 21 Jun 2023 00:47:16 +0200 Subject: [PATCH 176/528] fix: make avatar image work on more platforms (use `xlink:href`) Without it delta touch (qt) can not render the avatar image and also inkscape does not show it either. --- src/qr_code_generator.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qr_code_generator.rs b/src/qr_code_generator.rs index bfd2b6a39..4fb9a2deb 100644 --- a/src/qr_code_generator.rs +++ b/src/qr_code_generator.rs @@ -121,6 +121,7 @@ fn inner_generate_secure_join_qr_code( w.elem("svg", |d| { d.attr("xmlns", "http://www.w3.org/2000/svg")?; d.attr("viewBox", format_args!("0 0 {width} {height}"))?; + d.attr("xmlns:xlink", "http://www.w3.org/1999/xlink")?; // required for enabling xlink:href on browsers Ok(()) })? .build(|w| { @@ -240,7 +241,7 @@ fn inner_generate_secure_join_qr_code( d.attr("preserveAspectRatio", "none")?; d.attr("clip-path", "url(#avatar-cut)")?; d.attr( - "href", /*might need xlink:href instead if it doesn't work on older devices?*/ + "xlink:href", /* xlink:href is needed otherwise it won't even display in inkscape not to mention qt's QSvgHandler */ format!( "data:image/jpeg;base64,{}", base64::engine::general_purpose::STANDARD.encode(img) From 8d26303cad88e67ae3e7ca225367e6863fc613e7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 22 Jun 2023 22:49:36 +0000 Subject: [PATCH 177/528] refactor(simplify): remove local variable `empty_body` --- src/simplify.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/simplify.rs b/src/simplify.rs index 623c9ab63..e70a0e6e1 100644 --- a/src/simplify.rs +++ b/src/simplify.rs @@ -235,12 +235,11 @@ fn render_message(lines: &[&str], is_cut_at_end: bool) -> String { let mut ret = String::new(); /* we write empty lines only in case and non-empty line follows */ let mut pending_linebreaks = 0; - let mut empty_body = true; for line in lines { if is_empty_line(line) { pending_linebreaks += 1 } else { - if !empty_body { + if !ret.is_empty() { if pending_linebreaks > 2 { pending_linebreaks = 2 } @@ -251,11 +250,10 @@ fn render_message(lines: &[&str], is_cut_at_end: bool) -> String { } // the incoming message might contain invalid UTF8 ret += line; - empty_body = false; pending_linebreaks = 1 } } - if is_cut_at_end && !empty_body { + if is_cut_at_end && !ret.is_empty() { ret += " [...]"; } // redo escaping done by escape_message_footer_marks() From 7d0b25c209dc04bf337368e3a7bd3b8b03930f73 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 27 Jun 2023 14:30:27 +0000 Subject: [PATCH 178/528] chore(deps): update ed25519-dalek --- Cargo.lock | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a4294345..264b066f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -824,9 +824,9 @@ checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] @@ -996,19 +996,32 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest 0.10.6", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + [[package]] name = "cxx" version = "1.0.91" @@ -1576,11 +1589,11 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ - "curve25519-dalek 4.0.0-rc.2", + "curve25519-dalek 4.0.0-rc.3", "ed25519 2.2.0", "serde", "sha2 0.10.6", @@ -2323,7 +2336,7 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" dependencies = [ - "libm 0.2.6", + "libm", ] [[package]] @@ -2653,12 +2666,6 @@ version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" -[[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - [[package]] name = "libm" version = "0.2.6" @@ -2975,7 +2982,7 @@ checksum = "2399c9463abc5f909349d8aa9ba080e0b88b3ce2885389b60b993f39b1a56905" dependencies = [ "byteorder", "lazy_static", - "libm 0.2.6", + "libm", "num-integer", "num-iter", "num-traits", @@ -3035,7 +3042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", - "libm 0.2.6", + "libm", ] [[package]] @@ -3216,16 +3223,6 @@ dependencies = [ "sha2 0.10.6", ] -[[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm 0.1.4", -] - [[package]] name = "parking" version = "2.0.0" @@ -3317,7 +3314,7 @@ dependencies = [ "derive_builder", "des", "digest 0.10.6", - "ed25519-dalek 2.0.0-rc.2", + "ed25519-dalek 2.0.0-rc.3", "elliptic-curve 0.13.2", "flate2", "generic-array", From 657c5fa947ce8340602e77b262f4d66dc80f9b12 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 27 Jun 2023 14:33:34 +0000 Subject: [PATCH 179/528] chore(deps): update iana-time-zone-haiku to 0.1.2 This removes `cxx` dependency. --- Cargo.lock | 76 +++--------------------------------------------------- 1 file changed, 3 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 264b066f0..04ca93f61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -737,16 +737,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -1022,50 +1012,6 @@ dependencies = [ "syn 2.0.18", ] -[[package]] -name = "cxx" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d3488e7665a7a483b57e25bdd90d0aeb2bc7608c8d0346acf2ad3f1caf1d62" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fcaf066a053a41a81dfb14d57d99738b767febb8b735c3016e469fac5da690" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 1.0.109", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef98b8b717a829ca5603af80e1f9e2e48013ab227b68ef37872ef84ee479bf" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "darling" version = "0.13.4" @@ -2398,12 +2344,11 @@ dependencies = [ [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -2684,15 +2629,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -4205,12 +4141,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scratch" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" - [[package]] name = "sct" version = "0.7.0" From 3a3f3542d98725ddc98cf7e53069decd0380e7a0 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 27 Jun 2023 14:34:26 +0000 Subject: [PATCH 180/528] chore: remove `libm` entry from deny.toml --- deny.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/deny.toml b/deny.toml index ede60fe78..82606e70d 100644 --- a/deny.toml +++ b/deny.toml @@ -26,7 +26,6 @@ skip = [ { name = "getrandom", version = "<0.2" }, { name = "hermit-abi", version = "<0.3" }, { name = "idna", version = "<0.3" }, - { name = "libm", version = "0.1.4" }, { name = "pem-rfc7468", version = "0.6.0" }, { name = "pkcs8", version = "0.9.0" }, { name = "quick-error", version = "<2.0" }, From b80ec8507c128d0d56473b4e245143a3a20ef7ab Mon Sep 17 00:00:00 2001 From: Hocuri Date: Tue, 23 May 2023 10:38:19 +0200 Subject: [PATCH 181/528] test: reproduce tokio panic --- python/tests/test_3_offline.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/python/tests/test_3_offline.py b/python/tests/test_3_offline.py index 50a95ed61..f498fc8de 100644 --- a/python/tests/test_3_offline.py +++ b/python/tests/test_3_offline.py @@ -481,6 +481,19 @@ class TestOfflineChat: contact2 = ac1.create_contact("display1 ", "real") assert contact2.name == "real" + def test_send_lots_of_offline_msgs(self, acfactory): + ac1 = acfactory.get_pseudo_configured_account() + ac1.set_config("configured_mail_server", "example.org") + ac1.set_config("configured_mail_user", "example.org") + ac1.set_config("configured_mail_pw", "example.org") + ac1.set_config("configured_send_server", "example.org") + ac1.set_config("configured_send_user", "example.org") + ac1.set_config("configured_send_pw", "example.org") + ac1.start_io() + chat = ac1.create_contact("some1@example.org", name="some1").create_chat() + for i in range(50): + chat.send_text("hello") + def test_create_chat_simple(self, acfactory): ac1 = acfactory.get_pseudo_configured_account() contact1 = ac1.create_contact("some1@example.org", name="some1") From 1f71c69325982a3a9c0643fa72497552bf010339 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 28 Jun 2023 09:11:26 +0000 Subject: [PATCH 182/528] fix: update tokio to 1.29.0 This fixes panic after sending 29 offline messages. --- Cargo.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04ca93f61..4e9066cbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4780,11 +4780,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "374442f06ee49c3a28a8fc9f01a2596fed7559c6b99b31279c3261778e77d84f" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", From e9755681227fdfab0e11753e1d7fa7393065c6db Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 1 Jul 2023 19:39:50 +0000 Subject: [PATCH 183/528] docs: fix a typo in `get_for_contact` documentation --- src/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat.rs b/src/chat.rs index 829b0d423..e02931112 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1933,7 +1933,7 @@ impl ChatIdBlocked { /// Returns the chat for the 1:1 chat with this contact. /// - /// I the chat does not yet exist a new one is created, using the provided [`Blocked`] + /// If the chat does not yet exist a new one is created, using the provided [`Blocked`] /// state. pub async fn get_for_contact( context: &Context, From 5024f48609b0d7229a50d1a6ae3115a50000b148 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 1 Jul 2023 19:40:23 +0000 Subject: [PATCH 184/528] refactor: add error context to Message::load_from_db() --- src/message.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/message.rs b/src/message.rs index 93ef2cad2..d0212530b 100644 --- a/src/message.rs +++ b/src/message.rs @@ -379,7 +379,7 @@ impl Message { Ok(msg) }, ) - .await?; + .await.with_context(|| format!("failed to load message {id} from the database"))?; Ok(msg) } From 7d989782698df0a182e9de9f7f6882aaeaa0c942 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 01:17:12 +0000 Subject: [PATCH 185/528] chore: rustfmt --- src/message.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/message.rs b/src/message.rs index d0212530b..3f2890157 100644 --- a/src/message.rs +++ b/src/message.rs @@ -379,7 +379,8 @@ impl Message { Ok(msg) }, ) - .await.with_context(|| format!("failed to load message {id} from the database"))?; + .await + .with_context(|| format!("failed to load message {id} from the database"))?; Ok(msg) } From 01d1c4c04b4802a453b313995594af050b497595 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 01:18:16 +0000 Subject: [PATCH 186/528] chore(cargo): bump tokio from 1.29.0 to 1.29.1 Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.29.0 to 1.29.1. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.29.0...tokio-1.29.1) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- deltachat-jsonrpc/Cargo.toml | 4 ++-- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e9066cbd..923b3c0c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4780,9 +4780,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374442f06ee49c3a28a8fc9f01a2596fed7559c6b99b31279c3261778e77d84f" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", "backtrace", diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 2ed473555..c09a90e0d 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -24,7 +24,7 @@ futures = { version = "0.3.28" } serde_json = "1.0.96" yerpc = { version = "0.5.1", features = ["anyhow_expose", "openrpc"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } -tokio = { version = "1.28.2" } +tokio = { version = "1.29.1" } sanitize-filename = "0.4" walkdir = "2.3.3" base64 = "0.21" @@ -34,7 +34,7 @@ axum = { version = "0.6.18", optional = true, features = ["ws"] } env_logger = { version = "0.10.0", optional = true } [dev-dependencies] -tokio = { version = "1.28.2", features = ["full", "rt-multi-thread"] } +tokio = { version = "1.29.1", features = ["full", "rt-multi-thread"] } [features] diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 55cbf5693..e1ce71916 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -19,7 +19,7 @@ futures-lite = "1.13.0" log = "0.4" serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.28.2", features = ["io-std"] } +tokio = { version = "1.29.1", features = ["io-std"] } tokio-util = "0.7.8" yerpc = { version = "0.5.1", features = ["anyhow_expose"] } From de9330b52f63bd22e079f7ce228af55a7f4f6993 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 01:19:13 +0000 Subject: [PATCH 187/528] chore(deps): update `libc` from 0.2.146 to 0.2.147 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e9066cbd..7970c5379 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2607,9 +2607,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.146" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libm" From d69e42377d477ae24241784e8de13cda8f75b23c Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 01:20:35 +0000 Subject: [PATCH 188/528] chore(deps): update `human-panic` from 1.1.4 to 1.1.5 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7970c5379..50b75b4cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2264,9 +2264,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "human-panic" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c16465f6227e18e5a64eba488245d7b2974d4db0c4404ca5a69b550defa18d0a" +checksum = "38a841f87949b0dd751864e769a870be79dc34abcee1cf31d737a61d498b22b6" dependencies = [ "backtrace", "os_info", From f994b2d8e4dd609c1127a96becd6bebdd6042e0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:18:24 +0000 Subject: [PATCH 189/528] chore(cargo): bump log from 0.4.18 to 0.4.19 Bumps [log](https://github.com/rust-lang/log) from 0.4.18 to 0.4.19. - [Release notes](https://github.com/rust-lang/log/releases) - [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/log/compare/0.4.18...0.4.19) --- updated-dependencies: - dependency-name: log dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- deltachat-repl/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 565a33461..1bfea0862 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2653,9 +2653,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru-cache" diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 7b4f4017d..64fae3d67 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -9,7 +9,7 @@ ansi_term = "0.12.1" anyhow = "1" deltachat = { path = "..", features = ["internals"]} dirs = "5" -log = "0.4.18" +log = "0.4.19" pretty_env_logger = "0.5" rusqlite = "0.29" rustyline = "11" From 23f540f9f96e92b735d12006690e49d7a34bba5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:18:22 +0000 Subject: [PATCH 190/528] chore(cargo): bump serde from 1.0.163 to 1.0.164 Bumps [serde](https://github.com/serde-rs/serde) from 1.0.163 to 1.0.164. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.163...v1.0.164) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1bfea0862..3474e0d1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4219,9 +4219,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] @@ -4246,9 +4246,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", From ce9cd54993ac829aae1e9e5f8796f1088a7506a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:18:30 +0000 Subject: [PATCH 191/528] chore(cargo): bump serde_json from 1.0.96 to 1.0.99 Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.96 to 1.0.99. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.96...v1.0.99) --- updated-dependencies: - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- deltachat-jsonrpc/Cargo.toml | 2 +- deltachat-rpc-server/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3474e0d1f..548aa5df0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4268,9 +4268,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ "itoa", "ryu", diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index c09a90e0d..ce3d2cd79 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -21,7 +21,7 @@ tempfile = "3.3.0" log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } -serde_json = "1.0.96" +serde_json = "1.0.99" yerpc = { version = "0.5.1", features = ["anyhow_expose", "openrpc"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } tokio = { version = "1.29.1" } diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index e1ce71916..09ef03b5d 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -17,7 +17,7 @@ anyhow = "1" env_logger = { version = "0.10.0" } futures-lite = "1.13.0" log = "0.4" -serde_json = "1.0.96" +serde_json = "1.0.99" serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.29.1", features = ["io-std"] } tokio-util = "0.7.8" From 4ad2d6e340834bf2a3b0496a8d44ffa551ff2245 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:39:13 +0000 Subject: [PATCH 192/528] chore(cargo): bump sha2 from 0.10.6 to 0.10.7 Bumps [sha2](https://github.com/RustCrypto/hashes) from 0.10.6 to 0.10.7. - [Commits](https://github.com/RustCrypto/hashes/compare/sha2-v0.10.6...sha2-v0.10.7) --- updated-dependencies: - dependency-name: sha2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 58 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 548aa5df0..381597eb7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -440,7 +440,7 @@ dependencies = [ "cc", "cfg-if", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -993,7 +993,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.6", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -1161,7 +1161,7 @@ dependencies = [ "serde", "serde_json", "sha-1", - "sha2 0.10.6", + "sha2 0.10.7", "smallvec", "strum", "strum_macros", @@ -1382,9 +1382,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.3", "const-oid", @@ -1542,7 +1542,7 @@ dependencies = [ "curve25519-dalek 4.0.0-rc.3", "ed25519 2.2.0", "serde", - "sha2 0.10.6", + "sha2 0.10.7", "zeroize", ] @@ -1573,7 +1573,7 @@ dependencies = [ "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", - "digest 0.10.6", + "digest 0.10.7", "ff 0.12.1", "generic-array", "group 0.12.1", @@ -1591,7 +1591,7 @@ checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d" dependencies = [ "base16ct 0.2.0", "crypto-bigint 0.5.1", - "digest 0.10.6", + "digest 0.10.7", "ff 0.13.0", "generic-array", "group 0.13.0", @@ -2214,7 +2214,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2710,7 +2710,7 @@ version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -3121,7 +3121,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2 0.10.6", + "sha2 0.10.7", ] [[package]] @@ -3133,7 +3133,7 @@ dependencies = [ "ecdsa 0.16.2", "elliptic-curve 0.13.2", "primeorder", - "sha2 0.10.6", + "sha2 0.10.7", ] [[package]] @@ -3144,7 +3144,7 @@ checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2 0.10.6", + "sha2 0.10.7", ] [[package]] @@ -3156,7 +3156,7 @@ dependencies = [ "ecdsa 0.16.2", "elliptic-curve 0.13.2", "primeorder", - "sha2 0.10.6", + "sha2 0.10.7", ] [[package]] @@ -3249,7 +3249,7 @@ dependencies = [ "crc24", "derive_builder", "des", - "digest 0.10.6", + "digest 0.10.7", "ed25519-dalek 2.0.0-rc.3", "elliptic-curve 0.13.2", "flate2", @@ -3268,7 +3268,7 @@ dependencies = [ "ripemd", "rsa 0.9.0-pre.0", "sha1", - "sha2 0.10.6", + "sha2 0.10.7", "sha3", "signature 2.0.0", "smallvec", @@ -3902,7 +3902,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -3912,7 +3912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "094052d5470cbcef561cb848a7209968c9f12dfa6d668f4bca048ac5de51099c" dependencies = [ "byteorder", - "digest 0.10.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-iter", @@ -3933,7 +3933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7bc1d34159d63536b4d89944e9ab5bb952f45db6fa0b8b03c2f8c09fb5b7171" dependencies = [ "byteorder", - "digest 0.10.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-iter", @@ -4315,7 +4315,7 @@ checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4326,7 +4326,7 @@ checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4344,13 +4344,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4359,7 +4359,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -4387,7 +4387,7 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -4397,7 +4397,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -4475,7 +4475,7 @@ checksum = "19cfdc32e0199062113edf41f344fbf784b8205a94600233c84eb838f45191e1" dependencies = [ "base64ct", "pem-rfc7468 0.6.0", - "sha2 0.10.6", + "sha2 0.10.7", ] [[package]] @@ -4490,7 +4490,7 @@ dependencies = [ "rand_core 0.6.4", "rsa 0.7.2", "sec1 0.3.0", - "sha2 0.10.6", + "sha2 0.10.7", "signature 1.6.4", "ssh-encoding", "zeroize", From 18aeb14003c9de0a9f1d553feb13e255fc57b2e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:44:12 +0000 Subject: [PATCH 193/528] chore(cargo): bump quick-xml from 0.28.2 to 0.29.0 Bumps [quick-xml](https://github.com/tafia/quick-xml) from 0.28.2 to 0.29.0. - [Release notes](https://github.com/tafia/quick-xml/releases) - [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md) - [Commits](https://github.com/tafia/quick-xml/compare/v0.28.2...v0.29.0) --- updated-dependencies: - dependency-name: quick-xml dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 381597eb7..4ee82ffec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3554,9 +3554,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-xml" -version = "0.28.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 56553e32a..9e8a589af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,7 +68,7 @@ parking_lot = "0.12" pgp = { version = "0.10", default-features = false } pretty_env_logger = { version = "0.5", optional = true } qrcodegen = "1.7.0" -quick-xml = "0.28" +quick-xml = "0.29" rand = "0.8" regex = "1.8" reqwest = { version = "0.11.18", features = ["json"] } From a5db7104c2a1b73575c0013df8bc9dd692e74d74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:39:10 +0000 Subject: [PATCH 194/528] chore(cargo): bump quote from 1.0.28 to 1.0.29 Bumps [quote](https://github.com/dtolnay/quote) from 1.0.28 to 1.0.29. - [Release notes](https://github.com/dtolnay/quote/releases) - [Commits](https://github.com/dtolnay/quote/compare/1.0.28...1.0.29) --- updated-dependencies: - dependency-name: quote dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ee82ffec..3a70a7f7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3498,9 +3498,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] @@ -3611,9 +3611,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] From f01a9d7d5c81f79b0b4be506bac473e77edb83de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:38:58 +0000 Subject: [PATCH 195/528] chore(cargo): bump rustyline from 11.0.0 to 12.0.0 Bumps [rustyline](https://github.com/kkawakam/rustyline) from 11.0.0 to 12.0.0. - [Release notes](https://github.com/kkawakam/rustyline/releases) - [Changelog](https://github.com/kkawakam/rustyline/blob/master/History.md) - [Commits](https://github.com/kkawakam/rustyline/compare/v11.0.0...v12.0.0) --- updated-dependencies: - dependency-name: rustyline dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Cargo.lock | 17 +++++++++++++---- deltachat-repl/Cargo.toml | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a70a7f7b..005036275 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2217,6 +2217,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -4050,15 +4059,15 @@ checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" [[package]] name = "rustyline" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfc8644681285d1fb67a467fb3021bfea306b99b4146b166a1fe3ada965eece" +checksum = "994eca4bca05c87e86e15d90fc7a91d1be64b4482b38cb2d27474568fe7c9db9" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.0.2", "cfg-if", "clipboard-win", - "dirs-next", "fd-lock", + "home", "libc", "log", "memchr", diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index 64fae3d67..10babc2f8 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -12,7 +12,7 @@ dirs = "5" log = "0.4.19" pretty_env_logger = "0.5" rusqlite = "0.29" -rustyline = "11" +rustyline = "12" tokio = { version = "1", features = ["fs", "rt-multi-thread", "macros"] } [features] From 32ac4a01ca1df9e24a8d88ea5a726bb81c1e0872 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:39:08 +0000 Subject: [PATCH 196/528] chore(cargo): bump tempfile from 3.5.0 to 3.6.0 Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.5.0 to 3.6.0. - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.5.0...v3.6.0) --- updated-dependencies: - dependency-name: tempfile dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 30 ++++++++++++++++-------------- deltachat-jsonrpc/Cargo.toml | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 005036275..a6f3212ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1759,13 +1759,13 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2451,12 +2451,13 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2646,9 +2647,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" @@ -4007,16 +4008,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.6" +version = "0.37.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d097081ed288dfe45699b72f5b5d648e5f15d64d900c7080273baa20c16a6849" +checksum = "62f25693a73057a1b4cb56179dd3c7ea21a7c6c5ee7d85781f5749b46f34b79c" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -4649,15 +4650,16 @@ checksum = "6aaa6f5d645d1dae4cd0286e9f8bf15b75a31656348e5e106eb1a940abd34b63" [[package]] name = "tempfile" -version = "3.5.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index ce3d2cd79..e01d4188d 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -17,7 +17,7 @@ deltachat = { path = ".." } num-traits = "0.2" schemars = "0.8.11" serde = { version = "1.0", features = ["derive"] } -tempfile = "3.3.0" +tempfile = "3.6.0" log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } From eb943625a68d0ce1c888b06e8ab59b23df4464a5 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 20:19:40 +0000 Subject: [PATCH 197/528] chore(cargo): bump num_cpus from 1.15.0 to 1.16.0 --- Cargo.lock | 19 +++++-------------- Cargo.toml | 2 +- deny.toml | 1 - 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6f3212ad..8d137238d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2178,15 +2178,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.1" @@ -2455,7 +2446,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys 0.48.0", ] @@ -2528,7 +2519,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "io-lifetimes", "rustix", "windows-sys 0.45.0", @@ -2993,11 +2984,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] diff --git a/Cargo.toml b/Cargo.toml index 9e8a589af..48346770f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,7 @@ lettre_email = { git = "https://github.com/deltachat/lettre", branch = "master" libc = "0.2" mailparse = "0.14" mime = "0.3.17" -num_cpus = "1.15" +num_cpus = "1.16" num-derive = "0.3" num-traits = "0.2" once_cell = "1.18.0" diff --git a/deny.toml b/deny.toml index 82606e70d..31b157f9d 100644 --- a/deny.toml +++ b/deny.toml @@ -24,7 +24,6 @@ skip = [ { name = "ed25519-dalek", version = "1.0.1" }, { name = "ed25519", version = "1.5.3" }, { name = "getrandom", version = "<0.2" }, - { name = "hermit-abi", version = "<0.3" }, { name = "idna", version = "<0.3" }, { name = "pem-rfc7468", version = "0.6.0" }, { name = "pkcs8", version = "0.9.0" }, From dd32430ade8c8148df6513c58d419e99a2b2123d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:41:11 +0000 Subject: [PATCH 198/528] chore(cargo): bump strum_macros from 0.24.3 to 0.25.0 Bumps [strum_macros](https://github.com/Peternator7/strum) from 0.24.3 to 0.25.0. - [Changelog](https://github.com/Peternator7/strum/blob/master/CHANGELOG.md) - [Commits](https://github.com/Peternator7/strum/commits) --- updated-dependencies: - dependency-name: strum_macros dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8d137238d..213005161 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4541,15 +4541,15 @@ checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" [[package]] name = "strum_macros" -version = "0.24.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +checksum = "fe9f3bd7d2e45dcc5e265fbb88d6513e4747d8ef9444cf01a533119bce28a157" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 1.0.109", + "syn 2.0.18", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 48346770f..c9a56f728 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,7 +81,7 @@ sha-1 = "0.10" sha2 = "0.10" smallvec = "1" strum = "0.24" -strum_macros = "0.24" +strum_macros = "0.25" tagger = "4.3.4" textwrap = "0.16.0" thiserror = "1" From fab504b54c32c8d5170810b5975bf46c6738e7a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:41:16 +0000 Subject: [PATCH 199/528] chore(cargo): bump url from 2.3.1 to 2.4.0 Bumps [url](https://github.com/servo/rust-url) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/servo/rust-url/releases) - [Commits](https://github.com/servo/rust-url/compare/v2.3.1...v2.4.0) --- updated-dependencies: - dependency-name: url dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 213005161..e3edb4d79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1941,9 +1941,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -2379,9 +2379,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -5205,12 +5205,12 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 0.4.0", "percent-encoding", ] From 3f8ec5ec5636fde833781e4cd9a424a0cab39c1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:41:52 +0000 Subject: [PATCH 200/528] chore(cargo): bump testdir from 0.7.3 to 0.8.0 Bumps [testdir](https://github.com/flub/testdir) from 0.7.3 to 0.8.0. - [Changelog](https://github.com/flub/testdir/blob/main/CHANGELOG.md) - [Commits](https://github.com/flub/testdir/compare/v0.7.3...v0.8.0) --- updated-dependencies: - dependency-name: testdir dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e3edb4d79..b1ec783cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4664,9 +4664,9 @@ dependencies = [ [[package]] name = "testdir" -version = "0.7.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fc921e7c4ad1aedb3484811514f3e5cd187886e0bbf1302c175f7578ef552" +checksum = "48b7965698cfb3d1ac1e6e54b4b45f5caa9e89bda223c8cf723d9cf53d7cefa7" dependencies = [ "anyhow", "backtrace", diff --git a/Cargo.toml b/Cargo.toml index c9a56f728..d76877e33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,7 +103,7 @@ log = "0.4" pretty_env_logger = "0.5" proptest = { version = "1", default-features = false, features = ["std"] } tempfile = "3" -testdir = "0.7.3" +testdir = "0.8.0" tokio = { version = "1", features = ["parking_lot", "rt-multi-thread", "macros"] } pretty_assertions = "1.3.0" From c47324d671fb98bd37fbe0c9ad5f324133db0b91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Jul 2023 18:04:49 +0000 Subject: [PATCH 201/528] chore(cargo): bump regex from 1.8.3 to 1.8.4 Bumps [regex](https://github.com/rust-lang/regex) from 1.8.3 to 1.8.4. - [Release notes](https://github.com/rust-lang/regex/releases) - [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/regex/compare/1.8.3...1.8.4) --- updated-dependencies: - dependency-name: regex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1ec783cb..c416802c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3784,9 +3784,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.3" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", From d5214eb192f296a860eebd465ea9dda1e57723bd Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 16:04:44 +0000 Subject: [PATCH 202/528] refactor: check if the contact is blocked with a dedicated SQL query Avoid loading unnecessary fields from the database. --- src/contact.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/contact.rs b/src/contact.rs index 78269f003..05f2ca458 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -407,7 +407,13 @@ impl Contact { /// Check if a contact is blocked. pub async fn is_blocked_load(context: &Context, id: ContactId) -> Result { - let blocked = Self::load_from_db(context, id).await?.blocked; + let blocked = context + .sql + .query_row("SELECT blocked FROM contacts WHERE id=?", (id,), |row| { + let blocked: bool = row.get(0)?; + Ok(blocked) + }) + .await?; Ok(blocked) } From fa1924da2bff30ca3f2d334d1c30f4ced943b908 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 16:26:28 +0000 Subject: [PATCH 203/528] api!(contact): remove Contact::load_from_db() in favor of Contact::get_by_id() --- deltachat-jsonrpc/src/api/mod.rs | 2 +- deltachat-jsonrpc/src/api/types/chat.rs | 4 +- deltachat-jsonrpc/src/api/types/chat_list.rs | 2 +- deltachat-jsonrpc/src/api/types/message.rs | 6 +- src/chat.rs | 6 +- src/chatlist.rs | 2 +- src/contact.rs | 102 +++++++++---------- src/context.rs | 2 +- src/message.rs | 10 +- src/mimefactory.rs | 6 +- src/peerstate.rs | 2 +- src/receive_imf.rs | 10 +- src/receive_imf/tests.rs | 36 +++---- src/securejoin.rs | 20 ++-- src/smtp.rs | 2 +- src/stock_str.rs | 2 +- src/test_utils.rs | 2 +- 17 files changed, 106 insertions(+), 110 deletions(-) diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index fca691f29..1238d7078 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -1340,7 +1340,7 @@ impl CommandApi { ) -> Result<()> { let ctx = self.get_context(account_id).await?; let contact_id = ContactId::new(contact_id); - let contact = Contact::load_from_db(&ctx, contact_id).await?; + let contact = Contact::get_by_id(&ctx, contact_id).await?; let addr = contact.get_addr(); Contact::create(&ctx, &name, addr).await?; Ok(()) diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index d5f0b8c0b..c8d7d867f 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -53,7 +53,7 @@ impl FullChat { contacts.push( ContactObject::try_from_dc_contact( context, - Contact::load_from_db(context, *contact_id) + Contact::get_by_id(context, *contact_id) .await .context("failed to load contact")?, ) @@ -74,7 +74,7 @@ impl FullChat { let was_seen_recently = if chat.get_type() == Chattype::Single { match contact_ids.get(0) { - Some(contact) => Contact::load_from_db(context, *contact) + Some(contact) => Contact::get_by_id(context, *contact) .await .context("failed to load contact for was_seen_recently")? .was_seen_recently(), diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index c7603de46..2c15165d9 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -107,7 +107,7 @@ pub(crate) async fn get_chat_list_item_by_id( let (dm_chat_contact, was_seen_recently) = if chat.get_type() == Chattype::Single { let contact = chat_contacts.get(0); let was_seen_recently = match contact { - Some(contact) => Contact::load_from_db(ctx, *contact) + Some(contact) => Contact::get_by_id(ctx, *contact) .await .context("contact")? .was_seen_recently(), diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index 7ebcccc46..db92ab6fc 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -113,7 +113,7 @@ impl MessageObject { pub async fn from_msg_id(context: &Context, msg_id: MsgId) -> Result { let message = Message::load_from_db(context, msg_id).await?; - let sender_contact = Contact::load_from_db(context, message.get_from_id()) + let sender_contact = Contact::get_by_id(context, message.get_from_id()) .await .context("failed to load sender contact")?; let sender = ContactObject::try_from_dc_contact(context, sender_contact) @@ -135,7 +135,7 @@ impl MessageObject { let quote = if let Some(quoted_text) = message.quoted_text() { match message.quoted_message(context).await? { Some(quote) => { - let quote_author = Contact::load_from_db(context, quote.get_from_id()) + let quote_author = Contact::get_by_id(context, quote.get_from_id()) .await .context("failed to load quote author contact")?; Some(MessageQuote::WithMessage { @@ -469,7 +469,7 @@ impl MessageSearchResult { pub async fn from_msg_id(context: &Context, msg_id: MsgId) -> Result { let message = Message::load_from_db(context, msg_id).await?; let chat = Chat::load_from_db(context, message.get_chat_id()).await?; - let sender = Contact::load_from_db(context, message.get_from_id()).await?; + let sender = Contact::get_by_id(context, message.get_from_id()).await?; let profile_image = match sender.get_profile_image(context).await? { Some(path_buf) => path_buf.to_str().map(|s| s.to_owned()), diff --git a/src/chat.rs b/src/chat.rs index e02931112..b241dab86 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -983,7 +983,7 @@ impl ChatId { .iter() .filter(|&contact_id| !contact_id.is_special()) { - let contact = Contact::load_from_db(context, *contact_id).await?; + let contact = Contact::get_by_id(context, *contact_id).await?; let addr = contact.get_addr(); let peerstate = Peerstate::from_addr(context, addr).await?; @@ -1809,7 +1809,7 @@ pub(crate) async fn update_device_icon(context: &Context) -> Result<()> { chat.param.set(Param::ProfileImage, &icon); chat.update_param(context).await?; - let mut contact = Contact::load_from_db(context, ContactId::DEVICE).await?; + let mut contact = Contact::get_by_id(context, ContactId::DEVICE).await?; contact.param.set(Param::ProfileImage, icon); contact.update_param(context).await?; } @@ -1951,7 +1951,7 @@ impl ChatIdBlocked { return Ok(res); } - let contact = Contact::load_from_db(context, contact_id).await?; + let contact = Contact::get_by_id(context, contact_id).await?; let chat_name = contact.get_display_name().to_string(); let mut params = Params::new(); match contact_id { diff --git a/src/chatlist.rs b/src/chatlist.rs index 1f515f3a2..fcbb02d6d 100644 --- a/src/chatlist.rs +++ b/src/chatlist.rs @@ -319,7 +319,7 @@ impl Chatlist { } else { match chat.typ { Chattype::Group | Chattype::Broadcast | Chattype::Mailinglist => { - let lastcontact = Contact::load_from_db(context, lastmsg.from_id) + let lastcontact = Contact::get_by_id(context, lastmsg.from_id) .await .context("loading contact failed")?; (Some(lastmsg), Some(lastcontact)) diff --git a/src/contact.rs b/src/contact.rs index 05f2ca458..92758b04c 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -338,8 +338,15 @@ impl Default for VerifiedStatus { } impl Contact { - /// Loads a contact snapshot from the database. - pub async fn load_from_db(context: &Context, contact_id: ContactId) -> Result { + /// Loads a single contact object from the database. + /// + /// For contact ContactId::SELF (1), the function returns sth. + /// like "Me" in the selected language and the email address + /// defined by set_config(). + /// + /// For contact ContactId::DEVICE, the function overrides + /// the contact name and status with localized address. + pub async fn get_by_id(context: &Context, contact_id: ContactId) -> Result { let mut contact = context .sql .query_row( @@ -965,7 +972,7 @@ impl Contact { ); let mut ret = String::new(); - if let Ok(contact) = Contact::load_from_db(context, contact_id).await { + if let Ok(contact) = Contact::get_by_id(context, contact_id).await { let loginparam = LoginParam::load_configured_params(context).await?; let peerstate = Peerstate::from_addr(context, &contact.addr).await?; @@ -1052,17 +1059,6 @@ impl Contact { Ok(()) } - /// Get a single contact object. For a list, see eg. get_contacts(). - /// - /// For contact ContactId::SELF (1), the function returns sth. - /// like "Me" in the selected language and the email address - /// defined by set_config(). - pub async fn get_by_id(context: &Context, contact_id: ContactId) -> Result { - let contact = Contact::load_from_db(context, contact_id).await?; - - Ok(contact) - } - /// Updates `param` column in the database. pub async fn update_param(&self, context: &Context) -> Result<()> { context @@ -1323,7 +1319,7 @@ async fn set_block_contact( contact_id ); - let contact = Contact::load_from_db(context, contact_id).await?; + let contact = Contact::get_by_id(context, contact_id).await?; if contact.blocked != new_blocking { context @@ -1385,7 +1381,7 @@ pub(crate) async fn set_profile_image( profile_image: &AvatarAction, was_encrypted: bool, ) -> Result<()> { - let mut contact = Contact::load_from_db(context, contact_id).await?; + let mut contact = Contact::get_by_id(context, contact_id).await?; let changed = match profile_image { AvatarAction::Change(profile_image) => { if contact_id == ContactId::SELF { @@ -1440,7 +1436,7 @@ pub(crate) async fn set_status( .await?; } } else { - let mut contact = Contact::load_from_db(context, contact_id).await?; + let mut contact = Contact::get_by_id(context, contact_id).await?; if contact.status != status { contact.status = status; @@ -1758,7 +1754,7 @@ mod tests { .await?; assert_ne!(id, ContactId::UNDEFINED); - let contact = Contact::load_from_db(&context.ctx, id).await.unwrap(); + let contact = Contact::get_by_id(&context.ctx, id).await.unwrap(); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_authname(), "bob"); assert_eq!(contact.get_display_name(), "bob"); @@ -1786,7 +1782,7 @@ mod tests { .await?; assert_eq!(contact_bob_id, id); assert_eq!(modified, Modifier::Modified); - let contact = Contact::load_from_db(&context.ctx, id).await.unwrap(); + let contact = Contact::get_by_id(&context.ctx, id).await.unwrap(); assert_eq!(contact.get_name(), "someone"); assert_eq!(contact.get_authname(), "bob"); assert_eq!(contact.get_display_name(), "someone"); @@ -1852,7 +1848,7 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_id(), contact_id); assert_eq!(contact.get_name(), "Name one"); assert_eq!(contact.get_authname(), "bla foo"); @@ -1871,7 +1867,7 @@ mod tests { .unwrap(); assert_eq!(contact_id, contact_id_test); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), "Real one"); assert_eq!(contact.get_addr(), "one@eins.org"); assert!(!contact.is_blocked()); @@ -1887,7 +1883,7 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::None); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "three@drei.sam"); assert_eq!(contact.get_addr(), "three@drei.sam"); @@ -1904,7 +1900,7 @@ mod tests { .unwrap(); assert_eq!(contact_id, contact_id_test); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name_n_addr(), "m. serious (three@drei.sam)"); assert!(!contact.is_blocked()); @@ -1919,7 +1915,7 @@ mod tests { .unwrap(); assert_eq!(contact_id, contact_id_test); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "m. serious"); assert_eq!(contact.get_name_n_addr(), "schnucki (three@drei.sam)"); assert!(!contact.is_blocked()); @@ -1935,14 +1931,14 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::None); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), "Wonderland, Alice"); assert_eq!(contact.get_display_name(), "Wonderland, Alice"); assert_eq!(contact.get_addr(), "alice@w.de"); assert_eq!(contact.get_name_n_addr(), "Wonderland, Alice (alice@w.de)"); // check SELF - let contact = Contact::load_from_db(&t, ContactId::SELF).await.unwrap(); + let contact = Contact::get_by_id(&t, ContactId::SELF).await.unwrap(); assert_eq!(contact.get_name(), stock_str::self_msg(&t).await); assert_eq!(contact.get_addr(), ""); // we're not configured assert!(!contact.is_blocked()); @@ -1973,7 +1969,7 @@ mod tests { assert_eq!(chatlist.len(), 1); let contacts = get_chat_contacts(&t, chat_id).await?; let contact_id = contacts.first().unwrap(); - let contact = Contact::load_from_db(&t, *contact_id).await?; + let contact = Contact::get_by_id(&t, *contact_id).await?; assert_eq!(contact.get_authname(), ""); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "f@example.org"); @@ -1999,7 +1995,7 @@ mod tests { assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Flobbyfoo"); let chatlist = Chatlist::try_load(&t, 0, Some("flobbyfoo"), None).await?; assert_eq!(chatlist.len(), 1); - let contact = Contact::load_from_db(&t, *contact_id).await?; + let contact = Contact::get_by_id(&t, *contact_id).await?; assert_eq!(contact.get_authname(), "Flobbyfoo"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "Flobbyfoo"); @@ -2029,7 +2025,7 @@ mod tests { assert_eq!(chatlist.len(), 0); let chatlist = Chatlist::try_load(&t, 0, Some("Foo Flobby"), None).await?; assert_eq!(chatlist.len(), 1); - let contact = Contact::load_from_db(&t, *contact_id).await?; + let contact = Contact::get_by_id(&t, *contact_id).await?; assert_eq!(contact.get_authname(), "Foo Flobby"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "Foo Flobby"); @@ -2047,7 +2043,7 @@ mod tests { assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Falk"); let chatlist = Chatlist::try_load(&t, 0, Some("Falk"), None).await?; assert_eq!(chatlist.len(), 1); - let contact = Contact::load_from_db(&t, *contact_id).await?; + let contact = Contact::get_by_id(&t, *contact_id).await?; assert_eq!(contact.get_authname(), "Foo Flobby"); assert_eq!(contact.get_name(), "Falk"); assert_eq!(contact.get_display_name(), "Falk"); @@ -2086,7 +2082,7 @@ mod tests { // If a contact has ongoing chats, contact is only hidden on deletion Contact::delete(&alice, contact_id).await?; - let contact = Contact::load_from_db(&alice, contact_id).await?; + let contact = Contact::get_by_id(&alice, contact_id).await?; assert_eq!(contact.origin, Origin::Hidden); assert_eq!( Contact::get_all(&alice, 0, Some("bob@example.net")) @@ -2100,7 +2096,7 @@ mod tests { // Can delete contact physically now Contact::delete(&alice, contact_id).await?; - assert!(Contact::load_from_db(&alice, contact_id).await.is_err()); + assert!(Contact::get_by_id(&alice, contact_id).await.is_err()); assert_eq!( Contact::get_all(&alice, 0, Some("bob@example.net")) .await? @@ -2119,7 +2115,7 @@ mod tests { let contact_id1 = Contact::create(&t, "Foo", "foo@bar.de").await?; assert_eq!(Contact::get_all(&t, 0, Some("foo@bar.de")).await?.len(), 1); Contact::delete(&t, contact_id1).await?; - assert!(Contact::load_from_db(&t, contact_id1).await.is_err()); + assert!(Contact::get_by_id(&t, contact_id1).await.is_err()); assert_eq!(Contact::get_all(&t, 0, Some("foo@bar.de")).await?.len(), 0); let contact_id2 = Contact::create(&t, "Foo", "foo@bar.de").await?; assert_ne!(contact_id2, contact_id1); @@ -2128,12 +2124,12 @@ mod tests { // test recreation after hiding t.create_chat_with_contact("Foo", "foo@bar.de").await; Contact::delete(&t, contact_id2).await?; - let contact = Contact::load_from_db(&t, contact_id2).await?; + let contact = Contact::get_by_id(&t, contact_id2).await?; assert_eq!(contact.origin, Origin::Hidden); assert_eq!(Contact::get_all(&t, 0, Some("foo@bar.de")).await?.len(), 0); let contact_id3 = Contact::create(&t, "Foo", "foo@bar.de").await?; - let contact = Contact::load_from_db(&t, contact_id3).await?; + let contact = Contact::get_by_id(&t, contact_id3).await?; assert_eq!(contact.origin, Origin::ManuallyCreated); assert_eq!(contact_id3, contact_id2); assert_eq!(Contact::get_all(&t, 0, Some("foo@bar.de")).await?.len(), 1); @@ -2156,7 +2152,7 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::Created); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "bob1"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "bob1"); @@ -2172,7 +2168,7 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "bob2"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "bob2"); @@ -2182,7 +2178,7 @@ mod tests { .await .unwrap(); assert!(!contact_id.is_special()); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "bob2"); assert_eq!(contact.get_name(), "bob3"); assert_eq!(contact.get_display_name(), "bob3"); @@ -2198,7 +2194,7 @@ mod tests { .unwrap(); assert!(!contact_id.is_special()); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "bob4"); assert_eq!(contact.get_name(), "bob3"); assert_eq!(contact.get_display_name(), "bob3"); @@ -2211,7 +2207,7 @@ mod tests { // manually create "claire@example.org" without a given name let contact_id = Contact::create(&t, "", "claire@example.org").await.unwrap(); assert!(!contact_id.is_special()); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), ""); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "claire@example.org"); @@ -2227,7 +2223,7 @@ mod tests { .unwrap(); assert_eq!(contact_id, contact_id_same); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "claire1"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "claire1"); @@ -2243,7 +2239,7 @@ mod tests { .unwrap(); assert_eq!(contact_id, contact_id_same); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "claire2"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "claire2"); @@ -2266,7 +2262,7 @@ mod tests { ) .await?; assert_eq!(sth_modified, Modifier::Created); - let contact = Contact::load_from_db(&t, contact_id).await?; + let contact = Contact::get_by_id(&t, contact_id).await?; assert_eq!(contact.get_display_name(), "Bob"); // Incoming message from someone else with "Not Bob" in the "To:" field. @@ -2279,7 +2275,7 @@ mod tests { .await?; assert_eq!(contact_id, contact_id_same); assert_eq!(sth_modified, Modifier::Modified); - let contact = Contact::load_from_db(&t, contact_id).await?; + let contact = Contact::get_by_id(&t, contact_id).await?; assert_eq!(contact.get_display_name(), "Not Bob"); // Incoming message from Bob, changing the name back. @@ -2292,7 +2288,7 @@ mod tests { .await?; assert_eq!(contact_id, contact_id_same); assert_eq!(sth_modified, Modifier::Modified); // This was None until the bugfix - let contact = Contact::load_from_db(&t, contact_id).await?; + let contact = Contact::get_by_id(&t, contact_id).await?; assert_eq!(contact.get_display_name(), "Bob"); Ok(()) @@ -2306,7 +2302,7 @@ mod tests { let contact_id = Contact::create(&t, "dave1", "dave@example.org") .await .unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), ""); assert_eq!(contact.get_name(), "dave1"); assert_eq!(contact.get_display_name(), "dave1"); @@ -2320,14 +2316,14 @@ mod tests { ) .await .unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "dave2"); assert_eq!(contact.get_name(), "dave1"); assert_eq!(contact.get_display_name(), "dave1"); // manually clear the name Contact::create(&t, "", "dave@example.org").await.unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_authname(), "dave2"); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "dave2"); @@ -2345,21 +2341,21 @@ mod tests { let t = TestContext::new().await; let contact_id = Contact::create(&t, "", "").await.unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_addr(), "dave@example.org"); let contact_id = Contact::create(&t, "", "Mueller, Dave ") .await .unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), "Mueller, Dave"); assert_eq!(contact.get_addr(), "dave@example.org"); let contact_id = Contact::create(&t, "name1", "name2 ") .await .unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!(contact.get_name(), "name1"); assert_eq!(contact.get_addr(), "dave@example.org"); @@ -2603,7 +2599,7 @@ CCCB 5AA9 F6E1 141C 9431 Origin::ManuallyCreated, ) .await?; - let contact = Contact::load_from_db(&alice, contact_id).await?; + let contact = Contact::get_by_id(&alice, contact_id).await?; assert_eq!(contact.last_seen(), 0); let mime = br#"Subject: Hello @@ -2620,7 +2616,7 @@ Hi."#; let timestamp = msg.get_timestamp(); assert!(timestamp > 0); - let contact = Contact::load_from_db(&alice, contact_id).await?; + let contact = Contact::get_by_id(&alice, contact_id).await?; assert_eq!(contact.last_seen(), timestamp); Ok(()) diff --git a/src/context.rs b/src/context.rs index 627e63c78..13e747099 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1042,7 +1042,7 @@ mod tests { async fn receive_msg(t: &TestContext, chat: &Chat) { let members = get_chat_contacts(t, chat.id).await.unwrap(); - let contact = Contact::load_from_db(t, *members.first().unwrap()) + let contact = Contact::get_by_id(t, *members.first().unwrap()) .await .unwrap(); let msg = format!( diff --git a/src/message.rs b/src/message.rs index 3f2890157..e875fdfab 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1129,7 +1129,7 @@ pub async fn get_msg_info(context: &Context, msg_id: MsgId) -> Result { let fts = timestamp_to_str(msg.get_timestamp()); ret += &format!("Sent: {fts}"); - let name = Contact::load_from_db(context, msg.from_id) + let name = Contact::get_by_id(context, msg.from_id) .await .map(|contact| contact.get_name_n_addr()) .unwrap_or_default(); @@ -1178,7 +1178,7 @@ pub async fn get_msg_info(context: &Context, msg_id: MsgId) -> Result { let fts = timestamp_to_str(ts); ret += &format!("Read: {fts}"); - let name = Contact::load_from_db(context, contact_id) + let name = Contact::get_by_id(context, contact_id) .await .map(|contact| contact.get_name_n_addr()) .unwrap_or_default(); @@ -1835,7 +1835,7 @@ async fn ndn_maybe_add_info_msg( Contact::lookup_id_by_addr(context, failed_recipient, Origin::Unknown) .await? .context("contact ID not found")?; - let contact = Contact::load_from_db(context, contact_id).await?; + let contact = Contact::get_by_id(context, contact_id).await?; // Tell the user which of the recipients failed if we know that (because in // a group, this might otherwise be unclear) let text = stock_str::failed_sending_to(context, contact.get_display_name()).await; @@ -2309,7 +2309,7 @@ mod tests { .unwrap() .first() .unwrap(); - let contact = Contact::load_from_db(&alice, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&alice, contact_id).await.unwrap(); let mut msg = Message::new(Viewtype::Text); msg.set_text(Some("bla blubb".to_string())); @@ -2329,7 +2329,7 @@ mod tests { .unwrap() .first() .unwrap(); - let contact = Contact::load_from_db(&bob, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&bob, contact_id).await.unwrap(); let msg = bob.recv_msg(&alice.pop_sent_msg().await).await; assert_eq!(msg.chat_id, chat.id); assert_eq!(msg.text, Some("bla blubb".to_string())); diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 24a22de0e..2ad87314f 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -237,7 +237,7 @@ impl<'a> MimeFactory<'a> { ) -> Result> { ensure!(!msg.chat_id.is_special(), "Invalid chat id"); - let contact = Contact::load_from_db(context, msg.from_id).await?; + let contact = Contact::get_by_id(context, msg.from_id).await?; let from_addr = context.get_primary_self_addr().await?; let from_displayname = context .get_config(Config::Displayname) @@ -2196,7 +2196,7 @@ mod tests { .await .unwrap() .unwrap(); - let alice_contact = Contact::load_from_db(&bob.ctx, alice_id).await.unwrap(); + let alice_contact = Contact::get_by_id(&bob.ctx, alice_id).await.unwrap(); assert!(alice_contact .get_profile_image(&bob.ctx) .await @@ -2228,7 +2228,7 @@ mod tests { assert_eq!(body.match_indices("Subject:").count(), 0); bob.recv_msg(&sent_msg).await; - let alice_contact = Contact::load_from_db(&bob.ctx, alice_id).await.unwrap(); + let alice_contact = Contact::get_by_id(&bob.ctx, alice_id).await.unwrap(); assert!(alice_contact .get_profile_image(&bob.ctx) .await diff --git a/src/peerstate.rs b/src/peerstate.rs index 47b9cda13..8a08a175d 100644 --- a/src/peerstate.rs +++ b/src/peerstate.rs @@ -535,7 +535,7 @@ impl Peerstate { stock_str::contact_setup_changed(context, &self.addr).await } PeerstateChange::Aeap(new_addr) => { - let old_contact = Contact::load_from_db(context, contact_id).await?; + let old_contact = Contact::get_by_id(context, contact_id).await?; stock_str::aeap_addr_changed( context, old_contact.get_display_name(), diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 385139c44..6f4a726cc 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -404,7 +404,7 @@ pub async fn from_field_to_contact_id( } else { let mut from_id_blocked = false; let mut incoming_origin = Origin::Unknown; - if let Ok(contact) = Contact::load_from_db(context, from_id).await { + if let Ok(contact) = Contact::get_by_id(context, from_id).await { from_id_blocked = contact.blocked; incoming_origin = contact.origin; } @@ -679,7 +679,7 @@ async fn add_parts( let create_blocked = if from_id == ContactId::SELF { Blocked::Not } else { - let contact = Contact::load_from_db(context, from_id).await?; + let contact = Contact::get_by_id(context, from_id).await?; match contact.is_blocked() { true => Blocked::Yes, false if is_bot => Blocked::Not, @@ -804,7 +804,7 @@ async fn add_parts( } } if chat_id.is_none() && allow_creation { - let to_contact = Contact::load_from_db(context, to_id).await?; + let to_contact = Contact::get_by_id(context, to_id).await?; if let Some(list_id) = to_contact.param.get(Param::ListId) { if let Some((id, _, blocked)) = chat::get_chat_id_by_grpid(context, list_id).await? @@ -2005,7 +2005,7 @@ async fn apply_mailinglist_changes( }; let (contact_id, _) = Contact::add_or_lookup(context, "", list_post, Origin::Hidden).await?; - let mut contact = Contact::load_from_db(context, contact_id).await?; + let mut contact = Contact::get_by_id(context, contact_id).await?; if contact.param.get(Param::ListId) != Some(listid) { contact.param.set(Param::ListId, listid); contact.update_param(context).await?; @@ -2123,7 +2123,7 @@ async fn check_verified_properties( from_id: ContactId, to_ids: &[ContactId], ) -> Result<()> { - let contact = Contact::load_from_db(context, from_id).await?; + let contact = Contact::get_by_id(context, from_id).await?; ensure!(mimeparser.was_encrypted(), "This message is not encrypted"); diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index 680f58bb6..8079dde7f 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -407,7 +407,7 @@ async fn test_escaped_from() { false, ).await.unwrap(); assert_eq!( - Contact::load_from_db(&t, contact_id) + Contact::get_by_id(&t, contact_id) .await .unwrap() .get_authname(), @@ -452,7 +452,7 @@ async fn test_escaped_recipients() { ) .await .unwrap(); - let contact = Contact::load_from_db(&t, carl_contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, carl_contact_id).await.unwrap(); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "h2"); @@ -499,7 +499,7 @@ async fn test_cc_to_contact() { ) .await .unwrap(); - let contact = Contact::load_from_db(&t, carl_contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, carl_contact_id).await.unwrap(); assert_eq!(contact.get_name(), ""); assert_eq!(contact.get_display_name(), "Carl"); } @@ -797,12 +797,12 @@ async fn test_github_mailing_list() -> Result<()> { assert_eq!(contacts.len(), 0); // mailing list recipients and senders do not count as "known contacts" let msg1 = get_chat_msg(&t, chat_id, 0, 2).await; - let contact1 = Contact::load_from_db(&t.ctx, msg1.from_id).await?; + let contact1 = Contact::get_by_id(&t.ctx, msg1.from_id).await?; assert_eq!(contact1.get_addr(), "notifications@github.com"); assert_eq!(contact1.get_display_name(), "notifications@github.com"); // Make sure this is not "Max Mustermann" or somethinng let msg2 = get_chat_msg(&t, chat_id, 1, 2).await; - let contact2 = Contact::load_from_db(&t.ctx, msg2.from_id).await?; + let contact2 = Contact::get_by_id(&t.ctx, msg2.from_id).await?; assert_eq!(contact2.get_addr(), "notifications@github.com"); assert_eq!(msg1.get_override_sender_name().unwrap(), "Max Mustermann"); @@ -847,7 +847,7 @@ async fn test_classic_mailing_list() -> Result<()> { assert_eq!(chat.get_mailinglist_addr(), Some("delta@codespeak.net")); let msg = get_chat_msg(&t, chat_id, 0, 1).await; - let contact1 = Contact::load_from_db(&t.ctx, msg.from_id).await.unwrap(); + let contact1 = Contact::get_by_id(&t.ctx, msg.from_id).await.unwrap(); assert_eq!(contact1.get_addr(), "bob@posteo.org"); let sent = t.send_text(chat.id, "Hello mailinglist!").await; @@ -890,7 +890,7 @@ async fn test_other_device_writes_to_mailinglist() -> Result<()> { Contact::lookup_id_by_addr(&t, "delta@codespeak.net", Origin::Unknown) .await? .unwrap(); - let list_post_contact = Contact::load_from_db(&t, list_post_contact_id).await?; + let list_post_contact = Contact::get_by_id(&t, list_post_contact_id).await?; assert_eq!( list_post_contact.param.get(Param::ListId).unwrap(), "delta.codespeak.net" @@ -1365,7 +1365,7 @@ async fn test_apply_mailinglist_changes_assigned_by_reply() { .await .unwrap() .unwrap(); - let contact = Contact::load_from_db(&t, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t, contact_id).await.unwrap(); assert_eq!( contact.param.get(Param::ListId).unwrap(), "deltachat-core-rust.deltachat.github.com" @@ -2038,12 +2038,12 @@ Message content Second signature"; receive_imf(&alice, first_message, false).await?; - let contact = Contact::load_from_db(&alice, bob_contact_id).await?; + let contact = Contact::get_by_id(&alice, bob_contact_id).await?; assert_eq!(contact.get_status(), "First signature"); assert_eq!(contact.get_display_name(), "Bob1"); receive_imf(&alice, second_message, false).await?; - let contact = Contact::load_from_db(&alice, bob_contact_id).await?; + let contact = Contact::get_by_id(&alice, bob_contact_id).await?; assert_eq!(contact.get_status(), "Second signature"); assert_eq!(contact.get_display_name(), "Bob2"); @@ -2051,7 +2051,7 @@ Second signature"; receive_imf(&alice, first_message, false).await?; // No change because last message is duplicate of the first. - let contact = Contact::load_from_db(&alice, bob_contact_id).await?; + let contact = Contact::get_by_id(&alice, bob_contact_id).await?; assert_eq!(contact.get_status(), "Second signature"); assert_eq!(contact.get_display_name(), "Bob2"); @@ -2069,7 +2069,7 @@ async fn test_ignore_footer_status_from_mailinglist() -> Result<()> { ) .await? .0; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), ""); assert_eq!(Chatlist::try_load(&t, 0, None, None).await?.len(), 0); @@ -2089,7 +2089,7 @@ Original signature", .await?; let msg = t.get_last_msg().await; let one2one_chat_id = msg.chat_id; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "Original signature"); assert!(!msg.has_html()); @@ -2112,7 +2112,7 @@ Tap here to unsubscribe ...", ) .await?; let ml_chat_id = t.get_last_msg().await.chat_id; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "Original signature"); receive_imf( @@ -2129,7 +2129,7 @@ Original signature updated", false, ) .await?; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "Original signature updated"); assert_eq!(get_chat_msgs(&t, one2one_chat_id).await?.len(), 2); assert_eq!(get_chat_msgs(&t, ml_chat_id).await?.len(), 1); @@ -2164,7 +2164,7 @@ sig wednesday", ) .await?; let chat_id = t.get_last_msg().await.chat_id; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "sig wednesday"); assert_eq!(get_chat_msgs(&t, chat_id).await?.len(), 1); @@ -2182,7 +2182,7 @@ sig tuesday", false, ) .await?; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "sig wednesday"); assert_eq!(get_chat_msgs(&t, chat_id).await?.len(), 2); @@ -2200,7 +2200,7 @@ sig thursday", false, ) .await?; - let bob = Contact::load_from_db(&t, bob_id).await?; + let bob = Contact::get_by_id(&t, bob_id).await?; assert_eq!(bob.get_status(), "sig thursday"); assert_eq!(get_chat_msgs(&t, chat_id).await?.len(), 3); diff --git a/src/securejoin.rs b/src/securejoin.rs index 2d34b7c2f..2b24a5b86 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -210,7 +210,7 @@ async fn fingerprint_equals_sender( fingerprint: &Fingerprint, contact_id: ContactId, ) -> Result { - let contact = Contact::load_from_db(context, contact_id).await?; + let contact = Contact::get_by_id(context, contact_id).await?; let peerstate = match Peerstate::from_addr(context, contact.get_addr()).await { Ok(peerstate) => peerstate, Err(err) => { @@ -411,7 +411,7 @@ pub(crate) async fn handle_securejoin_handshake( .await?; return Ok(HandshakeMessage::Ignore); } - let contact_addr = Contact::load_from_db(context, contact_id) + let contact_addr = Contact::get_by_id(context, contact_id) .await? .get_addr() .to_owned(); @@ -580,7 +580,7 @@ pub(crate) async fn observe_securejoin_on_other_device( .await?; return Ok(HandshakeMessage::Ignore); } - let addr = Contact::load_from_db(context, contact_id) + let addr = Contact::get_by_id(context, contact_id) .await? .get_addr() .to_lowercase(); @@ -640,7 +640,7 @@ pub(crate) async fn observe_securejoin_on_other_device( if mark_peer_as_verified( context, fingerprint, - Contact::load_from_db(context, contact_id) + Contact::get_by_id(context, contact_id) .await? .get_addr() .to_owned(), @@ -889,7 +889,7 @@ mod tests { .await .expect("Error looking up contact") .expect("Contact not found"); - let contact_bob = Contact::load_from_db(&alice.ctx, contact_bob_id) + let contact_bob = Contact::get_by_id(&alice.ctx, contact_bob_id) .await .unwrap(); assert_eq!( @@ -952,7 +952,7 @@ mod tests { .await .expect("Error looking up contact") .expect("Contact not found"); - let contact_alice = Contact::load_from_db(&bob.ctx, contact_alice_id) + let contact_alice = Contact::get_by_id(&bob.ctx, contact_alice_id) .await .unwrap(); assert_eq!( @@ -1078,7 +1078,7 @@ mod tests { Origin::ManuallyCreated, ) .await?; - let contact_bob = Contact::load_from_db(&alice.ctx, contact_bob_id).await?; + let contact_bob = Contact::get_by_id(&alice.ctx, contact_bob_id).await?; assert_eq!( contact_bob.is_verified(&alice.ctx).await?, VerifiedStatus::Unverified @@ -1105,7 +1105,7 @@ mod tests { .await .expect("Error looking up contact") .expect("Contact not found"); - let contact_alice = Contact::load_from_db(&bob.ctx, contact_alice_id).await?; + let contact_alice = Contact::get_by_id(&bob.ctx, contact_alice_id).await?; assert_eq!( contact_bob.is_verified(&bob.ctx).await?, VerifiedStatus::Unverified @@ -1246,7 +1246,7 @@ mod tests { Contact::lookup_id_by_addr(&alice.ctx, "bob@example.net", Origin::Unknown) .await? .expect("Contact not found"); - let contact_bob = Contact::load_from_db(&alice.ctx, contact_bob_id).await?; + let contact_bob = Contact::get_by_id(&alice.ctx, contact_bob_id).await?; assert_eq!( contact_bob.is_verified(&alice.ctx).await?, VerifiedStatus::Unverified @@ -1302,7 +1302,7 @@ mod tests { .await .expect("Error looking up contact") .expect("Contact not found"); - let contact_alice = Contact::load_from_db(&bob.ctx, contact_alice_id).await?; + let contact_alice = Contact::get_by_id(&bob.ctx, contact_alice_id).await?; assert_eq!( contact_bob.is_verified(&bob.ctx).await?, VerifiedStatus::Unverified diff --git a/src/smtp.rs b/src/smtp.rs index 5916cad2b..5cfc4fdfa 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -683,7 +683,7 @@ async fn send_mdn_msg_id( contact_id: ContactId, smtp: &mut Smtp, ) -> Result<()> { - let contact = Contact::load_from_db(context, contact_id).await?; + let contact = Contact::get_by_id(context, contact_id).await?; if contact.is_blocked() { return Err(format_err!("Contact is blocked")); } diff --git a/src/stock_str.rs b/src/stock_str.rs index d41e43057..0dcd43f19 100644 --- a/src/stock_str.rs +++ b/src/stock_str.rs @@ -1387,7 +1387,7 @@ mod tests { let contact_id = Contact::create(&t.ctx, "Someone", "someone@example.org") .await .unwrap(); - let contact = Contact::load_from_db(&t.ctx, contact_id).await.unwrap(); + let contact = Contact::get_by_id(&t.ctx, contact_id).await.unwrap(); // uses %1$s substitution assert_eq!( contact_verified(&t, &contact).await, diff --git a/src/test_utils.rs b/src/test_utils.rs index d6278e206..816040ec7 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -553,7 +553,7 @@ impl TestContext { Modifier::Modified => warn!(&self.ctx, "Contact {} modified by TestContext", &addr), Modifier::Created => warn!(&self.ctx, "Contact {} created by TestContext", &addr), } - Contact::load_from_db(&self.ctx, contact_id).await.unwrap() + Contact::get_by_id(&self.ctx, contact_id).await.unwrap() } /// Returns 1:1 [`Chat`] with another account, if it exists. From 2a6b7d9766e50585a153a4cbb1465b4fdaa11f88 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 16:52:12 +0000 Subject: [PATCH 204/528] api(contact): add Contact::get_by_id_optional() API --- src/contact.rs | 55 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/contact.rs b/src/contact.rs index 92758b04c..8bc8f6bdd 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -340,6 +340,8 @@ impl Default for VerifiedStatus { impl Contact { /// Loads a single contact object from the database. /// + /// Returns an error if the contact does not exist. + /// /// For contact ContactId::SELF (1), the function returns sth. /// like "Me" in the selected language and the email address /// defined by set_config(). @@ -347,9 +349,22 @@ impl Contact { /// For contact ContactId::DEVICE, the function overrides /// the contact name and status with localized address. pub async fn get_by_id(context: &Context, contact_id: ContactId) -> Result { - let mut contact = context + let contact = Self::get_by_id_optional(context, contact_id) + .await? + .with_context(|| format!("contact {contact_id} not found"))?; + Ok(contact) + } + + /// Loads a single contact object from the database. + /// + /// Similar to [`Contact::get_by_id()`] but returns `None` if the contact does not exist. + pub async fn get_by_id_optional( + context: &Context, + contact_id: ContactId, + ) -> Result> { + if let Some(mut contact) = context .sql - .query_row( + .query_row_optional( "SELECT c.name, c.addr, c.origin, c.blocked, c.last_seen, c.authname, c.param, c.status FROM contacts c @@ -378,23 +393,27 @@ impl Contact { Ok(contact) }, ) - .await?; - if contact_id == ContactId::SELF { - contact.name = stock_str::self_msg(context).await; - contact.addr = context - .get_config(Config::ConfiguredAddr) - .await? - .unwrap_or_default(); - contact.status = context - .get_config(Config::Selfstatus) - .await? - .unwrap_or_default(); - } else if contact_id == ContactId::DEVICE { - contact.name = stock_str::device_messages(context).await; - contact.addr = ContactId::DEVICE_ADDR.to_string(); - contact.status = stock_str::device_messages_hint(context).await; + .await? + { + if contact_id == ContactId::SELF { + contact.name = stock_str::self_msg(context).await; + contact.addr = context + .get_config(Config::ConfiguredAddr) + .await? + .unwrap_or_default(); + contact.status = context + .get_config(Config::Selfstatus) + .await? + .unwrap_or_default(); + } else if contact_id == ContactId::DEVICE { + contact.name = stock_str::device_messages(context).await; + contact.addr = ContactId::DEVICE_ADDR.to_string(); + contact.status = stock_str::device_messages_hint(context).await; + } + Ok(Some(contact)) + } else { + Ok(None) } - Ok(contact) } /// Returns `true` if this contact is blocked. From ce6876c418350b4d3178f27198de03b5c953d91e Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 17:12:20 +0000 Subject: [PATCH 205/528] fix(remove_contact_from_chat): do not ignore database errors when loading the contact --- src/chat.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index b241dab86..a5d17e55e 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -3182,8 +3182,6 @@ pub async fn remove_contact_from_chat( let mut msg = Message::default(); let mut success = false; - /* we do not check if "contact_id" exists but just delete all records with the id from chats_contacts */ - /* this allows to delete pending references to deleted contacts. Of course, this should _not_ happen. */ if let Ok(chat) = Chat::load_from_db(context, chat_id).await { if chat.typ == Chattype::Group || chat.typ == Chattype::Broadcast { if !chat.is_self_in_chat(context).await? { @@ -3191,7 +3189,10 @@ pub async fn remove_contact_from_chat( "Cannot remove contact from chat; self not in group.".into(), )); } else { - if let Ok(contact) = Contact::get_by_id(context, contact_id).await { + // We do not return an error if the contact does not exist in the database. + // This allows to delete dangling references to deleted contacts + // in case of the database becoming inconsistent due to a bug. + if let Some(contact) = Contact::get_by_id_optional(context, contact_id).await? { if chat.typ == Chattype::Group && chat.is_promoted() { msg.viewtype = Viewtype::Text; if contact.id == ContactId::SELF { From d42322b38b4136fe45230d85fc11b4d903a580a3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 17:13:58 +0000 Subject: [PATCH 206/528] fix(remove_contact_from_chat): bubble up chat loading errors --- src/chat.rs | 80 +++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index a5d17e55e..b0eedd158 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -3182,53 +3182,47 @@ pub async fn remove_contact_from_chat( let mut msg = Message::default(); let mut success = false; - if let Ok(chat) = Chat::load_from_db(context, chat_id).await { - if chat.typ == Chattype::Group || chat.typ == Chattype::Broadcast { - if !chat.is_self_in_chat(context).await? { - context.emit_event(EventType::ErrorSelfNotInGroup( - "Cannot remove contact from chat; self not in group.".into(), - )); - } else { - // We do not return an error if the contact does not exist in the database. - // This allows to delete dangling references to deleted contacts - // in case of the database becoming inconsistent due to a bug. - if let Some(contact) = Contact::get_by_id_optional(context, contact_id).await? { - if chat.typ == Chattype::Group && chat.is_promoted() { - msg.viewtype = Viewtype::Text; - if contact.id == ContactId::SELF { - set_group_explicitly_left(context, &chat.grpid).await?; - msg.text = - Some(stock_str::msg_group_left(context, ContactId::SELF).await); - } else { - msg.text = Some( - stock_str::msg_del_member( - context, - contact.get_addr(), - ContactId::SELF, - ) + let chat = Chat::load_from_db(context, chat_id).await?; + if chat.typ == Chattype::Group || chat.typ == Chattype::Broadcast { + if !chat.is_self_in_chat(context).await? { + context.emit_event(EventType::ErrorSelfNotInGroup( + "Cannot remove contact from chat; self not in group.".into(), + )); + } else { + // We do not return an error if the contact does not exist in the database. + // This allows to delete dangling references to deleted contacts + // in case of the database becoming inconsistent due to a bug. + if let Some(contact) = Contact::get_by_id_optional(context, contact_id).await? { + if chat.typ == Chattype::Group && chat.is_promoted() { + msg.viewtype = Viewtype::Text; + if contact.id == ContactId::SELF { + set_group_explicitly_left(context, &chat.grpid).await?; + msg.text = Some(stock_str::msg_group_left(context, ContactId::SELF).await); + } else { + msg.text = Some( + stock_str::msg_del_member(context, contact.get_addr(), ContactId::SELF) .await, - ); - } - msg.param.set_cmd(SystemMessage::MemberRemovedFromGroup); - msg.param.set(Param::Arg, contact.get_addr()); - msg.id = send_msg(context, chat_id, &mut msg).await?; + ); } + msg.param.set_cmd(SystemMessage::MemberRemovedFromGroup); + msg.param.set(Param::Arg, contact.get_addr()); + msg.id = send_msg(context, chat_id, &mut msg).await?; } - // we remove the member from the chat after constructing the - // to-be-send message. If between send_msg() and here the - // process dies the user will have to re-do the action. It's - // better than the other way round: you removed - // someone from DB but no peer or device gets to know about it and - // group membership is thus different on different devices. - // Note also that sending a message needs all recipients - // in order to correctly determine encryption so if we - // removed it first, it would complicate the - // check/encryption logic. - success = remove_from_chat_contacts_table(context, chat_id, contact_id) - .await - .is_ok(); - context.emit_event(EventType::ChatModified(chat_id)); } + // we remove the member from the chat after constructing the + // to-be-send message. If between send_msg() and here the + // process dies the user will have to re-do the action. It's + // better than the other way round: you removed + // someone from DB but no peer or device gets to know about it and + // group membership is thus different on different devices. + // Note also that sending a message needs all recipients + // in order to correctly determine encryption so if we + // removed it first, it would complicate the + // check/encryption logic. + success = remove_from_chat_contacts_table(context, chat_id, contact_id) + .await + .is_ok(); + context.emit_event(EventType::ChatModified(chat_id)); } } From 1351f7163234d798b0e57707fb481aa5f97e939b Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 2 Jul 2023 17:15:01 +0000 Subject: [PATCH 207/528] fix(remove_contact_from_chat): do not emit event if the contact was not removed --- src/chat.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index b0eedd158..455d91388 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -3180,14 +3180,15 @@ pub async fn remove_contact_from_chat( ); let mut msg = Message::default(); - let mut success = false; let chat = Chat::load_from_db(context, chat_id).await?; if chat.typ == Chattype::Group || chat.typ == Chattype::Broadcast { if !chat.is_self_in_chat(context).await? { - context.emit_event(EventType::ErrorSelfNotInGroup( - "Cannot remove contact from chat; self not in group.".into(), - )); + let err_msg = format!( + "Cannot remove contact {contact_id} from chat {chat_id}: self not in group." + ); + context.emit_event(EventType::ErrorSelfNotInGroup(err_msg.clone())); + bail!("{}", err_msg); } else { // We do not return an error if the contact does not exist in the database. // This allows to delete dangling references to deleted contacts @@ -3219,15 +3220,11 @@ pub async fn remove_contact_from_chat( // in order to correctly determine encryption so if we // removed it first, it would complicate the // check/encryption logic. - success = remove_from_chat_contacts_table(context, chat_id, contact_id) - .await - .is_ok(); + remove_from_chat_contacts_table(context, chat_id, contact_id).await?; context.emit_event(EventType::ChatModified(chat_id)); } - } - - if !success { - bail!("Failed to remove contact"); + } else { + bail!("Cannot remove members from non-group chats."); } Ok(()) From 5fe94e8bce94767c2006bb9d231ae06bc6cc4b2f Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 22 Jun 2023 20:00:43 +0000 Subject: [PATCH 208/528] docs(dehtml): document AddText variants --- src/dehtml.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dehtml.rs b/src/dehtml.rs index 03b40b3f5..a8b694bfb 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -51,8 +51,13 @@ impl Dehtml { #[derive(Debug, PartialEq, Clone, Copy)] enum AddText { + /// Inside `