Add CLI command for password reset

This commit is contained in:
silverpill 2022-11-10 23:54:01 +00:00
parent 8ad88f84b2
commit 9b96ce4700
4 changed files with 47 additions and 3 deletions

View file

@ -25,6 +25,7 @@ async fn main() {
match subcmd {
SubCommand::GenerateInviteCode(cmd) => cmd.execute(db_client).await.unwrap(),
SubCommand::ListInviteCodes(cmd) => cmd.execute(db_client).await.unwrap(),
SubCommand::SetPassword(cmd) => cmd.execute(db_client).await.unwrap(),
SubCommand::RefetchActor(cmd) => cmd.execute(&config, db_client).await.unwrap(),
SubCommand::DeleteProfile(cmd) => cmd.execute(&config, db_client).await.unwrap(),
SubCommand::DeletePost(cmd) => cmd.execute(&config, db_client).await.unwrap(),

View file

@ -25,9 +25,14 @@ use crate::models::users::queries::{
create_invite_code,
get_invite_codes,
get_user_by_id,
set_user_password,
};
use crate::monero::wallet::create_monero_wallet;
use crate::utils::crypto::{generate_private_key, serialize_private_key};
use crate::utils::crypto::{
hash_password,
generate_private_key,
serialize_private_key,
};
use crate::utils::files::remove_files;
/// Admin CLI tool
@ -44,6 +49,7 @@ pub enum SubCommand {
GenerateInviteCode(GenerateInviteCode),
ListInviteCodes(ListInviteCodes),
SetPassword(SetPassword),
RefetchActor(RefetchActor),
DeleteProfile(DeleteProfile),
DeletePost(DeletePost),
@ -118,6 +124,25 @@ impl ListInviteCodes {
}
}
/// Set password
#[derive(Parser)]
pub struct SetPassword {
id: Uuid,
password: String,
}
impl SetPassword {
pub async fn execute(
&self,
db_client: &impl GenericClient,
) -> Result<(), Error> {
let password_hash = hash_password(&self.password)?;
set_user_password(db_client, &self.id, password_hash).await?;
println!("password updated");
Ok(())
}
}
/// Re-fetch actor profile by actor ID
#[derive(Parser)]
pub struct RefetchActor {

View file

@ -780,7 +780,7 @@ pub async fn update_reaction_count(
).await?;
if updated_count == 0 {
return Err(DatabaseError::NotFound("post"));
}
};
Ok(())
}
@ -799,7 +799,7 @@ pub async fn update_repost_count(
).await?;
if updated_count == 0 {
return Err(DatabaseError::NotFound("post"));
}
};
Ok(())
}

View file

@ -111,6 +111,24 @@ pub async fn create_user(
Ok(user)
}
pub async fn set_user_password(
db_client: &impl GenericClient,
user_id: &Uuid,
password_hash: String,
) -> Result<(), DatabaseError> {
let updated_count = db_client.execute(
"
UPDATE user_account SET password_hash = $1
WHERE id = $2
",
&[&password_hash, &user_id],
).await?;
if updated_count == 0 {
return Err(DatabaseError::NotFound("user"));
};
Ok(())
}
pub async fn get_user_by_id(
db_client: &impl GenericClient,
user_id: &Uuid,