diff --git a/src/api/client/keys.rs b/src/api/client/keys.rs index 15037201..c91e9924 100644 --- a/src/api/client/keys.rs +++ b/src/api/client/keys.rs @@ -17,7 +17,9 @@ use ruma::{ serde::Raw, }; use serde_json::json; -use tuwunel_core::{Err, Result, debug, debug_error, debug_warn, err, result::NotFound}; +use tuwunel_core::{ + Err, Result, debug, debug_error, debug_warn, err, result::NotFound, utils::json, +}; use tuwunel_service::{Services, users::parse_master_key}; use crate::{Ruma, router::auth_uiaa}; @@ -537,16 +539,16 @@ where .signatures .append(&mut our_master_key.signatures); } - let json = serde_json::to_value(master_key).expect("to_value always works"); - let raw = serde_json::from_value(json).expect("Raw::from_value always works"); + + // Dont notify. A notification would trigger another key request resulting in + // an endless loop. + let notify = false; + let raw = Some(json::to_raw(master_key)?); services .users - .add_cross_signing_keys( - &user, &raw, &None, &None, - false, /* Dont notify. A notification would trigger another key - * request resulting in an endless loop */ - ) + .add_cross_signing_keys(&user, &raw, &None, &None, notify) .await?; + if let Some(raw) = raw { master_keys.insert(user.clone(), raw); } diff --git a/src/core/utils/json.rs b/src/core/utils/json.rs index df4ccd13..3adf5050 100644 --- a/src/core/utils/json.rs +++ b/src/core/utils/json.rs @@ -1,9 +1,17 @@ use std::{fmt, marker::PhantomData, str::FromStr}; -use ruma::{CanonicalJsonError, CanonicalJsonObject, canonical_json::try_from_json_map}; +use ruma::{ + CanonicalJsonError, CanonicalJsonObject, canonical_json::try_from_json_map, serde::Raw, +}; use crate::Result; +/// Perform a round-trip through serde_json starting with a native type T and +/// ending with a Ruma Raw which is usually just T. +pub fn to_raw(input: T) -> Result> { + Ok(serde_json::from_value(serde_json::to_value(input)?)?) +} + /// Fallible conversion from any value that implements `Serialize` to a /// `CanonicalJsonObject`. ///