From 471254d3241794bbcd135dd8670eb7ad5d95cfef Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Mon, 15 Jun 2026 21:09:10 +0200 Subject: [PATCH] Fix Registry: Object ids are parsed as numbers --- CHANGELOG.md | 1 + Cargo.lock | 12 ++++++------ crates/registry/src/types/map.rs | 29 +++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfa484a8..be81f471 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If - ACME: Add freshness check when renewing certificates. - Autodiscover v2: Read email address from query parameters. - Sieve: Do not keep copies of redirected messages when `keep` is not specified. +- Registry: Object ids are parsed as numbers. ## [0.16.8] - 2026-06-06 diff --git a/Cargo.lock b/Cargo.lock index e2fac12b..56b1838b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2087,9 +2087,9 @@ dependencies = [ [[package]] name = "dns-update" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "979ac56202ff07803ffb7d2c0f053e0d62018f87583b9f944de8abe93220253f" +checksum = "61121fe40a074b4b6f5bad089259c492a1d786c6346362a2a4b8961f484f36c5" dependencies = [ "aws-lc-rs", "base64 0.22.1", @@ -2906,9 +2906,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -3882,9 +3882,9 @@ dependencies = [ [[package]] name = "jmap-tools" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751dc449b93fc24f460c346ac2e0a87f410cd3f78971709c4e7b80236432aa30" +checksum = "acb13aa98c80fe11bd7fb170bb8485d5844a30a41398894a3adb5c1216d3c357" dependencies = [ "hashify", "rkyv", diff --git a/crates/registry/src/types/map.rs b/crates/registry/src/types/map.rs index 44d8925f..af953c15 100644 --- a/crates/registry/src/types/map.rs +++ b/crates/registry/src/types/map.rs @@ -300,8 +300,8 @@ impl MapItem for Id { Id::from_str(value).ok() } - fn try_from_integer(_: u64) -> Option { - None + fn try_from_integer(value: u64) -> Option { + Id::from_str(&value.to_string()).ok() } fn into_string(self) -> Cow<'static, str> { @@ -417,3 +417,28 @@ impl IntoIterator for Map { self.0.into_iter() } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{jmap::JsonPointerPatch, schema::prelude::Property}; + use jmap_tools::JsonPointer; + + fn patch_member(ptr_str: &str) -> Map { + let mut map = Map::::default(); + let ptr = JsonPointer::::parse(ptr_str); + let pointer = JsonPointerPatch::new(&ptr); + map.patch(pointer, Value::Bool(true)).expect("patch failed"); + map + } + + #[test] + fn patch_map_id_digit_keys() { + for id in [0u64, 28, 29, 70, 861, 954, 957, 30554] { + let id = Id::new(id); + let key = id.as_string(); + let map = patch_member(&key); + assert_eq!(map.0, vec![id], "id {} via key '{key}'", id.id()); + } + } +}