This commit is contained in:
EvilMuffinHa 2022-03-02 11:01:46 -05:00
parent 294348a72e
commit 34e080e598
4 changed files with 133 additions and 26 deletions

View File

@ -31,6 +31,11 @@ struct DirPath {
name: String,
}
#[derive(FromForm)]
struct DirName {
name: String
}
#[derive(Debug, FromForm, Deserialize)]
struct GenericUser {
key: String,
@ -46,9 +51,11 @@ impl<'a, 'r> FromRequest<'a, 'r> for GenericUser {
Some(key) => {
if key.value() == ADMIN_KEY.as_str() || key.value() == USER_KEY.as_str() {
request::Outcome::Success(GenericUser { key: String::from(key.value()) })
} else if *PUBLIC_READ {
request::Outcome::Success(GenericUser { key: String::from("") })
} else {
request::Outcome::Failure((Status::BadRequest, ()))
}
}
},
None => {
if *PUBLIC_READ {
@ -70,10 +77,10 @@ impl<'a, 'r> FromRequest<'a, 'r> for AdminUser {
if key.value() == ADMIN_KEY.as_str() {
request::Outcome::Success(AdminUser)
} else {
request::Outcome::Failure((Status::BadRequest, ()))
request::Outcome::Forward(())
}
},
None => request::Outcome::Failure((Status::BadRequest, ()))
None => request::Outcome::Forward(())
}
}
}
@ -86,7 +93,6 @@ fn root() -> Template {
#[post("/login", data = "<form>")]
fn login(form: Form<GenericUser>, mut cookies: Cookies) -> Redirect {
println!("{:?}", form);
let key = form.into_inner().key;
let mut cook = Cookie::new("key", key);
cook.set_http_only(true);
@ -95,26 +101,60 @@ fn login(form: Form<GenericUser>, mut cookies: Cookies) -> Redirect {
Redirect::to("/serve")
}
#[get("/logout")]
fn logout(mut cookies: Cookies) -> Redirect {
match cookies.get("key") {
Some(_) => {
cookies.remove(Cookie::named("key"));
Redirect::to("/")
}
None => {
Redirect::to("/")
}
}
}
#[get("/serve")]
fn get_root(_guard: GenericUser) -> Template {
fn get_root(_guard: AdminUser) -> Template {
let path = DIR.as_path().to_str().unwrap_or("");
Template::render("dir", directory_structure(path.to_string()))
}
#[get("/serve", rank = 2)]
fn get_root_generic(_guard: GenericUser) -> Template {
let path = DIR.as_path().to_str().unwrap_or("");
Template::render("generic", directory_structure(path.to_string()))
}
#[get("/serve/<path..>")]
fn get_dir_entry(path: PathBuf, _guard: GenericUser) -> Template {
fn get_dir_entry(path: PathBuf, _guard: AdminUser) -> Template {
let dir = DIR.as_path().join(path);
let path = dir.to_str().unwrap_or("");
Template::render("dir", directory_structure(path.to_string()))
}
#[post("/dir/<path..>")]
fn create_dir(path: PathBuf, _guard: AdminUser) {
#[get("/serve/<path..>", rank = 2)]
fn get_dir_entry_generic(path: PathBuf, _guard: GenericUser) -> Template {
let dir = DIR.as_path().join(path);
fs::create_dir_all(dir).unwrap();
let path = dir.to_str().unwrap_or("");
Template::render("generic", directory_structure(path.to_string()))
}
#[post("/del/<path..>")]
#[post("/dir/<path..>", data = "<form>")]
fn create_dir(path: PathBuf, form: Form<DirName>, _guard: AdminUser) -> Redirect {
let dir = DIR.as_path().join(path.clone()).join(form.into_inner().name);
fs::create_dir_all(dir).unwrap();
Redirect::to(uri!(get_dir_entry: path))
}
#[post("/dir", data = "<form>")]
fn create_dir_root(form: Form<DirName>, _guard: AdminUser) -> Redirect {
let dir = DIR.as_path().join(form.into_inner().name);
fs::create_dir_all(dir).unwrap();
Redirect::to(uri!(get_root))
}
#[get("/del/<path..>")]
fn delete(path: PathBuf, _guard: AdminUser) -> Redirect {
let dir = DIR.as_path().join(path.clone());
if dir.is_file() {
@ -209,5 +249,9 @@ fn upload_root(_content_type: &ContentType, data:MultipartDatas, _guard: AdminUs
fn main() {
rocket::ignite()
.attach(Template::fairing())
.mount("/", routes![root, login, get_root, get_dir_entry, create_dir, file_get, upload_root, upload_file, delete]).launch();
.mount("/", routes![
root, login, logout,
get_root, get_root_generic, get_dir_entry, get_dir_entry_generic,
create_dir, create_dir_root, file_get,
upload_root, upload_file, delete]).launch();
}

View File

@ -9,12 +9,19 @@
<div class="bg-light border rounded-3 p-2">
<div class="d-grid gap-2">
<form action="/upload/{{current.0.path}}" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="upload"/>
<input type="submit" value="Upload"/>
<input type="file" id="file" name="upload" onchange="this.form.submit()" hidden/>
</form>
<a type="button" class="btn btn-outline-secondary text-start col-sm-1" href="/serve/{{parent.0.path}}" role="button">
..
</a>
<div class="d-flex flex-row">
<a type="button" class="btn btn-outline-primary text-start col-sm-1 ms-1 me-1" href="/serve/{{parent.0.path}}" role="button">
..
</a>
<a type="button" class="btn btn-outline-secondary text-start col-sm-1 ms-1 me-1" href="/logout" role="button">
Logout
</a>
<button class="btn btn-outline-success text-start col-sm-1 ms-1 me-1" onclick="document.getElementById('file').click()">
<i class="bi bi-file-earmark-plus"></i>
</button>
</div>
{{#each ctx}}
<div class="d-flex flex-row">
{{#if is_file}}
@ -28,15 +35,24 @@
{{name}}
</a>
{{/if}}
<form action="/del/{{path}}" method="post">
<button class="btn btn-outline-danger text-start ms-1 me-1">
<i class="bi bi-trash"></i>
</button>
</form>
<a type="button" class="btn btn-outline-danger text-start ms-1 me-1" href="/del/{{path}}" role="button">
<i class="bi bi-trash"></i>
</a>
</div>
{{/each}}
<div class="d-flex flex-row">
<form class='form-inline' action="/dir/{{current.0.path}}" method="post" id = "create-form">
<div class="input-group mb-3 flex-nowrap">
<input type="text" class="form-control" id="name" name="name" placeholder = "Create Folder"/>
</div>
</form>
</div>
</div>
</div>
</div>
<script>
document.getElementById("name").addEventListener("keyup", function (event) { if (event.keyCode == 13) { document.getElementById("create-form").submit(); }});
</script>
</body>
</html>

View File

@ -0,0 +1,38 @@
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css">
</head>
<body>
<div class="vstack gap-3">
<div class="bg-light border rounded-3 p-2">
<div class="d-grid gap-2">
<div class="d-flex flex-row">
<a type="button" class="btn btn-outline-secondary text-start col-sm-1 ms-1 me-1" href="/serve/{{parent.0.path}}" role="button">
..
</a>
<a type="button" class="btn btn-outline-secondary text-start col-sm-1 ms-1 me-1" href="/logout" role="button">
Logout
</a>
</div>
{{#each ctx}}
<div class="d-flex flex-row">
{{#if is_file}}
<a type="button" class="btn btn-outline-secondary text-start col-sm-3" href="/file/{{path}}" role="button">
<i class="bi bi-file-earmark"></i>
{{name}}
</a>
{{else}}
<a type="button" class="btn btn-outline-secondary text-start col-sm-3" href="/serve/{{path}}" role="button">
<i class="bi bi-folder-fill"></i>
{{name}}
</a>
{{/if}}
</div>
{{/each}}
</div>
</div>
</div>
</body>
</html>

View File

@ -4,13 +4,22 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css">
</head>
<body>
<form action="/login" method="post">
<div class="form-outline mb-4">
<input type="text", id="key", name="key" class="form-control form-control-lg" placeholder="Enter Key"/>
<input type="submit" value="Login"/>
<div class="vstack gap-3">
<div class="bg-light border rounded-3 p-2">
<div class="d-grid gap-2 col-sm-6">
<form class='form-inline' action="/login" method="post" id = "login-form" enctype="application/x-ww-form-urlencoded">
<div class="input-group mb-3 flex-nowrap col-sm-6">
<input type="password" class="form-control" id="key" name="key" placeholder = "Enter Key"/>
</div>
</form>
</div>
</div>
</form>
</div>
<script>
document.getElementById("login").addEventListener("keyup", function (event) { if (event.keyCode == 13) { document.getElementById("login-form").submit(); }});
</script>
</body>
</html>