diff --git a/admin/view_message_log.php b/admin/view_message_log.php new file mode 100644 index 00000000..66fce341 --- /dev/null +++ b/admin/view_message_log.php @@ -0,0 +1,98 @@ +'); + +/* Print header */ +require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); + +/* Print main manage users page */ +require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); +?> + +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + +
+
+
+
+
+ +' . $hesklang['manage_statuses'] . ''; } + if (hesk_checkPermission('can_view_logs', 0)) { + $tools_count++; + $dropdown_items .= '
  • ' . $hesklang['view_message_log'] . '
  • '; + } $dropdown_items .= ''; if ($tools_count > 1) { @@ -224,6 +228,12 @@ if (hesk_check_kb_only(false)) { $active = ' class="active"'; } echo ' ' . $hesklang['tools'] . ''; + } elseif (hesk_checkPermission('can_view_logs', 0)) { + $active = ''; + if (defined('PAGE_TITLE') && PAGE_TITLE == 'ADMIN_TOOLS') { + $active = ' class="active"'; + } + echo ' ' . $hesklang['tools'] . ''; } } if (hesk_checkPermission('can_man_settings', 0)) { diff --git a/install/mods-for-hesk/sql/installSql.php b/install/mods-for-hesk/sql/installSql.php index 7483550e..73d0d42b 100644 --- a/install/mods-for-hesk/sql/installSql.php +++ b/install/mods-for-hesk/sql/installSql.php @@ -702,6 +702,13 @@ function execute260Scripts() hesk_dbConnect(); executeQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` (`Key`, `Value`) VALUES ('public_api', '1')"); + executeQuery("CREATE TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "logging` ( + `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + `username` VARCHAR(200), + `message` MEDIUMTEXT NOT NULL, + `severity` INT NOT NULL, + `location` MEDIUMTEXT, + `timestamp` TIMESTAMP NOT NULL) ENGINE = MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"); executeQuery("CREATE TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "user_api_tokens` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, diff --git a/internal-api/admin/message-log/index.php b/internal-api/admin/message-log/index.php new file mode 100644 index 00000000..e5f5bff1 --- /dev/null +++ b/internal-api/admin/message-log/index.php @@ -0,0 +1,24 @@ += '" . hesk_dbEscape($from_date) . " 00:00:00' "; + } + $to_date_format = preg_match("/\d{4}-\d{2}-\d{2}/", $to_date); + if ($to_date != NULL + && $to_date_format === 1) { + $sql .= "AND `timestamp` <= '" . hesk_dbEscape($to_date) . " 23:59:59' "; + } + if ($severity_id != NULL) { + $sql .= "AND `severity` = " . intval($severity_id); + } + + $rs = hesk_dbQuery($sql); + + $results = []; + while ($row = hesk_dbFetchAssoc($rs)) { + $row['timestamp'] = hesk_date($row['timestamp'], true); + $results[] = $row; + } + + return $results; +} \ No newline at end of file diff --git a/internal-api/js/view-message-log.js b/internal-api/js/view-message-log.js new file mode 100644 index 00000000..c95f484a --- /dev/null +++ b/internal-api/js/view-message-log.js @@ -0,0 +1,72 @@ +$(document).ready(function() { + // We should show the latest 50 logs when the user first views the page. + searchLogs(null, null, null, null); + + $('#search-button').click(function() { + var location = getNullableField($('input[name="location"]').val()); + var dateFrom = getNullableField($('input[name="from-date"]').val()); + var dateTo = getNullableField($('input[name="to-date"]').val()); + var severity = $('select[name="severity"]').val(); + if (severity == -1) { + severity = null; + } + + searchLogs(location, dateFrom, dateTo, severity); + }); +}); + +function getNullableField(value) { + return value !== "" ? value : null; +} + +function searchLogs(location, fromDate, toDate, severity) { + var endpoint = getHelpdeskUrl(); + endpoint += '/internal-api/admin/message-log/'; + + $.ajax({ + url: endpoint, + data: { + location: location, + fromDate: fromDate, + toDate: toDate, + severityId: severity + }, + method: 'POST', + success: displayResults, + error: function(data) { + console.error(data); + } + }); +} + +function displayResults(data) { + data = $.parseJSON(data); + var table = $('#results-table > tbody'); + table.empty(); + + if (data.length === 0) { + table.append('No results found'); + } else { + for (var index in data) { + var result = data[index]; + table.append('' + + '' + result.timestamp + '' + + '' + result.username + '' + + '' + result.location + '' + + '' + result.message + ''); + } + } +} + +function getRowColor(result) { + switch (result.severity) { + case "1": + return 'class="info"'; + case "2": + return 'class="warning"'; + case "3": + return 'class="danger"'; + } + + return ''; +} \ No newline at end of file diff --git a/language/en/text.php b/language/en/text.php index 62ac627a..4b041e7e 100644 --- a/language/en/text.php +++ b/language/en/text.php @@ -21,6 +21,18 @@ $hesklang['_COLLATE']='utf8_unicode_ci'; // This is the email break line that will be used in email piping $hesklang['EMAIL_HR']='------ Reply above this line ------'; +// ADDED OR MODIFIED IN Mods for HESK 2.6.0 +$hesklang['search_logs'] = 'Search Logs'; +$hesklang['date_logged'] = 'Date Logged'; +$hesklang['from_date'] = 'From Date'; +$hesklang['to_date'] = 'To Date'; +$hesklang['severity'] = 'Severity'; +$hesklang['debug'] = 'Debug'; +$hesklang['warning_title_case'] = 'Warning'; +$hesklang['logs'] = 'Logs'; +$hesklang['view_message_log'] = 'View Message Log'; +$hesklang['can_view_logs'] = 'Can view message logs'; + // ADDED OR MODIFIED IN Mods for HESK 2.5.2 $hesklang['manage_statuses'] = 'Manage Statuses'; $hesklang['manage_service_messages'] = 'Manage Service Messages';