From 64a5435dc3e9a6e1d0ec8a83002fb954d8102b98 Mon Sep 17 00:00:00 2001 From: StNicolay Date: Tue, 25 Jul 2023 17:44:12 +0300 Subject: [PATCH] Added new callback types --- Cargo.lock | 107 ++++++++++++++++---------------- Cargo.toml | 15 ++++- cryptography/Cargo.toml | 5 +- src/callbacks/delete_message.rs | 13 +--- src/callbacks/mod.rs | 75 +++++++++++++++++++++- src/errors.rs | 10 +++ src/main.rs | 9 ++- src/markups.rs | 4 ++ 8 files changed, 168 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d21629..6a40b5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "aquamarine" @@ -135,18 +135,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -571,9 +571,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" @@ -730,7 +730,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -1076,9 +1076,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" @@ -1263,9 +1263,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", "libm", @@ -1379,10 +1379,12 @@ version = "0.1.0" dependencies = [ "anyhow", "arrayvec", + "base64", "cryptography", "dotenv", "entity", "futures", + "hex", "itertools 0.11.0", "log", "migration", @@ -1392,6 +1394,7 @@ dependencies = [ "sea-orm", "serde", "serde_json", + "sha2", "teloxide", "thiserror", "tokio", @@ -1411,9 +1414,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -1457,7 +1460,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -1556,9 +1559,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1585,9 +1588,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.29" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -1910,15 +1913,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "salsa20" @@ -1931,9 +1934,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" @@ -2109,35 +2112,35 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.171" +version = "1.0.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -2363,9 +2366,9 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2396,9 +2399,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.25" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -2504,22 +2507,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -2601,7 +2604,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -2686,7 +2689,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", ] [[package]] @@ -2748,9 +2751,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2803,9 +2806,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom", "serde", @@ -2859,7 +2862,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", "wasm-bindgen-shared", ] @@ -2893,7 +2896,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index 596aae1..8f95905 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,20 +14,31 @@ members = [".", "migration", "entity", "cryptography"] [dependencies] anyhow = "1" arrayvec = "0.7" +base64 = "0.21" cryptography = { version = "0.1", path = "cryptography" } dotenv = "0.15" entity = { version = "0.1", path = "entity" } futures = "0.3" +hex = "0.4" itertools = "0.11" log = "0.4" migration = { version = "0.2", path = "migration" } parking_lot = "0.12" pretty_env_logger = "0.5" rustc-hash = "1" -sea-orm = { version = "0.11", features = ["sqlx-mysql", "runtime-tokio-rustls"] } +sea-orm = { version = "0.11", features = [ + "sqlx-mysql", + "runtime-tokio-rustls", +] } serde = "1" serde_json = "1" -teloxide = { version = "0.12", features = ["macros", "ctrlc_handler", "rustls", "throttle"], default-features = false } +sha2 = "0.10" +teloxide = { version = "0.12", features = [ + "macros", + "ctrlc_handler", + "rustls", + "throttle", +], default-features = false } thiserror = "1" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } trim-in-place = "0.1" diff --git a/cryptography/Cargo.toml b/cryptography/Cargo.toml index 3fa5ea1..0d916f3 100644 --- a/cryptography/Cargo.toml +++ b/cryptography/Cargo.toml @@ -12,7 +12,10 @@ pbkdf2 = "0.12.1" thiserror = "1.0.40" entity = { version = "0.1.0", path = "../entity" } chacha20poly1305 = { version = "0.10.1", features = ["std"] } -rand = { version = "0.8.5", default-features = false, features = ["std_rng", "std"] } +rand = { version = "0.8.5", default-features = false, features = [ + "std_rng", + "std", +] } sea-orm = "0.11.3" bitflags = "2.3.1" arrayvec = "0.7.2" diff --git a/src/callbacks/delete_message.rs b/src/callbacks/delete_message.rs index 2577873..04a337d 100644 --- a/src/callbacks/delete_message.rs +++ b/src/callbacks/delete_message.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use teloxide::{dispatching::DpHandlerDescription, dptree::Handler}; /// Deletes the message from the callback -async fn run(bot: Throttle, q: CallbackQuery) -> crate::Result<()> { +pub async fn delete_message(bot: Throttle, q: CallbackQuery) -> crate::Result<()> { if let Some(msg) = q.message { if bot.delete_message(msg.chat.id, msg.id).await.is_err() { bot.send_message(msg.chat.id, "Error deleting the message") @@ -13,14 +13,3 @@ async fn run(bot: Throttle, q: CallbackQuery) -> crate::Result<()> { bot.answer_callback_query(q.id).await?; Ok(()) } - -/// Filters the delete_message callbacks -fn filter(q: CallbackQuery) -> bool { - matches!(q.data.as_deref(), Some("delete_message")) -} - -/// Gets a handler for deleting the message -#[inline] -pub fn get_handler() -> Handler<'static, DependencyMap, crate::Result<()>, DpHandlerDescription> { - dptree::filter(filter).endpoint(run) -} diff --git a/src/callbacks/mod.rs b/src/callbacks/mod.rs index ec58fab..935acb4 100644 --- a/src/callbacks/mod.rs +++ b/src/callbacks/mod.rs @@ -1,3 +1,76 @@ //! This module consists of endpoints to handle callbacks -pub mod delete_message; +mod delete_message; + +pub use delete_message::delete_message; + +use crate::errors::InvalidCommand; +use base64::{engine::general_purpose::STANDARD_NO_PAD as B64_ENGINE, Engine as _}; +use std::str::FromStr; +use teloxide::types::{CallbackQuery, Message}; + +type NameHash = [u8; 32]; + +#[derive(Clone, Copy)] +pub enum AlterableField { + Name, + Login, + Pass, +} + +#[derive(Clone, Copy)] +pub enum CallbackCommand { + DeleteMessage, + Get(NameHash), + GetMenu, + GetAccounts, + Decrypt(NameHash), + Hide(NameHash), + Alter(NameHash, AlterableField), + DeleteAccount(NameHash), +} + +impl CallbackCommand { + pub fn from_query(q: CallbackQuery) -> Option { + q.message.as_ref()?; + q.data.and_then(|text| text.parse().ok()) + } +} + +impl FromStr for CallbackCommand { + type Err = crate::errors::InvalidCommand; + + fn from_str(s: &str) -> Result { + use AlterableField::*; + use CallbackCommand::*; + + match s { + "delete_message" => return Ok(DeleteMessage), + "get_menu" => return Ok(GetMenu), + "get_accounts" => return Ok(GetAccounts), + _ => (), + }; + + let mut substrings = s.split(' '); + let (command, name) = match (substrings.next(), substrings.next(), substrings.next()) { + (Some(command), Some(name), None) => (command, name), + _ => return Err(InvalidCommand::InvalidParams), + }; + + let mut name_arr = [0; 32]; + if B64_ENGINE.decode_slice(name, &mut name_arr)? != 32 { + return Err(InvalidCommand::OutputTooShort); + }; + + match command { + "get" => Ok(Get(name_arr)), + "decrypt" => Ok(Decrypt(name_arr)), + "hide" => Ok(Hide(name_arr)), + "an" => Ok(Alter(name_arr, Name)), + "al" => Ok(Alter(name_arr, Login)), + "ap" => Ok(Alter(name_arr, Pass)), + "delete" => Ok(DeleteAccount(name_arr)), + _ => Err(InvalidCommand::InvalidParams), + } + } +} diff --git a/src/errors.rs b/src/errors.rs index 20cb2af..d4c0f99 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -5,3 +5,13 @@ pub struct NoUserInfo; #[derive(thiserror::Error, Debug)] #[error("Handler was already used")] pub struct HandlerUsed; + +#[derive(thiserror::Error, Debug)] +pub enum InvalidCommand { + #[error("Invalid params")] + InvalidParams, + #[error("Not enough bytes in the name's hash")] + OutputTooShort, + #[error("Error decoding the values: {0}")] + NameDecodingError(#[from] base64::DecodeSliceError), +} diff --git a/src/main.rs b/src/main.rs index 2634122..fb3b1c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![allow(unused)] + mod callbacks; mod commands; mod default; @@ -18,6 +20,8 @@ use sea_orm::Database; use std::env; use teloxide::{adaptors::throttle::Limits, dispatching::dialogue::InMemStorage, filter_command}; +use crate::callbacks::CallbackCommand; + fn get_dispatcher( token: String, db: DatabaseConnection, @@ -55,8 +59,9 @@ fn get_dispatcher( .branch(command_handler) .endpoint(default::default); - let callback_handler = - Update::filter_callback_query().chain(callbacks::delete_message::get_handler()); + let callback_handler = Update::filter_callback_query() + .filter_map(CallbackCommand::from_query) + .branch(case![CallbackCommand::DeleteMessage].endpoint(callbacks::delete_message)); let handler = dptree::entry() .branch(message_handler) diff --git a/src/markups.rs b/src/markups.rs index bcd2a65..048e60c 100644 --- a/src/markups.rs +++ b/src/markups.rs @@ -1,4 +1,8 @@ use crate::prelude::*; +use base64::{engine::general_purpose::STANDARD as B64_ENGINE, Engine as _}; +use futures::future; +use itertools::Itertools; +use sha2::{Digest, Sha256}; use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, KeyboardMarkup}; /// Creates a markup of all user's account names