From 61165f10ee78d7c8c86fc56afdb94cf59cfc5b90 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 18 Oct 2013 09:56:56 +0200 Subject: [PATCH 1/3] [mail] Remove unnecessary case insensitive lowercase and uppercase characters are already included in the range --- library/Zend/Mail/Header/GenericHeader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Zend/Mail/Header/GenericHeader.php b/library/Zend/Mail/Header/GenericHeader.php index cc48385a67b..a9eac55515c 100644 --- a/library/Zend/Mail/Header/GenericHeader.php +++ b/library/Zend/Mail/Header/GenericHeader.php @@ -76,7 +76,7 @@ public function setFieldName($fieldName) $fieldName = str_replace(' ', '-', ucwords(str_replace(array('_', '-'), ' ', $fieldName))); // Validate what we have - if (!preg_match('/^[\x21-\x39\x3B-\x7E]*$/i', $fieldName)) { + if (!preg_match('/^[\x21-\x39\x3B-\x7E]*$/', $fieldName)) { throw new Exception\InvalidArgumentException( 'Header name must be composed of printable US-ASCII characters, except colon.' ); From 32b2859cc20bbb4ffc16551e651228862599d459 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 18 Oct 2013 10:15:12 +0200 Subject: [PATCH 2/3] [mail] Fix assignment to protected methods --- library/Zend/Mail/Header/Date.php | 8 ++++++-- library/Zend/Mail/Header/MimeVersion.php | 2 +- library/Zend/Mail/Header/Received.php | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/library/Zend/Mail/Header/Date.php b/library/Zend/Mail/Header/Date.php index ff7604e2d7b..2137e13611a 100644 --- a/library/Zend/Mail/Header/Date.php +++ b/library/Zend/Mail/Header/Date.php @@ -28,12 +28,16 @@ public static function fromString($headerLine) throw new Exception\InvalidArgumentException('Invalid header line for Date string'); } - $header = new static(); - $header->value= $value; + $header = new static($value); return $header; } + public function __construct($value) + { + $this->value = $value; + } + public function getFieldName() { return 'Date'; diff --git a/library/Zend/Mail/Header/MimeVersion.php b/library/Zend/Mail/Header/MimeVersion.php index 2a98426eb86..5d7b136e6e7 100644 --- a/library/Zend/Mail/Header/MimeVersion.php +++ b/library/Zend/Mail/Header/MimeVersion.php @@ -28,7 +28,7 @@ public static function fromString($headerLine) // Check for version, and set if found $header = new static(); if (preg_match('/^(?P\d+\.\d+)$/', $value, $matches)) { - $header->version = $matches['version']; + $header->setVersion($matches['version']); } return $header; diff --git a/library/Zend/Mail/Header/Received.php b/library/Zend/Mail/Header/Received.php index 36b3804522a..6ae3035791f 100644 --- a/library/Zend/Mail/Header/Received.php +++ b/library/Zend/Mail/Header/Received.php @@ -30,12 +30,16 @@ public static function fromString($headerLine) throw new Exception\InvalidArgumentException('Invalid header line for Received string'); } - $header = new static(); - $header->value= $value; + $header = new static($value); return $header; } + public function __construct($value = '') + { + $this->value = $value; + } + public function getFieldName() { return 'Received'; From a73d1f41f74de6d59f9a5f20e626096127bb026f Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 18 Oct 2013 10:16:14 +0200 Subject: [PATCH 3/3] [mail] Unify criteria for split fieldname and fieldvalue in the header line. Also adds @throws tag to interface method docblock. --- .../Zend/Mail/Header/AbstractAddressList.php | 4 +-- library/Zend/Mail/Header/ContentType.php | 2 +- library/Zend/Mail/Header/Date.php | 2 +- library/Zend/Mail/Header/GenericHeader.php | 26 +++++++++++++++---- .../Zend/Mail/Header/GenericMultiHeader.php | 6 +---- library/Zend/Mail/Header/HeaderInterface.php | 2 ++ library/Zend/Mail/Header/MessageId.php | 2 +- library/Zend/Mail/Header/MimeVersion.php | 2 +- library/Zend/Mail/Header/Received.php | 2 +- library/Zend/Mail/Header/Sender.php | 2 +- library/Zend/Mail/Header/Subject.php | 3 +-- tests/ZendTest/Mail/HeadersTest.php | 5 +++- 12 files changed, 36 insertions(+), 22 deletions(-) diff --git a/library/Zend/Mail/Header/AbstractAddressList.php b/library/Zend/Mail/Header/AbstractAddressList.php index 6f801933a3c..0a34619e587 100644 --- a/library/Zend/Mail/Header/AbstractAddressList.php +++ b/library/Zend/Mail/Header/AbstractAddressList.php @@ -43,9 +43,7 @@ public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); // split into name/value - list($fieldName, $fieldValue) = explode(':', $decodedLine, 2); - $fieldName = trim($fieldName); - $fieldValue = trim($fieldValue); + list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($decodedLine); if (strtolower($fieldName) !== static::$type) { throw new Exception\InvalidArgumentException(sprintf( diff --git a/library/Zend/Mail/Header/ContentType.php b/library/Zend/Mail/Header/ContentType.php index 9ae46b3289b..ab8a373ecf0 100644 --- a/library/Zend/Mail/Header/ContentType.php +++ b/library/Zend/Mail/Header/ContentType.php @@ -26,7 +26,7 @@ class ContentType implements HeaderInterface public static function fromString($headerLine) { $headerLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'content-type') { diff --git a/library/Zend/Mail/Header/Date.php b/library/Zend/Mail/Header/Date.php index 2137e13611a..2f2cae88d82 100644 --- a/library/Zend/Mail/Header/Date.php +++ b/library/Zend/Mail/Header/Date.php @@ -21,7 +21,7 @@ class Date implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'date') { diff --git a/library/Zend/Mail/Header/GenericHeader.php b/library/Zend/Mail/Header/GenericHeader.php index a9eac55515c..8db9d943e1f 100644 --- a/library/Zend/Mail/Header/GenericHeader.php +++ b/library/Zend/Mail/Header/GenericHeader.php @@ -31,17 +31,33 @@ class GenericHeader implements HeaderInterface, UnstructuredInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - $parts = explode(':', $decodedLine, 2); - if (count($parts) != 2) { - throw new Exception\InvalidArgumentException('Header must match with the format "name: value"'); - } - $header = new static($parts[0], ltrim($parts[1])); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); + $header = new static($name, $value); if ($decodedLine != $headerLine) { $header->setEncoding('UTF-8'); } return $header; } + /** + * Splits the header line in `name` and `value` parts. + * + * @param string $headerLine + * @return string[] `name` in the first index and `value` in the second. + * @throws Exception\InvalidArgumentException If header does not match with the format ``name:value`` + */ + public static function splitHeaderLine($headerLine) + { + $parts = explode(':', $headerLine, 2); + if (count($parts) !== 2) { + throw new Exception\InvalidArgumentException('Header must match with the format "name:value"'); + } + + $parts[1] = ltrim($parts[1]); + + return $parts; + } + /** * Constructor * diff --git a/library/Zend/Mail/Header/GenericMultiHeader.php b/library/Zend/Mail/Header/GenericMultiHeader.php index 2c56d7a904a..a77ba43d531 100644 --- a/library/Zend/Mail/Header/GenericMultiHeader.php +++ b/library/Zend/Mail/Header/GenericMultiHeader.php @@ -17,11 +17,7 @@ class GenericMultiHeader extends GenericHeader implements MultipleHeadersInterfa public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - $parts = explode(': ', $decodedLine, 2); - if (count($parts) != 2) { - throw new Exception\InvalidArgumentException('Header must match with the format "name: value"'); - } - list($fieldName, $fieldValue) = $parts; + list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($decodedLine); if (strpos($fieldValue, ',')) { $headers = array(); diff --git a/library/Zend/Mail/Header/HeaderInterface.php b/library/Zend/Mail/Header/HeaderInterface.php index 5ff0e8d30b4..35803cf9bfa 100644 --- a/library/Zend/Mail/Header/HeaderInterface.php +++ b/library/Zend/Mail/Header/HeaderInterface.php @@ -31,6 +31,8 @@ interface HeaderInterface * * @param string $headerLine * @return self + * @throws Exception\InvalidArgumentException If the header does not match with RFC 2822 definition. + * @see http://tools.ietf.org/html/rfc2822#section-2.2 */ public static function fromString($headerLine); diff --git a/library/Zend/Mail/Header/MessageId.php b/library/Zend/Mail/Header/MessageId.php index a399e2b64cb..27ef7156397 100644 --- a/library/Zend/Mail/Header/MessageId.php +++ b/library/Zend/Mail/Header/MessageId.php @@ -20,7 +20,7 @@ class MessageId implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'message-id') { diff --git a/library/Zend/Mail/Header/MimeVersion.php b/library/Zend/Mail/Header/MimeVersion.php index 5d7b136e6e7..52474e4a4fe 100644 --- a/library/Zend/Mail/Header/MimeVersion.php +++ b/library/Zend/Mail/Header/MimeVersion.php @@ -18,7 +18,7 @@ class MimeVersion implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'mime-version') { diff --git a/library/Zend/Mail/Header/Received.php b/library/Zend/Mail/Header/Received.php index 6ae3035791f..5ff26cd8a17 100644 --- a/library/Zend/Mail/Header/Received.php +++ b/library/Zend/Mail/Header/Received.php @@ -23,7 +23,7 @@ class Received implements HeaderInterface, MultipleHeadersInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'received') { diff --git a/library/Zend/Mail/Header/Sender.php b/library/Zend/Mail/Header/Sender.php index 4dd1be32e8b..20d329e2a88 100644 --- a/library/Zend/Mail/Header/Sender.php +++ b/library/Zend/Mail/Header/Sender.php @@ -28,7 +28,7 @@ class Sender implements HeaderInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(': ', $decodedLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'sender') { diff --git a/library/Zend/Mail/Header/Subject.php b/library/Zend/Mail/Header/Subject.php index 8f40d95f978..0a149340814 100644 --- a/library/Zend/Mail/Header/Subject.php +++ b/library/Zend/Mail/Header/Subject.php @@ -26,8 +26,7 @@ class Subject implements UnstructuredInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(':', $decodedLine, 2); - $value = ltrim($value); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'subject') { diff --git a/tests/ZendTest/Mail/HeadersTest.php b/tests/ZendTest/Mail/HeadersTest.php index 2122d12e2ba..0f99a14cbf8 100644 --- a/tests/ZendTest/Mail/HeadersTest.php +++ b/tests/ZendTest/Mail/HeadersTest.php @@ -138,7 +138,10 @@ public function testHeadersAggregatesHeaderThroughAddHeaderLine() public function testHeadersAddHeaderLineThrowsExceptionOnMissingFieldValue() { - $this->setExpectedException('Zend\Mail\Header\Exception\InvalidArgumentException', 'Header must match with the format "name: value"'); + $this->setExpectedException( + 'Zend\Mail\Header\Exception\InvalidArgumentException', + 'Header must match with the format "name:value"' + ); $headers = new Mail\Headers(); $headers->addHeaderLine('Foo'); }