Skip to content

Commit

Permalink
Metadata: escape display name in email addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
robsdedude committed Nov 2, 2023
1 parent 32a51d5 commit 144fd74
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ impl Metadata21 {
for author in authors {
match (&author.name, &author.email) {
(Some(name), Some(email)) => {
emails.push(format!("{name} <{email}>"));
emails.push(format_email_with_display_name(name, email));
}
(Some(name), None) => {
names.push(name.as_str());
Expand All @@ -251,7 +251,7 @@ impl Metadata21 {
for maintainer in maintainers {
match (&maintainer.name, &maintainer.email) {
(Some(name), Some(email)) => {
emails.push(format!("{name} <{email}>"));
emails.push(format_email_with_display_name(name, email));
}
(Some(name), None) => {
names.push(name.as_str());
Expand Down Expand Up @@ -555,6 +555,23 @@ impl Metadata21 {
}
}

/// Escape email addresses with display name if necessary
/// according to RFC 822 Section 3.3. "specials".
fn format_email_with_display_name(mut display_name: &str, email: &str) -> String {
if display_name.chars().any(|c| {
matches!(
c,
'(' | ')' | '<' | '>' | '@' | ',' | ';' | ':' | '\\' | '"' | '.' | '[' | ']'
)
}) {
return format!(
"\"{}\" <{email}>",
display_name.replace("\\", "\\\\").replace("\"", "\\\"")
);
}
format!("{display_name} <{email}>")
}

/// Fold long header field according to RFC 5322 section 2.2.3
/// https://datatracker.ietf.org/doc/html/rfc5322#section-2.2.3
fn fold_header(text: &str) -> String {
Expand Down

0 comments on commit 144fd74

Please sign in to comment.