Compare commits
No commits in common. "164af11b8bdd65d4672f7f34798a517588c42d88" and "bae978d1ec60731e53a1da62676e2ca22ebc6038" have entirely different histories.
164af11b8b
...
bae978d1ec
|
@ -1,9 +0,0 @@
|
||||||
use warp::{Filter, reply::Reply, reject::Rejection};
|
|
||||||
|
|
||||||
use super::state::SharedState;
|
|
||||||
|
|
||||||
mod upload;
|
|
||||||
|
|
||||||
pub fn get_routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
|
||||||
upload::get_routes(state)
|
|
||||||
}
|
|
|
@ -1,123 +0,0 @@
|
||||||
use std::net::IpAddr;
|
|
||||||
|
|
||||||
use warp::{filters::multipart::FormData, reply::{Reply, with_status}, reject::Rejection, Filter};
|
|
||||||
use warp_real_ip::real_ip;
|
|
||||||
|
|
||||||
use crate::{web::{state::SharedState, forms::{FormElement, UploadFormData}, rejection::HttpReject}, files::File};
|
|
||||||
|
|
||||||
pub async fn upload(form: FormData, ip: Option<IpAddr>, state: SharedState) -> Result<Box<dyn Reply>, Rejection> {
|
|
||||||
if ! state.config.files.allow_uploads {
|
|
||||||
return Ok(
|
|
||||||
Box::new(
|
|
||||||
with_status(
|
|
||||||
match state.config.files.upload_disable_reason {
|
|
||||||
Some(reason) => format!("Uploads are disabled for the following reason:\n{reason}"),
|
|
||||||
None => "Uploads are disabled.".into()
|
|
||||||
},
|
|
||||||
warp::http::StatusCode::SERVICE_UNAVAILABLE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = FormElement::from_formdata(form)
|
|
||||||
.await
|
|
||||||
.map_err(|x| HttpReject::WarpError(x))?;
|
|
||||||
|
|
||||||
let formdata = UploadFormData::from_formdata(params, true);
|
|
||||||
if let Some(formdata) = formdata {
|
|
||||||
|
|
||||||
let mut breaks_conf = false;
|
|
||||||
if (!state.config.files.allow_custom_names) && formdata.filename.is_some() {
|
|
||||||
breaks_conf = true;
|
|
||||||
}
|
|
||||||
if (!state.config.files.allow_pass_protection) && formdata.password.is_some() {
|
|
||||||
breaks_conf = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if breaks_conf {
|
|
||||||
return Ok(
|
|
||||||
Box::new(
|
|
||||||
with_status(
|
|
||||||
"Attempt to set name or password when they are disabled".to_string(),
|
|
||||||
warp::http::StatusCode::BAD_REQUEST
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(pass) = state.config.files.upload_pass {
|
|
||||||
let pass_valid: bool;
|
|
||||||
if let Some(upass) = formdata.instancepass {
|
|
||||||
pass_valid = upass == pass;
|
|
||||||
} else {
|
|
||||||
pass_valid = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! pass_valid {
|
|
||||||
return Ok(
|
|
||||||
Box::new(
|
|
||||||
with_status(
|
|
||||||
"Invalid instance password".to_string(),
|
|
||||||
warp::http::StatusCode::BAD_REQUEST
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let file = File::create(
|
|
||||||
formdata.file,
|
|
||||||
formdata.mime,
|
|
||||||
formdata.filename.clone(),
|
|
||||||
state.env.clone(),
|
|
||||||
formdata.delmode,
|
|
||||||
formdata.password,
|
|
||||||
ip
|
|
||||||
).await.map_err(|x| HttpReject::StringError(x.to_string()))?;
|
|
||||||
|
|
||||||
state.file_mgr.save(&file, formdata.lookup_kind).map_err(|x| HttpReject::StringError(x.to_string()))?;
|
|
||||||
|
|
||||||
return Ok(
|
|
||||||
Box::new(
|
|
||||||
format!(
|
|
||||||
concat!(
|
|
||||||
"File uploaded successfully.\n",
|
|
||||||
"It is available via this link:\n\n",
|
|
||||||
|
|
||||||
"{}/upload/{}\n"
|
|
||||||
),
|
|
||||||
state.env.instanceurl,
|
|
||||||
urlencoding::encode(
|
|
||||||
match formdata.filename {
|
|
||||||
Some(name) => name,
|
|
||||||
None => file.hash()
|
|
||||||
}.as_str()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
Ok(
|
|
||||||
Box::new(
|
|
||||||
with_status(
|
|
||||||
"Invalid form".to_string(),
|
|
||||||
warp::http::StatusCode::BAD_REQUEST
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
|
||||||
warp::any()
|
|
||||||
.and(warp::path!("curlapi" / "upload"))
|
|
||||||
.and(warp::multipart::form())
|
|
||||||
.and(real_ip(vec![state.env.proxy_addr]))
|
|
||||||
.and(
|
|
||||||
warp::any()
|
|
||||||
.map(move || state.clone())
|
|
||||||
)
|
|
||||||
.and_then(upload)
|
|
||||||
}
|
|
|
@ -17,7 +17,7 @@ use crate::files::{File, lookup::LookupKind, DeleteMode};
|
||||||
use super::{state::SharedState, pages::{UploadSuccessPage, ErrorPage}, rejection::HttpReject};
|
use super::{state::SharedState, pages::{UploadSuccessPage, ErrorPage}, rejection::HttpReject};
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Clone)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct FormElement {
|
struct FormElement {
|
||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
mime: String
|
mime: String
|
||||||
}
|
}
|
||||||
|
@ -58,15 +58,15 @@ impl FormElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct UploadFormData {
|
struct UploadFormData {
|
||||||
pub filename: Option<String>,
|
filename: Option<String>,
|
||||||
pub password: Option<String>,
|
password: Option<String>,
|
||||||
pub instancepass: Option<String>,
|
instancepass: Option<String>,
|
||||||
pub lookup_kind: LookupKind,
|
lookup_kind: LookupKind,
|
||||||
pub delmode: DeleteMode,
|
delmode: DeleteMode,
|
||||||
pub file: Vec<u8>,
|
file: Vec<u8>,
|
||||||
pub mime: String,
|
mime: String,
|
||||||
pub tos_consent: bool
|
tos_consent: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for UploadFormData {
|
impl Default for UploadFormData {
|
||||||
|
@ -86,7 +86,7 @@ impl Default for UploadFormData {
|
||||||
|
|
||||||
impl UploadFormData {
|
impl UploadFormData {
|
||||||
|
|
||||||
pub fn from_formdata(data: HashMap<String, FormElement>, use_defaults: bool) -> Option<UploadFormData> {
|
pub fn from_formdata(data: HashMap<String, FormElement>) -> Option<UploadFormData> {
|
||||||
let mut out = Self::default();
|
let mut out = Self::default();
|
||||||
|
|
||||||
// Add a name
|
// Add a name
|
||||||
|
@ -125,11 +125,9 @@ impl UploadFormData {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
if ! use_defaults {
|
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
match data.get("instancepass") {
|
match data.get("instancepass") {
|
||||||
Some(val) => {
|
Some(val) => {
|
||||||
|
@ -171,7 +169,7 @@ pub async fn upload(form: FormData, ip: Option<IpAddr>, state: SharedState) -> R
|
||||||
}
|
}
|
||||||
|
|
||||||
let params: HashMap<String, FormElement> = FormElement::from_formdata(form).await.map_err(|x| HttpReject::WarpError(x))?;
|
let params: HashMap<String, FormElement> = FormElement::from_formdata(form).await.map_err(|x| HttpReject::WarpError(x))?;
|
||||||
let formdata = UploadFormData::from_formdata(params.clone(), false);
|
let formdata = UploadFormData::from_formdata(params.clone());
|
||||||
|
|
||||||
if let Some(formdata) = formdata {
|
if let Some(formdata) = formdata {
|
||||||
|
|
||||||
|
|
|
@ -8,18 +8,16 @@ use warp::{Filter, reply::Reply, reject::Rejection};
|
||||||
use crate::{env::Env, files::lookup::FileManager, config::types::Config};
|
use crate::{env::Env, files::lookup::FileManager, config::types::Config};
|
||||||
|
|
||||||
mod pages;
|
mod pages;
|
||||||
pub mod forms;
|
mod forms;
|
||||||
pub mod state;
|
pub mod state;
|
||||||
mod rejection;
|
mod rejection;
|
||||||
mod api;
|
mod api;
|
||||||
mod uploaded;
|
mod uploaded;
|
||||||
mod curlapi;
|
|
||||||
|
|
||||||
use state::SharedState;
|
use state::SharedState;
|
||||||
|
|
||||||
pub fn routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
pub fn routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
||||||
static_dir!("static")
|
static_dir!("static")
|
||||||
.or(curlapi::get_routes(state.clone()))
|
|
||||||
.or(pages::get_routes(state.clone()))
|
.or(pages::get_routes(state.clone()))
|
||||||
.or(forms::get_routes(state.clone()))
|
.or(forms::get_routes(state.clone()))
|
||||||
.or(api::get_routes(state.clone()))
|
.or(api::get_routes(state.clone()))
|
||||||
|
|
Loading…
Reference in New Issue