diff --git a/Cargo.lock b/Cargo.lock index 51a4811..3c7a366 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,6 +46,29 @@ dependencies = [ "smallvec", ] +[[package]] +name = "actix-files" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d832782fac6ca7369a70c9ee9a20554623c5e51c76e190ad151780ebea1cf689" +dependencies = [ + "actix-http", + "actix-service", + "actix-utils", + "actix-web", + "askama_escape", + "bitflags", + "bytes", + "derive_more", + "futures-core", + "http-range", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", +] + [[package]] name = "actix-http" version = "3.3.1" @@ -405,6 +428,12 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + [[package]] name = "async-trait" version = "0.1.66" @@ -1298,6 +1327,12 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.8.0" @@ -2529,6 +2564,7 @@ version = "0.1.0" dependencies = [ "actix-auth-middleware", "actix-cors", + "actix-files", "actix-http", "actix-identity", "actix-rt", diff --git a/Cargo.toml b/Cargo.toml index 6f55fff..c8e7adf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ actix-session = { version = "0.6.1", features = ["cookie-session"]} actix-http = "3.0.4" actix-rt = "2" actix-cors = "0.6.1" +actix-files = "0.6.0" actix-service = "2.0.0" #actix = "0.12" actix-web-codegen-const-routes = { version = "0.1.0", tag = "0.1.0", git = "https://github.com/realaravinth/actix-web-codegen-const-routes" } diff --git a/config/default.toml b/config/default.toml index 493d211..4fe75cd 100644 --- a/config/default.toml +++ b/config/default.toml @@ -34,8 +34,8 @@ password = "password" name = "postgres" pool = 4 -[archive] -base_path = "/tmp/mcaptcha-survey" +[publish] +dir = "/tmp/mcaptcha-survey" [footer] about = "https://mcapthca.org/about" diff --git a/src/main.rs b/src/main.rs index 6822b59..39f2b92 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ use std::env; use std::sync::Arc; +use actix_files::Files; use actix_identity::{CookieIdentityPolicy, IdentityService}; use actix_session::{storage::CookieSessionStore, SessionMiddleware}; use actix_web::{ @@ -106,6 +107,7 @@ async fn main() -> std::io::Result<()> { actix_middleware::TrailingSlash::Trim, )) .configure(services) + .service(Files::new("/download", &settings.publish.dir).show_files_listing()) .app_data(data.clone()) }) .bind(ip) diff --git a/src/settings.rs b/src/settings.rs index 306fe80..9976e24 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -85,21 +85,20 @@ pub struct Footer { pub thanks: Url, } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Archive { - pub base_path: String, +pub struct Publish { + pub dir: String, } -impl Archive { - fn create_archive_base_path(&self) { - let base_path = Path::new(&self.base_path); - if base_path.exists() { - if !base_path.is_dir() { - fs::remove_file(&base_path).unwrap(); - fs::create_dir_all(&base_path).unwrap(); +impl Publish { + fn create_root_dir(&self) { + let root = Path::new(&self.dir); + if root.exists() { + if !root.is_dir() { + std::fs::remove_file(&root).unwrap(); + std::fs::create_dir_all(&root).unwrap(); } } else { - fs::create_dir_all(&base_path).unwrap(); + std::fs::create_dir_all(&root).unwrap(); } } } @@ -114,7 +113,7 @@ pub struct Settings { pub support_email: String, pub default_campaign: String, pub footer: Footer, - pub archive: Archive, + pub publish: Publish, } #[cfg(not(tarpaulin_include))] @@ -166,7 +165,7 @@ impl Settings { match s.try_into::() { Ok(val) => { - val.archive.create_archive_base_path(); + val.publish.create_root_dir(); Ok(val) }, Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))), diff --git a/src/tests.rs b/src/tests.rs index b5aa11b..ae6920e 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -44,7 +44,7 @@ use crate::V1_API_ROUTES; pub async fn get_test_data() -> Arc { let mut settings = Settings::new().unwrap(); let tmp_dir = Temp::new_dir().unwrap(); - settings.archive.base_path = tmp_dir.join("base_path").to_str().unwrap().into(); + settings.publish.dir = tmp_dir.join("base_path").to_str().unwrap().into(); settings.allow_registration = true; Data::new(settings).await } @@ -126,6 +126,7 @@ macro_rules! get_app { .wrap(actix_web::middleware::NormalizePath::new( actix_web::middleware::TrailingSlash::Trim, )) + .service(Files::new("/download", &$settings.publish.dir).show_files_listing()) .configure($crate::services) };