From d26d511ebd6b4667c08d7d54eef8756cf00fdf68 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Wed, 28 Feb 2018 02:43:34 -0300 Subject: [PATCH 01/11] fix bug #115 --- server/controllers/staff/assign-ticket.php | 2 +- server/controllers/ticket/change-department.php | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/server/controllers/staff/assign-ticket.php b/server/controllers/staff/assign-ticket.php index a72b6218..77cfd415 100755 --- a/server/controllers/staff/assign-ticket.php +++ b/server/controllers/staff/assign-ticket.php @@ -20,7 +20,7 @@ DataValidator::with('CustomValidations', true); * @apiUse INVALID_TICKET * @apiUse TICKET_ALREADY_ASSIGNED * @apiUse INVALID_DEPARTMENT - * + * * @apiSuccess {Object} data Empty object * */ diff --git a/server/controllers/ticket/change-department.php b/server/controllers/ticket/change-department.php index 5cea221d..8685b3be 100755 --- a/server/controllers/ticket/change-department.php +++ b/server/controllers/ticket/change-department.php @@ -66,11 +66,21 @@ class ChangeDepartmentController extends Controller { $ticket->addEvent($event); $ticket->department = $department; $ticket->unread = true; - if(!Controller::getLoggedUser()->sharedDepartmentList->includesId($department->id)) { - $ticket->owner = null; - } $ticket->store(); + if(!Controller::getLoggedUser()->sharedDepartmentList->includesId($department->id)) { + Controller::setDataRequester(function ($key) use ($ticketNumber) { + if($key === 'ticketNumber') { + return $ticketNumber; + } + + return null; + }); + $unAssignTicketController = new UnAssignStaffController(); + $unAssignTicketController->validate(); + $unAssignTicketController->handler(); + } + Log::createLog('DEPARTMENT_CHANGED', $ticket->ticketNumber); Response::respondSuccess(); From 30fdb384f3c2063aabddca663ed2ccad7e6c0bf2 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Fri, 9 Mar 2018 15:17:28 -0300 Subject: [PATCH 02/11] fix bug 115/166 --- server/controllers/staff/assign-ticket.php | 4 ++-- server/controllers/staff/un-assign-ticket.php | 12 ++++++------ server/controllers/system/edit-settings.php | 4 ++++ server/controllers/ticket/change-department.php | 4 ++-- server/data/ERRORS.php | 1 + tests/staff/un-assign-ticket.rb | 13 +------------ tests/system/edit-settings.rb | 16 +++++++++++++++- 7 files changed, 31 insertions(+), 23 deletions(-) diff --git a/server/controllers/staff/assign-ticket.php b/server/controllers/staff/assign-ticket.php index 77cfd415..93af3332 100755 --- a/server/controllers/staff/assign-ticket.php +++ b/server/controllers/staff/assign-ticket.php @@ -50,12 +50,12 @@ class AssignStaffController extends Controller { $this->ticket = Ticket::getByTicketNumber($ticketNumber); if($this->ticket->owner) { - Response::respondError(ERRORS::TICKET_ALREADY_ASSIGNED); + throw new Exception(ERRORS::TICKET_ALREADY_ASSIGNED); return; } if(!$this->ticketHasStaffDepartment()) { - Response::respondError(ERRORS::INVALID_DEPARTMENT); + throw new Exception(ERRORS::INVALID_DEPARTMENT); } else { $this->user->sharedTicketList->add($this->ticket); $this->ticket->owner = $this->user; diff --git a/server/controllers/staff/un-assign-ticket.php b/server/controllers/staff/un-assign-ticket.php index 48fe6dc6..0443059b 100755 --- a/server/controllers/staff/un-assign-ticket.php +++ b/server/controllers/staff/un-assign-ticket.php @@ -44,25 +44,25 @@ class UnAssignStaffController extends Controller { $user = Controller::getLoggedUser(); $ticket = Ticket::getByTicketNumber($ticketNumber); - if($ticket->owner && $ticket->owner->id == $user->id) { + if($ticket->owner && $ticket->owner->id === $user->id || $user->level !== 1) { $user->sharedTicketList->remove($ticket); $user->store(); - + $ticket->owner = null; $ticket->unread = true; - + $event = Ticketevent::getEvent(Ticketevent::UN_ASSIGN); $event->setProperties(array( 'authorStaff' => $user, 'date' => Date::getCurrentDate() )); - + $ticket->addEvent($event); $ticket->store(); Response::respondSuccess(); } else { - Response::respondError(ERRORS::NO_PERMISSION); + throw new Exception(ERRORS::NO_PERMISSION); return; } } -} \ No newline at end of file +} diff --git a/server/controllers/system/edit-settings.php b/server/controllers/system/edit-settings.php index dfdf7352..bb56fdf4 100755 --- a/server/controllers/system/edit-settings.php +++ b/server/controllers/system/edit-settings.php @@ -73,6 +73,10 @@ class EditSettingsController extends Controller { $allowed = json_decode(Controller::request('allowedLanguages')); $supported = json_decode(Controller::request('supportedLanguages')); + if (array_diff($supported, $allowed)) { + throw new Exception(ERRORS::INVALID_SUPPORTED_LANGUAGES); + } + foreach(Language::LANGUAGES as $languageCode) { $language = Language::getDataStore($languageCode, 'code'); diff --git a/server/controllers/ticket/change-department.php b/server/controllers/ticket/change-department.php index 8685b3be..3453f732 100755 --- a/server/controllers/ticket/change-department.php +++ b/server/controllers/ticket/change-department.php @@ -52,8 +52,8 @@ class ChangeDepartmentController extends Controller { $department = Department::getDataStore($departmentId); $user = Controller::getLoggedUser(); - if($ticket->owner && $ticket->owner->id !== $user->id){ - Response::respondError(ERRORS::NO_PERMISSION); + if($ticket->owner && $ticket->owner->id !== $user->id || $user->level === 1){ + throw new Exception(ERRORS::NO_PERMISSION); return; } diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 032fd3e4..1ce5c219 100755 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -194,6 +194,7 @@ class ERRORS { const INVALID_CAPTCHA = 'INVALID_CAPTCHA'; const INVALID_TICKET_EVENT = 'INVALID_TICKET_EVENT'; const INVALID_LANGUAGE = 'INVALID_LANGUAGE'; + const INVALID_SUPPORTED_LANGUAGES = 'INVALID_SUPPORTED_LANGUAGES'; const TICKET_ALREADY_ASSIGNED = 'TICKET_ALREADY_ASSIGNED'; const INVALID_PRIORITY = 'INVALID_PRIORITY'; const INVALID_PAGE = 'INVALID_PAGE'; diff --git a/tests/staff/un-assign-ticket.rb b/tests/staff/un-assign-ticket.rb index d0f5fc71..b8b379af 100644 --- a/tests/staff/un-assign-ticket.rb +++ b/tests/staff/un-assign-ticket.rb @@ -28,15 +28,4 @@ describe '/staff/un-assign-ticket' do (staff_ticket).should.equal(nil) end - it 'should fail if ticket is not yours' do - ticket = $database.getRow('ticket', 1 , 'id') - result = request('/staff/un-assign-ticket', { - ticketNumber: ticket['ticket_number'], - csrf_userid: $csrf_userid, - csrf_token: $csrf_token - }) - - (result['status']).should.equal('fail') - (result['message']).should.equal('NO_PERMISSION') - end -end \ No newline at end of file +end diff --git a/tests/system/edit-settings.rb b/tests/system/edit-settings.rb index f39395b7..73684b26 100644 --- a/tests/system/edit-settings.rb +++ b/tests/system/edit-settings.rb @@ -37,6 +37,20 @@ describe'system/edit-settings' do request('/user/logout') end + it 'should fail if supported languages are invalid' do + request('/user/logout') + Scripts.login($staff[:email], $staff[:password], true) + + result= request('/system/edit-settings', { + "csrf_userid" => $csrf_userid, + "csrf_token" => $csrf_token, + "supportedLanguages" => '["en", "pt", "jp", "ru", "de"]', + "allowedLanguages" => '["en", "pt", "jp", "ru"]' + }) + + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_SUPPORTED_LANGUAGES') + end it 'should change allowed and supported languages' do request('/user/logout') Scripts.login($staff[:email], $staff[:password], true) @@ -45,7 +59,7 @@ describe'system/edit-settings' do "csrf_userid" => $csrf_userid, "csrf_token" => $csrf_token, "supportedLanguages" => '["en", "pt", "jp", "ru"]', - "allowedLanguages" => '["en","pt", "jp", "ru", "de"]' + "allowedLanguages" => '["en", "pt", "jp", "ru", "de"]' }) (result['status']).should.equal('success') From 4ea1b925a9796198bb859d6069ba768b31c52728 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Mon, 12 Mar 2018 19:31:54 -0300 Subject: [PATCH 03/11] wip --- client/gulp/config.js | 2 +- server/controllers/staff/un-assign-ticket.php | 2 +- tests/scripts.rb | 20 +++++++++ tests/staff/un-assign-ticket.rb | 45 ++++++++++++++++++- tests/system/get-stats.rb | 36 +++++++-------- 5 files changed, 84 insertions(+), 21 deletions(-) diff --git a/client/gulp/config.js b/client/gulp/config.js index 86e35dc7..2525122c 100644 --- a/client/gulp/config.js +++ b/client/gulp/config.js @@ -2,7 +2,7 @@ module.exports = { - 'serverport': 3000, + 'serverport': 3006, 'scripts': { 'src': './src/*.js', diff --git a/server/controllers/staff/un-assign-ticket.php b/server/controllers/staff/un-assign-ticket.php index 0443059b..f9b028df 100755 --- a/server/controllers/staff/un-assign-ticket.php +++ b/server/controllers/staff/un-assign-ticket.php @@ -44,7 +44,7 @@ class UnAssignStaffController extends Controller { $user = Controller::getLoggedUser(); $ticket = Ticket::getByTicketNumber($ticketNumber); - if($ticket->owner && $ticket->owner->id === $user->id || $user->level !== 1) { + if(($ticket->owner && $ticket->owner->id === $user->id) || $user->level !== 1) { $user->sharedTicketList->remove($ticket); $user->store(); diff --git a/tests/scripts.rb b/tests/scripts.rb index 0e2d911e..67842beb 100644 --- a/tests/scripts.rb +++ b/tests/scripts.rb @@ -16,6 +16,26 @@ class Scripts }) end + def self.createStaff(email, password, name, level='1') + departments = request('/system/get-settings', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + })['departments'] + departments = departments.collect { |x| x.id } + + response = request('/staff/add', { + :name => name, + :email => email, + :password => password, + :level => level, + :departments => departments.to_string + }) + + if response['status'] === 'fail' + raise response['message'] + end + end + def self.login(email = 'steve@jobs.com', password = 'custompassword', staff = false) request('/user/logout') response = request('/user/login', { diff --git a/tests/staff/un-assign-ticket.rb b/tests/staff/un-assign-ticket.rb index b8b379af..65d7a0f5 100644 --- a/tests/staff/un-assign-ticket.rb +++ b/tests/staff/un-assign-ticket.rb @@ -7,8 +7,21 @@ describe '/staff/un-assign-ticket' do #it 'should fail if staff is not assign to the ticket'do #end + it 'should fail if ticket is not yours and you are a staff level 1' do + $database.query('update staff set level="1" where id="1";') + ticket = $database.getRow('ticket', 1 , 'id') + result = request('/staff/un-assign-ticket', { + ticketNumber: ticket['ticket_number'], + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) - it 'should un assign ticket if everything is okey' do + (result['status']).should.equal('fail') + (result['message']).should.equal('NO_PERMISSION') + $database.query('update staff set level="3" where id="1";') + end + + it 'should unassign ticket if it is the current owner' do ticket = $database.getRow('ticket', 1 , 'id') result = request('/staff/un-assign-ticket', { ticketNumber: ticket['ticket_number'], @@ -28,4 +41,34 @@ describe '/staff/un-assign-ticket' do (staff_ticket).should.equal(nil) end + it 'should unassign ticket if you are a staff level 3' do + Scripts.createStaff('staff_level_1', 'password', 'maxi') + Scripts.logout() + Scripts.login('staff_level_1',) + ticket = $database.getRow('ticket', 1 , 'id') + request('/staff/assign-ticket', { + ticketNumber: ticket['ticket_number'], + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + Scripts.logout() + Scripts.login($staff[:email], $staff[:password], true) + result = request('/staff/un-assign-ticket', { + ticketNumber: ticket['ticket_number'], + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + + (result['status']).should.equal('success') + + ticket = $database.getRow('ticket', 1 , 'id') + + (ticket['owner_id']).should.equal(nil) + (ticket['unread']).should.equal('1') + + staff_ticket = $database.getRow('staff_ticket', 1 , 'id') + + (staff_ticket).should.equal(nil) + end + end diff --git a/tests/system/get-stats.rb b/tests/system/get-stats.rb index 19fe0054..9df68e90 100644 --- a/tests/system/get-stats.rb +++ b/tests/system/get-stats.rb @@ -13,62 +13,62 @@ describe'/system/get-stats' do #day 1 for i in 0..5 - $database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday3 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'SIGNUP', NULL, " + yesterday3 + ", NULL, NULL, NULL);") end for i in 0..0 - $database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday3 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CREATE_TICKET', NULL, " + yesterday3 + ", NULL, NULL, NULL);") end for i in 0..1 - $database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday3 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CLOSE', NULL, " + yesterday3 + ", NULL, NULL, NULL);") end for i in 0..2 - $database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday3 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'COMMENT', NULL, " + yesterday3 + ", NULL, NULL, NULL);") end for i in 0..8 - $database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, NULL, " + yesterday3 + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'CLOSE', NULL, NULL, " + yesterday3 + ", NULL, NULL, 1);") end for i in 0..4 - $database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, NULL, " + yesterday3 + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'ASSIGN', NULL, NULL, " + yesterday3 + ", NULL, NULL, 1);") end #day 2 for i in 0..7 - $database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday2 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'SIGNUP', NULL, " + yesterday2 + ", NULL, NULL, NULL);") end for i in 0..2 - $database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday2 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CREATE_TICKET', NULL, " + yesterday2 + ", NULL, NULL, NULL);") end for i in 0..9 - $database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday2 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CLOSE', NULL, " + yesterday2 + ", NULL, NULL, NULL);") end for i in 0..2 - $database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday2 + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'COMMENT', NULL, " + yesterday2 + ", NULL, NULL, NULL);") end for i in 0..10 - $database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, NULL, " + yesterday2 + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'CLOSE', NULL, NULL, " + yesterday2 + ", NULL, NULL, 1);") end for i in 0..2 - $database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, NULL, " + yesterday2 + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'ASSIGN', NULL, NULL, " + yesterday2 + ", NULL, NULL, 1);") end #day 3 for i in 0..0 - $database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'SIGNUP', NULL, " + yesterday + ", NULL, NULL, NULL);") end for i in 0..1 - $database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CREATE_TICKET', NULL, " + yesterday + ", NULL, NULL, NULL);") end for i in 0..4 - $database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'CLOSE', NULL, " + yesterday + ", NULL, NULL, NULL);") end for i in 0..7 - $database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday + ", NULL, NULL, NULL);") + $database.query("INSERT INTO log VALUES(NULL, 'COMMENT', NULL, " + yesterday + ", NULL, NULL, NULL);") end for i in 0..3 - $database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, NULL, " + yesterday + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'CLOSE', NULL, NULL, " + yesterday + ", NULL, NULL, 1);") end for i in 0..7 - $database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, NULL, " + yesterday + ", NULL, NULL, 1);") + $database.query("INSERT INTO ticketevent VALUES(NULL, 'ASSIGN', NULL, NULL, " + yesterday + ", NULL, NULL, 1);") end @result = request('/system/get-stats', { From 0c0e9c3e59d484785f5645ac1b14e923368bc3ba Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Tue, 27 Mar 2018 23:30:18 -0300 Subject: [PATCH 04/11] Add docker and make support --- .gitignore | 7 ++- README.md | 54 ++++++------------- .../app/install/install-step-3-database.js | 3 +- client/src/data/languages/en.js | 2 + client/src/lib-app/api-call.js | 12 ++--- server/.dockerignore | 2 + server/Dockerfile | 11 ++++ server/Makefile | 33 ++++++++++++ server/config.php | 20 ++----- server/controllers/system/init-database.php | 8 +-- server/index.php | 4 +- tests/Gemfile.lock | 42 +++++++++++++++ tests/Makefile | 14 +++++ tests/clean_db.sh | 5 +- tests/libs.rb | 3 +- tests/run-tests.sh | 2 +- tests/system/init-settings.rb | 4 +- 17 files changed, 154 insertions(+), 72 deletions(-) create mode 100644 server/.dockerignore create mode 100644 server/Dockerfile create mode 100644 server/Makefile create mode 100644 tests/Gemfile.lock create mode 100644 tests/Makefile diff --git a/.gitignore b/.gitignore index caaa71d1..0de2b40d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ -server/composer.lock -server/vendor .idea .jshintrc +tests/Gemfile.lock +server/composer.lock +server/vendor server/files/ !server/files/.gitkeep +server/.dbdata +server/.fakemail diff --git a/README.md b/README.md index 05077543..bef96ee3 100644 --- a/README.md +++ b/README.md @@ -45,48 +45,28 @@ Just as there is a `gulp dev` task for development, there is also a `gulp prod` 3. Run `npm test` to run the tests. ### Getting up and running BACK-END (server folder) +1. Install [Docker CE](https://docs.docker.com/install/) +2. Go to the server folder: `cd opensupports/server` +3. Run `make build` to build the images +4. Run `make install` to install composer dependencies -1. Clone this repo: `git clone https://github.com/opensupports/opensupports.git` -2. [Install PHP 5.6](https://www.dev-metal.com/install-setup-php-5-6-ubuntu-14-04-lts/) -3. [Create MySQL Database](#markdown-header-create-mysql-database) -4. [Install composer](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-composer-on-ubuntu-14-04) -5. Go to the server folder: `cd opensupports/server` -6. Run: `composer install` -7. Run the server with: `php -S localhost:8080` +- `make run` runs the backend and database +- `make stop` stop backend and database server +- `make log` show live server logs +- `make db` access to mysql database console +- `make sh` access to backend docker container bash +- `make test` run phpunit tests -##### Create MySQL Database - -1. Install mysql-server: - - Ubuntu - - `sudo apt-get install mysql-server` - - Cent OS - - `sudo yum install mysql-server` - `/etc/init.d/mysqld start` - -2. Access the MySQL shell: - - `mysql -u root` - -3. Create a new database: - - `CREATE DATABASE development;` - -4. Run the MySQL server: - - `sudo /etc/init.d/mysql start` +Server api runs on `http://localhost:8080/` +Also, there's a php server running on `http://localhost:6060/` ##### BACKEND API RUBY TESTING -1. Install Ruby: `sudo apt-get install ruby-full` -2. Install MySQL dev dependencies: `sudo apt-get install libmysqlclient-dev libmysqlclient16 ruby-dev` -3. Install bundle: `sudo gem install bundler` -4. Go to tests folder: `cd opensupports/tests` -5. Install project dependencies: `bundle install` -Tests can run by using executing the `run-tests.sh` file. +1. Go to tests folder: `cd opensupports/tests` +2. Run `make install` to install ruby and its the required dependencies + +- `make run` for running tests (database will be cleared) +- `make clear` for clearing database ##### BACKEND FAKE SMTP SERVER If you're doing development, you can use a FakeSMTP server to see the mails that are being sent. diff --git a/client/src/app/install/install-step-3-database.js b/client/src/app/install/install-step-3-database.js index 2e799769..edb2b9ab 100644 --- a/client/src/app/install/install-step-3-database.js +++ b/client/src/app/install/install-step-3-database.js @@ -26,6 +26,7 @@ class InstallStep3Database extends React.Component { {this.renderMessage()}
+ @@ -75,4 +76,4 @@ class InstallStep3Database extends React.Component { } } -export default InstallStep3Database; \ No newline at end of file +export default InstallStep3Database; diff --git a/client/src/data/languages/en.js b/client/src/data/languages/en.js index 40403bd2..236a3306 100644 --- a/client/src/data/languages/en.js +++ b/client/src/data/languages/en.js @@ -228,6 +228,7 @@ export default { 'USER_SYSTEM': 'User System', 'PREVIOUS': 'Previous', 'DATABASE_HOST': 'MySQL server', + 'DATABASE_PORT': 'MySQL server port', 'DATABASE_NAME': 'MySQL database name', 'DATABASE_USER': 'MySQL user', 'DATABASE_PASSWORD': 'MySQL password', @@ -359,6 +360,7 @@ export default { 'ACTIVITY_PRIORITY_CHANGED_THIS': 'changed priority of this ticket to', 'DATE_PREFIX': 'on', 'LEFT_EMPTY_DATABASE': 'Leave empty for automatic database creation', + 'DEFAULT_PORT': 'Leave empty for 3306 as default', 'REMEMBER_ME': 'Remember me', 'EMAIL_LOWERCASE': 'email', 'PASSWORD_LOWERCASE': 'password', diff --git a/client/src/lib-app/api-call.js b/client/src/lib-app/api-call.js index 1e61dc52..f19920a8 100644 --- a/client/src/lib-app/api-call.js +++ b/client/src/lib-app/api-call.js @@ -4,7 +4,7 @@ const SessionStore = require('lib-app/session-store'); function processData (data, dataAsForm = false) { let newData; - + if(dataAsForm) { newData = new FormData(); @@ -20,7 +20,7 @@ function processData (data, dataAsForm = false) { csrf_userid: SessionStore.getSessionData().userId }, data) } - + return newData; } @@ -48,16 +48,16 @@ module.exports = { }); }); }, - + getFileLink(filePath) { return apiRoot + '/system/download?file=' + filePath; }, - + getAPIUrl() { return apiRoot; }, - + getURL() { return root; } -}; \ No newline at end of file +}; diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 00000000..b3d85e34 --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,2 @@ +.dbdata +.fakemail diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 00000000..11df18bc --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,11 @@ +FROM fauria/lamp +MAINTAINER Ivan Diaz + +RUN apt-get update && \ + apt-get install zip unzip php7.0-zip php7.0-mbstring -y && \ + apt-get remove --yes php7.0-snmp && \ + (curl -s https://getcomposer.org/installer | php) && \ + mv composer.phar /usr/local/bin/composer + +RUN echo 'LISTEN 8080' >> /etc/apache2/apache2.conf +RUN sed -i "1s/.*//" /etc/apache2/sites-enabled/000-default.conf diff --git a/server/Makefile b/server/Makefile new file mode 100644 index 00000000..cf731f56 --- /dev/null +++ b/server/Makefile @@ -0,0 +1,33 @@ +red=`tput setaf 1` +yellow=`tput setaf 3` +reset=`tput sgr0` + +build: + @docker pull mysql + @docker build -t opensupports-srv . || echo "A${red}An error occurred${reset}" + +install: + @docker exec -it opensupports-srv bash -c "cd /var/www/html && composer install" || echo "${red}Please execute 'make run' first${reset}" + +run: + @docker run -d --name opensupports-db -p 4040:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v $(PWD)/.dbdata/:/var/lib/mysql mysql + @docker run -d --name opensupports-myadmin --link opensupports-db:db -p 6060:80 phpmyadmin/phpmyadmin + @docker run -d --name opensupports-fakesmtp -p 7070:25 -v ${PWD}/.fakemail/:/var/mail munkyboy/fakesmtp + @docker run -d --name opensupports-srv --net="host" --rm -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v ${PWD}:/var/www/html opensupports-srv + +test: + @./run-tests.sh + +log: + @docker attach opensupports-srv || echo "${red}Please execute 'make run' first${reset}" + +stop: + @docker stop opensupports-db && docker rm opensupports-db || true + @docker stop opensupports-myadmin && docker rm opensupports-myadmin || true + @docker stop opensupports-srv + +db: + @docker exec -it opensupports-db bash -c "mysql -u root" || echo "${red}Please execute 'make run' first${reset}" + +sh: + @docker exec -it opensupports-srv bash diff --git a/server/config.php b/server/config.php index 6e855f51..a599d939 100644 --- a/server/config.php +++ b/server/config.php @@ -1,16 +1,6 @@ = 0.0.5, < 1.0.0) + http-cookie (1.0.3) + domain_name (~> 0.5) + mechanize (2.7.5) + domain_name (~> 0.5, >= 0.5.1) + http-cookie (~> 1.0) + mime-types (>= 1.17.2) + net-http-digest_auth (~> 1.1, >= 1.1.1) + net-http-persistent (~> 2.5, >= 2.5.2) + nokogiri (~> 1.6) + ntlm-http (~> 0.1, >= 0.1.1) + webrobots (>= 0.0.9, < 0.2) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_portile2 (2.1.0) + mysql (2.9.1) + net-http-digest_auth (1.4.1) + net-http-persistent (2.9.4) + nokogiri (1.6.8.1) + mini_portile2 (~> 2.1.0) + ntlm-http (0.1.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.5) + webrobots (0.1.2) + +PLATFORMS + ruby + +DEPENDENCIES + bacon + mechanize + mysql + +BUNDLED WITH + 1.16.1 diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 00000000..8b08ffa9 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,14 @@ +DB_HOST ?= `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' opensupports-db` + +install: + @apt-get install ruby-full + @apt-get install libmysqlclient-dev libmysqlclient16 ruby-dev + @gem install bundler + @bundle install + +run: + ./run-tests.sh + + +clear: + ./clean_db.sh diff --git a/tests/clean_db.sh b/tests/clean_db.sh index d99eb4c2..0738c4dd 100755 --- a/tests/clean_db.sh +++ b/tests/clean_db.sh @@ -1,9 +1,8 @@ #!/bin/bash - # DELETE ALL TABLES -TABLES=$(mysql -u root development -e "SHOW TABLES IN development;" | awk '{ print $1}' | grep -v '^Tables') +TABLES=$(mysql --host 127.0.0.1 --port 4040 -u root development -e "SHOW TABLES IN development;" | awk '{ print $1}' | grep -v '^Tables') for t in $TABLES do - mysql -u root development -e "DROP TABLE $t" + mysql --host 127.0.0.1 --port 4040 -u root development -e "DROP TABLE $t" done diff --git a/tests/libs.rb b/tests/libs.rb index c90542ea..b57df0fb 100644 --- a/tests/libs.rb +++ b/tests/libs.rb @@ -21,9 +21,10 @@ end class Database def initialize() + mysqlHost = ENV['MYSQL_HOST'] || '127.0.0.1' mysqlUser = ENV['MYSQL_USER'] || 'root' mysqlPass = ENV['MYSQL_PASSWORD'] || '' - @connection = Mysql.new('localhost', mysqlUser , mysqlPass, 'development') + @connection = Mysql.new(mysqlHost, mysqlUser, mysqlPass, 'development', 4040) end def close() diff --git a/tests/run-tests.sh b/tests/run-tests.sh index f8f7ff17..75e25dea 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -1,4 +1,4 @@ ./clean_db.sh ./clean_db.sh ./clean_db.sh -bacon init.rb \ No newline at end of file +bacon init.rb diff --git a/tests/system/init-settings.rb b/tests/system/init-settings.rb index 4a10c846..a6900d93 100644 --- a/tests/system/init-settings.rb +++ b/tests/system/init-settings.rb @@ -25,9 +25,9 @@ describe '/system/init-settings' do 'language' => 'en' }) - lang = $database.getRow('setting', 'language', 'name') - (result['status']).should.equal('success') + + lang = $database.getRow('setting', 'language', 'name') (lang['value']).should.equal('en') result = request('/system/init-admin', { From accc5ba7ae847aacc91f583f321104fd1758698b Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Thu, 29 Mar 2018 15:34:07 -0300 Subject: [PATCH 05/11] Add fakesmtp to make stop --- server/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/server/Makefile b/server/Makefile index cf731f56..1a0db5a4 100644 --- a/server/Makefile +++ b/server/Makefile @@ -24,6 +24,7 @@ log: stop: @docker stop opensupports-db && docker rm opensupports-db || true @docker stop opensupports-myadmin && docker rm opensupports-myadmin || true + @docker stop opensupports-fakesmtp && docker rm opensupports-fakesmtp || true @docker stop opensupports-srv db: From b8740f3aaad6dca35b0e99665bb656769ffab8d7 Mon Sep 17 00:00:00 2001 From: Ivan Diaz Date: Thu, 29 Mar 2018 16:38:00 -0300 Subject: [PATCH 06/11] Add database creation on install --- server/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/Makefile b/server/Makefile index 1a0db5a4..052200d5 100644 --- a/server/Makefile +++ b/server/Makefile @@ -4,10 +4,13 @@ reset=`tput sgr0` build: @docker pull mysql + @docker pull phpmyadmin/phpmyadmin + @docker pull munkyboy/fakesmtp @docker build -t opensupports-srv . || echo "A${red}An error occurred${reset}" install: @docker exec -it opensupports-srv bash -c "cd /var/www/html && composer install" || echo "${red}Please execute 'make run' first${reset}" + @docker exec -it opensupports-db bash -c "mysql -u root -e \"CREATE DATABASE IF NOT EXISTS development;\" " || echo "${red}Please execute 'make run' first${reset}" run: @docker run -d --name opensupports-db -p 4040:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v $(PWD)/.dbdata/:/var/lib/mysql mysql From 909525d6303382b49fac280a07c5b5b8c4c72158 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 11 Apr 2018 22:10:28 -0300 Subject: [PATCH 07/11] Fix docker issues --- README.md | 3 ++- server/Dockerfile | 1 + server/Makefile | 2 +- tests/Makefile | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bef96ee3..c1097bd7 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,8 @@ Just as there is a `gulp dev` task for development, there is also a `gulp prod` - `make test` run phpunit tests Server api runs on `http://localhost:8080/` -Also, there's a php server running on `http://localhost:6060/` +Also, there's a *phpmyadmin* instance running on `http://localhost:6060/`, +you can access with the username `root` and empty password ##### BACKEND API RUBY TESTING diff --git a/server/Dockerfile b/server/Dockerfile index 11df18bc..90b5580b 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -9,3 +9,4 @@ RUN apt-get update && \ RUN echo 'LISTEN 8080' >> /etc/apache2/apache2.conf RUN sed -i "1s/.*//" /etc/apache2/sites-enabled/000-default.conf +RUN sed -i "5s/.*/Listen 8080/" /etc/apache2/ports.conf diff --git a/server/Makefile b/server/Makefile index 052200d5..050507f7 100644 --- a/server/Makefile +++ b/server/Makefile @@ -16,7 +16,7 @@ run: @docker run -d --name opensupports-db -p 4040:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v $(PWD)/.dbdata/:/var/lib/mysql mysql @docker run -d --name opensupports-myadmin --link opensupports-db:db -p 6060:80 phpmyadmin/phpmyadmin @docker run -d --name opensupports-fakesmtp -p 7070:25 -v ${PWD}/.fakemail/:/var/mail munkyboy/fakesmtp - @docker run -d --name opensupports-srv --net="host" --rm -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v ${PWD}:/var/www/html opensupports-srv + @docker run -d --name opensupports-srv --net=host --rm -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v ${PWD}:/var/www/html opensupports-srv test: @./run-tests.sh diff --git a/tests/Makefile b/tests/Makefile index 8b08ffa9..0bee6e8c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -2,7 +2,7 @@ DB_HOST ?= `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} install: @apt-get install ruby-full - @apt-get install libmysqlclient-dev libmysqlclient16 ruby-dev + @apt-get install libmysqlclient-dev ruby-dev @gem install bundler @bundle install From e573a5460d8cb6649d19132f711fd986182aa15c Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 12 Apr 2018 22:22:10 -0300 Subject: [PATCH 08/11] Change vendor chmod docker --- server/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/Makefile b/server/Makefile index 050507f7..6feeba34 100644 --- a/server/Makefile +++ b/server/Makefile @@ -9,7 +9,7 @@ build: @docker build -t opensupports-srv . || echo "A${red}An error occurred${reset}" install: - @docker exec -it opensupports-srv bash -c "cd /var/www/html && composer install" || echo "${red}Please execute 'make run' first${reset}" + @docker exec -it opensupports-srv bash -c "cd /var/www/html && composer install" || echo "${red}Please execute 'make run' first${reset}" && chmod 777 -R vendor/ @docker exec -it opensupports-db bash -c "mysql -u root -e \"CREATE DATABASE IF NOT EXISTS development;\" " || echo "${red}Please execute 'make run' first${reset}" run: From 43f8b6017a403e6134f4368e7b7cbaec9855192f Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 18 Apr 2018 15:31:17 -0300 Subject: [PATCH 09/11] Fix test issues --- server/controllers/staff/un-assign-ticket.php | 8 +-- .../controllers/ticket/change-department.php | 14 ++--- server/controllers/ticket/get.php | 8 +-- server/libs/Validator.php | 6 +-- tests/scripts.rb | 4 ++ tests/staff/assign-ticket.rb | 4 +- tests/staff/edit.rb | 32 +++++++++--- tests/staff/get-all.rb | 4 +- tests/staff/un-assign-ticket.rb | 51 +++++++++++-------- tests/ticket/change-department.rb | 40 +++++++++++++++ 10 files changed, 117 insertions(+), 54 deletions(-) diff --git a/server/controllers/staff/un-assign-ticket.php b/server/controllers/staff/un-assign-ticket.php index f9b028df..ac1ee06c 100755 --- a/server/controllers/staff/un-assign-ticket.php +++ b/server/controllers/staff/un-assign-ticket.php @@ -43,10 +43,11 @@ class UnAssignStaffController extends Controller { $ticketNumber = Controller::request('ticketNumber'); $user = Controller::getLoggedUser(); $ticket = Ticket::getByTicketNumber($ticketNumber); + $owner = $ticket->owner; - if(($ticket->owner && $ticket->owner->id === $user->id) || $user->level !== 1) { - $user->sharedTicketList->remove($ticket); - $user->store(); + if(($owner && $owner->id === $user->id) || $user->level > 1) { + $owner->sharedTicketList->remove($ticket); + $owner->store(); $ticket->owner = null; $ticket->unread = true; @@ -62,7 +63,6 @@ class UnAssignStaffController extends Controller { Response::respondSuccess(); } else { throw new Exception(ERRORS::NO_PERMISSION); - return; } } } diff --git a/server/controllers/ticket/change-department.php b/server/controllers/ticket/change-department.php index 3453f732..18f83109 100755 --- a/server/controllers/ticket/change-department.php +++ b/server/controllers/ticket/change-department.php @@ -52,14 +52,13 @@ class ChangeDepartmentController extends Controller { $department = Department::getDataStore($departmentId); $user = Controller::getLoggedUser(); - if($ticket->owner && $ticket->owner->id !== $user->id || $user->level === 1){ + if($ticket->owner && $ticket->owner->id !== $user->id && $user->level == 1){ throw new Exception(ERRORS::NO_PERMISSION); - return; } $event = Ticketevent::getEvent(Ticketevent::DEPARTMENT_CHANGED); $event->setProperties(array( - 'authorStaff' => Controller::getLoggedUser(), + 'authorStaff' => $user, 'content' => $department->name, 'date' => Date::getCurrentDate() )); @@ -68,14 +67,7 @@ class ChangeDepartmentController extends Controller { $ticket->unread = true; $ticket->store(); - if(!Controller::getLoggedUser()->sharedDepartmentList->includesId($department->id)) { - Controller::setDataRequester(function ($key) use ($ticketNumber) { - if($key === 'ticketNumber') { - return $ticketNumber; - } - - return null; - }); + if(!$user->sharedDepartmentList->includesId($department->id)) { $unAssignTicketController = new UnAssignStaffController(); $unAssignTicketController->validate(); $unAssignTicketController->handler(); diff --git a/server/controllers/ticket/get.php b/server/controllers/ticket/get.php index c92a141d..ada1167b 100755 --- a/server/controllers/ticket/get.php +++ b/server/controllers/ticket/get.php @@ -18,9 +18,9 @@ DataValidator::with('CustomValidations', true); * @apiUse INVALID_TICKET * @apiUse INVALID_TOKEN * @apiUse NO_PERMISSION - * + * * @apiSuccess {[Ticket](#api-Data_Structures-ObjectTicket)} data Information about the requested ticket. - * + * */ @@ -78,6 +78,6 @@ class TicketGetController extends Controller { $user = Controller::getLoggedUser(); return (!Controller::isStaffLogged() && (Controller::isUserSystemEnabled() && $this->ticket->author->id !== $user->id)) || - (Controller::isStaffLogged() && (($this->ticket->owner && $this->ticket->owner->id !== $user->id) || !$user->sharedDepartmentList->includesId($this->ticket->department->id))); + (Controller::isStaffLogged() && (($this->ticket->owner && $this->ticket->owner->id !== $user->id) && !$user->sharedDepartmentList->includesId($this->ticket->department->id))); } -} \ No newline at end of file +} diff --git a/server/libs/Validator.php b/server/libs/Validator.php index a3c19a98..5ac3fbee 100755 --- a/server/libs/Validator.php +++ b/server/libs/Validator.php @@ -31,15 +31,15 @@ class Validator { $requestDataValue = Controller::request($requestDataKey); $requestDataValidator = $requestDataValidationConfig['validation']; $requestDataValidationErrorMessage = $requestDataValidationConfig['error']; - + $this->validateData($requestDataValue, $requestDataValidator, $requestDataValidationErrorMessage); } } - + private function validateData($value, DataValidator $dataValidator, $error) { if (!$dataValidator->validate($value)) { throw new ValidationException($error); } } -} \ No newline at end of file +} diff --git a/tests/scripts.rb b/tests/scripts.rb index 67842beb..0c0d70be 100644 --- a/tests/scripts.rb +++ b/tests/scripts.rb @@ -52,6 +52,10 @@ class Scripts response['data'] end + def self.logout() + request('/user/logout') + end + def self.createTicket(title = 'Winter is coming') result = request('/ticket/create', { title: title, diff --git a/tests/staff/assign-ticket.rb b/tests/staff/assign-ticket.rb index 7baaa09c..9b53ef9a 100644 --- a/tests/staff/assign-ticket.rb +++ b/tests/staff/assign-ticket.rb @@ -24,7 +24,7 @@ describe '/staff/assign-ticket' do (ticket['unread']).should.equal('1') - staff_ticket = $database.getRow('staff_ticket', 1 , 'id') + staff_ticket = $database.getRow('staff_ticket', 1 , 'ticket_id') (staff_ticket['staff_id']).should.equal('1') @@ -44,4 +44,4 @@ describe '/staff/assign-ticket' do (result['message']).should.equal('TICKET_ALREADY_ASSIGNED') end -end \ No newline at end of file +end diff --git a/tests/staff/edit.rb b/tests/staff/edit.rb index 94b1fb1b..b1c46f08 100644 --- a/tests/staff/edit.rb +++ b/tests/staff/edit.rb @@ -42,26 +42,44 @@ describe'/staff/edit' do profilePic: '', departments: '[1]' }) - request('/user/logout') - Scripts.login('arya@opensupports.com', 'starkpassword', true) + + row = $database.getRow('staff', 'Arya Stark', 'name') result = request('/staff/edit', { csrf_userid: $csrf_userid, csrf_token: $csrf_token, - email: 'newwstaff@opensupports.com', + staffId: row['id'], + email: 'ayra2@opensupports.com', + departments: '[1, 2, 3]', sendEmailOnNewTicket: 1 }) (result['status']).should.equal('success') - row = $database.getRow('staff', $csrf_userid, 'id') + row = $database.getRow('staff', 'Arya Stark', 'name') - (row['email']).should.equal('newwstaff@opensupports.com') + (row['email']).should.equal('ayra2@opensupports.com') (row['level']).should.equal('2') - (row['send_email_on_new_ticket']).should.equal('1') + (row['send_email_on_new_ticket']).should.equal('0') row = $database.getRow('department', 1, 'id') (row['owners']).should.equal('4') + row = $database.getRow('department', 2, 'id') + (row['owners']).should.equal('3') + + row = $database.getRow('department', 3, 'id') + (row['owners']).should.equal('2') + + Scripts.logout() + Scripts.login('ayra2@opensupports.com', 'starkpassword', true) + result = request('/staff/edit', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + sendEmailOnNewTicket: 1 + }) + (result['status']).should.equal('success') + row = $database.getRow('staff', 'Arya Stark', 'name') + (row['send_email_on_new_ticket']).should.equal('1') end -end \ No newline at end of file +end diff --git a/tests/staff/get-all.rb b/tests/staff/get-all.rb index 3f4708a6..07f76825 100644 --- a/tests/staff/get-all.rb +++ b/tests/staff/get-all.rb @@ -24,7 +24,7 @@ describe'/staff/get-all' do (result['data'][0]['closedTickets']).should.equal(0) (result['data'][2]['name']).should.equal('Arya Stark') - (result['data'][2]['email']).should.equal('newwstaff@opensupports.com') + (result['data'][2]['email']).should.equal('ayra2@opensupports.com') (result['data'][2]['profilePic']).should.equal('') (result['data'][2]['level']).should.equal('2') (result['data'][2]['departments'][0]['id']).should.equal('1') @@ -32,4 +32,4 @@ describe'/staff/get-all' do (result['data'][2]['assignedTickets']).should.equal(0) (result['data'][2]['closedTickets']).should.equal(0) end -end \ No newline at end of file +end diff --git a/tests/staff/un-assign-ticket.rb b/tests/staff/un-assign-ticket.rb index 65d7a0f5..4685d7ae 100644 --- a/tests/staff/un-assign-ticket.rb +++ b/tests/staff/un-assign-ticket.rb @@ -1,5 +1,5 @@ describe '/staff/un-assign-ticket' do - request('/user/logout') + Scripts.logout() Scripts.login($staff[:email], $staff[:password], true) #TODO: Create a staff without the ticket @@ -7,19 +7,6 @@ describe '/staff/un-assign-ticket' do #it 'should fail if staff is not assign to the ticket'do #end - it 'should fail if ticket is not yours and you are a staff level 1' do - $database.query('update staff set level="1" where id="1";') - ticket = $database.getRow('ticket', 1 , 'id') - result = request('/staff/un-assign-ticket', { - ticketNumber: ticket['ticket_number'], - csrf_userid: $csrf_userid, - csrf_token: $csrf_token - }) - - (result['status']).should.equal('fail') - (result['message']).should.equal('NO_PERMISSION') - $database.query('update staff set level="3" where id="1";') - end it 'should unassign ticket if it is the current owner' do ticket = $database.getRow('ticket', 1 , 'id') @@ -41,16 +28,38 @@ describe '/staff/un-assign-ticket' do (staff_ticket).should.equal(nil) end - it 'should unassign ticket if you are a staff level 3' do - Scripts.createStaff('staff_level_1', 'password', 'maxi') - Scripts.logout() - Scripts.login('staff_level_1',) - ticket = $database.getRow('ticket', 1 , 'id') - request('/staff/assign-ticket', { + it 'should fail if ticket is not yours and you are a staff level 1' do + $database.query('update staff set level="1" where id="1";') + ticket = $database.getRow('ticket', 1 , 'id') + + Scripts.logout() + Scripts.login('ayra2@opensupports.com', 'starkpassword', true) + + result = request('/staff/assign-ticket', { ticketNumber: ticket['ticket_number'], csrf_userid: $csrf_userid, csrf_token: $csrf_token - }) + }) + (result['status']).should.equal('success') + + ticket = $database.getRow('ticket', 1 , 'id') + + Scripts.logout() + Scripts.login($staff[:email], $staff[:password], true) + + result = request('/staff/un-assign-ticket', { + ticketNumber: ticket['ticket_number'], + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + + (result['status']).should.equal('fail') + (result['message']).should.equal('NO_PERMISSION') + $database.query('update staff set level="3" where id="1";') + end + + it 'should unassign ticket if you are a staff level 3' do + ticket = $database.getRow('ticket', 1 , 'id') Scripts.logout() Scripts.login($staff[:email], $staff[:password], true) result = request('/staff/un-assign-ticket', { diff --git a/tests/ticket/change-department.rb b/tests/ticket/change-department.rb index 4db3f6fd..f8c02c12 100644 --- a/tests/ticket/change-department.rb +++ b/tests/ticket/change-department.rb @@ -21,6 +21,11 @@ describe '/ticket/change-department' do it 'should change department if everything is okey' do ticket = $database.getRow('ticket', 1 , 'id') + request('/staff/assign-ticket', { + ticketNumber: ticket['ticket_number'], + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) result = request('/ticket/change-department', { ticketNumber: ticket['ticket_number'], @@ -34,8 +39,43 @@ describe '/ticket/change-department' do ticket = $database.getRow('ticket', 1 , 'id') (ticket['unread']).should.equal('1') (ticket['department_id']).should.equal('2') + (ticket['owner_id']).should.equal('1') lastLog = $database.getLastRow('log') (lastLog['type']).should.equal('DEPARTMENT_CHANGED') end + + it 'should unassing ticket if staff does not server new department' do + ticket = $database.getRow('ticket', 1 , 'id') + request('/staff/edit', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + departments: '[1, 2]', + staffId: 1 + }) + + result = request('/ticket/change-department', { + ticketNumber: ticket['ticket_number'], + departmentId: 3, + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + + (result['status']).should.equal('success') + + ticket = $database.getRow('ticket', 1 , 'id') + (ticket['unread']).should.equal('1') + (ticket['department_id']).should.equal('3') + (ticket['owner_id']).should.equal(nil) + + lastLog = $database.getLastRow('log') + (lastLog['type']).should.equal('DEPARTMENT_CHANGED') + + request('/staff/edit', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + departments: '[1, 2, 3]', + staffId: 1 + }) + end end From d29f379ff66ad4975b4389dee1ba7a0453993105 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 26 Apr 2018 17:42:59 -0300 Subject: [PATCH 10/11] Update dbPort ducumentation, set default port --- client/src/app/install/install-step-3-database.js | 3 ++- server/controllers/system/init-database.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/app/install/install-step-3-database.js b/client/src/app/install/install-step-3-database.js index edb2b9ab..85240d3a 100644 --- a/client/src/app/install/install-step-3-database.js +++ b/client/src/app/install/install-step-3-database.js @@ -1,4 +1,5 @@ import React from 'react'; +import _ from 'lodash'; import history from 'lib-app/history'; import i18n from 'lib-app/i18n'; @@ -64,7 +65,7 @@ class InstallStep3Database extends React.Component { }, () => { API.call({ path: '/system/init-database', - data: form + data: _.extend({}, form, {dbPort: form.dbPort || 3306}) }) .then(() => history.push('/install/step-4')) .catch(({message}) => this.setState({ diff --git a/server/controllers/system/init-database.php b/server/controllers/system/init-database.php index f6fea28e..b62aa61c 100755 --- a/server/controllers/system/init-database.php +++ b/server/controllers/system/init-database.php @@ -14,7 +14,8 @@ use RedBeanPHP\Facade as RedBean; * * @apiPermission any * - * @apiParam {String} dbHost Url of the database server. + * @apiParam {String} dbHost Location of the database server. + * @apiParam {String} dbPort Port of the database server. * @apiParam {String} dbName Name of the database. If not given, the system will try to create one. * @apiParam {String} dbUser User of the database server. * @apiParam {String} dbPassword Password of the database server. From 635ccea020a527c625e1deabd423334856651419 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 26 Apr 2018 20:01:12 -0300 Subject: [PATCH 11/11] Use mysql port from env variable --- .../app/install/install-step-3-database.js | 2 +- server/Dockerfile | 4 ++ server/Makefile | 4 +- server/config.php | 22 +++++++--- server/index.php | 1 - tests/Gemfile.lock | 42 ------------------- tests/Makefile | 8 +++- tests/clean_db.sh | 4 +- tests/libs.rb | 5 ++- 9 files changed, 36 insertions(+), 56 deletions(-) delete mode 100644 tests/Gemfile.lock diff --git a/client/src/app/install/install-step-3-database.js b/client/src/app/install/install-step-3-database.js index 85240d3a..27b13c80 100644 --- a/client/src/app/install/install-step-3-database.js +++ b/client/src/app/install/install-step-3-database.js @@ -27,7 +27,7 @@ class InstallStep3Database extends React.Component { {this.renderMessage()} - + diff --git a/server/Dockerfile b/server/Dockerfile index 90b5580b..1c385f5a 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -10,3 +10,7 @@ RUN apt-get update && \ RUN echo 'LISTEN 8080' >> /etc/apache2/apache2.conf RUN sed -i "1s/.*//" /etc/apache2/sites-enabled/000-default.conf RUN sed -i "5s/.*/Listen 8080/" /etc/apache2/ports.conf + +# ENVIRONMENT VARIABLES +ENV MYSQL_HOST 127.0.0.1 +ENV MYSQL_PORT 4040 diff --git a/server/Makefile b/server/Makefile index 6feeba34..214dc9ea 100644 --- a/server/Makefile +++ b/server/Makefile @@ -3,7 +3,7 @@ yellow=`tput setaf 3` reset=`tput sgr0` build: - @docker pull mysql + @docker pull mysql:5.6 @docker pull phpmyadmin/phpmyadmin @docker pull munkyboy/fakesmtp @docker build -t opensupports-srv . || echo "A${red}An error occurred${reset}" @@ -13,7 +13,7 @@ install: @docker exec -it opensupports-db bash -c "mysql -u root -e \"CREATE DATABASE IF NOT EXISTS development;\" " || echo "${red}Please execute 'make run' first${reset}" run: - @docker run -d --name opensupports-db -p 4040:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v $(PWD)/.dbdata/:/var/lib/mysql mysql + @docker run -d --name opensupports-db -p 4040:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v $(PWD)/.dbdata/:/var/lib/mysql mysql:5.6 @docker run -d --name opensupports-myadmin --link opensupports-db:db -p 6060:80 phpmyadmin/phpmyadmin @docker run -d --name opensupports-fakesmtp -p 7070:25 -v ${PWD}/.fakemail/:/var/mail munkyboy/fakesmtp @docker run -d --name opensupports-srv --net=host --rm -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v ${PWD}:/var/www/html opensupports-srv diff --git a/server/config.php b/server/config.php index a599d939..6a9016db 100644 --- a/server/config.php +++ b/server/config.php @@ -1,6 +1,18 @@ = 0.0.5, < 1.0.0) - http-cookie (1.0.3) - domain_name (~> 0.5) - mechanize (2.7.5) - domain_name (~> 0.5, >= 0.5.1) - http-cookie (~> 1.0) - mime-types (>= 1.17.2) - net-http-digest_auth (~> 1.1, >= 1.1.1) - net-http-persistent (~> 2.5, >= 2.5.2) - nokogiri (~> 1.6) - ntlm-http (~> 0.1, >= 0.1.1) - webrobots (>= 0.0.9, < 0.2) - mime-types (3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2016.0521) - mini_portile2 (2.1.0) - mysql (2.9.1) - net-http-digest_auth (1.4.1) - net-http-persistent (2.9.4) - nokogiri (1.6.8.1) - mini_portile2 (~> 2.1.0) - ntlm-http (0.1.1) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.5) - webrobots (0.1.2) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - mechanize - mysql - -BUNDLED WITH - 1.16.1 diff --git a/tests/Makefile b/tests/Makefile index 0bee6e8c..b30f4e1c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -6,9 +6,15 @@ install: @gem install bundler @bundle install +run: export MYSQL_HOST=127.0.0.1 +run: export MYSQL_PORT=4040 run: ./run-tests.sh +clear: export MYSQL_HOST=127.0.0.1 +clear: export MYSQL_PORT=4040 clear: - ./clean_db.sh + ./clean_db.sh && \ + ./clean_db.sh && \ + ./clean_db.sh diff --git a/tests/clean_db.sh b/tests/clean_db.sh index 0738c4dd..33053f01 100755 --- a/tests/clean_db.sh +++ b/tests/clean_db.sh @@ -1,8 +1,8 @@ #!/bin/bash # DELETE ALL TABLES -TABLES=$(mysql --host 127.0.0.1 --port 4040 -u root development -e "SHOW TABLES IN development;" | awk '{ print $1}' | grep -v '^Tables') +TABLES=$(mysql --host ${MYSQL_HOST} --port ${MYSQL_PORT} -u root development -e "SHOW TABLES IN development;" | awk '{ print $1}' | grep -v '^Tables') for t in $TABLES do - mysql --host 127.0.0.1 --port 4040 -u root development -e "DROP TABLE $t" + mysql --host ${MYSQL_HOST} --port ${MYSQL_PORT} -u root development -e "DROP TABLE $t" done diff --git a/tests/libs.rb b/tests/libs.rb index b57df0fb..325438dc 100644 --- a/tests/libs.rb +++ b/tests/libs.rb @@ -21,10 +21,11 @@ end class Database def initialize() - mysqlHost = ENV['MYSQL_HOST'] || '127.0.0.1' + mysqlHost = ENV['MYSQL_HOST'] || 'localhost' + mysqlPort = ENV['MYSQL_PORT'] || '3306' mysqlUser = ENV['MYSQL_USER'] || 'root' mysqlPass = ENV['MYSQL_PASSWORD'] || '' - @connection = Mysql.new(mysqlHost, mysqlUser, mysqlPass, 'development', 4040) + @connection = Mysql.new(mysqlHost, mysqlUser, mysqlPass, 'development', mysqlPort.to_i) end def close()