diff --git a/server/controllers/article/get-all.php b/server/controllers/article/get-all.php index 9d90e152..40a49efc 100644 --- a/server/controllers/article/get-all.php +++ b/server/controllers/article/get-all.php @@ -7,7 +7,7 @@ class GetAllArticlesController extends Controller { public function validations() { return [ - 'permission' => 'user', + 'permission' => (Controller::isUserSystemEnabled()) ? 'user' : 'any', 'requestData' => [] ]; } diff --git a/server/controllers/system.php b/server/controllers/system.php index 32d0daad..b36fc8c6 100644 --- a/server/controllers/system.php +++ b/server/controllers/system.php @@ -9,12 +9,14 @@ require_once 'system/get-logs.php'; require_once 'system/get-mail-templates.php'; require_once 'system/edit-mail-template.php'; require_once 'system/recover-mail-template.php'; -require_once 'system/get-stats.php'; require_once 'system/disable-registration.php'; require_once 'system/enable-registration.php'; +require_once 'system/disable-user-system.php'; +require_once 'system/enabled-user-system.php'; require_once 'system/add-api-key.php'; require_once 'system/delete-api-key.php'; require_once 'system/get-all-keys.php'; +require_once 'system/get-stats.php'; require_once 'system/delete-all-users.php'; require_once 'system/csv-import.php'; require_once 'system/backup-database.php'; @@ -43,5 +45,7 @@ $systemControllerGroup->addController(new DeleteAllUsersController); $systemControllerGroup->addController(new BackupDatabaseController); $systemControllerGroup->addController(new DownloadController); $systemControllerGroup->addController(new CSVImportController); +$systemControllerGroup->addController(new DisableUserSystemController); +$systemControllerGroup->addController(new EnabledUserSystemController); $systemControllerGroup->finalize(); \ No newline at end of file diff --git a/server/controllers/system/disable-user-system.php b/server/controllers/system/disable-user-system.php new file mode 100644 index 00000000..fc1cc0a1 --- /dev/null +++ b/server/controllers/system/disable-user-system.php @@ -0,0 +1,58 @@ + 'staff_3', + 'requestData' => [] + ]; + } + + public function handler() { + $password = Controller::request('password'); + + if(!Hashing::verifyPassword($password, Controller::getLoggedUser()->password)) { + throw new Exception(ERRORS::INVALID_PASSWORD); + + } + + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::SYSTEM_USER_IS_ALREADY_DISABLED); + } + + $userSystemEnabled = Setting::getSetting('user-system-enabled'); + $userSystemEnabled->value = 0 ; + $userSystemEnabled->store(); + + $userList = User::getAll(); + + foreach($userList as $user) { + $ticketNumberList = []; + + foreach($user->sharedTicketList as $ticket) { + $ticket->authorEmail = $user->email; + $ticket->authorName = $user->name; + $ticket->author = null; + + $ticketNumberList[] = $ticket->ticketNumber; + $ticket->store(); + } + + $mailSender = new MailSender(); + + $mailSender->setTemplate(MailTemplate::USER_SYSTEM_DISABLED, [ + 'to' => $user->email, + 'name' => $user->name, + 'tickets' => json_encode($ticketNumberList) + ]); + + $mailSender->send(); + + $user->delete(); + } + + Response::respondSuccess(); + } +} \ No newline at end of file diff --git a/server/controllers/system/enabled-user-system.php b/server/controllers/system/enabled-user-system.php new file mode 100644 index 00000000..0139608a --- /dev/null +++ b/server/controllers/system/enabled-user-system.php @@ -0,0 +1,78 @@ + 'staff_3', + 'requestData' => [] + ]; + } + + public function handler() { + $password = Controller::request('password'); + + if(!Hashing::verifyPassword($password, Controller::getLoggedUser()->password)) { + throw new Exception(ERRORS::INVALID_PASSWORD); + + } + + if(Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::SYSTEM_USER_IS_ALREADY_ENABLED); + } + + $userSystemEnabled = Setting::getSetting('user-system-enabled'); + $userSystemEnabled->value = 1 ; + $userSystemEnabled->store(); + + $ticketList = Ticket::getAll(); + + foreach($ticketList as $ticket) { + + $userRow = User::getDataStore($ticket->authorEmail, 'email'); + + if($userRow->isNull()) { + $this->createUser($ticket->authorEmail,$ticket->authorName); + + } else { + $userRow->tickets = $userRow->tickets + 1; + $userRow->sharedTicketList->add($ticket); + $userRow->store(); + } + + $actualUserRow = User::getDataStore($ticket->authorEmail,'email'); + $ticket->author = $actualUserRow; + $ticket->authorName = null; + $ticket->authorEmail = null; + $ticket->store(); + } + + Response::respondSuccess(); + } + public function createUser($email,$name) { + $userInstance = new User(); + + $password = Hashing::generateRandomToken(); + + $userInstance->setProperties([ + 'name' => $name, + 'signupDate' => Date::getCurrentDate(), + 'tickets' => 1, + 'email' => $email, + 'password' => Hashing::hashPassword($password), + 'verificationToken' => null + ]); + + $userInstance->store(); + + $mailSender = new MailSender(); + $mailSender->setTemplate(MailTemplate::USER_SYSTEM_ENABLED, [ + 'to' => $email, + 'name' => $name, + 'password' => $password + ]); + $mailSender->send(); + + } +} \ No newline at end of file diff --git a/server/controllers/system/get-settings.php b/server/controllers/system/get-settings.php index 9cddb302..41e2299d 100644 --- a/server/controllers/system/get-settings.php +++ b/server/controllers/system/get-settings.php @@ -46,7 +46,8 @@ class GetSettingsController extends Controller { 'registration' => Setting::getSetting('registration')->getValue(), 'departments' => Department::getDepartmentNames(), 'supportedLanguages' => Language::getSupportedLanguages(), - 'allowedLanguages' => Language::getAllowedLanguages() + 'allowedLanguages' => Language::getAllowedLanguages(), + 'user-system-enabled' => Setting::getSetting('user-system-enabled')->getValue() ]; } diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php index b5d7c6d3..4106797b 100644 --- a/server/controllers/system/init-settings.php +++ b/server/controllers/system/init-settings.php @@ -42,6 +42,7 @@ class InitSettingsController extends Controller { 'title' => 'Support Center', 'url' => 'http://www.opensupports.com/support', 'registration' => true, + 'user-system-enabled' => true, 'last-stat-day' => '20170101', //TODO: get current date 'ticket-gap' => Hashing::generateRandomPrime(100000, 999999), 'file-gap' => Hashing::generateRandomPrime(100000, 999999), diff --git a/server/controllers/ticket/comment.php b/server/controllers/ticket/comment.php index 9c27dc17..cd7713e1 100644 --- a/server/controllers/ticket/comment.php +++ b/server/controllers/ticket/comment.php @@ -9,7 +9,7 @@ class CommentController extends Controller { private $content; public function validations() { - return [ + $validations = [ 'permission' => 'user', 'requestData' => [ 'content' => [ @@ -22,13 +22,23 @@ class CommentController extends Controller { ] ] ]; + + if(!Controller::isUserSystemEnabled()) { + $validations['permission'] = 'any'; + $validations['requestData']['email'] = [ + 'validation' => DataValidator::email(), + 'error' => ERRORS::INVALID_EMAIL + ]; + } + + return $validations; } public function handler() { $session = Session::getInstance(); $this->requestData(); - if ($session->isLoggedWithId($this->ticket->author->id) || Controller::isStaffLogged()) { + if (!Controller::isUserSystemEnabled() || $session->isLoggedWithId($this->ticket->author->id) || Controller::isStaffLogged()) { $this->storeComment(); Log::createLog('COMMENT', $this->ticket->ticketNumber); @@ -41,9 +51,13 @@ class CommentController extends Controller { private function requestData() { $ticketNumber = Controller::request('ticketNumber'); - + $email = Controller::request('email'); $this->ticket = Ticket::getByTicketNumber($ticketNumber); $this->content = Controller::request('content'); + + if(!Controller::isUserSystemEnabled() && $this->ticket->authorEmail !== $email && !Controller::isStaffLogged()) { + throw new Exception(ERRORS::NO_PERMISSION); + } } private function storeComment() { @@ -59,7 +73,7 @@ class CommentController extends Controller { if(Controller::isStaffLogged()) { $this->ticket->unread = true; $comment->authorStaff = Controller::getLoggedUser(); - } else { + } else if(Controller::isUserSystemEnabled()) { $this->ticket->unreadStaff = true; $comment->authorUser = Controller::getLoggedUser(); } diff --git a/server/controllers/ticket/create.php b/server/controllers/ticket/create.php index 4b761dc5..5b39ab47 100644 --- a/server/controllers/ticket/create.php +++ b/server/controllers/ticket/create.php @@ -10,9 +10,11 @@ class CreateController extends Controller { private $departmentId; private $language; private $ticketNumber; + private $email; + private $name; public function validations() { - return [ + $validations = [ 'permission' => 'user', 'requestData' => [ 'title' => [ @@ -33,6 +35,16 @@ class CreateController extends Controller { ] ] ]; + + if(!Controller::isUserSystemEnabled()) { + $validations['permission'] = 'any'; + $validations['requestData']['captcha'] = [ + 'validation' => DataValidator::captcha(), + 'error' => ERRORS::INVALID_CAPTCHA + ]; + } + + return $validations; } public function handler() { @@ -40,6 +52,8 @@ class CreateController extends Controller { $this->content = Controller::request('content'); $this->departmentId = Controller::request('departmentId'); $this->language = Controller::request('language'); + $this->email = Controller::request('email'); + $this->name = Controller::request('name'); $this->storeTicket(); @@ -67,12 +81,17 @@ class CreateController extends Controller { 'unread' => false, 'unreadStaff' => true, 'closed' => false, + 'authorName' => $this->name, + 'authorEmail' => $this->email )); - $author->sharedTicketList->add($ticket); - $author->tickets++; + if(Controller::isUserSystemEnabled()) { + $author->sharedTicketList->add($ticket); + $author->tickets++; + + $author->store(); + } - $author->store(); $ticket->store(); $this->ticketNumber = $ticket->ticketNumber; diff --git a/server/controllers/ticket/get.php b/server/controllers/ticket/get.php index 36ef3f8b..6e2a6758 100644 --- a/server/controllers/ticket/get.php +++ b/server/controllers/ticket/get.php @@ -8,7 +8,7 @@ class TicketGetController extends Controller { private $ticket; public function validations() { - return [ + $validations = [ 'permission' => 'user', 'requestData' => [ 'ticketNumber' => [ @@ -17,13 +17,38 @@ class TicketGetController extends Controller { ] ] ]; + + if(!Controller::isUserSystemEnabled() && !Controller::isStaffLogged()) { + $validations['permission'] = 'any'; + $validations['requestData']['email'] = [ + 'validation' => DataValidator::email(), + 'error' => ERRORS::INVALID_EMAIL + ]; + $validations['requestData']['captcha'] = [ + 'validation' => DataValidator::captcha(), + 'error' => ERRORS::INVALID_CAPTCHA + ]; + } + + return $validations; } public function handler() { + $email = Controller::request('email'); + $this->ticket = Ticket::getByTicketNumber(Controller::request('ticketNumber')); + if(!Controller::isUserSystemEnabled() && !Controller::isStaffLogged()) { + if($this->ticket->authorEmail === $email) { + Response::respondSuccess($this->ticket->toArray()); + return; + } else { + throw new Exception(ERRORS::NO_PERMISSION); + } + } + if ($this->shouldDenyPermission()) { - Response::respondError(ERRORS::NO_PERMISSION); + throw new Exception(ERRORS::NO_PERMISSION); } else { Response::respondSuccess($this->ticket->toArray()); } @@ -32,7 +57,7 @@ class TicketGetController extends Controller { private function shouldDenyPermission() { $user = Controller::getLoggedUser(); - return (!Controller::isStaffLogged() && $this->ticket->author->id !== $user->id) || + return (!Controller::isStaffLogged() && (Controller::isUserSystemEnabled() && $this->ticket->author->id !== $user->id)) || (Controller::isStaffLogged() && $this->ticket->owner && $this->ticket->owner->id !== $user->id); } } \ No newline at end of file diff --git a/server/controllers/user/delete.php b/server/controllers/user/delete.php index 75cf7dfc..b17ed8a4 100644 --- a/server/controllers/user/delete.php +++ b/server/controllers/user/delete.php @@ -20,6 +20,10 @@ class DeleteUserController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $userId = Controller::request('userId'); $user = User::getDataStore($userId); diff --git a/server/controllers/user/get-user.php b/server/controllers/user/get-user.php index 8ea55c09..ae9b4f9e 100644 --- a/server/controllers/user/get-user.php +++ b/server/controllers/user/get-user.php @@ -18,6 +18,11 @@ class GetUserByIdController extends Controller { } public function handler() { + + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $userId = Controller::request('userId'); $user = User::getDataStore($userId); $staff = Controller::getLoggedUser(); diff --git a/server/controllers/user/get-users.php b/server/controllers/user/get-users.php index eadd6922..5d8daf28 100644 --- a/server/controllers/user/get-users.php +++ b/server/controllers/user/get-users.php @@ -21,6 +21,10 @@ class GetUsersController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $userList = $this->getUserList(); $userListArray = []; diff --git a/server/controllers/user/login.php b/server/controllers/user/login.php index 7eada075..ebd55c30 100644 --- a/server/controllers/user/login.php +++ b/server/controllers/user/login.php @@ -14,9 +14,12 @@ class LoginController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled() && !Controller::request('staff')) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + if ($this->isAlreadyLoggedIn()) { - Response::respondError(ERRORS::SESSION_EXISTS); - return; + throw new Exception(ERRORS::SESSION_EXISTS); } if ($this->checkInputCredentials() || $this->checkRememberToken()) { diff --git a/server/controllers/user/recover-password.php b/server/controllers/user/recover-password.php index c5cec698..ac3ceef2 100644 --- a/server/controllers/user/recover-password.php +++ b/server/controllers/user/recover-password.php @@ -27,6 +27,10 @@ class RecoverPasswordController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $this->requestData(); $this->changePassword(); } diff --git a/server/controllers/user/send-recover-password.php b/server/controllers/user/send-recover-password.php index e92d1ae6..c59eebb1 100644 --- a/server/controllers/user/send-recover-password.php +++ b/server/controllers/user/send-recover-password.php @@ -21,6 +21,10 @@ class SendRecoverPasswordController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $email = Controller::request('email'); $this->user = User::getUser($email,'email'); diff --git a/server/controllers/user/signup.php b/server/controllers/user/signup.php index 567c7b21..4b9e4d89 100644 --- a/server/controllers/user/signup.php +++ b/server/controllers/user/signup.php @@ -46,6 +46,10 @@ class SignUpController extends Controller { } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $this->storeRequestData(); $apiKey = APIKey::getDataStore(Controller::request('apiKey'), 'token'); diff --git a/server/controllers/user/verify.php b/server/controllers/user/verify.php index 616d3b92..aa2dd31d 100644 --- a/server/controllers/user/verify.php +++ b/server/controllers/user/verify.php @@ -17,6 +17,10 @@ class VerifyController extends Controller{ } public function handler() { + if(!Controller::isUserSystemEnabled()) { + throw new Exception(ERRORS::USER_SYSTEM_DISABLED); + } + $email = Controller::request('email'); $token = Controller::request('token'); diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 5f47e71a..d75c7e2b 100644 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -35,6 +35,9 @@ class ERRORS { const INVALID_TEMPLATE = 'INVALID_TEMPLATE'; const INVALID_SUBJECT = 'INVALID_SUBJECT'; const INVALID_BODY = 'INVALID_BODY'; + const USER_SYSTEM_DISABLED = 'USER_SYSTEM_DISABLED'; + const SYSTEM_USER_IS_ALREADY_DISABLED = 'SYSTEM_USER_IS_ALREADY_DISABLED'; + const SYSTEM_USER_IS_ALREADY_ENABLED = 'SYSTEM_USER_IS_ALREADY_ENABLED'; const INVALID_PERIOD = 'INVALID_PERIOD'; const NAME_ALREADY_USED = 'NAME_ALREADY_USED'; const INVALID_FILE = 'INVALID_FILE'; diff --git a/server/data/InitialMails.php b/server/data/InitialMails.php index 899d9af3..7be66192 100644 --- a/server/data/InitialMails.php +++ b/server/data/InitialMails.php @@ -53,6 +53,26 @@ class InitialMails { 'body' => file_get_contents('data/mail-templates/user-recovered-password-es.html') ] ], + 'USER_SYSTEM_DISABLED' => [ + 'en' => [ + 'subject' => 'Account has been deleted - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-system-disabled-en.html') + ], + 'es' => [ + 'subject' => 'cuanta borrada - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-system-disabled-es.html') + ] + ], + 'USER_SYSTEM_ENABLED' => [ + 'en' => [ + 'subject' => 'account has been created - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-system-enabled-en.html') + ], + 'es' => [ + 'subject' => 'se te ha creado una cuenta - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-system-enabled-es.html') + ] + ] ]; } } \ No newline at end of file diff --git a/server/data/mail-templates/user-system-disabled-en.html b/server/data/mail-templates/user-system-disabled-en.html new file mode 100644 index 00000000..d42819c1 --- /dev/null +++ b/server/data/mail-templates/user-system-disabled-en.html @@ -0,0 +1,3 @@ +