Merge pull request #325 from ivandiazwm/master

Fix usery system disabled issues, prepare 4.3.0 upgrade
This commit is contained in:
Ivan Diaz 2018-10-06 16:09:30 -03:00 committed by GitHub
commit 8882b53b3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 113 additions and 6 deletions

View File

@ -1,6 +1,6 @@
![OpenSupports](http://www.opensupports.com/logo.png) ![OpenSupports](http://www.opensupports.com/logo.png)
[![Build Status](https://travis-ci.org/opensupports/opensupports.svg?branch=master)](https://travis-ci.org/opensupports/opensupports) v4.2.0 [![Build Status](https://travis-ci.org/opensupports/opensupports.svg?branch=master)](https://travis-ci.org/opensupports/opensupports) v4.3.0
OpenSupports is an open source ticket system built primarily with PHP and ReactJS. OpenSupports is an open source ticket system built primarily with PHP and ReactJS.
Please, visit our website for more information: [http://www.opensupports.com/](http://www.opensupports.com/) Please, visit our website for more information: [http://www.opensupports.com/](http://www.opensupports.com/)

View File

@ -7,9 +7,10 @@ class MainLayoutFooter extends React.Component {
render() { render() {
return ( return (
<div className={this.getClass()}> <div className={this.getClass()}>
{(this.props.adminPanelOpened) ? this.renderExtraLinks() : null} {this.props.adminPanelOpened ? this.renderExtraLinks() : null}
<div className="main-layout-footer__powered"> <div className="main-layout-footer__powered">
Powered by <a className="main-layout-footer__os-link" href="http://www.opensupports.com/" target="_blank">OpenSupports</a> Powered by <a className="main-layout-footer__os-link" href="http://www.opensupports.com/" target="_blank">OpenSupports</a>
<span> {this.props.adminPanelOpened ? `v${opensupports_version}` : null}</span>
</div> </div>
</div> </div>
); );

View File

@ -1,3 +1,4 @@
opensupports_version = '4.3.0';
root = 'http://localhost:3000'; root = 'http://localhost:3000';
apiRoot = 'http://localhost:3000/api'; apiRoot = 'http://localhost:3000/api';
globalIndexPath = ''; globalIndexPath = '';

View File

@ -19,6 +19,7 @@
<div id="app"></div> <div id="app"></div>
<script> <script>
opensupports_version = '4.3.0';
root = "<?=$url ?>"; root = "<?=$url ?>";
apiRoot = '<?=$url ?>/api'; apiRoot = '<?=$url ?>/api';
globalIndexPath = "<?=$path ?>"; globalIndexPath = "<?=$path ?>";

View File

@ -45,7 +45,7 @@ class UnAssignStaffController extends Controller {
$ticket = Ticket::getByTicketNumber($ticketNumber); $ticket = Ticket::getByTicketNumber($ticketNumber);
$owner = $ticket->owner; $owner = $ticket->owner;
if($ticket->isOwner($user) || $user->level > 2) { if($owner && ($ticket->isOwner($user) || $user->level > 2)) {
if(!$ticket->isAuthor($owner)) { if(!$ticket->isAuthor($owner)) {
$owner->sharedTicketList->remove($ticket); $owner->sharedTicketList->remove($ticket);
$owner->store(); $owner->store();

View File

@ -141,7 +141,7 @@ class CommentController extends Controller {
$email = $recipient['email']; $email = $recipient['email'];
$name = $recipient['name']; $name = $recipient['name'];
$isStaff = $recipient['staff']; $isStaff = array_key_exists('staff', $recipient) && $recipient['staff'];
$url = Setting::getSetting('url')->getValue(); $url = Setting::getSetting('url')->getValue();

View File

@ -141,6 +141,8 @@ class Ticket extends DataStore {
]; ];
} else { } else {
return [ return [
'id' => NULL,
'staff' => false,
'name' => $this->authorName, 'name' => $this->authorName,
'email' => $this->authorEmail 'email' => $this->authorEmail
]; ];
@ -188,7 +190,7 @@ class Ticket extends DataStore {
if(!Controller::isStaffLogged() && $ticketEvent->private) { if(!Controller::isStaffLogged() && $ticketEvent->private) {
continue; continue;
} }
$events[] = $event; $events[] = $event;
} }
@ -202,10 +204,11 @@ class Ticket extends DataStore {
public function isAuthor($user) { public function isAuthor($user) {
$ticketAuthor = $this->authorToArray(); $ticketAuthor = $this->authorToArray();
if(is_string($user)) return $user == $ticketAuthor['email']; if(is_string($user)) return $user == $ticketAuthor['email'];
if(!($user instanceof DataStore) || $user->isNull()) return false;
return $user->id == $ticketAuthor['id'] && ($user instanceof Staff) == $ticketAuthor['staff']; return $user->id == $ticketAuthor['id'] && ($user instanceof Staff) == $ticketAuthor['staff'];
} }
public function isOwner($user) { public function isOwner($user) {
return $this->owner && $user->id == $this->owner->id && ($user instanceof Staff); return !$user->isNull() && $this->owner && $user->id == $this->owner->id && ($user instanceof Staff);
} }
} }

View File

@ -65,6 +65,40 @@ describe'system/disable-user-system' do
(result['status']).should.equal('success') (result['status']).should.equal('success')
end end
it 'should be able to assign and respond tickets' do
Scripts.login($staff[:email], $staff[:password], true);
ticket = $database.getLastRow('ticket');
result = request('/staff/assign-ticket', {
ticketNumber: ticket['ticket_number'],
csrf_userid: $csrf_userid,
csrf_token: $csrf_token,
})
(result['status']).should.equal('success')
result = request('/ticket/comment', {
ticketNumber: ticket['ticket_number'],
content: 'This is a staff response for a ticket without an user',
csrf_userid: $csrf_userid,
csrf_token: $csrf_token,
})
(result['status']).should.equal('success')
end
it 'should be be able to create a ticket as an admin' do
result = request('/ticket/create', {
title: 'created by staff with user system disabled',
content: 'an staff created this ticket while user system disabled',
departmentId: 1,
language: 'en',
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
(result['status']).should.equal('success')
ticket = $database.getRow('ticket', result['data']['ticketNumber'], 'ticket_number')
(ticket['author_id']).should.equal(nil)
(ticket['author_staff_id']).should.equal('1')
end
it 'should not disable the user system if it is already disabled 'do it 'should not disable the user system if it is already disabled 'do
request('/user/logout') request('/user/logout')
Scripts.login($staff[:email], $staff[:password], true) Scripts.login($staff[:email], $staff[:password], true)

View File

@ -0,0 +1,67 @@
<?php
require_once '../mysql_connect.php';
$filePath = '../../api/files';
print 'Begin update v4.3.0...' . PHP_EOL;
// Change profile pics
print '[1/3] Updating profile pics..' . PHP_EOL;
$queryResult = $mysql->query("SELECT id,profile_pic FROM staff") or die(PHP_EOL . 'Error: profile_pic can\'t be found on `staff` table'. PHP_EOL);
while($staff = $queryResult->fetch_array(MYSQLI_ASSOC)) {
global $filePath;
$id = $staff['id'];
$profilePicFileName = $staff['profile_pic'];
$updatedProfilePicFileName = "p_$profilePicFileName";
if(!$profilePicFileName || $profilePicFileName[0] == 'p') continue;
rename("$filePath/$profilePicFileName", "$filePath/$updatedProfilePicFileName")
or die("Error: could not change file name from $profilePicFileName to $updatedProfilePicFileName");
$mysql->query("UPDATE staff SET profile_pic='$updatedProfilePicFileName' WHERE id='$id'")
or die (PHP_EOL . "Error: could not update profile_pic for staff id:$id" . PHP_EOL);
}
// Change ticket attachments
print '[2/3] Updating ticket attachments...' . PHP_EOL;
function updateTicketFile($ticketNumber, $fileName) {
global $filePath;
$updatedFileName = "t$ticketNumber" . "_$fileName";
rename("$filePath/$fileName", "$filePath/$updatedFileName")
or die(PHP_EOL . "Error: could not change file name from $fileName to $updatedFileName" . PHP_EOL);
return $updatedFileName;
}
$queryResult = $mysql->query("SELECT id,ticket_number,file FROM ticket");
while($queryResult && $ticket = $queryResult->fetch_array(MYSQLI_ASSOC)) {
$id = $ticket['id'];
if(!$ticket['file'] || $ticket['file'][0] == 't') continue;
$updatedFileName = updateTicketFile($ticket['ticket_number'], $ticket['file']);
$mysql->query("UPDATE ticket SET file='$updatedFileName' WHERE id='$id'")
or die (PHP_EOL . "Error: could not update file for ticket id:$id" . PHP_EOL);
}
// Change ticket attachments
print '[3/3] Updating ticketevent attachments...' . PHP_EOL;
$queryResult = $mysql->query("SELECT id,ticket_id,file FROM ticketevent");
while($queryResult && $ticketEvent = $queryResult->fetch_array(MYSQLI_ASSOC)) {
$id = $ticketEvent['id'];
$ticketId = $ticketEvent['ticket_id'];
$ticketQuery = $mysql->query("SELECT ticket_number FROM ticket WHERE id='$ticketId'") or die(PHP_EOL . "Error: could not find ticket id:$id" . PHP_EOL);
$ticketNumber = $ticketQuery->fetch_array()[0];
if(!$ticketEvent['file'] || $ticketEvent['file'][0] == 't') continue;
$updatedFileName = updateTicketFile($ticketNumber, $ticketEvent['file']);
$mysql->query("UPDATE ticketevent SET file='$updatedFileName' WHERE id='$id'")
or die (PHP_EOL . "Error: could not update file for ticketevent id:$id" . PHP_EOL);
}
print 'Update Completed!' . PHP_EOL;