diff --git a/.gitignore b/.gitignore index 70d3d8c3..ad0887cb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ admin/archive.php admin/custom_statuses.php admin/email_templates.php admin/generate_spam_question.php -admin/priority.php admin/test_connection.php attachments/index.htm cache/ @@ -198,52 +197,52 @@ inc/tabs/tabber-minimized.js inc/tabs/tabber.css inc/timer/hesk_timer.js inc/timer/index.htm -inc/tiny_mce/3.5.11/langs/en.js -inc/tiny_mce/3.5.11/license.txt -inc/tiny_mce/3.5.11/themes/advanced/about.htm -inc/tiny_mce/3.5.11/themes/advanced/anchor.htm -inc/tiny_mce/3.5.11/themes/advanced/charmap.htm -inc/tiny_mce/3.5.11/themes/advanced/color_picker.htm -inc/tiny_mce/3.5.11/themes/advanced/editor_template.js -inc/tiny_mce/3.5.11/themes/advanced/image.htm -inc/tiny_mce/3.5.11/themes/advanced/img/colorpicker.jpg -inc/tiny_mce/3.5.11/themes/advanced/img/flash.gif -inc/tiny_mce/3.5.11/themes/advanced/img/icons.gif -inc/tiny_mce/3.5.11/themes/advanced/img/iframe.gif -inc/tiny_mce/3.5.11/themes/advanced/img/pagebreak.gif -inc/tiny_mce/3.5.11/themes/advanced/img/quicktime.gif -inc/tiny_mce/3.5.11/themes/advanced/img/realmedia.gif -inc/tiny_mce/3.5.11/themes/advanced/img/shockwave.gif -inc/tiny_mce/3.5.11/themes/advanced/img/trans.gif -inc/tiny_mce/3.5.11/themes/advanced/img/video.gif -inc/tiny_mce/3.5.11/themes/advanced/img/windowsmedia.gif -inc/tiny_mce/3.5.11/themes/advanced/js/about.js -inc/tiny_mce/3.5.11/themes/advanced/js/anchor.js -inc/tiny_mce/3.5.11/themes/advanced/js/charmap.js -inc/tiny_mce/3.5.11/themes/advanced/js/color_picker.js -inc/tiny_mce/3.5.11/themes/advanced/js/image.js -inc/tiny_mce/3.5.11/themes/advanced/js/link.js -inc/tiny_mce/3.5.11/themes/advanced/js/source_editor.js -inc/tiny_mce/3.5.11/themes/advanced/langs/en.js -inc/tiny_mce/3.5.11/themes/advanced/langs/en_dlg.js -inc/tiny_mce/3.5.11/themes/advanced/link.htm -inc/tiny_mce/3.5.11/themes/advanced/shortcuts.htm -inc/tiny_mce/3.5.11/themes/advanced/skins/default/content.css -inc/tiny_mce/3.5.11/themes/advanced/skins/default/dialog.css -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/buttons.png -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/items.gif -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/menu_arrow.gif -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/menu_check.gif -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/progress.gif -inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/tabs.gif -inc/tiny_mce/3.5.11/themes/advanced/skins/default/ui.css -inc/tiny_mce/3.5.11/themes/advanced/source_editor.htm -inc/tiny_mce/3.5.11/tiny_mce.js -inc/tiny_mce/3.5.11/tiny_mce_popup.js -inc/tiny_mce/3.5.11/utils/editable_selects.js -inc/tiny_mce/3.5.11/utils/form_utils.js -inc/tiny_mce/3.5.11/utils/mctabs.js -inc/tiny_mce/3.5.11/utils/validate.js +inc/tiny_mce/3.5.12/langs/en.js +inc/tiny_mce/3.5.12/license.txt +inc/tiny_mce/3.5.12/themes/advanced/about.htm +inc/tiny_mce/3.5.12/themes/advanced/anchor.htm +inc/tiny_mce/3.5.12/themes/advanced/charmap.htm +inc/tiny_mce/3.5.12/themes/advanced/color_picker.htm +inc/tiny_mce/3.5.12/themes/advanced/editor_template.js +inc/tiny_mce/3.5.12/themes/advanced/image.htm +inc/tiny_mce/3.5.12/themes/advanced/img/colorpicker.jpg +inc/tiny_mce/3.5.12/themes/advanced/img/flash.gif +inc/tiny_mce/3.5.12/themes/advanced/img/icons.gif +inc/tiny_mce/3.5.12/themes/advanced/img/iframe.gif +inc/tiny_mce/3.5.12/themes/advanced/img/pagebreak.gif +inc/tiny_mce/3.5.12/themes/advanced/img/quicktime.gif +inc/tiny_mce/3.5.12/themes/advanced/img/realmedia.gif +inc/tiny_mce/3.5.12/themes/advanced/img/shockwave.gif +inc/tiny_mce/3.5.12/themes/advanced/img/trans.gif +inc/tiny_mce/3.5.12/themes/advanced/img/video.gif +inc/tiny_mce/3.5.12/themes/advanced/img/windowsmedia.gif +inc/tiny_mce/3.5.12/themes/advanced/js/about.js +inc/tiny_mce/3.5.12/themes/advanced/js/anchor.js +inc/tiny_mce/3.5.12/themes/advanced/js/charmap.js +inc/tiny_mce/3.5.12/themes/advanced/js/color_picker.js +inc/tiny_mce/3.5.12/themes/advanced/js/image.js +inc/tiny_mce/3.5.12/themes/advanced/js/link.js +inc/tiny_mce/3.5.12/themes/advanced/js/source_editor.js +inc/tiny_mce/3.5.12/themes/advanced/langs/en.js +inc/tiny_mce/3.5.12/themes/advanced/langs/en_dlg.js +inc/tiny_mce/3.5.12/themes/advanced/link.htm +inc/tiny_mce/3.5.12/themes/advanced/shortcuts.htm +inc/tiny_mce/3.5.12/themes/advanced/skins/default/content.css +inc/tiny_mce/3.5.12/themes/advanced/skins/default/dialog.css +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/buttons.png +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/items.gif +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/menu_arrow.gif +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/menu_check.gif +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/progress.gif +inc/tiny_mce/3.5.12/themes/advanced/skins/default/img/tabs.gif +inc/tiny_mce/3.5.12/themes/advanced/skins/default/ui.css +inc/tiny_mce/3.5.12/themes/advanced/source_editor.htm +inc/tiny_mce/3.5.12/tiny_mce.js +inc/tiny_mce/3.5.12/tiny_mce_popup.js +inc/tiny_mce/3.5.12/utils/editable_selects.js +inc/tiny_mce/3.5.12/utils/form_utils.js +inc/tiny_mce/3.5.12/utils/mctabs.js +inc/tiny_mce/3.5.12/utils/validate.js inc/treemenu/TreeMenu.php inc/treemenu/index.htm inc/zip/Zip.php diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05e2a432..8a47c6e9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,32 +1,90 @@ -image: tetraweb/php - stages: + - validate - test - - deploy + - package before_script: - - apt-get update - - apt-get install zip unzip - - cd api - - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - - php composer-setup.php - - php -r "unlink('composer-setup.php');" - - php composer.phar update + - bash ci/docker_install.sh > /dev/null -test: +validate:7.2: + image: php:7.2 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:7.1: + image: php:7.1 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:7.0: + image: php:7.0 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:5.6: + image: php:5.6 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:5.5: + image: php:5.5 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:5.4: + image: php:5.4 + stage: validate + script: + - bash ci/php_lint.sh ./ + +validate:5.3: + image: php:5.3 + stage: validate + script: + - bash ci/php_lint.sh ./ + +test:7.1: + image: php:7.1 stage: test script: - - composer install + - cd api + - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" + - php composer-setup.php + - php -r "unlink('composer-setup.php');" + - php composer.phar update + - php composer.phar install - cd Tests - phpunit -deploy: - when: manual - stage: deploy +test:7.2: + image: php:7.2 + stage: test script: + - cd api + - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" + - php composer-setup.php + - php -r "unlink('composer-setup.php');" + - php composer.phar update + - php composer.phar install + - cd Tests + - phpunit + +package: + image: tetraweb/php + when: manual + stage: package + script: + - apt-get update + - apt-get install zip unzip + - cd api - composer install --no-dev - cd ../ci - bash build_zip.sh artifacts: paths: - - release.zip \ No newline at end of file + - release.zip diff --git a/admin/admin_main.php b/admin/admin_main.php index 0d6dcefc..59898d18 100644 --- a/admin/admin_main.php +++ b/admin/admin_main.php @@ -54,7 +54,15 @@ else { ?>
- +

diff --git a/admin/admin_reply_ticket.php b/admin/admin_reply_ticket.php index 96ab9f9f..75d15d92 100644 --- a/admin/admin_reply_ticket.php +++ b/admin/admin_reply_ticket.php @@ -189,15 +189,20 @@ if ($hesk_settings['attachments']['use'] && !empty($attachments)) { // Add reply $html = $modsForHesk_settings['rich_text_for_tickets']; if ($submit_as_customer) { - hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "replies` (`replyto`,`name`,`message`,`dt`,`attachments`,`html`) VALUES ('" . intval($replyto) . "','" . hesk_dbEscape(addslashes($ticket['name'])) . "','" . hesk_dbEscape($message . "

{$hesklang['creb']} {$_SESSION['name']}") . "',NOW(),'" . hesk_dbEscape($myattachments) . "', '" . $html . "')"); + hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "replies` (`replyto`,`name`,`message`,`dt`,`attachments`,`html`) VALUES ('" . intval($replyto) . "','" . hesk_dbEscape(addslashes($ticket['name'])) . "','" . hesk_dbEscape($message . "

{$hesklang['creb']} {$_SESSION['name']}") . "', NOW(),'" . hesk_dbEscape($myattachments) . "', '" . $html . "')"); } else { - hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "replies` (`replyto`,`name`,`message`,`dt`,`attachments`,`staffid`,`html`) VALUES ('" . intval($replyto) . "','" . hesk_dbEscape(addslashes($_SESSION['name'])) . "','" . hesk_dbEscape($message) . "',NOW(),'" . hesk_dbEscape($myattachments) . "','" . intval($_SESSION['id']) . "', '" . $html . "')"); + hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "replies` (`replyto`,`name`,`message`,`dt`,`attachments`,`staffid`,`html`) VALUES ('" . intval($replyto) . "','" . hesk_dbEscape(addslashes($_SESSION['name'])) . "','" . hesk_dbEscape($message) . "', NOW(),'" . hesk_dbEscape($myattachments) . "','" . intval($_SESSION['id']) . "', '" . $html . "')"); } /* Track ticket status changes for history */ $revision = ''; /* Change the status of priority? */ +$audit_priority = null; +$audit_closed = null; +$audit_status = null; +$audit_customer_status = null; +$audit_assigned_self = null; if (!empty($_POST['set_priority'])) { $priority = intval(hesk_POST('priority')); if ($priority < 0 || $priority > 3) { @@ -211,9 +216,17 @@ if (!empty($_POST['set_priority'])) { 3 => $hesklang['low'] ); - $revision = sprintf($hesklang['thist8'], hesk_date(), $options[$priority], $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); + $plain_options = array( + 0 => 'critical', + 1 => 'high', + 2 => 'medium', + 3 => 'low' + ); - $priority_sql = ",`priority`='$priority', `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; + $priority_sql = ",`priority`='$priority' "; + + $audit_priority = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')', + 1 => $plain_options[$priority]); } else { $priority_sql = ""; } @@ -238,8 +251,11 @@ if ($ticket['locked']) { $newStatus = hesk_dbFetchAssoc($newStatusRs); if ($newStatus['IsClosed'] && hesk_checkPermission('can_resolve', 0)) { - $revision = sprintf($hesklang['thist3'], hesk_date(), $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $sql_status = " , `closedat`=NOW(), `closedby`=" . intval($_SESSION['id']) . ", `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; + $audit_closed = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); + $audit_status = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')', + 1 => mfh_getDisplayTextForStatusId($new_status) + ); + $sql_status = " , `closedat`=NOW(), `closedby`=" . intval($_SESSION['id']) . " "; // Lock the ticket if customers are not allowed to reopen tickets if ($hesk_settings['custopen'] != 1) { @@ -247,8 +263,8 @@ if ($ticket['locked']) { } } else { // Ticket isn't being closed, just add the history to the sql query (or tried to close but doesn't have permission) - $revision = sprintf($hesklang['thist9'], hesk_date(), $hesklang[$newStatus['Key']], $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $sql_status = " , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; + $audit_status = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')', + 1 => mfh_getDisplayTextForStatusId($new_status)); } } } // -> Submit as Customer reply @@ -259,8 +275,8 @@ elseif ($submit_as_customer) { $new_status = $customerReplyStatus['ID']; if ($ticket['status'] != $new_status) { - $revision = sprintf($hesklang['thist9'], hesk_date(), $hesklang['wait_reply'], $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $sql_status = " , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; + $audit_customer_status = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')', + 1 => mfh_getDisplayTextForStatusId($new_status)); } } // -> Default: submit as "Replied by staff" else { @@ -278,12 +294,21 @@ $sql .= $submit_as_customer ? "`lastreplier`='0', `replierid`='0' " : "`lastrepl if ($time_worked == '00:00:00') { $sql .= ", `lastchange` = NOW() "; } else { + $parts = explode(':', $ticket['time_worked']); + $seconds = ($parts[0] * 3600) + ($parts[1] * 60) + $parts[2]; + + $parts = explode(':', $time_worked); + $seconds += ($parts[0] * 3600) + ($parts[1] * 60) + $parts[2]; + + require(HESK_PATH . 'inc/reporting_functions.inc.php'); + $ticket['time_worked'] = hesk_SecondsToHHMMSS($seconds); + $sql .= ",`time_worked` = ADDTIME(`time_worked`,'" . hesk_dbEscape($time_worked) . "') "; } if (!empty($_POST['assign_self']) && (hesk_checkPermission('can_assign_self', 0) || (isset($_REQUEST['isManager']) && $_REQUEST['isManager']))) { - $revision = sprintf($hesklang['thist2'], hesk_date(), $_SESSION['name'] . ' (' . $_SESSION['user'] . ')', $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $sql .= " , `owner`=" . intval($_SESSION['id']) . ", `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; + $audit_assigned_self = array(0 => $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); + $sql .= " , `owner`=" . intval($_SESSION['id']) . " "; } $sql .= " $priority_sql "; @@ -306,6 +331,29 @@ unset($sql); /* Update number of replies in the users table */ hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` SET `replies`=`replies`+1 WHERE `id`='" . intval($_SESSION['id']) . "'"); +//-- Insert necessary audit trail records +if ($audit_priority != null) { + mfh_insert_audit_trail_record($replyto, 'TICKET', 'audit_priority', hesk_date(), $audit_priority); +} + +if ($audit_closed != null) { + mfh_insert_audit_trail_record($replyto, 'TICKET', 'audit_closed', hesk_date(), $audit_closed); +} + +if ($audit_status != null) { + mfh_insert_audit_trail_record($replyto, 'TICKET', 'audit_status', hesk_date(), $audit_status); +} + +if ($audit_customer_status != null) { + mfh_insert_audit_trail_record($replyto, 'TICKET', 'audit_status', hesk_date(), + $audit_customer_status); +} + +if ($audit_assigned_self != null) { + mfh_insert_audit_trail_record($replyto, 'TICKET', 'audit_assigned_self', hesk_date(), $audit_assigned_self); +} + + // --> Prepare reply message // 1. Generate the array with ticket info that can be used in emails @@ -324,7 +372,9 @@ $info = array( 'dt' => hesk_date($ticket['dt'], true), 'lastchange' => hesk_date($ticket['lastchange'], true), 'id' => $ticket['id'], - 'language' => $ticket['language'] + 'language' => $ticket['language'], + 'time_worked' => $ticket['time_worked'], + 'last_reply_by' => ($submit_as_customer ? $ticket['name'] : $_SESSION['name']), ); // 2. Add custom fields to the array diff --git a/admin/admin_settings.php b/admin/admin_settings.php index 1e96c3d6..004cfc2e 100644 --- a/admin/admin_settings.php +++ b/admin/admin_settings.php @@ -93,19 +93,20 @@ if ($hesk_settings['attachments']['use'] && !defined('HESK_DEMO')) { $tmp = @ini_get('upload_max_filesize'); if ($tmp) { $last = strtoupper(substr($tmp, -1)); + $number = substr($tmp, 0, -1); switch ($last) { case 'K': - $tmp = $tmp * 1024; + $tmp = $number * 1024; break; case 'M': - $tmp = $tmp * 1048576; + $tmp = $number * 1048576; break; case 'G': - $tmp = $tmp * 1073741824; + $tmp = $number * 1073741824; break; default: - $tmp = $tmp; + $tmp = $number; } if ($tmp < $hesk_settings['attachments']['max_size']) { @@ -117,19 +118,20 @@ if ($hesk_settings['attachments']['use'] && !defined('HESK_DEMO')) { $tmp = @ini_get('post_max_size'); if ($tmp) { $last = strtoupper(substr($tmp, -1)); + $number = substr($tmp, 0, -1); switch ($last) { case 'K': - $tmp = $tmp * 1024; + $tmp = $number * 1024; break; case 'M': - $tmp = $tmp * 1048576; + $tmp = $number * 1048576; break; case 'G': - $tmp = $tmp * 1073741824; + $tmp = $number * 1073741824; break; default: - $tmp = $tmp; + $tmp = $number; } if ($tmp < ($hesk_settings['attachments']['max_size'] * $hesk_settings['attachments']['max_number'] + 524288)) { @@ -355,86 +357,121 @@ $modsForHesk_settings = mfh_getSettings(); : - - + - ' . $hesklang['hud'] . ' '; - } elseif ($latest != -1) { - // Is this a beta/dev version? - if (strpos($hesk_settings['hesk_version'], 'beta') || strpos($hesk_settings['hesk_version'], 'dev') || strpos($hesk_settings['hesk_version'], 'RC')) { - echo ' ' . $hesklang['beta'] . ' '; ?> ' . $hesklang['hnw'] . ' '; ?> - - + - + + + + + + + + + - + target="_blank"> + : - - + - ' . $hesklang['beta'] . ' '; ?> ' . $hesklang['mfh_up_to_date'] . ''; - } else { - ?> - - - + - + + + + + + + + - - + + @@ -2195,6 +2232,106 @@ $modsForHesk_settings = mfh_getSettings();

+
+ +
+

+

'; ?> +
+
+

+ + +

+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
@@ -3247,6 +3384,27 @@ $modsForHesk_settings = mfh_getSettings(); +
+ +
+
+ +
+
+
'; @@ -510,8 +520,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
- -
+ '; + if (!empty($v['mfh_description'])) { + echo '
' . $v['mfh_description'] . '
'; + } + echo '
'; break; @@ -530,8 +543,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
- -
+ '; + if (!empty($v['mfh_description'])) { + echo '
' . $v['mfh_description'] . '
'; + } + echo '
'; break; @@ -546,8 +562,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
- -
+ '; + if (!empty($v['mfh_description'])) { + echo '
' . $v['mfh_description'] . '
'; + } + echo '
@@ -558,9 +577,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); case 'hidden': case 'readonly': default: - if (strlen($k_value) != 0) { - $v['value']['default_value'] = $k_value; - } + $k_value = hesk_msgToPlain($k_value,0,0); $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; @@ -568,8 +585,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
- -
+ '; + if (!empty($v['mfh_description'])) { + echo '
' . $v['mfh_description'] . '
'; + } + echo '
'; @@ -624,16 +644,20 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); } ?> -
- - - - - - - +
+
+ + +
+ + +
+ + + +
diff --git a/admin/export.php b/admin/export.php index 1e4e543e..af02e349 100644 --- a/admin/export.php +++ b/admin/export.php @@ -291,7 +291,7 @@ $orderBy = $modsForHesk_settings['category_order_column']; $res2 = hesk_dbQuery("SELECT `id`, `name` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "categories` WHERE " . hesk_myCategories('id') . " ORDER BY `" . $orderBy . "` ASC"); while ($row = hesk_dbFetchAssoc($res2)) { $my_cat[$row['id']] = hesk_msgToPlain($row['name'], 1); - $row['name'] = (strlen($row['name']) > 50) ? substr($row['name'], 0, 50) . '...' : $row['name']; + $row['name'] = (hesk_mb_strlen($row['name']) > 50) ? hesk_mb_substr($row['name'],0,50) . '...' : $row['name']; $cat_selected = ($row['id'] == $category) ? 'selected="selected"' : ''; $category_options .= ''; } @@ -697,7 +697,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); () diff --git a/admin/find_tickets.php b/admin/find_tickets.php index c9bcd812..350bb27b 100644 --- a/admin/find_tickets.php +++ b/admin/find_tickets.php @@ -145,21 +145,21 @@ LEFT(`message`, 400) AS `message`, $sql .= " ( `trackid` = '" . hesk_dbEscape($q) . "' OR `merged` LIKE '%#" . hesk_dbEscape($q) . "#%' ) "; break; case 'name': - $sql .= "`name` LIKE '%" . hesk_dbEscape($q) . "%' COLLATE '" . hesk_dbCollate() . "' "; + $sql .= "`name` LIKE '%".hesk_dbEscape( hesk_dbLike($q) )."%' COLLATE '" . hesk_dbCollate() . "' "; break; case 'email': $sql .= "`email` LIKE '%" . hesk_dbEscape($q) . "%' "; break; case 'subject': - $sql .= "`subject` LIKE '%" . hesk_dbEscape($q) . "%' COLLATE '" . hesk_dbCollate() . "' "; + $sql .= "`subject` LIKE '%".hesk_dbEscape( hesk_dbLike($q) )."%' COLLATE '" . hesk_dbCollate() . "' "; break; case 'message': - $sql .= " ( `message` LIKE '%" . hesk_dbEscape($q) . "%' COLLATE '" . hesk_dbCollate() . "' + $sql .= " ( `message` LIKE '%".hesk_dbEscape( hesk_dbLike($q) )."%' COLLATE '" . hesk_dbCollate() . "' OR `id` IN ( SELECT DISTINCT `replyto` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "replies` - WHERE `message` LIKE '%" . hesk_dbEscape($q) . "%' COLLATE '" . hesk_dbCollate() . "' ) + WHERE `message` LIKE '%".hesk_dbEscape( hesk_dbLike($q) )."%' COLLATE '" . hesk_dbCollate() . "' ) ) "; break; @@ -170,7 +170,7 @@ LEFT(`message`, 400) AS `message`, $sql .= "`id` IN ( SELECT DISTINCT `ticket` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "notes` - WHERE `message` LIKE '%" . hesk_dbEscape($q) . "%' COLLATE '" . hesk_dbCollate() . "' ) + WHERE `message` LIKE '%".hesk_dbEscape( hesk_dbLike($q) )."%' COLLATE '" . hesk_dbCollate() . "' ) "; break; default: @@ -220,6 +220,9 @@ LEFT(`message`, 400) AS `message`, $sql_count .= $sql; $sql = $sql_final . $sql; + // Strip extra slashes + $q = stripslashes($q); + /* Prepare variables used in search and forms */ require_once(HESK_PATH . 'inc/prepare_ticket_search.inc.php'); ?> diff --git a/admin/index.php b/admin/index.php index cef05749..c5e5695e 100644 --- a/admin/index.php +++ b/admin/index.php @@ -158,7 +158,7 @@ function do_login() exit(); } - $pass_enc = hesk_Pass2Hash($_SESSION['pass'] . strtolower($user) . $_SESSION['pass']); + $pass_enc = hesk_Pass2Hash($_SESSION['pass'].hesk_mb_strtolower($user).$_SESSION['pass']); /* Check if default password */ if ($_SESSION['pass'] == '499d74967b28a841c98bb4baaabaad699ff3c079') { @@ -202,7 +202,6 @@ function do_login() /* Close any old tickets here so Cron jobs aren't necessary */ if ($hesk_settings['autoclose']) { - $revision = sprintf($hesklang['thist3'], hesk_date(), $hesklang['auto']); $dt = date('Y-m-d H:i:s', time() - $hesk_settings['autoclose'] * 86400); @@ -210,22 +209,25 @@ function do_login() $closedStatus = hesk_dbFetchAssoc($closedStatusRs); // Are we allowed to close tickets in this status? if ($closedStatus['Closable'] == 'yes' || $closedStatus['Closable'] == 'sonly') { - // Notify customer of closed ticket? - if ($hesk_settings['notify_closed']) { - // Get list of tickets - $result = hesk_dbQuery("SELECT * FROM `" . $hesk_settings['db_pfix'] . "tickets` WHERE `status` = " . $closedStatus['ID'] . " AND `lastchange` <= '" . hesk_dbEscape($dt) . "' "); - if (hesk_dbNumRows($result) > 0) { - global $ticket; - // Load required functions? - if (!function_exists('hesk_notifyCustomer')) { - require(HESK_PATH . 'inc/email_functions.inc.php'); - } + $result = hesk_dbQuery("SELECT * FROM `" . $hesk_settings['db_pfix'] . "tickets` WHERE `status` = " . $closedStatus['ID'] . " AND `lastchange` <= '" . hesk_dbEscape($dt) . "' "); + if (hesk_dbNumRows($result) > 0) { + global $ticket; - while ($ticket = hesk_dbFetchAssoc($result)) { - $ticket['dt'] = hesk_date($ticket['dt'], true); - $ticket['lastchange'] = hesk_date($ticket['lastchange'], true); - $ticket = hesk_ticketToPlain($ticket, 1, 0); + // Load required functions? + if (!function_exists('hesk_notifyCustomer')) { + require(HESK_PATH . 'inc/email_functions.inc.php'); + } + + while ($ticket = hesk_dbFetchAssoc($result)) { + $ticket['dt'] = hesk_date($ticket['dt'], true); + $ticket['lastchange'] = hesk_date($ticket['lastchange'], true); + $ticket = hesk_ticketToPlain($ticket, 1, 0); + mfh_insert_audit_trail_record($ticket['id'], 'TICKET', 'audit_automatically_closed', hesk_date(), array()); + + // Notify customer of closed ticket? + if ($hesk_settings['notify_closed']) { + // Get list of tickets hesk_notifyCustomer($modsForHesk_settings, 'ticket_closed'); } } @@ -234,7 +236,7 @@ function do_login() // Update ticket statuses and history in database if we're allowed to do so $defaultCloseRs = hesk_dbQuery('SELECT `ID` FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'statuses` WHERE `IsAutocloseOption` = 1'); $defaultCloseStatus = hesk_dbFetchAssoc($defaultCloseRs); - hesk_dbQuery("UPDATE `" . $hesk_settings['db_pfix'] . "tickets` SET `status`=" . intval($defaultCloseStatus['ID']) . ", `closedat`=NOW(), `closedby`='-1', `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') WHERE `status` = '" . $closedStatus['ID'] . "' AND `lastchange` <= '" . hesk_dbEscape($dt) . "' "); + hesk_dbQuery("UPDATE `" . $hesk_settings['db_pfix'] . "tickets` SET `status`=" . intval($defaultCloseStatus['ID']) . ", `closedat`=NOW(), `closedby`='-1' WHERE `status` = " . $closedStatus['ID'] . " AND `lastchange` <= '" . hesk_dbEscape($dt) . "' "); } } @@ -276,6 +278,12 @@ function print_login() - -
- - -
- - -
-
-
- -
- -
-
-
-
- -
- -
-
-
- -
-
- -
    -
- -
-
-
-
- -
- -
-
-
- - -
- -
-
-
- -
- -
-
-
-
-
- - - -
-
- - - -
-
-

- -

-
- -
-
-
- - - - - - - - - - - - - +
' - ', - 1 => '', - 2 => '  ' - ); - - while ($mycat = hesk_dbFetchAssoc($res)) { - $j++; - - if (isset($_SESSION['selcat2']) && $mycat['id'] == $_SESSION['selcat2']) { - $color = 'admin_green'; - unset($_SESSION['selcat2']); - } else { - $color = $i ? 'admin_white' : 'admin_gray'; - } - - $tmp = $i ? 'White' : 'Blue'; - $style = 'background: ' . $mycat['background_color']; - $backgroundVolatile = 'background-volatile'; - if ($mycat['foreground_color'] != 'AUTO') { - $style .= '; color: ' . $mycat['foreground_color']; - $backgroundVolatile = ''; - - if ($mycat['display_border_outline']) { - $style .= '; border: solid 1px ' . $mycat['foreground_color']; - } - } - - if ($mycat['foreground_color'] == 'AUTO') { - $mycat['foreground_color'] = ''; - } - - $i = $i ? 0 : 1; - - /* Number of tickets and graph width */ - $all = isset($tickets_all[$mycat['id']]) ? $tickets_all[$mycat['id']] : 0; - $width_all = 0; - if ($tickets_total && $all) { - $width_all = round(($all / $tickets_total) * 100); - } - - /* Deleting category with ID 1 (default category) is not allowed */ - if ($mycat['id'] == 1) { - $remove_code = ' '; - } else { - $remove_code = ' '; - } - - /* Is category private or public? */ - if ($mycat['type']) { - $type_code = ''; - } else { - $type_code = ''; - } - - /* Is auto assign enabled? */ - if ($hesk_settings['autoassign']) { - if ($mycat['autoassign']) { - $autoassign_code = ''; - } else { - $autoassign_code = ''; - } - } else { - $autoassign_code = ''; - } - - echo ' -
- - - - - - - - - - '; - - } // End while - ?> -
' . $mycat['id'] . '' . $mycat['name'] . '' . $priorities[$mycat['priority']]['formatted'] . '' . $all . ' -
-
-
-
-
' . $usage[$mycat['usage']] . '' . get_manager($mycat['manager'], $users) . ' - - ' . $autoassign_code . ' - ' . $type_code . ' '; - - if ($orderBy != 'name' && $num > 1) { - if ($j == 1) { - echo '  '; - } elseif ($j == $num) { - echo ' '; - } else { - echo ' - -   - '; - } - } - echo ''; - echo $remove_code . '
+
+
+ +
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
- - + - -