@@ -37,4 +37,18 @@ $DEFAULT_THEME = "lumen";
|
|||||||
|
|
||||||
// Password complexity as regular expression
|
// Password complexity as regular expression
|
||||||
$PASSWD_REGEP = '.{4,}';
|
$PASSWD_REGEP = '.{4,}';
|
||||||
|
|
||||||
|
// mailcow Apps - buttons on login screen
|
||||||
|
$MAILCOW_APPS = array(
|
||||||
|
array(
|
||||||
|
'name' => 'SOGo',
|
||||||
|
'link' => '/SOGo/'
|
||||||
|
),
|
||||||
|
// array(
|
||||||
|
// 'name' => 'Roundcube',
|
||||||
|
// 'link' => '/rc/'
|
||||||
|
// ),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
+5
-1
@@ -63,7 +63,11 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
|||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<legend>mailcow Apps</legend>
|
<legend>mailcow Apps</legend>
|
||||||
<a href="/SOGo/" role="button" class="btn btn-lg btn-default"><?=$lang['start']['start_sogo'];?></a>
|
<?php
|
||||||
|
foreach ($MAILCOW_APPS as $app) {
|
||||||
|
echo '<a href="' . $app['link'] . '" role="button" class="btn btn-lg btn-default">' . $app['name'] . '</a> ';
|
||||||
|
}
|
||||||
|
?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+28
-12
@@ -27,10 +27,17 @@ $(document).ready(function() {
|
|||||||
item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain;
|
item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain;
|
||||||
item.quota = humanFileSize(item.quota_used_in_domain) + " / " + humanFileSize(item.max_quota_for_domain);
|
item.quota = humanFileSize(item.quota_used_in_domain) + " / " + humanFileSize(item.max_quota_for_domain);
|
||||||
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
|
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
|
||||||
|
if (role == "admin") {
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?domain=' + item.domain_name + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?domain=' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="/delete.php?domain=' + item.domain_name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="/delete.php?domain=' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.action = '<div class="btn-group">' +
|
||||||
|
'<a href="/edit.php?domain=' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
$('#domain_table').footable({
|
$('#domain_table').footable({
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -73,10 +80,19 @@ $(document).ready(function() {
|
|||||||
$.each(data, function (i, item) {
|
$.each(data, function (i, item) {
|
||||||
item.quota = humanFileSize(item.quota_used) + " / " + humanFileSize(item.quota);
|
item.quota = humanFileSize(item.quota_used) + " / " + humanFileSize(item.quota);
|
||||||
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
|
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
|
||||||
|
if (role == "admin") {
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?mailbox=' + item.username + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="/delete.php?mailbox=' + item.username + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="/delete.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
|
'<a href="/index.php?duallogin=' + encodeURI(item.username) + '" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.action = '<div class="btn-group">' +
|
||||||
|
'<a href="/edit.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
|
'<a href="/delete.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
item.in_use = '<div class="progress">' +
|
item.in_use = '<div class="progress">' +
|
||||||
'<div class="progress-bar progress-bar-' + item.percent_class + ' role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
|
'<div class="progress-bar progress-bar-' + item.percent_class + ' role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
|
||||||
'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>';
|
'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>';
|
||||||
@@ -90,9 +106,9 @@ $(document).ready(function() {
|
|||||||
{"name":"quota","title":lang.domain_quota},
|
{"name":"quota","title":lang.domain_quota},
|
||||||
{"name":"spam_aliases","filterable": false,"title":lang.spam_aliases,"breakpoints":"xs sm"},
|
{"name":"spam_aliases","filterable": false,"title":lang.spam_aliases,"breakpoints":"xs sm"},
|
||||||
{"name":"in_use","filterable": false,"type":"html","title":lang.in_use},
|
{"name":"in_use","filterable": false,"type":"html","title":lang.in_use},
|
||||||
{"name":"messages","filterable": false,"style":{"maxWidth":"120px","width":"120px"},"title":lang.msg_num,"breakpoints":"xs sm"},
|
{"name":"messages","filterable": false,"style":{"width":"90px"},"title":lang.msg_num,"breakpoints":"xs sm"},
|
||||||
{"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active},
|
{"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"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"}
|
{"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","width":"290px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
|
||||||
],
|
],
|
||||||
"empty": lang.empty,
|
"empty": lang.empty,
|
||||||
"rows": data,
|
"rows": data,
|
||||||
@@ -123,8 +139,8 @@ $(document).ready(function() {
|
|||||||
success: function (data) {
|
success: function (data) {
|
||||||
$.each(data, function (i, item) {
|
$.each(data, function (i, item) {
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?resource=' + item.name + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?resource=' + encodeURI(item.name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="/delete.php?resource=' + item.name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="/delete.php?resource=' + encodeURI(item.name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
});
|
});
|
||||||
$('#resources_table').footable({
|
$('#resources_table').footable({
|
||||||
@@ -165,8 +181,8 @@ $(document).ready(function() {
|
|||||||
success: function (data) {
|
success: function (data) {
|
||||||
$.each(data, function (i, item) {
|
$.each(data, function (i, item) {
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?aliasdomain=' + item.alias_domain + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?aliasdomain=' + encodeURI(item.alias_domain) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="/delete.php?aliasdomain=' + item.alias_domain + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="/delete.php?aliasdomain=' + encodeURI(item.alias_domain) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
});
|
});
|
||||||
$('#aliasdomain_table').footable({
|
$('#aliasdomain_table').footable({
|
||||||
@@ -208,8 +224,8 @@ $(document).ready(function() {
|
|||||||
item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
|
item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
|
||||||
}
|
}
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?alias=' + item.address + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?alias=' + encodeURI(item.address) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="/delete.php?alias=' + item.address + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="/delete.php?alias=' + encodeURI(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
});
|
});
|
||||||
$('#alias_table').footable({
|
$('#alias_table').footable({
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ table.footable>tbody>tr.footable-empty>td {
|
|||||||
<?php
|
<?php
|
||||||
$lang_mailbox = json_encode($lang['mailbox']);
|
$lang_mailbox = json_encode($lang['mailbox']);
|
||||||
echo "var lang = ". $lang_mailbox . ";\n";
|
echo "var lang = ". $lang_mailbox . ";\n";
|
||||||
|
$role = ($_SESSION['mailcow_cc_role'] == "admin") ? 'admin' : 'domainadmin';
|
||||||
|
echo "var role = '". $role . "';\n";
|
||||||
?>
|
?>
|
||||||
</script>
|
</script>
|
||||||
<script src="js/footable.min.js"></script>
|
<script src="js/footable.min.js"></script>
|
||||||
|
|||||||
+13
-14
@@ -1,20 +1,19 @@
|
|||||||
## Anonymize headers
|
## Add mailcow app buttons
|
||||||
|
|
||||||
|
Open `data/web/inc/vars.local.inc.php` and add your apps to an array. Default configuration:
|
||||||
|
|
||||||
Save as `data/conf/postfix/mailcow_anonymize_headers.pcre`:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
/^\s*Received:[^\)]+\)\s+\(Authenticated sender:(.+)/
|
$MAILCOW_APPS = array(
|
||||||
REPLACE Received: from localhost (localhost [127.0.0.1]) (Authenticated sender:$1
|
array(
|
||||||
/^\s*User-Agent/ IGNORE
|
'name' => 'SOGo',
|
||||||
/^\s*X-Enigmail/ IGNORE
|
'link' => '/SOGo/'
|
||||||
/^\s*X-Mailer/ IGNORE
|
),
|
||||||
/^\s*X-Originating-IP/ IGNORE
|
// array(
|
||||||
/^\s*X-Forward/ IGNORE
|
// 'name' => 'Roundcube',
|
||||||
```
|
// 'link' => '/rc/'
|
||||||
|
// ),
|
||||||
Add this to `data/conf/postfix/main.cf`:
|
);
|
||||||
```
|
|
||||||
smtp_header_checks = pcre:/opt/postfix/conf/mailcow_anonymize_headers.pcre
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Backup and restore maildir (simple tar file)
|
## Backup and restore maildir (simple tar file)
|
||||||
|
|||||||
Reference in New Issue
Block a user