Skip to content

Commit

Permalink
Update poise to resolve sec advisory
Browse files Browse the repository at this point in the history
  • Loading branch information
SLASHLogin committed Oct 10, 2023
1 parent 823c328 commit 0f1f4df
Show file tree
Hide file tree
Showing 11 changed files with 362 additions and 321 deletions.
247 changes: 94 additions & 153 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ tracing-appender = "0.2.2"
cron = "0.12.0"
graphql_client = { version = "0.13.0", features = ["reqwest"] }
reqwest = "0.11.20"
poise = { version = "0.5.6", features = ["cache"] }
poise = { git = "https://github.com/serenity-rs/poise", rev = "928d777635c61dbbcd8ed291c772708ead7e43e6", features = ["cache"] }
anyhow = "1.0.75"
async-trait = "0.1.73"
thiserror = "1.0.48"
Expand Down
4 changes: 4 additions & 0 deletions deny.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@ multiple-versions = "allow"
unknown-registry = "deny"
unknown-git = "deny"
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
allow-git = [
"https://github.com/serenity-rs/poise?rev=928d777635c61dbbcd8ed291c772708ead7e43e6#928d777635c61dbbcd8ed291c772708ead7e43e6",
"https://github.com/serenity-rs/serenity?branch=next#a0c102f9acfd8d7184650815e06e0301954cb9e7", # Allow those two because it solves advisory issue with tungstenite. We can switch to the next release of serenity once it's out.
]
49 changes: 31 additions & 18 deletions src/database/models/meeting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ use std::{
use chrono::NaiveDateTime;
use cron::Schedule;
use diesel::{dsl::exists, query_dsl::SaveChangesDsl, select, BoolExpressionMethods, QueryDsl};
use poise::{serenity_prelude as serenity, SlashArgument};
use poise::{
serenity_prelude::{self as serenity, CreateCommandOption},
SlashArgument,
};
use tracing::{error, warn};
use uuid::Uuid;

Expand Down Expand Up @@ -377,26 +380,31 @@ impl Display for Meeting {
#[async_trait::async_trait]
impl SlashArgument for Meeting {
async fn extract(
_ctx: &serenity::Context,
_interaction: poise::ApplicationCommandOrAutocompleteInteraction<'_>,
value: &serenity::json::Value,
_ctx: &impl serenity::CacheHttp,
_interaction: poise::CommandOrAutocompleteInteraction<'_>,
value: &serenity::ResolvedValue<'_>,
) -> Result<Self, poise::SlashArgError> {
let id = match value {
serenity::json::Value::String(id) => match Uuid::parse_str(id) {
serenity::ResolvedValue::String(id) => match Uuid::parse_str(id) {
Ok(id) => id,
Err(why) => {
Err(_why) => {
let error_msg = format!("Failed to parse meeting id: {}", id);
error!("{}", error_msg);
return Err(poise::SlashArgError::Parse {
error: Box::new(why),
input: id.to_string(),
});
// return Err(poise::SlashArgError::Parse {
// error: Box::new(why),
// input: id.to_string(),
// });
// FIXME: SlashArgError::Parse is marked as non_exhaustive, thus it can't be
// constructed.
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Failed to parse meeting id",
));
}
},
_ => {
return Err(poise::SlashArgError::CommandStructureMismatch(
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Meeting id must be a string",
))
));
}
};

Expand All @@ -405,17 +413,22 @@ impl SlashArgument for Meeting {
Err(why) => {
let error_msg = format!("Failed to get meeting: {}", why);
error!("{}", error_msg);
return Err(poise::SlashArgError::Parse {
error: why.into(),
input: id.to_string(),
});
// return Err(poise::SlashArgError::Parse {
// error: why.into(),
// input: id.to_string(),
// });
// FIXME: SlashArgError::Parse is marked as non_exhaustive, thus it can't be
// constructed.
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Failed to get meeting",
));
}
};

Ok(meeting)
}

fn create(builder: &mut serenity::CreateApplicationCommandOption) {
builder.kind(serenity::command::CommandOptionType::String);
fn create(builder: CreateCommandOption) -> CreateCommandOption {
builder.kind(poise::serenity_prelude::CommandOptionType::String)
}
}
76 changes: 49 additions & 27 deletions src/database/models/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ use diesel::{
sql_types::Integer,
BoolExpressionMethods, QueryDsl, Table,
};
use poise::{serenity_prelude as serenity, SlashArgument};
use poise::{
serenity_prelude as serenity,
serenity_prelude::{CreateCommandOption, ResolvedValue},
SlashArgument,
};
use serenity::{http::CacheHttp, model::prelude::RoleId};
use tracing::{error, warn};
use uuid::Uuid;
Expand Down Expand Up @@ -54,6 +58,15 @@ pub enum Activity {
Inactive,
}

impl Display for Activity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Activity::Active => write!(f, "Active"),
Activity::Inactive => write!(f, "Inactive"),
}
}
}

impl MemberRole {
pub fn discord_role(&self) -> Option<RoleId> {
match self {
Expand All @@ -67,7 +80,7 @@ impl MemberRole {
if let Some(role_id) = self.discord_role() {
cache_http
.http()
.add_member_role(SETTINGS.discord.server_id.0, member_id, role_id.0, None)
.add_member_role(SETTINGS.discord.server_id, member_id.into(), role_id, None)
.await?;
}

Expand All @@ -82,7 +95,7 @@ impl MemberRole {
if let Some(role_id) = self.discord_role() {
cache_http
.http()
.remove_member_role(SETTINGS.discord.server_id.0, member_id, role_id.0, None)
.remove_member_role(SETTINGS.discord.server_id, member_id.into(), role_id, None)
.await?;
}

Expand Down Expand Up @@ -448,6 +461,16 @@ impl Member {
}
}

impl Display for MemberRole {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MemberRole::ExMember => write!(f, "Ex-Member"),
MemberRole::Member => write!(f, "Member"),
MemberRole::Apprentice => write!(f, "Apprentice"),
}
}
}

impl Display for Member {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let discord_id = if let Some(discord_id) = &self.discord_id {
Expand Down Expand Up @@ -504,43 +527,42 @@ impl PartialEq for Member {
#[async_trait::async_trait]
impl SlashArgument for Member {
async fn extract(
ctx: &serenity::Context,
interaction: poise::ApplicationCommandOrAutocompleteInteraction<'_>,
value: &serenity::json::Value,
_ctx: &impl poise::serenity_prelude::CacheHttp,
_interaction: poise::CommandOrAutocompleteInteraction<'_>,
value: &poise::serenity_prelude::ResolvedValue<'_>,
) -> Result<Self, poise::SlashArgError> {
let member_id = match poise::extract_slash_argument!(
serenity::model::guild::Member,
ctx,
interaction,
value
)
.await
{
Ok(member) => member.user.id.to_string(),
Err(why) => {
String::from(value.as_str().ok_or_else(|| poise::SlashArgError::Parse {
error: why.into(),
input: value.to_string(),
})?)
let member_id = match value {
ResolvedValue::User(user, _member) => user.id.to_string(),
_ => {
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Expected user",
))
}
};

let member = match Member::find_by_discord_id(&member_id) {
let member = match Member::find_by_discord_id(member_id) {
Ok(member) => member,
Err(why) => {
let error_msg = format!("Could not find member in database: {}", why);
error!("{}", error_msg);
return Err(poise::SlashArgError::Parse {
error: why.into(),
input: member_id,
});
// return Err(poise::SlashArgError::Parse {
// error: why.into(),
// input: member_id,
// });
// FIXME: SlashArgError::Parse is marked as non_exhaustive, thus it can't be
// constructed.
return Err(poise::SlashArgError::new_command_structure_mismatch(
// &error_msg,
// error_msg does not live long enough
"Could not find member in database",
));
}
};

Ok(member)
}

fn create(builder: &mut serenity::CreateApplicationCommandOption) {
builder.kind(serenity::command::CommandOptionType::User);
fn create(builder: CreateCommandOption) -> CreateCommandOption {
builder.kind(poise::serenity_prelude::CommandOptionType::User)
}
}
47 changes: 30 additions & 17 deletions src/database/models/report.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ use std::fmt::{Display, Formatter, Write};

use chrono::NaiveDate;
use diesel::{query_dsl::SaveChangesDsl, QueryDsl, RunQueryDsl};
use poise::{serenity_prelude as serenity, SlashArgument};
use poise::{
serenity_prelude::{self as serenity, CreateCommandOption, ResolvedValue},
SlashArgument,
};
use tracing::error;
use uuid::Uuid;

Expand Down Expand Up @@ -216,24 +219,29 @@ impl Display for Report {
#[async_trait::async_trait]
impl SlashArgument for Report {
async fn extract(
_ctx: &serenity::Context,
_interaction: poise::ApplicationCommandOrAutocompleteInteraction<'_>,
value: &serenity::json::Value,
_ctx: &impl serenity::CacheHttp,
_interaction: poise::CommandOrAutocompleteInteraction<'_>,
value: &serenity::ResolvedValue<'_>,
) -> Result<Self, poise::SlashArgError> {
let id = match value {
serenity::json::Value::String(id) => match Uuid::parse_str(id) {
ResolvedValue::String(id) => match Uuid::parse_str(id) {
Ok(id) => id,
Err(why) => {
Err(_why) => {
let error_msg = format!("Failed to parse report id: {}", id);
error!("{}", error_msg);
return Err(poise::SlashArgError::Parse {
error: Box::new(why),
input: id.to_string(),
});
// return Err(poise::SlashArgError::Parse {
// error: Box::new(why),
// input: id.to_string(),
// });
// FIXME: SlashArgError::Parse is marked as non_exhaustive, thus it can't be
// constructed.
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Failed to parse report id",
));
}
},
_ => {
return Err(poise::SlashArgError::CommandStructureMismatch(
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Report id must be a string",
))
}
Expand All @@ -244,17 +252,22 @@ impl SlashArgument for Report {
Err(why) => {
let error_msg = format!("Failed to get report: {}", why);
error!("{}", error_msg);
return Err(poise::SlashArgError::Parse {
error: why.into(),
input: id.to_string(),
});
// return Err(poise::SlashArgError::Parse {
// error: why.into(),
// input: id.to_string(),
// });
// FIXME: SlashArgError::Parse is marked as non_exhaustive, thus it can't be
// constructed.
return Err(poise::SlashArgError::new_command_structure_mismatch(
"Failed to get report",
));
}
};

Ok(report)
}

fn create(builder: &mut serenity::CreateApplicationCommandOption) {
builder.kind(serenity::command::CommandOptionType::String);
fn create(builder: CreateCommandOption) -> CreateCommandOption {
builder.kind(poise::serenity_prelude::CommandOptionType::String)
}
}
Loading

0 comments on commit 0f1f4df

Please sign in to comment.