diff --git a/.sqlx/query-06b0592a51c20f754e0c4d9ac2e6c266b47fb9ca86ff37657fe17538b3fb21c6.json b/.sqlx/query-06b0592a51c20f754e0c4d9ac2e6c266b47fb9ca86ff37657fe17538b3fb21c6.json new file mode 100644 index 0000000..9209e3d --- /dev/null +++ b/.sqlx/query-06b0592a51c20f754e0c4d9ac2e6c266b47fb9ca86ff37657fe17538b3fb21c6.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "INSERT INTO account VALUES (?, ?, ?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 5 + }, + "nullable": [] + }, + "hash": "06b0592a51c20f754e0c4d9ac2e6c266b47fb9ca86ff37657fe17538b3fb21c6" +} diff --git a/.sqlx/query-1fc824ca1ca447a990c3e68ee4f2a15b8e5bc260641057d914bb7ff871b51aa3.json b/.sqlx/query-1fc824ca1ca447a990c3e68ee4f2a15b8e5bc260641057d914bb7ff871b51aa3.json new file mode 100644 index 0000000..a741c4b --- /dev/null +++ b/.sqlx/query-1fc824ca1ca447a990c3e68ee4f2a15b8e5bc260641057d914bb7ff871b51aa3.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "INSERT INTO master_pass VALUES (?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "1fc824ca1ca447a990c3e68ee4f2a15b8e5bc260641057d914bb7ff871b51aa3" +} diff --git a/.sqlx/query-20f824c521c2261a9e6c85a8972d83ccdffc2fa110ad152356d6392eb7d84326.json b/.sqlx/query-20f824c521c2261a9e6c85a8972d83ccdffc2fa110ad152356d6392eb7d84326.json new file mode 100644 index 0000000..ad370c1 --- /dev/null +++ b/.sqlx/query-20f824c521c2261a9e6c85a8972d83ccdffc2fa110ad152356d6392eb7d84326.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "UPDATE account SET enc_password = ? WHERE user_id = ? AND name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "20f824c521c2261a9e6c85a8972d83ccdffc2fa110ad152356d6392eb7d84326" +} diff --git a/.sqlx/query-5d0690b7fff7d8b3d8d76631360a2b749d401d5722c1a08186da379cdea35cb9.json b/.sqlx/query-5d0690b7fff7d8b3d8d76631360a2b749d401d5722c1a08186da379cdea35cb9.json new file mode 100644 index 0000000..fd285b3 --- /dev/null +++ b/.sqlx/query-5d0690b7fff7d8b3d8d76631360a2b749d401d5722c1a08186da379cdea35cb9.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "UPDATE account SET enc_login = ? WHERE user_id = ? AND name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "5d0690b7fff7d8b3d8d76631360a2b749d401d5722c1a08186da379cdea35cb9" +} diff --git a/.sqlx/query-65cf7d5bfa7f322b3294755fcf3678807d31104ef8431f1842cfa05494af1bfd.json b/.sqlx/query-65cf7d5bfa7f322b3294755fcf3678807d31104ef8431f1842cfa05494af1bfd.json new file mode 100644 index 0000000..91ff4bf --- /dev/null +++ b/.sqlx/query-65cf7d5bfa7f322b3294755fcf3678807d31104ef8431f1842cfa05494af1bfd.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "DELETE FROM account WHERE user_id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "65cf7d5bfa7f322b3294755fcf3678807d31104ef8431f1842cfa05494af1bfd" +} diff --git a/.sqlx/query-d24ba49dfa1ba9dc0c3534fe543c8feb3557f8e2bfee2fac0dc37ede2562acfd.json b/.sqlx/query-d24ba49dfa1ba9dc0c3534fe543c8feb3557f8e2bfee2fac0dc37ede2562acfd.json new file mode 100644 index 0000000..6a790ee --- /dev/null +++ b/.sqlx/query-d24ba49dfa1ba9dc0c3534fe543c8feb3557f8e2bfee2fac0dc37ede2562acfd.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "DELETE FROM account WHERE user_id = ? AND name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 2 + }, + "nullable": [] + }, + "hash": "d24ba49dfa1ba9dc0c3534fe543c8feb3557f8e2bfee2fac0dc37ede2562acfd" +} diff --git a/.sqlx/query-d2b33865cf969bb28341212d7dcac28a2f5832b90cfd7ed6a061e4fe203205a7.json b/.sqlx/query-d2b33865cf969bb28341212d7dcac28a2f5832b90cfd7ed6a061e4fe203205a7.json new file mode 100644 index 0000000..73b74ce --- /dev/null +++ b/.sqlx/query-d2b33865cf969bb28341212d7dcac28a2f5832b90cfd7ed6a061e4fe203205a7.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "DELETE FROM master_pass WHERE user_id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "d2b33865cf969bb28341212d7dcac28a2f5832b90cfd7ed6a061e4fe203205a7" +} diff --git a/.sqlx/query-f9f6cbb6958f2d35d4ba57e9db9b9d7fc9d67c8bbf9d60fd7e55bebd7188cd84.json b/.sqlx/query-f9f6cbb6958f2d35d4ba57e9db9b9d7fc9d67c8bbf9d60fd7e55bebd7188cd84.json new file mode 100644 index 0000000..d449e22 --- /dev/null +++ b/.sqlx/query-f9f6cbb6958f2d35d4ba57e9db9b9d7fc9d67c8bbf9d60fd7e55bebd7188cd84.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "UPDATE account SET name = ? WHERE user_id = ? AND name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "f9f6cbb6958f2d35d4ba57e9db9b9d7fc9d67c8bbf9d60fd7e55bebd7188cd84" +} diff --git a/Cargo.lock b/Cargo.lock index 3dc0e3a..569a1a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,17 +27,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "ahash" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.6" @@ -60,33 +49,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "allocator-api2" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.75" @@ -112,39 +80,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "async-trait" -version = "0.1.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "atoi" version = "2.0.0" @@ -154,6 +89,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-write-file" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c232177ba50b16fe7a4588495bd474a62a9e45a8e4ca6fd7d0b7ac29d164631e" +dependencies = [ + "nix", + "rand", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -187,17 +132,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bigdecimal" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -213,18 +147,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -234,58 +156,12 @@ dependencies = [ "generic-array", ] -[[package]] -name = "borsh" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.39", - "syn_derive", -] - [[package]] name = "bumpalo" version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" -[[package]] -name = "bytecheck" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -313,12 +189,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chacha20" version = "0.9.1" @@ -349,11 +219,7 @@ version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ - "android-tzdata", - "iana-time-zone", "num-traits", - "serde", - "windows-targets", ] [[package]] @@ -461,7 +327,6 @@ dependencies = [ "pbkdf2", "rand", "scrypt", - "sea-orm", "serde", "sha2", "subtle", @@ -514,27 +379,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive_more" version = "0.99.17" @@ -598,7 +442,7 @@ name = "entity" version = "0.1.0" dependencies = [ "futures", - "sea-orm", + "sqlx", ] [[package]] @@ -688,19 +532,13 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "futures" version = "0.3.29" @@ -824,9 +662,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" @@ -847,22 +685,13 @@ dependencies = [ "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.7", -] - [[package]] name = "hashbrown" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ - "ahash 0.8.6", + "ahash", "allocator-api2", ] @@ -872,7 +701,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.2", + "hashbrown", ] [[package]] @@ -1001,29 +830,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "iana-time-zone" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1032,9 +838,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1047,18 +853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", -] - -[[package]] -name = "inherent" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", + "hashbrown", ] [[package]] @@ -1152,9 +947,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libsqlite3-sys" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -1183,15 +978,6 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "md-5" version = "0.10.6" @@ -1209,10 +995,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] -name = "migration" -version = "0.2.0" +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ - "sea-orm-migration", + "autocfg", ] [[package]] @@ -1263,6 +1051,19 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "nom" version = "7.1.3" @@ -1273,17 +1074,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1363,39 +1153,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "ordered-float" -version = "3.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ouroboros" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -1423,7 +1180,7 @@ dependencies = [ name = "pass_manager" version = "0.1.0" dependencies = [ - "ahash 0.8.6", + "ahash", "anyhow", "arrayvec", "base64", @@ -1434,13 +1191,12 @@ dependencies = [ "hex", "itertools 0.12.0", "log", - "migration", "parking_lot", "pretty_env_logger", - "sea-orm", "serde", "serde_json", "sha2", + "sqlx", "teloxide", "thiserror", "tokio", @@ -1485,9 +1241,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" @@ -1559,12 +1315,6 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1581,15 +1331,6 @@ dependencies = [ "log", ] -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1623,26 +1364,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" version = "1.0.33" @@ -1652,12 +1373,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "rand" version = "0.8.5" @@ -1714,17 +1429,8 @@ checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1735,30 +1441,15 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "rend" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" -dependencies = [ - "bytecheck", -] - [[package]] name = "reqwest" version = "0.11.22" @@ -1798,7 +1489,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.25.2", + "webpki-roots", "winreg", ] @@ -1816,39 +1507,11 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "rkyv" -version = "0.7.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" -dependencies = [ - "bitvec", - "bytecheck", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rsa" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" +checksum = "6a3211b01eea83d80687da9eef70e39d65144a3894866a5153a2723e425a157f" dependencies = [ "const-oid", "digest", @@ -1864,22 +1527,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rust_decimal" -version = "1.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand", - "rkyv", - "serde", - "serde_json", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1897,9 +1544,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.24" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ "bitflags 2.4.1", "errno", @@ -1982,151 +1629,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "sea-bae" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "sea-orm" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44681cfb3fb28be7cd0b170a819e83938e47eb846007c94ca1350b987ee48e0b" -dependencies = [ - "async-stream", - "async-trait", - "bigdecimal", - "chrono", - "futures", - "log", - "ouroboros", - "rust_decimal", - "sea-orm-macros", - "sea-query", - "sea-query-binder", - "serde", - "serde_json", - "sqlx", - "strum", - "thiserror", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sea-orm-macros" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816183a751bf9c22087679b20b6142da0b5c6d8981835ebb7b99bf1bf924640a" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "sea-bae", - "syn 2.0.39", - "unicode-ident", -] - -[[package]] -name = "sea-orm-migration" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d45937e5d4869a0dcf0222bb264df564c077cbe9b312265f3717401d023a633" -dependencies = [ - "async-trait", - "futures", - "sea-orm", - "sea-schema", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sea-query" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3e6bba153bb198646c8762c48414942a38db27d142e44735a133cabddcc820" -dependencies = [ - "bigdecimal", - "chrono", - "derivative", - "inherent", - "ordered-float", - "rust_decimal", - "sea-query-derive", - "serde_json", - "time", - "uuid", -] - -[[package]] -name = "sea-query-binder" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" -dependencies = [ - "bigdecimal", - "chrono", - "rust_decimal", - "sea-query", - "serde_json", - "sqlx", - "time", - "uuid", -] - -[[package]] -name = "sea-query-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.39", - "thiserror", -] - -[[package]] -name = "sea-schema" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd9561232bd1b82ea748b581f15909d11de0db6563ddcf28c5d908aee8282f1" -dependencies = [ - "futures", - "sea-query", - "sea-schema-derive", -] - -[[package]] -name = "sea-schema-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "semver" version = "1.0.20" @@ -2135,18 +1637,18 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -2210,15 +1712,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2238,12 +1731,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - [[package]] name = "slab" version = "0.4.9" @@ -2317,9 +1804,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2330,16 +1817,14 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.8.6", + "ahash", "atoi", - "bigdecimal", "byteorder", "bytes", - "chrono", "crc", "crossbeam-queue", "dotenvy", @@ -2358,7 +1843,6 @@ dependencies = [ "once_cell", "paste", "percent-encoding", - "rust_decimal", "rustls", "rustls-pemfile", "serde", @@ -2367,20 +1851,18 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", - "time", "tokio", "tokio-stream", "tracing", "url", - "uuid", - "webpki-roots 0.24.0", + "webpki-roots", ] [[package]] name = "sqlx-macros" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" dependencies = [ "proc-macro2", "quote", @@ -2391,10 +1873,11 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ + "atomic-write-file", "dotenvy", "either", "heck", @@ -2407,7 +1890,6 @@ dependencies = [ "sha2", "sqlx-core", "sqlx-mysql", - "sqlx-postgres", "sqlx-sqlite", "syn 1.0.109", "tempfile", @@ -2417,17 +1899,15 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", "base64", - "bigdecimal", "bitflags 2.4.1", "byteorder", "bytes", - "chrono", "crc", "digest", "dotenvy", @@ -2448,7 +1928,6 @@ dependencies = [ "percent-encoding", "rand", "rsa", - "rust_decimal", "serde", "sha1", "sha2", @@ -2456,24 +1935,20 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", - "uuid", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", "base64", - "bigdecimal", "bitflags 2.4.1", "byteorder", - "chrono", "crc", "dotenvy", "etcetera", @@ -2489,10 +1964,8 @@ dependencies = [ "log", "md-5", "memchr", - "num-bigint", "once_cell", "rand", - "rust_decimal", "serde", "serde_json", "sha1", @@ -2501,20 +1974,17 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", - "uuid", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" dependencies = [ "atoi", - "chrono", "flume", "futures-channel", "futures-core", @@ -2526,18 +1996,11 @@ dependencies = [ "percent-encoding", "serde", "sqlx-core", - "time", "tracing", "url", - "uuid", + "urlencoding", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "stringprep" version = "0.1.4" @@ -2555,12 +2018,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" - [[package]] name = "subtle" version = "2.5.0" @@ -2589,18 +2046,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "system-configuration" version = "0.5.1" @@ -2634,12 +2079,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "teloxide" version = "0.12.2" @@ -2752,45 +2191,6 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" -dependencies = [ - "deranged", - "itoa", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" -dependencies = [ - "time-core", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -2870,23 +2270,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - [[package]] name = "tower-service" version = "0.3.2" @@ -2925,21 +2308,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "once_cell", - "regex", - "sharded-slab", - "thread_local", - "tracing", - "tracing-core", -] - [[package]] name = "trim-in-place" version = "0.1.7" @@ -3018,9 +2386,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -3029,13 +2397,18 @@ dependencies = [ ] [[package]] -name = "uuid" -version = "1.5.0" +name = "urlencoding" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", - "serde", ] [[package]] @@ -3162,18 +2535,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" @@ -3212,15 +2576,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -3287,15 +2642,6 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" -[[package]] -name = "winnow" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" -dependencies = [ - "memchr", -] - [[package]] name = "winreg" version = "0.50.0" @@ -3306,15 +2652,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.26" diff --git a/Cargo.toml b/Cargo.toml index e092980..7ee6cab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" strip = true [workspace] -members = [".", "migration", "entity", "cryptography"] +members = [".", "entity", "cryptography"] [workspace.lints.clippy] pedantic = "warn" @@ -31,16 +31,12 @@ futures = "0.3" hex = "0.4" itertools = "0.12" log = "0.4" -migration = { version = "0.2", path = "migration" } parking_lot = "0.12" pretty_env_logger = "0.5" -sea-orm = { version = "0.12", features = [ - "sqlx-mysql", - "runtime-tokio-rustls", -] } serde = "1" serde_json = "1" sha2 = "0.10" +sqlx = { version = "0.7", features = ["mysql", "runtime-tokio-rustls", "macros", "migrate"], default-features = false } teloxide = { version = "0.12", features = [ "macros", "ctrlc_handler", diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..7609593 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +// generated by `sqlx migrate build-script` +fn main() { + // trigger recompilation when a new migration is added + println!("cargo:rerun-if-changed=migrations"); +} \ No newline at end of file diff --git a/cryptography/Cargo.toml b/cryptography/Cargo.toml index e885c1c..de2e1ab 100644 --- a/cryptography/Cargo.toml +++ b/cryptography/Cargo.toml @@ -19,7 +19,6 @@ rand = { version = "0.8", default-features = false, features = [ "std_rng", "std", ] } -sea-orm = "0.12" bitflags = "2" arrayvec = "0.7" subtle = "2" diff --git a/cryptography/src/account.rs b/cryptography/src/account.rs index 454284d..07d6f44 100644 --- a/cryptography/src/account.rs +++ b/cryptography/src/account.rs @@ -1,8 +1,7 @@ use chacha20poly1305::{AeadCore, AeadInPlace, ChaCha20Poly1305, KeyInit}; -use entity::account::{self, ActiveModel}; +use entity::account::Account; use pbkdf2::pbkdf2_hmac_array; use rand::{rngs::OsRng, RngCore}; -use sea_orm::ActiveValue::Set; use sha2::Sha256; pub struct Cipher { @@ -62,7 +61,7 @@ impl Decrypted { /// /// Returns an error if the tag doesn't match the ciphertext or if the decrypted data isn't valid UTF-8 #[inline] - pub fn from_account(mut account: account::Model, master_pass: &str) -> crate::Result { + pub fn from_account(mut account: Account, master_pass: &str) -> crate::Result { let cipher = Cipher::new(master_pass.as_bytes(), &account.salt); cipher.decrypt(&mut account.enc_login)?; cipher.decrypt(&mut account.enc_password)?; @@ -77,22 +76,22 @@ impl Decrypted { /// Constructs `ActiveModel` with eath field Set by encrypting `self` #[inline] #[must_use] - pub fn into_account(self, user_id: u64, master_pass: &str) -> account::ActiveModel { - let mut login = self.login.into_bytes(); - let mut password = self.password.into_bytes(); + pub fn into_account(self, user_id: u64, master_pass: &str) -> Account { + let mut enc_login = self.login.into_bytes(); + let mut enc_password = self.password.into_bytes(); let mut salt = vec![0; 64]; OsRng.fill_bytes(&mut salt); let cipher = Cipher::new(master_pass.as_bytes(), &salt); - cipher.encrypt(&mut login); - cipher.encrypt(&mut password); + cipher.encrypt(&mut enc_login); + cipher.encrypt(&mut enc_password); - ActiveModel { - user_id: Set(user_id), - name: Set(self.name), - salt: Set(salt), - enc_login: Set(login), - enc_password: Set(password), + Account { + user_id, + name: self.name, + salt, + enc_login, + enc_password, } } diff --git a/cryptography/src/hashing.rs b/cryptography/src/hashing.rs index 95063ce..81e4e4e 100644 --- a/cryptography/src/hashing.rs +++ b/cryptography/src/hashing.rs @@ -1,4 +1,4 @@ -use entity::master_pass; +use entity::master_pass::MasterPass; use once_cell::sync::Lazy; use rand::{rngs::OsRng, RngCore}; use scrypt::{scrypt, Params}; @@ -55,9 +55,9 @@ where } } -impl<'a> From<&'a master_pass::Model> for HashedBytes<&'a [u8], &'a [u8]> { +impl<'a> From<&'a MasterPass> for HashedBytes<&'a [u8], &'a [u8]> { #[inline] - fn from(value: &'a master_pass::Model) -> Self { + fn from(value: &'a MasterPass) -> Self { HashedBytes { hash: &value.password_hash, salt: &value.salt, @@ -65,8 +65,8 @@ impl<'a> From<&'a master_pass::Model> for HashedBytes<&'a [u8], &'a [u8]> { } } -impl From for HashedBytes, Vec> { - fn from(value: master_pass::Model) -> Self { +impl From for HashedBytes, Vec> { + fn from(value: MasterPass) -> Self { Self { hash: value.password_hash, salt: value.salt, diff --git a/cryptography/src/master_pass.rs b/cryptography/src/master_pass.rs index b4db34d..fbd8284 100644 --- a/cryptography/src/master_pass.rs +++ b/cryptography/src/master_pass.rs @@ -1,20 +1,19 @@ use super::hashing::HashedBytes; use entity::master_pass; -use sea_orm::ActiveValue::Set; pub trait FromUnencryptedExt { - fn from_unencrypted(user_id: u64, password: &str) -> master_pass::ActiveModel; + fn from_unencrypted(user_id: u64, password: &str) -> master_pass::MasterPass; } -impl FromUnencryptedExt for master_pass::ActiveModel { +impl FromUnencryptedExt for master_pass::MasterPass { /// Hashes the password and creates an `ActiveModel` with all fields set to Set variant #[inline] fn from_unencrypted(user_id: u64, password: &str) -> Self { let hash = HashedBytes::new(password.as_bytes()); Self { - user_id: Set(user_id), - password_hash: Set(hash.hash.to_vec()), - salt: Set(hash.salt.to_vec()), + user_id, + password_hash: hash.hash.to_vec(), + salt: hash.salt.to_vec(), } } } diff --git a/entity/Cargo.toml b/entity/Cargo.toml index ad233aa..b15bca0 100644 --- a/entity/Cargo.toml +++ b/entity/Cargo.toml @@ -10,4 +10,4 @@ workspace = true [dependencies] futures = "0.3" -sea-orm = "0.12" +sqlx = "0.7.2" diff --git a/entity/src/account.rs b/entity/src/account.rs index 3460cb6..fa4ed7b 100644 --- a/entity/src/account.rs +++ b/entity/src/account.rs @@ -1,90 +1,96 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.3 +use super::Pool; +use futures::{Stream, TryStreamExt}; +use sqlx::{query, query_as, Executor, FromRow, MySql}; -use futures::Stream; -use sea_orm::{entity::prelude::*, ActiveValue::Set, QueryOrder, QuerySelect, Statement}; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "account")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] +#[derive(Clone, Debug, PartialEq, Eq, FromRow, Default)] +pub struct Account { pub user_id: u64, - #[sea_orm(primary_key, auto_increment = false)] pub name: String, - #[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")] pub salt: Vec, - #[sea_orm(column_type = "VarBinary(256)")] pub enc_login: Vec, - #[sea_orm(column_type = "VarBinary(256)")] pub enc_password: Vec, } -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +impl Account { + // Inserts the account into DB + #[inline] + pub async fn insert(&self, pool: &Pool) -> crate::Result<()> { + query!( + "INSERT INTO account VALUES (?, ?, ?, ?, ?)", + self.user_id, + self.name, + self.salt, + self.enc_login, + self.enc_password + ) + .execute(pool) + .await + .map(|_| ()) + } -impl ActiveModelBehavior for ActiveModel {} - -impl Entity { /// Gets all user's account from DB #[inline] - pub async fn get_all( - user_id: u64, - db: &DatabaseConnection, - ) -> crate::Result> + '_> { - Self::find() - .filter(Column::UserId.eq(user_id)) - .stream(db) - .await + pub fn get_all(user_id: u64, pool: &Pool) -> impl Stream> + '_ { + query_as("SELECT * FROM account WHERE user_id = ?") + .bind(user_id) + .fetch(pool) } /// Streams the names of the user accounts #[inline] - pub async fn get_names( - user_id: u64, - db: &DatabaseConnection, - ) -> crate::Result> + '_> { - Self::find() - .select_only() - .column(Column::Name) - .filter(Column::UserId.eq(user_id)) - .order_by_asc(Column::Name) - .into_tuple() - .stream(db) - .await + pub fn get_names(user_id: u64, pool: &Pool) -> impl Stream> + '_ { + query_as::<_, (String,)>("SELECT name FROM account WHERE user_id = ?") + .bind(user_id) + .fetch(pool) + .map_ok(|(name,)| name) } /// Checks if the account exists #[inline] - pub async fn exists( - user_id: u64, - account_name: impl Into + Send, - db: &DatabaseConnection, - ) -> crate::Result { - let count = Self::find_by_id((user_id, account_name.into())) - .count(db) - .await?; - Ok(count != 0) + pub async fn exists(user_id: u64, account_name: &str, pool: &Pool) -> crate::Result { + query_as::<_, (bool,)>( + "SELECT EXISTS(SELECT * FROM account WHERE user_id = ? AND name = ? LIMIT 1) as value", + ) + .bind(user_id) + .bind(account_name) + .fetch_one(pool) + .await + .map(|(exists,)| exists) } /// Gets the account from the DB #[inline] - pub async fn get( - user_id: u64, - account_name: impl Into + Send, - db: &DatabaseConnection, - ) -> crate::Result> { - Self::find_by_id((user_id, account_name.into())) - .one(db) + pub async fn get(user_id: u64, account_name: &str, pool: &Pool) -> crate::Result> { + query_as("SELECT * FROM account WHERE user_id = ? AND name = ?") + .bind(user_id) + .bind(account_name) + .fetch_optional(pool) .await } + // Deletes the account from DB + #[inline] + pub async fn delete(user_id: u64, name: &str, pool: &Pool) -> crate::Result<()> { + query!( + "DELETE FROM account WHERE user_id = ? AND name = ?", + user_id, + name + ) + .execute(pool) + .await + .map(|_| ()) + } + /// Deletes all the user's accounts from DB #[inline] - pub async fn delete_all(user_id: u64, db: &impl ConnectionTrait) -> crate::Result<()> { - Self::delete_many() - .filter(Column::UserId.eq(user_id)) - .exec(db) - .await?; - Ok(()) + pub async fn delete_all( + user_id: u64, + pool: impl Executor<'_, Database = MySql>, + ) -> crate::Result<()> { + query!("DELETE FROM account WHERE user_id = ?", user_id) + .execute(pool) + .await + .map(|_| ()) } /// Gets a name by a hex of a SHA256 hash of the name @@ -92,49 +98,82 @@ impl Entity { pub async fn get_name_by_hash( user_id: u64, hash: String, - db: &DatabaseConnection, + pool: &Pool, ) -> crate::Result> { - db.query_one(Statement::from_sql_and_values( - sea_orm::DatabaseBackend::MySql, + let name = query_as::<_, (String,)>( "SELECT `name` FROM `account` WHERE SHA2(`name`, 256) = ? AND `user_id` = ?;", - [hash.into(), user_id.into()], - )) - .await? - .map(|result| result.try_get_by_index(0)) - .transpose() + ) + .bind(hash) + .bind(user_id) + .fetch_optional(pool) + .await?; + + Ok(name.map(|(name,)| name)) } #[inline] - pub async fn get_salt( - user_id: u64, - name: String, - db: &DatabaseConnection, - ) -> crate::Result>> { - Self::find_by_id((user_id, name)) - .select_only() - .column(Column::Salt) - .into_tuple() - .one(db) - .await + pub async fn get_salt(user_id: u64, name: &str, pool: &Pool) -> crate::Result>> { + let salt = + query_as::<_, (Vec,)>("SELECT salt FROM account WHERE user_id = ? AND name = ?") + .bind(user_id) + .bind(name) + .fetch_optional(pool) + .await?; + + Ok(salt.map(|(salt,)| salt)) } #[inline] pub async fn update_name( user_id: u64, - original_name: String, - new_name: String, - db: &DatabaseConnection, + original_name: &str, + new_name: &str, + pool: &Pool, ) -> crate::Result<()> { - Self::update_many() - .set(ActiveModel { - name: Set(new_name), - ..Default::default() - }) - .filter(Column::UserId.eq(user_id)) - .filter(Column::Name.eq(original_name)) - .exec(db) - .await?; + query!( + "UPDATE account SET name = ? WHERE user_id = ? AND name = ?", + new_name, + user_id, + original_name + ) + .execute(pool) + .await + .map(|_| ()) + } - Ok(()) + #[inline] + pub async fn update_login( + user_id: u64, + name: &str, + login: Vec, + pool: &Pool, + ) -> crate::Result<()> { + query!( + "UPDATE account SET enc_login = ? WHERE user_id = ? AND name = ?", + login, + user_id, + name + ) + .execute(pool) + .await + .map(|_| ()) + } + + #[inline] + pub async fn update_password( + user_id: u64, + name: &str, + password: Vec, + pool: &Pool, + ) -> crate::Result<()> { + query!( + "UPDATE account SET enc_password = ? WHERE user_id = ? AND name = ?", + password, + user_id, + name + ) + .execute(pool) + .await + .map(|_| ()) } } diff --git a/entity/src/lib.rs b/entity/src/lib.rs index beea226..3e29cc0 100644 --- a/entity/src/lib.rs +++ b/entity/src/lib.rs @@ -5,6 +5,6 @@ pub mod account; pub mod master_pass; pub mod prelude; -use sea_orm::DbErr; +pub use sqlx::Result; -type Result = std::result::Result; +pub type Pool = sqlx::mysql::MySqlPool; diff --git a/entity/src/master_pass.rs b/entity/src/master_pass.rs index 0ac1e61..04dc1d6 100644 --- a/entity/src/master_pass.rs +++ b/entity/src/master_pass.rs @@ -1,40 +1,57 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.3 +use super::Pool; +use sqlx::{prelude::FromRow, query, query_as, Executor, MySql}; -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "master_pass")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] +#[derive(Clone, Debug, PartialEq, FromRow, Eq)] +pub struct MasterPass { pub user_id: u64, - #[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")] pub salt: Vec, - #[sea_orm(column_type = "Binary(BlobSize::Blob(Some(64)))")] pub password_hash: Vec, } -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +impl MasterPass { + // Inserts the master password into DB + #[inline] + pub async fn insert(&self, pool: &Pool) -> crate::Result<()> { + query!( + "INSERT INTO master_pass VALUES (?, ?, ?)", + self.user_id, + self.salt, + self.password_hash + ) + .execute(pool) + .await + .map(|_| ()) + } -impl ActiveModelBehavior for ActiveModel {} - -impl Entity { /// Gets the master password from the database #[inline] - pub async fn get(user_id: u64, db: &DatabaseConnection) -> crate::Result> { - Self::find_by_id(user_id).one(db).await + pub async fn get(user_id: u64, pool: &Pool) -> crate::Result> { + query_as("SELECT * FROM master_pass WHERE user_id = ?") + .bind(user_id) + .fetch_optional(pool) + .await } /// Checks if the master password for the user exists #[inline] - pub async fn exists(user_id: u64, db: &DatabaseConnection) -> Result { - let count = Self::find_by_id(user_id).count(db).await?; - Ok(count != 0) + pub async fn exists(user_id: u64, pool: &Pool) -> crate::Result { + query_as::<_, (bool,)>( + "SELECT EXISTS(SELECT * FROM master_pass WHERE user_id = ? LIMIT 1) as value", + ) + .bind(user_id) + .fetch_one(pool) + .await + .map(|(exists,)| exists) } /// Removes a master password of the user from the database - pub async fn remove(user_id: u64, db: &impl ConnectionTrait) -> Result<(), DbErr> { - Self::delete_by_id(user_id).exec(db).await?; - Ok(()) + pub async fn remove( + user_id: u64, + pool: impl Executor<'_, Database = MySql>, + ) -> crate::Result<()> { + query!("DELETE FROM master_pass WHERE user_id = ?", user_id) + .execute(pool) + .await + .map(|_| ()) } } diff --git a/entity/src/prelude.rs b/entity/src/prelude.rs index ed1a99a..c5e5bff 100644 --- a/entity/src/prelude.rs +++ b/entity/src/prelude.rs @@ -1,4 +1,2 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.3 - -pub use crate::account::{self, Entity as Account}; -pub use crate::master_pass::{self, Entity as MasterPass}; +pub use crate::account::Account; +pub use crate::master_pass::MasterPass; diff --git a/migration/Cargo.toml b/migration/Cargo.toml deleted file mode 100644 index f0743ba..0000000 --- a/migration/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "migration" -version = "0.2.0" -edition = "2021" - -[lints] -workspace = true - -[dependencies.sea-orm-migration] -version = "0.12" -features = ["runtime-tokio-rustls", "sqlx-mysql"] -default-features = false diff --git a/migration/src/lib.rs b/migration/src/lib.rs deleted file mode 100644 index ce10edd..0000000 --- a/migration/src/lib.rs +++ /dev/null @@ -1,16 +0,0 @@ -pub use sea_orm_migration::prelude::*; - -mod m20220101_000001_create_table; -mod m20230427_142510_change_password_hash_size; - -pub struct Migrator; - -#[async_trait::async_trait] -impl MigratorTrait for Migrator { - fn migrations() -> Vec> { - vec![ - Box::new(m20220101_000001_create_table::Migration), - Box::new(m20230427_142510_change_password_hash_size::Migration), - ] - } -} diff --git a/migration/src/m20220101_000001_create_table.rs b/migration/src/m20220101_000001_create_table.rs deleted file mode 100644 index 360873d..0000000 --- a/migration/src/m20220101_000001_create_table.rs +++ /dev/null @@ -1,80 +0,0 @@ -use sea_orm_migration::prelude::*; - -#[derive(Iden)] -enum MasterPass { - Table, - #[iden = "user_id"] - UserId, - Salt, - #[iden = "password_hash"] - PasswordHash, -} - -#[derive(Iden)] -enum Account { - Table, - #[iden = "user_id"] - UserId, - Name, - Salt, - #[iden = "enc_login"] - EncLogin, - #[iden = "enc_password"] - EncPassword, -} - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(MasterPass::Table) - .if_not_exists() - .col( - ColumnDef::new(MasterPass::UserId) - .big_unsigned() - .primary_key() - .not_null(), - ) - .col(ColumnDef::new(MasterPass::Salt).binary_len(64).not_null()) - .col( - ColumnDef::new(MasterPass::PasswordHash) - .binary_len(128) - .not_null(), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(Account::Table) - .if_not_exists() - .col(ColumnDef::new(Account::UserId).big_unsigned().not_null()) - .col(ColumnDef::new(Account::Name).string_len(256).not_null()) - .col(ColumnDef::new(Account::Salt).binary_len(64).not_null()) - .col(ColumnDef::new(Account::EncLogin).var_binary(256).not_null()) - .col( - ColumnDef::new(Account::EncPassword) - .var_binary(256) - .not_null(), - ) - .primary_key(Index::create().col(Account::UserId).col(Account::Name)) - .to_owned(), - ) - .await - } - - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(sea_query::Table::drop().table(MasterPass::Table).to_owned()) - .await?; - manager - .drop_table(sea_query::Table::drop().table(Account::Table).to_owned()) - .await - } -} diff --git a/migration/src/m20230427_142510_change_password_hash_size.rs b/migration/src/m20230427_142510_change_password_hash_size.rs deleted file mode 100644 index ff2058c..0000000 --- a/migration/src/m20230427_142510_change_password_hash_size.rs +++ /dev/null @@ -1,44 +0,0 @@ -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 - } -} diff --git a/migrations/0001_init.down.sql b/migrations/0001_init.down.sql new file mode 100644 index 0000000..6f6df9c --- /dev/null +++ b/migrations/0001_init.down.sql @@ -0,0 +1,3 @@ +DROP TABLE account; + +DROP TABLE master_pass; \ No newline at end of file diff --git a/migrations/0001_init.up.sql b/migrations/0001_init.up.sql new file mode 100644 index 0000000..60baed3 --- /dev/null +++ b/migrations/0001_init.up.sql @@ -0,0 +1,16 @@ +CREATE TABLE + master_pass ( + user_id BIGINT UNSIGNED NOT NULL PRIMARY KEY, + salt BINARY(64) NOT NULL, + password_hash BINARY(64) NOT NULL + ); + +CREATE TABLE + account ( + user_id BIGINT UNSIGNED NOT NULL, + name VARCHAR(255) NOT NULL, + salt BINARY(64) NOT NULL, + enc_login VARBINARY(256) NOT NULL, + enc_password VARBINARY(256) NOT NULL, + PRIMARY KEY (user_id, name) + ); \ No newline at end of file diff --git a/src/callbacks/alter.rs b/src/callbacks/alter.rs index ac3877c..ebb3de7 100644 --- a/src/callbacks/alter.rs +++ b/src/callbacks/alter.rs @@ -1,9 +1,7 @@ use super::AlterableField::{self, Login, Name, Pass}; use crate::{change_state, prelude::*}; -use account::ActiveModel; use cryptography::account::Cipher; use futures::TryFutureExt; -use sea_orm::ActiveValue::Set; use tokio::{task::spawn_blocking, try_join}; #[inline] @@ -16,12 +14,12 @@ async fn update_account( master_pass: String, ) -> crate::Result<()> { if field == Name { - Account::update_name(user_id, name, field_value, db).await?; + Account::update_name(user_id, &name, &field_value, db).await?; return Ok(()); } - let salt = Account::get_salt(user_id, name.clone(), db).await?.unwrap(); + let salt = Account::get_salt(user_id, &name, db).await?.unwrap(); let field_value = spawn_blocking(move || { let cipher = Cipher::new(master_pass.as_bytes(), &salt); @@ -31,20 +29,12 @@ async fn update_account( }) .await?; - let mut model = ActiveModel { - user_id: Set(user_id), - name: Set(name), - ..Default::default() - }; - match field { - Login => model.enc_login = Set(field_value), - Pass => model.enc_password = Set(field_value), + Login => Account::update_login(user_id, &name, field_value, db).await?, + Pass => Account::update_password(user_id, &name, field_value, db).await?, Name => unreachable!(), } - model.update(db).await?; - Ok(()) } diff --git a/src/callbacks/delete.rs b/src/callbacks/delete.rs index bf4ccd0..b1ba1cf 100644 --- a/src/callbacks/delete.rs +++ b/src/callbacks/delete.rs @@ -16,7 +16,7 @@ async fn get_master_pass( dialogue.exit().await?; let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - Account::delete_by_id((user_id, name)).exec(&db).await?; + Account::delete(user_id, &name, &db).await?; ids.alter_message( &bot, diff --git a/src/commands/delete.rs b/src/commands/delete.rs index 9027c1f..25341ff 100644 --- a/src/commands/delete.rs +++ b/src/commands/delete.rs @@ -5,10 +5,7 @@ use tokio::task::spawn_blocking; pub async fn delete(bot: Throttle, msg: Message, db: DatabaseConnection) -> crate::Result<()> { let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - let names: Vec = Account::get_names(user_id, &db) - .await? - .try_collect() - .await?; + let names: Vec = Account::get_names(user_id, &db).try_collect().await?; if names.is_empty() { bot.send_message(msg.chat.id, "You don't have any accounts") diff --git a/src/commands/delete_all.rs b/src/commands/delete_all.rs index 493003e..b9ff0df 100644 --- a/src/commands/delete_all.rs +++ b/src/commands/delete_all.rs @@ -1,7 +1,5 @@ use crate::prelude::*; use log::error; -use sea_orm::TransactionTrait; -use tokio::try_join; /// Gets the master password, deletes the accounts and the master password from DB. /// Although it doesn't use the master password, we get it to be sure that it's the user who used that command @@ -16,17 +14,17 @@ async fn get_master_pass( ) -> crate::Result<()> { dialogue.exit().await?; let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - let txn = db.begin().await?; - let result = try_join!( - Account::delete_all(user_id, &txn), - MasterPass::remove(user_id, &txn), + let mut txn = db.begin().await?; + let result = ( + Account::delete_all(user_id, &mut *txn).await, + MasterPass::remove(user_id, &mut *txn).await, ); let text = match result { - Ok(_) => { + (Ok(()), Ok(())) => { txn.commit().await?; "Everything was deleted" } - Err(err) => { + (Err(err), _) | (_, Err(err)) => { error!("{}", crate::Error::from(err)); txn.rollback().await?; "Something went wrong. Try again later" diff --git a/src/commands/export.rs b/src/commands/export.rs index 49c8c1b..6b5428f 100644 --- a/src/commands/export.rs +++ b/src/commands/export.rs @@ -7,7 +7,7 @@ use tokio::task::spawn_blocking; /// Decryptes the account on a worker thread and adds it to the accounts vector #[inline] async fn decrypt_account( - account: account::Model, + account: Account, master_pass: Arc, accounts: &Mutex<&mut Vec>, ) -> crate::Result<()> { @@ -38,7 +38,6 @@ async fn get_master_pass( let master_pass: Arc = master_pass.into(); Account::get_all(user_id, &db) - .await? .err_into::() .try_for_each_concurrent(3, |account| { decrypt_account(account, master_pass.clone(), &accounts) diff --git a/src/commands/get_account.rs b/src/commands/get_account.rs index 15d4d59..0c45011 100644 --- a/src/commands/get_account.rs +++ b/src/commands/get_account.rs @@ -9,10 +9,7 @@ pub async fn get_account( ) -> crate::Result<()> { let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - let names: Vec = Account::get_names(user_id, &db) - .await? - .try_collect() - .await?; + let names: Vec = Account::get_names(user_id, &db).try_collect().await?; if names.is_empty() { bot.send_message(msg.chat.id, "You don't have any accounts") diff --git a/src/commands/get_accounts.rs b/src/commands/get_accounts.rs index c0db6c3..c8870b3 100644 --- a/src/commands/get_accounts.rs +++ b/src/commands/get_accounts.rs @@ -11,7 +11,7 @@ pub async fn get_accounts( db: DatabaseConnection, ) -> crate::Result<()> { let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - let mut account_names = Account::get_names(user_id, &db).await?; + let mut account_names = Account::get_names(user_id, &db); let mut text = if let Some(name) = account_names.try_next().await? { format!("Accounts:\n`{name}`") diff --git a/src/commands/import.rs b/src/commands/import.rs index 6f05171..a47a651 100644 --- a/src/commands/import.rs +++ b/src/commands/import.rs @@ -18,7 +18,7 @@ async fn encrypt_account( let name = account.name.clone(); match spawn_blocking(move || account.into_account(user_id, &master_pass)).await { Ok(account) => match account.insert(db).await { - Ok(_) => (), + Ok(()) => (), Err(_) => failed.lock().push(name), }, _ => failed.lock().push(name), diff --git a/src/commands/menu.rs b/src/commands/menu.rs index 82e3113..037e2e9 100644 --- a/src/commands/menu.rs +++ b/src/commands/menu.rs @@ -5,10 +5,7 @@ use tokio::task::spawn_blocking; pub async fn menu(bot: Throttle, msg: Message, db: DatabaseConnection) -> crate::Result<()> { let user_id = msg.from().ok_or(NoUserInfo)?.id.0; - let names: Vec = Account::get_names(user_id, &db) - .await? - .try_collect() - .await?; + let names: Vec = Account::get_names(user_id, &db).try_collect().await?; if names.is_empty() { bot.send_message(msg.chat.id, "You don't have any accounts") diff --git a/src/commands/set_master_pass.rs b/src/commands/set_master_pass.rs index 85ab954..938d8db 100644 --- a/src/commands/set_master_pass.rs +++ b/src/commands/set_master_pass.rs @@ -1,6 +1,5 @@ use crate::{change_state, prelude::*}; use cryptography::hashing::HashedBytes; -use sea_orm::ActiveValue::Set; use tokio::task::spawn_blocking; #[inline] @@ -14,7 +13,7 @@ async fn get_master_pass2( master_pass: String, ) -> crate::Result<()> { dialogue.exit().await?; - let user_id = Set(msg.from().ok_or(NoUserInfo)?.id.0); + let user_id = msg.from().ok_or(NoUserInfo)?.id.0; if !hash.verify(master_pass.as_bytes()) { ids.alter_message( @@ -28,10 +27,10 @@ async fn get_master_pass2( return Ok(()); } - let model = master_pass::ActiveModel { + let model = MasterPass { user_id, - password_hash: Set(hash.hash.to_vec()), - salt: Set(hash.salt.to_vec()), + password_hash: hash.hash.to_vec(), + salt: hash.salt.to_vec(), }; model.insert(&db).await?; diff --git a/src/main.rs b/src/main.rs index 8e6db41..c5c8c8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,3 @@ -// #![warn(clippy::pedantic, clippy::all, clippy::nursery)] -// #![allow(clippy::single_match_else)] - mod callbacks; mod commands; mod default; @@ -16,9 +13,7 @@ mod utils; use anyhow::{Error, Result}; use dotenvy::dotenv; -use migration::{Migrator, MigratorTrait}; use prelude::*; -use sea_orm::Database; use std::env; use teloxide::{adaptors::throttle::Limits, dispatching::dialogue::InMemStorage, filter_command}; @@ -92,8 +87,10 @@ async fn main() -> Result<()> { let token = env::var("TOKEN").expect("expected TOKEN in the enviroment"); let database_url = env::var("DATABASE_URL").expect("expected DATABASE_URL in the enviroment"); - let db = Database::connect(database_url).await?; - Migrator::up(&db, None).await?; - get_dispatcher(token, db).dispatch().await; + let pool = sqlx::mysql::MySqlPool::connect(&database_url).await?; + + sqlx::migrate!().run(&pool).await?; + + get_dispatcher(token, pool).dispatch().await; Ok(()) } diff --git a/src/markups.rs b/src/markups.rs index f2aa501..403d77c 100644 --- a/src/markups.rs +++ b/src/markups.rs @@ -32,7 +32,7 @@ pub async fn menu_markup( db: &DatabaseConnection, ) -> crate::Result { let command: String = command.into(); - let names: Vec = Account::get_names(user_id, db).await?.try_collect().await?; + let names: Vec = Account::get_names(user_id, db).try_collect().await?; spawn_blocking(move || menu_markup_sync(&command, names)) .await diff --git a/src/prelude.rs b/src/prelude.rs index 8ded9c2..e60f8ca 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -8,7 +8,6 @@ pub use crate::{ utils::*, }; pub use cryptography::prelude::*; -pub use entity::prelude::*; +pub use entity::{prelude::*, Pool as DatabaseConnection}; pub use futures::{StreamExt, TryStreamExt}; -pub use sea_orm::prelude::*; pub use teloxide::{adaptors::Throttle, prelude::*}; diff --git a/src/state/get_user.rs b/src/state/get_user.rs index b79fe06..cfa276f 100644 --- a/src/state/get_user.rs +++ b/src/state/get_user.rs @@ -165,7 +165,6 @@ pub async fn get_user( let existing_names = async { Account::get_names(user_id, &db) - .await? .try_collect() .await .map_err(Into::into)