From 13b1b45ee4bab5b832ca3a1602b4c4fb6d391f86 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Fri, 3 Oct 2014 15:14:22 +0200 Subject: Refactor MailSettings controller - Do not store the password (fixes https://github.com/owncloud/core/issues/11385) - Refactor to AppFramework - Add unit tests Conflicts: settings/admin/controller.php --- settings/admin/controller.php | 123 ------------------ settings/application.php | 70 +++++++++++ settings/controller/mailsettingscontroller.php | 166 +++++++++++++++++++++++++ settings/css/settings.css | 4 +- settings/js/admin.js | 12 +- settings/routes.php | 17 +-- settings/templates/admin.php | 149 +++++++++++----------- 7 files changed, 334 insertions(+), 207 deletions(-) delete mode 100644 settings/admin/controller.php create mode 100644 settings/application.php create mode 100644 settings/controller/mailsettingscontroller.php (limited to 'settings') diff --git a/settings/admin/controller.php b/settings/admin/controller.php deleted file mode 100644 index 395bc7c6e49..00000000000 --- a/settings/admin/controller.php +++ /dev/null @@ -1,123 +0,0 @@ -. -*/ - -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' ); - } - } -} diff --git a/settings/application.php b/settings/application.php new file mode 100644 index 00000000000..b17ca01c2f3 --- /dev/null +++ b/settings/application.php @@ -0,0 +1,70 @@ +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'); + }); + } +} diff --git a/settings/controller/mailsettingscontroller.php b/settings/controller/mailsettingscontroller.php new file mode 100644 index 00000000000..1cfb10c6fe9 --- /dev/null +++ b/settings/controller/mailsettingscontroller.php @@ -0,0 +1,166 @@ +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' + ); + } + +} diff --git a/settings/css/settings.css b/settings/css/settings.css index 581904591d0..d89c50e4114 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -178,12 +178,12 @@ span.securitywarning, span.connectionwarning, .setupwarning { padding-left: 56px; } -#mail_settings p label:first-child { +.mail_settings p label:first-child { display: inline-block; width: 300px; text-align: right; } -#mail_settings p select:nth-child(2) { +.mail_settings p select:nth-child(2) { width: 143px; } #mail_smtpport { diff --git a/settings/js/admin.js b/settings/js/admin.js index d8cdae9d11b..09e8a1d6916 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -103,14 +103,22 @@ $(document).ready(function(){ } }); - $('#mail_settings').change(function(){ + $('#mail_general_settings').change(function(){ OC.msg.startSaving('#mail_settings_msg'); - var post = $( "#mail_settings" ).serialize(); + var post = $( "#mail_general_settings" ).serialize(); $.post(OC.generateUrl('/settings/admin/mailsettings'), post, function(data){ OC.msg.finishedSaving('#mail_settings_msg', data); }); }); + $('#mail_credentials_settings_submit').click(function(){ + OC.msg.startSaving('#mail_settings_msg'); + var post = $( "#mail_credentials_settings" ).serialize(); + $.post(OC.generateUrl('/settings/admin/mailsettings/credentials'), post, function(data){ + OC.msg.finishedSaving('#mail_settings_msg', data); + }); + }); + $('#sendtestemail').click(function(event){ event.preventDefault(); OC.msg.startAction('#sendtestmail_msg', t('settings', 'Sending...')); diff --git a/settings/routes.php b/settings/routes.php index 25a8b1da7e0..7068c0df723 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -6,7 +6,16 @@ * See the COPYING-README file. */ -/** @var $this OCP\Route\IRouter */ +namespace OC\Settings; + +$application = new Application(); +$application->registerRoutes($this, array('routes' =>array( + array('name' => 'MailSettings#setMailSettings', 'url' => '/settings/admin/mailsettings', 'verb' => 'POST'), + array('name' => 'MailSettings#storeCredentials', 'url' => '/settings/admin/mailsettings/credentials', 'verb' => 'POST'), + array('name' => 'MailSettings#sendTestMail', 'url' => '/settings/admin/mailtest', 'verb' => 'POST'), +))); + +/** @var $this \OCP\Route\IRouter */ // Settings pages $this->create('settings_help', '/settings/help') @@ -88,12 +97,6 @@ $this->create('settings_ajax_getlog', '/settings/ajax/getlog.php') ->actionInclude('settings/ajax/getlog.php'); $this->create('settings_ajax_setloglevel', '/settings/ajax/setloglevel.php') ->actionInclude('settings/ajax/setloglevel.php'); -$this->create('settings_mail_settings', '/settings/admin/mailsettings') - ->post() - ->action('OC\Settings\Admin\Controller', 'setMailSettings'); -$this->create('settings_admin_mail_test', '/settings/admin/mailtest') - ->post() - ->action('OC\Settings\Admin\Controller', 'sendTestMail'); $this->create('settings_ajax_setsecurity', '/settings/ajax/setsecurity.php') ->actionInclude('settings/ajax/setsecurity.php'); $this->create('settings_ajax_excludegroups', '/settings/ajax/excludegroups.php') diff --git a/settings/templates/admin.php b/settings/templates/admin.php index d6bb298caef..6b4623173af 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -333,87 +333,90 @@ if ($_['suggestedOverwriteWebroot']) {

-
-

t('Email Server'));?>

- -

t('This is used for sending out notifications.')); ?>

- -

- - - - - -

- -

- - ' /> - @ - ' /> -

+
+ +

t('Email Server'));?>

+ +

t('This is used for sending out notifications.')); ?>

+ +

+ + + + + +

- +

+ + ' /> + ' /> +

- + - + + +
+ +

t( 'Test email settings' )); ?> -
+

t('Log'));?>

-- cgit v1.2.3