Skip to content

Commit

Permalink
Decode partially encoded address names #511
Browse files Browse the repository at this point in the history
Webklex committed Jan 17, 2025

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
1 parent 4289d41 commit e527bf3
Showing 5 changed files with 73 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) princip
- Filename sanitization is now optional (enabled via default)
- Address parsing improved and extended to include more cases
- Boundary parsing fixed and improved to support more formats #544
- Decode partially encoded address names #511

### Added
- Security configuration options added
4 changes: 2 additions & 2 deletions src/Decoder/HeaderDecoder.php
Original file line number Diff line number Diff line change
@@ -68,11 +68,11 @@ public function getEncoding(object|string $structure): string {
if (property_exists($structure, 'parameters')) {
foreach ($structure->parameters as $parameter) {
if (strtolower($parameter->attribute) == "charset") {
return EncodingAliases::get($parameter->value, $this->fallback_encoding);
return EncodingAliases::get($parameter->value == "default" ? EncodingAliases::detectEncoding($parameter->value) : $parameter->value, $this->fallback_encoding);
}
}
} elseif (property_exists($structure, 'charset')) {
return EncodingAliases::get($structure->charset, $this->fallback_encoding);
return EncodingAliases::get($structure->charset == "default" ? EncodingAliases::detectEncoding($structure->charset) : $structure->charset, $this->fallback_encoding);
} elseif (is_string($structure) === true) {
$result = mb_detect_encoding($structure);
return $result === false ? $this->fallback_encoding : $result;
23 changes: 15 additions & 8 deletions src/Header.php
Original file line number Diff line number Diff line change
@@ -480,16 +480,23 @@ private function parseAddresses($list): array {
if (!property_exists($address, 'personal')) {
$address->personal = false;
} else {
$personalParts = $this->decoder->mimeHeaderDecode($address->personal);

$address->personal = '';
foreach ($personalParts as $p) {
$address->personal .= $this->decoder->convertEncoding($p->text, $this->decoder->getEncoding($p));
}
$personal_slices = explode(" ", $address->personal);
$address->personal = "";
foreach ($personal_slices as $slice) {
$personalParts = $this->decoder->mimeHeaderDecode($slice);

$personal = '';
foreach ($personalParts as $p) {
$personal .= $this->decoder->convertEncoding($p->text, $this->decoder->getEncoding($p));
}

if (str_starts_with($address->personal, "'")) {
$address->personal = str_replace("'", "", $address->personal);
if (str_starts_with($personal, "'")) {
$personal = str_replace("'", "", $personal);
}
$personal = $this->decoder->decode($personal);
$address->personal .= $personal . " ";
}
$address->personal = trim(rtrim($address->personal));
}

if ($address->host == ".SYNTAX-ERROR.") {
50 changes: 50 additions & 0 deletions tests/issues/Issue511Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
/*
* File: Issue410Test.php
* Category: -
* Author: M.Goldenbaum
* Created: 23.06.23 20:41
* Updated: -
*
* Description:
* -
*/

namespace Tests\issues;

use PHPUnit\Framework\TestCase;
use Tests\fixtures\FixtureTestCase;
use Webklex\PHPIMAP\Attachment;
use Webklex\PHPIMAP\ClientManager;
use Webklex\PHPIMAP\EncodingAliases;
use Webklex\PHPIMAP\Exceptions\AuthFailedException;
use Webklex\PHPIMAP\Exceptions\ConnectionFailedException;
use Webklex\PHPIMAP\Exceptions\ImapBadRequestException;
use Webklex\PHPIMAP\Exceptions\ImapServerErrorException;
use Webklex\PHPIMAP\Exceptions\InvalidMessageDateException;
use Webklex\PHPIMAP\Exceptions\MaskNotFoundException;
use Webklex\PHPIMAP\Exceptions\MessageContentFetchingException;
use Webklex\PHPIMAP\Exceptions\ResponseException;
use Webklex\PHPIMAP\Exceptions\RuntimeException;
use Webklex\PHPIMAP\Message;

class Issue511Test extends FixtureTestCase {

/**
* @throws RuntimeException
* @throws MessageContentFetchingException
* @throws ResponseException
* @throws ImapBadRequestException
* @throws InvalidMessageDateException
* @throws ConnectionFailedException
* @throws \ReflectionException
* @throws ImapServerErrorException
* @throws AuthFailedException
* @throws MaskNotFoundException
*/
public function testIssueEmail() {
$message = $this->getFixture("issue-511.eml");
self::assertSame("RE: [EXTERNAL] Re: Lorem Ipsum /40 one", (string)$message->subject);
self::assertSame("COMPANYNAME | usługi <sender@sender_domain.tld>", (string)$message->from->first());
}
}
5 changes: 5 additions & 0 deletions tests/messages/issue-511.eml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
From: COMPANYNAME | =?iso-8859-2?q?us=B3ugi?= <sender@sender_domain.tld>
To: receipent@receipent_domain.tld
Subject: =?utf-8?B?UkU6IFtFWFRFUk5BTF0gUmU6IExvcmVtIElwc3VtIC8=?= =?utf-8?Q?40_one?=

Test message

0 comments on commit e527bf3

Please sign in to comment.