Skip to content
Snippets Groups Projects
Unverified Commit cbb1ba45 authored by codecraft's avatar codecraft :crocodile:
Browse files

fix: make badges enable and disableable

parent b53be027
Branches main
No related tags found
No related merge requests found
......@@ -26,7 +26,8 @@ struct Config {
feather_db_path: PathBuf,
build_env: PathBuf,
secrets: PathBuf,
badges: BadgeConfig,
enable_badges: bool,
badges: Option<BadgeConfig>,
#[serde(default = "default_addr")]
address: SocketAddr,
}
......@@ -44,7 +45,7 @@ struct BadgeConfig {
#[derive(serde::Deserialize, serde::Serialize, Debug)]
struct Secrets {
badges: BadgeSecrets,
badges: Option<BadgeSecrets>,
}
#[derive(serde::Deserialize, serde::Serialize, Debug)]
......@@ -53,7 +54,7 @@ struct BadgeSecrets {
}
async fn handle_request<T: AsyncReadExt + AsyncWriteExt + Unpin>(
data: Arc<(Config, Ctf, FlagDb, State, BadgeIssuer)>,
data: Arc<(Config, Ctf, FlagDb, State, Option<BadgeIssuer>)>,
mut stream: T,
) {
loop {
......@@ -132,9 +133,10 @@ async fn handle_request<T: AsyncReadExt + AsyncWriteExt + Unpin>(
},
already_redeemed: false,
finished_everything,
sends_badges: data.4.is_some(),
redeem_token: None,
};
if finished_everything {
if finished_everything && data.4.is_some() {
let already_collected = match data
.2
.set_collected_flag(message.authentication())
......@@ -147,11 +149,13 @@ async fn handle_request<T: AsyncReadExt + AsyncWriteExt + Unpin>(
}
};
submission_response.already_redeemed = already_collected;
if !already_collected {
match data.4.issue_onetime_redeem_token().await {
Ok(token) => submission_response.redeem_token = Some(token),
Err(err) => {
log::error!(target: "feather-submission", "Failed to get redeem token for user {} from API: `{err}`", message.authentication())
if let Some(issuer) = &data.4 {
if !already_collected {
match issuer.issue_onetime_redeem_token().await {
Ok(token) => submission_response.redeem_token = Some(token),
Err(err) => {
log::error!(target: "feather-submission", "Failed to get redeem token for user {} from API: `{err}`", message.authentication())
}
}
}
}
......@@ -324,12 +328,20 @@ async fn main() -> std::process::ExitCode {
];
let ctf = Ctf::new(challenges.into_iter());
let flag_db = FlagDb::new(config.feather_db_path.clone());
let badge_issuer = BadgeIssuer::new(
secrets.badges.token,
config.badges.c3hub_api_root.clone(),
config.badges.assembly_slug.clone(),
config.badges.badge_uuid,
);
let badge_issuer = if config.enable_badges {
if let Some(badge_config) = &config.badges {
Some(BadgeIssuer::new(
secrets.badges.unwrap().token,
badge_config.c3hub_api_root.clone(),
badge_config.assembly_slug.clone(),
badge_config.badge_uuid,
))
} else {
panic!("if badges are enabled badge config must be enabled")
}
} else {
None
};
log::info!("Now listening on: `{}`", config.address);
let data = Arc::new((config, ctf, flag_db, State::default(), badge_issuer));
tokio::task::spawn(async move {
......
......@@ -228,12 +228,15 @@ async fn main() -> ExitCode {
println!("Redeem Token: {}\nIf you want to play again, you can reset your progress", redeem_token);
} else if response.already_redeemed {
println!("You already collected your badge");
} else if response.finished_everything {
} else if response.finished_everything && response.sends_badges {
log::error!("Something went wrong while trying to fetch your badge :(. you can still receive it, just talk to us!")
} else {
return ExitCode::SUCCESS;
}
println!("If you want to, you can also reset your progress, but you won't receive another badge for it.")
println!("If you want to, you can also reset your progress.");
if response.sends_badges {
println!("But you won't receive another badge for it");
}
}
ApprovalStatus::Disapproved => println!("Maybe next time! :("),
}
......
......@@ -37,6 +37,7 @@ pub struct SubmissionResponse {
pub approval_status: ApprovalStatus,
pub finished_everything: bool,
pub already_redeemed: bool,
pub sends_badges: bool,
pub redeem_token: Option<String>,
}
......@@ -210,7 +211,8 @@ impl Response {
};
let redeem_token_len =
unsafe { response.response_body.submission_response.redeem_token_len };
let redeem_token = if redeem_token_len != 0 {
let sends_badges = unsafe { response.response_body.submission_response.sends_badges };
let redeem_token = if redeem_token_len != 0 && sends_badges {
let mut redeem_token = vec![0; redeem_token_len];
readable.read_exact(&mut redeem_token).await?;
Some(
......@@ -226,6 +228,7 @@ impl Response {
unsafe { response.response_body.submission_response.already_redeemed };
Ok(Self::SubmissionResponse(SubmissionResponse {
approval_status,
sends_badges,
finished_everything,
redeem_token,
already_redeemed,
......@@ -382,6 +385,7 @@ pub mod primitives {
pub struct SubmissionResponse {
pub approval_status: ApprovalStatus,
pub finished_everything: bool,
pub sends_badges: bool,
pub already_redeemed: bool,
pub redeem_token_len: usize,
}
......@@ -604,6 +608,7 @@ pub mod primitives {
super::Response::SubmissionResponse(response) => ResponseBody {
submission_response: SubmissionResponse {
approval_status: response.approval_status,
sends_badges: response.sends_badges,
finished_everything: response.finished_everything,
already_redeemed: response.already_redeemed,
redeem_token_len: match &response.redeem_token {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment