mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-04 10:42:23 +00:00
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: rosslh <ross@rosshill.ca>
146 lines
4.7 KiB
PHP
146 lines
4.7 KiB
PHP
<?php
|
|
|
|
use App\Support\SmtpTransportFactory;
|
|
use Symfony\Component\Mailer\Transport\Smtp\Stream\SocketStream;
|
|
|
|
function smtpSettings(array $overrides = []): object
|
|
{
|
|
return (object) array_merge([
|
|
'smtp_host' => 'smtp.example.com',
|
|
'smtp_port' => 25,
|
|
'smtp_encryption' => 'none',
|
|
'smtp_username' => 'user',
|
|
'smtp_password' => 'secret',
|
|
'smtp_timeout' => null,
|
|
], $overrides);
|
|
}
|
|
|
|
it('disables opportunistic STARTTLS when encryption is none', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => 'none',
|
|
]));
|
|
|
|
expect($transport->isAutoTls())->toBeFalse()
|
|
->and($transport->getStream())->toBeInstanceOf(SocketStream::class)
|
|
->and($transport->getStream()->isTLS())->toBeFalse();
|
|
});
|
|
|
|
it('does not issue STARTTLS for the issue 5877 anonymous port 25 relay', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => 'none',
|
|
'smtp_port' => 25,
|
|
'smtp_username' => '',
|
|
'smtp_password' => '',
|
|
]));
|
|
|
|
expect($transport->isAutoTls())->toBeFalse()
|
|
->and($transport->getStream()->isTLS())->toBeFalse()
|
|
->and($transport->getStream()->getPort())->toBe(25)
|
|
->and($transport->getUsername())->toBe('')
|
|
->and($transport->getPassword())->toBe('');
|
|
});
|
|
|
|
it('does not enable implicit TLS on port 465 when encryption is none', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => 'none',
|
|
'smtp_port' => 465,
|
|
]));
|
|
|
|
expect($transport->isAutoTls())->toBeFalse()
|
|
->and($transport->getStream()->isTLS())->toBeFalse();
|
|
});
|
|
|
|
it('keeps opportunistic STARTTLS when encryption is starttls', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => 'starttls',
|
|
]));
|
|
|
|
expect($transport->isAutoTls())->toBeTrue()
|
|
->and($transport->getStream()->isTLS())->toBeFalse();
|
|
});
|
|
|
|
it('uses implicit TLS when encryption is tls', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => 'tls',
|
|
'smtp_port' => 465,
|
|
]));
|
|
|
|
expect($transport->isAutoTls())->toBeTrue()
|
|
->and($transport->getStream()->isTLS())->toBeTrue();
|
|
});
|
|
|
|
it('infers implicit TLS on port 465 when encryption is null', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_encryption' => null,
|
|
'smtp_port' => 465,
|
|
]));
|
|
|
|
expect($transport->getStream()->isTLS())->toBeTrue();
|
|
});
|
|
|
|
it('applies a configured SMTP timeout to the transport stream', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings([
|
|
'smtp_timeout' => 15,
|
|
]));
|
|
|
|
expect($transport->getStream()->getTimeout())->toBe(15.0);
|
|
});
|
|
|
|
it('applies the configured ehlo domain to the transport', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(
|
|
smtpSettings(['smtp_ehlo_domain' => 'team.example.com']),
|
|
'instance.example.com'
|
|
);
|
|
|
|
expect($transport->getLocalDomain())->toBe('team.example.com');
|
|
});
|
|
|
|
it('falls back to the instance ehlo domain for legacy smtp settings', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(
|
|
smtpSettings(),
|
|
'instance.example.com'
|
|
);
|
|
|
|
expect($transport->getLocalDomain())->toBe('instance.example.com');
|
|
});
|
|
|
|
it('maps none encryption to laravel mailer options that disable auto tls', function () {
|
|
expect(SmtpTransportFactory::mailerOptions(smtpSettings([
|
|
'smtp_encryption' => 'none',
|
|
])))->toBe([
|
|
'scheme' => 'smtp',
|
|
'encryption' => null,
|
|
'auto_tls' => '0',
|
|
]);
|
|
});
|
|
|
|
it('maps encryption to laravel mailer options', function (?string $mode, ?string $scheme, ?string $encryption) {
|
|
expect(SmtpTransportFactory::mailerOptions(smtpSettings([
|
|
'smtp_encryption' => $mode,
|
|
])))->toBe([
|
|
'scheme' => $scheme,
|
|
'encryption' => $encryption,
|
|
'auto_tls' => $mode === 'none' ? '0' : '',
|
|
]);
|
|
})->with([
|
|
'none' => ['none', 'smtp', null],
|
|
'starttls' => ['starttls', 'smtp', null],
|
|
'tls' => ['tls', 'smtps', 'tls'],
|
|
'unset' => [null, null, null],
|
|
]);
|
|
|
|
it('brackets an IPv6 smtp host', function (string $host) {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings(['smtp_host' => $host]));
|
|
|
|
expect($transport->getStream()->getHost())->toBe('[2001:db8::25]');
|
|
})->with([
|
|
'raw' => '2001:db8::25',
|
|
'bracketed' => '[2001:db8::25]',
|
|
]);
|
|
|
|
it('keeps a hostname smtp host unchanged', function () {
|
|
$transport = SmtpTransportFactory::fromSettings(smtpSettings(['smtp_host' => 'smtp.example.com']));
|
|
|
|
expect($transport->getStream()->getHost())->toBe('smtp.example.com');
|
|
});
|