Merge pull request #12749 from nextcloud/backport/12424/stable14

[stable14] Add pipe mode for sendmail
This commit is contained in:
Christoph Wurst 2018-12-10 09:46:12 +01:00 committed by GitHub
commit 26a5b6d5c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 95 additions and 19 deletions

View File

@ -421,6 +421,19 @@ $CONFIG = array(
*/
'mail_send_plaintext_only' => false,
/**
* Which mode is used for sendmail/qmail: ``smtp`` or ``pipe``.
*
* For ``smtp`` the sendmail binary is started with the parameter ``-bs``:
* - Use the SMTP protocol on standard input and output.
*
* For ``pipe`` the binary is started with the parameters ``-t``:
* - Read message from STDIN and extract recipients.
*
* Defaults to ``smtp``
*/
'mail_sendmailmode' => 'smtp',
/**
* Proxy Configurations
*/

View File

@ -278,6 +278,15 @@ class Mailer implements IMailer {
break;
}
return new \Swift_SendmailTransport($binaryPath . ' -bs');
switch ($this->config->getSystemValue('mail_sendmailmode', 'smtp')) {
case 'pipe':
$binaryParam = ' -t';
break;
default:
$binaryParam = ' -bs';
break;
}
return new \Swift_SendmailTransport($binaryPath . $binaryParam);
}
}

View File

@ -57,6 +57,7 @@ class Mail implements ISettings {
'mail_smtpauth' => $this->config->getSystemValue('mail_smtpauth', false),
'mail_smtpname' => $this->config->getSystemValue('mail_smtpname', ''),
'mail_smtppassword' => $this->config->getSystemValue('mail_smtppassword', ''),
'mail_sendmailmode' => $this->config->getSystemValue('mail_sendmailmode', 'smtp'),
];
if ($parameters['mail_smtppassword'] !== '') {

View File

@ -91,7 +91,8 @@ class MailSettingsController extends Controller {
$mail_smtphost,
$mail_smtpauthtype,
$mail_smtpauth,
$mail_smtpport) {
$mail_smtpport,
$mail_sendmailmode) {
$params = get_defined_vars();
$configs = [];

View File

@ -161,6 +161,7 @@ $(document).ready(function(){
$('#mail_smtpsecure_label').addClass('hidden');
$('#mail_smtpsecure').addClass('hidden');
$('#mail_credentials').addClass('hidden');
$('#mail_sendmailmode_label, #mail_sendmailmode').removeClass('hidden');
} else {
$('#setting_smtpauth').removeClass('hidden');
$('#setting_smtphost').removeClass('hidden');
@ -169,6 +170,7 @@ $(document).ready(function(){
if ($('#mail_smtpauth').is(':checked')) {
$('#mail_credentials').removeClass('hidden');
}
$('#mail_sendmailmode_label, #mail_sendmailmode').addClass('hidden');
}
});

View File

@ -47,6 +47,11 @@ if ($_['mail_smtpmode'] === 'qmail') {
$mail_smtpmode[] = ['qmail', 'qmail'];
}
$mail_sendmailmode = [
'smtp' => 'smtp (-bs)',
'pipe' => 'pipe (-t)'
];
?>
<div class="section" id="mail_general_settings">
@ -84,6 +89,15 @@ if ($_['mail_smtpmode'] === 'qmail') {
<option value="<?php p($secure)?>" <?php p($selected) ?>><?php p($name) ?></option>
<?php endforeach;?>
</select>
<label id="mail_sendmailmode_label" for="mail_sendmailmode" class="<?= $_['mail_smtpmode'] !== 'sendmail' ? 'hidden' : '' ?>">
<?php p($l->t('Sendmail mode')); ?>
</label>
<select name="mail_sendmailmode" id="mail_sendmailmode" class="<?= $_['mail_smtpmode'] !== 'sendmail' ? 'hidden' : '' ?>">
<?php foreach ($mail_sendmailmode as $sendmailmodeValue => $sendmailmodeLabel): ?>
<option value="<?php p($sendmailmodeValue)?>" <?= $sendmailmodeValue === $_['mail_sendmailmode'] ? 'selected="selected"' : '' ?>><?php p($sendmailmodeLabel) ?></option>
<?php endforeach;?>
</select>
</p>
<p>

View File

@ -74,6 +74,7 @@ class MailSettingsControllerTest extends \Test\TestCase {
'mail_smtpauthtype' => 'NTLM',
'mail_smtpauth' => 1,
'mail_smtpport' => '25',
'mail_sendmailmode' => null,
]],
[[
'mail_domain' => 'nextcloud.com',
@ -86,6 +87,7 @@ class MailSettingsControllerTest extends \Test\TestCase {
'mail_smtpport' => '25',
'mail_smtpname' => null,
'mail_smtppassword' => null,
'mail_sendmailmode' => null,
]]
);
@ -98,7 +100,8 @@ class MailSettingsControllerTest extends \Test\TestCase {
'mx.nextcloud.org',
'NTLM',
1,
'25'
'25',
null
);
$this->assertSame(Http::STATUS_OK, $response->getStatus());
@ -111,7 +114,8 @@ class MailSettingsControllerTest extends \Test\TestCase {
'mx.nextcloud.org',
'NTLM',
0,
'25'
'25',
null
);
$this->assertSame(Http::STATUS_OK, $response->getStatus());

View File

@ -48,24 +48,48 @@ class MailerTest extends TestCase {
);
}
public function testGetSendMailInstanceSendMail() {
$this->config
->expects($this->once())
->method('getSystemValue')
->with('mail_smtpmode', 'smtp')
->will($this->returnValue('sendmail'));
$this->assertEquals(new \Swift_SendmailTransport('/usr/sbin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance'));
/**
* @return array
*/
public function sendmailModeProvider(): array {
return [
'smtp' => ['smtp', ' -bs'],
'pipe' => ['pipe', ' -t'],
];
}
public function testGetSendMailInstanceSendMailQmail() {
/**
* @dataProvider sendmailModeProvider
* @param $sendmailMode
* @param $binaryParam
*/
public function testGetSendmailInstanceSendMail($sendmailMode, $binaryParam) {
$this->config
->expects($this->once())
->expects($this->exactly(2))
->method('getSystemValue')
->with('mail_smtpmode', 'smtp')
->will($this->returnValue('qmail'));
->will($this->returnValueMap([
['mail_smtpmode', 'smtp', 'sendmail'],
['mail_sendmailmode', 'smtp', $sendmailMode],
]));
$this->assertEquals(new \Swift_SendmailTransport('/var/qmail/bin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance'));
$this->assertEquals(new \Swift_SendmailTransport('/usr/sbin/sendmail' . $binaryParam), self::invokePrivate($this->mailer, 'getSendMailInstance'));
}
/**
* @dataProvider sendmailModeProvider
* @param $sendmailMode
* @param $binaryParam
*/
public function testGetSendmailInstanceSendMailQmail($sendmailMode, $binaryParam) {
$this->config
->expects($this->exactly(2))
->method('getSystemValue')
->will($this->returnValueMap([
['mail_smtpmode', 'smtp', 'qmail'],
['mail_sendmailmode', 'smtp', $sendmailMode],
]));
$this->assertEquals(new \Swift_SendmailTransport('/var/qmail/bin/sendmail' . $binaryParam), self::invokePrivate($this->mailer, 'getSendMailInstance'));
}
public function testGetInstanceDefault() {
@ -77,8 +101,10 @@ class MailerTest extends TestCase {
public function testGetInstanceSendmail() {
$this->config
->method('getSystemValue')
->with('mail_smtpmode', 'smtp')
->willReturn('sendmail');
->will($this->returnValueMap([
['mail_smtpmode', 'smtp', 'sendmail'],
['mail_sendmailmode', 'smtp', 'smtp'],
]));
$mailer = self::invokePrivate($this->mailer, 'getInstance');
$this->assertInstanceOf(\Swift_Mailer::class, $mailer);

View File

@ -95,6 +95,11 @@ class MailTest extends TestCase {
->method('getSystemValue')
->with('mail_smtppassword', '')
->willReturn('mypassword');
$this->config
->expects($this->at(10))
->method('getSystemValue')
->with('mail_sendmailmode', 'smtp')
->willReturn('smtp');
$expected = new TemplateResponse(
'settings',
@ -111,6 +116,7 @@ class MailTest extends TestCase {
'mail_smtpauth' => true,
'mail_smtpname' => 'smtp.sender.com',
'mail_smtppassword' => '********',
'mail_sendmailmode' => 'smtp',
],
''
);