From f656cb29be8ac23f854859c13e70109009441f63 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 30 Sep 2023 23:22:19 +0000 Subject: [PATCH 01/12] fix: ignore special chats in get_similar_chat_ids() For unknown reason trash chat contains members in some existing databases. Workaround this by ignoring chats_contacts entries with special chat_id. --- src/chat.rs | 5 +++-- src/contact.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index 3784568199..c131fd1e96 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -918,9 +918,10 @@ impl ChatId { .sql .query_map( "SELECT chat_id, count(*) AS n - FROM chats_contacts where contact_id > 9 + FROM chats_contacts + WHERE contact_id > ? AND chat_id > ? GROUP BY chat_id", - (), + (ContactId::LAST_SPECIAL, DC_CHAT_ID_LAST_SPECIAL), |row| { let chat_id: ChatId = row.get(0)?; let size: f64 = row.get(1)?; diff --git a/src/contact.rs b/src/contact.rs index 2af80c147b..e57fc39bfd 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -109,7 +109,7 @@ impl ContactId { /// ID of the contact for device messages. pub const DEVICE: ContactId = ContactId::new(5); - const LAST_SPECIAL: ContactId = ContactId::new(9); + pub(crate) const LAST_SPECIAL: ContactId = ContactId::new(9); /// Address to go with [`ContactId::DEVICE`]. /// From 2dd44d5f89b5ce0ff0442f7770736888190d79c4 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sun, 1 Oct 2023 12:17:11 +0200 Subject: [PATCH 02/12] fix: cap percentage in connectivity layout to 100% it may happen that percentages larger than 100% are reported by the provider, eg. for some time a storage usage of 120% may be accepted. while we should report the values "as is" to the user, for the bar, percentages larger 100% will destroy the layout. --- src/scheduler/connectivity.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/scheduler/connectivity.rs b/src/scheduler/connectivity.rs index 472b10001b..4d8a66b916 100644 --- a/src/scheduler/connectivity.rs +++ b/src/scheduler/connectivity.rs @@ -1,4 +1,5 @@ use core::fmt; +use std::cmp::min; use std::{iter::once, ops::Deref, sync::Arc}; use anyhow::{anyhow, Result}; @@ -457,7 +458,8 @@ impl Context { } else { "green" }; - ret += &format!("
{percent}%
"); + let div_width_percent = min(100, percent); + ret += &format!("
{percent}%
"); ret += ""; } From 7c4bcf9004f7ec3d9e1d2c12862adc0f2b8d080e Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 3 Oct 2023 15:17:34 +0000 Subject: [PATCH 03/12] api!: deprecate `get_next_media()` --- deltachat-ffi/deltachat.h | 1 + deltachat-ffi/src/lib.rs | 1 + deltachat-jsonrpc/src/api/mod.rs | 4 ++++ src/chat.rs | 3 +++ 4 files changed, 9 insertions(+) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 1ef60960d4..9a064acf2d 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -1481,6 +1481,7 @@ dc_array_t* dc_get_chat_media (dc_context_t* context, uint32_t ch * Typically used to implement the "next" and "previous" buttons * in a gallery or in a media player. * + * @deprecated Deprecated 2023-10-03, use dc_get_chat_media() and navigate the returned array instead. * @memberof dc_context_t * @param context The context object as returned from dc_context_new(). * @param msg_id The ID of the current message from which the next or previous message should be searched. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 42ebf06b32..86d1423556 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -1431,6 +1431,7 @@ pub unsafe extern "C" fn dc_get_chat_media( } #[no_mangle] +#[allow(deprecated)] pub unsafe extern "C" fn dc_get_next_media( context: *mut dc_context_t, msg_id: u32, diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 0b98163904..bbbf1fdf43 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -1427,6 +1427,10 @@ impl CommandApi { /// /// one combined call for getting chat::get_next_media for both directions /// the manual chat::get_next_media in only one direction is not exposed by the jsonrpc yet + /// + /// Deprecated 2023-10-03, use `get_chat_media` method + /// and navigate the returned array instead. + #[allow(deprecated)] async fn get_neighboring_chat_media( &self, account_id: u32, diff --git a/src/chat.rs b/src/chat.rs index c131fd1e96..70025f40f0 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2898,6 +2898,9 @@ pub enum Direction { } /// Searches next/previous message based on the given message and list of types. +/// +/// Deprecated since 2023-10-03. +#[deprecated(note = "use `get_chat_media` instead")] pub async fn get_next_media( context: &Context, curr_msg_id: MsgId, From a5f0c1613e9f7f75bbd8336546170504c8d24b95 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 3 Oct 2023 18:58:32 +0000 Subject: [PATCH 04/12] fix: add Let's Encrypt root certificate to `reqwest` This certificate does not exist on older Android phones. It is already added manually for IMAP and SMTP, this commit adds the same certificate for HTTP requests. --- src/net/http.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/net/http.rs b/src/net/http.rs index cbee579598..6f31e3348a 100644 --- a/src/net/http.rs +++ b/src/net/http.rs @@ -4,12 +4,20 @@ use std::time::Duration; use anyhow::{anyhow, Result}; use mime::Mime; +use once_cell::sync::Lazy; use crate::context::Context; use crate::socks::Socks5Config; const HTTP_TIMEOUT: Duration = Duration::from_secs(30); +static LETSENCRYPT_ROOT: Lazy = Lazy::new(|| { + reqwest::tls::Certificate::from_der(include_bytes!( + "../../assets/root-certificates/letsencrypt/isrgrootx1.der" + )) + .unwrap() +}); + /// HTTP(S) GET response. #[derive(Debug)] pub struct Response { @@ -79,7 +87,10 @@ async fn read_url_inner(context: &Context, url: &str) -> Result) -> Result { - let builder = reqwest::ClientBuilder::new().timeout(HTTP_TIMEOUT); + let builder = reqwest::ClientBuilder::new() + .timeout(HTTP_TIMEOUT) + .add_root_certificate(LETSENCRYPT_ROOT.clone()); + let builder = if let Some(socks5_config) = socks5_config { let proxy = reqwest::Proxy::all(socks5_config.to_url())?; builder.proxy(proxy) From d51adf2aa0730faea84b04d215e15f51cbadd874 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 4 Oct 2023 03:05:33 +0000 Subject: [PATCH 05/12] feat(deltachat-rpc-client): log exceptions when long-running tasks die For example, reader_loop() may die if readline() tries to read too large line and thows an exception. We want to at least log the exception in this case. --- .../src/deltachat_rpc_client/rpc.py | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py index df65ffea1f..c43c363c11 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py @@ -1,5 +1,6 @@ import asyncio import json +import logging import os from typing import Any, Dict, Optional @@ -57,16 +58,20 @@ async def __aexit__(self, _exc_type, _exc, _tb): await self.close() async def reader_loop(self) -> None: - while True: - line = await self.process.stdout.readline() # noqa - if not line: # EOF - break - response = json.loads(line) - if "id" in response: - fut = self.request_events.pop(response["id"]) - fut.set_result(response) - else: - print(response) + try: + while True: + line = await self.process.stdout.readline() # noqa + if not line: # EOF + break + response = json.loads(line) + if "id" in response: + fut = self.request_events.pop(response["id"]) + fut.set_result(response) + else: + print(response) + except Exception: + # Log an exception if the reader loop dies. + logging.exception("Exception in the reader loop") async def get_queue(self, account_id: int) -> asyncio.Queue: if account_id not in self.event_queues: @@ -75,13 +80,17 @@ async def get_queue(self, account_id: int) -> asyncio.Queue: 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["contextId"] - queue = await self.get_queue(account_id) - await queue.put(event["event"]) + try: + while True: + if self.closing: + return + event = await self.get_next_event() + account_id = event["contextId"] + queue = await self.get_queue(account_id) + await queue.put(event["event"]) + except Exception: + # Log an exception if the event loop dies. + logging.exception("Exception in the event loop") async def wait_for_event(self, account_id: int) -> Optional[dict]: """Waits for the next event from the given account and returns it.""" From a15434783421885edc4a1e37915faf6a34a3ec29 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 3 Oct 2023 21:35:29 +0000 Subject: [PATCH 06/12] fix(deltachat-rpc-client): increase stdio buffer to 64 MiB Otherwise readline() gets stuck when JSON-RPC response is longer that 64 KiB. --- deltachat-rpc-client/src/deltachat_rpc_client/rpc.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py index c43c363c11..a3df4723eb 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py @@ -29,10 +29,16 @@ def __init__(self, accounts_dir: Optional[str] = None, **kwargs): self.events_task: asyncio.Task async def start(self) -> None: + # Use buffer of 64 MiB. + # Default limit as of Python 3.11 is 2**16 bytes, this is too low for some JSON-RPC responses, + # such as loading large HTML message content. + limit = 2**26 + self.process = await asyncio.create_subprocess_exec( "deltachat-rpc-server", stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE, + limit=limit, **self._kwargs, ) self.id = 0 From 8a2417f32d6c1a03a13d57f658f7e839fbf8d97b Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 2 Oct 2023 15:22:41 +0000 Subject: [PATCH 07/12] ci: test with Python 3.12 and PyPy 3.10 --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33fb07bb78..a27eda396c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -182,15 +182,15 @@ jobs: include: # Currently used Rust version. - os: ubuntu-latest - python: 3.11 + python: 3.12 - os: macos-latest - python: 3.11 + python: 3.12 # PyPy tests - os: ubuntu-latest - python: pypy3.9 + python: pypy3.10 - os: macos-latest - python: pypy3.9 + python: pypy3.10 # Minimum Supported Python Version = 3.7 # This is the minimum version for which manylinux Python wheels are @@ -232,15 +232,15 @@ jobs: matrix: include: - os: ubuntu-latest - python: 3.11 + python: 3.12 - os: macos-latest - python: 3.11 + python: 3.12 # PyPy tests - os: ubuntu-latest - python: pypy3.9 + python: pypy3.10 - os: macos-latest - python: pypy3.9 + python: pypy3.10 # Minimum Supported Python Version = 3.8 # From 1177c19a4303a6131f692845ad1d8660592a457c Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 2 Oct 2023 15:22:59 +0000 Subject: [PATCH 08/12] bulid: build wheels for Python 3.12 and PyPy 3.10 --- scripts/run_all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_all.sh b/scripts/run_all.sh index 87ce41ea38..42edb094f2 100755 --- a/scripts/run_all.sh +++ b/scripts/run_all.sh @@ -31,7 +31,7 @@ unset DCC_NEW_TMP_EMAIL # Try to build wheels for a range of interpreters, but don't fail if they are not available. # E.g. musllinux_1_1 does not have PyPy interpreters as of 2022-07-10 -tox --workdir "$TOXWORKDIR" -e py37,py38,py39,py310,py311,pypy37,pypy38,pypy39 --skip-missing-interpreters true +tox --workdir "$TOXWORKDIR" -e py37,py38,py39,py310,py311,py312,pypy37,pypy38,pypy39,pypy310 --skip-missing-interpreters true auditwheel repair "$TOXWORKDIR"/wheelhouse/deltachat* -w "$TOXWORKDIR/wheelhouse" From 7fc2b06b3febf231630d50b610533ef71dadda3a Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 4 Oct 2023 18:40:53 +0000 Subject: [PATCH 09/12] ci(mypy): ignore distutils Python 3.12 removed `distutils`. `distutils` from `setuptools` work fine, but have not typing stubs: https://github.com/python/typeshed/issues/10255 --- python/mypy.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/mypy.ini b/python/mypy.ini index 6b7560ab93..3eb9ae8c8d 100644 --- a/python/mypy.ini +++ b/python/mypy.ini @@ -24,3 +24,5 @@ ignore_missing_imports = True [mypy-imap_tools.*] ignore_missing_imports = True +[mypy-distutils.*] +ignore_missing_imports = True From 210a4ebcbe5571e2c07b34ef95ceb7fd0756d802 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 4 Oct 2023 18:59:20 +0000 Subject: [PATCH 10/12] ci: test async python bindings with Python 3.11 --- .github/workflows/ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a27eda396c..5228594d7d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -231,10 +231,14 @@ jobs: fail-fast: false matrix: include: + # Async Python bindings do not depend on Python version, + # but are tested on Python 3.11 until Python 3.12 support + # is added to `aiohttp` dependency: + # https://github.com/aio-libs/aiohttp/issues/7646 - os: ubuntu-latest - python: 3.12 + python: 3.11 - os: macos-latest - python: 3.12 + python: 3.11 # PyPy tests - os: ubuntu-latest From 5aa0205c808de4db2d1d5fec607b1b80906a4623 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Mon, 2 Oct 2023 18:56:08 -0300 Subject: [PATCH 11/12] fix: Add protected-headers directive to Content-Type of encrypted/signed MIME (#2302) Add protected-headers="v1" directive to Content-Type of an encrypted/signed MIME so that other MUAs like Thunderbird display the true message Subject instead of "...". --- Cargo.lock | 2 +- src/mimefactory.rs | 59 +++++++++++++++++++++++++++++++++++++++------- src/test_utils.rs | 8 ++++++- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf119faf0b..087c898262 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1605,7 +1605,7 @@ dependencies = [ [[package]] name = "email" version = "0.0.21" -source = "git+https://github.com/deltachat/rust-email?branch=master#25702df99254d059483b41417cd80696a258df8e" +source = "git+https://github.com/deltachat/rust-email?branch=master#37778c89d5eb5a94b7983f3f37ff67769bde3cf9" dependencies = [ "base64 0.11.0", "chrono", diff --git a/src/mimefactory.rs b/src/mimefactory.rs index d9d6ea1eeb..8e3243ff49 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -678,6 +678,12 @@ impl<'a> MimeFactory<'a> { }) }; + let get_content_type_directives_header = || { + ( + "Content-Type-Deltachat-Directives".to_string(), + "protected-headers=\"v1\"".to_string(), + ) + }; let outer_message = if is_encrypted { headers.protected.push(from_header); @@ -714,10 +720,7 @@ impl<'a> MimeFactory<'a> { if !existing_ct.ends_with(';') { existing_ct += ";"; } - let message = message.replace_header(Header::new( - "Content-Type".to_string(), - format!("{existing_ct} protected-headers=\"v1\";"), - )); + let message = message.header(get_content_type_directives_header()); // Set the appropriate Content-Type for the outer message let outer_message = PartBuilder::new().header(( @@ -786,11 +789,12 @@ impl<'a> MimeFactory<'a> { { message } else { + let message = message.header(get_content_type_directives_header()); let (payload, signature) = encrypt_helper.sign(context, message).await?; PartBuilder::new() .header(( - "Content-Type".to_string(), - "multipart/signed; protocol=\"application/pgp-signature\"".to_string(), + "Content-Type", + "multipart/signed; protocol=\"application/pgp-signature\"", )) .child(payload) .child( @@ -1535,6 +1539,7 @@ fn maybe_encode_words(words: &str) -> String { #[cfg(test)] mod tests { use mailparse::{addrparse_header, MailHeaderMap}; + use std::str; use super::*; use crate::chat::ChatId; @@ -1543,10 +1548,11 @@ mod tests { ProtectionStatus, }; use crate::chatlist::Chatlist; + use crate::constants; use crate::contact::{ContactAddress, Origin}; use crate::mimeparser::MimeMessage; use crate::receive_imf::receive_imf; - use crate::test_utils::{get_chat_msg, TestContext}; + use crate::test_utils::{get_chat_msg, TestContext, TestContextManager}; #[test] fn test_render_email_address() { let display_name = "รค space"; @@ -2195,7 +2201,11 @@ mod tests { assert_eq!(part.match_indices("Chat-User-Avatar:").count(), 0); let part = payload.next().unwrap(); - assert_eq!(part.match_indices("multipart/mixed").count(), 1); + assert_eq!( + part.match_indices("multipart/mixed; protected-headers=\"v1\"") + .count(), + 1 + ); assert_eq!(part.match_indices("Subject:").count(), 1); assert_eq!(part.match_indices("Autocrypt:").count(), 0); assert_eq!(part.match_indices("Chat-User-Avatar:").count(), 0); @@ -2307,4 +2317,37 @@ mod tests { Ok(()) } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_protected_headers_directive() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = tcm.alice().await; + let bob = tcm.bob().await; + let chat = tcm + .send_recv_accept(&alice, &bob, "alice->bob") + .await + .chat_id; + + // Now Bob can send an encrypted message to Alice. + let mut msg = Message::new(Viewtype::File); + // Long messages are truncated and MimeMessage::decoded_data is set for them. We need + // decoded_data to check presense of the necessary headers. + msg.set_text("a".repeat(constants::DC_DESIRED_TEXT_LEN + 1)); + msg.set_file_from_bytes(&bob, "foo.bar", "content".as_bytes(), None) + .await?; + let sent = bob.send_msg(chat, &mut msg).await; + assert!(msg.get_showpadlock()); + + let mime = MimeMessage::from_bytes(&alice, sent.payload.as_bytes(), None).await?; + let mut payload = str::from_utf8(&mime.decoded_data)?.splitn(2, "\r\n\r\n"); + let part = payload.next().unwrap(); + assert_eq!( + part.match_indices("multipart/mixed; protected-headers=\"v1\"") + .count(), + 1 + ); + assert_eq!(part.match_indices("Subject:").count(), 1); + + Ok(()) + } } diff --git a/src/test_utils.rs b/src/test_utils.rs index 52c4dd111e..596c0cba92 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -108,9 +108,15 @@ impl TestContextManager { /// - Let one TestContext send a message /// - 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) { + pub async fn send_recv_accept( + &self, + from: &TestContext, + to: &TestContext, + msg: &str, + ) -> Message { let received_msg = self.send_recv(from, to, msg).await; received_msg.chat_id.accept(to).await.unwrap(); + received_msg } /// - Let one TestContext send a message From 1040bc551fe37e2cfc7a519b6bddcb3d2a915b35 Mon Sep 17 00:00:00 2001 From: link2xt Date: Wed, 4 Oct 2023 20:29:08 +0000 Subject: [PATCH 12/12] chore(release): prepare for 1.124.0 --- CHANGELOG.md | 34 +++++++++++++++++++++++ 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, 47 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6ea5ea5b9..3ab0cc53bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,38 @@ # Changelog +## [1.124.0] - 2023-10-04 + +### API-Changes + +- [**breaking**] Return `DC_CONTACT_ID_SELF` from `dc_contact_get_verifier_id()` for directly verified contacts. +- Deprecate `dc_contact_get_verifier_addr`. +- python: use `dc_contact_get_verifier_id()`. `get_verifier()` returns a Contact rather than an address now. +- Deprecate `get_next_media()`. +- Ignore public key argument in `dc_preconfigure_keypair()`. Public key is extracted from the private key. + +### Fixes + +- Wrap base64-encoded parts to 76 characters. +- Require valid email addresses in `dc_provider_new_from_email[_with_dns]`. +- Do not trash messages with attachments and no text when `location.kml` is attached ([#4749](https://github.com/deltachat/deltachat-core-rust/issues/4749)). +- Initialise `last_msg_id` to the highest known row id. This ensures bots migrated from older version to `dc_get_next_msgs()` API do not process all previous messages from scratch. +- Do not put the status footer into reaction MIME parts. +- Ignore special chats in `get_similar_chat_ids()`. This prevents trash chat from showing up in similar chat list ([#4756](https://github.com/deltachat/deltachat-core-rust/issues/4756)). +- Cap percentage in connectivity layout to 100% ([#4765](https://github.com/deltachat/deltachat-core-rust/pull/4765)). +- Add Let's Encrypt root certificate to `reqwest`. This should allow scanning `DCACCOUNT` QR-codes on older Android phones when the server has a Let's Encrypt certificate. +- deltachat-rpc-client: Increase stdio buffer to 64 MiB to avoid Python bots crashing when trying to load large messages via a JSON-RPC call. +- Add `protected-headers` directive to Content-Type of encrypted messages with attachments ([#2302](https://github.com/deltachat/deltachat-core-rust/issues/2302)). This makes Thunderbird show encrypted Subject for Delta Chat messages. +- webxdc: Reset `document.update` on forwarding. This fixes the test `test_forward_webxdc_instance()`. + +### Features / Changes + +- Remove extra members from the local list in sake of group membership consistency ([#3782](https://github.com/deltachat/deltachat-core-rust/issues/3782)). +- deltachat-rpc-client: Log exceptions when long-running tasks die. + +### Build + +- Build wheels for Python 3.12 and PyPy 3.10. + ## [1.123.0] - 2023-09-22 ### API-Changes @@ -2834,3 +2867,4 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed [1.121.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.120.0...v1.121.0 [1.122.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.121.0...v1.122.0 [1.123.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.122.0...v1.123.0 +[1.124.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.123.0...v1.124.0 diff --git a/Cargo.lock b/Cargo.lock index 087c898262..3843efa44c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1103,7 +1103,7 @@ dependencies = [ [[package]] name = "deltachat" -version = "1.123.0" +version = "1.124.0" dependencies = [ "ansi_term", "anyhow", @@ -1179,7 +1179,7 @@ dependencies = [ [[package]] name = "deltachat-jsonrpc" -version = "1.123.0" +version = "1.124.0" dependencies = [ "anyhow", "async-channel", @@ -1203,7 +1203,7 @@ dependencies = [ [[package]] name = "deltachat-repl" -version = "1.123.0" +version = "1.124.0" dependencies = [ "ansi_term", "anyhow", @@ -1218,7 +1218,7 @@ dependencies = [ [[package]] name = "deltachat-rpc-server" -version = "1.123.0" +version = "1.124.0" dependencies = [ "anyhow", "deltachat", @@ -1243,7 +1243,7 @@ dependencies = [ [[package]] name = "deltachat_ffi" -version = "1.123.0" +version = "1.124.0" dependencies = [ "anyhow", "deltachat", diff --git a/Cargo.toml b/Cargo.toml index 59d6db317c..529fbf4b24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat" -version = "1.123.0" +version = "1.124.0" edition = "2021" license = "MPL-2.0" rust-version = "1.65" diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index b544dbb57d..03628e0cef 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat_ffi" -version = "1.123.0" +version = "1.124.0" description = "Deltachat FFI" edition = "2018" readme = "README.md" diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 9a9251617d..5040bcef78 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-jsonrpc" -version = "1.123.0" +version = "1.124.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 7f0307837b..65848a35ff 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.123.0" + "version": "1.124.0" } diff --git a/deltachat-repl/Cargo.toml b/deltachat-repl/Cargo.toml index e3bb8b408e..557c2699c4 100644 --- a/deltachat-repl/Cargo.toml +++ b/deltachat-repl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-repl" -version = "1.123.0" +version = "1.124.0" license = "MPL-2.0" edition = "2021" diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index 364679a9ad..a8434ee837 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deltachat-rpc-server" -version = "1.123.0" +version = "1.124.0" description = "DeltaChat JSON-RPC server" edition = "2021" readme = "README.md" diff --git a/package.json b/package.json index 31743b7386..edec01fc96 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.123.0" + "version": "1.124.0" } diff --git a/release-date.in b/release-date.in index d6d1f7fd54..0539de2f74 100644 --- a/release-date.in +++ b/release-date.in @@ -1 +1 @@ -2023-09-22 \ No newline at end of file +2023-10-04 \ No newline at end of file