1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-04-22 14:10:16 +03:00

feat(media): save user id of uploader

This commit is contained in:
Matthias Ahouansou 2025-03-29 13:20:55 +00:00
parent 1b00d19c0f
commit 69aa435f61
No known key found for this signature in database
5 changed files with 37 additions and 4 deletions
src
api/client_server
database
service/media

View file

@ -71,6 +71,7 @@ pub async fn create_content_route(
filename.as_deref(),
content_type.as_deref(),
&file,
body.sender_user.as_deref(),
)
.await?;
@ -148,6 +149,7 @@ pub async fn get_remote_content(
.and_then(|cd| cd.filename.as_deref()),
content_response.content_type.as_deref(),
&content_response.file,
None,
)
.await?;

View file

@ -1,4 +1,4 @@
use ruma::{api::client::error::ErrorKind, ServerName};
use ruma::{api::client::error::ErrorKind, ServerName, UserId};
use sha2::digest::Output;
use sha2::Sha256;
@ -13,6 +13,7 @@ impl service::media::Data for KeyValueDatabase {
media_id: &str,
filename: Option<&str>,
content_type: Option<&str>,
user_id: Option<&UserId>,
) -> Result<()> {
let now = utils::secs_since_unix_epoch().to_be_bytes();
@ -44,7 +45,27 @@ impl service::media::Data for KeyValueDatabase {
key.push(0xff);
key.extend_from_slice(media_id.as_bytes());
self.filehash_servername_mediaid.insert(&key, &[])
self.filehash_servername_mediaid.insert(&key, &[])?;
if let Some(user_id) = user_id {
let mut key = servername.as_bytes().to_vec();
key.push(0xff);
key.extend_from_slice(user_id.localpart().as_bytes());
key.push(0xff);
key.extend_from_slice(media_id.as_bytes());
self.servername_userlocalpart_mediaid.insert(&key, &[])?;
let mut key = servername.as_bytes().to_vec();
key.push(0xff);
key.extend_from_slice(media_id.as_bytes());
key.push(0xff);
key.extend_from_slice(user_id.as_bytes());
self.servername_mediaid_userlocalpart.insert(&key, &[])?;
}
Ok(())
}
fn search_file_metadata(

View file

@ -158,6 +158,8 @@ pub struct KeyValueDatabase {
pub(super) servernamemediaid_metadata: Arc<dyn KvTree>, // Servername + MediaID -> content sha256 + Filename + ContentType + extra 0xff byte if media is allowed on unauthenticated endpoints
pub(super) filehash_servername_mediaid: Arc<dyn KvTree>, // sha256 of content + Servername + MediaID, used to delete dangling references to filehashes from servernamemediaid
pub(super) filehash_metadata: Arc<dyn KvTree>, // sha256 of content -> file size + creation time + last access time
pub(super) servername_userlocalpart_mediaid: Arc<dyn KvTree>, // Servername + User Localpart + MediaID
pub(super) servername_mediaid_userlocalpart: Arc<dyn KvTree>, // Servername + MediaID + User Localpart, used to remove keys from above when files are deleted by unrelated means
pub(super) thumbnailid_metadata: Arc<dyn KvTree>, // ThumbnailId = Servername + MediaID + width + height -> Filename + ContentType + extra 0xff byte if media is allowed on unauthenticated endpoints
pub(super) filehash_thumbnailid: Arc<dyn KvTree>, // sha256 of content + "ThumbnailId", as defined above. Used to dangling references to filehashes from thumbnailIds
//pub key_backups: key_backups::KeyBackups,
@ -368,6 +370,10 @@ impl KeyValueDatabase {
servernamemediaid_metadata: builder.open_tree("servernamemediaid_metadata")?,
filehash_servername_mediaid: builder.open_tree("filehash_servername_mediaid")?,
filehash_metadata: builder.open_tree("filehash_metadata")?,
servername_userlocalpart_mediaid: builder
.open_tree("servername_userlocalpart_mediaid")?,
servername_mediaid_userlocalpart: builder
.open_tree("servername_mediaid_userlocalpart")?,
thumbnailid_metadata: builder.open_tree("thumbnailid_metadata")?,
filehash_thumbnailid: builder.open_tree("filehash_thumbnailid")?,
backupid_algorithm: builder.open_tree("backupid_algorithm")?,

View file

@ -1,9 +1,10 @@
use ruma::ServerName;
use ruma::{ServerName, UserId};
use sha2::{digest::Output, Sha256};
use crate::Result;
pub trait Data: Send + Sync {
#[allow(clippy::too_many_arguments)]
fn create_file_metadata(
&self,
sha256_digest: Output<Sha256>,
@ -12,6 +13,7 @@ pub trait Data: Send + Sync {
media_id: &str,
filename: Option<&str>,
content_type: Option<&str>,
user_id: Option<&UserId>,
) -> Result<()>;
/// Returns the sha256 hash, filename, content_type and whether the media should be accessible via

View file

@ -5,7 +5,7 @@ pub use data::Data;
use ruma::{
api::client::{error::ErrorKind, media::is_safe_inline_content_type},
http_headers::{ContentDisposition, ContentDispositionType},
ServerName,
ServerName, UserId,
};
use sha2::{digest::Output, Digest, Sha256};
@ -36,6 +36,7 @@ impl Service {
filename: Option<&str>,
content_type: Option<&str>,
file: &[u8],
user_id: Option<&UserId>,
) -> Result<()> {
let (sha256_digest, sha256_hex) = generate_digests(file);
@ -46,6 +47,7 @@ impl Service {
media_id,
filename,
content_type,
user_id,
)?;
create_file(&sha256_hex, file).await