diff --git a/src/extractors/client_auth.rs b/src/extractors/client_auth.rs index d7e4748..a7a4a5b 100644 --- a/src/extractors/client_auth.rs +++ b/src/extractors/client_auth.rs @@ -1,7 +1,7 @@ use crate::constants::USER_SESSION_KEY; use crate::server::HttpFailure; use crate::user::{APIClient, APIClientID, RumaClient, User, UserConfig, UserID}; -use crate::utils::curr_time; +use crate::utils::base_utils::curr_time; use actix_remote_ip::RemoteIP; use actix_session::Session; use actix_web::dev::Payload; diff --git a/src/server/api/media.rs b/src/server/api/media.rs index 9da0e6c..1b3b7fe 100644 --- a/src/server/api/media.rs +++ b/src/server/api/media.rs @@ -1,7 +1,7 @@ use crate::extractors::client_auth::APIClientAuth; use crate::server::HttpResult; use actix_web::{web, HttpResponse}; -use ruma::api::client::{ media}; +use ruma::api::client::media; use ruma::OwnedServerName; #[derive(serde::Deserialize)] diff --git a/src/server/api/room.rs b/src/server/api/room.rs index 4e1a91c..587f6c0 100644 --- a/src/server/api/room.rs +++ b/src/server/api/room.rs @@ -1,9 +1,10 @@ use crate::extractors::client_auth::APIClientAuth; use crate::server::HttpResult; +use crate::utils::matrix_utils::parse_mxc_url; use actix_web::{web, HttpResponse}; use ruma::api::client::state; use ruma::events::StateEventType; -use ruma::OwnedRoomId; +use ruma::{OwnedRoomId, OwnedServerName}; #[derive(serde::Deserialize)] pub struct RoomIDInPath { @@ -33,6 +34,8 @@ pub async fn name(auth: APIClientAuth, path: web::Path) -> HttpRes #[derive(serde::Serialize)] struct GetRoomAvatarResponse { url: String, + server_name: OwnedServerName, + media_id: String, } /// Get room avatar @@ -46,6 +49,13 @@ pub async fn avatar(auth: APIClientAuth, path: web::Path) -> HttpR .await?; let avatar_url = res.content.get_field("url")?.unwrap_or("").to_string(); + let Some((media_id, server_name)) = parse_mxc_url(&avatar_url) else { + return Ok(HttpResponse::InternalServerError().body("Invalid Matrix resource URL")); + }; - Ok(HttpResponse::Ok().json(GetRoomAvatarResponse { url: avatar_url })) + Ok(HttpResponse::Ok().json(GetRoomAvatarResponse { + url: avatar_url.to_string(), + server_name, + media_id: media_id.to_string(), + })) } diff --git a/src/server/web_ui.rs b/src/server/web_ui.rs index 566f3fb..4693334 100644 --- a/src/server/web_ui.rs +++ b/src/server/web_ui.rs @@ -3,7 +3,7 @@ use crate::broadcast_messages::BroadcastMessage; use crate::constants::{STATE_KEY, USER_SESSION_KEY}; use crate::server::{HttpFailure, HttpResult}; use crate::user::{APIClient, APIClientID, User, UserConfig, UserID}; -use crate::utils; +use crate::utils::base_utils; use actix_session::Session; use actix_web::{web, HttpResponse}; use askama::Template; @@ -70,7 +70,7 @@ pub async fn home( // Get user information, requesting authentication if information is missing let Some(user): Option = session.get(USER_SESSION_KEY)? else { // Generate auth state - let state = utils::rand_str(50); + let state = base_utils::rand_str(50); session.insert(STATE_KEY, &state)?; let oidc = AppConfig::get().openid_provider(); diff --git a/src/user.rs b/src/user.rs index 9a061f4..129fac5 100644 --- a/src/user.rs +++ b/src/user.rs @@ -6,7 +6,7 @@ use thiserror::Error; use crate::app_config::AppConfig; use crate::constants::TOKEN_LEN; -use crate::utils::{curr_time, format_time, rand_str}; +use crate::utils::base_utils::{curr_time, format_time, rand_str}; type HttpClient = ruma::client::http_client::HyperNativeTls; pub type RumaClient = ruma::Client; diff --git a/src/utils.rs b/src/utils/base_utils.rs similarity index 100% rename from src/utils.rs rename to src/utils/base_utils.rs diff --git a/src/utils/matrix_utils.rs b/src/utils/matrix_utils.rs new file mode 100644 index 0000000..74da455 --- /dev/null +++ b/src/utils/matrix_utils.rs @@ -0,0 +1,10 @@ +use ruma::OwnedServerName; +use std::str::FromStr; + +/// Parse Matrix media URL returning media id and server name +pub fn parse_mxc_url(url: &str) -> Option<(&str, OwnedServerName)> { + let strip = url.strip_prefix("mxc://")?; + let parts = strip.split_once('/')?; + + Some((parts.0, OwnedServerName::from_str(parts.1).ok()?)) +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000..a45b810 --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1,2 @@ +pub mod base_utils; +pub mod matrix_utils;