浏览代码

[Web] Do not use hard-coded params in imapsync jobs
[Web] Allow custom parameters in imapsync

André 7 年之前
父节点
当前提交
6f656c39b4

+ 4 - 0
data/web/css/mailbox.css

@@ -41,3 +41,7 @@ table.footable>tbody>tr.footable-empty>td {
 .table-lines {
   vertical-align: inherit;
 }
+#logText {
+  font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
+  font-size:smaller;
+}

+ 34 - 6
data/web/edit.php

@@ -733,6 +733,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
             <input type="hidden" value="0" name="automap">
             <input type="hidden" value="0" name="skipcrossduplicates">
             <input type="hidden" value="0" name="active">
+            <input type="hidden" value="0" name="subscribeall">
             <div class="form-group">
               <label class="control-label col-sm-2" for="host1"><?=$lang['edit']['hostname'];?></label>
               <div class="col-sm-10">
@@ -771,7 +772,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
               <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="1" max="3600" value="<?=htmlspecialchars($result['mins_interval'], ENT_QUOTES, 'UTF-8');?>" required>
-                <small class="help-block">10-3600</small>
+                <small class="help-block">1-3600</small>
               </div>
             </div>
             <div class="form-group">
@@ -794,44 +795,71 @@ if (isset($_SESSION['mailcow_cc_role'])) {
               <small class="help-block">0-125000000</small>
               </div>
             </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="timeout1"><?=$lang['add']['timeout1'];?></label>
+              <div class="col-sm-10">
+              <input type="number" class="form-control" name="timeout1" id="timeout1" min="1" max="32000" value="<?=htmlspecialchars($result['timeout1'], ENT_QUOTES, 'UTF-8');?>">
+              <small class="help-block">1-32000</small>
+              </div>
+            </div>
+            <div class="form-group">
+              <label class="control-label col-sm-2" for="timeout2"><?=$lang['add']['timeout2'];?></label>
+              <div class="col-sm-10">
+              <input type="number" class="form-control" name="timeout2" id="timeout2" min="1" max="32000" value="<?=htmlspecialchars($result['timeout2'], ENT_QUOTES, 'UTF-8');?>">
+              <small class="help-block">1-32000</small>
+              </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">
+              <label class="control-label col-sm-2" for="custom_params"><?=$lang['add']['custom_params'];?></label>
+              <div class="col-sm-10">
+              <input type="text" class="form-control" name="custom_params" id="custom_params" value="<?=htmlspecialchars($result['custom_params'], 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'];?> (--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="delete2duplicates" <?=($result['delete2duplicates']=="1") ? "checked" : "";?>> <?=$lang['edit']['delete2duplicates'];?></label>
+                <label><input type="checkbox" value="1" name="delete1" <?=($result['delete1']=="1") ? "checked" : "";?>> <?=$lang['edit']['delete1'];?> (--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="delete1" <?=($result['delete1']=="1") ? "checked" : "";?>> <?=$lang['edit']['delete1'];?></label>
+                <label><input type="checkbox" value="1" name="delete2" <?=($result['delete2']=="1") ? "checked" : "";?>> <?=$lang['edit']['delete2'];?> (--delete2)</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="delete2" <?=($result['delete2']=="1") ? "checked" : "";?>> <?=$lang['edit']['delete2'];?></label>
+                <label><input type="checkbox" value="1" name="automap" <?=($result['automap']=="1") ? "checked" : "";?>> <?=$lang['edit']['automap'];?> (--automap)</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="automap" <?=($result['automap']=="1") ? "checked" : "";?>> <?=$lang['edit']['automap'];?></label>
+                <label><input type="checkbox" value="1" name="skipcrossduplicates" <?=($result['skipcrossduplicates']=="1") ? "checked" : "";?>> <?=$lang['edit']['skipcrossduplicates'];?> (--skipcrossduplicates)</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="skipcrossduplicates" <?=($result['skipcrossduplicates']=="1") ? "checked" : "";?>> <?=$lang['edit']['skipcrossduplicates'];?></label>
+                <label><input type="checkbox" value="1" name="subscribeall" <?=($result['subscribeall']=="1") ? "checked" : "";?>> <?=$lang['add']['subscribeall'];?> (--subscribeall)</label>
                 </div>
               </div>
             </div>

+ 38 - 6
data/web/inc/functions.mailbox.inc.php

@@ -211,10 +211,13 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
             );
             return false;
           }
-          $active  = intval($_data['active']);
+          $active               = intval($_data['active']);
+          $subscribeall         = intval($_data['subscribeall']);
           $delete2duplicates    = intval($_data['delete2duplicates']);
           $delete1              = intval($_data['delete1']);
           $delete2              = intval($_data['delete2']);
+          $timeout1             = intval($_data['timeout1']);
+          $timeout2             = intval($_data['timeout2']);
           $skipcrossduplicates  = intval($_data['skipcrossduplicates']);
           $automap              = intval($_data['automap']);
           $port1                = $_data['port1'];
@@ -226,13 +229,20 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
           $subfolder2           = $_data['subfolder2'];
           $user1                = $_data['user1'];
           $mins_interval        = $_data['mins_interval'];
-          $enc1                = $_data['enc1'];
+          $enc1                 = $_data['enc1'];
+          $custom_params        = (empty(trim($_data['custom_params']))) ? '' : trim($_data['custom_params']);
           if (empty($subfolder2)) {
             $subfolder2 = "";
           }
-          if (!isset($maxage) || !filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32767)))) {
+          if (!isset($maxage) || !filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
             $maxage = "0";
           }
+          if (!isset($timeout1) || !filter_var($timeout1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
+            $timeout1 = "600";
+          }
+          if (!isset($timeout2) || !filter_var($timeout2, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
+            $timeout2 = "600";
+          }
           if (!isset($maxbytespersecond) || !filter_var($maxbytespersecond, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 125000000)))) {
             $maxbytespersecond = "0";
           }
@@ -292,17 +302,21 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
             return false;
           }
           try {
-            $stmt = $pdo->prepare("INSERT INTO `imapsync` (`user2`, `exclude`, `delete1`, `delete2`, `automap`, `skipcrossduplicates`, `maxbytespersecond`, `maxage`, `subfolder2`, `host1`, `authmech1`, `user1`, `password1`, `mins_interval`, `port1`, `enc1`, `delete2duplicates`, `active`)
-              VALUES (:user2, :exclude, :delete1, :delete2, :automap, :skipcrossduplicates, :maxbytespersecond, :maxage, :subfolder2, :host1, :authmech1, :user1, :password1, :mins_interval, :port1, :enc1, :delete2duplicates, :active)");
+            $stmt = $pdo->prepare("INSERT INTO `imapsync` (`user2`, `exclude`, `delete1`, `delete2`, `timeout1`, `timeout2`, `automap`, `skipcrossduplicates`, `maxbytespersecond`, `subscribeall`, `maxage`, `subfolder2`, `host1`, `authmech1`, `user1`, `password1`, `mins_interval`, `port1`, `enc1`, `delete2duplicates`, `custom_params`, `active`)
+              VALUES (:user2, :exclude, :delete1, :delete2, :timeout1, :timeout2, :automap, :skipcrossduplicates, :maxbytespersecond, :subscribeall, :maxage, :subfolder2, :host1, :authmech1, :user1, :password1, :mins_interval, :port1, :enc1, :delete2duplicates, :custom_params, :active)");
             $stmt->execute(array(
               ':user2' => $username,
+              ':custom_params' => $custom_params,
               ':exclude' => $exclude,
               ':maxage' => $maxage,
               ':delete1' => $delete1,
               ':delete2' => $delete2,
+              ':timeout1' => $timeout1,
+              ':timeout2' => $timeout2,
               ':automap' => $automap,
               ':skipcrossduplicates' => $skipcrossduplicates,
               ':maxbytespersecond' => $maxbytespersecond,
+              ':subscribeall' => $subscribeall,
               ':subfolder2' => $subfolder2,
               ':host1' => $host1,
               ':authmech1' => 'PLAIN',
@@ -1458,6 +1472,7 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
               $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
               $last_run = (isset($_data['last_run'])) ? NULL : $is_now['last_run'];
               $delete2duplicates = (isset($_data['delete2duplicates'])) ? intval($_data['delete2duplicates']) : $is_now['delete2duplicates'];
+              $subscribeall = (isset($_data['subscribeall'])) ? intval($_data['subscribeall']) : $is_now['subscribeall'];
               $delete1 = (isset($_data['delete1'])) ? intval($_data['delete1']) : $is_now['delete1'];
               $delete2 = (isset($_data['delete2'])) ? intval($_data['delete2']) : $is_now['delete2'];
               $automap = (isset($_data['automap'])) ? intval($_data['automap']) : $is_now['automap'];
@@ -1469,8 +1484,11 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
               $enc1 = (!empty($_data['enc1'])) ? $_data['enc1'] : $is_now['enc1'];
               $mins_interval = (!empty($_data['mins_interval'])) ? $_data['mins_interval'] : $is_now['mins_interval'];
               $exclude = (isset($_data['exclude'])) ? $_data['exclude'] : $is_now['exclude'];
+              $custom_params = (isset($_data['custom_params'])) ? $_data['custom_params'] : $is_now['custom_params'];
               $maxage = (isset($_data['maxage']) && $_data['maxage'] != "") ? intval($_data['maxage']) : $is_now['maxage'];
               $maxbytespersecond = (isset($_data['maxbytespersecond']) && $_data['maxbytespersecond'] != "") ? intval($_data['maxbytespersecond']) : $is_now['maxbytespersecond'];
+              $timeout1 = (isset($_data['timeout1']) && $_data['timeout1'] != "") ? intval($_data['timeout1']) : $is_now['timeout1'];
+              $timeout2 = (isset($_data['timeout2']) && $_data['timeout2'] != "") ? intval($_data['timeout2']) : $is_now['timeout2'];
             }
             else {
               $_SESSION['return'] = array(
@@ -1482,9 +1500,15 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
             if (empty($subfolder2)) {
               $subfolder2 = "";
             }
-            if (!isset($maxage) || !filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32767)))) {
+            if (!isset($maxage) || !filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
               $maxage = "0";
             }
+            if (!isset($timeout1) || !filter_var($timeout1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
+              $timeout1 = "600";
+            }
+            if (!isset($timeout2) || !filter_var($timeout2, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 32000)))) {
+              $timeout2 = "600";
+            }
             if (!isset($maxbytespersecond) || !filter_var($maxbytespersecond, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 125000000)))) {
               $maxbytespersecond = "0";
             }
@@ -1540,6 +1564,10 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
                 `port1` = :port1,
                 `enc1` = :enc1,
                 `delete2duplicates` = :delete2duplicates,
+                `custom_params` = :custom_params,
+                `timeout1` = :timeout1,
+                `timeout2` = :timeout2,
+                `subscribeall` = :subscribeall,
                 `active` = :active
                   WHERE `id` = :id");
               $stmt->execute(array(
@@ -1560,6 +1588,10 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
                 ':port1' => $port1,
                 ':enc1' => $enc1,
                 ':delete2duplicates' => $delete2duplicates,
+                ':custom_params' => $custom_params,
+                ':timeout1' => $timeout1,
+                ':timeout2' => $timeout2,
+                ':subscribeall' => $subscribeall,
                 ':active' => $active,
               ));
             }

+ 2 - 2
data/web/inc/header.inc.php

@@ -130,11 +130,11 @@
         }
         if (!isset($_SESSION['dual-login']) && isset($_SESSION['mailcow_cc_username'])):
         ?>
-          <li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?></b> <span class="glyphicon glyphicon-log-out"></span></a></li>
+          <li class="logged-in-as"><a href="#" onclick="logout.submit()"><b class="username-lia"><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?></b> <span class="glyphicon glyphicon-log-out"></span></a></li>
         <?php
         elseif (isset($_SESSION['dual-login'])):
         ?>
-          <li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?> <span class="text-info">(<?= htmlspecialchars($_SESSION['dual-login']['username']); ?>)</span> </b><span class="glyphicon glyphicon-log-out"></span></a></li>
+          <li class="logged-in-as"><a href="#" onclick="logout.submit()"><b class="username-lia"><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?> <span class="text-info">(<?= htmlspecialchars($_SESSION['dual-login']['username']); ?>)</span> </b><span class="glyphicon glyphicon-log-out"></span></a></li>
         <?php
         endif;
         ?>

+ 5 - 1
data/web/inc/init_db.inc.php

@@ -3,7 +3,7 @@ function init_db_schema() {
   try {
     global $pdo;
 
-    $db_version = "04072018_2119";
+    $db_version = "25072018_1129";
 
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -417,6 +417,10 @@ function init_db_schema() {
           "delete2" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "automap" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "skipcrossduplicates" => "TINYINT(1) NOT NULL DEFAULT '0'",
+          "custom_params" => "VARCHAR(512) NOT NULL DEFAULT ''",
+          "timeout1" => "SMALLINT NOT NULL DEFAULT '600'",
+          "timeout2" => "SMALLINT NOT NULL DEFAULT '600'",
+          "subscribeall" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "is_running" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "returned_text" => "MEDIUMTEXT",
           "last_run" => "TIMESTAMP NULL DEFAULT NULL",

+ 3 - 3
data/web/js/api.js

@@ -80,11 +80,11 @@ $(document).ready(function() {
     // If clicked element #edit_selected is in a form with the same data-id as the button,
     // we merge all input fields by {"name":"value"} into api-attr
     if ($(this).closest("form").data('id') == id) {
-      var req_empty = false;
+      var invalid = false;
       $(this).closest("form").find('select, textarea, input').each(function() {
         if ($(this).prop('required')) {
           if (!$(this).val() && $(this).prop('disabled') === false) {
-            req_empty = true;
+            invalid = true;
             $(this).addClass('inputMissingAttr');
           } else {
             $(this).removeClass('inputMissingAttr');
@@ -106,7 +106,7 @@ $(document).ready(function() {
           }
         }
       });
-      if (!req_empty) {
+      if (!invalid) {
         var attr_to_merge = $(this).closest("form").serializeObject();
         var api_attr = $.extend(api_attr, attr_to_merge)
       } else {

+ 12 - 12
data/web/js/mailbox.js

@@ -233,7 +233,7 @@ jQuery(function($){
       ft_paging.goto(parseInt(current_page[name]))
     }
   }
-  function table_mailbox_paging(ft, name) {
+  function paging_mailbox_after(ft, name) {
     var ft_paging = ft.use(FooTable.Paging)
     current_page[name] = ft_paging.current;
     localStorage.setItem('current_page', JSON.stringify(current_page));
@@ -306,7 +306,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'domain_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'domain_table');
+          paging_mailbox_after(ft, 'domain_table');
         }
       }
     });
@@ -392,7 +392,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'mailbox_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'mailbox_table');
+          paging_mailbox_after(ft, 'mailbox_table');
         }
       }
     });
@@ -457,7 +457,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'resource_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'resource_table');
+          paging_mailbox_after(ft, 'resource_table');
         }
       }
     });
@@ -519,7 +519,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'bcc_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'bcc_table');
+          paging_mailbox_after(ft, 'bcc_table');
         }
       }
     });
@@ -576,7 +576,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'recipient_map_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'recipient_map_table');
+          paging_mailbox_after(ft, 'recipient_map_table');
         }
       }
     });
@@ -645,7 +645,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'alias_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'alias_table');
+          paging_mailbox_after(ft, 'alias_table');
         }
       }
     });
@@ -699,7 +699,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'aliasdomain_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'aliasdomain_table');
+          paging_mailbox_after(ft, 'aliasdomain_table');
         }
       }
     });
@@ -711,10 +711,10 @@ jQuery(function($){
         {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px","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":"server_w_port","title":"Server","breakpoints":"xs","style":{"word-break":"break-all"}},
         {"name":"exclude","title":lang.excludes,"breakpoints":"all"},
         {"name":"mins_interval","title":lang.mins_interval,"breakpoints":"all"},
-        {"name":"last_run","title":lang.last_run,"breakpoints":"all"},
+        {"name":"last_run","title":lang.last_run,"breakpoints":"sm"},
         {"name":"log","title":"Log"},
         {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active},
         {"name":"is_running","filterable": false,"style":{"maxWidth":"120px","width":"100px"},"title":lang.status},
@@ -774,7 +774,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'sync_job_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'sync_job_table');
+          paging_mailbox_after(ft, 'sync_job_table');
         }
       }
     });
@@ -837,7 +837,7 @@ jQuery(function($){
           table_mailbox_ready(ft, 'filter_table');
         },
         "after.ft.paging": function(e, ft){
-          table_mailbox_paging(ft, 'filter_table');
+          paging_mailbox_after(ft, 'filter_table');
         }
       }
     });

+ 5 - 0
data/web/lang/lang.de.php

@@ -300,6 +300,11 @@ $lang['add']['exclude'] = 'Elemente ausschließen (Regex)';
 $lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
 $lang['add']['delete1'] = 'Lösche Nachricht nach Übertragung vom Quell-Server';
 $lang['add']['delete2'] = 'Lösche Nachrichten von Ziel-Server, die nicht auf Quell-Server vorhanden sind';
+$lang['add']['custom_params'] = 'Eigene Parameter';
+$lang['add']['subscribeall'] = 'Alle synchronisierten Ordner abonnieren';
+$lang['add']['timeout1'] = 'Timeout für Verbindung zum Remote-Host';
+$lang['add']['timeout2'] = 'Timeout für Verbindung zum lokalen Host';
+
 $lang['edit']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
 $lang['edit']['delete1'] = 'Lösche Nachricht nach Übertragung vom Quell-Server';
 $lang['edit']['delete2'] = 'Lösche Nachrichten von Ziel-Server, die nicht auf Quell-Server vorhanden sind';

+ 7 - 1
data/web/lang/lang.en.php

@@ -251,7 +251,7 @@ $lang['edit']['redirect_uri'] = 'Redirect/Callback URL';
 $lang['edit']['hostname'] = 'Hostname';
 $lang['edit']['encryption'] = 'Encryption';
 $lang['edit']['maxage'] = 'Maximum age of messages in days that will be polled from remote<br><small>(0 = ignore age)</small>';
-$lang['edit']['maxbytespersecond'] = 'Max. bytes per second (0 equals to unlimited)';
+$lang['edit']['maxbytespersecond'] = 'Max. bytes per second <br><small>(0 = unlimited)</small>';
 $lang['edit']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
 $lang['edit']['skipcrossduplicates'] = 'Skip duplicate messages across folders (first come, first serve)';
 $lang['add']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
@@ -260,6 +260,7 @@ $lang['edit']['subfolder2'] = 'Sync into subfolder on destination<br><small>(emp
 $lang['edit']['mins_interval'] = 'Interval (min)';
 $lang['edit']['exclude'] = 'Exclude objects (regex)';
 $lang['edit']['save'] = 'Save changes';
+$lang['edit']['username'] = 'Username';
 $lang['edit']['max_mailboxes'] = 'Max. possible mailboxes';
 $lang['edit']['title'] = 'Edit object';
 $lang['edit']['target_address'] = 'Goto address/es <small>(comma-separated)</small>';
@@ -304,6 +305,11 @@ $lang['add']['exclude'] = 'Exclude objects (regex)';
 $lang['add']['delete2duplicates'] = 'Delete duplicates on destination';
 $lang['add']['delete1'] = 'Delete from source when completed';
 $lang['add']['delete2'] = 'Delete messages on destination that are not on source';
+$lang['add']['custom_params'] = 'Custom parameters';
+$lang['add']['subscribeall'] = 'Subscribe all folders';
+$lang['add']['timeout1'] = 'Timeout for connection to remote host';
+$lang['add']['timeout2'] = 'Timeout for connection to local host';
+
 $lang['edit']['delete2duplicates'] = 'Delete duplicates on destination';
 $lang['edit']['delete1'] = 'Delete from source when completed';
 $lang['edit']['delete2'] = 'Delete messages on destination that are not on source';

+ 33 - 6
data/web/modals/mailbox.php

@@ -383,7 +383,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
 						<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="1" max="3600" value="20" required>
-              <small class="help-block">10-3600</small>
+              <small class="help-block">1-3600</small>
 						</div>
 					</div>
 					<div class="form-group">
@@ -406,44 +406,71 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
             <small class="help-block">0-125000000</small>
 						</div>
 					</div>
+					<div class="form-group">
+						<label class="control-label col-sm-2" for="timeout1"><?=$lang['edit']['timeout1'];?></label>
+						<div class="col-sm-10">
+						<input type="number" class="form-control" name="timeout1" id="timeout1" min="1" max="32000" value="600">
+            <small class="help-block">1-32000</small>
+						</div>
+					</div>
+          <div class="form-group">
+						<label class="control-label col-sm-2" for="timeout2"><?=$lang['edit']['timeout2'];?></label>
+						<div class="col-sm-10">
+						<input type="number" class="form-control" name="timeout2" id="timeout2" min="1" max="32000" value="600">
+            <small class="help-block">1-32000</small>
+						</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">
+						<label class="control-label col-sm-2" for="custom_params"><?=$lang['add']['custom_params'];?></label>
+						<div class="col-sm-10">
+						<input type="text" class="form-control" name="custom_params" id="custom_params" placeholder="--delete2folders --otheroption">
+						</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>
+							<label><input type="checkbox" value="1" name="delete2duplicates" checked> <?=$lang['add']['delete2duplicates'];?> (--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>
+							<label><input type="checkbox" value="1" name="delete1"> <?=$lang['add']['delete1'];?> (--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="delete2"> <?=$lang['add']['delete2'];?> (--delete2)</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="delete2"> <?=$lang['add']['delete2'];?></label>
+							<label><input type="checkbox" value="1" name="automap" checked> <?=$lang['add']['automap'];?> (--automap)</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="automap"> <?=$lang['add']['automap'];?></label>
+							<label><input type="checkbox" value="1" name="skipcrossduplicates"> <?=$lang['add']['skipcrossduplicates'];?> (--skipcrossduplicates)</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="skipcrossduplicates"> <?=$lang['add']['skipcrossduplicates'];?></label>
+							<label><input type="checkbox" value="1" name="subscribeall" checked> <?=$lang['add']['subscribeall'];?> (--subscribeall)</label>
 							</div>
 						</div>
 					</div>