root 8 rokov pred
rodič
commit
892f2197cb

+ 1 - 1
data/conf/nginx/server_name.active

@@ -1 +1 @@
-server_name logs.servercow.de autodiscover.* autoconfig.*;
+server_name mail.develcow.de autodiscover.* autoconfig.*;

+ 1 - 1
data/web/inc/functions.inc.php

@@ -4422,7 +4422,7 @@ function mailbox_get_resource_details($resource) {
     $resourcedata['name'] = $row['username'];
     $resourcedata['name'] = $row['username'];
     $resourcedata['kind'] = $row['kind'];
     $resourcedata['kind'] = $row['kind'];
     $resourcedata['multiple_bookings'] = $row['multiple_bookings'];
     $resourcedata['multiple_bookings'] = $row['multiple_bookings'];
-    $resourcedata['multiple_bookings_int'] = $row['multiple_bookings'];
+    $resourcedata['multiple_bookings_int'] = $row['multiple_bookings_int'];
     $resourcedata['description'] = $row['name'];
     $resourcedata['description'] = $row['name'];
     $resourcedata['active'] = $row['active'];
     $resourcedata['active'] = $row['active'];
     $resourcedata['active_int'] = $row['active_int'];
     $resourcedata['active_int'] = $row['active_int'];

+ 1 - 0
data/web/inc/header.inc.php

@@ -15,6 +15,7 @@
 <link rel="stylesheet" href="/css/bootstrap-select.min.css">
 <link rel="stylesheet" href="/css/bootstrap-select.min.css">
 <link rel="stylesheet" href="/css/bootstrap-slider.min.css">
 <link rel="stylesheet" href="/css/bootstrap-slider.min.css">
 <link rel="stylesheet" href="/css/bootstrap-switch.min.css">
 <link rel="stylesheet" href="/css/bootstrap-switch.min.css">
+<link rel="stylesheet" href="/css/footable.bootstrap.min.css">
 <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700&subset=latin,latin-ext">
 <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700&subset=latin,latin-ext">
 <link rel="stylesheet" href="/inc/languages.min.css">
 <link rel="stylesheet" href="/inc/languages.min.css">
 <link rel="stylesheet" href="/css/mailcow.css">
 <link rel="stylesheet" href="/css/mailcow.css">

+ 153 - 23
data/web/js/mailbox.js

@@ -28,22 +28,23 @@ $(document).ready(function() {
         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);
         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> Edit</a>' +
-          '<a href="/delete.php?domain=' + item.domain_name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> Remove</a>' +
+          '<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="/delete.php?domain=' + item.domain_name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
 					'</div>';
 					'</div>';
       });
       });
       $('#domain_table').footable({
       $('#domain_table').footable({
         "columns": [
         "columns": [
-          {"sorted": true,"name":"domain_name","title":lang_domain},
-          {"name":"aliases","title":lang_aliases,"breakpoints":"xs sm"},
-          {"name":"mailboxes","title":lang_mailboxes},
-          {"name":"quota","title":lang_domain_quota},
-          {"name":"max_quota_for_mbox","title":lang_mailbox_quota},
-          {"name":"backupmx","title":lang_backup_mx,"breakpoints":"xs sm"},
-          {"name":"active","title":lang_active,"breakpoints":"xs sm"},
-          {"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"}
+          {"sorted": true,"name":"domain_name","title":lang.domain,"style":{"width":"250px"}},
+          {"name":"aliases","title":lang.aliases,"breakpoints":"xs sm"},
+          {"name":"mailboxes","title":lang.mailboxes},
+          {"name":"quota","title":lang.domain_quota},
+          {"name":"max_quota_for_mbox","title":lang.mailbox_quota},
+          {"name":"backupmx","title":lang.backup_mx,"breakpoints":"xs sm"},
+          {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
+          {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
         ],
         ],
         "rows": data,
         "rows": data,
+        "empty": lang.empty,
         "paging": {
         "paging": {
           "enabled": true,
           "enabled": true,
           "limit": 5,
           "limit": 5,
@@ -51,7 +52,8 @@ $(document).ready(function() {
         },
         },
         "filtering": {
         "filtering": {
           "enabled": true,
           "enabled": true,
-          "position": "left"
+          "position": "left",
+          "placeholder": lang.search
         },
         },
         "sorting": {
         "sorting": {
           "enabled": true
           "enabled": true
@@ -72,8 +74,8 @@ $(document).ready(function() {
         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);
         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> Edit</a>' +
-          '<a href="/delete.php?mailbox=' + item.username + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> Remove</a>' +
+          '<a href="/edit.php?mailbox=' + 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>' +
 					'</div>';
 					'</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" ' +
@@ -82,16 +84,17 @@ $(document).ready(function() {
       });
       });
       $('#mailbox_table').footable({
       $('#mailbox_table').footable({
         "columns": [
         "columns": [
-          {"sorted": true,"name":"username","title":lang_username},
-          {"name":"name","title":lang_fname,"breakpoints":"xs sm"},
-          {"name":"domain","title":lang_domain},
-          {"name":"quota","title":lang_domain_quota},
-          {"name":"spam_aliases","title":lang_spam_aliases},
-          {"name":"in_use","type":"html","title":lang_in_use},
-          {"name":"messages","title":lang_msg_num,"breakpoints":"xs sm"},
-          {"name":"active","title":lang_active,"breakpoints":"xs sm"},
-          {"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"}
+          {"sorted": true,"name":"username","title":lang.username,"style":{"width":"250px"}},
+          {"name":"name","title":lang.fname,"breakpoints":"xs sm"},
+          {"name":"domain","title":lang.domain},
+          {"name":"quota","title":lang.domain_quota},
+          {"name":"spam_aliases","title":lang.spam_aliases},
+          {"name":"in_use","type":"html","title":lang.in_use},
+          {"name":"messages","title":lang.msg_num,"breakpoints":"xs sm"},
+          {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
+          {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
         ],
         ],
+        "empty": lang.empty,
         "rows": data,
         "rows": data,
         "paging": {
         "paging": {
           "enabled": true,
           "enabled": true,
@@ -100,7 +103,8 @@ $(document).ready(function() {
         },
         },
         "filtering": {
         "filtering": {
           "enabled": true,
           "enabled": true,
-          "position": "left"
+          "position": "left",
+          "placeholder": lang.search
         },
         },
         "sorting": {
         "sorting": {
           "enabled": true
           "enabled": true
@@ -109,4 +113,130 @@ $(document).ready(function() {
     }
     }
   });
   });
 
 
+  $.ajax({
+    dataType: 'json',
+    url: '/json_api.php?action=resource_table_data',
+    jsonp: false,
+    error: function () {
+      alert('Cannot receive history');
+    },
+    success: function (data) {
+      $.each(data, function (i, item) {
+        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="/delete.php?resource=' + item.name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
+					'</div>';
+      });
+      $('#resources_table').footable({
+        "columns": [
+          {"sorted": true,"name":"description","title":lang.description,"style":{"width":"250px"}},
+          {"name":"kind","title":lang.kind,"breakpoints":"xs sm"},
+          {"name":"domain","title":lang.domain},
+          {"name":"multiple_bookings","title":lang.multiple_bookings},
+          {"name":"domain","title":lang.domain},
+          {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
+          {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        ],
+        "empty": lang.empty,
+        "rows": data,
+        "paging": {
+          "enabled": true,
+          "limit": 5,
+          "size": 25
+        },
+        "filtering": {
+          "enabled": true,
+          "position": "left",
+          "placeholder": lang.search
+        },
+        "sorting": {
+          "enabled": true
+        }
+      });
+    }
+  });
+
+  $.ajax({
+    dataType: 'json',
+    url: '/json_api.php?action=domain_alias_table_data',
+    jsonp: false,
+    error: function () {
+      alert('Cannot receive history');
+    },
+    success: function (data) {
+      $.each(data, function (i, item) {
+        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="/delete.php?aliasdomain=' + item.alias_domain + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
+					'</div>';
+      });
+      $('#aliasdomain_table').footable({
+        "columns": [
+          {"sorted": true,"name":"alias_domain","title":lang.alias,"style":{"width":"250px"}},
+          {"name":"target_domain","title":lang.target_domain,"breakpoints":"xs sm"},
+          {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
+          {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        ],
+        "empty": lang.empty,
+        "rows": data,
+        "paging": {
+          "enabled": true,
+          "limit": 5,
+          "size": 25
+        },
+        "filtering": {
+          "enabled": true,
+          "position": "left",
+          "placeholder": lang.search
+        },
+        "sorting": {
+          "enabled": true
+        }
+      });
+    }
+  });
+
+  $.ajax({
+    dataType: 'json',
+    url: '/json_api.php?action=alias_table_data',
+    jsonp: false,
+    error: function () {
+      alert('Cannot receive history');
+    },
+    success: function (data) {
+      $.each(data, function (i, item) {
+        if (item.is_catch_all == 1) {
+          item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
+        }
+        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="/delete.php?alias=' + item.address + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
+					'</div>';
+      });
+      $('#alias_table').footable({
+        "columns": [
+          {"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
+          {"name":"goto","title":lang.target_address},
+          {"name":"domain","title":lang.domain},
+          {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
+          {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        ],
+        "empty": lang.empty,
+        "rows": data,
+        "paging": {
+          "enabled": true,
+          "limit": 5,
+          "size": 5
+        },
+        "filtering": {
+          "enabled": true,
+          "position": "left",
+          "placeholder": lang.search
+        },
+        "sorting": {
+          "enabled": true
+        }
+      });
+    }
+  });
 });
 });

+ 101 - 4
data/web/json_api.php

@@ -2,13 +2,104 @@
 require_once 'inc/prerequisites.inc.php';
 require_once 'inc/prerequisites.inc.php';
 error_reporting(E_ALL);
 error_reporting(E_ALL);
 if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
 if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
-  if ($_GET['action'] && $_GET['object']) {
+  if (isset($_GET['action'])) {
     $action = $_GET['action'];
     $action = $_GET['action'];
-    $object = $_GET['object'];
     switch ($action) {
     switch ($action) {
+      case "domain_table_data":
+        $domains = mailbox_get_domains();
+        if (!empty($domains)) {
+          foreach ($domains as $domain) {
+            $data[] = mailbox_get_domain_details($domain);
+          }
+          if (!isset($data) || empty($data)) {
+            echo '{}';
+          }
+          else {
+            echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+          }
+        }
+        break;
+      case "mailbox_table_data":
+        $domains = mailbox_get_domains();
+        if (!empty($domains)) {
+          foreach ($domains as $domain) {
+            $mailboxes = mailbox_get_mailboxes($domain);
+            if (!empty($mailboxes)) {
+              foreach ($mailboxes as $mailbox) {
+                $data[] = mailbox_get_mailbox_details($mailbox);
+              }
+            }
+          }
+          if (!isset($data) || empty($data)) {
+            echo '{}';
+          }
+          else {
+            echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+          }
+        }
+        break;
+      case "resource_table_data":
+        $domains = mailbox_get_domains();
+        if (!empty($domains)) {
+          foreach ($domains as $domain) {
+            $resources = mailbox_get_resources($domain);
+            if (!empty($resources)) {
+              foreach ($resources as $resource) {
+                $data[] = mailbox_get_resource_details($resource);
+              }
+            }
+          }
+          if (!isset($data) || empty($data)) {
+            echo '{}';
+          }
+          else {
+            echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+          }
+        }
+        break;
+      case "domain_alias_table_data":
+        $domains = mailbox_get_domains();
+        if (!empty($domains)) {
+          foreach ($domains as $domain) {
+            $alias_domains = mailbox_get_alias_domains($domain);
+            if (!empty($alias_domains)) {
+              foreach ($alias_domains as $alias_domain) {
+                $data[] = mailbox_get_alias_domain_details($alias_domain);
+              }
+            }
+          }
+          if (!isset($data) || empty($data)) {
+            echo '{}';
+          }
+          else {
+            echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+          }
+        }
+        break;
+      case "alias_table_data":
+        $domains = array_merge(mailbox_get_domains(), mailbox_get_alias_domains());
+        if (!empty($domains)) {
+          foreach ($domains as $domain) {
+            $aliases = mailbox_get_aliases($domain);
+            if (!empty($aliases)) {
+              foreach ($aliases as $alias) {
+                $data[] = mailbox_get_alias_details($alias);
+              }
+            }
+          }
+          if (!isset($data) || empty($data)) {
+            echo '{}';
+          }
+          else {
+            echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+          }
+        }
+        break;
       case "get_mailbox_details":
       case "get_mailbox_details":
+        if (!isset($_GET['object'])) { return false; }
+        $object = $_GET['object'];
         $data = mailbox_get_mailbox_details($object);
         $data = mailbox_get_mailbox_details($object);
-        if (!$data || empty($data)) {
+        if (!isset($data) || empty($data)) {
           echo '{}';
           echo '{}';
         }
         }
         else {
         else {
@@ -16,8 +107,10 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
         }
         }
         break;
         break;
       case "get_domain_details":
       case "get_domain_details":
+        if (!isset($_GET['object'])) { return false; }
+        $object = $_GET['object'];
         $data = mailbox_get_domain_details($object);
         $data = mailbox_get_domain_details($object);
-        if (!$data || empty($data)) {
+        if (!isset($data) || empty($data)) {
           echo '{}';
           echo '{}';
         }
         }
         else {
         else {
@@ -25,6 +118,8 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
         }
         }
         break;
         break;
       case "get_u2f_reg_challenge":
       case "get_u2f_reg_challenge":
+        if (!isset($_GET['object'])) { return false; }
+        $object = $_GET['object'];
         if (
         if (
           ($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin")
           ($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin")
           &&
           &&
@@ -40,6 +135,8 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
         }
         }
         break;
         break;
       case "get_u2f_auth_challenge":
       case "get_u2f_auth_challenge":
+        if (!isset($_GET['object'])) { return false; }
+        $object = $_GET['object'];
         if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
         if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
           $reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object)));
           $reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object)));
           $_SESSION['authReq']  = $reqs;
           $_SESSION['authReq']  = $reqs;

+ 26 - 31
data/web/mailbox.php

@@ -5,6 +5,15 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm
 require_once "inc/header.inc.php";
 require_once "inc/header.inc.php";
 $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 ?>
 ?>
+<style>
+table.footable>tbody>tr.footable-empty>td {
+  font-size:15px !important;
+  font-style:italic;
+}
+.pagination a {
+  text-decoration: none !important;
+}
+</style>
 <div class="container">
 <div class="container">
 	<div class="row">
 	<div class="row">
 		<div class="col-md-12">
 		<div class="col-md-12">
@@ -36,9 +45,9 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 						<a href="/add.php?mailbox"><span class="glyphicon glyphicon-plus"></span></a>
 						<a href="/add.php?mailbox"><span class="glyphicon glyphicon-plus"></span></a>
 					</div>
 					</div>
 				</div>
 				</div>
-          <div class="table-responsive">
-            <table id="mailbox_table" class="table table-striped"></table>
-          </div>
+        <div class="table-responsive">
+          <table id="mailbox_table" class="table table-striped"></table>
+        </div>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>
@@ -51,11 +60,9 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 						<a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
 						<a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
 					</div>
 					</div>
 				</div>
 				</div>
-				<div class="panel-body">
-          <div class="table-responsive">
-            <table id="resources_table" class="table table-striped"></table>
-          </div>
-				</div>
+        <div class="table-responsive">
+          <table id="resources_table" class="table table-striped"></table>
+        </div>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>
@@ -68,11 +75,9 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 						<a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
 						<a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
 					</div>
 					</div>
 				</div>
 				</div>
-				<div class="panel-body">
-          <div class="table-responsive">
-            <table id="aliasdomain_table" class="table table-striped"></table>
-          </div>
-				</div>
+        <div class="table-responsive">
+          <table id="aliasdomain_table" class="table table-striped"></table>
+        </div>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>
@@ -86,28 +91,18 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 						<a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
 						<a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
 					</div>
 					</div>
 				</div>
 				</div>
-				<div class="panel-body">
-          <div class="table-responsive">
-            <table id="alias_table" class="table table-striped"></table>
-          </div>
-				</div>
+        <div class="table-responsive">
+          <table id="alias_table" class="table table-striped"></table>
+        </div>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>
 </div> <!-- /container -->
 </div> <!-- /container -->
-<script>
-var lang_domain = '<?=$lang['mailbox']['domain'];?>';
-var lang_aliases = '<?=$lang['mailbox']['aliases'];?>';
-var lang_mailboxes = '<?=$lang['mailbox']['mailboxes'];?>';
-var lang_mailbox_quota = '<?=$lang['mailbox']['mailbox_quota'];?>';
-var lang_domain_quota = '<?=$lang['mailbox']['domain_quota'];?>';
-var lang_backup_mx = '<?=$lang['mailbox']['backup_mx'];?>';
-var lang_active = '<?=$lang['mailbox']['active'];?>';
-var lang_username = '<?=$lang['mailbox']['username'];?>';
-var lang_fname = '<?=$lang['mailbox']['fname'];?>';
-var lang_spam_aliases = '<?=$lang['mailbox']['spam_aliases'];?>';
-var lang_in_use = '<?=$lang['mailbox']['in_use'];?>';
-var lang_msg_num = '<?=$lang['mailbox']['msg_num'];?>';
+<script type='text/javascript'>
+<?php
+$lang_mailbox = json_encode($lang['mailbox']);
+echo "var lang = ". $lang_mailbox . ";\n";
+?>
 </script>
 </script>
 <script src="js/footable.min.js"></script>
 <script src="js/footable.min.js"></script>
 <script src="js/mailbox.js"></script>
 <script src="js/mailbox.js"></script>

+ 3 - 0
docker-compose.yml

@@ -261,6 +261,9 @@ networks:
 
 
 volumes:
 volumes:
   vmail-vol-1:
   vmail-vol-1:
+    driver: nfs
+    driver_opts:
+      share: io.servercow.de:/nfs_test
   mysql-vol-1:
   mysql-vol-1:
   dkim-vol-1:
   dkim-vol-1:
   redis-vol-1:
   redis-vol-1: