From 295cd7b1273ed5c468619483432b90b063894813 Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:05:16 +0200 Subject: [PATCH] Fix Registry: Allow changing object variants --- crates/http/src/auth/oauth/openid.rs | 10 ++++++- crates/jmap/src/registry/set.rs | 14 +++++---- crates/registry/src/schema/properties_impl.rs | 29 +++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/crates/http/src/auth/oauth/openid.rs b/crates/http/src/auth/oauth/openid.rs index 3d3f7f4a..14cbecaf 100644 --- a/crates/http/src/auth/oauth/openid.rs +++ b/crates/http/src/auth/oauth/openid.rs @@ -57,7 +57,15 @@ impl OpenIdHandler for Server { async fn handle_oidc_metadata(&self, strip_base_url: bool) -> trc::Result { let base_url = if strip_base_url { - "" + #[cfg(feature = "dev_mode")] + { + "http://127.0.0.1:8080" + } + + #[cfg(not(feature = "dev_mode"))] + { + "" + } } else { &self.core.network.http.url_https }; diff --git a/crates/jmap/src/registry/set.rs b/crates/jmap/src/registry/set.rs index 7451505c..ea76b145 100644 --- a/crates/jmap/src/registry/set.rs +++ b/crates/jmap/src/registry/set.rs @@ -343,11 +343,12 @@ impl RegistrySet for Server { }; if is_create - || (is_singleton - && value - .as_object() - .unwrap() - .contains_key(&Key::Property(Property::Type))) + || value + .as_object() + .unwrap() + .get(&Key::Property(Property::Type)) + .and_then(|v| v.as_str()) + .is_some_and(|t| new_object.object_variant().is_some_and(|v| v != t)) { // Patch object match new_object.patch( @@ -383,6 +384,9 @@ impl RegistrySet for Server { } else { for (key, value) in value.into_expanded_object() { let ptr = match key { + Key::Property(Property::Type) => { + continue; + } Key::Property(prop) => { JsonPointer::new(vec![JsonPointerItem::Key(Key::Property( prop, diff --git a/crates/registry/src/schema/properties_impl.rs b/crates/registry/src/schema/properties_impl.rs index 2c456ae1..0a81e9e7 100644 --- a/crates/registry/src/schema/properties_impl.rs +++ b/crates/registry/src/schema/properties_impl.rs @@ -5219,6 +5219,35 @@ impl Object { } } + pub fn object_variant(&self) -> Option<&'static str> { + match &self.inner { + ObjectInner::Account(obj) => Some(obj.object_type().as_str()), + ObjectInner::Action(obj) => Some(obj.object_type().as_str()), + ObjectInner::ArchivedItem(obj) => Some(obj.object_type().as_str()), + ObjectInner::Asn(obj) => Some(obj.object_type().as_str()), + ObjectInner::BlobStore(obj) => Some(obj.object_type().as_str()), + ObjectInner::Coordinator(obj) => Some(obj.object_type().as_str()), + ObjectInner::DataStore(obj) => Some(obj.object_type().as_str()), + ObjectInner::Directory(obj) => Some(obj.object_type().as_str()), + ObjectInner::DkimSignature(obj) => Some(obj.object_type().as_str()), + ObjectInner::DnsResolver(obj) => Some(obj.object_type().as_str()), + ObjectInner::DnsServer(obj) => Some(obj.object_type().as_str()), + ObjectInner::InMemoryStore(obj) => Some(obj.object_type().as_str()), + ObjectInner::Metric(obj) => Some(obj.object_type().as_str()), + ObjectInner::MetricsStore(obj) => Some(obj.object_type().as_str()), + ObjectInner::MtaRoute(obj) => Some(obj.object_type().as_str()), + ObjectInner::SearchStore(obj) => Some(obj.object_type().as_str()), + ObjectInner::SpamDnsblServer(obj) => Some(obj.object_type().as_str()), + ObjectInner::SpamLlm(obj) => Some(obj.object_type().as_str()), + ObjectInner::SpamRule(obj) => Some(obj.object_type().as_str()), + ObjectInner::SpamTag(obj) => Some(obj.object_type().as_str()), + ObjectInner::Task(obj) => Some(obj.object_type().as_str()), + ObjectInner::Tracer(obj) => Some(obj.object_type().as_str()), + ObjectInner::TracingStore(obj) => Some(obj.object_type().as_str()), + _ => None, + } + } + pub fn validate(&self, errors: &mut Vec) -> bool { match &self.inner { ObjectInner::Account(obj) => obj.validate(errors),