diff options
Diffstat (limited to 'src/validate.rs')
-rw-r--r-- | src/validate.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/validate.rs b/src/validate.rs index a114ebc..45c0d0a 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -12,6 +12,7 @@ pub(crate) fn validate(data: &Data) -> Result<(), Error> { validate_list_email_addresses(data, &mut errors); validate_list_extra_people(data, &mut errors); validate_list_extra_teams(data, &mut errors); + validate_list_addresses(data, &mut errors); validate_discord_name(data, &mut errors); if !errors.is_empty() { @@ -46,7 +47,7 @@ fn validate_team_leads(data: &Data, errors: &mut Vec<String>) { }); } -/// Ensure team members are people +/// Ensure t_eam members are people fn validate_team_members(data: &Data, errors: &mut Vec<String>) { wrapper(data.teams(), errors, |team, errors| { wrapper(team.members(data)?.iter(), errors, |member, _| { @@ -142,6 +143,25 @@ fn validate_list_extra_teams(data: &Data, errors: &mut Vec<String>) { }); } +/// Ensure the list addresses are correct +fn validate_list_addresses(data: &Data, errors: &mut Vec<String>) { + let email_re = Regex::new(r"^[a-zA-Z0-9_\.-]+@([a-zA-Z0-9_\.-]+)$").unwrap(); + let config = data.config().allowed_mailing_lists_domains(); + wrapper(data.teams(), errors, |team, errors| { + wrapper(team.raw_lists().iter(), errors, |list, _| { + if let Some(captures) = email_re.captures(&list.address) { + if !config.contains(&captures[1]) { + bail!("list address on a domain we don't own: `{}`", list.address); + } + } else { + bail!("invalid list address: `{}`", list.address); + } + Ok(()) + }); + Ok(()) + }); +} + /// Ensure the Discord name is formatted properly fn validate_discord_name(data: &Data, errors: &mut Vec<String>) { // https://discordapp.com/developers/docs/resources/user#usernames-and-nicknames |