From deca2c52c65e84b40475018c77c61949614c25eb Mon Sep 17 00:00:00 2001 From: strawberry Date: Wed, 3 Jul 2024 03:53:50 -0400 Subject: [PATCH] switch to ruma's X-Matrix parser Signed-off-by: strawberry --- Cargo.lock | 23 +++++++++++++++ Cargo.toml | 1 + src/api/router/auth.rs | 18 +++++++++--- src/api/router/mod.rs | 1 - src/api/router/xmatrix.rs | 61 --------------------------------------- 5 files changed, 38 insertions(+), 66 deletions(-) delete mode 100644 src/api/router/xmatrix.rs diff --git a/Cargo.lock b/Cargo.lock index d009df4b..ac079d91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1552,6 +1552,15 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-auth" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643c9bbf6a4ea8a656d6b4cd53d34f79e3f841ad5203c1a55fb7d761923bc255" +dependencies = [ + "memchr", +] + [[package]] name = "http-body" version = "0.4.6" @@ -2906,6 +2915,7 @@ dependencies = [ "ruma-federation-api", "ruma-identity-service-api", "ruma-push-gateway-api", + "ruma-server-util", "ruma-signatures", "ruma-state-res", "web-time 1.1.0", @@ -3066,6 +3076,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "ruma-server-util" +version = "0.3.0" +source = "git+https://github.com/girlbossceo/ruwuma?rev=9a5bfad8494b7a4e6c40421c3d0675db4b434ec0#9a5bfad8494b7a4e6c40421c3d0675db4b434ec0" +dependencies = [ + "headers", + "http 1.1.0", + "http-auth", + "ruma-common", + "thiserror", + "tracing", +] + [[package]] name = "ruma-signatures" version = "0.15.0" diff --git a/Cargo.toml b/Cargo.toml index 755ff46a..e63dcef5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -284,6 +284,7 @@ features = [ "markdown", "push-gateway-api-c", "state-res", + "server-util", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified", diff --git a/src/api/router/auth.rs b/src/api/router/auth.rs index da36c82c..08a08e08 100644 --- a/src/api/router/auth.rs +++ b/src/api/router/auth.rs @@ -9,11 +9,12 @@ use axum_extra::{ use http::uri::PathAndQuery; use ruma::{ api::{client::error::ErrorKind, AuthScheme, Metadata}, + server_util::authorization::XMatrix, CanonicalJsonValue, OwnedDeviceId, OwnedServerName, OwnedUserId, UserId, }; use tracing::warn; -use super::{request::Request, xmatrix::XMatrix}; +use super::request::Request; use crate::{service::appservice::RegistrationInfo, services, Error, Result}; enum Token { @@ -202,8 +203,17 @@ async fn auth_server(request: &mut Request, json_body: &Option, - pub(crate) key: String, // KeyName? - pub(crate) sig: String, -} - -impl Credentials for XMatrix { - const SCHEME: &'static str = "X-Matrix"; - - fn decode(value: &http::HeaderValue) -> Option { - debug_assert!( - value.as_bytes().starts_with(b"X-Matrix "), - "HeaderValue to decode should start with \"X-Matrix ..\", received = {value:?}", - ); - - let parameters = str::from_utf8(&value.as_bytes()["X-Matrix ".len()..]) - .ok()? - .trim_start(); - - let mut origin = None; - let mut destination = None; - let mut key = None; - let mut sig = None; - - for entry in parameters.split_terminator(',') { - let (name, value) = entry.split_once('=')?; - - // It's not at all clear why some fields are quoted and others not in the spec, - // let's simply accept either form for every field. - let value = value - .strip_prefix('"') - .and_then(|rest| rest.strip_suffix('"')) - .unwrap_or(value); - - // FIXME: Catch multiple fields of the same name - match name { - "origin" => origin = Some(value.try_into().ok()?), - "key" => key = Some(value.to_owned()), - "sig" => sig = Some(value.to_owned()), - "destination" => destination = Some(value.to_owned()), - _ => debug!("Unexpected field `{name}` in X-Matrix Authorization header"), - } - } - - Some(Self { - origin: origin?, - key: key?, - sig: sig?, - destination, - }) - } - - fn encode(&self) -> http::HeaderValue { todo!() } -}