gwynne Tue, 01 Dec 2009 04:29:13 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=291534
Log: 1) sanitize Subject and From headers more thorughly, 2) calculate large email sizes more correctly Changed paths: U SVNROOT/commit-email.php Modified: SVNROOT/commit-email.php =================================================================== --- SVNROOT/commit-email.php 2009-12-01 02:05:28 UTC (rev 291533) +++ SVNROOT/commit-email.php 2009-12-01 04:29:13 UTC (rev 291534) @@ -162,18 +162,37 @@ } // ----------------------------------------------------------------------------------------------------------------------------- +// Safely utf-8-ize an email header with the short version of quoted-printable +function utf8_safe_header($header_value) +{ + // As per experience and http://www.php.net/manual/en/function.imap-8bit.php#75081 + // 1 - Limit string to 900 chars, giving some slop for the replacements and extensions + // 2 - imap_8bit() the string + // 3 - Replace =\r\n with nothing, _ with =5F, and ? with =3F + // 6 - Replace <space> with _ + // 7 - Surround with =?utf-8?q??= + return '=?utf-8?q?' . str_replace(' ', '_', str_replace(array('_', "=\r\n", '?'), array('=5F', '', '=3F'), + imap_8bit(substr($header_value, 0, 900)))) . '?='; +} + +// ----------------------------------------------------------------------------------------------------------------------------- // Build e-mail $boundary = sha1("{$commit_info['author']}{$commit_info['date']}"); $messageid = "{$commit_info['author']}-{$commit_info['date']}-{$REV}-" . mt_rand(); -$subject = substr("svn: {$paths_list}", 0, 970); // Max SMTP line length = 998. Some slop in this value. +$subject = utf8_safe_header("svn: {$paths_list}"); $email_date = date(DATE_RFC2822, $commit_info['date']); -$fullname = "=?utf-8?q?" . imap_8bit(str_replace(array('?', ' '), array('=3F', '_'), $commit_info['author_name'])) . "?="; +$fullname = utf8_safe_header($commit_info['author_name']); $email_list = implode(', ', $emails_to); $readable_path_list = " " . implode(PHP_EOL . " ", $commit_info['raw_changed_paths']); $nspaces = str_repeat(" ", max(1, 72 - strlen($commit_info['author']) - strlen($email_date))); -// Help ensure all commits make it to the mailing lists, which have size restrictions -if ((strlen($readable_path_list) + $diffs_length) > 262144) { +// Help ensure all commits make it to the mailing lists, which have size restrictions. +// Add the path list length to: 1) the diff string length (which will be zero if diffs ARE attached), and +// 2) the diff data length (which will be zero if diffs are NOT attached). +// If the total is larger than 256K, don't include the path list. If it still goes over the limit even after that, +// the email is gonna be too big to send no matter what we do. +$diff_data = $diffs_string === NULL ? wordwrap(base64_encode($commit_info['diffs']), 80, PHP_EOL, TRUE) : ''; +if ((strlen($readable_path_list) + strlen($diffs_string) + strlen($diff_data)) > 262144) { $readable_path_list = '<changed paths exceeded maximum size>'; } @@ -205,7 +224,6 @@ MIMEBODY; if ($diffs_string === NULL) { - $diff_data = wordwrap(base64_encode($commit_info['diffs']), 80, PHP_EOL, TRUE); $msg_body .= <<<MIMEBODY Content-Type: text/x-diff; charset="utf-8"
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php