2021-08-21 15:58:51 +02:00
|
|
|
use rocket::http::Status;
|
2021-08-21 18:05:16 +02:00
|
|
|
use rocket::request::Request;
|
|
|
|
use rocket::response::{self, Responder, Response};
|
2021-08-21 15:58:51 +02:00
|
|
|
use std::io;
|
|
|
|
|
2021-08-21 18:05:16 +02:00
|
|
|
#[derive(Debug)]
|
2021-08-21 15:58:51 +02:00
|
|
|
pub enum RBError {
|
|
|
|
/// When the login requests an unknown user
|
2021-08-20 23:09:22 +02:00
|
|
|
UnknownUser,
|
2021-08-21 18:05:16 +02:00
|
|
|
BlockedUser,
|
2021-08-21 15:58:51 +02:00
|
|
|
/// Invalid login password.
|
2021-08-20 23:09:22 +02:00
|
|
|
InvalidPassword,
|
2021-08-21 15:58:51 +02:00
|
|
|
/// When a non-admin user tries to use an admin endpoint
|
|
|
|
Unauthorized,
|
|
|
|
/// When an expired JWT token is used for auth.
|
2021-08-21 16:45:41 +02:00
|
|
|
JWTTokenExpired,
|
|
|
|
/// Umbrella error for when something goes wrong whilst creating a JWT token pair
|
2021-08-21 18:05:16 +02:00
|
|
|
JWTCreationError,
|
2021-08-21 21:42:36 +02:00
|
|
|
JWTError,
|
|
|
|
MissingJWTKey,
|
2021-08-21 18:05:16 +02:00
|
|
|
PWSaltError,
|
|
|
|
AdminCreationError,
|
2021-08-21 22:41:38 +02:00
|
|
|
TokenExpired,
|
2021-08-22 10:42:58 +02:00
|
|
|
InvalidRefreshToken,
|
|
|
|
DuplicateRefreshToken,
|
|
|
|
DBError,
|
2021-08-20 23:09:22 +02:00
|
|
|
}
|
2021-08-21 15:58:51 +02:00
|
|
|
|
|
|
|
impl<'r> Responder<'r, 'static> for RBError {
|
|
|
|
fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {
|
|
|
|
let (status, message): (Status, &str) = match self {
|
2021-08-21 16:45:41 +02:00
|
|
|
RBError::UnknownUser => (Status::NotFound, "Unknown user"),
|
2021-08-21 18:05:16 +02:00
|
|
|
RBError::BlockedUser => (Status::Unauthorized, "This user is blocked"),
|
2021-08-21 16:45:41 +02:00
|
|
|
RBError::InvalidPassword => (Status::Unauthorized, "Invalid password"),
|
|
|
|
RBError::Unauthorized => (Status::Unauthorized, "Unauthorized"),
|
|
|
|
RBError::JWTTokenExpired => (Status::Unauthorized, "Token expired"),
|
2021-08-21 21:42:36 +02:00
|
|
|
RBError::JWTCreationError | RBError::MissingJWTKey => {
|
|
|
|
(Status::InternalServerError, "Failed to create tokens.")
|
|
|
|
}
|
2021-08-22 10:42:58 +02:00
|
|
|
RBError::InvalidRefreshToken | RBError::DuplicateRefreshToken => (Status::Unauthorized, "Invalid refresh token."),
|
2021-08-21 21:42:36 +02:00
|
|
|
_ => (Status::InternalServerError, "Internal server error"),
|
2021-08-21 15:58:51 +02:00
|
|
|
};
|
|
|
|
|
2021-08-21 16:45:41 +02:00
|
|
|
let mut res = Response::new();
|
2021-08-21 15:58:51 +02:00
|
|
|
res.set_status(status);
|
|
|
|
res.set_sized_body(message.len(), io::Cursor::new(message));
|
|
|
|
|
|
|
|
Ok(res)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub type Result<T> = std::result::Result<T, RBError>;
|