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,
keys::{
claim_keys, get_key_changes, get_keys, upload_keys,
upload_signatures::{self, v3::Failure},
upload_signatures::{self},
upload_signing_keys,
},
uiaa::{AuthFlow, AuthType, UiaaInfo},
@ -308,82 +308,59 @@ async fn check_for_new_keys(
///
/// 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
/// exploding the entire request on bad sigs, but needs way more work.
/// TODO: clean this timo-code up more and integrate failures. tried to improve
/// it a bit to stop exploding the entire request on bad sigs, but needs way
/// more work.
pub(crate) async fn upload_signatures_route(
State(services): State<crate::State>,
body: Ruma<upload_signatures::v3::Request>,
) -> Result<upload_signatures::v3::Response> {
use upload_signatures::v3::FailureErrorCode::*;
if body.signed_keys.is_empty() {
debug!("Empty signed_keys sent in key signature upload");
return Ok(upload_signatures::v3::Response::new());
}
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 (key_id, key) in keys {
let Ok(key) = serde_json::to_value(key)
.inspect_err(|e| debug_warn!(?key_id, "Invalid \"key\" JSON: {e}"))
else {
let mut failure = failure.clone();
failure.error = String::from("Invalid \"key\" JSON");
failure_reasons.insert(key_id.to_owned(), failure);
continue;
};
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;
};
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;
};
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;
};
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
.sign_key(user_id, key_id, signature, sender_user)
.await
.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;
}
}
}
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`