- Do not store the password (fixes https://github.com/owncloud/core/issues/11385) - Refactor to AppFramework - Add unit tests Conflicts: settings/admin/controller.phpremotes/origin/fix-10825
parent
766314a6be
commit
13b1b45ee4
@ -1,123 +0,0 @@ |
||||
<?php |
||||
/** |
||||
* @author Joas Schilling |
||||
* @copyright 2014 Joas Schilling nickvergessen@owncloud.com |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
*/ |
||||
|
||||
namespace OC\Settings\Admin; |
||||
|
||||
class Controller { |
||||
/** |
||||
* Set mail settings |
||||
*/ |
||||
public static function setMailSettings() { |
||||
\OC_Util::checkAdminUser(); |
||||
\OCP\JSON::callCheck(); |
||||
|
||||
$l = \OC::$server->getL10N('settings'); |
||||
|
||||
$smtp_settings = array( |
||||
'mail_domain' => null, |
||||
'mail_from_address' => null, |
||||
'mail_smtpmode' => array('sendmail', 'smtp', 'qmail', 'php'), |
||||
'mail_smtpsecure' => array('', 'ssl', 'tls'), |
||||
'mail_smtphost' => null, |
||||
'mail_smtpport' => null, |
||||
'mail_smtpauthtype' => array('LOGIN', 'PLAIN', 'NTLM'), |
||||
'mail_smtpauth' => true, |
||||
'mail_smtpname' => null, |
||||
'mail_smtppassword' => null, |
||||
); |
||||
|
||||
foreach ($smtp_settings as $setting => $validate) { |
||||
if (!$validate) { |
||||
if (!isset($_POST[$setting]) || $_POST[$setting] === '') { |
||||
\OC_Config::deleteKey( $setting ); |
||||
} else { |
||||
\OC_Config::setValue( $setting, $_POST[$setting] ); |
||||
} |
||||
} |
||||
else if (is_bool($validate)) { |
||||
if (!empty($_POST[$setting])) { |
||||
\OC_Config::setValue( $setting, (bool) $_POST[$setting] ); |
||||
} else { |
||||
\OC_Config::deleteKey( $setting ); |
||||
} |
||||
} |
||||
else if (is_array($validate)) { |
||||
if (!isset($_POST[$setting]) || $_POST[$setting] === '') { |
||||
\OC_Config::deleteKey( $setting ); |
||||
} else if (in_array($_POST[$setting], $validate)) { |
||||
\OC_Config::setValue( $setting, $_POST[$setting] ); |
||||
} else { |
||||
$message = $l->t('Invalid value supplied for %s', array(self::getFieldname($setting, $l))); |
||||
\OC_JSON::error( array( "data" => array( "message" => $message)) ); |
||||
exit; |
||||
} |
||||
} |
||||
} |
||||
|
||||
\OC_JSON::success(array("data" => array( "message" => $l->t("Saved") ))); |
||||
} |
||||
|
||||
/** |
||||
* Send a mail to test the settings |
||||
*/ |
||||
public static function sendTestMail() { |
||||
\OC_Util::checkAdminUser(); |
||||
\OCP\JSON::callCheck(); |
||||
|
||||
$l = \OC::$server->getL10N('settings'); |
||||
$email = \OC_Preferences::getValue(\OC_User::getUser(), 'settings', 'email', ''); |
||||
if (!empty($email)) { |
||||
$defaults = new \OC_Defaults(); |
||||
|
||||
try { |
||||
\OC_Mail::send($email, \OC_User::getDisplayName(), |
||||
$l->t('test email settings'), |
||||
$l->t('If you received this email, the settings seem to be correct.'), |
||||
\OCP\Util::getDefaultEmailAddress('no-reply'), $defaults->getName()); |
||||
} catch (\Exception $e) { |
||||
$message = $l->t('A problem occurred while sending the e-mail. Please revisit your settings.'); |
||||
\OC_JSON::error( array( "data" => array( "message" => $message)) ); |
||||
exit; |
||||
} |
||||
|
||||
\OC_JSON::success(array("data" => array( "message" => $l->t("Email sent") ))); |
||||
} else { |
||||
$message = $l->t('You need to set your user email before being able to send test emails.'); |
||||
\OC_JSON::error( array( "data" => array( "message" => $message)) ); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Get the field name to use it in error messages |
||||
* |
||||
* @param string $setting |
||||
* @param \OC_L10N $l |
||||
* @return string |
||||
*/ |
||||
public static function getFieldname($setting, $l) { |
||||
switch ($setting) { |
||||
case 'mail_smtpmode': |
||||
return $l->t( 'Send mode' ); |
||||
case 'mail_smtpsecure': |
||||
return $l->t( 'Encryption' ); |
||||
case 'mail_smtpauthtype': |
||||
return $l->t( 'Authentication method' ); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,70 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke |
||||
* @copyright 2014 Lukas Reschke lukas@owncloud.com |
||||
* |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
namespace OC\Settings; |
||||
|
||||
use OC\AppFramework\Utility\SimpleContainer; |
||||
use OC\Settings\Controller\MailSettingsController; |
||||
use \OCP\AppFramework\App; |
||||
use \OCP\Util; |
||||
|
||||
/** |
||||
* @package OC\Settings |
||||
*/ |
||||
class Application extends App { |
||||
|
||||
|
||||
/** |
||||
* @param array $urlParams |
||||
*/ |
||||
public function __construct(array $urlParams=array()){ |
||||
parent::__construct('settings', $urlParams); |
||||
|
||||
$container = $this->getContainer(); |
||||
|
||||
/** |
||||
* Controllers |
||||
*/ |
||||
$container->registerService('MailSettingsController', function(SimpleContainer $c) { |
||||
return new MailSettingsController( |
||||
$c->query('AppName'), |
||||
$c->query('Request'), |
||||
$c->query('L10N'), |
||||
$c->query('Config'), |
||||
$c->query('UserSession'), |
||||
$c->query('Defaults'), |
||||
$c->query('Mail'), |
||||
$c->query('DefaultMailAddress') |
||||
); |
||||
}); |
||||
|
||||
/** |
||||
* Core class wrappers |
||||
*/ |
||||
$container->registerService('Config', function(SimpleContainer $c) { |
||||
return $c->query('ServerContainer')->getConfig(); |
||||
}); |
||||
$container->registerService('L10N', function(SimpleContainer $c) { |
||||
return $c->query('ServerContainer')->getL10N('settings'); |
||||
}); |
||||
$container->registerService('UserSession', function(SimpleContainer $c) { |
||||
return $c->query('ServerContainer')->getUserSession(); |
||||
}); |
||||
$container->registerService('Mail', function(SimpleContainer $c) { |
||||
return new \OC_Mail; |
||||
}); |
||||
$container->registerService('Defaults', function(SimpleContainer $c) { |
||||
return new \OC_Defaults; |
||||
}); |
||||
$container->registerService('DefaultMailAddress', function(SimpleContainer $c) { |
||||
return Util::getDefaultEmailAddress('no-reply'); |
||||
}); |
||||
} |
||||
} |
||||
@ -0,0 +1,166 @@ |
||||
<?php |
||||
/** |
||||
* @author Joas Schilling |
||||
* @author Lukas Reschke |
||||
* @copyright 2014 Joas Schilling nickvergessen@owncloud.com |
||||
* |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
namespace OC\Settings\Controller; |
||||
|
||||
use OC\User\Session; |
||||
use \OCP\AppFramework\Controller; |
||||
use OCP\IRequest; |
||||
use OCP\IL10N; |
||||
use OCP\IConfig; |
||||
|
||||
/** |
||||
* @package OC\Settings\Controller |
||||
*/ |
||||
class MailSettingsController extends Controller { |
||||
|
||||
/** @var \OCP\IL10N */ |
||||
private $l10n; |
||||
/** @var \OCP\IConfig */ |
||||
private $config; |
||||
/** @var Session */ |
||||
private $userSession; |
||||
/** @var \OC_Defaults */ |
||||
private $defaults; |
||||
/** @var \OC_Mail */ |
||||
private $mail; |
||||
/** @var string */ |
||||
private $defaultMailAddress; |
||||
|
||||
/** |
||||
* @param string $appName |
||||
* @param IRequest $request |
||||
* @param IL10N $l10n |
||||
* @param IConfig $config |
||||
* @param Session $userSession |
||||
* @param \OC_Defaults $defaults |
||||
* @param \OC_Mail $mail |
||||
* @param string $defaultMailAddress |
||||
*/ |
||||
public function __construct($appName, |
||||
IRequest $request, |
||||
IL10N $l10n, |
||||
IConfig $config, |
||||
Session $userSession, |
||||
\OC_Defaults $defaults, |
||||
\OC_Mail $mail, |
||||
$defaultMailAddress) { |
||||
parent::__construct($appName, $request); |
||||
$this->l10n = $l10n; |
||||
$this->config = $config; |
||||
$this->userSession = $userSession; |
||||
$this->defaults = $defaults; |
||||
$this->mail = $mail; |
||||
$this->defaultMailAddress = $defaultMailAddress; |
||||
} |
||||
|
||||
/** |
||||
* Sets the email settings |
||||
* @param string $mail_domain |
||||
* @param string $mail_from_address |
||||
* @param string $mail_smtpmode |
||||
* @param string $mail_smtpsecure |
||||
* @param string $mail_smtphost |
||||
* @param string $mail_smtpauthtype |
||||
* @param int $mail_smtpauth |
||||
* @param string $mail_smtpport |
||||
* @return array |
||||
*/ |
||||
public function setMailSettings($mail_domain, |
||||
$mail_from_address, |
||||
$mail_smtpmode, |
||||
$mail_smtpsecure, |
||||
$mail_smtphost, |
||||
$mail_smtpauthtype, |
||||
$mail_smtpauth, |
||||
$mail_smtpport) { |
||||
|
||||
$params = get_defined_vars(); |
||||
foreach($params as $key => $value) { |
||||
if(empty($value)) { |
||||
$this->config->deleteSystemValue($key); |
||||
} else { |
||||
$this->config->setSystemValue($key, $value); |
||||
} |
||||
} |
||||
|
||||
// Delete passwords from config in case no auth is specified |
||||
if($params['mail_smtpauth'] !== 1) { |
||||
$this->config->deleteSystemValue('mail_smtpname'); |
||||
$this->config->deleteSystemValue('mail_smtppassword'); |
||||
} |
||||
|
||||
return array('data' => |
||||
array('message' => |
||||
(string) $this->l10n->t('Saved') |
||||
), |
||||
'status' => 'success' |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Store the credentials used for SMTP in the config |
||||
* @param string $mail_smtpname |
||||
* @param string $mail_smtppassword |
||||
* @return array |
||||
*/ |
||||
public function storeCredentials($mail_smtpname, $mail_smtppassword) { |
||||
$this->config->setSystemValue('mail_smtpname', $mail_smtpname); |
||||
$this->config->setSystemValue('mail_smtppassword', $mail_smtppassword); |
||||
|
||||
return array('data' => |
||||
array('message' => |
||||
(string) $this->l10n->t('Saved') |
||||
), |
||||
'status' => 'success' |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Send a mail to test the settings |
||||
* @return array |
||||
*/ |
||||
public function sendTestMail() { |
||||
$email = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'email', ''); |
||||
if (!empty($email)) { |
||||
try { |
||||
$this->mail->send($email, $this->userSession->getUser()->getDisplayName(), |
||||
$this->l10n->t('test email settings'), |
||||
$this->l10n->t('If you received this email, the settings seems to be correct.'), |
||||
$this->defaultMailAddress, |
||||
$this->defaults->getName() |
||||
); |
||||
} catch (\Exception $e) { |
||||
return array('data' => |
||||
array('message' => |
||||
(string) $this->l10n->t('A problem occurred while sending the e-mail. Please revisit your settings.'), |
||||
), |
||||
'status' => 'error' |
||||
); |
||||
} |
||||
|
||||
return array('data' => |
||||
array('message' => |
||||
(string) $this->l10n->t('Email sent') |
||||
), |
||||
'status' => 'success' |
||||
); |
||||
} |
||||
|
||||
return array('data' => |
||||
array('message' => |
||||
(string) $this->l10n->t('You need to set your user email before being able to send test emails.'), |
||||
), |
||||
'status' => 'error' |
||||
); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,196 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke |
||||
* @copyright 2014 Lukas Reschke lukas@owncloud.com |
||||
* |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
namespace OC\Settings\Controller; |
||||
|
||||
use \OC\Settings\Application; |
||||
|
||||
/** |
||||
* @package OC\Settings\Controller |
||||
*/ |
||||
class MailSettingscontrollerTest extends \PHPUnit_Framework_TestCase { |
||||
|
||||
private $container; |
||||
|
||||
protected function setUp() { |
||||
$app = new Application(); |
||||
$this->container = $app->getContainer(); |
||||
$this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') |
||||
->disableOriginalConstructor()->getMock(); |
||||
$this->container['L10N'] = $this->getMockBuilder('\OCP\IL10N') |
||||
->disableOriginalConstructor()->getMock(); |
||||
$this->container['AppName'] = 'settings'; |
||||
$this->container['UserSession'] = $this->getMockBuilder('\OC\User\Session') |
||||
->disableOriginalConstructor()->getMock(); |
||||
$this->container['Mail'] = $this->getMockBuilder('\OC_Mail') |
||||
->disableOriginalConstructor()->getMock(); |
||||
$this->container['Defaults'] = $this->getMockBuilder('\OC_Defaults') |
||||
->disableOriginalConstructor()->getMock(); |
||||
$this->container['DefaultMailAddress'] = 'no-reply@owncloud.com'; |
||||
} |
||||
|
||||
public function testSetMailSettings() { |
||||
$this->container['L10N'] |
||||
->expects($this->exactly(2)) |
||||
->method('t') |
||||
->will($this->returnValue('Saved')); |
||||
|
||||
/** |
||||
* FIXME: Use the following block once Jenkins uses PHPUnit >= 4.1 |
||||
*/ |
||||
/* |
||||
$this->container['Config'] |
||||
->expects($this->exactly(15)) |
||||
->method('setSystemValue') |
||||
->withConsecutive( |
||||
array($this->equalTo('mail_domain'), $this->equalTo('owncloud.com')), |
||||
array($this->equalTo('mail_from_address'), $this->equalTo('demo@owncloud.com')), |
||||
array($this->equalTo('mail_smtpmode'), $this->equalTo('smtp')), |
||||
array($this->equalTo('mail_smtpsecure'), $this->equalTo('ssl')), |
||||
array($this->equalTo('mail_smtphost'), $this->equalTo('mx.owncloud.org')), |
||||
array($this->equalTo('mail_smtpauthtype'), $this->equalTo('NTLM')), |
||||
array($this->equalTo('mail_smtpauth'), $this->equalTo(1)), |
||||
array($this->equalTo('mail_smtpport'), $this->equalTo('25')), |
||||
array($this->equalTo('mail_domain'), $this->equalTo('owncloud.com')), |
||||
array($this->equalTo('mail_from_address'), $this->equalTo('demo@owncloud.com')), |
||||
array($this->equalTo('mail_smtpmode'), $this->equalTo('smtp')), |
||||
array($this->equalTo('mail_smtpsecure'), $this->equalTo('ssl')), |
||||
array($this->equalTo('mail_smtphost'), $this->equalTo('mx.owncloud.org')), |
||||
array($this->equalTo('mail_smtpauthtype'), $this->equalTo('NTLM')), |
||||
array($this->equalTo('mail_smtpport'), $this->equalTo('25')) |
||||
); |
||||
*/ |
||||
|
||||
$this->container['Config'] |
||||
->expects($this->exactly(15)) |
||||
->method('setSystemValue'); |
||||
|
||||
/** |
||||
* FIXME: Use the following block once Jenkins uses PHPUnit >= 4.1 |
||||
*/ |
||||
/* |
||||
$this->container['Config'] |
||||
->expects($this->exactly(3)) |
||||
->method('deleteSystemValue') |
||||
->withConsecutive( |
||||
array($this->equalTo('mail_smtpauth')), |
||||
array($this->equalTo('mail_smtpname')), |
||||
array($this->equalTo('mail_smtppassword')) |
||||
); |
||||
*/ |
||||
$this->container['Config'] |
||||
->expects($this->exactly(3)) |
||||
->method('deleteSystemValue'); |
||||
|
||||
// With authentication |
||||
$response = $this->container['MailSettingsController']->setMailSettings( |
||||
'owncloud.com', |
||||
'demo@owncloud.com', |
||||
'smtp', |
||||
'ssl', |
||||
'mx.owncloud.org', |
||||
'NTLM', |
||||
1, |
||||
'25' |
||||
); |
||||
$expectedResponse = array('data' => array('message' =>'Saved'), 'status' => 'success'); |
||||
$this->assertSame($expectedResponse, $response); |
||||
|
||||
// Without authentication (testing the deletion of the stored password) |
||||
$response = $this->container['MailSettingsController']->setMailSettings( |
||||
'owncloud.com', |
||||
'demo@owncloud.com', |
||||
'smtp', |
||||
'ssl', |
||||
'mx.owncloud.org', |
||||
'NTLM', |
||||
0, |
||||
'25' |
||||
); |
||||
$expectedResponse = array('data' => array('message' =>'Saved'), 'status' => 'success'); |
||||
$this->assertSame($expectedResponse, $response); |
||||
|
||||
} |
||||
|
||||
public function testStoreCredentials() { |
||||
$this->container['L10N'] |
||||
->expects($this->once()) |
||||
->method('t') |
||||
->will($this->returnValue('Saved')); |
||||
|
||||
/** |
||||
* FIXME: Use this block once Jenkins uses PHPUnit >= 4.1 |
||||
*/ |
||||
/* |
||||
$this->container['Config'] |
||||
->expects($this->exactly(2)) |
||||
->method('setSystemValue') |
||||
->withConsecutive( |
||||
array($this->equalTo('mail_smtpname'), $this->equalTo('UsernameToStore')), |
||||
array($this->equalTo('mail_smtppassword'), $this->equalTo('PasswordToStore')) |
||||
); |
||||
*/ |
||||
$this->container['Config'] |
||||
->expects($this->exactly(2)) |
||||
->method('setSystemValue'); |
||||
|
||||
$response = $this->container['MailSettingsController']->storeCredentials('UsernameToStore', 'PasswordToStore'); |
||||
$expectedResponse = array('data' => array('message' =>'Saved'), 'status' => 'success'); |
||||
|
||||
$this->assertSame($expectedResponse, $response); |
||||
} |
||||
|
||||
public function testSendTestMail() { |
||||
$user = $this->getMockBuilder('\OC\User\User') |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
$user->expects($this->any()) |
||||
->method('getUID') |
||||
->will($this->returnValue('Werner')); |
||||
$user->expects($this->any()) |
||||
->method('getDisplayName') |
||||
->will($this->returnValue('Werner Brösel')); |
||||
|
||||
$this->container['L10N'] |
||||
->expects($this->any()) |
||||
->method('t') |
||||
->will( |
||||
$this->returnValueMap( |
||||
array( |
||||
array('You need to set your user email before being able to send test emails.', array(), |
||||
'You need to set your user email before being able to send test emails.'), |
||||
array('A problem occurred while sending the e-mail. Please revisit your settings.', array(), |
||||
'A problem occurred while sending the e-mail. Please revisit your settings.'), |
||||
array('Email sent', array(), 'Email sent'), |
||||
array('test email settings', array(), 'test email settings'), |
||||
array('If you received this email, the settings seems to be correct.', array(), |
||||
'If you received this email, the settings seems to be correct.') |
||||
) |
||||
)); |
||||
$this->container['UserSession'] |
||||
->expects($this->any()) |
||||
->method('getUser') |
||||
->will($this->returnValue($user)); |
||||
|
||||
// Ensure that it fails when no mail address has been specified |
||||
$response = $this->container['MailSettingsController']->sendTestMail(); |
||||
$expectedResponse = array('data' => array('message' =>'You need to set your user email before being able to send test emails.'), 'status' => 'error'); |
||||
$this->assertSame($expectedResponse, $response); |
||||
|
||||
// If no exception is thrown it should work |
||||
$this->container['Config'] |
||||
->expects($this->any()) |
||||
->method('getUserValue') |
||||
->will($this->returnValue('mail@example.invalid')); |
||||
$response = $this->container['MailSettingsController']->sendTestMail(); |
||||
$expectedResponse = array('data' => array('message' =>'Email sent'), 'status' => 'success'); |
||||
$this->assertSame($expectedResponse, $response); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue