diff --git a/filed/src/files/mod.rs b/filed/src/files/mod.rs index c150f80..694167b 100644 --- a/filed/src/files/mod.rs +++ b/filed/src/files/mod.rs @@ -18,10 +18,21 @@ pub struct File { pub name: Option, pub mime: String, pub delete_at: DateTime, + pub delete_mode: DeleteMode, sha512: String } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum DeleteMode { + Time, + TimeOrDownload +} + impl File { + pub fn expired(self: &Self) -> bool { + self.delete_at < chrono::Local::now() + } + pub fn comp_hash(self: &Self, other: &Sha512) -> bool { let mut hash = other.clone(); hex::encode(hash.finalize_fixed()) == self.sha512 @@ -63,7 +74,7 @@ impl File { Ok(ndata) } - pub async fn create(data: Vec, mime: String, name: Option, env: Env) -> Result> { + pub async fn create(data: Vec, mime: String, name: Option, env: Env, delete_mode: DeleteMode) -> Result> { let mut filename = String::new(); let mut hash = Sha512::new(); @@ -90,6 +101,7 @@ impl File { name: Some(filename), mime, delete_at: expires, + delete_mode, sha512: hash } ) diff --git a/filed/src/web/forms.rs b/filed/src/web/forms.rs index df1cac3..0294b5d 100644 --- a/filed/src/web/forms.rs +++ b/filed/src/web/forms.rs @@ -11,7 +11,7 @@ use futures_util::TryStreamExt; use bytes::BufMut; use serde::Serialize; -use crate::files::{File, lookup::LookupKind}; +use crate::files::{File, lookup::LookupKind, DeleteMode}; use super::{state::SharedState, pages::{BadActionReq, UploadSuccessPage}, rejection::HttpReject}; @@ -64,10 +64,15 @@ pub async fn upload(form: FormData, state: SharedState) -> Result } let data = params.get("file").unwrap(); - let _delmode = params.get("delmode").unwrap(); + let delmode = params.get("delmode").unwrap(); let named = params.get("named"); let filename = params.get("filename").unwrap(); let mut is_named = named.is_none(); + + let delmode = delmode.as_str_or_reject()?; + if delmode != "30" && delmode != "dl" { + return Err(warp::reject::custom(HttpReject::StringError("delmode is neither 30 or dl!".into()))); + } if named.is_some() { is_named = named.unwrap().as_str_or_reject()? == "on"; @@ -87,7 +92,14 @@ pub async fn upload(form: FormData, state: SharedState) -> Result }, None => None }, - state.env.clone() + state.env.clone(), + { + if delmode == "30" { + DeleteMode::Time + } else { + DeleteMode::TimeOrDownload + } + } ).await .map_err(|err| warp::reject::custom(HttpReject::StringError(err.to_string())))?;