[Web] Sync jobs can be created/viewed/edited by admins/domain admins; Various fixes or improvements
This commit is contained in:
parent
9be3aa3334
commit
66e06a0c0c
@ -122,7 +122,7 @@ $tfa_data = get_tfa();
|
||||
|
||||
<div role="tabpanel" class="tab-pane" id="tab-config">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 hidden-xs">
|
||||
<div id="sidebar-admin" class="col-sm-2 hidden-xs">
|
||||
<div id="scrollbox" class="list-group">
|
||||
<a href="#dkim" class="list-group-item"><?=$lang['admin']['dkim_keys'];?></a>
|
||||
<a href="#fwdhosts" class="list-group-item"><?=$lang['admin']['forwarding_hosts'];?></a>
|
||||
|
1332
data/web/edit.php
1332
data/web/edit.php
File diff suppressed because it is too large
Load Diff
@ -7,6 +7,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/footer.php';
|
||||
<script src="/js/bootstrap-slider.min.js"></script>
|
||||
<script src="/js/bootstrap-select.min.js"></script>
|
||||
<script src="/js/notifications.min.js"></script>
|
||||
<script src="/js/bootstrap-filestyle.min.js"></script>
|
||||
<script src="/js/u2f-api.js"></script>
|
||||
<script src="/js/api.js"></script>
|
||||
<script>
|
||||
|
@ -17,7 +17,12 @@ function fail2ban($_action, $_data = null) {
|
||||
foreach ($wl as $key => $value) {
|
||||
$tmp_data[] = $key;
|
||||
}
|
||||
$data['whitelist'] = implode(PHP_EOL, $tmp_data);
|
||||
if (isset($tmp_data)) {
|
||||
$data['whitelist'] = implode(PHP_EOL, $tmp_data);
|
||||
}
|
||||
else {
|
||||
$data['whitelist'] = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$data['whitelist'] = "";
|
||||
|
@ -78,14 +78,21 @@ function mailbox($_action, $_type, $_data = null) {
|
||||
$username = $_data['username'];
|
||||
}
|
||||
}
|
||||
else {
|
||||
elseif ($_SESSION['mailcow_cc_role'] == "user") {
|
||||
$username = $_SESSION['mailcow_cc_username'];
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'] = array(
|
||||
'type' => 'danger',
|
||||
'msg' => 'No user defined'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$active = intval($_data['active']);
|
||||
$delete2duplicates = intval($_data['delete2duplicates']);
|
||||
$delete1 = intval($_data['delete1']);
|
||||
$port1 = $_data['port1'];
|
||||
$host1 = $_data['host1'];
|
||||
$host1 = strtolower($_data['host1']);
|
||||
$password1 = $_data['password1'];
|
||||
$exclude = $_data['exclude'];
|
||||
$maxage = $_data['maxage'];
|
||||
@ -2060,7 +2067,11 @@ function mailbox($_action, $_type, $_data = null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
$stmt = $pdo->prepare("SELECT * FROM `imapsync` WHERE id = :id");
|
||||
$stmt = $pdo->prepare("SELECT *,
|
||||
CONCAT(LEFT(`password1`, 3), '...') AS `password1_short`,
|
||||
`active` AS `active_int`,
|
||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
||||
FROM `imapsync` WHERE id = :id");
|
||||
$stmt->execute(array(':id' => $_data));
|
||||
$syncjobdetails = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
}
|
||||
@ -2086,14 +2097,12 @@ function mailbox($_action, $_type, $_data = null) {
|
||||
$_data = $_SESSION['mailcow_cc_username'];
|
||||
}
|
||||
try {
|
||||
$stmt = $pdo->prepare("SELECT *,
|
||||
CONCAT(LEFT(`password1`, 3), '...') AS `password1_short`,
|
||||
`active` AS `active_int`,
|
||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
||||
FROM `imapsync`
|
||||
WHERE `user2` = :username");
|
||||
$stmt = $pdo->prepare("SELECT `id` FROM `imapsync` WHERE `user2` = :username");
|
||||
$stmt->execute(array(':username' => $_data));
|
||||
$syncjobdata = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
while($row = array_shift($rows)) {
|
||||
$syncjobdata[] = $row['id'];
|
||||
}
|
||||
}
|
||||
catch(PDOException $e) {
|
||||
$_SESSION['return'] = array(
|
||||
|
@ -15,7 +15,7 @@ elseif (isset($_SERVER['HTTPS'])) {
|
||||
else {
|
||||
$IS_HTTPS = false;
|
||||
}
|
||||
session_set_cookie_params($SESSION_LIFETIME, '/', '', $IS_HTTPS, true);
|
||||
// session_set_cookie_params($SESSION_LIFETIME, '/', '', $IS_HTTPS, true);
|
||||
session_start();
|
||||
if (!isset($_SESSION['CSRF']['TOKEN'])) {
|
||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||
@ -27,7 +27,7 @@ if (!isset($_SESSION['SESS_REMOTE_UA'])) {
|
||||
}
|
||||
|
||||
// Update session cookie
|
||||
setcookie(session_name() ,session_id(), time() + $SESSION_LIFETIME);
|
||||
// setcookie(session_name() ,session_id(), time() + $SESSION_LIFETIME);
|
||||
|
||||
// Check session
|
||||
function session_check() {
|
||||
|
@ -54,6 +54,7 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admi
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
if (isset($_POST["set_tfa"])) {
|
||||
set_tfa($_POST);
|
||||
|
@ -575,15 +575,19 @@ jQuery(function($){
|
||||
});
|
||||
|
||||
$(window).load(function(){
|
||||
width = $("#scrollbox").width();
|
||||
initial_width = $("#sidebar-admin").width();
|
||||
$("#scrollbox").css("width", initial_width);
|
||||
$(window).bind('scroll', function() {
|
||||
if ($(window).scrollTop() > 70) {
|
||||
$('#scrollbox').addClass('scrollboxFixed');
|
||||
$("#scrollbox").css("width", width);
|
||||
} else {
|
||||
width = $("#scrollbox").width();
|
||||
$('#scrollbox').removeClass('scrollboxFixed');
|
||||
$("#scrollbox").removeAttr("style");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(window).on('resize', function(){
|
||||
on_resize_width = $("#sidebar-admin").width();
|
||||
$("#scrollbox").removeAttr("style");
|
||||
$("#scrollbox").css("width", on_resize_width);
|
||||
});
|
||||
|
@ -141,6 +141,7 @@ $(document).ready(function() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// alert(JSON.stringify(api_attr));
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
dataType: "json",
|
||||
|
1
data/web/js/bootstrap-filestyle.min.js
vendored
Normal file
1
data/web/js/bootstrap-filestyle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -29,9 +29,35 @@ $(document).ready(function() {
|
||||
$('#password2').prop('type', 'text');
|
||||
$('#password2').val(random_passwd);
|
||||
});
|
||||
});
|
||||
|
||||
// Log modal
|
||||
$('#logModal').on('show.bs.modal', function(e) {
|
||||
var logText = $(e.relatedTarget).data('log-text');
|
||||
$(e.currentTarget).find('#logText').html('<pre style="background:none;font-size:11px;line-height:1.1;border:0px">' + logText + '</pre>');
|
||||
});
|
||||
});
|
||||
jQuery(function($){
|
||||
// http://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
||||
var entityMap = {
|
||||
'&': '&',
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'"': '"',
|
||||
"'": ''',
|
||||
'/': '/',
|
||||
'`': '`',
|
||||
'=': '='
|
||||
};
|
||||
function escapeHtml(string) {
|
||||
return String(string).replace(/[&<>"'`=\/]/g, function (s) {
|
||||
return entityMap[s];
|
||||
});
|
||||
}
|
||||
// http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
|
||||
function validateEmail(email) {
|
||||
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||
return re.test(email);
|
||||
}
|
||||
// Calculation human readable file sizes
|
||||
function humanFileSize(bytes) {
|
||||
if(Math.abs(bytes) < 1024) {
|
||||
@ -322,9 +348,55 @@ jQuery(function($){
|
||||
});
|
||||
}
|
||||
|
||||
function draw_sync_job_table() {
|
||||
ft_syncjob_table = FooTable.init('#sync_job_table', {
|
||||
"columns": [
|
||||
{"name":"chkbox","title":"","style":{"maxWidth":"40px","width":"40px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
|
||||
{"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
|
||||
{"name":"user2","title":lang.owner},
|
||||
{"name":"server_w_port","title":"Server","breakpoints":"xs"},
|
||||
{"name":"mins_interval","title":lang.mins_interval,"breakpoints":"all"},
|
||||
{"name":"last_run","title":lang.last_run,"breakpoints":"all"},
|
||||
{"name":"log","title":"Log"},
|
||||
{"name":"active","filterable": false,"style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
|
||||
{"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
|
||||
],
|
||||
"empty": lang.empty,
|
||||
"rows": $.ajax({
|
||||
dataType: 'json',
|
||||
url: '/api/v1/get/syncjobs/all',
|
||||
jsonp: false,
|
||||
error: function () {
|
||||
console.log('Cannot draw sync job table');
|
||||
},
|
||||
success: function (data) {
|
||||
$.each(data, function (i, item) {
|
||||
item.log = '<a href="#logModal" data-toggle="modal" data-log-text="' + escapeHtml(item.returned_text) + '">Open logs</a>'
|
||||
item.exclude = '<code>' + item.exclude + '</code>'
|
||||
item.server_w_port = item.user1 + '@' + item.host1 + ':' + item.port1;
|
||||
item.action = '<div class="btn-group">' +
|
||||
'<a href="/edit.php?syncjob=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||
'</div>';
|
||||
item.chkbox = '<input type="checkbox" data-id="syncjob" name="multi_select" value="' + item.id + '" />';
|
||||
});
|
||||
}
|
||||
}),
|
||||
"paging": {
|
||||
"enabled": true,
|
||||
"limit": 5,
|
||||
"size": pagination_size
|
||||
},
|
||||
"sorting": {
|
||||
"enabled": true
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
draw_domain_table();
|
||||
draw_mailbox_table();
|
||||
draw_resource_table();
|
||||
draw_alias_table();
|
||||
draw_aliasdomain_table();
|
||||
draw_sync_job_table();
|
||||
});
|
@ -2,8 +2,8 @@ $(document).ready(function() {
|
||||
|
||||
// Log modal
|
||||
$('#logModal').on('show.bs.modal', function(e) {
|
||||
var logText = $(e.relatedTarget).data('log-text');
|
||||
$(e.currentTarget).find('#logText').html('<pre style="background:none;font-size:11px;line-height:1.1;border:0px">' + logText + '</pre>');
|
||||
var logText = $(e.relatedTarget).data('log-text');
|
||||
$(e.currentTarget).find('#logText').html('<pre style="background:none;font-size:11px;line-height:1.1;border:0px">' + logText + '</pre>');
|
||||
});
|
||||
|
||||
});
|
||||
@ -73,7 +73,7 @@ jQuery(function($){
|
||||
ft_syncjob_table = FooTable.init('#sync_job_table', {
|
||||
"columns": [
|
||||
{"name":"chkbox","title":"","style":{"maxWidth":"40px","width":"40px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
|
||||
{"sorted": true,"name":"id","title":"ID"},
|
||||
{"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
|
||||
{"name":"server_w_port","title":"Server"},
|
||||
{"name":"enc1","title":lang.encryption},
|
||||
{"name":"user1","title":lang.username},
|
||||
@ -87,7 +87,7 @@ jQuery(function($){
|
||||
"empty": lang.empty,
|
||||
"rows": $.ajax({
|
||||
dataType: 'json',
|
||||
url: '/api/v1/get/syncjobs',
|
||||
url: '/api/v1/get/syncjobs/' + mailcow_cc_username,
|
||||
jsonp: false,
|
||||
error: function () {
|
||||
console.log('Cannot draw sync job table');
|
||||
@ -96,7 +96,7 @@ jQuery(function($){
|
||||
$.each(data, function (i, item) {
|
||||
item.log = '<a href="#logModal" data-toggle="modal" data-log-text="' + escapeHtml(item.returned_text) + '">Open logs</a>'
|
||||
item.exclude = '<code>' + item.exclude + '</code>'
|
||||
item.server_w_port = item.host1 + ':' + item.port1;
|
||||
item.server_w_port = item.user1 + '@' + item.host1 + ':' + item.port1;
|
||||
item.action = '<div class="btn-group">' +
|
||||
'<a href="/edit.php?syncjob=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||
|
@ -507,9 +507,35 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
|
||||
case "graph":
|
||||
switch ($extra) {
|
||||
case "hourly":
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=daily');
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=hourly');
|
||||
if (!empty($data)) {
|
||||
echo $data;
|
||||
$data_array = json_decode($data, true);
|
||||
$rejected['label'] = "reject";
|
||||
foreach ($data_array[0] as $dataset) {
|
||||
$rejected['data'][] = $dataset;
|
||||
}
|
||||
$temp_reject['label'] = "temp_reject";
|
||||
foreach ($data_array[1] as $dataset) {
|
||||
$temp_reject['data'][] = $dataset;
|
||||
}
|
||||
$add_header['label'] = "add_header";
|
||||
foreach ($data_array[2] as $dataset) {
|
||||
$add_header['data'][] = $dataset;
|
||||
}
|
||||
$prob_spam['label'] = "prob_spam";
|
||||
foreach ($data_array[3] as $dataset) {
|
||||
$prob_spam['data'][] = $dataset;
|
||||
}
|
||||
$greylist['label'] = "greylist";
|
||||
foreach ($data_array[4] as $dataset) {
|
||||
$greylist['data'][] = $dataset;
|
||||
}
|
||||
$clean['label'] = "clean";
|
||||
$clean['pointStyle'] = "cross";
|
||||
foreach ($data_array[5] as $dataset) {
|
||||
$clean['data'][] = $dataset;
|
||||
}
|
||||
echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
elseif (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
@ -518,25 +544,103 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
|
||||
case "daily":
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=daily');
|
||||
if (!empty($data)) {
|
||||
echo $data;
|
||||
$data_array = json_decode($data, true);
|
||||
$rejected['label'] = "reject";
|
||||
foreach ($data_array[0] as $dataset) {
|
||||
$rejected['data'][] = $dataset;
|
||||
}
|
||||
$temp_reject['label'] = "temp_reject";
|
||||
foreach ($data_array[1] as $dataset) {
|
||||
$temp_reject['data'][] = $dataset;
|
||||
}
|
||||
$add_header['label'] = "add_header";
|
||||
foreach ($data_array[2] as $dataset) {
|
||||
$add_header['data'][] = $dataset;
|
||||
}
|
||||
$prob_spam['label'] = "prob_spam";
|
||||
foreach ($data_array[3] as $dataset) {
|
||||
$prob_spam['data'][] = $dataset;
|
||||
}
|
||||
$greylist['label'] = "greylist";
|
||||
foreach ($data_array[4] as $dataset) {
|
||||
$greylist['data'][] = $dataset;
|
||||
}
|
||||
$clean['label'] = "clean";
|
||||
$clean['pointStyle'] = "cross";
|
||||
foreach ($data_array[5] as $dataset) {
|
||||
$clean['data'][] = $dataset;
|
||||
}
|
||||
echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
elseif (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
case "weekly":
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=daily');
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=weekly');
|
||||
if (!empty($data)) {
|
||||
echo $data;
|
||||
$data_array = json_decode($data, true);
|
||||
$rejected['label'] = "reject";
|
||||
foreach ($data_array[0] as $dataset) {
|
||||
$rejected['data'][] = $dataset;
|
||||
}
|
||||
$temp_reject['label'] = "temp_reject";
|
||||
foreach ($data_array[1] as $dataset) {
|
||||
$temp_reject['data'][] = $dataset;
|
||||
}
|
||||
$add_header['label'] = "add_header";
|
||||
foreach ($data_array[2] as $dataset) {
|
||||
$add_header['data'][] = $dataset;
|
||||
}
|
||||
$prob_spam['label'] = "prob_spam";
|
||||
foreach ($data_array[3] as $dataset) {
|
||||
$prob_spam['data'][] = $dataset;
|
||||
}
|
||||
$greylist['label'] = "greylist";
|
||||
foreach ($data_array[4] as $dataset) {
|
||||
$greylist['data'][] = $dataset;
|
||||
}
|
||||
$clean['label'] = "clean";
|
||||
$clean['pointStyle'] = "cross";
|
||||
foreach ($data_array[5] as $dataset) {
|
||||
$clean['data'][] = $dataset;
|
||||
}
|
||||
echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
elseif (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
case "monthly":
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=daily');
|
||||
$data = file_get_contents('http://rspamd-mailcow:11334/graph?type=monthly');
|
||||
if (!empty($data)) {
|
||||
echo $data;
|
||||
$data_array = json_decode($data, true);
|
||||
$rejected['label'] = "reject";
|
||||
foreach ($data_array[0] as $dataset) {
|
||||
$rejected['data'][] = $dataset;
|
||||
}
|
||||
$temp_reject['label'] = "temp_reject";
|
||||
foreach ($data_array[1] as $dataset) {
|
||||
$temp_reject['data'][] = $dataset;
|
||||
}
|
||||
$add_header['label'] = "add_header";
|
||||
foreach ($data_array[2] as $dataset) {
|
||||
$add_header['data'][] = $dataset;
|
||||
}
|
||||
$prob_spam['label'] = "prob_spam";
|
||||
foreach ($data_array[3] as $dataset) {
|
||||
$prob_spam['data'][] = $dataset;
|
||||
}
|
||||
$greylist['label'] = "greylist";
|
||||
foreach ($data_array[4] as $dataset) {
|
||||
$greylist['data'][] = $dataset;
|
||||
}
|
||||
$clean['label'] = "clean";
|
||||
$clean['pointStyle'] = "cross";
|
||||
foreach ($data_array[5] as $dataset) {
|
||||
$clean['data'][] = $dataset;
|
||||
}
|
||||
echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
elseif (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
@ -734,8 +838,51 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
|
||||
break;
|
||||
case "syncjobs":
|
||||
switch ($object) {
|
||||
case "all":
|
||||
$domains = mailbox('get', 'domains');
|
||||
if (!empty($domains)) {
|
||||
foreach ($domains as $domain) {
|
||||
$mailboxes = mailbox('get', 'mailboxes', $domain);
|
||||
if (!empty($mailboxes)) {
|
||||
foreach ($mailboxes as $mailbox) {
|
||||
$syncjobs = mailbox('get', 'syncjobs', $mailbox);
|
||||
if (!empty($syncjobs)) {
|
||||
foreach ($syncjobs as $syncjob) {
|
||||
if ($details = mailbox('get', 'syncjob_details', $syncjob)) {
|
||||
$data[] = $details;
|
||||
}
|
||||
else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
else {
|
||||
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
$data = mailbox('get', 'syncjobs', $object);
|
||||
$syncjobs = mailbox('get', 'syncjobs', $object);
|
||||
if (!empty($syncjobs)) {
|
||||
foreach ($syncjobs as $syncjob) {
|
||||
if ($details = mailbox('get', 'syncjob_details', $syncjob)) {
|
||||
$data[] = $details;
|
||||
}
|
||||
else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isset($data) || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
|
@ -261,6 +261,9 @@ $lang['mailbox']['toggle_all'] = 'Alle';
|
||||
$lang['mailbox']['quick_actions'] = 'Aktionen';
|
||||
$lang['mailbox']['activate'] = 'Aktivieren';
|
||||
$lang['mailbox']['deactivate'] = 'Deaktivieren';
|
||||
$lang['mailbox']['owner'] = 'Besitzer';
|
||||
$lang['mailbox']['mins_interval'] = 'Intervall (min)';
|
||||
$lang['mailbox']['last_run'] = 'Letzte Ausführung';
|
||||
|
||||
$lang['info']['no_action'] = 'Keine Aktion anwendbar';
|
||||
$lang['delete']['title'] = 'Objekt entfernen';
|
||||
|
@ -264,6 +264,9 @@ $lang['mailbox']['toggle_all'] = 'Toggle all';
|
||||
$lang['mailbox']['quick_actions'] = 'Actions';
|
||||
$lang['mailbox']['activate'] = 'Activate';
|
||||
$lang['mailbox']['deactivate'] = 'Deactivate';
|
||||
$lang['mailbox']['owner'] = 'Owner';
|
||||
$lang['mailbox']['mins_interval'] = 'Interval (min)';
|
||||
$lang['mailbox']['last_run'] = 'Last run';
|
||||
|
||||
$lang['info']['no_action'] = 'No action applicable';
|
||||
|
||||
|
@ -19,6 +19,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
<li role="presentation"><a href="#tab-domain-aliases" aria-controls="tab-domain-aliases" role="tab" data-toggle="tab"><?=$lang['mailbox']['domain_aliases'];?></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li role="presentation"><a href="#tab-syncjobs" aria-controls="tab-resources" role="tab" data-toggle="tab">Sync jobs</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="row">
|
||||
@ -147,6 +148,29 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div role="tabpanel" class="tab-pane" id="tab-syncjobs">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">Sync jobs</h3>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped" id="sync_job_table"></table>
|
||||
</div>
|
||||
<div class="mass-actions-mailbox">
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="syncjob" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
|
||||
<a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['mailbox']['quick_actions'];?> <span class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a id="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"1"}' href="#"><?=$lang['mailbox']['activate'];?></a></li>
|
||||
<li><a id="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"0"}' href="#"><?=$lang['mailbox']['deactivate'];?></a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a id="delete_selected" data-text="<?=$lang['user']['eas_reset'];?>?" data-id="syncjob" data-api-url='delete/syncjob' href="#"><?=$lang['mailbox']['remove'];?></a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-toggle="modal" data-target="#addSyncJobModalAdmin"><span class="glyphicon glyphicon-plus"></span> <?=$lang['user']['create_syncjob'];?></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div> <!-- /tab-content -->
|
||||
</div> <!-- /col-md-12 -->
|
||||
</div> <!-- /row -->
|
||||
|
@ -302,3 +302,131 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- add domain alias modal -->
|
||||
<!-- add sync job modal -->
|
||||
<div class="modal fade" id="addSyncJobModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
|
||||
<h3 class="modal-title"><?=$lang['add']['syncjob'];?></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p><?=$lang['add']['syncjob_hint'];?></p>
|
||||
<form class="form-horizontal" role="form" data-id="add_syncjob">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="username"><?=$lang['add']['username'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="addSelectUsername" name="username" id="username" required>
|
||||
<?php
|
||||
$domains = mailbox('get', 'domains');
|
||||
if (!empty($domains)) {
|
||||
foreach ($domains as $domain) {
|
||||
$mailboxes = mailbox('get', 'mailboxes', $domain);
|
||||
foreach ($mailboxes as $mailbox) {
|
||||
echo "<option>".htmlspecialchars($mailbox)."</option>";
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="host1"><?=$lang['add']['hostname'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="host1" id="host1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="port1"><?=$lang['add']['port'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="port1" id="port1" min="1" max="65535" value="143" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="user1"><?=$lang['add']['username'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="user1" id="user1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password1"><?=$lang['add']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password1" id="password1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="enc1"><?=$lang['add']['enc_method'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<select name="enc1" id="enc1" title="<?=$lang['add']['select'];?>" required>
|
||||
<option selected>TLS</option>
|
||||
<option>SSL</option>
|
||||
<option>PLAIN</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="mins_interval"><?=$lang['add']['mins_interval'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="mins_interval" min="10" max="3600" value="20" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="subfolder2"><?=$lang['edit']['subfolder2'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subfolder2" id="subfolder2" value="External">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="maxage"><?=$lang['edit']['maxage'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="maxage" id="maxage" min="0" max="32000" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="exclude"><?=$lang['add']['exclude'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="exclude" id="exclude" value="(?i)spam|(?i)junk">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" value="1" name="delete2duplicates" checked> <?=$lang['add']['delete2duplicates'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" value="1" name="delete1"> <?=$lang['add']['delete1'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" value="1" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-default" id="add_item" data-id="add_syncjob" data-api-url='add/syncjob' data-api-attr='{}' href="#"><?=$lang['admin']['add'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- add sync job modal -->
|
||||
<!-- log modal -->
|
||||
<div class="modal fade" id="logModal" tabindex="-1" role="dialog" aria-labelledby="logTextLabel">
|
||||
<div class="modal-dialog" style="width:90%" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<span id="logText"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- log modal -->
|
@ -104,3 +104,49 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- add sync job modal -->
|
||||
<!-- log modal -->
|
||||
<div class="modal fade" id="logModal" tabindex="-1" role="dialog" aria-labelledby="logTextLabel">
|
||||
<div class="modal-dialog" style="width:90%" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<span id="logText"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- log modal -->
|
||||
<!-- pw change modal -->
|
||||
<div class="modal fade" id="pwChangeModal" tabindex="-1" role="dialog" aria-labelledby="pwChangeModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" data-id="pwchange" role="form" method="post" autocomplete="off">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass"><?=$lang['user']['new_password'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass" id="user_new_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass2"><?=$lang['user']['new_password_repeat'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass2" id="user_new_pass2" autocomplete="off" required>
|
||||
<p class="help-block"><?=$lang['user']['new_password_description'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_old_pass"><?=$lang['user']['password_now'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_old_pass" id="user_old_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button class="btn btn-default" id="edit_selected" data-id="pwchange" data-item="null" data-api-url='edit/self' data-api-attr='{}' href="#"><?=$lang['user']['change_password'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- pw change modal -->
|
@ -51,7 +51,7 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'doma
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user') {
|
||||
@ -256,7 +256,7 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
|
||||
<button type="button" class="btn btn-sm btn-success" id="edit_selected"
|
||||
data-item="<?= $username; ?>"
|
||||
data-id="spam_score"
|
||||
data-api-url='edit/spam_score'
|
||||
data-api-url='edit/spam-score'
|
||||
data-api-attr='{}'><?=$lang['user']['save_changes'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
@ -331,65 +331,12 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /container -->
|
||||
<div style="margin-bottom:200px;"></div>
|
||||
<?php
|
||||
}
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
|
||||
/*
|
||||
/ USER OR DOMAIN ADMIN
|
||||
*/
|
||||
|
||||
?>
|
||||
<div class="modal fade" id="logModal" tabindex="-1" role="dialog" aria-labelledby="logTextLabel">
|
||||
<div class="modal-dialog" style="width:90%" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<span id="logText"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom:200px;"></div>
|
||||
<div class="modal fade" id="pwChangeModal" tabindex="-1" role="dialog" aria-labelledby="pwChangeModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" data-id="pwchange" role="form" method="post" autocomplete="off">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass"><?=$lang['user']['new_password'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass" id="user_new_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass2"><?=$lang['user']['new_password_repeat'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass2" id="user_new_pass2" autocomplete="off" required>
|
||||
<p class="help-block"><?=$lang['user']['new_password_description'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_old_pass"><?=$lang['user']['password_now'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_old_pass" id="user_old_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button class="btn btn-default" id="edit_selected" data-id="pwchange" data-item="null" data-api-url='edit/self' data-api-attr='{}' href="#"><?=$lang['user']['change_password'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_cc_role'])) {
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/user.php';
|
||||
?>
|
||||
<script type='text/javascript'>
|
||||
@ -397,6 +344,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/user.php';
|
||||
$lang_user = json_encode($lang['user']);
|
||||
echo "var lang = ". $lang_user . ";\n";
|
||||
echo "var csrf_token = '". $_SESSION['CSRF']['TOKEN'] . "';\n";
|
||||
echo "var mailcow_cc_username = '". $_SESSION['mailcow_cc_username'] . "';\n";
|
||||
echo "var pagination_size = '". $PAGINATION_SIZE . "';\n";
|
||||
?>
|
||||
</script>
|
||||
|
Loading…
Reference in New Issue
Block a user