From d576ec726e85154947bf19756e70603c3a7dabc1 Mon Sep 17 00:00:00 2001 From: Kallys Date: Thu, 1 Jun 2017 12:14:23 +0200 Subject: [PATCH 1/8] Allow users to close their tickets with user system disabled --- server/controllers/ticket/close.php | 51 +++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/server/controllers/ticket/close.php b/server/controllers/ticket/close.php index d63b63ef..70a84b3a 100755 --- a/server/controllers/ticket/close.php +++ b/server/controllers/ticket/close.php @@ -30,15 +30,34 @@ class CloseController extends Controller { private $ticket; public function validations() { - return [ - 'permission' => 'user', - 'requestData' => [ - 'ticketNumber' => [ - 'validation' => DataValidator::validTicketNumber(), - 'error' => ERRORS::INVALID_TICKET + $session = Session::getInstance(); + + if (Controller::isUserSystemEnabled() || Controller::isStaffLogged()) { + return [ + 'permission' => 'user', + 'requestData' => [ + 'ticketNumber' => [ + 'validation' => DataValidator::validTicketNumber(), + 'error' => ERRORS::INVALID_TICKET + ] ] - ] - ]; + ]; + } else { + return [ + 'permission' => 'any', + 'requestData' => [ + 'ticketNumber' => [ + 'validation' => DataValidator::equals($session->getTicketNumber()), + 'error' => ERRORS::INVALID_TICKET + ], + 'csrf_token' => [ + 'validation' => DataValidator::equals($session->getToken()), + 'error' => Controller::request('csrf_token') . ' != ' . $session->getToken() + + ] + ] + ]; + } } public function handler() { @@ -62,10 +81,14 @@ class CloseController extends Controller { } private function shouldDenyPermission() { - $user = Controller::getLoggedUser(); + if(Controller::isUserSystemEnabled() || Controller::isStaffLogged()) { + $user = Controller::getLoggedUser(); - return (!Controller::isStaffLogged() && $this->ticket->author->id !== $user->id) || - (Controller::isStaffLogged() && $this->ticket->owner && $this->ticket->owner->id !== $user->id); + return (!Controller::isStaffLogged() && $this->ticket->author->id !== $user->id) || + (Controller::isStaffLogged() && $this->ticket->owner && $this->ticket->owner->id !== $user->id); + } else { + return $this->ticket->ticket_number != Session::getInstance()->getTicketNumber(); + } } private function markAsUnread() { @@ -95,8 +118,8 @@ class CloseController extends Controller { $mailSender = new MailSender(); $mailSender->setTemplate(MailTemplate::TICKET_CLOSED, [ - 'to' => $this->ticket->author->email, - 'name' => $this->ticket->author->name, + 'to' => ($this->ticket->author) ? $this->ticket->author->email : $this->ticket->authorEmail, + 'name' => ($this->ticket->author) ? $this->ticket->author->name : $this->ticket->authorName, 'ticketNumber' => $this->ticket->ticketNumber, 'title' => $this->ticket->title, 'url' => Setting::getSetting('url')->getValue() @@ -104,4 +127,4 @@ class CloseController extends Controller { $mailSender->send(); } -} \ No newline at end of file +} From ec34acc0808410a77c5977e440c5b00253e21d19 Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Mon, 5 Jun 2017 11:41:52 -0300 Subject: [PATCH 2/8] Ivan - Avoid verification if smtp is not set. Implement singleton pattern in MailSender class --- .../system/disable-user-system.php | 2 +- .../controllers/system/enable-user-system.php | 2 +- server/controllers/ticket/close.php | 2 +- server/controllers/ticket/comment.php | 2 +- server/controllers/ticket/create.php | 2 +- server/controllers/user/edit-email.php | 2 +- server/controllers/user/edit-password.php | 2 +- server/controllers/user/recover-password.php | 2 +- .../user/send-recover-password.php | 2 +- server/controllers/user/signup.php | 9 ++- server/libs/MailSender.php | 79 +++++++++++++------ 11 files changed, 69 insertions(+), 37 deletions(-) diff --git a/server/controllers/system/disable-user-system.php b/server/controllers/system/disable-user-system.php index 71286148..1e3bb066 100755 --- a/server/controllers/system/disable-user-system.php +++ b/server/controllers/system/disable-user-system.php @@ -62,7 +62,7 @@ class DisableUserSystemController extends Controller { $ticket->store(); } - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::USER_SYSTEM_DISABLED, [ 'to' => $user->email, diff --git a/server/controllers/system/enable-user-system.php b/server/controllers/system/enable-user-system.php index e745c658..37144935 100755 --- a/server/controllers/system/enable-user-system.php +++ b/server/controllers/system/enable-user-system.php @@ -86,7 +86,7 @@ class EnableUserSystemController extends Controller { $userInstance->store(); - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::USER_SYSTEM_ENABLED, [ 'to' => $email, 'name' => $name, diff --git a/server/controllers/ticket/close.php b/server/controllers/ticket/close.php index 6ac853d8..08faeace 100755 --- a/server/controllers/ticket/close.php +++ b/server/controllers/ticket/close.php @@ -91,7 +91,7 @@ class CloseController extends Controller { } private function sendMail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_CLOSED, [ 'to' => $this->ticket->author->email, diff --git a/server/controllers/ticket/comment.php b/server/controllers/ticket/comment.php index f536872d..4d5675a5 100755 --- a/server/controllers/ticket/comment.php +++ b/server/controllers/ticket/comment.php @@ -119,7 +119,7 @@ class CommentController extends Controller { } private function sendMail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_RESPONDED, [ 'to' => ($this->ticket->author) ? $this->ticket->author->email : $this->ticket->authorEmail, diff --git a/server/controllers/ticket/create.php b/server/controllers/ticket/create.php index b5f2e788..0dd1d600 100755 --- a/server/controllers/ticket/create.php +++ b/server/controllers/ticket/create.php @@ -136,7 +136,7 @@ class CreateController extends Controller { } private function sendMail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_CREATED, [ 'to' => $this->email, diff --git a/server/controllers/user/edit-email.php b/server/controllers/user/edit-email.php index d4f2b33d..d5100699 100755 --- a/server/controllers/user/edit-email.php +++ b/server/controllers/user/edit-email.php @@ -44,7 +44,7 @@ class EditEmail extends Controller{ $user->email = $newEmail; $user->store(); - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate('USER_EMAIL', [ 'to'=>$oldEmail, 'newemail'=>$user->email, diff --git a/server/controllers/user/edit-password.php b/server/controllers/user/edit-password.php index 037cd726..44ae257a 100755 --- a/server/controllers/user/edit-password.php +++ b/server/controllers/user/edit-password.php @@ -48,7 +48,7 @@ class EditPassword extends Controller { $user->password = Hashing::hashPassword($newPassword); $user->store(); - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate('USER_PASSWORD', [ 'to'=>$user->email, 'name'=>$user->name diff --git a/server/controllers/user/recover-password.php b/server/controllers/user/recover-password.php index 94d3d5f6..ee6ba1b5 100755 --- a/server/controllers/user/recover-password.php +++ b/server/controllers/user/recover-password.php @@ -85,7 +85,7 @@ class RecoverPasswordController extends Controller { } } public function sendMail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::USER_PASSWORD, [ 'to' => $this->user->email, diff --git a/server/controllers/user/send-recover-password.php b/server/controllers/user/send-recover-password.php index 82e75f20..ea283964 100755 --- a/server/controllers/user/send-recover-password.php +++ b/server/controllers/user/send-recover-password.php @@ -70,7 +70,7 @@ class SendRecoverPasswordController extends Controller { } public function sendEmail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::PASSWORD_FORGOT, [ 'to' => $this->user->email, diff --git a/server/controllers/user/signup.php b/server/controllers/user/signup.php index b36b96fe..ea566c5a 100755 --- a/server/controllers/user/signup.php +++ b/server/controllers/user/signup.php @@ -101,7 +101,10 @@ class SignUpController extends Controller { } $userId = $this->createNewUserAndRetrieveId(); - $this->sendRegistrationMail(); + + if(MailSender::getInstance()->isConnected()) { + $this->sendRegistrationMail(); + } Response::respondSuccess([ 'userId' => $userId, @@ -127,14 +130,14 @@ class SignUpController extends Controller { 'tickets' => 0, 'email' => $this->userEmail, 'password' => Hashing::hashPassword($this->userPassword), - 'verificationToken' => $this->verificationToken + 'verificationToken' => (MailSender::getInstance()->isConnected()) ? $this->verificationToken : null ]); return $userInstance->store(); } public function sendRegistrationMail() { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::USER_SIGNUP, [ 'to' => $this->userEmail, diff --git a/server/libs/MailSender.php b/server/libs/MailSender.php index abe281d5..7eb70cd6 100755 --- a/server/libs/MailSender.php +++ b/server/libs/MailSender.php @@ -2,8 +2,18 @@ class MailSender { private $mailOptions = []; - - public function __construct() { + private $mailerInstance; + private static $instance = NULL; + + public static function getInstance() { + if(MailSender::$instance === NULL) { + MailSender::$instance = new MailSender(); + } + + return MailSender::$instance; + } + + private function __construct() { $this->mailOptions['from'] = Setting::getSetting('no-reply-email')->value; $this->mailOptions['fromName'] = 'OpenSupports'; @@ -21,32 +31,51 @@ class MailSender { } public function send() { - $mailer = new PHPMailer(); + $mailerInstance = $this->getMailerInstance(); - $mailer->From = $this->mailOptions['from']; - $mailer->FromName = $this->mailOptions['fromName']; - $mailer->addAddress($this->mailOptions['to']); - $mailer->Subject = $this->mailOptions['subject']; - $mailer->Body = $this->mailOptions['body']; - $mailer->isHTML(true); + if( !array_key_exists('to', $this->mailOptions) || + !array_key_exists('subject', $this->mailOptions) || + !array_key_exists('body', $this->mailOptions) ) { + throw new Exception('Mail sending data not available'); + } - $mailer->isSMTP(); - $mailer->SMTPAuth = true; - $mailer->Host = $this->mailOptions['smtp-host']; - $mailer->Port = $this->mailOptions['smtp-port']; - $mailer->Username = $this->mailOptions['smtp-user']; - $mailer->Password = $this->mailOptions['smtp-pass']; - $mailer->Timeout = 1000; - $mailer->SMTPOptions = [ - 'ssl' => [ - 'verify_peer' => false, - 'verify_peer_name' => false, - 'allow_self_signed' => true - ] - ]; + $mailerInstance->addAddress($this->mailOptions['to']); + $mailerInstance->Subject = $this->mailOptions['subject']; + $mailerInstance->Body = $this->mailOptions['body']; + $mailerInstance->isHTML(true); - if ($mailer->smtpConnect()) { - $mailer->send(); + if ($this->isConnected()) { + $mailerInstance->send(); } } + + public function isConnected() { + return $this->getMailerInstance()->smtpConnect(); + } + + private function getMailerInstance() { + if(!($this->mailerInstance instanceof PHPMailer)) { + $this->mailerInstance = new PHPMailer(); + + $this->mailerInstance->From = $this->mailOptions['from']; + $this->mailerInstance->FromName = $this->mailOptions['fromName']; + + $this->mailerInstance->isSMTP(); + $this->mailerInstance->SMTPAuth = true; + $this->mailerInstance->Host = $this->mailOptions['smtp-host']; + $this->mailerInstance->Port = $this->mailOptions['smtp-port']; + $this->mailerInstance->Username = $this->mailOptions['smtp-user']; + $this->mailerInstance->Password = $this->mailOptions['smtp-pass']; + $this->mailerInstance->Timeout = 1000; + $this->mailerInstance->SMTPOptions = [ + 'ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] + ]; + } + + return $this->mailerInstance; + } } \ No newline at end of file From 858add6443a6c2cb13322bf7792fec0c9efaa90c Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Wed, 7 Jun 2017 02:29:25 -0300 Subject: [PATCH 3/8] Ivan - Create install step 5 WIP --- .../app/install/install-step-5-settings.js | 97 +++++++++++++++++++ .../app/install/install-step-5-settings.scss | 0 ...tep-5-admin.js => install-step-6-admin.js} | 0 ...5-admin.scss => install-step-6-admin.scss} | 0 ...mpleted.js => install-step-7-completed.js} | 0 ...ted.scss => install-step-7-completed.scss} | 0 server/controllers/system/init-settings.php | 16 +-- 7 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 client/src/app/install/install-step-5-settings.js create mode 100644 client/src/app/install/install-step-5-settings.scss rename client/src/app/install/{install-step-5-admin.js => install-step-6-admin.js} (100%) rename client/src/app/install/{install-step-5-admin.scss => install-step-6-admin.scss} (100%) rename client/src/app/install/{install-step-6-completed.js => install-step-7-completed.js} (100%) rename client/src/app/install/{install-step-6-completed.scss => install-step-7-completed.scss} (100%) diff --git a/client/src/app/install/install-step-5-settings.js b/client/src/app/install/install-step-5-settings.js new file mode 100644 index 00000000..d92cdb84 --- /dev/null +++ b/client/src/app/install/install-step-5-settings.js @@ -0,0 +1,97 @@ +import React from 'react'; + +import history from 'lib-app/history'; +import i18n from 'lib-app/i18n'; +import API from 'lib-app/api-call'; + +import Button from 'core-components/button'; +import Header from 'core-components/header'; +import Form from 'core-components/form'; +import FormField from 'core-components/form-field'; +import SubmitButton from 'core-components/submit-button'; +import Message from 'core-components/message'; + +class InstallStep5Settings extends React.Component { + + state = { + loading: false, + smtpConnection: null, // ad a message + form: {}, + onFormChange: (form) => this.setState({form}), + error: false, + errorMessage: '' + }; + + render() { + return ( +
+
+ {this.renderMessage()} +
+ + + + + + + + +
+ {i18n('NEXT')} + +
+ +
+ ); + } + + renderMessage() { + let message = null; + + if(this.state.error) { + message = ( + + {i18n('ERROR_UPDATING_SETTINGS')}: {this.state.errorMessage} + + ); + } + + return message; + } + + onTestSMTPClick(event) { + event.preventDefault(); + + API.call({ + path: '/system/test-smtp', + data: this.state.form + }).then(() => this.setState({smtpConnection: true})) + .catch(() => this.setState({smtpConnection: false})); + } + + onPreviousClick(event) { + event.preventDefault(); + history.push('/install/step-4'); + } + + onSubmit(form) { + this.setState({ + loading: true + }, () => { + API.call({ + path: '/system/init-settings', + data: form // add step 4 to form + }) + .then(() => history.push('/install/step-6')) + .catch(({message}) => this.setState({ + loading: false, + error: true, + errorMessage: message + })); + }); + } +} + +export default InstallStep5Settings; \ No newline at end of file diff --git a/client/src/app/install/install-step-5-settings.scss b/client/src/app/install/install-step-5-settings.scss new file mode 100644 index 00000000..e69de29b diff --git a/client/src/app/install/install-step-5-admin.js b/client/src/app/install/install-step-6-admin.js similarity index 100% rename from client/src/app/install/install-step-5-admin.js rename to client/src/app/install/install-step-6-admin.js diff --git a/client/src/app/install/install-step-5-admin.scss b/client/src/app/install/install-step-6-admin.scss similarity index 100% rename from client/src/app/install/install-step-5-admin.scss rename to client/src/app/install/install-step-6-admin.scss diff --git a/client/src/app/install/install-step-6-completed.js b/client/src/app/install/install-step-7-completed.js similarity index 100% rename from client/src/app/install/install-step-6-completed.js rename to client/src/app/install/install-step-7-completed.js diff --git a/client/src/app/install/install-step-6-completed.scss b/client/src/app/install/install-step-7-completed.scss similarity index 100% rename from client/src/app/install/install-step-6-completed.scss rename to client/src/app/install/install-step-7-completed.scss diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php index 49bf69c9..636c5ab2 100755 --- a/server/controllers/system/init-settings.php +++ b/server/controllers/system/init-settings.php @@ -36,18 +36,18 @@ class InitSettingsController extends Controller { 'language' => Controller::request('language'), 'recaptcha-public' => '', 'recaptcha-private' => '', - 'no-reply-email' => 'noreply@opensupports.com', - 'smtp-host' => 'localhost', - 'smtp-port' => 7070, - 'smtp-user' => '', - 'smtp-pass' => '', + 'no-reply-email' => Controller::request('no-reply-email') || 'noreply@opensupports.com', + 'smtp-host' => Controller::request('smtp-host') || 'localhost', + 'smtp-port' => Controller::request('smtp-port') || 7070, + 'smtp-user' => Controller::request('smtp-user') || '', + 'smtp-pass' => Controller::request('smtp-pass') || '', 'time-zone' => 0, 'maintenance-mode' => 0, 'layout' => 'boxed', - 'allow-attachments' => 0, + 'allow-attachments' => !!Controller::request('allow-attachments'), 'max-size' => 1024, - 'title' => 'Support Center', - 'url' => 'http://dev3.opensupports.com', + 'title' => Controller::request('title') || 'Support Center', + 'url' => Controller::request('url') || 'http://www.opensupports.com', 'registration' => !!Controller::request('registration'), 'user-system-enabled' => !!Controller::request('user-system-enabled'), 'last-stat-day' => date('YmdHi', strtotime(' -12 day ')), From 4d7ac557c74d76f976bbc311aebfda10ecccce3c Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 10 Jun 2017 04:17:54 -0300 Subject: [PATCH 4/8] Ivan - Add SMTP improvements WIP --- client/src/actions/config-actions.js | 7 +++ client/src/app/Routes.js | 10 ++-- client/src/app/install/install-layout.js | 1 + .../app/install/install-step-1-language.js | 2 +- .../install/install-step-2-requirements.js | 2 +- .../app/install/install-step-3-database.js | 2 +- .../app/install/install-step-4-user-system.js | 28 ++++------ .../app/install/install-step-5-settings.js | 53 ++++++++++++++---- .../app/install/install-step-5-settings.scss | 15 ++++++ .../src/app/install/install-step-6-admin.js | 14 ++--- .../src/app/install/install-step-6-admin.scss | 2 +- .../app/install/install-step-7-completed.js | 8 +-- client/src/data/fixtures/system-fixtures.js | 10 ++++ client/src/data/languages/en.js | 5 +- client/src/reducers/config-reducer.js | 10 +++- server/controllers/system.php | 2 + server/controllers/system/test-smtp.php | 54 +++++++++++++++++++ server/data/ERRORS.php | 5 ++ server/libs/MailSender.php | 20 +++++-- 19 files changed, 195 insertions(+), 55 deletions(-) create mode 100644 server/controllers/system/test-smtp.php diff --git a/client/src/actions/config-actions.js b/client/src/actions/config-actions.js index 4ced1e74..13a3271a 100644 --- a/client/src/actions/config-actions.js +++ b/client/src/actions/config-actions.js @@ -46,5 +46,12 @@ export default { data: {} }) }; + }, + + updateUserSystemSettings(payload) { + return { + type: 'UPDATE_USER_SYSTEM_SETTINGS', + payload: payload + }; } }; \ No newline at end of file diff --git a/client/src/app/Routes.js b/client/src/app/Routes.js index 64327b73..ef547ce4 100644 --- a/client/src/app/Routes.js +++ b/client/src/app/Routes.js @@ -57,8 +57,9 @@ import InstallStep1Language from 'app/install/install-step-1-language'; import InstallStep2Requirements from 'app/install/install-step-2-requirements'; import InstallStep3Database from 'app/install/install-step-3-database'; import InstallStep4UserSystem from 'app/install/install-step-4-user-system'; -import InstallStep5Admin from 'app/install/install-step-5-admin'; -import InstallStep6Completed from 'app/install/install-step-6-completed'; +import InstallStep5Settings from 'app/install/install-step-5-user-system'; +import InstallStep6Admin from 'app/install/install-step-6-admin'; +import InstallStep7Completed from 'app/install/install-step-7-completed'; export default ( @@ -93,8 +94,9 @@ export default ( - - + + + diff --git a/client/src/app/install/install-layout.js b/client/src/app/install/install-layout.js index ab96285e..f16a2a6b 100644 --- a/client/src/app/install/install-layout.js +++ b/client/src/app/install/install-layout.js @@ -14,6 +14,7 @@ const steps = [ 'SERVER_REQUIREMENTS', 'DATABASE_CONFIGURATION', 'USER_SYSTEM', + 'SYSTEM_SETTINGS', 'ADMIN_SETUP', 'COMPLETED' ]; diff --git a/client/src/app/install/install-step-1-language.js b/client/src/app/install/install-step-1-language.js index 7c8d1fdd..240b3d1b 100644 --- a/client/src/app/install/install-step-1-language.js +++ b/client/src/app/install/install-step-1-language.js @@ -14,7 +14,7 @@ class InstallStep1Language extends React.Component { render() { return (
-
+
+ {this.renderMessageSMTP()}
{i18n('NEXT')} @@ -61,6 +64,28 @@ class InstallStep5Settings extends React.Component { return message; } + renderMessageSMTP() { + let message = null; + + if(this.state.smtpConnection !== null) { + if(this.state.smtpConnection) { + message = ( + + {i18n('SMTP_CONNECTION_SUCCESS')} + + ); + } else { + message = ( + + {i18n('ERROR_SMTP_CONNECTION')} + + ); + } + } + + return message; + } + onTestSMTPClick(event) { event.preventDefault(); @@ -82,7 +107,11 @@ class InstallStep5Settings extends React.Component { }, () => { API.call({ path: '/system/init-settings', - data: form // add step 4 to form + data: _.extend({}, form, { + 'language': this.props.language, + 'user-system-enabled': this.props['user-system-enabled'], + 'registration': this.props['registration'] + }) }) .then(() => history.push('/install/step-6')) .catch(({message}) => this.setState({ @@ -94,4 +123,10 @@ class InstallStep5Settings extends React.Component { } } -export default InstallStep5Settings; \ No newline at end of file +export default connect((store) => { + return { + 'user-system-enabled': store.config['user-system-enabled'], + 'registration': store.config['registration'], + language: store.config.language + }; +})(InstallStep5Settings); \ No newline at end of file diff --git a/client/src/app/install/install-step-5-settings.scss b/client/src/app/install/install-step-5-settings.scss index e69de29b..d29665a4 100644 --- a/client/src/app/install/install-step-5-settings.scss +++ b/client/src/app/install/install-step-5-settings.scss @@ -0,0 +1,15 @@ +@import "../../scss/vars"; + +.install-step-5 { + + &__previous { + margin-right: 20px; + } + + &__next { + float: left; + position: absolute; + margin-left: 230px; + min-width: 70px; + } +} \ No newline at end of file diff --git a/client/src/app/install/install-step-6-admin.js b/client/src/app/install/install-step-6-admin.js index 4c3114c4..6bdd4be0 100644 --- a/client/src/app/install/install-step-6-admin.js +++ b/client/src/app/install/install-step-6-admin.js @@ -10,7 +10,7 @@ import FormField from 'core-components/form-field'; import SubmitButton from 'core-components/submit-button'; import Message from 'core-components/message'; -class InstallStep5Admin extends React.Component { +class InstallStep6Admin extends React.Component { state = { loading: false, @@ -20,14 +20,14 @@ class InstallStep5Admin extends React.Component { render() { return ( -
-
+
+
{this.renderMessage()} -
+
{i18n('NEXT')}
@@ -40,7 +40,7 @@ class InstallStep5Admin extends React.Component { if(this.state.error) { message = ( - + {i18n('ERROR_UPDATING_SETTINGS')}: {this.state.errorMessage} ); @@ -57,7 +57,7 @@ class InstallStep5Admin extends React.Component { path: '/system/init-admin', data: form }) - .then(() => history.push('/install/step-6')) + .then(() => history.push('/install/step-7')) .catch(({message}) => this.setState({ loading: false, error: true, @@ -67,4 +67,4 @@ class InstallStep5Admin extends React.Component { } } -export default InstallStep5Admin; \ No newline at end of file +export default InstallStep6Admin; \ No newline at end of file diff --git a/client/src/app/install/install-step-6-admin.scss b/client/src/app/install/install-step-6-admin.scss index 668d5326..4efe7335 100644 --- a/client/src/app/install/install-step-6-admin.scss +++ b/client/src/app/install/install-step-6-admin.scss @@ -1,6 +1,6 @@ @import "../../scss/vars"; -.install-step-5 { +.install-step-6 { &__message { margin-bottom: 20px; diff --git a/client/src/app/install/install-step-7-completed.js b/client/src/app/install/install-step-7-completed.js index 151fdbaf..c0a49475 100644 --- a/client/src/app/install/install-step-7-completed.js +++ b/client/src/app/install/install-step-7-completed.js @@ -7,7 +7,7 @@ import i18n from 'lib-app/i18n'; import Header from 'core-components/header'; import Message from 'core-components/message'; -class InstallStep6Completed extends React.Component { +class InstallStep7Completed extends React.Component { componentDidMount() { store.dispatch(ConfigActions.init()); @@ -19,8 +19,8 @@ class InstallStep6Completed extends React.Component { render() { return ( -
-
+
+
{i18n('INSTALLATION_COMPLETED_DESCRIPTION')} @@ -29,4 +29,4 @@ class InstallStep6Completed extends React.Component { } } -export default InstallStep6Completed; \ No newline at end of file +export default InstallStep7Completed; \ No newline at end of file diff --git a/client/src/data/fixtures/system-fixtures.js b/client/src/data/fixtures/system-fixtures.js index 45739ad3..58b95da4 100644 --- a/client/src/data/fixtures/system-fixtures.js +++ b/client/src/data/fixtures/system-fixtures.js @@ -224,6 +224,16 @@ module.exports = [ }; } }, + { + path: '/system/test-smtp', + time: 100, + response: function () { + return { + status: 'success', + data: {} + }; + } + }, { path: '/system/get-mail-templates', time: 100, diff --git a/client/src/data/languages/en.js b/client/src/data/languages/en.js index a7423b0c..8e305408 100644 --- a/client/src/data/languages/en.js +++ b/client/src/data/languages/en.js @@ -239,8 +239,9 @@ export default { 'STEP_2_DESCRIPTION': 'Here are listed the requirements for running OpenSupports. Please make sure that all requirements are satisfied.', 'STEP_3_DESCRIPTION': 'Please fill the MySQL database configuration.', 'STEP_4_DESCRIPTION': 'Please select your user system preferences.', - 'STEP_5_DESCRIPTION': 'Please configure the administrator account.', - 'STEP_6_DESCRIPTION': 'Installation is completed.', + 'STEP_5_DESCRIPTION': 'Please select your system preferences.', + 'STEP_6_DESCRIPTION': 'Please configure the administrator account.', + 'STEP_7_DESCRIPTION': 'Installation is completed.', //VIEW DESCRIPTIONS 'CREATE_TICKET_DESCRIPTION': 'This is a form for creating tickets. Fill the form and send us your issues/doubts/suggestions. Our support system will answer it as soon as possible.', diff --git a/client/src/reducers/config-reducer.js b/client/src/reducers/config-reducer.js index 7f76c3e5..742dbef7 100644 --- a/client/src/reducers/config-reducer.js +++ b/client/src/reducers/config-reducer.js @@ -19,7 +19,8 @@ class ConfigReducer extends Reducer { 'CHANGE_LANGUAGE': this.onLanguageChange, 'INIT_CONFIGS_FULFILLED': this.onInitConfigs, 'CHECK_INSTALLATION_FULFILLED': this.onInstallationChecked, - 'UPDATE_DATA_FULFILLED': this.onInitConfigs + 'UPDATE_DATA_FULFILLED': this.onInitConfigs, + 'UPDATE_USER_SYSTEM_SETTINGS': this.onUserSystemSettingsChange }; } @@ -48,6 +49,13 @@ class ConfigReducer extends Reducer { }); } + onUserSystemSettingsChange(state, payload) { + return _.extend({}, state, { + 'user-system-enabled': !!(payload['user-system-enabled'] * 1), + 'allow-attachments': !!(payload['allow-attachments'] * 1) + }); + } + onInstallationChecked(state, payload) { return _.extend({}, state, { installedDone: true, diff --git a/server/controllers/system.php b/server/controllers/system.php index f79c7e9f..458dd036 100755 --- a/server/controllers/system.php +++ b/server/controllers/system.php @@ -25,6 +25,7 @@ require_once 'system/delete-all-users.php'; require_once 'system/csv-import.php'; require_once 'system/backup-database.php'; require_once 'system/download.php'; +require_once 'system/test-smtp.php'; $systemControllerGroup = new ControllerGroup(); $systemControllerGroup->setGroupPath('/system'); @@ -55,5 +56,6 @@ $systemControllerGroup->addController(new DownloadController); $systemControllerGroup->addController(new CSVImportController); $systemControllerGroup->addController(new DisableUserSystemController); $systemControllerGroup->addController(new EnableUserSystemController); +$systemControllerGroup->addController(new TestSMTPController); $systemControllerGroup->finalize(); diff --git a/server/controllers/system/test-smtp.php b/server/controllers/system/test-smtp.php new file mode 100644 index 00000000..1bbdf663 --- /dev/null +++ b/server/controllers/system/test-smtp.php @@ -0,0 +1,54 @@ + 'any', + 'requestData' => [] + ]; + } + + public function handler() { + $mailSender = MailSender::getInstance(); + $mailSender->setConnectionSettings( + Controller::request('smtp-host'), + Controller::request('smtp-port'), + Controller::request('smtp-user'), + Controller::request('smtp-pass'), + Controller::request('no-reply-email') + ); + + if($mailSender->isConnected()) { + Response::respondSuccess(); + } else { + throw new Exception(ERRORS::SMTP_CONNECTION); + } + } +} \ No newline at end of file diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 435cc66a..032fd3e4 100755 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -171,6 +171,10 @@ * @apiDefine DATABASE_CREATION * @apiError {String} DATABASE_CREATION It's a database creation error. */ +/** + * @apiDefine SMTP_CONNECTION + * @apiError {String} SMTP_CONNECTION Could not connect with SMTP server. + */ class ERRORS { const INVALID_CREDENTIALS = 'INVALID_CREDENTIALS'; @@ -216,4 +220,5 @@ class ERRORS { const INVALID_FILE = 'INVALID_FILE'; const DATABASE_CONNECTION = 'DATABASE_CONNECTION'; const DATABASE_CREATION = 'DATABASE_CREATION'; + const SMTP_CONNECTION = 'SMTP_CONNECTION'; } diff --git a/server/libs/MailSender.php b/server/libs/MailSender.php index 7eb70cd6..a0edd583 100755 --- a/server/libs/MailSender.php +++ b/server/libs/MailSender.php @@ -14,13 +14,23 @@ class MailSender { } private function __construct() { - $this->mailOptions['from'] = Setting::getSetting('no-reply-email')->value; + $this->setConnectionSettings( + Setting::getSetting('smtp-host')->getValue(), + Setting::getSetting('smtp-port')->getValue(), + Setting::getSetting('smtp-user')->getValue(), + Setting::getSetting('smtp-pass')->getValue(), + Setting::getSetting('no-reply-email')->getValue() + ); + } + + public function setConnectionSettings($host, $port, $user, $pass, $noReplyEmail) { + $this->mailOptions['from'] = $noReplyEmail; $this->mailOptions['fromName'] = 'OpenSupports'; - $this->mailOptions['smtp-host'] = Setting::getSetting('smtp-host')->value; - $this->mailOptions['smtp-port'] = Setting::getSetting('smtp-port')->value; - $this->mailOptions['smtp-user'] = Setting::getSetting('smtp-user')->value; - $this->mailOptions['smtp-pass'] = Setting::getSetting('smtp-pass')->value; + $this->mailOptions['smtp-host'] = $host; + $this->mailOptions['smtp-port'] = $port; + $this->mailOptions['smtp-user'] = $user; + $this->mailOptions['smtp-pass'] = $pass; } public function setTemplate($type, $config) { From 094bd249825c5d86281bcd158d90e2c518826057 Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Sun, 11 Jun 2017 21:00:31 -0300 Subject: [PATCH 5/8] WIP --- client/src/app/Routes.js | 2 +- client/src/app/install/install-step-5-settings.js | 15 +++++++-------- client/src/data/languages/en.js | 8 ++++++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/client/src/app/Routes.js b/client/src/app/Routes.js index ef547ce4..0abcdd1c 100644 --- a/client/src/app/Routes.js +++ b/client/src/app/Routes.js @@ -57,7 +57,7 @@ import InstallStep1Language from 'app/install/install-step-1-language'; import InstallStep2Requirements from 'app/install/install-step-2-requirements'; import InstallStep3Database from 'app/install/install-step-3-database'; import InstallStep4UserSystem from 'app/install/install-step-4-user-system'; -import InstallStep5Settings from 'app/install/install-step-5-user-system'; +import InstallStep5Settings from 'app/install/install-step-5-settings'; import InstallStep6Admin from 'app/install/install-step-6-admin'; import InstallStep7Completed from 'app/install/install-step-7-completed'; diff --git a/client/src/app/install/install-step-5-settings.js b/client/src/app/install/install-step-5-settings.js index 34b69a4f..8b1b7b7f 100644 --- a/client/src/app/install/install-step-5-settings.js +++ b/client/src/app/install/install-step-5-settings.js @@ -19,7 +19,6 @@ class InstallStep5Settings extends React.Component { loading: false, smtpConnection: null, form: {}, - onFormChange: (form) => this.setState({form}), error: false, errorMessage: '' }; @@ -27,14 +26,14 @@ class InstallStep5Settings extends React.Component { render() { return (
-
+
{this.renderMessage()} -
+ this.setState({form})}> - + - + - {this.renderMessageSMTP()} +
+
+ + + + + + {this.renderMessageSMTP()} +
{i18n('NEXT')} diff --git a/client/src/app/install/install-step-5-settings.scss b/client/src/app/install/install-step-5-settings.scss index d29665a4..83c5c9f0 100644 --- a/client/src/app/install/install-step-5-settings.scss +++ b/client/src/app/install/install-step-5-settings.scss @@ -12,4 +12,23 @@ margin-left: 230px; min-width: 70px; } + + &__smtp-block { + text-align: center; + background-color: $very-light-grey; + padding: 30px; + margin-bottom: 30px; + + .header__title { + font-size: $font-size--md; + } + } + + &__attachments-field { + margin-bottom: 15px; + } + + &__smtp-message { + margin-top: 30px; + } } \ No newline at end of file diff --git a/client/src/app/install/install-step-6-admin.js b/client/src/app/install/install-step-6-admin.js index 6bdd4be0..7109ae71 100644 --- a/client/src/app/install/install-step-6-admin.js +++ b/client/src/app/install/install-step-6-admin.js @@ -28,7 +28,7 @@ class InstallStep6Admin extends React.Component {
- {i18n('NEXT')} + {i18n('NEXT')}
diff --git a/client/src/data/languages/cn.js b/client/src/data/languages/cn.js index 5e7cb1db..278123ef 100644 --- a/client/src/data/languages/cn.js +++ b/client/src/data/languages/cn.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': '在這裡,您可以通過更改電子郵件或密碼來修改用戶。', 'ENABLE_USER_SYSTEM_DESCRIPTION': '啟用/禁用用戶系統的使用。如果你禁用它,所有的用戶將被刪除,但票將被保留。如果啟用,將創建現有票證的用戶。', 'CSV_DESCRIPTION': 'CSV文件必須有3列:電子郵件,密碼,名稱。行數沒有限制。它將在文件中的每行中創建一個用戶。', + 'SMTP_SERVER_DESCRIPTION': 'SMTP服务器允许应用程序发送邮件。 如果您没有配置,OpenSupports将不会发送任何电子邮件。', //ERRORS 'EMAIL_OR_PASSWORD': '電子郵件或密碼無效', @@ -355,6 +356,10 @@ export default { 'LEFT_EMPTY_DATABASE': '留空为自动创建数据库', 'REMEMBER_ME': '记住我', 'EMAIL_LOWERCASE': '电子邮件', - 'PASSWORD_LOWERCASE': '密码' + 'PASSWORD_LOWERCASE': '密码', + 'SYSTEM_SETTINGS': '系统设置', + 'TEST_SMTP_CONNECTION': '测试SMTP连接', + 'SMTP_CONNECTION_SUCCESS': 'SMTP凭据有效', + 'SMTP_CONNECTION_ERROR': '无法连接到SMTP服务器' }; diff --git a/client/src/data/languages/de.js b/client/src/data/languages/de.js index 2cebb03d..1ad60689 100644 --- a/client/src/data/languages/de.js +++ b/client/src/data/languages/de.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Hier können Sie Ihren Benutzer bearbeiten, indem Sie Ihre E-Mail oder Ihr Passwort ändern.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Aktivieren / deaktivieren Sie die Verwendung eines Benutzersystems. Wenn du es deaktivierst, werden alle Benutzer gelöscht, aber die Tickets werden gehalten. Wenn Sie es aktivieren, werden die Benutzer der vorhandenen Tickets erstellt.', 'CSV_DESCRIPTION': 'Die CSV-Datei muss 3 Spalten haben: E-Mail, Passwort, Name. Es gibt kein Limit in Zeilenzahl. Es wird ein Benutzer pro Zeile in der Datei erstellt.', + 'SMTP_SERVER_DESCRIPTION': 'Die Konfiguration des SMTP-Servers ermöglicht es der Software, Mails zu senden. Wenn Sie es nicht konfigurieren, werden keine E-Mails von OpenSupports gesendet.', //ERRORS 'EMAIL_OR_PASSWORD': 'E-Mail oder Passwort ungültig', @@ -355,5 +356,9 @@ export default { 'LEFT_EMPTY_DATABASE': 'Leer leer für die automatische Datenbankerstellung', 'REMEMBER_ME': 'Merken', 'EMAIL_LOWERCASE': 'Email', - 'PASSWORD_LOWERCASE': 'Passwort' + 'PASSWORD_LOWERCASE': 'Passwort', + 'SYSTEM_SETTINGS': 'System settings', + 'TEST_SMTP_CONNECTION': 'SMTP-Verbindung testen', + 'SMTP_CONNECTION_SUCCESS': 'SMTP-Anmeldeinformationen sind gültig.', + 'SMTP_CONNECTION_ERROR': 'Kann keine Verbindung zum SMTP-Server herstellen.' }; diff --git a/client/src/data/languages/en.js b/client/src/data/languages/en.js index 9ac3225c..1fbf0306 100644 --- a/client/src/data/languages/en.js +++ b/client/src/data/languages/en.js @@ -286,6 +286,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Here you can edit your user by changing your email or your password.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Enable/disable the use of an user system. If you disable it, all users will be deleted but the tickets will be kept. If you enable it, the users of existent tickets will be created.', 'CSV_DESCRIPTION': 'The CSV file must have 3 columns: email, password, name. There is no limit in row count. It will be created one user per row in the file.', + 'SMTP_SERVER_DESCRIPTION': 'The configuration of the SMTP server allows the application to send mails. If you do not configure it, no emails will be sent by OpenSupports.', //ERRORS 'EMAIL_OR_PASSWORD': 'Email or password invalid', diff --git a/client/src/data/languages/es.js b/client/src/data/languages/es.js index ca369ea9..fd7f8584 100644 --- a/client/src/data/languages/es.js +++ b/client/src/data/languages/es.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Aquí puedes editar tu usuario cambiando tu correo electrónico o tu contraseña.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Habilitar/Deshabilitar el uso de un sistema de usuario. Si lo deshabilitas, todos los usuarios serán eliminados pero los tickets serán guardados. Si lo habilitas, se crearán los usuarios de los tickets existentes.', 'CSV_DESCRIPTION': 'El archivo CSV debe tener 3 columnas: correo electrónico, contraseña, nombre. No hay límite en el recuento de filas. Se creará un usuario por fila en el archivo.', + 'SMTP_SERVER_DESCRIPTION': 'La configuracion de SMTP permite que la applicacion mande emails. Si no es configurado, ningún mail sera enviado OpenSupports.', //ERRORS 'EMAIL_OR_PASSWORD': 'Email o contraseña inválida', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'Dejar vacío para la creación automática de bases de datos', 'REMEMBER_ME': 'Recordarme', 'EMAIL_LOWERCASE': 'email', - 'PASSWORD_LOWERCASE': 'contraseña' + 'PASSWORD_LOWERCASE': 'contraseña', + 'TEST_SMTP_CONNECTION': 'Probar conexion de SMTP', + 'SMTP_CONNECTION_SUCCESS': 'La credenciales de SMTP son correctas.', + 'SMTP_CONNECTION_ERROR': 'No es posible conectarse al servidor de SMTP.' }; diff --git a/client/src/data/languages/fr.js b/client/src/data/languages/fr.js index 7c35bbc3..a1c633bd 100644 --- a/client/src/data/languages/fr.js +++ b/client/src/data/languages/fr.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Ici, vous pouvez modifier votre utilisateur en changeant votre adresse e-mail ou votre mot de passe.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Activer / désactiver l\'utilisation d\'un système utilisateur. Si vous le désactivez, tous les utilisateurs seront supprimés, mais les tickets seront conservés. Si vous l\'activez, les utilisateurs des tickets existants seront créés.', 'CSV_DESCRIPTION': 'Le fichier CSV doit comporter 3 colonnes: email, mot de passe, nom. Il n\'y a pas de limite dans le nombre de lignes. Il sera créé un utilisateur par ligne dans le fichier.', + 'SMTP_SERVER_DESCRIPTION': 'La configuration du serveur SMTP permet à l\'application d\'envoyer des mails. Si vous ne le configurez pas, aucun service d\'email ne sera envoyé par OpenSupports.', //ERRORS 'EMAIL_OR_PASSWORD': 'E-mail ou mot de passe invalide', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'Laisser vide pour la création automatique de la base de données', 'REMEMBER_ME': 'Se souvenir de moi', 'EMAIL_LOWERCASE': 'email', - 'PASSWORD_LOWERCASE': 'mot de passe' + 'PASSWORD_LOWERCASE': 'mot de passe', + 'TEST_SMTP_CONNECTION': 'Test de connexion SMTP', + 'SMTP_CONNECTION_SUCCESS': 'Les informations d\'identification SMTP sont valides.', + 'SMTP_CONNECTION_ERROR': 'Ne peut pas se connecter au serveur SMTP.' }; diff --git a/client/src/data/languages/in.js b/client/src/data/languages/in.js index 7aec4cf6..5e019e72 100644 --- a/client/src/data/languages/in.js +++ b/client/src/data/languages/in.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'यहां आप अपना ईमेल या अपना पासवर्ड बदलकर अपना उपयोगकर्ता संपादित कर सकते हैं।', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'किसी उपयोगकर्ता सिस्टम के उपयोग को सक्षम / अक्षम करें यदि आप इसे अक्षम करते हैं, तो सभी उपयोगकर्ताओं को हटा दिया जाएगा लेकिन टिकट को रखा जाएगा। यदि आप इसे सक्षम करते हैं, तो विद्यमान टिकट के उपयोगकर्ता बनाए जाएंगे', 'CSV_DESCRIPTION': 'सीएसवी फ़ाइल में 3 कॉलम होना चाहिए: ईमेल, पासवर्ड, नाम। पंक्ति गणना में कोई सीमा नहीं है फ़ाइल में प्रति पंक्ति एक उपयोगकर्ता बनाया जाएगा।', + 'SMTP_SERVER_DESCRIPTION': 'एसएमटीपी सर्वर का कॉन्फ़िगरेशन एप्लिकेशन को मेल भेजने की अनुमति देता है। यदि आप इसे कॉन्फ़िगर नहीं करते हैं, तो OpenSupports द्वारा कोई ईमेल नहीं भेजा जाएगा।', //ERRORS 'EMAIL_OR_PASSWORD': 'ईमेल या पासवर्ड अमान्य', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'स्वचालित डेटाबेस निर्माण के लिए खाली छोड़ दिया', 'REMEMBER_ME': 'मुझे याद रखना', 'EMAIL_LOWERCASE': 'ईमेल', - 'PASSWORD_LOWERCASE': 'पासवर्ड' + 'PASSWORD_LOWERCASE': 'पासवर्ड', + 'TEST_SMTP_CONNECTION': 'परीक्षण एसएमटीपी कनेक्शन', + 'SMTP_CONNECTION_SUCCESS': 'SMTP क्रेडेंशियल्स मान्य हं।', + 'SMTP_CONNECTION_ERROR': 'एसएमटीपी सर्वर से कनेक्ट नहीं हो सकता' }; \ No newline at end of file diff --git a/client/src/data/languages/jp.js b/client/src/data/languages/jp.js index 87698547..0c4ac281 100644 --- a/client/src/data/languages/jp.js +++ b/client/src/data/languages/jp.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'ここでは、電子メールまたはパスワードを変更してユーザーを編集できます。', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'ユーザシステムの使用を有効/無効にします。無効にすると、すべてのユーザーは削除されますが、チケットは保持されます。これを有効にすると、既存のチケットのユーザーが作成されます。', 'CSV_DESCRIPTION': 'CSVファイルには、電子メール、パスワード、名前の3つの列が必要です。行数に制限はありません。ファイル内で行ごとに1人ずつ作成されます', + 'SMTP_SERVER_DESCRIPTION': 'SMTPサーバーの設定により、アプリケーションはメールを送信できます。 これを設定しないと、OpenSupportsから電子メールは送信されません。', //ERRORS 'EMAIL_OR_PASSWORD': '電子メールまたはパスワードが無効です', @@ -355,6 +356,9 @@ export default { 'LEFT_EMPTY_DATABASE': '自動データベース作成のために空のままにする', 'REMEMBER_ME': '覚えている', 'EMAIL_LOWERCASE': 'Eメール', - 'PASSWORD_LOWERCASE': 'パスワード' + 'PASSWORD_LOWERCASE': 'パスワード', + 'TEST_SMTP_CONNECTION': 'SMTP接続をテストする', + 'SMTP_CONNECTION_SUCCESS': 'SMTP資格情報が有効です。', + 'SMTP_CONNECTION_ERROR': 'SMTPサーバーに接続できません。' }; diff --git a/client/src/data/languages/pt.js b/client/src/data/languages/pt.js index a8151b18..939500a1 100644 --- a/client/src/data/languages/pt.js +++ b/client/src/data/languages/pt.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Aqui você pode editar seu usuário alterando seu e-mail ou sua senha.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Ativar / desativar o uso de um sistema de usuário. Se você desativá-lo, todos os usuários serão excluídos, mas os ingressos serão mantidos. Se você ativá-lo, os usuários de tickets existentes serão criados.', 'CSV_DESCRIPTION': 'O arquivo CSV deve ter 3 colunas: e-mail, senha, nome. Não há limite na contagem de linhas. Ele será criado um usuário por linha no arquivo.', + 'SMTP_SERVER_DESCRIPTION': 'A configuração do servidor SMTP permite que o aplicativo envie e-mails. Se você não configurá-lo, nenhum e-mail será enviado pela OpenSupports.', //ERRORS 'EMAIL_OR_PASSWORD': 'E-mail ou senha inválidos', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'Esquerda vazia para criação automática de banco de dados', 'REMEMBER_ME': 'Lembrar', 'EMAIL_LOWERCASE': 'email', - 'PASSWORD_LOWERCASE': 'senha' + 'PASSWORD_LOWERCASE': 'senha', + 'TEST_SMTP_CONNECTION': 'Testar conexão SMTP', + 'SMTP_CONNECTION_SUCCESS': 'As credenciais SMTP são válidas.', + 'SMTP_CONNECTION_ERROR': 'Não pode se conectar ao servidor SMTP.' }; \ No newline at end of file diff --git a/client/src/data/languages/ru.js b/client/src/data/languages/ru.js index e9debf26..ff561236 100644 --- a/client/src/data/languages/ru.js +++ b/client/src/data/languages/ru.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Здесь вы можете изменить своего пользователя, изменив свой адрес электронной почты или пароль.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Включить / отключить использование пользовательской системы. Если вы отключите его, все пользователи будут удалены. Если вы включите его, будут созданы пользователи существующих билетов.', 'CSV_DESCRIPTION': 'Файл CSV должен иметь 3 столбца: адрес электронной почты, пароль и имя. Количество строк не ограничено. В файле будет создан один пользователь для каждой строки.', + 'SMTP_SERVER_DESCRIPTION': 'Конфигурация SMTP-сервера позволяет приложению отправлять письма. Если вы не настроите его, никакие электронные письма не будут отправлены OpenSupports.', //ERRORS 'EMAIL_OR_PASSWORD': 'электронной почты или пароль недействительный', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'Пусто для автоматического создания базы данных', 'REMEMBER_ME': 'Запомнить', 'EMAIL_LOWERCASE': 'Эл. адрес', - 'PASSWORD_LOWERCASE': 'пароль' + 'PASSWORD_LOWERCASE': 'пароль', + 'TEST_SMTP_CONNECTION': 'Тестирование SMTP-соединения', + 'SMTP_CONNECTION_SUCCESS': 'Учетные данные SMTP действительны.', + 'SMTP_CONNECTION_ERROR': 'Не удается подключиться к SMTP-серверу.' }; diff --git a/client/src/data/languages/tr.js b/client/src/data/languages/tr.js index e5ceb9dc..0baf0487 100644 --- a/client/src/data/languages/tr.js +++ b/client/src/data/languages/tr.js @@ -285,6 +285,7 @@ export default { 'EDIT_PROFILE_VIEW_DESCRIPTION': 'Burada e-postanızı veya şifrenizi değiştirerek kullanıcıyı düzenleyebilirsiniz.', 'ENABLE_USER_SYSTEM_DESCRIPTION': 'Bir kullanıcı sisteminin kullanımını etkinleştirir / devre dışı bırakır. Devre dışı bırakırsanız, tüm kullanıcılar silinir ancak biletler muhafaza edilir. Etkinleştirirseniz, mevcut biletler kullanıcıları oluşturulur.', 'CSV_DESCRIPTION': 'CSV dosyasının 3 sütun olması gerekir: e-posta, şifre, ad. Satır sayısı sınırı yoktur. Dosya satır başına bir kullanıcı oluşturulur.', + 'SMTP_SERVER_DESCRIPTION': 'SMTP sunucusunun yapılandırması, uygulamanın postalar göndermesine izin verir. Onu yapılandırmazsanız, OpenSupports tarafından hiçbir e-posta gönderilmeyecektir', //ERRORS 'EMAIL_OR_PASSWORD': 'E-posta veya şifre geçersiz', @@ -355,5 +356,8 @@ export default { 'LEFT_EMPTY_DATABASE': 'Otomatik veritabanı oluşturulması için boş bırakıldı', 'REMEMBER_ME': 'Hatırlamak', 'EMAIL_LOWERCASE': 'e-posta', - 'PASSWORD_LOWERCASE': 'parola' + 'PASSWORD_LOWERCASE': 'parola', + 'TEST_SMTP_CONNECTION': 'SMTP bağlantısını test et', + 'SMTP_CONNECTION_SUCCESS': 'SMTP kimlik bilgileri geçerlidir.', + 'SMTP_CONNECTION_ERROR': 'SMTP sunucusuna bağlanılamıyor.' }; diff --git a/client/src/reducers/config-reducer.js b/client/src/reducers/config-reducer.js index 742dbef7..80fafb90 100644 --- a/client/src/reducers/config-reducer.js +++ b/client/src/reducers/config-reducer.js @@ -52,7 +52,7 @@ class ConfigReducer extends Reducer { onUserSystemSettingsChange(state, payload) { return _.extend({}, state, { 'user-system-enabled': !!(payload['user-system-enabled'] * 1), - 'allow-attachments': !!(payload['allow-attachments'] * 1) + 'registration': !!(payload['registration'] * 1) }); } diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php index 9ea63761..844b1fb8 100755 --- a/server/controllers/system/init-settings.php +++ b/server/controllers/system/init-settings.php @@ -60,18 +60,18 @@ class InitSettingsController extends Controller { 'language' => Controller::request('language'), 'recaptcha-public' => '', 'recaptcha-private' => '', - 'no-reply-email' => Controller::request('no-reply-email') || 'noreply@opensupports.com', - 'smtp-host' => Controller::request('smtp-host') || 'localhost', - 'smtp-port' => Controller::request('smtp-port') || 7070, - 'smtp-user' => Controller::request('smtp-user') || '', - 'smtp-pass' => Controller::request('smtp-pass') || '', + 'no-reply-email' => Controller::request('no-reply-email'), + 'smtp-host' => Controller::request('smtp-host'), + 'smtp-port' => Controller::request('smtp-port'), + 'smtp-user' => Controller::request('smtp-user'), + 'smtp-pass' => Controller::request('smtp-password'), 'time-zone' => 0, 'maintenance-mode' => 0, 'layout' => 'boxed', 'allow-attachments' => !!Controller::request('allow-attachments'), 'max-size' => 1024, - 'title' => Controller::request('title') || 'Support Center', - 'url' => Controller::request('url') || ('http://' . $_SERVER['HTTP_HOST']), + 'title' => Controller::request('title') ? Controller::request('title') : 'Support Center', + 'url' => Controller::request('url') ? Controller::request('url') : ('http://' . $_SERVER['HTTP_HOST']), 'registration' => !!Controller::request('registration'), 'user-system-enabled' => !!Controller::request('user-system-enabled'), 'last-stat-day' => date('YmdHi', strtotime(' -12 day ')), diff --git a/server/models/NullDataStore.php b/server/models/NullDataStore.php index cef6a849..0976abe8 100755 --- a/server/models/NullDataStore.php +++ b/server/models/NullDataStore.php @@ -18,4 +18,8 @@ class NullDataStore extends DataStore { public function store() { return null; } + + public function getValue() { + return null; + } } \ No newline at end of file diff --git a/tests/system/init-settings.rb b/tests/system/init-settings.rb index 362a0727..920815dc 100644 --- a/tests/system/init-settings.rb +++ b/tests/system/init-settings.rb @@ -3,6 +3,12 @@ describe '/system/init-settings' do result = request('/system/init-settings', { 'user-system-enabled' => true, 'registration' => true, + 'title' => 'Support Center', + 'smtp-host' => 'localhost', + 'smtp-port' => 7070, + 'smtp-user' => 'noreply@opensupports.com', + 'smtp-password' => '', + 'no-reply-email' => 'noreply@opensupports.com', 'language' => 'en' }) From feee217510a5e1fd41535f9d0a4569f750fcd25d Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 13 Jun 2017 18:18:46 -0300 Subject: [PATCH 8/8] Ivan - Fix MailSender instance to use singleton --- server/controllers/ticket/create.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/controllers/ticket/create.php b/server/controllers/ticket/create.php index 248f7bf4..fab7335f 100755 --- a/server/controllers/ticket/create.php +++ b/server/controllers/ticket/create.php @@ -163,7 +163,7 @@ class CreateController extends Controller { } private function sendMailStaff($email) { - $mailSender = new MailSender(); + $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_CREATED_STAFF, [ 'to' => $email,