diff --git a/Cargo.lock b/Cargo.lock index a486aab..d7afd73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -709,6 +709,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1182,6 +1191,7 @@ dependencies = [ "decancer", "dirs", "dotenv", + "hex", "mongodb", "poise", "regex", @@ -1190,6 +1200,7 @@ dependencies = [ "serde_json", "serde_regex", "serde_with_macros 2.0.1", + "sha3", "tokio", "tracing", "tracing-subscriber", @@ -1463,6 +1474,16 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "sharded-slab" version = "0.1.4" diff --git a/Cargo.toml b/Cargo.toml index c2c7666..b4fc856 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,4 +31,6 @@ reqwest = { version = "0.11", features= ["rustls-tls"], default-features = false chrono = "0.4" dirs = "4.0" tracing = { version = "0.1", features = ["max_level_debug", "release_max_level_info"] } -tracing-subscriber = "0.3" \ No newline at end of file +tracing-subscriber = "0.3" +sha3 = "0.10" +hex = "0.4" diff --git a/src/utils/poll.rs b/src/utils/poll.rs index fe1ab99..c3e457a 100644 --- a/src/utils/poll.rs +++ b/src/utils/poll.rs @@ -1,5 +1,6 @@ use poise::serenity_prelude::{ButtonStyle, ReactionType, Timestamp}; +use sha3::{Digest, Sha3_256}; use tracing::log::{error, info, trace}; use super::bot::get_data_lock; @@ -22,9 +23,12 @@ pub async fn handle_poll( let eligible = member.joined_at.unwrap() <= min_join_date; let auth_token = if eligible { + let mut hasher = Sha3_256::new(); + hasher.update(&member.user.id.to_string()); let result = data .api - .authenticate(&member.user.id.to_string()) + // We cannot use the entire hash because Discord rejects URLs with more than 512 characters. + .authenticate(&hex::encode(hasher.finalize())[..2^5]) .await .map(|auth| auth.access_token);