Added command to add master password
This commit is contained in:
parent
e8fc43f9ad
commit
3f8adb96f9
101
.vscode/launch.json
vendored
Normal file
101
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'pass_manager'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=pass_manager",
|
||||||
|
"--package=pass_manager"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "pass_manager",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'pass_manager'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=pass_manager",
|
||||||
|
"--package=pass_manager"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "pass_manager",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in library 'migration'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--lib",
|
||||||
|
"--package=migration"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "migration",
|
||||||
|
"kind": "lib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'migration'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=migration",
|
||||||
|
"--package=migration"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "migration",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'migration'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=migration",
|
||||||
|
"--package=migration"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "migration",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,12 +1,16 @@
|
|||||||
pub use sea_orm_migration::prelude::*;
|
pub use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
mod m20220101_000001_create_table;
|
mod m20220101_000001_create_table;
|
||||||
|
mod m20230427_142510_change_password_hash_size;
|
||||||
|
|
||||||
pub struct Migrator;
|
pub struct Migrator;
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl MigratorTrait for Migrator {
|
impl MigratorTrait for Migrator {
|
||||||
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
vec![Box::new(m20220101_000001_create_table::Migration)]
|
vec![
|
||||||
|
Box::new(m20220101_000001_create_table::Migration),
|
||||||
|
Box::new(m20230427_142510_change_password_hash_size::Migration),
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
44
migration/src/m20230427_142510_change_password_hash_size.rs
Normal file
44
migration/src/m20230427_142510_change_password_hash_size.rs
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
#[derive(DeriveMigrationName)]
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum MasterPass {
|
||||||
|
Table,
|
||||||
|
#[iden = "password_hash"]
|
||||||
|
PasswordHash,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.alter_table(
|
||||||
|
sea_query::Table::alter()
|
||||||
|
.table(MasterPass::Table)
|
||||||
|
.modify_column(
|
||||||
|
ColumnDef::new(MasterPass::PasswordHash)
|
||||||
|
.binary_len(64)
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.alter_table(
|
||||||
|
sea_query::Table::alter()
|
||||||
|
.table(MasterPass::Table)
|
||||||
|
.modify_column(
|
||||||
|
ColumnDef::new(MasterPass::PasswordHash)
|
||||||
|
.binary_len(128)
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
@ -11,7 +11,7 @@ pub struct Model {
|
|||||||
pub user_id: u64,
|
pub user_id: u64,
|
||||||
#[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")]
|
#[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")]
|
||||||
pub salt: Vec<u8>,
|
pub salt: Vec<u8>,
|
||||||
#[sea_orm(column_type = "Binary(BlobSize::Blob(Some(128)))")]
|
#[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")]
|
||||||
pub password_hash: Vec<u8>,
|
pub password_hash: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,9 +28,9 @@ impl ActiveModel {
|
|||||||
Params::RECOMMENDED_LOG_N,
|
Params::RECOMMENDED_LOG_N,
|
||||||
Params::RECOMMENDED_R,
|
Params::RECOMMENDED_R,
|
||||||
Params::RECOMMENDED_P,
|
Params::RECOMMENDED_P,
|
||||||
128,
|
64,
|
||||||
)?;
|
)?;
|
||||||
let mut password_hash = vec![0; 128];
|
let mut password_hash = vec![0; 64];
|
||||||
scrypt(password.as_ref(), &salt, ¶ms, &mut password_hash)?;
|
scrypt(password.as_ref(), &salt, ¶ms, &mut password_hash)?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
user_id: Set(user_id),
|
user_id: Set(user_id),
|
||||||
|
@ -11,6 +11,7 @@ mod default;
|
|||||||
mod get_account;
|
mod get_account;
|
||||||
mod get_accounts;
|
mod get_accounts;
|
||||||
mod help;
|
mod help;
|
||||||
|
mod set_master_pass;
|
||||||
|
|
||||||
#[derive(BotCommands, Clone)]
|
#[derive(BotCommands, Clone)]
|
||||||
#[command(rename_rule = "snake_case")]
|
#[command(rename_rule = "snake_case")]
|
||||||
@ -23,6 +24,8 @@ enum Command {
|
|||||||
GetAccount(String, String),
|
GetAccount(String, String),
|
||||||
#[command()]
|
#[command()]
|
||||||
GetAccounts,
|
GetAccounts,
|
||||||
|
#[command()]
|
||||||
|
SetMasterPass(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_dispatcher(
|
pub fn get_dispatcher(
|
||||||
@ -46,6 +49,10 @@ pub fn get_dispatcher(
|
|||||||
)
|
)
|
||||||
.branch(
|
.branch(
|
||||||
dptree::case![Command::GetAccounts].endpoint(get_accounts::get_accounts),
|
dptree::case![Command::GetAccounts].endpoint(get_accounts::get_accounts),
|
||||||
|
)
|
||||||
|
.branch(
|
||||||
|
dptree::case![Command::SetMasterPass(param)]
|
||||||
|
.endpoint(set_master_pass::set_master_pass),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.branch(dptree::endpoint(default::default)),
|
.branch(dptree::endpoint(default::default)),
|
||||||
|
32
src/handlers/set_master_pass.rs
Normal file
32
src/handlers/set_master_pass.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use crate::entity::{master_pass, prelude::*};
|
||||||
|
use sea_orm::{prelude::*, QuerySelect};
|
||||||
|
use teloxide::{adaptors::Throttle, prelude::*};
|
||||||
|
use tokio::task;
|
||||||
|
|
||||||
|
pub async fn set_master_pass(
|
||||||
|
bot: Throttle<Bot>,
|
||||||
|
msg: Message,
|
||||||
|
db: DatabaseConnection,
|
||||||
|
master_pass: String,
|
||||||
|
) -> crate::Result<()> {
|
||||||
|
let user_id = msg.from().unwrap().id.0;
|
||||||
|
println!("User id: {user_id}");
|
||||||
|
let exists = MasterPass::find()
|
||||||
|
.filter(master_pass::Column::UserId.eq(user_id))
|
||||||
|
.limit(1)
|
||||||
|
.one(&db)
|
||||||
|
.await?
|
||||||
|
.is_some();
|
||||||
|
if exists {
|
||||||
|
bot.send_message(msg.chat.id, "Master password already exists")
|
||||||
|
.await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let model = task::spawn_blocking(move || {
|
||||||
|
master_pass::ActiveModel::from_unencrypted(user_id, &master_pass)
|
||||||
|
})
|
||||||
|
.await??;
|
||||||
|
model.insert(&db).await?;
|
||||||
|
bot.send_message(msg.chat.id, "Success").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user