diff --git a/src/Header/Consumer/AbstractConsumerService.php b/src/Header/Consumer/AbstractConsumerService.php index dd3ceb33..ee2bfe63 100644 --- a/src/Header/Consumer/AbstractConsumerService.php +++ b/src/Header/Consumer/AbstractConsumerService.php @@ -30,12 +30,12 @@ abstract class AbstractConsumerService implements IConsumerService protected LoggerInterface $logger; /** - * @var used to construct IHeaderPart objects + * @var HeaderPartFactory used to construct IHeaderPart objects */ protected HeaderPartFactory $partFactory; /** - * @var the generated token split pattern on first run, so it doesn't + * @var ?string the generated token split pattern on first run, so it doesn't * need to be regenerated every time. */ private ?string $tokenSplitPattern = null; diff --git a/src/Header/HeaderFactory.php b/src/Header/HeaderFactory.php index fe75cbc0..f26f7fed 100644 --- a/src/Header/HeaderFactory.php +++ b/src/Header/HeaderFactory.php @@ -182,12 +182,13 @@ public function newInstance(string $name, string $value) : IHeader } /** - * Creates an IHeader instance for the passed header name and value, and - * returns it. + * Creates an IHeader instance for the passed header name and value using + * the passed IHeader class, and returns it. * - * @param $name The header name. - * @param $value The header value. - * @return The created header object. + * @param string $name The header name. + * @param string $value The header value. + * @param string $iHeaderClass The class to use for header creation + * @return IHeader The created header object. */ public function newInstanceOf(string $name, string $value, string $iHeaderClass) : IHeader { diff --git a/src/Header/IdHeader.php b/src/Header/IdHeader.php index 328494e4..eae9c02b 100644 --- a/src/Header/IdHeader.php +++ b/src/Header/IdHeader.php @@ -9,6 +9,7 @@ use ZBateson\MailMimeParser\Header\Part\MimeLiteralPartFactory; use ZBateson\MailMimeParser\Header\Consumer\IdBaseConsumerService; +use ZBateson\MailMimeParser\Header\Part\CommentPart; /** * Represents a Content-ID, Message-ID, In-Reply-To or References header. diff --git a/src/Header/Part/AddressGroupPart.php b/src/Header/Part/AddressGroupPart.php index e567a1c8..b66151ea 100644 --- a/src/Header/Part/AddressGroupPart.php +++ b/src/Header/Part/AddressGroupPart.php @@ -80,7 +80,7 @@ protected function getErrorBagChildren() : array protected function validate() : void { - if (mb_strlen($this->value) === 0) { + if ($this->value === null || mb_strlen($this->value) === 0) { $this->addError('Address group doesn\'t have a name', LogLevel::ERROR); } if (empty($this->addresses)) { diff --git a/src/Header/Part/Token.php b/src/Header/Part/Token.php index 10d3e4b7..89e39cd1 100644 --- a/src/Header/Part/Token.php +++ b/src/Header/Part/Token.php @@ -38,7 +38,7 @@ public function __construct(MbWrapper $charsetConverter, $value) */ public function isSpace() : bool { - return (\preg_match('/^\s+$/', $this->value) === 1); + return ($this->value !== null && \preg_match('/^\s+$/', $this->value) === 1); } /** diff --git a/src/Header/ReceivedHeader.php b/src/Header/ReceivedHeader.php index fd32344b..a4397bbf 100644 --- a/src/Header/ReceivedHeader.php +++ b/src/Header/ReceivedHeader.php @@ -114,7 +114,7 @@ public function getValue() : ?string * exists in this position is returned -- be it contains spaces, or invalid * characters, etc... * - * @return The 'FROM' name. + * @return ?string The 'FROM' name. */ public function getFromName() : ?string { @@ -131,7 +131,7 @@ public function getFromName() : ?string * not be valid. More details on how the value is parsed and extracted can * be found in the class description for {@see ReceivedHeader}. * - * @return The 'FROM' hostname. + * @return ?string The 'FROM' hostname. */ public function getFromHostname() : ?string { @@ -148,7 +148,7 @@ public function getFromHostname() : ?string * not be valid. More details on how the value is parsed and extracted can * be found in the class description for {@see ReceivedHeader}. * - * @return The 'FROM' address. + * @return ?string The 'FROM' address. */ public function getFromAddress() : ?string { @@ -165,7 +165,7 @@ public function getFromAddress() : ?string * exists in this position is returned -- be it contains spaces, or invalid * characters, etc... * - * @return The 'BY' name. + * @return ?string The 'BY' name. */ public function getByName() : ?string { @@ -182,7 +182,7 @@ public function getByName() : ?string * not be valid. More details on how the value is parsed and extracted can * be found in the class description for {@see ReceivedHeader}. * - * @return The 'BY' hostname. + * @return ?string The 'BY' hostname. */ public function getByHostname() : ?string { @@ -199,7 +199,7 @@ public function getByHostname() : ?string * not be valid. More details on how the value is parsed and extracted can * be found in the class description for {@see ReceivedHeader}. * - * @return The 'BY' address. + * @return ?string The 'BY' address. */ public function getByAddress() : ?string { diff --git a/src/Message.php b/src/Message.php index cbd99547..0fc3cab0 100644 --- a/src/Message.php +++ b/src/Message.php @@ -54,7 +54,7 @@ public function __construct( $partChildrenContainer ); if ($multipartHelper === null || $privacyHelper === null) { - $di = MailMimeParser::getDependencyContainer(); + $di = MailMimeParser::getGlobalContainer(); $multipartHelper = $di[\ZBateson\MailMimeParser\Message\Helper\MultipartHelper::class]; $privacyHelper = $di[\ZBateson\MailMimeParser\Message\Helper\PrivacyHelper::class]; } diff --git a/src/Message/Helper/MultipartHelper.php b/src/Message/Helper/MultipartHelper.php index 7104c2a2..e9fe10aa 100644 --- a/src/Message/Helper/MultipartHelper.php +++ b/src/Message/Helper/MultipartHelper.php @@ -13,6 +13,7 @@ use ZBateson\MailMimeParser\Message\Factory\IUUEncodedPartFactory; use ZBateson\MailMimeParser\Message\IMessagePart; use ZBateson\MailMimeParser\Message\IMimePart; +use ZBateson\MailMimeParser\Message\IMultiPart; use ZBateson\MailMimeParser\Message\PartFilter; /** @@ -155,7 +156,7 @@ public function removeAllContentPartsFromAlternative( $alternativePart = $message->getPart(0, PartFilter::fromInlineContentType('multipart/alternative')); } $message->removePart($rmPart); - if ($alternativePart !== null) { + if ($alternativePart !== null && $alternativePart instanceof IMultiPart) { if ($alternativePart->getChildCount() === 1) { $this->genericHelper->replacePart($message, $alternativePart, $alternativePart->getChild(0)); } elseif ($alternativePart->getChildCount() === 0) { @@ -385,7 +386,9 @@ public function setContentPartForMimeType(IMessage $message, string $mimeType, m $part = $this->createContentPartForMimeType($message, $mimeType, $charset); } else { $contentType = $part->getContentType(); - $part->setRawHeader(HeaderConsts::CONTENT_TYPE, "$contentType;\r\n\tcharset=\"$charset\""); + if ($part instanceof IMimePart) { + $part->setRawHeader(HeaderConsts::CONTENT_TYPE, "$contentType;\r\n\tcharset=\"$charset\""); + } } $part->setContent($stringOrHandle); return $this; diff --git a/src/Message/IMessagePart.php b/src/Message/IMessagePart.php index f972dab7..fcfc8aca 100644 --- a/src/Message/IMessagePart.php +++ b/src/Message/IMessagePart.php @@ -73,7 +73,7 @@ public function getContentDisposition(?string $default = null) : ?string; * Returns the content transfer encoding used to encode the content on this * part, or the value of $default if not defined. * - * @param $default Optional default value to return if not + * @param ?string $default Optional default value to return if not * applicable/defined * @return string|null the transfer encoding defined for the part. */ diff --git a/src/Message/IMultiPart.php b/src/Message/IMultiPart.php index e647a09f..b8e76aec 100644 --- a/src/Message/IMultiPart.php +++ b/src/Message/IMultiPart.php @@ -249,10 +249,10 @@ public function getPartByContentId($contentId) : ?IMessagePart; * If the $position parameter is non-null, adds the part at the passed * position index, otherwise adds it as the last child. * - * @param IMessagePart $part The part to add. + * @param MessagePart $part The part to add. * @param int $position Optional insertion position 0-based index. */ - public function addChild(IMessagePart $part, ?int $position = null) : static; + public function addChild(MessagePart $part, ?int $position = null) : static; /** * Removes the child part from this part and returns its previous position diff --git a/src/Message/MultiPart.php b/src/Message/MultiPart.php index 3cc76ce2..b1b19e3a 100644 --- a/src/Message/MultiPart.php +++ b/src/Message/MultiPart.php @@ -131,7 +131,7 @@ public function getPartByContentId($contentId) : ?IMessagePart }); } - public function addChild(IMessagePart $part, ?int $position = null) : static + public function addChild(MessagePart $part, ?int $position = null) : static { if ($part !== $this) { $part->parent = $this; diff --git a/src/Parser/Proxy/ParserMimePartProxy.php b/src/Parser/Proxy/ParserMimePartProxy.php index 1e69c149..47b8392b 100644 --- a/src/Parser/Proxy/ParserMimePartProxy.php +++ b/src/Parser/Proxy/ParserMimePartProxy.php @@ -7,7 +7,7 @@ namespace ZBateson\MailMimeParser\Parser\Proxy; -use ZBateson\MailMimeParser\Header\IHeader; +use ZBateson\MailMimeParser\Header\ParameterHeader; use ZBateson\MailMimeParser\Header\HeaderConsts; use ZBateson\MailMimeParser\Message\IMessagePart; use Psr\Log\LogLevel; @@ -131,7 +131,7 @@ public function parseAll() : static * Returns a ParameterHeader representing the parsed Content-Type header for * this part. */ - public function getContentType() : ?IHeader + public function getContentType() : ?ParameterHeader { return $this->getHeaderContainer()->get(HeaderConsts::CONTENT_TYPE); } diff --git a/tests/MailMimeParser/Message/Helper/GenericHelperTest.php b/tests/MailMimeParser/Message/Helper/GenericHelperTest.php index 26f6f091..6e7aa9a0 100644 --- a/tests/MailMimeParser/Message/Helper/GenericHelperTest.php +++ b/tests/MailMimeParser/Message/Helper/GenericHelperTest.php @@ -36,12 +36,18 @@ protected function setUp() : void private function newMockIMimePart() : \ZBateson\MailMimeParser\Message\IMimePart { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\Message\IMimePart::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message\MimePart::class) + ->disableOriginalConstructor() + ->getMock(); } private function newMockIMessage() : \ZBateson\MailMimeParser\IMessage { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\IMessage::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message::class) + ->disableOriginalConstructor() + ->getMock(); } private function newGenericHelper() : GenericHelper diff --git a/tests/MailMimeParser/Message/Helper/MultipartHelperTest.php b/tests/MailMimeParser/Message/Helper/MultipartHelperTest.php index 30d88066..d55e755c 100644 --- a/tests/MailMimeParser/Message/Helper/MultipartHelperTest.php +++ b/tests/MailMimeParser/Message/Helper/MultipartHelperTest.php @@ -39,17 +39,26 @@ protected function setUp() : void private function newMockIMimePart() : \ZBateson\MailMimeParser\Message\IMimePart { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\Message\IMimePart::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message\MimePart::class) + ->disableOriginalConstructor() + ->getMock(); } private function newMockIUUEncodedPart() : \ZBateson\MailMimeParser\Message\IUUEncodedPart { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\Message\IUUEncodedPart::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message\UUEncodedPart::class) + ->disableOriginalConstructor() + ->getMock(); } private function newMockIMessage() : \ZBateson\MailMimeParser\IMessage { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\IMessage::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message::class) + ->disableOriginalConstructor() + ->getMock(); } private function newMultipartHelper() : MultipartHelper diff --git a/tests/MailMimeParser/Message/Helper/PrivacyHelperTest.php b/tests/MailMimeParser/Message/Helper/PrivacyHelperTest.php index 69fe62a0..ef9b1279 100644 --- a/tests/MailMimeParser/Message/Helper/PrivacyHelperTest.php +++ b/tests/MailMimeParser/Message/Helper/PrivacyHelperTest.php @@ -46,12 +46,18 @@ protected function setUp() : void private function newMockIMimePart() : \ZBateson\MailMimeParser\Message\IMimePart { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\Message\IMimePart::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message\MimePart::class) + ->disableOriginalConstructor() + ->getMock(); } private function newMockIMessage() : \ZBateson\MailMimeParser\IMessage { - return $this->getMockForAbstractClass(\ZBateson\MailMimeParser\IMessage::class); + return $this + ->getMockBuilder(\ZBateson\MailMimeParser\Message::class) + ->disableOriginalConstructor() + ->getMock(); } private function newPrivacyHelper() : PrivacyHelper diff --git a/tests/MailMimeParser/Parser/Proxy/ParserMimePartProxyTest.php b/tests/MailMimeParser/Parser/Proxy/ParserMimePartProxyTest.php index 4fc9e81f..fc0bc2d5 100644 --- a/tests/MailMimeParser/Parser/Proxy/ParserMimePartProxyTest.php +++ b/tests/MailMimeParser/Parser/Proxy/ParserMimePartProxyTest.php @@ -3,7 +3,7 @@ namespace ZBateson\MailMimeParser\Parser\Proxy; use PHPUnit\Framework\TestCase; -use ZBateson\MailMimeParser\Header\IHeader; +use ZBateson\MailMimeParser\Header\ParameterHeader; /** * ParserMimePartProxyTest @@ -263,7 +263,9 @@ public function testGetContentType() : void ->method('getHeaderContainer') ->willReturn($this->headerContainer); - $tst = $this->getMockForAbstractClass(IHeader::class); + $tst = $this->getMockBuilder(ParameterHeader::class) + ->disableOriginalConstructor() + ->getMock(); $this->headerContainer->expects($this->any()) ->method('get') ->with($this->equalTo('Content-Type'))