Skip to content

Commit 5a623b2

Browse files
author
Pietro Albini
authored
Merge pull request #345 from rust-lang/validate-discord-permissions
2 parents 6bcb5fe + 52408ba commit 5a623b2

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

src/permissions.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ macro_rules! permissions {
8181
$(concat!("crates_io_ops_bot.", stringify!($crates_io_ops_app)),)*
8282
];
8383

84+
pub(crate) const REQUIRES_DISCORD: &'static [&'static str] = &[
85+
$(concat!("crates_io_ops_bot.", stringify!($crates_io_ops_app)),)*
86+
];
87+
8488
pub(crate) fn has(&self, permission: &str) -> bool {
8589
self.has_directly(permission) || self.has_indirectly(permission)
8690
}

src/validate.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ static CHECKS: &[fn(&Data, &mut Vec<String>)] = &[
2424
validate_team_names,
2525
validate_github_teams,
2626
validate_marker_team,
27+
validate_discord_permissions,
2728
];
2829

2930
static GITHUB_CHECKS: &[fn(&Data, &GitHubApi, &mut Vec<String>)] = &[validate_github_usernames];
@@ -435,6 +436,46 @@ fn validate_marker_team(data: &Data, errors: &mut Vec<String>) {
435436
});
436437
}
437438

439+
/// Ensure all users with a Discord permission have a Discord ID.
440+
fn validate_discord_permissions(data: &Data, errors: &mut Vec<String>) {
441+
wrapper(
442+
Permissions::REQUIRES_DISCORD.iter(),
443+
errors,
444+
|permission, errors| {
445+
wrapper(data.people(), errors, |person, _| {
446+
if person.permissions().has(permission) && person.discord_id().is_none() {
447+
bail!(
448+
"person `{}` has a Discord permission (`{}`) but no Discord ID",
449+
person.github(),
450+
permission
451+
);
452+
}
453+
Ok(())
454+
});
455+
wrapper(data.teams(), errors, |team, errors| {
456+
if !team.permissions().has(permission) {
457+
return Ok(());
458+
}
459+
wrapper(team.members(data)?.iter(), errors, |member, _| {
460+
let person = data
461+
.person(member)
462+
.ok_or_else(|| failure::format_err!("missing person {}", member))?;
463+
if person.discord_id().is_none() {
464+
bail!(
465+
"person `{}` has a Discord permission (`{}`) but no Discord ID",
466+
person.github(),
467+
permission
468+
);
469+
}
470+
Ok(())
471+
});
472+
Ok(())
473+
});
474+
Ok(())
475+
},
476+
);
477+
}
478+
438479
fn wrapper<T, I, F>(iter: I, errors: &mut Vec<String>, mut func: F)
439480
where
440481
I: Iterator<Item = T>,

0 commit comments

Comments
 (0)