diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index e8edb9940..f1d24fe7e 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -2150,7 +2150,7 @@ jQuery(function($){ var table = $('#sync_job_table').DataTable({ responsive: true, processing: true, - serverSide: false, + serverSide: true, stateSave: true, pageLength: pagination_size, dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" + @@ -2162,10 +2162,15 @@ jQuery(function($){ hideTableExpandCollapseBtn('#tab-syncjobs', '#sync_job_table'); }, ajax: { - type: "GET", - url: "/api/v1/get/syncjobs/all/no_log", + type: "POST", + url: "/api/v1/search/syncjob", + contentType: "application/json", + processData: false, + data: function(d) { + return JSON.stringify(d); + }, dataSrc: function(json){ - $.each(json, function (i, item) { + $.each(json.data, function (i, item) { item.log = '' + lang.open_logs + '' item.user2 = escapeHtml(item.user2); if (!item.exclude > 0) { @@ -2201,7 +2206,7 @@ jQuery(function($){ item.exit_status = item.success + ' ' + item.exit_status; }); - return json; + return json.data; } }, columns: [ @@ -2225,6 +2230,7 @@ jQuery(function($){ { title: 'ID', data: 'id', + searchable: false, responsivePriority: 3, defaultContent: '' }, @@ -2242,21 +2248,27 @@ jQuery(function($){ { title: lang.last_run, data: 'last_run', + searchable: false, defaultContent: '' }, { title: lang.syncjob_last_run_result, data: 'exit_status', + searchable: false, + orderable: false, defaultContent: '' }, { title: 'Log', data: 'log', + searchable: false, + orderable: false, defaultContent: '' }, { title: lang.active, data: 'active', + searchable: false, defaultContent: '', render: function (data, type) { return 1==data?'1':0==data&&'0'; @@ -2265,23 +2277,31 @@ jQuery(function($){ { title: lang.status, data: 'is_running', + searchable: false, + orderable: false, defaultContent: '' }, { title: lang.excludes, data: 'exclude', + searchable: false, + orderable: false, defaultContent: '', className: 'none' }, { title: lang.mins_interval, data: 'mins_interval', + searchable: false, + orderable: false, defaultContent: '', className: 'none' }, { title: lang.action, data: 'action', + searchable: false, + orderable: false, className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-text-right', responsivePriority: 5, defaultContent: '' diff --git a/data/web/json_api.php b/data/web/json_api.php index 687cbe078..27a7db659 100644 --- a/data/web/json_api.php +++ b/data/web/json_api.php @@ -1676,6 +1676,55 @@ if (isset($_GET['query'])) { process_search_return($data); break; + case "syncjob": + $table = ['imapsync', 'i']; + $primaryKey = 'id'; + $columns = [ + ['db' => 'id', 'dt' => 2], + ['db' => 'user2', 'dt' => 3], + ['db' => 'host1', 'dt' => 4, 'search' => ['where_column' => "CONCAT_WS(' ', `i`.`user1`, `i`.`host1`)"]], + ['db' => 'last_run', 'dt' => 5], + ['db' => 'active', 'dt' => 8], + ]; + + if ($_SESSION['mailcow_cc_role'] === 'admin') { + $data = SSP::simple($requestDecoded, $pdo, $table, $primaryKey, $columns); + } elseif ($_SESSION['mailcow_cc_role'] === 'domainadmin') { + $data = SSP::complex($requestDecoded, $pdo, $table, $primaryKey, $columns, + 'INNER JOIN `mailbox` AS `mb` ON `mb`.`username` = `i`.`user2` ' . + 'INNER JOIN `domain_admins` AS `da` ON `da`.`domain` = `mb`.`domain`', + [ + 'condition' => '`da`.`active` = 1 AND `da`.`username` = :username', + 'bindings' => ['username' => $_SESSION['mailcow_cc_username']] + ]); + } elseif ($_SESSION['mailcow_cc_role'] === 'user') { + $data = SSP::complex($requestDecoded, $pdo, $table, $primaryKey, $columns, null, + [ + 'condition' => '`i`.`user2` = :username', + 'bindings' => ['username' => $_SESSION['mailcow_cc_username']] + ]); + } else { + http_response_code(403); + echo json_encode(array( + 'type' => 'error', + 'msg' => 'Insufficient permissions' + )); + exit(); + } + + if (!empty($data['data'])) { + $syncjobData = []; + foreach ($data['data'] as $row) { + if ($details = mailbox('get', 'syncjob_details', $row[2], array('no_log'))) { + $syncjobData[] = $details; + } + } + $data['data'] = $syncjobData; + } + + process_search_return($data); + break; + default: http_response_code(404); echo json_encode(array(