commit 68e5d95d251ded79a019f681a2a6c1665aef751b
parent cccd8262fa78dabc8e1949c4dcb490b99fb0cd84
Author: Carl Dong <accounts@carldong.me>
Date: Sat, 8 May 2021 22:28:08 -0400
admin: Specifically return 404 for user not found
- Modify err_code to accept an expr for err_code
- Add get_user_or_404, properly returning 404 instead of a generic 400
for cases where user is not found
- Use get_user_or_404 where appropriate.
Diffstat:
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/src/api/admin.rs b/src/api/admin.rs
@@ -4,7 +4,7 @@ use serde_json::Value;
use std::{env, time::Duration};
use rocket::{
- http::{Cookie, Cookies, SameSite},
+ http::{Cookie, Cookies, SameSite, Status},
request::{self, FlashMessage, Form, FromRequest, Outcome, Request},
response::{content::Html, Flash, Redirect},
Route,
@@ -279,6 +279,14 @@ struct InviteData {
email: String,
}
+fn get_user_or_404(uuid: &str, conn: &DbConn) -> ApiResult<User> {
+ if let Some(user) = User::find_by_uuid(uuid, conn) {
+ Ok(user)
+ } else {
+ err_code!("User doesn't exist", Status::NotFound.code);
+ }
+}
+
#[post("/invite", data = "<data>")]
fn invite_user(data: Json<InviteData>, _token: AdminToken, conn: DbConn) -> JsonResult {
let data: InviteData = data.into_inner();
@@ -352,20 +360,20 @@ fn users_overview(_token: AdminToken, conn: DbConn) -> ApiResult<Html<String>> {
#[get("/users/<uuid>")]
fn get_user_json(uuid: String, _token: AdminToken, conn: DbConn) -> JsonResult {
- let user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let user = get_user_or_404(&uuid, &conn)?;
Ok(Json(user.to_json(&conn)))
}
#[post("/users/<uuid>/delete")]
fn delete_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
- let user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let user = get_user_or_404(&uuid, &conn)?;
user.delete(&conn)
}
#[post("/users/<uuid>/deauth")]
fn deauth_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
- let mut user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let mut user = get_user_or_404(&uuid, &conn)?;
Device::delete_all_by_user(&user.uuid, &conn)?;
user.reset_security_stamp();
@@ -374,7 +382,7 @@ fn deauth_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
#[post("/users/<uuid>/disable")]
fn disable_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
- let mut user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let mut user = get_user_or_404(&uuid, &conn)?;
Device::delete_all_by_user(&user.uuid, &conn)?;
user.reset_security_stamp();
user.enabled = false;
@@ -384,7 +392,7 @@ fn disable_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
#[post("/users/<uuid>/enable")]
fn enable_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
- let mut user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let mut user = get_user_or_404(&uuid, &conn)?;
user.enabled = true;
user.save(&conn)
@@ -392,7 +400,7 @@ fn enable_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
#[post("/users/<uuid>/remove-2fa")]
fn remove_2fa(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
- let mut user = User::find_by_uuid(&uuid, &conn).map_res("User doesn't exist")?;
+ let mut user = get_user_or_404(&uuid, &conn)?;
TwoFactor::delete_all_by_user(&user.uuid, &conn)?;
user.totp_recover = None;
user.save(&conn)
diff --git a/src/error.rs b/src/error.rs
@@ -217,11 +217,11 @@ macro_rules! err {
#[macro_export]
macro_rules! err_code {
- ($msg:expr, $err_code: literal) => {{
+ ($msg:expr, $err_code: expr) => {{
error!("{}", $msg);
return Err(crate::error::Error::new($msg, $msg).with_code($err_code));
}};
- ($usr_msg:expr, $log_value:expr, $err_code: literal) => {{
+ ($usr_msg:expr, $log_value:expr, $err_code: expr) => {{
error!("{}. {}", $usr_msg, $log_value);
return Err(crate::error::Error::new($usr_msg, $log_value).with_code($err_code));
}};