refactor: unify quotes encoding

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-09-25 11:49:18 -04:00
parent cd724df8ec
commit 09d0bbd817
11 changed files with 38 additions and 63 deletions
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
use KTXM\ProviderImap\Client\Protocol\Response\ContinuationResponse; use KTXM\ProviderImap\Client\Protocol\Response\ContinuationResponse;
@@ -57,7 +58,7 @@ final class AppendCommand implements CommandInterface
return new RequestFrame(sprintf( return new RequestFrame(sprintf(
'APPEND %s %s{%d}', 'APPEND %s %s{%d}',
$this->quote($this->mailbox), StringEncoder::quote($this->mailbox),
$flagSegment, $flagSegment,
strlen($this->literal), strlen($this->literal),
)); ));
@@ -86,10 +87,6 @@ final class AppendCommand implements CommandInterface
throw new ImapException('APPEND did not receive a tagged completion response.'); throw new ImapException('APPEND did not receive a tagged completion response.');
} }
private function quote(string $mailbox): string
{
return '"' . addcslashes($mailbox, "\\\"") . '"';
}
private function parseAppendUid(string $text): ?int private function parseAppendUid(string $text): ?int
{ {
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command\Argument; namespace KTXM\ProviderImap\Client\Protocol\Command\Argument;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Protocol\SequenceSet; use KTXM\ProviderImap\Client\Protocol\SequenceSet;
use DateTimeInterface; use DateTimeInterface;
@@ -190,8 +191,8 @@ final class SearchCriteriaBuilder
{ {
return $this->pushExpression(sprintf( return $this->pushExpression(sprintf(
'HEADER %s %s', 'HEADER %s %s',
$this->formatString($name), StringEncoder::quote($name),
$this->formatString($value), StringEncoder::quote($value),
)); ));
} }
@@ -287,7 +288,7 @@ final class SearchCriteriaBuilder
return $this->pushExpression(sprintf( return $this->pushExpression(sprintf(
'%s %s', '%s %s',
$key, $key,
$quote ? $this->formatString($value) : $value, $quote ? StringEncoder::quote($value) : $value,
)); ));
} }
@@ -371,9 +372,4 @@ final class SearchCriteriaBuilder
default => SequenceSet::parse($value)->toCommand(), default => SequenceSet::parse($value)->toCommand(),
}; };
} }
private function formatString(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Result\CommandStatusResult; use KTXM\ProviderImap\Client\Result\CommandStatusResult;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
@@ -38,7 +39,7 @@ final class CreateCommand implements CommandInterface
{ {
unset($tag, $context); unset($tag, $context);
return new RequestFrame(sprintf('CREATE %s', $this->quote($this->mailbox))); return new RequestFrame(sprintf('CREATE %s', StringEncoder::quote($this->mailbox)));
} }
public function handle(ResponseStream $responses, SessionContext $context): CommandStatusResult public function handle(ResponseStream $responses, SessionContext $context): CommandStatusResult
@@ -57,9 +58,4 @@ final class CreateCommand implements CommandInterface
throw new ImapException('CREATE did not receive a tagged completion response.'); throw new ImapException('CREATE did not receive a tagged completion response.');
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Result\CommandStatusResult; use KTXM\ProviderImap\Client\Result\CommandStatusResult;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
@@ -38,7 +39,7 @@ final class DeleteCommand implements CommandInterface
{ {
unset($tag, $context); unset($tag, $context);
return new RequestFrame(sprintf('DELETE %s', $this->quote($this->mailbox))); return new RequestFrame(sprintf('DELETE %s', StringEncoder::quote($this->mailbox)));
} }
public function handle(ResponseStream $responses, SessionContext $context): CommandStatusResult public function handle(ResponseStream $responses, SessionContext $context): CommandStatusResult
@@ -60,9 +61,4 @@ final class DeleteCommand implements CommandInterface
throw new ImapException('DELETE did not receive a tagged completion response.'); throw new ImapException('DELETE did not receive a tagged completion response.');
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
+3 -7
View File
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Protocol\Parser\ListResponseParser; use KTXM\ProviderImap\Client\Protocol\Parser\ListResponseParser;
use KTXM\ProviderImap\Client\Protocol\Parser\StatusResponseParser; use KTXM\ProviderImap\Client\Protocol\Parser\StatusResponseParser;
use Generator; use Generator;
@@ -66,8 +67,8 @@ final class ListCommand implements CommandInterface
$command .= sprintf( $command .= sprintf(
' %s %s', ' %s %s',
$this->quote($this->reference), StringEncoder::quote($this->reference),
$this->quote($this->pattern), StringEncoder::quote($this->pattern),
); );
$returnOptions = $this->returnOptions->toCommand(); $returnOptions = $this->returnOptions->toCommand();
@@ -158,9 +159,4 @@ final class ListCommand implements CommandInterface
$mailbox->readOnly(), $mailbox->readOnly(),
); );
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
+3 -7
View File
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Result\CommandStatusResult; use KTXM\ProviderImap\Client\Result\CommandStatusResult;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
@@ -38,8 +39,8 @@ final class LoginCommand implements CommandInterface
return new RequestFrame(sprintf( return new RequestFrame(sprintf(
'LOGIN %s %s', 'LOGIN %s %s',
$this->quote($this->username), StringEncoder::quote($this->username),
$this->quote($this->password), StringEncoder::quote($this->password),
)); ));
} }
@@ -59,9 +60,4 @@ final class LoginCommand implements CommandInterface
throw new ImapException('LOGIN did not receive a tagged completion response.'); throw new ImapException('LOGIN did not receive a tagged completion response.');
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Result\MessageTransferResult; use KTXM\ProviderImap\Client\Result\MessageTransferResult;
use KTXM\ProviderImap\Client\Protocol\Command\Argument\MessageTarget; use KTXM\ProviderImap\Client\Protocol\Command\Argument\MessageTarget;
use KTXM\ProviderImap\Client\Protocol\IdentifierMode; use KTXM\ProviderImap\Client\Protocol\IdentifierMode;
@@ -66,7 +67,7 @@ final class MessageTransferCommand implements CommandInterface
$this->identifierMode === IdentifierMode::Uid ? 'UID ' : '', $this->identifierMode === IdentifierMode::Uid ? 'UID ' : '',
$this->operation, $this->operation,
$this->sequenceSet->toCommand(), $this->sequenceSet->toCommand(),
$this->quote($this->destinationMailbox), StringEncoder::quote($this->destinationMailbox),
)); ));
} }
@@ -235,9 +236,4 @@ final class MessageTransferCommand implements CommandInterface
'text' => trim($matches[3] ?? ''), 'text' => trim($matches[3] ?? ''),
]; ];
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Result\CommandStatusResult; use KTXM\ProviderImap\Client\Result\CommandStatusResult;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
@@ -41,8 +42,8 @@ final class RenameCommand implements CommandInterface
return new RequestFrame(sprintf( return new RequestFrame(sprintf(
'RENAME %s %s', 'RENAME %s %s',
$this->quote($this->fromMailbox), StringEncoder::quote($this->fromMailbox),
$this->quote($this->toMailbox), StringEncoder::quote($this->toMailbox),
)); ));
} }
@@ -64,9 +65,4 @@ final class RenameCommand implements CommandInterface
throw new ImapException('RENAME did not receive a tagged completion response.'); throw new ImapException('RENAME did not receive a tagged completion response.');
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
use KTXM\ProviderImap\Client\Mailbox; use KTXM\ProviderImap\Client\Mailbox;
use KTXM\ProviderImap\Client\Protocol\RequestFrame; use KTXM\ProviderImap\Client\Protocol\RequestFrame;
@@ -43,7 +44,7 @@ final class SelectCommand implements CommandInterface
return new RequestFrame(sprintf( return new RequestFrame(sprintf(
'%s %s', '%s %s',
$this->name(), $this->name(),
$this->quote($this->mailbox), StringEncoder::quote($this->mailbox),
)); ));
} }
@@ -116,9 +117,4 @@ final class SelectCommand implements CommandInterface
return preg_split('/\s+/', $flags) ?: []; return preg_split('/\s+/', $flags) ?: [];
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol\Command; namespace KTXM\ProviderImap\Client\Protocol\Command;
use KTXM\ProviderImap\Client\Protocol\StringEncoder;
use KTXM\ProviderImap\Client\Protocol\Parser\StatusResponseParser; use KTXM\ProviderImap\Client\Protocol\Parser\StatusResponseParser;
use KTXM\ProviderImap\Client\Result\StatusResult; use KTXM\ProviderImap\Client\Result\StatusResult;
use KTXM\ProviderImap\Client\ImapException; use KTXM\ProviderImap\Client\ImapException;
@@ -51,7 +52,7 @@ final class StatusCommand implements CommandInterface
return new RequestFrame(sprintf( return new RequestFrame(sprintf(
'STATUS %s (%s)', 'STATUS %s (%s)',
$this->quote($this->mailbox), StringEncoder::quote($this->mailbox),
implode(' ', $this->normalizeItems($this->items)), implode(' ', $this->normalizeItems($this->items)),
)); ));
} }
@@ -112,8 +113,4 @@ final class StatusCommand implements CommandInterface
return $normalized; return $normalized;
} }
private function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
} }
+13
View File
@@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
namespace KTXM\ProviderImap\Client\Protocol;
final class StringEncoder
{
public static function quote(string $value): string
{
return '"' . addcslashes($value, "\\\"") . '"';
}
}