NobGit
public nobgit read

NobMail

Based on mailcow: dockerized

Languages

Repository composition by tracked source files.

PHP
PHP 49% JavaScript 35% HTML 9% CSS 4% Shell 2% Python 1% Lua 0% Perl 0% Ruby 0% SCSS 0%
Create file Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git

Commit

[Web] Sync jobs can be created/viewed/edited by admins/domain admins; Various fixes or improvements

66e06a0c
andryyy <[email protected]> 9 years ago
data/web/admin.php                      |    2 +-
 data/web/edit.php                       | 1282 +++++++++++++++----------------
 data/web/inc/footer.inc.php             |    1 +
 data/web/inc/functions.fail2ban.inc.php |    7 +-
 data/web/inc/functions.mailbox.inc.php  |   29 +-
 data/web/inc/sessions.inc.php           |    4 +-
 data/web/inc/triggers.inc.php           |    1 +
 data/web/js/admin.js                    |   14 +-
 data/web/js/api.js                      |    1 +
 data/web/js/bootstrap-filestyle.min.js  |    1 +
 data/web/js/mailbox.js                  |   74 +-
 data/web/js/user.js                     |   10 +-
 data/web/json_api.php                   |  163 +++-
 data/web/lang/lang.de.php               |    3 +
 data/web/lang/lang.en.php               |    3 +
 data/web/mailbox.php                    |   24 +
 data/web/modals/mailbox.php             |  132 +++-
 data/web/modals/user.php                |   46 ++
 data/web/user.php                       |   64 +-
 19 files changed, 1123 insertions(+), 738 deletions(-)
 create mode 100644 data/web/js/bootstrap-filestyle.min.js

Diff

diff --git a/data/web/admin.php b/data/web/admin.php
index bb53e61e..062b917d 100644
--- a/data/web/admin.php
+++ b/data/web/admin.php
@@ -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>
diff --git a/data/web/edit.php b/data/web/edit.php
index c8167f88..b40f1ae0 100644
--- a/data/web/edit.php
+++ b/data/web/edit.php
@@ -16,690 +16,682 @@ require_once("inc/header.inc.php");
 				</div>
 				<div class="panel-body">
 <?php
-if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin"  || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
-		if (isset($_GET["alias"]) &&
-			!empty($_GET["alias"])) {
-				$alias = $_GET["alias"];
-        $result = mailbox('get', 'alias_details', $alias);
-				if (!empty($result)) {
-				?>
-					<h4><?=$lang['edit']['alias'];?></h4>
-					<br />
-					<form class="form-horizontal" data-id="editalias" role="form" method="post">
-						<input type="hidden" value="0" name="active">
-						<div class="form-group">
-							<label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
-							<div class="col-sm-10">
-								<textarea class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto"><?=htmlspecialchars($result['goto']) ?></textarea>
-							</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" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></label>
-								</div>
-							</div>
-						</div>
-						<div class="form-group">
-							<div class="col-sm-offset-2 col-sm-10">
-                <button class="btn btn-success" id="edit_selected" data-id="editalias" data-item="<?=$alias;?>" data-api-url='edit/alias' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-							</div>
-						</div>
-					</form>
-				<?php
-				}
-				else {
-				?>
-					<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-				<?php
-				}
-		}
-		elseif (isset($_GET['domainadmin']) &&
-				ctype_alnum(str_replace(array('_', '.', '-'), '', $_GET["domainadmin"])) &&
-				!empty($_GET["domainadmin"]) &&
-				$_GET["domainadmin"] != 'admin' &&
-				$_SESSION['mailcow_cc_role'] == "admin") {
-				$domain_admin = $_GET["domainadmin"];
-				$result = domain_admin('details', $domain_admin);
-				if (!empty($result)) {
-				?>
-				<h4><?=$lang['edit']['domain_admin'];?></h4>
-				<br />
-				<form class="form-horizontal" data-id="editdomainadmin" role="form" method="post">
-					<input type="hidden" value="0" name="active">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="username_new"><?=$lang['edit']['username'];?></label>
-						<div class="col-sm-10">
-              <input class="form-control" type="text" name="username_new" value="<?=htmlspecialchars($domain_admin);?>" />
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="domains"><?=$lang['edit']['domains'];?></label>
-						<div class="col-sm-10">
-							<select id="domains" name="domains[]" multiple required>
-							<?php
-							foreach ($result['selected_domains'] as $domain):
-							?>
-								<option selected><?=htmlspecialchars($domain);?></option>
-							<?php
-							endforeach;
-							foreach ($result['unselected_domains'] as $domain):
-							?>
-								<option><?=htmlspecialchars($domain);?></option>
-							<?php
-							endforeach;
-							?>
-							</select>
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
-						<div class="col-sm-10">
-						<input type="password" class="form-control" name="password" id="password" placeholder="">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
-						<div class="col-sm-10">
-						<input type="password" class="form-control" name="password2" id="password2">
-						</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" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></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="disable_tfa"> <?=$lang['tfa']['disable_tfa'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editdomainadmin" data-item="<?=$domain_admin;?>" data-api-url='edit/domain-admin' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-						</div>
-					</div>
-				</form>
-			<?php
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	elseif (isset($_GET['domain']) &&
-		is_valid_domain_name($_GET["domain"]) &&
-		!empty($_GET["domain"])) {
-			$domain = $_GET["domain"];
-      $result = mailbox('get', 'domain_details', $domain);
-      $rl = mailbox('get', 'domain_ratelimit', $domain);
-      $rlyhosts = relayhost('get');
-			if (!empty($result)) {
-			?>
-				<h4><?=$lang['edit']['domain'];?></h4>
-				<form data-id="editdomain" class="form-horizontal" role="form" method="post">
-					<input type="hidden" value="0" name="active">
-					<input type="hidden" value="0" name="backupmx">
-					<input type="hidden" value="0" name="relay_all_recipients">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="description"><?=$lang['edit']['description'];?></label>
-						<div class="col-sm-10">
-							<input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description']);?>">
-						</div>
-					</div>
-					<?php
-					if ($_SESSION['mailcow_cc_role'] == "admin") {
-					?>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="aliases"><?=$lang['edit']['max_aliases'];?></label>
-						<div class="col-sm-10">
-							<input type="number" class="form-control" name="aliases" id="aliases" value="<?=intval($result['max_num_aliases_for_domain']);?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="mailboxes"><?=$lang['edit']['max_mailboxes'];?></label>
-						<div class="col-sm-10">
-							<input type="number" class="form-control" name="mailboxes" id="mailboxes" value="<?=intval($result['max_num_mboxes_for_domain']);?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="maxquota"><?=$lang['edit']['max_quota'];?></label>
-						<div class="col-sm-10">
-							<input type="number" class="form-control" name="maxquota" id="maxquota" value="<?=intval($result['max_quota_for_mbox'] / 1048576);?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="quota"><?=$lang['edit']['domain_quota'];?></label>
-						<div class="col-sm-10">
-							<input type="number" class="form-control" name="quota" id="quota" value="<?=intval($result['max_quota_for_domain'] / 1048576);?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="quota">Relayhost</label>
-						<div class="col-sm-10">
-              <select name="relayhost" id="relayhost" class="form-control">
+if (isset($_SESSION['mailcow_cc_role'])) {
+  if ($_SESSION['mailcow_cc_role'] == "admin"  || $_SESSION['mailcow_cc_role'] == "domainadmin") {
+      if (isset($_GET["alias"]) &&
+        !empty($_GET["alias"])) {
+          $alias = $_GET["alias"];
+          $result = mailbox('get', 'alias_details', $alias);
+          if (!empty($result)) {
+          ?>
+            <h4><?=$lang['edit']['alias'];?></h4>
+            <br />
+            <form class="form-horizontal" data-id="editalias" role="form" method="post">
+              <input type="hidden" value="0" name="active">
+              <div class="form-group">
+                <label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
+                <div class="col-sm-10">
+                  <textarea class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto"><?=htmlspecialchars($result['goto']) ?></textarea>
+                </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" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></label>
+                  </div>
+                </div>
+              </div>
+              <div class="form-group">
+                <div class="col-sm-offset-2 col-sm-10">
+                  <button class="btn btn-success" id="edit_selected" data-id="editalias" data-item="<?=$alias;?>" data-api-url='edit/alias' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+                </div>
+              </div>
+            </form>
+          <?php
+          }
+          else {
+          ?>
+            <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+          <?php
+          }
+      }
+      elseif (isset($_GET['domainadmin']) &&
+          ctype_alnum(str_replace(array('_', '.', '-'), '', $_GET["domainadmin"])) &&
+          !empty($_GET["domainadmin"]) &&
+          $_GET["domainadmin"] != 'admin' &&
+          $_SESSION['mailcow_cc_role'] == "admin") {
+          $domain_admin = $_GET["domainadmin"];
+          $result = domain_admin('details', $domain_admin);
+          if (!empty($result)) {
+          ?>
+          <h4><?=$lang['edit']['domain_admin'];?></h4>
+          <br />
+          <form class="form-horizontal" data-id="editdomainadmin" role="form" method="post">
+            <input type="hidden" value="0" name="active">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="username_new"><?=$lang['edit']['username'];?></label>
+              <div class="col-sm-10">
+                <input class="form-control" type="text" name="username_new" value="<?=htmlspecialchars($domain_admin);?>" />
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="domains"><?=$lang['edit']['domains'];?></label>
+              <div class="col-sm-10">
+                <select id="domains" name="domains" multiple required>
                 <?php
-                foreach ($rlyhosts as $rlyhost) {
+                foreach ($result['selected_domains'] as $domain):
                 ?>
-                <option value="<?=$rlyhost['id'];?>" <?=($result['relayhost'] == $rlyhost['id']) ? 'selected' : null;?>>ID <?=$rlyhost['id'];?>: <?=$rlyhost['hostname'];?> (<?=$rlyhost['username'];?>)</option>
+                  <option selected><?=htmlspecialchars($domain);?></option>
                 <?php
-                }
+                endforeach;
+                foreach ($result['unselected_domains'] as $domain):
                 ?>
-                <option value="" <?=($result['relayhost'] == "0") ? 'selected' : null;?>>None</option>
-              </select>
+                  <option><?=htmlspecialchars($domain);?></option>
+                <?php
+                endforeach;
+                ?>
+                </select>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
+              <div class="col-sm-10">
+              <input type="password" class="form-control" name="password" id="password" placeholder="">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
+              <div class="col-sm-10">
+              <input type="password" class="form-control" name="password2" id="password2">
+              </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" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></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="disable_tfa"> <?=$lang['tfa']['disable_tfa'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editdomainadmin" data-item="<?=$domain_admin;?>" data-api-url='edit/domain-admin' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+              </div>
+            </div>
+          </form>
+        <?php
+        }
+        else {
+        ?>
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+        <?php
+        }
+    }
+    elseif (isset($_GET['domain']) &&
+      is_valid_domain_name($_GET["domain"]) &&
+      !empty($_GET["domain"])) {
+        $domain = $_GET["domain"];
+        $result = mailbox('get', 'domain_details', $domain);
+        $rl = mailbox('get', 'domain_ratelimit', $domain);
+        $rlyhosts = relayhost('get');
+        if (!empty($result)) {
+        ?>
+          <h4><?=$lang['edit']['domain'];?></h4>
+          <form data-id="editdomain" class="form-horizontal" role="form" method="post">
+            <input type="hidden" value="0" name="active">
+            <input type="hidden" value="0" name="backupmx">
+            <input type="hidden" value="0" name="relay_all_recipients">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="description"><?=$lang['edit']['description'];?></label>
+              <div class="col-sm-10">
+                <input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description']);?>">
+              </div>
+            </div>
+            <?php
+            if ($_SESSION['mailcow_cc_role'] == "admin") {
+            ?>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="aliases"><?=$lang['edit']['max_aliases'];?></label>
+              <div class="col-sm-10">
+                <input type="number" class="form-control" name="aliases" id="aliases" value="<?=intval($result['max_num_aliases_for_domain']);?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="mailboxes"><?=$lang['edit']['max_mailboxes'];?></label>
+              <div class="col-sm-10">
+                <input type="number" class="form-control" name="mailboxes" id="mailboxes" value="<?=intval($result['max_num_mboxes_for_domain']);?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="maxquota"><?=$lang['edit']['max_quota'];?></label>
+              <div class="col-sm-10">
+                <input type="number" class="form-control" name="maxquota" id="maxquota" value="<?=intval($result['max_quota_for_mbox'] / 1048576);?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="quota"><?=$lang['edit']['domain_quota'];?></label>
+              <div class="col-sm-10">
+                <input type="number" class="form-control" name="quota" id="quota" value="<?=intval($result['max_quota_for_domain'] / 1048576);?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="quota">Relayhost</label>
+              <div class="col-sm-10">
+                <select name="relayhost" id="relayhost" class="form-control">
+                  <?php
+                  foreach ($rlyhosts as $rlyhost) {
+                  ?>
+                  <option value="<?=$rlyhost['id'];?>" <?=($result['relayhost'] == $rlyhost['id']) ? 'selected' : null;?>>ID <?=$rlyhost['id'];?>: <?=$rlyhost['hostname'];?> (<?=$rlyhost['username'];?>)</option>
+                  <?php
+                  }
+                  ?>
+                  <option value="" <?=($result['relayhost'] == "0") ? 'selected' : null;?>>None</option>
+                </select>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2"><?=$lang['edit']['backup_mx_options'];?></label>
+              <div class="col-sm-10">
+                <div class="checkbox">
+                  <label><input type="checkbox" value="1" name="backupmx" <?=(isset($result['backupmx_int']) && $result['backupmx_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_domain'];?></label>
+                  <br />
+                  <label><input type="checkbox" value="1" name="relay_all_recipients" <?=(isset($result['relay_all_recipients_int']) && $result['relay_all_recipients_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_all'];?></label>
+                  <p><?=$lang['edit']['relay_all_info'];?></p>
+                </div>
+              </div>
+            </div>
+            <?php
+            }
+            ?>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <div class="checkbox">
+                  <label><input type="checkbox" value="1" name="active" <?=(isset($result['active_int']) && $result['active_int']=="1") ? "checked" : null;?> <?=($_SESSION['mailcow_cc_role'] == "admin") ? null : "disabled";?>> <?=$lang['edit']['active'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editdomain" data-item="<?=$domain;?>" data-api-url='edit/domain' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
+              </div>
+            </div>
+          </form>
+          <?php
+          if (!empty($dkim = dkim('details', $domain))) {
+          ?>
+          <hr>
+          <div class="row">
+            <div class="col-xs-2">
+              <p>Domain: <strong><?=htmlspecialchars($result['domain_name']);?></strong> (<?=$dkim['dkim_selector'];?>._domainkey)</p>
+            </div>
+            <div class="col-xs-10">
+              <pre><?=$dkim['dkim_txt'];?></pre>
             </div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2"><?=$lang['edit']['backup_mx_options'];?></label>
-						<div class="col-sm-10">
-							<div class="checkbox">
-								<label><input type="checkbox" value="1" name="backupmx" <?=(isset($result['backupmx_int']) && $result['backupmx_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_domain'];?></label>
-								<br />
-								<label><input type="checkbox" value="1" name="relay_all_recipients" <?=(isset($result['relay_all_recipients_int']) && $result['relay_all_recipients_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_all'];?></label>
-								<p><?=$lang['edit']['relay_all_info'];?></p>
-							</div>
-						</div>
-					</div>
-					<?php
-					}
-					?>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-							<div class="checkbox">
-								<label><input type="checkbox" value="1" name="active" <?=(isset($result['active_int']) && $result['active_int']=="1") ? "checked" : null;?> <?=($_SESSION['mailcow_cc_role'] == "admin") ? null : "disabled";?>> <?=$lang['edit']['active'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editdomain" data-item="<?=$domain;?>" data-api-url='edit/domain' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
-						</div>
-					</div>
-				</form>
-				<?php
-        if (!empty($dkim = dkim('details', $domain))) {
-				?>
-        <hr>
-        <div class="row">
-          <div class="col-xs-2">
-            <p>Domain: <strong><?=htmlspecialchars($result['domain_name']);?></strong> (<?=$dkim['dkim_selector'];?>._domainkey)</p>
-          </div>
-          <div class="col-xs-10">
-            <pre><?=$dkim['dkim_txt'];?></pre>
           </div>
+          <?php
+          }
+          ?>
+      <hr>
+      <!--
+      <form data-id="domratelimit" class="form-inline well" method="post">
+        <div class="form-group">
+          <label class="control-label">Ratelimit</label>
+          <input name="rl_value" id="rl_value" type="number" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="disabled">
         </div>
-				<?php
-				}
-        ?>
-		<hr>
-    <!--
-    <form data-id="domratelimit" class="form-inline well" method="post">
-      <div class="form-group">
-        <label class="control-label">Ratelimit</label>
-        <input name="rl_value" id="rl_value" type="number" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="disabled">
-      </div>
-      <div class="form-group">
-        <select name="rl_frame" id="rl_frame" class="form-control">
-          <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>>msgs / second</option>
-          <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>>msgs / minute</option>
-          <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>>msgs / hour</option>
-        </select>
-      </div>
-      <div class="form-group">
-        <button class="btn btn-default" id="edit_selected" data-id="domratelimit" data-item="<?=$domain;?>" data-api-url='edit/domain-ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
-      </div>
-    </form>
-		<hr>
-    -->
-		<div class="row">
-			<div class="col-sm-6">
-				<h4><?=$lang['user']['spamfilter_wl'];?></h4>
-        <p><?=$lang['user']['spamfilter_wl_desc'];?></p>
-        <div class="table-responsive">
-          <table class="table table-striped table-condensed" id="wl_policy_domain_table"></table>
+        <div class="form-group">
+          <select name="rl_frame" id="rl_frame" class="form-control">
+            <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>>msgs / second</option>
+            <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>>msgs / minute</option>
+            <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>>msgs / hour</option>
+          </select>
         </div>
-        <div class="mass-actions-user">
-          <div class="btn-group">
-            <a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="policy_wl_domain" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
-            <a class="btn btn-sm btn-danger" id="delete_selected" data-id="policy_wl_domain" data-api-url='delete/domain-policy' href="#"><?=$lang['mailbox']['remove'];?></a></li>
-            </ul>
-          </div>
+        <div class="form-group">
+          <button class="btn btn-default" id="edit_selected" data-id="domratelimit" data-item="<?=$domain;?>" data-api-url='edit/domain-ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
         </div>
-        <form class="form-inline" data-id="add_wl_policy_domain">
-          <div class="input-group">
-            <input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
-            <span class="input-group-btn">
-              <button class="btn btn-default" id="add_item" data-id="add_wl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"<?= $domain; ?>","object_list":"wl"}' href="#"><?=$lang['user']['spamfilter_table_add'];?></button>
-            </span>
+      </form>
+      <hr>
+      -->
+      <div class="row">
+        <div class="col-sm-6">
+          <h4><?=$lang['user']['spamfilter_wl'];?></h4>
+          <p><?=$lang['user']['spamfilter_wl_desc'];?></p>
+          <div class="table-responsive">
+            <table class="table table-striped table-condensed" id="wl_policy_domain_table"></table>
           </div>
-        </form>
-      </div>
-			<div class="col-sm-6">
-				<h4><?=$lang['user']['spamfilter_bl'];?></h4>
-        <p><?=$lang['user']['spamfilter_bl_desc'];?></p>
-        <div class="table-responsive">
-          <table class="table table-striped table-condensed" id="bl_policy_domain_table"></table>
-        </div>
-        <div class="mass-actions-user">
-          <div class="btn-group">
-            <a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="policy_bl_domain" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
-            <a class="btn btn-sm btn-danger" id="delete_selected" data-id="policy_bl_domain" data-api-url='delete/domain-policy' href="#"><?=$lang['mailbox']['remove'];?></a></li>
-            </ul>
+          <div class="mass-actions-user">
+            <div class="btn-group">
+              <a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="policy_wl_domain" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
+              <a class="btn btn-sm btn-danger" id="delete_selected" data-id="policy_wl_domain" data-api-url='delete/domain-policy' href="#"><?=$lang['mailbox']['remove'];?></a></li>
+              </ul>
+            </div>
           </div>
+          <form class="form-inline" data-id="add_wl_policy_domain">
+            <div class="input-group">
+              <input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
+              <span class="input-group-btn">
+                <button class="btn btn-default" id="add_item" data-id="add_wl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"<?= $domain; ?>","object_list":"wl"}' href="#"><?=$lang['user']['spamfilter_table_add'];?></button>
+              </span>
+            </div>
+          </form>
         </div>
-        <form class="form-inline" data-id="add_bl_policy_domain">
-          <div class="input-group">
-            <input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
-            <span class="input-group-btn">
-              <button class="btn btn-default" id="add_item" data-id="add_bl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"<?= $domain; ?>","object_list":"bl"}' href="#"><?=$lang['user']['spamfilter_table_add'];?></button>
-            </span>
+        <div class="col-sm-6">
+          <h4><?=$lang['user']['spamfilter_bl'];?></h4>
+          <p><?=$lang['user']['spamfilter_bl_desc'];?></p>
+          <div class="table-responsive">
+            <table class="table table-striped table-condensed" id="bl_policy_domain_table"></table>
           </div>
-        </form>
+          <div class="mass-actions-user">
+            <div class="btn-group">
+              <a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="policy_bl_domain" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
+              <a class="btn btn-sm btn-danger" id="delete_selected" data-id="policy_bl_domain" data-api-url='delete/domain-policy' href="#"><?=$lang['mailbox']['remove'];?></a></li>
+              </ul>
+            </div>
+          </div>
+          <form class="form-inline" data-id="add_bl_policy_domain">
+            <div class="input-group">
+              <input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
+              <span class="input-group-btn">
+                <button class="btn btn-default" id="add_item" data-id="add_bl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"<?= $domain; ?>","object_list":"bl"}' href="#"><?=$lang['user']['spamfilter_table_add'];?></button>
+              </span>
+            </div>
+          </form>
+        </div>
       </div>
-    </div>
+          <?php
+        }
+        else {
+        ?>
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+        <?php
+        }
+    }
+    elseif (isset($_GET['aliasdomain']) &&
+      is_valid_domain_name($_GET["aliasdomain"]) &&
+      !empty($_GET["aliasdomain"])) {
+        $alias_domain = $_GET["aliasdomain"];
+        $result = mailbox('get', 'alias_domain_details', $alias_domain);
+        // $rl = mailbox('get', 'domain_ratelimit', $alias_domain);
+        if (!empty($result)) {
+        ?>
+          <h4><?=$lang['edit']['edit_alias_domain'];?></h4>
+          <form class="form-horizontal" data-id="editaliasdomain" role="form" method="post">
+            <input type="hidden" value="0" name="active">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="target_domain"><?=$lang['edit']['target_domain'];?></label>
+              <div class="col-sm-10">
+                <input type="text" class="form-control" name="target_domain" id="target_domain" value="<?=htmlspecialchars($result['target_domain']);?>">
+              </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" <?=(isset($result['active_int']) && $result['active_int']=="1") ?  "checked" : null ?>> <?=$lang['edit']['active'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editaliasdomain" data-item="<?=$alias_domain;?>" data-api-url='edit/alias-domain' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+              </div>
+            </div>
+          </form>
+          <!--
+          <hr>
+          <form data-id="domratelimit" class="form-inline well" method="post">
+            <div class="form-group">
+              <label class="control-label">Ratelimit</label>
+              <input name="rl_value" id="rl_value" type="number" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="disabled">
+            </div>
+            <div class="form-group">
+              <select name="rl_frame" id="rl_frame" class="form-control">
+                <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>>msgs / second</option>
+                <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>>msgs / minute</option>
+                <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>>msgs / hour</option>
+              </select>
+            </div>
+            <div class="form-group">
+              <button class="btn btn-default" id="edit_selected" data-id="domratelimit" data-item="<?=$alias_domain;?>" data-api-url='edit/domain-ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
+            </div>
+          </form>
+          -->
+          <?php
+          if (!empty($dkim = dkim('details', $alias_domain))) {
+          ?>
+          <hr>
+          <div class="row">
+            <div class="col-xs-2">
+              <p>Domain: <strong><?=htmlspecialchars($result['alias_domain']);?></strong> (<?=$dkim['dkim_selector'];?>._domainkey)</p>
+            </div>
+            <div class="col-xs-10">
+            <pre><?=$dkim['dkim_txt'];?></pre>
+            </div>
+          </div>
+          <?php
+          }
+        }
+        else {
+        ?>
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
         <?php
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	elseif (isset($_GET['aliasdomain']) &&
-		is_valid_domain_name($_GET["aliasdomain"]) &&
-		!empty($_GET["aliasdomain"])) {
-			$alias_domain = $_GET["aliasdomain"];
-      $result = mailbox('get', 'alias_domain_details', $alias_domain);
-      // $rl = mailbox('get', 'domain_ratelimit', $alias_domain);
+        }
+    }
+    elseif (isset($_GET['mailbox']) && filter_var($_GET["mailbox"], FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
+      $mailbox = $_GET["mailbox"];
+      $result = mailbox('get', 'mailbox_details', $mailbox);
       if (!empty($result)) {
-			?>
-				<h4><?=$lang['edit']['edit_alias_domain'];?></h4>
-				<form class="form-horizontal" data-id="editaliasdomain" role="form" method="post">
-					<input type="hidden" value="0" name="active">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="target_domain"><?=$lang['edit']['target_domain'];?></label>
-						<div class="col-sm-10">
-							<input type="text" class="form-control" name="target_domain" id="target_domain" value="<?=htmlspecialchars($result['target_domain']);?>">
-						</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" <?=(isset($result['active_int']) && $result['active_int']=="1") ?  "checked" : null ?>> <?=$lang['edit']['active'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editaliasdomain" data-item="<?=$alias_domain;?>" data-api-url='edit/alias-domain' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-						</div>
-					</div>
-				</form>
-        <!--
-        <hr>
-        <form data-id="domratelimit" class="form-inline well" method="post">
+        ?>
+        <h4><?=$lang['edit']['mailbox'];?></h4>
+        <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
+          <input type="hidden" value="0" name="sender_acl">
+          <input type="hidden" value="0" name="active">
           <div class="form-group">
-            <label class="control-label">Ratelimit</label>
-            <input name="rl_value" id="rl_value" type="number" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="disabled">
+            <label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?>:</label>
+            <div class="col-sm-10">
+            <input type="text" class="form-control" name="name" id="name" value="<?=htmlspecialchars($result['name'], ENT_QUOTES, 'UTF-8');?>">
+            </div>
           </div>
           <div class="form-group">
-            <select name="rl_frame" id="rl_frame" class="form-control">
-              <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>>msgs / second</option>
-              <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>>msgs / minute</option>
-              <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>>msgs / hour</option>
-            </select>
+            <label class="control-label col-sm-2" for="quota"><?=$lang['edit']['quota_mb'];?>:
+              <br /><span id="quotaBadge" class="badge">max. <?=intval($result['max_new_quota'] / 1048576)?> MiB</span>
+            </label>
+            <div class="col-sm-10">
+              <input type="number" name="quota" id="quota" id="destroyable" style="width:100%" min="1" max="<?=intval($result['max_new_quota'] / 1048576);?>" value="<?=intval($result['quota']) / 1048576;?>" class="form-control">
+            </div>
           </div>
           <div class="form-group">
-            <button class="btn btn-default" id="edit_selected" data-id="domratelimit" data-item="<?=$alias_domain;?>" data-api-url='edit/domain-ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
-          </div>
-        </form>
-        -->
-				<?php
-        if (!empty($dkim = dkim('details', $alias_domain))) {
-				?>
-        <hr>
-        <div class="row">
-          <div class="col-xs-2">
-            <p>Domain: <strong><?=htmlspecialchars($result['alias_domain']);?></strong> (<?=$dkim['dkim_selector'];?>._domainkey)</p>
-          </div>
-          <div class="col-xs-10">
-          <pre><?=$dkim['dkim_txt'];?></pre>
-          </div>
-        </div>
-				<?php
-				}
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	elseif (isset($_GET['mailbox']) && filter_var($_GET["mailbox"], FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
-    $mailbox = $_GET["mailbox"];
-    $result = mailbox('get', 'mailbox_details', $mailbox);
-    if (!empty($result)) {
-      ?>
-      <h4><?=$lang['edit']['mailbox'];?></h4>
-      <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
-				<input type="hidden" value="0" name="sender_acl">
-				<input type="hidden" value="0" name="active">
-        <div class="form-group">
-          <label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?>:</label>
-          <div class="col-sm-10">
-          <input type="text" class="form-control" name="name" id="name" value="<?=htmlspecialchars($result['name'], ENT_QUOTES, 'UTF-8');?>">
-          </div>
-        </div>
-        <div class="form-group">
-          <label class="control-label col-sm-2" for="quota"><?=$lang['edit']['quota_mb'];?>:
-            <br /><span id="quotaBadge" class="badge">max. <?=intval($result['max_new_quota'] / 1048576)?> MiB</span>
-          </label>
-          <div class="col-sm-10">
-            <input type="number" name="quota" id="quota" id="destroyable" style="width:100%" min="1" max="<?=intval($result['max_new_quota'] / 1048576);?>" value="<?=intval($result['quota']) / 1048576;?>" class="form-control">
-          </div>
-        </div>
-        <div class="form-group">
-          <label class="control-label col-sm-2" for="sender_acl"><?=$lang['edit']['sender_acl'];?>:</label>
-          <div class="col-sm-10">
-            <select data-width="100%" style="width:100%" id="sender_acl" name="sender_acl" size="10" multiple>
-            <?php
-            $sender_acl_handles = mailbox('get', 'sender_acl_handles', $mailbox);
-
-            foreach ($sender_acl_handles['sender_acl_domains']['ro'] as $domain):
-              ?>
-              <option data-subtext="Admin" value="<?=htmlspecialchars($domain);?>" disabled selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
+            <label class="control-label col-sm-2" for="sender_acl"><?=$lang['edit']['sender_acl'];?>:</label>
+            <div class="col-sm-10">
+              <select data-width="100%" style="width:100%" id="sender_acl" name="sender_acl" size="10" multiple>
               <?php
-            endforeach;
+              $sender_acl_handles = mailbox('get', 'sender_acl_handles', $mailbox);
 
-            foreach ($sender_acl_handles['sender_acl_addresses']['ro'] as $domain):
-              ?>
-            <option data-subtext="Admin" disabled selected><?=htmlspecialchars($alias);?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['sender_acl_domains']['ro'] as $domain):
+                ?>
+                <option data-subtext="Admin" value="<?=htmlspecialchars($domain);?>" disabled selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
+                <?php
+              endforeach;
 
-            foreach ($sender_acl_handles['fixed_sender_aliases'] as $alias):
-              ?>
-              <option data-subtext="Alias" disabled selected><?=htmlspecialchars($alias);?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['sender_acl_addresses']['ro'] as $domain):
+                ?>
+              <option data-subtext="Admin" disabled selected><?=htmlspecialchars($alias);?></option>
+                <?php
+              endforeach;
 
-            foreach ($sender_acl_handles['sender_acl_domains']['rw'] as $domain):
-              ?>
-              <option value="<?=htmlspecialchars($domain);?>" selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['fixed_sender_aliases'] as $alias):
+                ?>
+                <option data-subtext="Alias" disabled selected><?=htmlspecialchars($alias);?></option>
+                <?php
+              endforeach;
 
-            foreach ($sender_acl_handles['sender_acl_domains']['selectable'] as $domain):
-              ?>
-              <option value="<?=htmlspecialchars($domain);?>"><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['sender_acl_domains']['rw'] as $domain):
+                ?>
+                <option value="<?=htmlspecialchars($domain);?>" selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
+                <?php
+              endforeach;
 
-            foreach ($sender_acl_handles['sender_acl_addresses']['rw'] as $address):
-              ?>
-                <option selected><?=htmlspecialchars($address);?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['sender_acl_domains']['selectable'] as $domain):
+                ?>
+                <option value="<?=htmlspecialchars($domain);?>"><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
+                <?php
+              endforeach;
 
-            foreach ($sender_acl_handles['sender_acl_addresses']['selectable'] as $address):
-              ?>
-                <option><?=htmlspecialchars($address);?></option>
-              <?php
-            endforeach;
+              foreach ($sender_acl_handles['sender_acl_addresses']['rw'] as $address):
+                ?>
+                  <option selected><?=htmlspecialchars($address);?></option>
+                <?php
+              endforeach;
 
-            ?>
-            </select>
+              foreach ($sender_acl_handles['sender_acl_addresses']['selectable'] as $address):
+                ?>
+                  <option><?=htmlspecialchars($address);?></option>
+                <?php
+              endforeach;
+
+              ?>
+              </select>
+            </div>
           </div>
-        </div>
-        <div class="form-group">
-          <label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
-          <div class="col-sm-10">
-          <input type="password" class="form-control" name="password" id="password" placeholder="<?=$lang['edit']['unchanged_if_empty'];?>">
+          <div class="form-group">
+            <label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
+            <div class="col-sm-10">
+            <input type="password" class="form-control" name="password" id="password" placeholder="<?=$lang['edit']['unchanged_if_empty'];?>">
+            </div>
           </div>
-        </div>
-        <div class="form-group">
-          <label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
-          <div class="col-sm-10">
-          <input type="password" class="form-control" name="password2" id="password2">
+          <div class="form-group">
+            <label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
+            <div class="col-sm-10">
+            <input type="password" class="form-control" name="password2" id="password2">
+            </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" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
+          <div class="form-group">
+            <div class="col-sm-offset-2 col-sm-10">
+              <div class="checkbox">
+              <label><input type="checkbox" value="1" name="active" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
+              </div>
             </div>
           </div>
-        </div>
-        <div class="form-group">
-          <div class="col-sm-offset-2 col-sm-10">
-            <button class="btn btn-success" id="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+          <div class="form-group">
+            <div class="col-sm-offset-2 col-sm-10">
+              <button class="btn btn-success" id="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+            </div>
           </div>
-        </div>
-      </form>
-    <?php
+        </form>
+      <?php
+      }
+    }
+    elseif (isset($_GET['relayhost']) && is_numeric($_GET["relayhost"]) && !empty($_GET["relayhost"])) {
+        $relayhost = intval($_GET["relayhost"]);
+        $result = relayhost('details', $relayhost);
+        if (!empty($result)) {
+          ?>
+          <h4><?=$lang['edit']['resource'];?></h4>
+          <form class="form-horizontal" role="form" method="post" data-id="editrelayhost">
+            <input type="hidden" value="0" name="active">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="hostname"><?=$lang['add']['hostname'];?></label>
+              <div class="col-sm-10">
+                <input type="text" class="form-control" name="hostname" id="hostname" value="<?=htmlspecialchars($result['hostname'], ENT_QUOTES, 'UTF-8');?>" required>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="username"><?=$lang['add']['username'];?></label>
+              <div class="col-sm-10">
+                <input type="text" class="form-control" name="username" id="username" value="<?=htmlspecialchars($result['username'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="password"><?=$lang['add']['password'];?></label>
+              <div class="col-sm-10">
+                <input type="password" class="form-control" name="password" id="password" value="<?=htmlspecialchars($result['password'], ENT_QUOTES, 'UTF-8');?>">
+              </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" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editrelayhost" data-item="<?=htmlspecialchars($result['id']);?>" data-api-url='edit/relayhost' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+              </div>
+            </div>
+          </form>
+        <?php
+        }
+        else {
+        ?>
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+        <?php
+        }
+    }
+    elseif (isset($_GET['resource']) && filter_var($_GET["resource"], FILTER_VALIDATE_EMAIL) && !empty($_GET["resource"])) {
+        $resource = $_GET["resource"];
+        $result = mailbox('get', 'resource_details', $resource);
+        if (!empty($result)) {
+          ?>
+          <h4><?=$lang['edit']['resource'];?></h4>
+          <form class="form-horizontal" role="form" method="post" data-id="editresource">
+            <input type="hidden" value="0" name="active">
+            <input type="hidden" value="0" name="multiple_bookings">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="description"><?=$lang['add']['description'];?></label>
+              <div class="col-sm-10">
+                <input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description'], ENT_QUOTES, 'UTF-8');?>" required>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="domain"><?=$lang['edit']['kind'];?>:</label>
+              <div class="col-sm-10">
+                <select name="kind" id="kind" title="<?=$lang['edit']['select'];?>" required>
+                  <option value="location" <?=($result['kind'] == "location") ? "selected" : null;?>>Location</option>
+                  <option value="group" <?=($result['kind'] == "group") ? "selected" : null;?>>Group</option>
+                  <option value="thing" <?=($result['kind'] == "thing") ? "selected" : null;?>>Thing</option>
+                </select>
+              </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" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></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="multiple_bookings" <?=($result['multiple_bookings_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['multiple_bookings'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editresource" data-item="<?=htmlspecialchars($result['name']);?>" data-api-url='edit/resource' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+              </div>
+            </div>
+          </form>
+        <?php
+        }
+        else {
+        ?>
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+        <?php
+        }
     }
   }
-	elseif (isset($_GET['relayhost']) && is_numeric($_GET["relayhost"]) && !empty($_GET["relayhost"])) {
-			$relayhost = intval($_GET["relayhost"]);
-      $result = relayhost('details', $relayhost);
-      if (!empty($result)) {
+  if ($_SESSION['mailcow_cc_role'] == "admin"  || $_SESSION['mailcow_cc_role'] == "domainadmin" || $_SESSION['mailcow_cc_role'] == "user") {
+    if (isset($_GET['syncjob']) &&
+      is_numeric($_GET['syncjob'])) {
+        $id = $_GET["syncjob"];
+        $result = mailbox('get', 'syncjob_details', $id);
+        if (!empty($result)) {
         ?>
-				<h4><?=$lang['edit']['resource'];?></h4>
-				<form class="form-horizontal" role="form" method="post" data-id="editrelayhost">
-          <input type="hidden" value="0" name="active">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="hostname"><?=$lang['add']['hostname'];?></label>
-						<div class="col-sm-10">
-							<input type="text" class="form-control" name="hostname" id="hostname" value="<?=htmlspecialchars($result['hostname'], ENT_QUOTES, 'UTF-8');?>" required>
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="username"><?=$lang['add']['username'];?></label>
-						<div class="col-sm-10">
-							<input type="text" class="form-control" name="username" id="username" value="<?=htmlspecialchars($result['username'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="password"><?=$lang['add']['password'];?></label>
-						<div class="col-sm-10">
-							<input type="password" class="form-control" name="password" id="password" value="<?=htmlspecialchars($result['password'], ENT_QUOTES, 'UTF-8');?>">
-						</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" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editrelayhost" data-item="<?=htmlspecialchars($result['id']);?>" data-api-url='edit/relayhost' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-						</div>
-					</div>
-				</form>
-			<?php
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	elseif (isset($_GET['resource']) && filter_var($_GET["resource"], FILTER_VALIDATE_EMAIL) && !empty($_GET["resource"])) {
-			$resource = $_GET["resource"];
-      $result = mailbox('get', 'resource_details', $resource);
-      if (!empty($result)) {
+          <h4><?=$lang['edit']['syncjob'];?></h4>
+          <form class="form-horizontal" data-id="editsyncjob" role="form" method="post">
+            <input type="hidden" value="0" name="delete2duplicates">
+            <input type="hidden" value="0" name="delete1">
+            <input type="hidden" value="0" name="active">
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="host1"><?=$lang['edit']['hostname'];?></label>
+              <div class="col-sm-10">
+              <input type="text" class="form-control" name="host1" id="host1" value="<?=htmlspecialchars($result['host1'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="port1">Port</label>
+              <div class="col-sm-10">
+              <input type="number" class="form-control" name="port1" id="port1" min="1" max="65535" value="<?=htmlspecialchars($result['port1'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="user1"><?=$lang['edit']['username'];?></label>
+              <div class="col-sm-10">
+              <input type="text" class="form-control" name="user1" id="user1" value="<?=htmlspecialchars($result['user1'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="password1"><?=$lang['edit']['password'];?></label>
+              <div class="col-sm-10">
+              <input type="password" class="form-control" name="password1" id="password1" value="<?=htmlspecialchars($result['password1'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="enc1"><?=$lang['edit']['encryption'];?>:</label>
+              <div class="col-sm-10">
+                <select id="enc1" name="enc1">
+                  <option <?=($result['enc1'] == "TLS") ? "selected" : null;?>>TLS</option>
+                  <option <?=($result['enc1'] == "SSL") ? "selected" : null;?>>SSL</option>
+                  <option <?=($result['enc1'] == "PLAIN") ? "selected" : null;?>>PLAIN</option>
+                </select>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="mins_interval"><?=$lang['edit']['mins_interval'];?></label>
+              <div class="col-sm-10">
+                <input type="number" class="form-control" name="mins_interval" min="10" max="3600" value="<?=htmlspecialchars($result['mins_interval'], ENT_QUOTES, 'UTF-8');?>" 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="<?=htmlspecialchars($result['subfolder2'], ENT_QUOTES, 'UTF-8');?>">
+              </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" value="<?=htmlspecialchars($result['maxage'], ENT_QUOTES, 'UTF-8');?>">
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="exclude"><?=$lang['edit']['exclude'];?></label>
+              <div class="col-sm-10">
+              <input type="text" class="form-control" name="exclude" id="exclude" value="<?=htmlspecialchars($result['exclude'], ENT_QUOTES, 'UTF-8');?>">
+              </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" <?=($result['delete2duplicates']=="1") ? "checked" : "";?>> <?=$lang['edit']['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" <?=($result['delete1']=="1") ? "checked" : "";?>> <?=$lang['edit']['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" <?=($result['active_int']=="1") ? "checked" : "";?>> <?=$lang['edit']['active'];?></label>
+                </div>
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="col-sm-offset-2 col-sm-10">
+                <button class="btn btn-success" id="edit_selected" data-id="editsyncjob" data-item="<?=htmlspecialchars($result['id']);?>" data-api-url='edit/syncjob' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+              </div>
+            </div>
+          </form>
+        <?php
+        }
+        else {
         ?>
-				<h4><?=$lang['edit']['resource'];?></h4>
-				<form class="form-horizontal" role="form" method="post" data-id="editresource">
-          <input type="hidden" value="0" name="active">
-          <input type="hidden" value="0" name="multiple_bookings">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="description"><?=$lang['add']['description'];?></label>
-						<div class="col-sm-10">
-							<input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description'], ENT_QUOTES, 'UTF-8');?>" required>
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="domain"><?=$lang['edit']['kind'];?>:</label>
-						<div class="col-sm-10">
-							<select name="kind" id="kind" title="<?=$lang['edit']['select'];?>" required>
-								<option value="location" <?=($result['kind'] == "location") ? "selected" : null;?>>Location</option>
-								<option value="group" <?=($result['kind'] == "group") ? "selected" : null;?>>Group</option>
-								<option value="thing" <?=($result['kind'] == "thing") ? "selected" : null;?>>Thing</option>
-							</select>
-						</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" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></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="multiple_bookings" <?=($result['multiple_bookings_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['multiple_bookings'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editresource" data-item="<?=htmlspecialchars($result['name']);?>" data-api-url='edit/resource' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-						</div>
-					</div>
-				</form>
-			<?php
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	else {
-	?>
-		<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-	<?php
-	}
-}
-elseif (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user")) {
-	if (isset($_GET['syncjob']) &&
-    is_numeric($_GET['syncjob'])) {
-			$id = $_GET["syncjob"];
-      $result = mailbox('get', 'syncjob_details', $id);
-      if (!empty($result)) {
-			?>
-				<h4><?=$lang['edit']['syncjob'];?></h4>
-				<form class="form-horizontal" data-id="editsyncjob" role="form" method="post">
-          <input type="hidden" value="0" name="delete2duplicates">
-          <input type="hidden" value="0" name="delete1">
-          <input type="hidden" value="0" name="active">
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="host1"><?=$lang['edit']['hostname'];?></label>
-						<div class="col-sm-10">
-						<input type="text" class="form-control" name="host1" id="host1" value="<?=htmlspecialchars($result['host1'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="port1">Port</label>
-						<div class="col-sm-10">
-						<input type="number" class="form-control" name="port1" id="port1" min="1" max="65535" value="<?=htmlspecialchars($result['port1'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="user1"><?=$lang['edit']['username'];?></label>
-						<div class="col-sm-10">
-						<input type="text" class="form-control" name="user1" id="user1" value="<?=htmlspecialchars($result['user1'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="password1"><?=$lang['edit']['password'];?></label>
-						<div class="col-sm-10">
-						<input type="password" class="form-control" name="password1" id="password1" value="<?=htmlspecialchars($result['password1'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="enc1"><?=$lang['edit']['encryption'];?>:</label>
-						<div class="col-sm-10">
-							<select id="enc1" name="enc1">
-								<option <?=($result['enc1'] == "TLS") ? "selected" : null;?>>TLS</option>
-								<option <?=($result['enc1'] == "SSL") ? "selected" : null;?>>SSL</option>
-								<option <?=($result['enc1'] == "PLAIN") ? "selected" : null;?>>PLAIN</option>
-							</select>
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="mins_interval"><?=$lang['edit']['mins_interval'];?></label>
-						<div class="col-sm-10">
-              <input type="number" class="form-control" name="mins_interval" min="10" max="3600" value="<?=htmlspecialchars($result['mins_interval'], ENT_QUOTES, 'UTF-8');?>" 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="<?=htmlspecialchars($result['subfolder2'], ENT_QUOTES, 'UTF-8');?>">
-						</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" value="<?=htmlspecialchars($result['maxage'], ENT_QUOTES, 'UTF-8');?>">
-						</div>
-					</div>
-					<div class="form-group">
-						<label class="control-label col-sm-2" for="exclude"><?=$lang['edit']['exclude'];?></label>
-						<div class="col-sm-10">
-						<input type="text" class="form-control" name="exclude" id="exclude" value="<?=htmlspecialchars($result['exclude'], ENT_QUOTES, 'UTF-8');?>">
-						</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" <?=($result['delete2duplicates']=="1") ? "checked" : "";?>> <?=$lang['edit']['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" <?=($result['delete1']=="1") ? "checked" : "";?>> <?=$lang['edit']['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" <?=($result['active']=="1") ? "checked" : "";?>> <?=$lang['edit']['active'];?></label>
-							</div>
-						</div>
-					</div>
-					<div class="form-group">
-						<div class="col-sm-offset-2 col-sm-10">
-              <button class="btn btn-success" id="edit_selected" data-id="editsyncjob" data-item="<?=htmlspecialchars($result['id']);?>" data-api-url='edit/syncjob' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
-						</div>
-					</div>
-				</form>
-			<?php
-			}
-			else {
-			?>
-				<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-			<?php
-			}
-	}
-	else {
-	?>
-		<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
-	<?php
-	}
+          <div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
+        <?php
+        }
+      }
+  }
 }
 else {
 ?>
diff --git a/data/web/inc/footer.inc.php b/data/web/inc/footer.inc.php
index 8daaff79..2650bb9f 100644
--- a/data/web/inc/footer.inc.php
+++ b/data/web/inc/footer.inc.php
@@ -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>
diff --git a/data/web/inc/functions.fail2ban.inc.php b/data/web/inc/functions.fail2ban.inc.php
index c9644d5f..44e4e5b4 100644
--- a/data/web/inc/functions.fail2ban.inc.php
+++ b/data/web/inc/functions.fail2ban.inc.php
@@ -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'] = "";
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 3f302783..af46b6dc 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -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(
diff --git a/data/web/inc/sessions.inc.php b/data/web/inc/sessions.inc.php
index 949f9ab6..2dbc8fff 100644
--- a/data/web/inc/sessions.inc.php
+++ b/data/web/inc/sessions.inc.php
@@ -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() {
diff --git a/data/web/inc/triggers.inc.php b/data/web/inc/triggers.inc.php
index 34c1e14f..b91acd93 100644
--- a/data/web/inc/triggers.inc.php
+++ b/data/web/inc/triggers.inc.php
@@ -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);
diff --git a/data/web/js/admin.js b/data/web/js/admin.js
index fb255437..4b569adc 100644
--- a/data/web/js/admin.js
+++ b/data/web/js/admin.js
@@ -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");
     }
   });
-});
\ No newline at end of file
+});
+
+$(window).on('resize', function(){
+  on_resize_width = $("#sidebar-admin").width();
+  $("#scrollbox").removeAttr("style");
+  $("#scrollbox").css("width", on_resize_width);
+});
diff --git a/data/web/js/api.js b/data/web/js/api.js
index 1fd962fb..78d111c0 100644
--- a/data/web/js/api.js
+++ b/data/web/js/api.js
@@ -141,6 +141,7 @@ $(document).ready(function() {
         return false;
       }
     }
+    // alert(JSON.stringify(api_attr));
     $.ajax({
       type: "POST",
       dataType: "json",
diff --git a/data/web/js/bootstrap-filestyle.min.js b/data/web/js/bootstrap-filestyle.min.js
new file mode 100644
index 00000000..9885a1dc
--- /dev/null
+++ b/data/web/js/bootstrap-filestyle.min.js
@@ -0,0 +1 @@
+(function($){var nextId=0;var Filestyle=function(element,options){this.options=options;this.$elementFilestyle=[];this.$element=$(element)};Filestyle.prototype={clear:function(){this.$element.val("");this.$elementFilestyle.find(":text").val("");this.$elementFilestyle.find(".badge").remove()},destroy:function(){this.$element.removeAttr("style").removeData("filestyle");this.$elementFilestyle.remove()},disabled:function(value){if(value===true){if(!this.options.disabled){this.$element.attr("disabled","true");this.$elementFilestyle.find("label").attr("disabled","true");this.options.disabled=true}}else{if(value===false){if(this.options.disabled){this.$element.removeAttr("disabled");this.$elementFilestyle.find("label").removeAttr("disabled");this.options.disabled=false}}else{return this.options.disabled}}},buttonBefore:function(value){if(value===true){if(!this.options.buttonBefore){this.options.buttonBefore=true;if(this.options.input){this.$elementFilestyle.remove();this.constructor();this.pushNameFiles()}}}else{if(value===false){if(this.options.buttonBefore){this.options.buttonBefore=false;if(this.options.input){this.$elementFilestyle.remove();this.constructor();this.pushNameFiles()}}}else{return this.options.buttonBefore}}},icon:function(value){if(value===true){if(!this.options.icon){this.options.icon=true;this.$elementFilestyle.find("label").prepend(this.htmlIcon())}}else{if(value===false){if(this.options.icon){this.options.icon=false;this.$elementFilestyle.find(".icon-span-filestyle").remove()}}else{return this.options.icon}}},input:function(value){if(value===true){if(!this.options.input){this.options.input=true;if(this.options.buttonBefore){this.$elementFilestyle.append(this.htmlInput())}else{this.$elementFilestyle.prepend(this.htmlInput())}this.$elementFilestyle.find(".badge").remove();this.pushNameFiles();this.$elementFilestyle.find(".group-span-filestyle").addClass("input-group-btn")}}else{if(value===false){if(this.options.input){this.options.input=false;this.$elementFilestyle.find(":text").remove();var files=this.pushNameFiles();if(files.length>0&&this.options.badge){this.$elementFilestyle.find("label").append(' <span class="badge">'+files.length+"</span>")}this.$elementFilestyle.find(".group-span-filestyle").removeClass("input-group-btn")}}else{return this.options.input}}},size:function(value){if(value!==undefined){var btn=this.$elementFilestyle.find("label"),input=this.$elementFilestyle.find("input");btn.removeClass("btn-lg btn-sm");input.removeClass("input-lg input-sm");if(value!="nr"){btn.addClass("btn-"+value);input.addClass("input-"+value)}}else{return this.options.size}},placeholder:function(value){if(value!==undefined){this.options.placeholder=value;this.$elementFilestyle.find("input").attr("placeholder",value)}else{return this.options.placeholder}},buttonText:function(value){if(value!==undefined){this.options.buttonText=value;this.$elementFilestyle.find("label .buttonText").html(this.options.buttonText)}else{return this.options.buttonText}},buttonName:function(value){if(value!==undefined){this.options.buttonName=value;this.$elementFilestyle.find("label").attr({"class":"btn "+this.options.buttonName})}else{return this.options.buttonName}},iconName:function(value){if(value!==undefined){this.$elementFilestyle.find(".icon-span-filestyle").attr({"class":"icon-span-filestyle "+this.options.iconName})}else{return this.options.iconName}},htmlIcon:function(){if(this.options.icon){return'<span class="icon-span-filestyle '+this.options.iconName+'"></span> '}else{return""}},htmlInput:function(){if(this.options.input){return'<input type="text" class="form-control '+(this.options.size=="nr"?"":"input-"+this.options.size)+'" placeholder="'+this.options.placeholder+'" disabled> '}else{return""}},pushNameFiles:function(){var content="",files=[];if(this.$element[0].files===undefined){files[0]={name:this.$element[0]&&this.$element[0].value}}else{files=this.$element[0].files}for(var i=0;i<files.length;i++){content+=files[i].name.split("\\").pop()+", "}if(content!==""){this.$elementFilestyle.find(":text").val(content.replace(/\, $/g,""))}else{this.$elementFilestyle.find(":text").val("")}return files},constructor:function(){var _self=this,html="",id=_self.$element.attr("id"),files=[],btn="",$label;if(id===""||!id){id="filestyle-"+nextId;_self.$element.attr({id:id});nextId++}btn='<span class="group-span-filestyle '+(_self.options.input?"input-group-btn":"")+'"><label for="'+id+'" class="btn '+_self.options.buttonName+" "+(_self.options.size=="nr"?"":"btn-"+_self.options.size)+'" '+(_self.options.disabled?'disabled="true"':"")+">"+_self.htmlIcon()+'<span class="buttonText">'+_self.options.buttonText+"</span></label></span>";html=_self.options.buttonBefore?btn+_self.htmlInput():_self.htmlInput()+btn;_self.$elementFilestyle=$('<div class="bootstrap-filestyle input-group">'+html+"</div>");_self.$elementFilestyle.find(".group-span-filestyle").attr("tabindex","0").keypress(function(e){if(e.keyCode===13||e.charCode===32){_self.$elementFilestyle.find("label").click();return false}});_self.$element.css({position:"absolute",clip:"rect(0px 0px 0px 0px)"}).attr("tabindex","-1").after(_self.$elementFilestyle);if(_self.options.disabled){_self.$element.attr("disabled","true")}_self.$element.change(function(){var files=_self.pushNameFiles();if(_self.options.input==false&&_self.options.badge){if(_self.$elementFilestyle.find(".badge").length==0){_self.$elementFilestyle.find("label").append(' <span class="badge">'+files.length+"</span>")}else{if(files.length==0){_self.$elementFilestyle.find(".badge").remove()}else{_self.$elementFilestyle.find(".badge").html(files.length)}}}else{_self.$elementFilestyle.find(".badge").remove()}});if(window.navigator.userAgent.search(/firefox/i)>-1){_self.$elementFilestyle.find("label").click(function(){_self.$element.click();return false})}}};var old=$.fn.filestyle;$.fn.filestyle=function(option,value){var get="",element=this.each(function(){if($(this).attr("type")==="file"){var $this=$(this),data=$this.data("filestyle"),options=$.extend({},$.fn.filestyle.defaults,option,typeof option==="object"&&option);if(!data){$this.data("filestyle",(data=new Filestyle(this,options)));data.constructor()}if(typeof option==="string"){get=data[option](value)}}});if(typeof get!==undefined){return get}else{return element}};$.fn.filestyle.defaults={buttonText:"Choose file",iconName:"glyphicon glyphicon-folder-open",buttonName:"btn-default",size:"nr",input:true,badge:true,icon:true,buttonBefore:false,disabled:false,placeholder:""};$.fn.filestyle.noConflict=function(){$.fn.filestyle=old;return this};$(function(){$(".filestyle").each(function(){var $this=$(this),options={input:$this.attr("data-input")==="false"?false:true,icon:$this.attr("data-icon")==="false"?false:true,buttonBefore:$this.attr("data-buttonBefore")==="true"?true:false,disabled:$this.attr("data-disabled")==="true"?true:false,size:$this.attr("data-size"),buttonText:$this.attr("data-buttonText"),buttonName:$this.attr("data-buttonName"),iconName:$this.attr("data-iconName"),badge:$this.attr("data-badge")==="false"?false:true,placeholder:$this.attr("data-placeholder")};$this.filestyle(options)})})})(window.jQuery);
\ No newline at end of file
diff --git a/data/web/js/mailbox.js b/data/web/js/mailbox.js
index a2c0c172..1347d8a6 100644
--- a/data/web/js/mailbox.js
+++ b/data/web/js/mailbox.js
@@ -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 = {
+  '&': '&amp;',
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&quot;',
+  "'": '&#39;',
+  '/': '&#x2F;',
+  '`': '&#x60;',
+  '=': '&#x3D;'
+  };
+  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();
 });
\ No newline at end of file
diff --git a/data/web/js/user.js b/data/web/js/user.js
index 4c6e60b1..e448b5c9 100644
--- a/data/web/js/user.js
+++ b/data/web/js/user.js
@@ -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>' +
diff --git a/data/web/json_api.php b/data/web/json_api.php
index a97c20f5..b7acb724 100644
--- a/data/web/json_api.php
+++ b/data/web/json_api.php
@@ -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 '{}';
                 }
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index 7a2378cf..63af5175 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -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';
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 9c28de7b..11c1c045 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -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';
 
diff --git a/data/web/mailbox.php b/data/web/mailbox.php
index 0260aa6b..0325e7f7 100644
--- a/data/web/mailbox.php
+++ b/data/web/mailbox.php
@@ -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 -->
diff --git a/data/web/modals/mailbox.php b/data/web/modals/mailbox.php
index 985eaa71..c74e1dff 100644
--- a/data/web/modals/mailbox.php
+++ b/data/web/modals/mailbox.php
@@ -31,7 +31,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
               ?>
               </select>
             </div>
-          </div> 
+          </div>
           <div class="form-group">
             <label class="control-label col-sm-2" for="name"><?=$lang['add']['full_name'];?></label>
             <div class="col-sm-10">
@@ -301,4 +301,132 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
       </div>
     </div>
   </div>
-</div><!-- add domain alias modal -->
\ No newline at end of file
+</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 -->
\ No newline at end of file
diff --git a/data/web/modals/user.php b/data/web/modals/user.php
index 4a5c9a98..3e2a8d12 100644
--- a/data/web/modals/user.php
+++ b/data/web/modals/user.php
@@ -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 -->
\ No newline at end of file
diff --git a/data/web/user.php b/data/web/user.php
index b283894c..0eeafb81 100644
--- a/data/web/user.php
+++ b/data/web/user.php
@@ -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>
-
-<?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><!-- /container -->
 <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>