diff options
Diffstat (limited to 'src/admin')
| -rw-r--r-- | src/admin/user_creation.rs | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/src/admin/user_creation.rs b/src/admin/user_creation.rs index 563b660..d54b063 100644 --- a/src/admin/user_creation.rs +++ b/src/admin/user_creation.rs @@ -4,15 +4,15 @@ use diesel::MysqlConnection; use diesel::{ dsl::sql, types::{Bigint, Unsigned}, - RunQueryDsl, + ExpressionMethods, QueryDsl, RunQueryDsl, }; use crate::error::ServiceError; -use crate::model::{DbExecutor, NewPassword, NewUser}; -use crate::schema::passwords::dsl::passwords; -use crate::schema::users::dsl::users; +use crate::model::{DbExecutor, NewPassword, NewUser, User}; +use crate::schema::passwords::{columns as password_columns, dsl::passwords}; +use crate::schema::users::{columns as user_columns, dsl::users}; -static LAST_ID_SQL: &'static str = "SELECT LAST_INSERT_ID()"; +static LAST_ID_SQL: &str = "SELECT LAST_INSERT_ID()"; pub struct PassHashExecutor(pub Hasher<'static>); @@ -74,7 +74,7 @@ impl Handler<SaveUserRequest> for DbExecutor { let id = sql::<Unsigned<Bigint>>(LAST_ID_SQL).get_result(conn)?; let new_pass = NewPassword { - id: id, + id, hash: &msg.pass_hash, }; @@ -85,3 +85,33 @@ impl Handler<SaveUserRequest> for DbExecutor { Ok(()) } } + +pub struct ChangePasswordRequest(pub String, pub String); + +impl Message for ChangePasswordRequest { + type Result = Result<(), ServiceError>; +} + +impl Handler<ChangePasswordRequest> for DbExecutor { + type Result = Result<(), ServiceError>; + + fn handle(&mut self, req: ChangePasswordRequest, _: &mut Self::Context) -> Self::Result { + let conn: &MysqlConnection = &self.0.get().unwrap(); + let (name, hash) = (req.0, req.1); + + let user = users + .filter(user_columns::name.eq(name)) + .first::<User>(conn) + .map_err(|_| ServiceError::NotFound)?; + + if user.power_level == 9001 { + return Err(ServiceError::Unauthorized); + } + + diesel::update(passwords.filter(password_columns::id.eq(user.id))) + .set(password_columns::hash.eq(hash)) + .execute(conn)?; + + Ok(()) + } +} |
