try partially reverting 94b107b42b

Signed-off-by: June Clementine Strawberry <june@3.dog>
This commit is contained in:
June Clementine Strawberry 2025-04-05 14:07:37 -04:00
parent a212bf7cfc
commit c7246662f4
No known key found for this signature in database

View file

@ -11,7 +11,7 @@ use ruma::{
error::ErrorKind, error::ErrorKind,
keys::{ keys::{
claim_keys, get_key_changes, get_keys, upload_keys, claim_keys, get_key_changes, get_keys, upload_keys,
upload_signatures::{self, v3::Failure}, upload_signatures::{self},
upload_signing_keys, upload_signing_keys,
}, },
uiaa::{AuthFlow, AuthType, UiaaInfo}, uiaa::{AuthFlow, AuthType, UiaaInfo},
@ -308,82 +308,59 @@ async fn check_for_new_keys(
/// ///
/// Uploads end-to-end key signatures from the sender user. /// Uploads end-to-end key signatures from the sender user.
/// ///
/// TODO: clean this timo-code up more. tried to improve it a bit to stop /// TODO: clean this timo-code up more and integrate failures. tried to improve
/// exploding the entire request on bad sigs, but needs way more work. /// it a bit to stop exploding the entire request on bad sigs, but needs way
/// more work.
pub(crate) async fn upload_signatures_route( pub(crate) async fn upload_signatures_route(
State(services): State<crate::State>, State(services): State<crate::State>,
body: Ruma<upload_signatures::v3::Request>, body: Ruma<upload_signatures::v3::Request>,
) -> Result<upload_signatures::v3::Response> { ) -> Result<upload_signatures::v3::Response> {
use upload_signatures::v3::FailureErrorCode::*;
if body.signed_keys.is_empty() { if body.signed_keys.is_empty() {
debug!("Empty signed_keys sent in key signature upload"); debug!("Empty signed_keys sent in key signature upload");
return Ok(upload_signatures::v3::Response::new()); return Ok(upload_signatures::v3::Response::new());
} }
let sender_user = body.sender_user(); let sender_user = body.sender_user();
let mut failures: BTreeMap<OwnedUserId, BTreeMap<String, Failure>> = BTreeMap::new();
let mut failure_reasons: BTreeMap<String, Failure> = BTreeMap::new();
let failure = Failure {
errcode: InvalidSignature,
error: String::new(),
};
for (user_id, keys) in &body.signed_keys { for (user_id, keys) in &body.signed_keys {
for (key_id, key) in keys { for (key_id, key) in keys {
let Ok(key) = serde_json::to_value(key) let Ok(key) = serde_json::to_value(key)
.inspect_err(|e| debug_warn!(?key_id, "Invalid \"key\" JSON: {e}")) .inspect_err(|e| debug_warn!(?key_id, "Invalid \"key\" JSON: {e}"))
else { else {
let mut failure = failure.clone();
failure.error = String::from("Invalid \"key\" JSON");
failure_reasons.insert(key_id.to_owned(), failure);
continue; continue;
}; };
let Some(signatures) = key.get("signatures") else { let Some(signatures) = key.get("signatures") else {
let mut failure = failure.clone();
failure.error = String::from("Missing \"signatures\" field");
failure_reasons.insert(key_id.to_owned(), failure);
continue; continue;
}; };
let Some(sender_user_val) = signatures.get(sender_user.to_string()) else { let Some(sender_user_val) = signatures.get(sender_user.to_string()) else {
let mut failure = failure.clone();
failure.error = String::from("Invalid user in signatures field");
failure_reasons.insert(key_id.to_owned(), failure);
continue; continue;
}; };
let Some(sender_user_object) = sender_user_val.as_object() else { let Some(sender_user_object) = sender_user_val.as_object() else {
let mut failure = failure.clone();
failure.error = String::from("signatures field is not a JSON object");
failure_reasons.insert(key_id.to_owned(), failure);
continue; continue;
}; };
for (signature, val) in sender_user_object.clone() { for (signature, val) in sender_user_object.clone() {
let signature = (signature, val.to_string()); let Some(val) = val.as_str().map(ToOwned::to_owned) else {
continue;
};
let signature = (signature, val);
if let Err(e) = services if let Err(_e) = services
.users .users
.sign_key(user_id, key_id, signature, sender_user) .sign_key(user_id, key_id, signature, sender_user)
.await .await
.inspect_err(|e| debug_warn!("{e}")) .inspect_err(|e| debug_warn!("{e}"))
{ {
let mut failure = failure.clone();
failure.error = format!("Error signing key: {e}");
failure_reasons.insert(key_id.to_owned(), failure);
continue; continue;
} }
} }
} }
if !failure_reasons.is_empty() {
failures.insert(user_id.to_owned(), failure_reasons.clone());
}
} }
Ok(upload_signatures::v3::Response { failures }) Ok(upload_signatures::v3::Response { failures: BTreeMap::new() })
} }
/// # `POST /_matrix/client/r0/keys/changes` /// # `POST /_matrix/client/r0/keys/changes`