From e13496a3ad31a44b5348b463a0bea6997128bd6a Mon Sep 17 00:00:00 2001 From: butschster Date: Sun, 14 Jul 2024 19:13:24 +0400 Subject: [PATCH 1/2] STMP module improvements 1. Adds event uuid return to a email message send request. 2. Cleanup body storage on RSET command --- .../Application/Storage/EmailBodyStorage.php | 7 ++++ .../Smtp/Interfaces/TCP/ResponseMessage.php | 19 +++++++++-- app/modules/Smtp/Interfaces/TCP/Service.php | 33 +++++++++++-------- .../Feature/Interfaces/TCP/Smtp/EmailTest.php | 13 +++++--- 4 files changed, 52 insertions(+), 20 deletions(-) diff --git a/app/modules/Smtp/Application/Storage/EmailBodyStorage.php b/app/modules/Smtp/Application/Storage/EmailBodyStorage.php index 61ebf0d..c386541 100644 --- a/app/modules/Smtp/Application/Storage/EmailBodyStorage.php +++ b/app/modules/Smtp/Application/Storage/EmailBodyStorage.php @@ -18,6 +18,13 @@ public function getMessage(string $uuid): Message return $this->cache->get($this->getCacheKey($uuid), new Message($uuid)); } + public function cleanup(string $uuid): Message + { + $this->cache->delete($this->getCacheKey($uuid)); + + return new Message($uuid); + } + public function persist(Message $message): void { $this->cache->set( diff --git a/app/modules/Smtp/Interfaces/TCP/ResponseMessage.php b/app/modules/Smtp/Interfaces/TCP/ResponseMessage.php index c16260e..7dbc5d3 100644 --- a/app/modules/Smtp/Interfaces/TCP/ResponseMessage.php +++ b/app/modules/Smtp/Interfaces/TCP/ResponseMessage.php @@ -4,6 +4,8 @@ namespace Modules\Smtp\Interfaces\TCP; +use App\Application\Domain\ValueObjects\Uuid; + final readonly class ResponseMessage implements \Stringable { private const READY = 220; @@ -23,6 +25,16 @@ public static function ok(string $message = '', string $separator = ' '): self return new self(self::OK, $message, $separator); } + public static function accepted(Uuid $uuid): self + { + return new self( + code: self::OK, + message: \sprintf("Ok %s", $uuid), + lineEnding: "\r", + eosSeparator: '', + ); + } + public static function authRequired(string $message = 'AUTH LOGIN PLAIN'): self { return new self(self::OK, $message); @@ -57,15 +69,18 @@ public function __construct( public int $code, public string $message = '', public string $separator = " ", + public string $lineEnding = "\r\n", + public string $eosSeparator = " ", ) {} public function __toString(): string { return \sprintf( - "%d%s%s\r\n", + "%d%s%s%s", $this->code, $this->separator, - $this->message === '' || $this->message === '0' ? '' : $this->message . ' ', + $this->message === '' || $this->message === '0' ? '' : $this->message . $this->eosSeparator, + $this->lineEnding, ); } } diff --git a/app/modules/Smtp/Interfaces/TCP/Service.php b/app/modules/Smtp/Interfaces/TCP/Service.php index ae47c4d..0902e5a 100644 --- a/app/modules/Smtp/Interfaces/TCP/Service.php +++ b/app/modules/Smtp/Interfaces/TCP/Service.php @@ -29,7 +29,7 @@ public function __construct( public function handle(Request $request): ResponseInterface { if ($request->event === TcpEvent::Connected) { - return $this->send(ResponseMessage::ready()); + return $this->makeResponse(ResponseMessage::ready()); } $message = $this->emailBodyStorage->getMessage($request->connectionUuid); @@ -48,30 +48,36 @@ public function handle(Request $request): ResponseInterface ); } elseif (\preg_match('/^MAIL FROM:\s*<(.*)>/', $request->body, $matches)) { $message->setFrom($matches[1]); - $response = $this->send(ResponseMessage::ok()); + $response = $this->makeResponse(ResponseMessage::ok()); } elseif (\str_starts_with($request->body, 'AUTH')) { - $response = $this->send(ResponseMessage::enterUsername()); + $response = $this->makeResponse(ResponseMessage::enterUsername()); $message->waitUsername = true; } elseif ($message->waitUsername) { $message->setUsername($request->body); - $response = $this->send(ResponseMessage::enterPassword()); + $response = $this->makeResponse(ResponseMessage::enterPassword()); } elseif ($message->waitPassword) { $message->setPassword($request->body); - $response = $this->send(ResponseMessage::authenticated()); + $response = $this->makeResponse(ResponseMessage::authenticated()); } elseif (\preg_match('/^RCPT TO:\s*<(.*)>/', $request->body, $matches)) { $message->addRecipient($matches[1]); - $response = $this->send(ResponseMessage::ok()); + $response = $this->makeResponse(ResponseMessage::ok()); } elseif (\str_starts_with($request->body, 'QUIT')) { - $response = $this->send(ResponseMessage::closing(), close: true); + $response = $this->makeResponse(ResponseMessage::closing(), close: true); + $message = $this->emailBodyStorage->cleanup($request->connectionUuid); } elseif ($request->body === "DATA\r\n") { - $response = $this->send(ResponseMessage::provideBody()); + $response = $this->makeResponse(ResponseMessage::provideBody()); $message->waitBody = true; + } elseif ($request->body === "RSET\r\n") { + $message = $this->emailBodyStorage->cleanup($request->connectionUuid); } elseif ($message->waitBody) { - $response = $this->send(ResponseMessage::ok()); $message->appendBody($request->body); + $response = $this->makeResponse(ResponseMessage::ok()); + if ($message->bodyHasEos()) { - $this->dispatchMessage($message->parse(), project: $message->username); + $uuid = $this->dispatchMessage($message->parse(), project: $message->username); + + $response = $this->makeResponse(ResponseMessage::accepted($uuid)); $dispatched = true; } } @@ -89,12 +95,11 @@ public function handle(Request $request): ResponseInterface return $response; } - private function dispatchMessage(Message $message, ?string $project = null): void + private function dispatchMessage(Message $message, ?string $project = null): Uuid { $uuid = Uuid::generate(); $data = $message->jsonSerialize(); - $result = $this->attachments->store(eventUuid: $uuid, attachments: $message->attachments); // TODO: Refactor this foreach ($result as $cid => $url) { @@ -109,9 +114,11 @@ private function dispatchMessage(Message $message, ?string $project = null): voi uuid: $uuid, ), ); + + return $uuid; } - private function send(ResponseMessage $message, bool $close = false): RespondMessage + private function makeResponse(ResponseMessage $message, bool $close = false): RespondMessage { return new RespondMessage((string) $message, $close); } diff --git a/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php b/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php index b3ff87d..b5f5cbb 100644 --- a/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php +++ b/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php @@ -14,6 +14,7 @@ use Ramsey\Uuid\Uuid; use Spiral\RoadRunner\Tcp\TcpEvent; use Spiral\RoadRunnerBridge\Tcp\Response\CloseConnection; +use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; use Symfony\Component\Mime\Part\DataPart; @@ -90,15 +91,17 @@ public function testSendEmail(): void }), ); - $client->send($email); + $sentMessage = $client->send($email); + $this->validateMessage($id, (string) $connectionUuid); $response = $this->handleSmtpRequest(message: '', event: TCPEvent::Close); $this->assertInstanceOf(CloseConnection::class, $response); - $this->assertEventPushed('default'); + $this->assertEventPushed($sentMessage, 'default'); } + private function getEmailMessage(string $uuid): Message { return $this->get(EmailBodyStorage::class)->getMessage($uuid); @@ -181,9 +184,9 @@ private function validateMessage(string $messageId, string $uuid): void ); } - private function assertEventPushed(?string $project = null): void + private function assertEventPushed(SentMessage $message, ?string $project = null): void { - $this->broadcastig->assertPushed(new EventsChannel($project), function (array $data) use ($project) { + $this->broadcastig->assertPushed(new EventsChannel($project), function (array $data) use ($message, $project) { $this->assertSame('event.received', $data['event']); $this->assertSame('smtp', $data['data']['type']); $this->assertSame($project, $data['data']['project']); @@ -212,7 +215,7 @@ private function assertEventPushed(?string $project = null): void ], ], $data['data']['payload']); - $this->assertNotEmpty($data['data']['uuid']); + $this->assertSame($message->getMessageId(), $data['data']['uuid']); $this->assertNotEmpty($data['data']['timestamp']); return true; From 2db032f009f7c80b2614b14b120f5fb228783afd Mon Sep 17 00:00:00 2001 From: butschster Date: Sun, 28 Jul 2024 12:34:24 +0400 Subject: [PATCH 2/2] Adds NOOP support Adds unit tests for PDF attachment --- app/modules/Smtp/Interfaces/TCP/Service.php | 3 +++ .../Feature/Interfaces/TCP/Smtp/EmailTest.php | 18 +++++++++++++++++- tests/Feature/Interfaces/TCP/Smtp/sample.pdf | Bin 0 -> 61752 bytes 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/Interfaces/TCP/Smtp/sample.pdf diff --git a/app/modules/Smtp/Interfaces/TCP/Service.php b/app/modules/Smtp/Interfaces/TCP/Service.php index 0902e5a..e58f8e2 100644 --- a/app/modules/Smtp/Interfaces/TCP/Service.php +++ b/app/modules/Smtp/Interfaces/TCP/Service.php @@ -69,6 +69,9 @@ public function handle(Request $request): ResponseInterface $message->waitBody = true; } elseif ($request->body === "RSET\r\n") { $message = $this->emailBodyStorage->cleanup($request->connectionUuid); + $response = $this->makeResponse(ResponseMessage::ok()); + } elseif ($request->body === "NOOP\r\n") { + $response = $this->makeResponse(ResponseMessage::ok()); } elseif ($message->waitBody) { $message->appendBody($request->body); diff --git a/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php b/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php index b5f5cbb..ef2c691 100644 --- a/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php +++ b/tests/Feature/Interfaces/TCP/Smtp/EmailTest.php @@ -76,7 +76,22 @@ public function testSendEmail(): void }), ); - // Assert hello.txt is persisted to a database + // Assert sample.pdf is persisted to a database + $this->attachments->shouldReceive('store') + ->once() + ->with( + \Mockery::on(function (Attachment $attachment) { + $this->assertSame('sample.pdf', $attachment->getFilename()); + $this->assertSame(61752, $attachment->getSize()); + $this->assertSame('application/pdf', $attachment->getMime()); + + // Check attachments storage + $this->bucket->assertCreated($attachment->getPath()); + return true; + }), + ); + + // Assert logo.svg is persisted to a database $this->attachments->shouldReceive('store') ->once() ->with( @@ -238,6 +253,7 @@ public function buildEmail(): Email ) ->addFrom(new Address('no-reply@site.com', 'Bob Example'),) ->attachFromPath(path: __DIR__ . '/hello.txt',) + ->attachFromPath(path: __DIR__ . '/sample.pdf',) ->attachFromPath(path: __DIR__ . '/logo.svg') ->addPart( (new DataPart(new File(__DIR__ . '/logo.svg'), 'logo-embeddable'))->asInline()->setContentId( diff --git a/tests/Feature/Interfaces/TCP/Smtp/sample.pdf b/tests/Feature/Interfaces/TCP/Smtp/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c172e182af60026565211f600bfc2140e1b7711e GIT binary patch literal 61752 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

oU9ipR7nHOp*H2xrO` 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 KtGuQH!G8g-^L#Y` literal 0 HcmV?d00001