Cleanup StreamWrappers and no need for WhitespaceFilter

This commit is contained in:
djmaze 2022-01-07 17:16:53 +01:00
parent 1be93d7288
commit 80f5373e9e
6 changed files with 28 additions and 72 deletions

View file

@ -12,19 +12,6 @@
namespace MailSo\Base\StreamWrappers; namespace MailSo\Base\StreamWrappers;
class WhitespaceFilter extends \php_user_filter
{
function filter($in, $out, &$consumed, $closing)
{
while ($bucket = \stream_bucket_make_writeable($in)) {
$bucket->data = \str_replace(array("\r", "\n", "\t"), '', $bucket->data);
$consumed += $bucket->datalen;
\stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
/** /**
* @category MailSo * @category MailSo
* @package Base * @package Base
@ -149,11 +136,6 @@ class Binary
public static function CreateStream($rStream, public static function CreateStream($rStream,
string $sUtilsDecodeOrEncodeFunctionName = null, string $sFromEncoding = null, string $sToEncoding = null) string $sUtilsDecodeOrEncodeFunctionName = null, string $sFromEncoding = null, string $sToEncoding = null)
{ {
if (!\in_array(self::STREAM_NAME, \stream_get_wrappers()))
{
\stream_wrapper_register(self::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Binary');
}
if (null === $sUtilsDecodeOrEncodeFunctionName || !\strlen($sUtilsDecodeOrEncodeFunctionName)) if (null === $sUtilsDecodeOrEncodeFunctionName || !\strlen($sUtilsDecodeOrEncodeFunctionName))
{ {
$sUtilsDecodeOrEncodeFunctionName = 'InlineNullDecode'; $sUtilsDecodeOrEncodeFunctionName = 'InlineNullDecode';
@ -167,23 +149,18 @@ class Binary
$sUtilsDecodeOrEncodeFunctionName = 'InlineConvertDecode'; $sUtilsDecodeOrEncodeFunctionName = 'InlineConvertDecode';
} }
if (\in_array($sUtilsDecodeOrEncodeFunctionName, array( if (\in_array($sUtilsDecodeOrEncodeFunctionName, ['convert.base64-decode', 'convert.quoted-printable-decode']))
'convert.base64-decode', 'convert.base64-encode', {
'convert.quoted-printable-decode', 'convert.quoted-printable-encode' $rFilter = \stream_filter_append($rStream, $sUtilsDecodeOrEncodeFunctionName);
))) return \is_resource($rFilter) ? $rStream : false;
}
else if (\in_array($sUtilsDecodeOrEncodeFunctionName, ['convert.base64-encode', 'convert.quoted-printable-encode']))
{ {
if ('convert.base64-decode' === $sUtilsDecodeOrEncodeFunctionName) {
\stream_filter_register('mailsowhitespace', '\\MailSo\\Base\\StreamWrappers\\WhitespaceFilter');
if (!\stream_filter_append($rStream, 'mailsowhitespace')) {
return false;
}
}
$rFilter = \stream_filter_append($rStream, $sUtilsDecodeOrEncodeFunctionName, $rFilter = \stream_filter_append($rStream, $sUtilsDecodeOrEncodeFunctionName,
STREAM_FILTER_READ, array( \STREAM_FILTER_READ, array(
'line-length' => \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, 'line-length' => \MailSo\Mime\Enumerations\Constants::LINE_LENGTH,
'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF
)); ));
return \is_resource($rFilter) ? $rStream : false; return \is_resource($rFilter) ? $rStream : false;
} }
@ -333,3 +310,5 @@ class Binary
return false; return false;
} }
} }
\stream_wrapper_register(Binary::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Binary');

View file

@ -50,11 +50,6 @@ class Literal
*/ */
public static function CreateStream($rStream, int $iLiteralLen) public static function CreateStream($rStream, int $iLiteralLen)
{ {
if (!\in_array(self::STREAM_NAME, stream_get_wrappers()))
{
\stream_wrapper_register(self::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Literal');
}
$sHashName = \md5(\microtime(true).\rand(1000, 9999)); $sHashName = \md5(\microtime(true).\rand(1000, 9999));
self::$aStreams[$sHashName] = array($rStream, $iLiteralLen); self::$aStreams[$sHashName] = array($rStream, $iLiteralLen);
@ -163,3 +158,5 @@ class Literal
return false; return false;
} }
} }
\stream_wrapper_register(Literal::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Literal');

View file

@ -58,11 +58,6 @@ class SubStreams
*/ */
public static function CreateStream(array $aSubStreams) public static function CreateStream(array $aSubStreams)
{ {
if (!\in_array(self::STREAM_NAME, \stream_get_wrappers()))
{
\stream_wrapper_register(self::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\SubStreams');
}
$sHashName = \MailSo\Base\Utils::Sha1Rand(); $sHashName = \MailSo\Base\Utils::Sha1Rand();
self::$aStreams[$sHashName] = \array_map(function ($mItem) { self::$aStreams[$sHashName] = \array_map(function ($mItem) {
@ -219,3 +214,5 @@ class SubStreams
return false; return false;
} }
} }
\stream_wrapper_register(SubStreams::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\SubStreams');

View file

@ -33,21 +33,11 @@ class TempFile
*/ */
private $rSream; private $rSream;
public static function Reg()
{
if (!in_array(self::STREAM_NAME, stream_get_wrappers()))
{
stream_wrapper_register(self::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\TempFile');
}
}
/** /**
* @return resource|bool * @return resource|bool
*/ */
public static function CreateStream(string $sHash, string &$sFileName = '') public static function CreateStream(string $sHash, string &$sFileName = '')
{ {
self::Reg();
$sFileName = self::STREAM_NAME.'://'.$sHash; $sFileName = self::STREAM_NAME.'://'.$sHash;
return fopen($sFileName, 'r+b'); return fopen($sFileName, 'r+b');
} }
@ -121,3 +111,5 @@ class TempFile
return fseek($this->rSream, $iOffset, $iWhence); return fseek($this->rSream, $iOffset, $iWhence);
} }
} }
\stream_wrapper_register(TempFile::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\TempFile');

View file

@ -39,11 +39,6 @@ class Test
*/ */
public static function CreateStream(string $sRawResponse) public static function CreateStream(string $sRawResponse)
{ {
if (!\in_array(self::STREAM_NAME, \stream_get_wrappers()))
{
\stream_wrapper_register(self::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Test');
}
$sHashName = \md5(\microtime(true).\rand(1000, 9999)); $sHashName = \md5(\microtime(true).\rand(1000, 9999));
$rConnect = \fopen('php://memory', 'r+b'); $rConnect = \fopen('php://memory', 'r+b');
@ -106,3 +101,5 @@ class Test
return false; return false;
} }
} }
\stream_wrapper_register(Test::STREAM_NAME, '\\MailSo\\Base\\StreamWrappers\\Test');

View file

@ -226,7 +226,7 @@ class MailClient
$sFileName = ''; $sFileName = '';
$sContentType = ''; $sContentType = '';
$sMailEncodingName = ''; $sMailEncoding = '';
$sMimeIndex = trim($sMimeIndex); $sMimeIndex = trim($sMimeIndex);
$aFetchResponse = $this->oImapClient->Fetch(array( $aFetchResponse = $this->oImapClient->Fetch(array(
@ -250,22 +250,19 @@ class MailClient
if (\strlen($sMimeIndex)) if (\strlen($sMimeIndex))
{ {
$sFileName = $oHeaders->ParameterValue(MimeHeader::CONTENT_DISPOSITION, MimeParameter::FILENAME); $sFileName = $oHeaders->ParameterValue(MimeHeader::CONTENT_DISPOSITION, MimeParameter::FILENAME);
if (!\strlen($sFileName)) {
if (!\strlen($sFileName))
{
$sFileName = $oHeaders->ParameterValue(MimeHeader::CONTENT_TYPE, MimeParameter::NAME); $sFileName = $oHeaders->ParameterValue(MimeHeader::CONTENT_TYPE, MimeParameter::NAME);
} }
$sMailEncodingName = $oHeaders->ValueByName(MimeHeader::CONTENT_TRANSFER_ENCODING); $sMailEncoding = \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName(
$oHeaders->ValueByName(MimeHeader::CONTENT_TRANSFER_ENCODING)
);
$sContentType = $oHeaders->ValueByName(MimeHeader::CONTENT_TYPE); $sContentType = $oHeaders->ValueByName(MimeHeader::CONTENT_TYPE);
} }
else else
{ {
$sSubject = $oHeaders->ValueByName(MimeHeader::SUBJECT); $sFileName = ($oHeaders->ValueByName(MimeHeader::SUBJECT) ?: $iIndex) . '.eml';
$sFileName = \strlen($sSubject) ? $sSubject : (string) $iIndex;
$sFileName .= '.eml';
$sContentType = 'message/rfc822'; $sContentType = 'message/rfc822';
} }
@ -276,17 +273,14 @@ class MailClient
// Push in the aFetchCallbacks array and then called by \MailSo\Imap\Traits\ResponseParser::partialResponseLiteralCallbackCallable // Push in the aFetchCallbacks array and then called by \MailSo\Imap\Traits\ResponseParser::partialResponseLiteralCallbackCallable
array( array(
FetchType::BODY_PEEK.'['.$sMimeIndex.']', FetchType::BODY_PEEK.'['.$sMimeIndex.']',
function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncodingName, $sContentType, $sFileName) function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncoding, $sContentType, $sFileName)
{ {
if (\strlen($sLiteralAtomUpperCase) && \is_resource($rImapLiteralStream) && 'FETCH' === $sParent) if (\strlen($sLiteralAtomUpperCase) && \is_resource($rImapLiteralStream) && 'FETCH' === $sParent)
{ {
$rMessageMimeIndexStream = \strlen($sMailEncodingName) $mCallback($sMailEncoding
? \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, ? \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, $sMailEncoding)
\MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( : $rImapLiteralStream,
$sMailEncodingName, true)) $sContentType, $sFileName, $sMimeIndex);
: $rImapLiteralStream;
$mCallback($rMessageMimeIndexStream, $sContentType, $sFileName, $sMimeIndex);
} }
} }
)), $iIndex, $bIndexIsUid); )), $iIndex, $bIndexIsUid);