Skip to content

Commit a6b765b

Browse files
committed
Fix undefined attachment name when headers use "filename*=" format Webklex#301
1 parent 5548db5 commit a6b765b

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

src/Header.php

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public function rfc822_parse_headers($raw_headers): object {
214214
$headers = [];
215215
$imap_headers = [];
216216
if (extension_loaded('imap') && $this->config["rfc822"]) {
217-
$raw_imap_headers = (array)\imap_rfc822_parse_headers($this->raw);
217+
$raw_imap_headers = (array)\imap_rfc822_parse_headers($raw_headers);
218218
foreach ($raw_imap_headers as $key => $values) {
219219
$key = str_replace("-", "_", $key);
220220
$imap_headers[$key] = $values;
@@ -594,11 +594,9 @@ private function parseAddresses($list): array {
594594
} else {
595595
$personalParts = $this->mime_header_decode($address->personal);
596596

597-
if (is_array($personalParts)) {
598-
$address->personal = '';
599-
foreach ($personalParts as $p) {
600-
$address->personal .= $this->convertEncoding($p->text, $this->getEncoding($p));
601-
}
597+
$address->personal = '';
598+
foreach ($personalParts as $p) {
599+
$address->personal .= $this->convertEncoding($p->text, $this->getEncoding($p));
602600
}
603601

604602
if (str_starts_with($address->personal, "'")) {
@@ -629,24 +627,55 @@ private function extractHeaderExtensions(): void {
629627
if (($key == "user_agent") === false) {
630628
if (($pos = strpos($value, ";")) !== false) {
631629
$original = substr($value, 0, $pos);
632-
$this->set($key, trim(rtrim($original)), true);
630+
$this->set($key, trim(rtrim($original)));
633631

634632
// Get all potential extensions
635633
$extensions = explode(";", substr($value, $pos + 1));
634+
$previousKey = null;
635+
$previousValue = '';
636+
636637
foreach ($extensions as $extension) {
637638
if (($pos = strpos($extension, "=")) !== false) {
638639
$key = substr($extension, 0, $pos);
639640
$key = trim(rtrim(strtolower($key)));
640641

642+
$matches = [];
643+
644+
if (preg_match('/^(?P<key_name>\w+)\*/', $key, $matches) !== 0) {
645+
$key = $matches['key_name'];
646+
$previousKey = $key;
647+
648+
$value = substr($extension, $pos + 1);
649+
$value = str_replace('"', "", $value);
650+
$previousValue .= trim(rtrim($value));
651+
652+
continue;
653+
}
654+
655+
if (
656+
$previousKey !== null
657+
&& $previousKey !== $key
658+
&& isset($this->attributes[$previousKey]) === false
659+
) {
660+
$this->set($previousKey, $previousValue);
661+
662+
$previousValue = '';
663+
}
664+
641665
if (isset($this->attributes[$key]) === false) {
642666
$value = substr($extension, $pos + 1);
643667
$value = str_replace('"', "", $value);
644668
$value = trim(rtrim($value));
645669

646670
$this->set($key, $value);
647671
}
672+
673+
$previousKey = $key;
648674
}
649675
}
676+
if ($previousValue !== '') {
677+
$this->set($previousKey, $previousValue);
678+
}
650679
}
651680
}
652681
}

0 commit comments

Comments
 (0)