Parse Matrix media URL for clients

This commit is contained in:
Pierre HUBERT 2025-02-26 21:15:07 +01:00
parent fa4665280d
commit 6adc0c1fbb
8 changed files with 29 additions and 7 deletions

View File

@ -1,7 +1,7 @@
use crate::constants::USER_SESSION_KEY; use crate::constants::USER_SESSION_KEY;
use crate::server::HttpFailure; use crate::server::HttpFailure;
use crate::user::{APIClient, APIClientID, RumaClient, User, UserConfig, UserID}; 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_remote_ip::RemoteIP;
use actix_session::Session; use actix_session::Session;
use actix_web::dev::Payload; use actix_web::dev::Payload;

View File

@ -1,7 +1,7 @@
use crate::extractors::client_auth::APIClientAuth; use crate::extractors::client_auth::APIClientAuth;
use crate::server::HttpResult; use crate::server::HttpResult;
use actix_web::{web, HttpResponse}; use actix_web::{web, HttpResponse};
use ruma::api::client::{ media}; use ruma::api::client::media;
use ruma::OwnedServerName; use ruma::OwnedServerName;
#[derive(serde::Deserialize)] #[derive(serde::Deserialize)]

View File

@ -1,9 +1,10 @@
use crate::extractors::client_auth::APIClientAuth; use crate::extractors::client_auth::APIClientAuth;
use crate::server::HttpResult; use crate::server::HttpResult;
use crate::utils::matrix_utils::parse_mxc_url;
use actix_web::{web, HttpResponse}; use actix_web::{web, HttpResponse};
use ruma::api::client::state; use ruma::api::client::state;
use ruma::events::StateEventType; use ruma::events::StateEventType;
use ruma::OwnedRoomId; use ruma::{OwnedRoomId, OwnedServerName};
#[derive(serde::Deserialize)] #[derive(serde::Deserialize)]
pub struct RoomIDInPath { pub struct RoomIDInPath {
@ -33,6 +34,8 @@ pub async fn name(auth: APIClientAuth, path: web::Path<RoomIDInPath>) -> HttpRes
#[derive(serde::Serialize)] #[derive(serde::Serialize)]
struct GetRoomAvatarResponse { struct GetRoomAvatarResponse {
url: String, url: String,
server_name: OwnedServerName,
media_id: String,
} }
/// Get room avatar /// Get room avatar
@ -46,6 +49,13 @@ pub async fn avatar(auth: APIClientAuth, path: web::Path<RoomIDInPath>) -> HttpR
.await?; .await?;
let avatar_url = res.content.get_field("url")?.unwrap_or("").to_string(); 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(),
}))
} }

View File

@ -3,7 +3,7 @@ use crate::broadcast_messages::BroadcastMessage;
use crate::constants::{STATE_KEY, USER_SESSION_KEY}; use crate::constants::{STATE_KEY, USER_SESSION_KEY};
use crate::server::{HttpFailure, HttpResult}; use crate::server::{HttpFailure, HttpResult};
use crate::user::{APIClient, APIClientID, User, UserConfig, UserID}; use crate::user::{APIClient, APIClientID, User, UserConfig, UserID};
use crate::utils; use crate::utils::base_utils;
use actix_session::Session; use actix_session::Session;
use actix_web::{web, HttpResponse}; use actix_web::{web, HttpResponse};
use askama::Template; use askama::Template;
@ -70,7 +70,7 @@ pub async fn home(
// Get user information, requesting authentication if information is missing // Get user information, requesting authentication if information is missing
let Some(user): Option<User> = session.get(USER_SESSION_KEY)? else { let Some(user): Option<User> = session.get(USER_SESSION_KEY)? else {
// Generate auth state // Generate auth state
let state = utils::rand_str(50); let state = base_utils::rand_str(50);
session.insert(STATE_KEY, &state)?; session.insert(STATE_KEY, &state)?;
let oidc = AppConfig::get().openid_provider(); let oidc = AppConfig::get().openid_provider();

View File

@ -6,7 +6,7 @@ use thiserror::Error;
use crate::app_config::AppConfig; use crate::app_config::AppConfig;
use crate::constants::TOKEN_LEN; 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; type HttpClient = ruma::client::http_client::HyperNativeTls;
pub type RumaClient = ruma::Client<HttpClient>; pub type RumaClient = ruma::Client<HttpClient>;

10
src/utils/matrix_utils.rs Normal file
View File

@ -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()?))
}

2
src/utils/mod.rs Normal file
View File

@ -0,0 +1,2 @@
pub mod base_utils;
pub mod matrix_utils;