diff --git a/Cargo.lock b/Cargo.lock index a2a70cda..40b88481 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2975,7 +2975,7 @@ dependencies = [ [[package]] name = "ruma" version = "0.10.1" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "assign", "js_int", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "ruma-appservice-api" version = "0.10.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "js_int", "ruma-common", @@ -3009,7 +3009,7 @@ dependencies = [ [[package]] name = "ruma-client-api" version = "0.18.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "as_variant", "assign", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "ruma-common" version = "0.13.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "as_variant", "base64 0.22.1", @@ -3062,7 +3062,7 @@ dependencies = [ [[package]] name = "ruma-events" version = "0.28.1" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "as_variant", "indexmap 2.4.0", @@ -3086,7 +3086,7 @@ dependencies = [ [[package]] name = "ruma-federation-api" version = "0.9.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "bytes", "http", @@ -3104,7 +3104,7 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" version = "0.9.5" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "js_int", "thiserror", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "ruma-identity-service-api" version = "0.9.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "js_int", "ruma-common", @@ -3123,7 +3123,7 @@ dependencies = [ [[package]] name = "ruma-macros" version = "0.13.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "once_cell", "proc-macro-crate", @@ -3138,7 +3138,7 @@ dependencies = [ [[package]] name = "ruma-push-gateway-api" version = "0.9.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "js_int", "ruma-common", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "ruma-server-util" version = "0.3.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "headers", "http", @@ -3163,7 +3163,7 @@ dependencies = [ [[package]] name = "ruma-signatures" version = "0.15.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "ruma-state-res" version = "0.11.0" -source = "git+https://github.com/girlbossceo/ruwuma?rev=a0cc9a80dd5da700fb9b992b6f92cb6be4c27487#a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +source = "git+https://github.com/girlbossceo/ruwuma?rev=89cee2d2d9f3776cb0a94fcea04fca456ed8a064#89cee2d2d9f3776cb0a94fcea04fca456ed8a064" dependencies = [ "itertools 0.12.1", "js_int", diff --git a/Cargo.toml b/Cargo.toml index c6793c44..59284ecf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -314,7 +314,7 @@ version = "0.1.2" [workspace.dependencies.ruma] git = "https://github.com/girlbossceo/ruwuma" #branch = "conduwuit-changes" -rev = "a0cc9a80dd5da700fb9b992b6f92cb6be4c27487" +rev = "89cee2d2d9f3776cb0a94fcea04fca456ed8a064" features = [ "compat", "rand", diff --git a/src/api/router.rs b/src/api/router.rs index 7d6df16c..a76cac32 100644 --- a/src/api/router.rs +++ b/src/api/router.rs @@ -230,6 +230,8 @@ pub fn build(router: Router, server: &Server) -> Router { .ruma_route(server::get_openid_userinfo_route) .ruma_route(server::get_hierarchy_route) .ruma_route(server::well_known_server) + .ruma_route(server::get_content_route) + .ruma_route(server::get_content_thumbnail_route) .route("/_conduwuit/local_user_count", get(client::conduwuit_local_user_count)) } else { router diff --git a/src/api/server/media.rs b/src/api/server/media.rs new file mode 100644 index 00000000..757cc9cc --- /dev/null +++ b/src/api/server/media.rs @@ -0,0 +1,83 @@ +use axum::extract::State; +use axum_client_ip::InsecureClientIp; +use conduit::{utils::content_disposition::make_content_disposition, Err, Result}; +use conduit_service::media::{Dim, FileMeta}; +use ruma::{ + api::federation::authenticated_media::{ + get_content, get_content_thumbnail, Content, ContentMetadata, FileOrLocation, + }, + Mxc, +}; + +use crate::Ruma; + +/// # `GET /_matrix/federation/v1/media/download/{mediaId}` +/// +/// Load media from our server. +#[tracing::instrument(skip_all, fields(%client), name = "media_get")] +pub(crate) async fn get_content_route( + State(services): State, InsecureClientIp(client): InsecureClientIp, + body: Ruma, +) -> Result { + let mxc = Mxc { + server_name: services.globals.server_name(), + media_id: &body.media_id, + }; + + let Some(FileMeta { + content, + content_type, + content_disposition, + }) = services.media.get(&mxc).await? + else { + return Err!(Request(NotFound("Media not found."))); + }; + + let content_disposition = make_content_disposition(content_disposition.as_ref(), content_type.as_deref(), None); + let content = Content { + file: content.expect("entire file contents"), + content_type: content_type.map(Into::into), + content_disposition: Some(content_disposition), + }; + + Ok(get_content::v1::Response { + content: FileOrLocation::File(content), + metadata: ContentMetadata::new(), + }) +} + +/// # `GET /_matrix/federation/v1/media/thumbnail/{mediaId}` +/// +/// Load media thumbnail from our server. +#[tracing::instrument(skip_all, fields(%client), name = "media_thumbnail_get")] +pub(crate) async fn get_content_thumbnail_route( + State(services): State, InsecureClientIp(client): InsecureClientIp, + body: Ruma, +) -> Result { + let dim = Dim::from_ruma(body.width, body.height, body.method.clone())?; + let mxc = Mxc { + server_name: services.globals.server_name(), + media_id: &body.media_id, + }; + + let Some(FileMeta { + content, + content_type, + content_disposition, + }) = services.media.get_thumbnail(&mxc, &dim).await? + else { + return Err!(Request(NotFound("Media not found."))); + }; + + let content_disposition = make_content_disposition(content_disposition.as_ref(), content_type.as_deref(), None); + let content = Content { + file: content.expect("entire file contents"), + content_type: content_type.map(Into::into), + content_disposition: Some(content_disposition), + }; + + Ok(get_content_thumbnail::v1::Response { + content: FileOrLocation::File(content), + metadata: ContentMetadata::new(), + }) +} diff --git a/src/api/server/mod.rs b/src/api/server/mod.rs index 5d46a866..9a184f23 100644 --- a/src/api/server/mod.rs +++ b/src/api/server/mod.rs @@ -7,6 +7,7 @@ pub(super) mod invite; pub(super) mod key; pub(super) mod make_join; pub(super) mod make_leave; +pub(super) mod media; pub(super) mod openid; pub(super) mod publicrooms; pub(super) mod query; @@ -28,6 +29,7 @@ pub(super) use invite::*; pub(super) use key::*; pub(super) use make_join::*; pub(super) use make_leave::*; +pub(super) use media::*; pub(super) use openid::*; pub(super) use publicrooms::*; pub(super) use query::*;