mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 07:41:23 +01:00
server_server: implement authenticated media endpoints
This commit is contained in:
parent
79053ad052
commit
d3b6718812
2 changed files with 81 additions and 2 deletions
|
|
@ -17,6 +17,7 @@ use ruma::{
|
||||||
api::{
|
api::{
|
||||||
client::error::{Error as RumaError, ErrorKind},
|
client::error::{Error as RumaError, ErrorKind},
|
||||||
federation::{
|
federation::{
|
||||||
|
authenticated_media,
|
||||||
authorization::get_event_authorization,
|
authorization::get_event_authorization,
|
||||||
backfill::get_backfill,
|
backfill::get_backfill,
|
||||||
device::get_devices::{self, v1::UserDevice},
|
device::get_devices::{self, v1::UserDevice},
|
||||||
|
|
@ -72,8 +73,8 @@ use crate::{
|
||||||
api::client_server::{self, claim_keys_helper, get_keys_helper},
|
api::client_server::{self, claim_keys_helper, get_keys_helper},
|
||||||
observability::{FoundIn, Lookup, METRICS},
|
observability::{FoundIn, Lookup, METRICS},
|
||||||
service::pdu::{gen_event_id_canonical_json, PduBuilder},
|
service::pdu::{gen_event_id_canonical_json, PduBuilder},
|
||||||
services, utils,
|
services,
|
||||||
utils::dbg_truncate_str,
|
utils::{self, dbg_truncate_str, MxcData},
|
||||||
Ar, Error, PduEvent, Ra, Result,
|
Ar, Error, PduEvent, Ra, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -2038,6 +2039,82 @@ pub(crate) async fn claim_keys_route(
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # `GET /_matrix/federation/v1/media/download/{mediaId}`
|
||||||
|
///
|
||||||
|
/// Downloads media owned by a remote homeserver.
|
||||||
|
pub(crate) async fn media_download_route(
|
||||||
|
body: Ar<authenticated_media::get_content::v1::Request>,
|
||||||
|
) -> Result<Ra<authenticated_media::get_content::v1::Response>> {
|
||||||
|
let mxc = MxcData::new(services().globals.server_name(), &body.media_id)?;
|
||||||
|
let Some(crate::service::media::FileMeta {
|
||||||
|
content_disposition,
|
||||||
|
content_type,
|
||||||
|
file,
|
||||||
|
}) = services().media.get(mxc.to_string()).await?
|
||||||
|
else {
|
||||||
|
return Err(Error::BadRequest(
|
||||||
|
ErrorKind::NotYetUploaded,
|
||||||
|
"Media not found",
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
|
let content_disposition = content_disposition.and_then(|s| {
|
||||||
|
s.parse().inspect_err(
|
||||||
|
|error| warn!(%error, "Invalid Content-Disposition in database"),
|
||||||
|
)
|
||||||
|
.ok()
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(Ra(authenticated_media::get_content::v1::Response {
|
||||||
|
metadata: authenticated_media::ContentMetadata {},
|
||||||
|
content: authenticated_media::FileOrLocation::File(
|
||||||
|
authenticated_media::Content {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// # `GET /_matrix/federation/v1/media/thumbnail/{mediaId}`
|
||||||
|
///
|
||||||
|
/// Downloads a thumbnail from a remote homeserver.
|
||||||
|
pub(crate) async fn media_thumbnail_route(
|
||||||
|
body: Ar<authenticated_media::get_content_thumbnail::v1::Request>,
|
||||||
|
) -> Result<Ra<authenticated_media::get_content_thumbnail::v1::Response>> {
|
||||||
|
let mxc = MxcData::new(services().globals.server_name(), &body.media_id)?;
|
||||||
|
let width = body.width.try_into().map_err(|_| {
|
||||||
|
Error::BadRequest(ErrorKind::InvalidParam, "Width is invalid.")
|
||||||
|
})?;
|
||||||
|
let height = body.height.try_into().map_err(|_| {
|
||||||
|
Error::BadRequest(ErrorKind::InvalidParam, "Height is invalid.")
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let Some(crate::service::media::FileMeta {
|
||||||
|
content_type,
|
||||||
|
file,
|
||||||
|
..
|
||||||
|
}) = services().media.get_thumbnail(mxc.to_string(), width, height).await?
|
||||||
|
else {
|
||||||
|
return Err(Error::BadRequest(
|
||||||
|
ErrorKind::NotYetUploaded,
|
||||||
|
"Media not found",
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Ra(authenticated_media::get_content_thumbnail::v1::Response {
|
||||||
|
metadata: authenticated_media::ContentMetadata {},
|
||||||
|
content: authenticated_media::FileOrLocation::File(
|
||||||
|
authenticated_media::Content {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition: None,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::{add_port_to_hostname, get_ip_with_port, FedDest};
|
use super::{add_port_to_hostname, get_ip_with_port, FedDest};
|
||||||
|
|
|
||||||
|
|
@ -501,6 +501,8 @@ fn routes(config: &Config) -> Router {
|
||||||
.ruma_route(s2s::get_profile_information_route)
|
.ruma_route(s2s::get_profile_information_route)
|
||||||
.ruma_route(s2s::get_keys_route)
|
.ruma_route(s2s::get_keys_route)
|
||||||
.ruma_route(s2s::claim_keys_route)
|
.ruma_route(s2s::claim_keys_route)
|
||||||
|
.ruma_route(s2s::media_download_route)
|
||||||
|
.ruma_route(s2s::media_thumbnail_route)
|
||||||
} else {
|
} else {
|
||||||
router
|
router
|
||||||
.route("/_matrix/federation/*path", any(federation_disabled))
|
.route("/_matrix/federation/*path", any(federation_disabled))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue