1 commit a29b8fb3146e318ba3fd9a084859f2e39553c084
2 Author: Elan Ruusamäe <glen@delfi.ee>
3 Date: Wed Feb 10 09:35:53 2016 +0200
10 src/Header/HeaderWrap.php
12 diff --git a/src/Header/HeaderWrap.php b/src/Header/HeaderWrap.php
13 index df532edc..e0be2f56 100644
14 --- a/src/Header/HeaderWrap.php
15 +++ b/src/Header/HeaderWrap.php
16 @@ -116,7 +116,21 @@ abstract class HeaderWrap
18 public static function canBeEncoded($value)
20 - $encoded = iconv_mime_encode('x-test', $value, array('scheme' => 'Q'));
21 + // avoid any wrapping by specifying line length long enough
23 + // "x-test: =?ISO-8859-1?B?dGVzdA==?=" -> 33
26 + $line_length = strlen($value) * 4 + strlen($charset) + 16;
28 + $preferences = array(
30 + 'input-charset' => $charset,
31 + 'output-charset' => $charset,
32 + 'line-length' => $line_length,
35 + $encoded = iconv_mime_encode('x-test', $value, $preferences);
37 return (false !== $encoded);
40 commit 755b22727a126608611b6a58c289ad6744db21a9
41 Merge: 6034313f 393b43c9
42 Author: Elan Ruusamäe <glen@delfi.ee>
43 Date: Mon Feb 15 11:51:30 2016 +0200
45 Merge tag 'release-2.4.9' into develop-2.4
52 commit 222ace2631198f7498ae7c3799caaf6fc3a7936a
53 Merge: 755b2272 c1c73d7f
54 Author: Elan Ruusamäe <glen@delfi.ee>
55 Date: Fri Jan 13 17:39:32 2017 +0200
57 Merge tag 'release-2.4.11' into develop-2.4
79 - Fixes the [ZF2016-04 advisory](https://framework.zend.com/security/advisory/ZF2016-04)
80 ("Potential remote code execution in zend-mail via Sendmail adapter").
82 commit 8493b2a0610c59fbeeaf0ffc44340810d4d84d93
83 Author: Etienne CHAMPETIER <etienne.champetier@fiducial.net>
84 Date: Fri May 29 14:32:09 2015 +0200
86 Headers: fix bad sprintf call
88 Signed-off-by: Etienne CHAMPETIER <etienne.champetier@fiducial.net>
90 diff --git a/src/Headers.php b/src/Headers.php
91 index 3ceb10be..b416f52a 100644
94 @@ -220,6 +220,7 @@ class Headers implements Countable, Iterator
95 if (!is_string($headerFieldNameOrLine)) {
96 throw new Exception\InvalidArgumentException(sprintf(
97 '%s expects its first argument to be a string; received "%s"',
99 (is_object($headerFieldNameOrLine)
100 ? get_class($headerFieldNameOrLine)
101 : gettype($headerFieldNameOrLine))
103 commit 66eeb12567335f3a23aea7538a82e9a144464427
104 Author: Denis Sokolov <denis@sokolov.cc>
105 Date: Wed Jun 10 16:44:27 2015 +0300
107 Handle simple comments in address lists
109 diff --git a/src/Header/AbstractAddressList.php b/src/Header/AbstractAddressList.php
110 index e7db7240..b13f9ebd 100644
111 --- a/src/Header/AbstractAddressList.php
112 +++ b/src/Header/AbstractAddressList.php
113 @@ -63,6 +63,7 @@ abstract class AbstractAddressList implements HeaderInterface
116 $value = trim($value);
117 + $value = self::stripComments($value);
121 @@ -155,4 +156,19 @@ abstract class AbstractAddressList implements HeaderInterface
122 $value = $this->getFieldValue(HeaderInterface::FORMAT_ENCODED);
123 return (empty($value)) ? '' : sprintf('%s: %s', $name, $value);
126 + // Supposed to be private, protected as a workaround for PHP bug 68194
127 + protected static function stripComments($value)
129 + return preg_replace(
142 commit 5064f95148c1d996b5b25bc556830da9a8458e6a
143 Author: Denis Sokolov <denis@sokolov.cc>
144 Date: Thu Jun 11 13:27:04 2015 +0300
146 Handle groups in address lists
148 diff --git a/src/Header/AbstractAddressList.php b/src/Header/AbstractAddressList.php
149 index b13f9ebd..e0b4e78c 100644
150 --- a/src/Header/AbstractAddressList.php
151 +++ b/src/Header/AbstractAddressList.php
152 @@ -58,6 +58,7 @@ abstract class AbstractAddressList implements HeaderInterface
154 // split value on ","
155 $fieldValue = str_replace(Headers::FOLDING, ' ', $fieldValue);
156 + $fieldValue = preg_replace('/[^:]+:([^;]*);/', '$1,', $fieldValue);
157 $values = str_getcsv($fieldValue, ',');
160 @@ -66,6 +67,7 @@ abstract class AbstractAddressList implements HeaderInterface
161 $value = self::stripComments($value);
164 + $values = array_filter($values);
166 $addressList = $header->getAddressList();
167 foreach ($values as $address) {
169 commit ebdc224fb6847c39e9691631eef23b3b1c3eb6a0
170 Author: Stefano Torresi <stefano@torresi.io>
171 Date: Wed Jun 3 17:33:40 2015 +0200
173 fixes zendframework/zf2#7555
175 diff --git a/src/Header/Sender.php b/src/Header/Sender.php
176 index 2efc23bf..e7bcac63 100644
177 --- a/src/Header/Sender.php
178 +++ b/src/Header/Sender.php
179 @@ -39,25 +39,23 @@ class Sender implements HeaderInterface
181 // check to ensure proper header type for this factory
182 if (strtolower($name) !== 'sender') {
183 - throw new Exception\InvalidArgumentException('Invalid header line for Sender string');
184 + throw new Exception\InvalidArgumentException('Invalid header name for Sender string');
187 - $header = new static();
190 + $header = new static();
191 + $hasMatches = preg_match('/^(?:(?P<name>.+)\s)?(?(name)<|<?)(?P<email>[^\s]+?)(?(name)>|>?)$/', $value, $matches);
193 - // Check for address, and set if found
194 - if (preg_match('/^(?P<name>.*?)<(?P<email>[^>]+)>$/', $value, $matches)) {
195 - $senderName = trim($matches['name']);
196 - if (empty($senderName)) {
197 - $senderName = null;
199 - $senderEmail = $matches['email'];
201 - $senderEmail = $value;
202 + if ($hasMatches !== 1) {
203 + throw new Exception\InvalidArgumentException('Invalid header value for Sender string');
206 + $senderName = trim($matches['name']);
208 + if (empty($senderName)) {
209 + $senderName = null;
212 - $header->setAddress($senderEmail, $senderName);
213 + $header->setAddress($matches['email'], $senderName);
218 commit c012507f8ae08eb92edb022c290d84dd9966fb46
219 Author: Stefano Torresi <stefano@torresi.io>
220 Date: Mon Oct 26 20:26:11 2015 +0100
224 diff --git a/src/Header/Sender.php b/src/Header/Sender.php
225 index e7bcac63..9f532949 100644
226 --- a/src/Header/Sender.php
227 +++ b/src/Header/Sender.php
228 @@ -43,6 +43,12 @@ class Sender implements HeaderInterface
231 $header = new static();
234 + * matches the header value so that the email must be enclosed by < > when a name is present
235 + * 'name' and 'email' capture groups correspond respectively to 'display-name' and 'addr-spec' in the ABNF
236 + * @see https://tools.ietf.org/html/rfc5322#section-3.4
238 $hasMatches = preg_match('/^(?:(?P<name>.+)\s)?(?(name)<|<?)(?P<email>[^\s]+?)(?(name)>|>?)$/', $value, $matches);
240 if ($hasMatches !== 1) {
242 commit bfe40077aeed5c2cf401d23d0508d63b5c44d8c6
243 Author: Elan Ruusamäe <glen@delfi.ee>
244 Date: Sun Jan 31 00:03:58 2016 +0200
246 add format param to toArray
248 this allows exporting headers in raw or encoded form
250 diff --git a/src/Headers.php b/src/Headers.php
251 index b416f52a..c05cde1b 100644
252 --- a/src/Headers.php
253 +++ b/src/Headers.php
254 @@ -430,10 +430,11 @@ class Headers implements Countable, Iterator
256 * Return the headers container as an array
258 - * @todo determine how to produce single line headers, if they are supported
259 + * @param bool $format Return the values in Mime::Encoded or in Raw format
261 + * @todo determine how to produce single line headers, if they are supported
263 - public function toArray()
264 + public function toArray($format = Header\HeaderInterface::FORMAT_RAW)
267 /* @var $header Header\HeaderInterface */
268 @@ -443,9 +444,9 @@ class Headers implements Countable, Iterator
269 if (!isset($headers[$name])) {
270 $headers[$name] = array();
272 - $headers[$name][] = $header->getFieldValue();
273 + $headers[$name][] = $header->getFieldValue($format);
275 - $headers[$header->getFieldName()] = $header->getFieldValue();
276 + $headers[$header->getFieldName()] = $header->getFieldValue($format);