Skip to content
Snippets Groups Projects
Commit 73093c1d authored by Adam Shepherd's avatar Adam Shepherd Committed by Adam Shepherd
Browse files

Issue #3351129 by AdamPS: Safeguard transport DSN

parent a3c4e0a6
No related branches found
No related tags found
No related merge requests found
...@@ -57,7 +57,7 @@ class DsnTransport extends TransportBase { ...@@ -57,7 +57,7 @@ class DsnTransport extends TransportBase {
Transport::fromDsn($dsn); Transport::fromDsn($dsn);
} }
catch (\Exception $e) { catch (\Exception $e) {
$form_state->setErrorByName('dsn', $this->t('Invalid DSN.')); $form_state->setErrorByName('dsn', $this->t('Invalid DSN: @message', ['@message' => $e->getMessage()]));
} }
} }
......
<?php
namespace Drupal\symfony_mailer;
use Drupal\Core\Site\Settings;
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\SendmailTransportFactory;
use Symfony\Component\Mailer\Transport\TransportInterface;
/**
* Provides a replacement sendmail transport factory that checks the command.
*/
final class ReplacementSendmailTransportFactory extends AbstractTransportFactory {
/**
* {@inheritdoc}
*/
public function create(Dsn $dsn): TransportInterface {
if ($command = $dsn->getOption('command')) {
$commands = Settings::get('mailer_sendmail_commands', []);
if (!in_array($command, $commands)) {
throw new \RuntimeException("Unsafe sendmail command {$command}");
}
}
return (new SendmailTransportFactory())->create($dsn);
}
/**
* {@inheritdoc}
*/
protected function getSupportedSchemes(): array {
return ['sendmail', 'sendmail+smtp'];
}
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace Drupal\symfony_mailer; namespace Drupal\symfony_mailer;
use Symfony\Component\Mailer\Transport; use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Transport\SendmailTransportFactory;
use Symfony\Component\Mailer\Transport\TransportFactoryInterface; use Symfony\Component\Mailer\Transport\TransportFactoryInterface;
/** /**
...@@ -22,6 +23,12 @@ class TransportFactoryManager implements TransportFactoryManagerInterface { ...@@ -22,6 +23,12 @@ class TransportFactoryManager implements TransportFactoryManagerInterface {
*/ */
public function __construct() { public function __construct() {
$this->factories = iterator_to_array(Transport::getDefaultFactories()); $this->factories = iterator_to_array(Transport::getDefaultFactories());
// Replace the sendmail transport factory with our own implementation.
$this->factories = array_filter($this->factories, function ($factory) {
return !($factory instanceof SendmailTransportFactory);
});
$this->addFactory(new ReplacementSendmailTransportFactory());
} }
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment