From 2ae652d150c451ec921eb08821a3f8d158297433 Mon Sep 17 00:00:00 2001 From: Curly Bryce Date: Wed, 3 Jul 2024 16:01:18 -0600 Subject: delete users --- README.md | 8 ++++++++ src/db.rs | 21 +++++++++++++++++++++ src/main.rs | 20 +++++++++++++++----- src/uid.rs | 4 ++++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 778c185..41c8fde 100644 --- a/README.md +++ b/README.md @@ -59,5 +59,13 @@ - Response - 200 Ok - JSON `["SESSION_KEY":"CLIENT_ID"]` + - 401 Unauthorized + - JSON `"Not Authenticated"` +- POST `/user/delete` + - Request + - JSON `{"id": "ID", "session": "SESSION_KEY"}` + - Response + - 200 Ok + - JSON `"Deleted"` - 401 Unauthorized - JSON `"Not Authenticated"` \ No newline at end of file diff --git a/src/db.rs b/src/db.rs index a609fe5..28b1ec7 100644 --- a/src/db.rs +++ b/src/db.rs @@ -281,4 +281,25 @@ impl DB { let _ = self.save().await; r } + + pub async fn delete_user(&mut self, id: &String, session: &String) -> Result { + match UID::from(id.clone()) { + Ok(n) => { + self.users = self.users.clone().into_iter().filter(|u| !u.authenticate(session) && n != u.id).collect(); + self.uid_generator.delete_uid(n); + }, + Err(n) => return Err(n) + }; + + // Validate + let r = match self.get_user(id).await { + Ok(_) => Err("Could not delete".into()), + Err(_) => { + Ok("Deleted".into()) + }, + }; + + let _ = self.save().await; + r + } } diff --git a/src/main.rs b/src/main.rs index 22c096d..c48ceda 100644 --- a/src/main.rs +++ b/src/main.rs @@ -130,12 +130,12 @@ async fn login(data: Json, db: &State>) -> (Status, Json, db: &State>) -> (Status, Result<(), Json>) { let mut db = db.lock().await; - match db.logout(&data.id, &data.sessionhash).await { + match db.logout(&data.id, &data.session).await { Ok(_) => (Status::Ok, Ok(())), Err(n) => (Status::Unauthorized, Err(n.into())), } @@ -143,7 +143,7 @@ async fn logout(data: Json, db: &State>) -> (Status, Resul #[post("/logout/all", data="", format="json")] async fn logout_all(data: Json, db: &State>) -> (Status, Result, Json>) { let mut db = db.lock().await; - match db.logout_all(&data.id, &data.sessionhash).await { + match db.logout_all(&data.id, &data.session).await { Ok(n) => (Status::Ok, Ok(n.into())), Err(n) => (Status::Unauthorized, Err(n.into())), } @@ -151,7 +151,16 @@ async fn logout_all(data: Json, db: &State>) -> (Status, R #[post("/sessions", data="", format="json")] async fn get_sessions(data: Json, db: &State>) -> (Status, Result>, Json>) { let db = db.lock().await; - match db.get_sessions(&data.id, &data.sessionhash).await { + match db.get_sessions(&data.id, &data.session).await { + Ok(n) => (Status::Ok, Ok(n.into())), + Err(n) => (Status::Unauthorized, Err(n.into())), + } +} + +#[post("/delete", data="", format="json")] +async fn delete(data: Json, db: &State>) -> (Status, Result, Json>) { + let mut db = db.lock().await; + match db.delete_user(&data.id, &data.session).await { Ok(n) => (Status::Ok, Ok(n.into())), Err(n) => (Status::Unauthorized, Err(n.into())), } @@ -161,5 +170,6 @@ async fn get_sessions(data: Json, db: &State>) -> (Status, fn rocket() -> _ { rocket::build().manage(Mutex::new(DB::load(Config::new()))) .mount("/", routes![index]) - .mount("/user", routes![login, get_users_by_name, get_user, new_user, get_all_users, logout, logout_all, get_sessions]) + .mount("/user", routes![login, get_users_by_name, get_user, new_user, get_all_users, logout, logout_all, get_sessions, delete]) + .mount("/transfer", routes![]) } \ No newline at end of file diff --git a/src/uid.rs b/src/uid.rs index fed0af0..886b9c8 100644 --- a/src/uid.rs +++ b/src/uid.rs @@ -51,6 +51,10 @@ impl Generator { } } + pub fn delete_uid(&mut self, u: UID) { + self.used_uids = self.used_uids.clone().into_iter().filter(|old| old != &u).collect(); + } + pub fn new_uid(&mut self) -> Result { let mut count = 0; loop { -- cgit v1.2.3