You've already forked AstralRinth
forked from didirus/AstralRinth
Initial shared instances backend (#3800)
* Create base shared instance migration and initial routes * Fix build * Add version uploads * Add permissions field for shared instance users * Actually use permissions field * Add "public" flag to shared instances that allow GETing them without authorization * Add the ability to get and list shared instance versions * Add the ability to delete shared instance versions * Fix build after merge * Secured file hosting (#3784) * Remove Backblaze-specific file-hosting backend * Added S3_USES_PATH_STYLE_BUCKETS * Remove unused file_id parameter from delete_file_version * Add support for separate public and private buckets in labrinth::file_hosting * Rename delete_file_version to delete_file * Add (untested) get_url_for_private_file * Remove url field from shared instance routes * Remove url field from shared instance routes * Use private bucket for shared instance versions * Make S3 environment variables fully separate between public and private buckets * Change file host expiry for shared instances to 180 seconds * Fix lint * Merge shared instance migrations into a single migration * Replace shared instance owners with Ghost instead of deleting the instance
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
use super::{DeleteFileData, FileHost, FileHostingError, UploadFileData};
|
||||
use super::{
|
||||
DeleteFileData, FileHost, FileHostPublicity, FileHostingError,
|
||||
UploadFileData,
|
||||
};
|
||||
use async_trait::async_trait;
|
||||
use bytes::Bytes;
|
||||
use chrono::Utc;
|
||||
use hex::ToHex;
|
||||
use sha2::Digest;
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct MockHost(());
|
||||
@@ -20,11 +24,10 @@ impl FileHost for MockHost {
|
||||
&self,
|
||||
content_type: &str,
|
||||
file_name: &str,
|
||||
file_publicity: FileHostPublicity,
|
||||
file_bytes: Bytes,
|
||||
) -> Result<UploadFileData, FileHostingError> {
|
||||
let path =
|
||||
std::path::Path::new(&dotenvy::var("MOCK_FILE_PATH").unwrap())
|
||||
.join(file_name.replace("../", ""));
|
||||
let path = get_file_path(file_name, file_publicity);
|
||||
std::fs::create_dir_all(
|
||||
path.parent().ok_or(FileHostingError::InvalidFilename)?,
|
||||
)?;
|
||||
@@ -33,8 +36,8 @@ impl FileHost for MockHost {
|
||||
|
||||
std::fs::write(path, &*file_bytes)?;
|
||||
Ok(UploadFileData {
|
||||
file_id: String::from("MOCK_FILE_ID"),
|
||||
file_name: file_name.to_string(),
|
||||
file_publicity,
|
||||
content_length: file_bytes.len() as u32,
|
||||
content_sha512,
|
||||
content_sha1,
|
||||
@@ -44,20 +47,40 @@ impl FileHost for MockHost {
|
||||
})
|
||||
}
|
||||
|
||||
async fn delete_file_version(
|
||||
async fn get_url_for_private_file(
|
||||
&self,
|
||||
file_id: &str,
|
||||
file_name: &str,
|
||||
_expiry_secs: u32,
|
||||
) -> Result<String, FileHostingError> {
|
||||
let cdn_url = dotenvy::var("CDN_URL").unwrap();
|
||||
Ok(format!("{cdn_url}/private/{file_name}"))
|
||||
}
|
||||
|
||||
async fn delete_file(
|
||||
&self,
|
||||
file_name: &str,
|
||||
file_publicity: FileHostPublicity,
|
||||
) -> Result<DeleteFileData, FileHostingError> {
|
||||
let path =
|
||||
std::path::Path::new(&dotenvy::var("MOCK_FILE_PATH").unwrap())
|
||||
.join(file_name.replace("../", ""));
|
||||
let path = get_file_path(file_name, file_publicity);
|
||||
if path.exists() {
|
||||
std::fs::remove_file(path)?;
|
||||
}
|
||||
Ok(DeleteFileData {
|
||||
file_id: file_id.to_string(),
|
||||
file_name: file_name.to_string(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn get_file_path(
|
||||
file_name: &str,
|
||||
file_publicity: FileHostPublicity,
|
||||
) -> PathBuf {
|
||||
let mut path = PathBuf::from(dotenvy::var("MOCK_FILE_PATH").unwrap());
|
||||
|
||||
if matches!(file_publicity, FileHostPublicity::Private) {
|
||||
path.push("private");
|
||||
}
|
||||
path.push(file_name.replace("../", ""));
|
||||
|
||||
path
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user