summaryrefslogtreecommitdiffstats
path: root/src/admin
diff options
context:
space:
mode:
Diffstat (limited to 'src/admin')
-rw-r--r--src/admin/user_creation.rs42
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(())
+ }
+}