functions for signing stuff
This commit is contained in:
parent
bef33c6dac
commit
320060b1bd
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -1288,6 +1288,7 @@ name = "reminder_rs"
|
|||||||
version = "1.5.1"
|
version = "1.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"Inflector",
|
"Inflector",
|
||||||
|
"base64 0.13.0",
|
||||||
"chrono",
|
"chrono",
|
||||||
"chrono-tz",
|
"chrono-tz",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@ -1302,6 +1303,7 @@ dependencies = [
|
|||||||
"regex",
|
"regex",
|
||||||
"regex_command_attr",
|
"regex_command_attr",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
"ring",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serenity",
|
"serenity",
|
||||||
|
@ -25,6 +25,8 @@ levenshtein = "1.0"
|
|||||||
# serenity = { version = "0.10", features = ["collector"] }
|
# serenity = { version = "0.10", features = ["collector"] }
|
||||||
serenity = { path = "/home/jude/serenity", features = ["collector", "unstable_discord_api"] }
|
serenity = { path = "/home/jude/serenity", features = ["collector", "unstable_discord_api"] }
|
||||||
sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "bigdecimal", "chrono"]}
|
sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "bigdecimal", "chrono"]}
|
||||||
|
ring = "0.16"
|
||||||
|
base64 = "0.13.0"
|
||||||
|
|
||||||
[dependencies.regex_command_attr]
|
[dependencies.regex_command_attr]
|
||||||
path = "./regex_command_attr"
|
path = "./regex_command_attr"
|
||||||
|
@ -7,8 +7,8 @@ use serenity::{
|
|||||||
client::Context,
|
client::Context,
|
||||||
http::CacheHttp,
|
http::CacheHttp,
|
||||||
model::{
|
model::{
|
||||||
channel::GuildChannel,
|
|
||||||
channel::Message,
|
channel::Message,
|
||||||
|
channel::{Channel, GuildChannel},
|
||||||
guild::Guild,
|
guild::Guild,
|
||||||
id::{ChannelId, GuildId, UserId},
|
id::{ChannelId, GuildId, UserId},
|
||||||
misc::Mentionable,
|
misc::Mentionable,
|
||||||
@ -26,7 +26,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
framework::SendIterator,
|
framework::SendIterator,
|
||||||
get_ctx_data,
|
get_ctx_data,
|
||||||
models::{ChannelData, GuildData, Timer, UserData},
|
models::{ChannelData, CtxGuildData, GuildData, MeridianType, Timer, UserData},
|
||||||
time_parser::{natural_parser, TimeParser},
|
time_parser::{natural_parser, TimeParser},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -42,14 +42,14 @@ use std::{
|
|||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
convert::TryInto,
|
convert::TryInto,
|
||||||
default::Default,
|
default::Default,
|
||||||
|
env,
|
||||||
fmt::Display,
|
fmt::Display,
|
||||||
string::ToString,
|
string::ToString,
|
||||||
time::{SystemTime, UNIX_EPOCH},
|
time::{SystemTime, UNIX_EPOCH},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::models::{CtxGuildData, MeridianType};
|
|
||||||
use regex::Captures;
|
use regex::Captures;
|
||||||
use serenity::model::channel::Channel;
|
use ring::hmac;
|
||||||
|
|
||||||
fn shorthand_displacement(seconds: u64) -> String {
|
fn shorthand_displacement(seconds: u64) -> String {
|
||||||
let (days, seconds) = seconds.div_rem(&DAY);
|
let (days, seconds) = seconds.div_rem(&DAY);
|
||||||
@ -80,6 +80,41 @@ fn longhand_displacement(seconds: u64) -> String {
|
|||||||
sections.join(", ")
|
sections.join(", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_signed_payload(reminder_id: u32, member_id: u64) -> String {
|
||||||
|
let s_key = hmac::Key::new(
|
||||||
|
hmac::HMAC_SHA256,
|
||||||
|
env::var("SECRET_KEY")
|
||||||
|
.expect("No SECRET_KEY provided")
|
||||||
|
.as_bytes(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut context = hmac::Context::with_key(&s_key);
|
||||||
|
|
||||||
|
context.update(&reminder_id.to_le_bytes());
|
||||||
|
context.update(&member_id.to_le_bytes());
|
||||||
|
|
||||||
|
let signature = context.sign();
|
||||||
|
|
||||||
|
format!(
|
||||||
|
"{}.{}",
|
||||||
|
base64::encode(reminder_id.to_le_bytes()),
|
||||||
|
base64::encode(&signature)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_signature(payload: String, member_id: u64) -> bool {
|
||||||
|
let (a, _b) = payload.split_once('.').expect("Payload format incorrect");
|
||||||
|
|
||||||
|
let reminder_id = u32::from_le_bytes(
|
||||||
|
base64::decode(a)
|
||||||
|
.expect("Payload format incorrect")
|
||||||
|
.try_into()
|
||||||
|
.expect("Payload format incorrect"),
|
||||||
|
);
|
||||||
|
|
||||||
|
payload == generate_signed_payload(reminder_id, member_id)
|
||||||
|
}
|
||||||
|
|
||||||
async fn create_webhook(
|
async fn create_webhook(
|
||||||
ctx: impl CacheHttp,
|
ctx: impl CacheHttp,
|
||||||
channel: GuildChannel,
|
channel: GuildChannel,
|
||||||
|
@ -268,8 +268,6 @@ DELETE FROM guilds WHERE guild = ?
|
|||||||
if let (Some(InteractionData::MessageComponent(data)), Some(member)) =
|
if let (Some(InteractionData::MessageComponent(data)), Some(member)) =
|
||||||
(interaction.clone().data, interaction.clone().member)
|
(interaction.clone().data, interaction.clone().member)
|
||||||
{
|
{
|
||||||
println!("{}", data.custom_id);
|
|
||||||
|
|
||||||
if data.custom_id.starts_with("timezone:") {
|
if data.custom_id.starts_with("timezone:") {
|
||||||
let mut user_data = UserData::from_user(&member.user, &ctx, &pool)
|
let mut user_data = UserData::from_user(&member.user, &ctx, &pool)
|
||||||
.await
|
.await
|
||||||
|
Loading…
Reference in New Issue
Block a user