diff --git a/data/web/add.php b/data/web/add.php index 273769ba..e7b73d13 100644 --- a/data/web/add.php +++ b/data/web/add.php @@ -1,6 +1,6 @@ +

+

+
"> +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ diff --git a/data/web/delete.php b/data/web/delete.php index f8a53aeb..f058b42a 100644 --- a/data/web/delete.php +++ b/data/web/delete.php @@ -1,6 +1,6 @@ prepare("SELECT `user2` FROM `imapsync` + WHERE `id` = :id AND user2 = :user2"); + $stmt->execute(array(':id' => $_GET["syncjob"], ':user2' => $_SESSION['mailcow_cc_username'])); + $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + } + if ($num_results != 0 && !empty($num_results)) { + ?> + +

+
+ +
+
+ "> + +
+
+
+ + + + + diff --git a/data/web/edit.php b/data/web/edit.php index cb8fb15d..b89ba1cd 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -1,6 +1,6 @@ prepare("SELECT * FROM `imapsync` WHERE `user2` = :username AND id = :id"); + $stmt->execute(array( + ':username' => $username, + ':id' => $id + )); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + } + if ($result && !empty($result)) { + ?> +

+
"> + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ + + + + diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index 327fdb32..5ed427b2 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -84,6 +84,30 @@ function init_db_schema() { if ($num_results == 0) { $pdo->query("ALTER TABLE `mailbox` ADD `wants_tagged_subject` tinyint(1) NOT NULL DEFAULT '0'"); } + $stmt = $pdo->query("SELECT * FROM information_schema.TABLES WHERE TABLE_NAME = 'imapsync'"); + $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); + + if ($num_results == 0) { + $pdo->query("CREATE TABLE IF NOT EXISTS `imapsync` ( + `id` int NOT NULL AUTO_INCREMENT, + `user2` VARCHAR(255) NOT NULL, + `host1` VARCHAR(255) NOT NULL, + `authmech1` ENUM('PLAIN','LOGIN','CRAM-MD5') DEFAULT 'PLAIN', + `user1` VARCHAR(255) NOT NULL, + `exclude` VARCHAR(500) NOT NULL DEFAULT '', + `password1` VARCHAR(255) NOT NULL, + `mins_interval` VARCHAR(50) NOT NULL, + `port1` SMALLINT NOT NULL, + `enc1` ENUM('TLS','SSL','PLAIN') DEFAULT 'TLS', + `delete2duplicates` TINYINT(1) NOT NULL DEFAULT '1', + `returned_text` TEXT, + `last_run` TIMESTAMP NULL DEFAULT NULL, + `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;"); + } } function verify_ssha256($hash, $password) { // Remove tag if any @@ -2466,6 +2490,247 @@ function set_tls_policy($postarray) { 'msg' => sprintf($lang['success']['mailbox_modified'], $username) ); } +function set_syncjob($postarray, $action) { + global $lang; + global $pdo; + $username = $_SESSION['mailcow_cc_username']; + if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if ($_SESSION['mailcow_cc_role'] != "user") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + // DELETE + if ($action == "delete") { + $id = $postarray['id']; + if (!is_numeric($id)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + try { + $stmt = $pdo->prepare("DELETE FROM `imapsync` WHERE `user2` = :username AND `id`= :id"); + $stmt->execute(array( + ':username' => $username, + ':id' => $id, + )); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + $_SESSION['return'] = array( + 'type' => 'success', + 'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username)) + ); + return true; + } + elseif ($action == "add") { + isset($postarray['active']) ? $active = '1' : $active = '0'; + isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0'; + $port1 = $postarray['port1']; + $host1 = $postarray['host1']; + $password1 = $postarray['password1']; + $exclude = $postarray['exclude']; + $user1 = $postarray['user1']; + $mins_interval = $postarray['mins_interval']; + $enc1 = $postarray['enc1']; + + if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (!filter_var($mins_interval, FILTER_VALIDATE_INT, array('options' => array('min_range' => 10, 'max_range' => 3600)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (!is_valid_domain_name($host1)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if ($enc1 != "TLS" && $enc1 != "SSL" && $enc1 != "PLAIN") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (@preg_match("/" . $exclude . "/", null) === false) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + try { + $stmt = $pdo->prepare("SELECT `user2`, `user1` FROM `imapsync` + WHERE `user2` = :user2 AND `user1` = :user1"); + $stmt->execute(array(':user1' => $user1, ':user2' => $username)); + $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if ($num_results != 0) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['object_exists'], htmlspecialchars($host1 . ' / ' . $user1)) + ); + return false; + } + try { + $stmt = $pdo->prepare("INSERT INTO `imapsync` (`user2`, `exclude`, `host1`, `authmech1`, `user1`, `password1`, `mins_interval`, `port1`, `enc1`, `delete2duplicates`, `active`) + VALUES (:user2, :exclude, :host1, :authmech1, :user1, :password1, :mins_interval, :port1, :enc1, :delete2duplicates, :active)"); + $stmt->execute(array( + ':user2' => $username, + ':exclude' => $exclude, + ':host1' => $host1, + ':authmech1' => 'PLAIN', + ':user1' => $user1, + ':password1' => $password1, + ':mins_interval' => $mins_interval, + ':port1' => $port1, + ':enc1' => $enc1, + ':delete2duplicates' => $delete2duplicates, + ':active' => $active, + )); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + $_SESSION['return'] = array( + 'type' => 'success', + 'msg' => sprintf($lang['success']['mailbox_modified'], $username) + ); + return true; + } + elseif ($action == "edit") { + isset($postarray['active']) ? $active = '1' : $active = '0'; + isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0'; + $id = $postarray['id']; + $port1 = $postarray['port1']; + $host1 = $postarray['host1']; + $password1 = $postarray['password1']; + $exclude = $postarray['exclude']; + $user1 = $postarray['user1']; + $mins_interval = $postarray['mins_interval']; + $enc1 = $postarray['enc1']; + if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (!filter_var($mins_interval, FILTER_VALIDATE_INT, array('options' => array('min_range' => 10, 'max_range' => 3600)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (!is_valid_domain_name($host1)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if ($enc1 != "TLS" && $enc1 != "SSL" && $enc1 != "PLAIN") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + if (@preg_match("/" . $exclude . "/", null) === false) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + try { + $stmt = $pdo->prepare("SELECT `user2` FROM `imapsync` + WHERE `user2` = :user2 AND `id` = :id"); + $stmt->execute(array(':user2' => $username, ':id' => $id)); + $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if (empty($num_results)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + try { + $stmt = $pdo->prepare("UPDATE `imapsync` set `exclude` = :exclude, `host1` = :host1, `user1` = :user1, `password1` = :password1, `mins_interval` = :mins_interval, `port1` = :port1, `enc1` = :enc1, `delete2duplicates` = :delete2duplicates, `active` = :active + WHERE `user2` = :user2 AND `id` = :id"); + $stmt->execute(array( + ':user2' => $username, + ':id' => $id, + ':exclude' => $exclude, + ':host1' => $host1, + ':user1' => $user1, + ':password1' => $password1, + ':mins_interval' => $mins_interval, + ':port1' => $port1, + ':enc1' => $enc1, + ':delete2duplicates' => $delete2duplicates, + ':active' => $active, + )); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + $_SESSION['return'] = array( + 'type' => 'success', + 'msg' => sprintf($lang['success']['mailbox_modified'], $username) + ); + return true; + } +} function get_tls_policy($username) { global $lang; global $pdo; diff --git a/data/web/inc/init.sql b/data/web/inc/init.sql index 183c55e1..a85d6bfb 100644 --- a/data/web/inc/init.sql +++ b/data/web/inc/init.sql @@ -102,6 +102,26 @@ CREATE TABLE IF NOT EXISTS `filterconf` ( KEY `object` (`object`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE IF NOT EXISTS `imapsync` ( + `id` int NOT NULL AUTO_INCREMENT, + `user2` varchar(255) NOT NULL, + `host1` varchar(255) NOT NULL, + `authmech1` ENUM('PLAIN','LOGIN','CRAM-MD5') DEFAULT 'PLAIN', + `user1` varchar(255) NOT NULL, + `password1` varchar(255) NOT NULL, + `exclude` VARCHAR(500) NOT NULL DEFAULT '', + `mins_interval` VARCHAR(50) NOT NULL, + `port1` SMALLINT NOT NULL, + `enc1` ENUM('TLS','SSL','PLAIN') DEFAULT 'TLS', + `delete2duplicates` TINYINT(1) NOT NULL DEFAULT '1', + `returned_text` TEXT, + `last_run` TIMESTAMP NULL DEFAULT NULL, + `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + DROP VIEW IF EXISTS grouped_mail_aliases; DROP VIEW IF EXISTS grouped_sender_acl; DROP VIEW IF EXISTS grouped_domain_alias_address; diff --git a/data/web/inc/triggers.inc.php b/data/web/inc/triggers.inc.php index 70e91640..c2588148 100644 --- a/data/web/inc/triggers.inc.php +++ b/data/web/inc/triggers.inc.php @@ -60,6 +60,15 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "user if (isset($_POST["trigger_set_tls_policy"])) { set_tls_policy($_POST); } + if (isset($_POST["trigger_add_syncjob"])) { + set_syncjob($_POST, "add"); + } + if (isset($_POST["trigger_edit_syncjob"])) { + set_syncjob($_POST, "edit"); + } + if (isset($_POST["trigger_delete_syncjob"])) { + set_syncjob($_POST, "delete"); + } if (isset($_POST["trigger_set_time_limited_aliases"])) { set_time_limited_aliases($_POST); } diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 5c41e6d3..29720c89 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -1,5 +1,5 @@ ' + logText + ''); + }); }); \ No newline at end of file diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php index 8727ca75..328167cb 100644 --- a/data/web/lang/lang.de.php +++ b/data/web/lang/lang.de.php @@ -111,7 +111,9 @@ $lang['user']['alias_valid_until'] = 'Gültig bis'; $lang['user']['alias_remove_all'] = 'Alle entfernen'; $lang['user']['alias_time_left'] = 'Zeit verbleibend'; $lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T'; +$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T'; $lang['user']['alias_select_validity'] = 'Bitte Gültigkeit auswählen'; +$lang['user']['sync_jobs'] = 'Sync Jobs'; $lang['user']['hour'] = 'Stunde'; $lang['user']['hours'] = 'Stunden'; $lang['user']['day'] = 'Tag'; @@ -151,6 +153,18 @@ $lang['user']['tag_help_explain'] = 'Als Unterordner: Es wird ein Ordner mit dem In Betreff: Der Name des Tags wird dem Betreff angefügt, etwa "[Facebook] Meine Neuigkeiten".'; $lang['user']['tag_help_example'] = 'Beispiel für eine getaggte E-Mail-Adresse: ich+Facebook@example.org'; +$lang['user']['encryption'] = 'Verschlüsselung'; +$lang['user']['username'] = 'Benutzername'; +$lang['user']['password'] = 'Password'; +$lang['user']['last_run'] = 'Letzte Ausführung'; +$lang['user']['excludes'] = 'Ausschlüsse'; +$lang['user']['interval'] = 'Intervall'; +$lang['user']['active'] = 'Aktiv'; +$lang['user']['action'] = 'Aktion'; +$lang['user']['edit'] = 'Bearbeiten'; +$lang['user']['remove'] = 'Entfernen'; +$lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen'; + $lang['start']['dashboard'] = '%s - Dashboard'; $lang['start']['start_rc'] = 'Roundcube öffnen'; $lang['start']['start_sogo'] = 'SOGo öffnen'; @@ -219,14 +233,22 @@ $lang['delete']['remove_domain_warning'] = 'Warnung: Sie entfernen die Do $lang['delete']['remove_domainalias_warning'] = 'Warnung: Sie entfernen die Alias-Domain %s!'; $lang['delete']['remove_domainadmin_warning'] = 'Warnung: Sie entfernen den Domain-Administrator %s!'; $lang['delete']['remove_alias_warning'] = 'Warnung: Sie entfernen die Alias-Adresse %s!'; +$lang['delete']['remove_syncjob_warning'] = 'Warnung: Sie entfernen einen Sync-Job des Benutzers %s!'; $lang['delete']['remove_mailbox_warning'] = 'Warnung: Sie entfernen die Mailbox %s!'; $lang['delete']['remove_mailbox_details'] = 'Die Mailbox wird vollständig und permanent entfernt!'; $lang['delete']['remove_domain_details'] = 'Diese Aktion entfernt ebenfalls Domain-Aliasse.

Eine Domain muss leer sein, um entfernt zu werden.'; +$lang['delete']['remove_syncjob_details'] = 'Objekte dieses Sync-Jobs werden nicht mehr vom entfernten Server abgeholt.'; $lang['delete']['remove_alias_details'] = 'Benutzer werden keine Nachrichten mehr von dieser Adresse erhalten und versenden koennen!'; $lang['delete']['remove_button'] = 'Entfernen'; $lang['delete']['previous'] = 'Vorherige Seite'; +$lang['edit']['syncjob'] = 'Sync-Job bearbeiten'; $lang['edit']['save'] = 'Änderungen speichern'; +$lang['edit']['username'] = 'Benutzername'; +$lang['edit']['hostname'] = 'Servername'; +$lang['edit']['encryption'] = 'Verschlüsselungsmethode'; +$lang['edit']['mins_interval'] = 'Intervall (min)'; +$lang['edit']['exclude'] = 'Elemente ausschließen (Regex)'; $lang['edit']['archive'] = 'Archiv-Zugriff'; $lang['edit']['max_mailboxes'] = 'Max. Mailboxanzahl:'; $lang['edit']['title'] = 'Objekt bearbeiten'; @@ -265,6 +287,15 @@ $lang['edit']['previous'] = 'Vorherige Seite'; $lang['edit']['unchanged_if_empty'] = 'Unverändert, wenn leer'; $lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s nicht prüfen'; +$lang['add']['syncjob'] = 'Sync-Job erstellen'; +$lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!'; +$lang['add']['hostname'] = 'Servername'; +$lang['add']['username'] = 'Benutzername'; +$lang['add']['enc_method'] = 'Verschlüsselungsmethode'; +$lang['add']['mins_interval'] = 'Abrufintervall (Minuten)'; +$lang['add']['exclude'] = 'Elemente ausschließen (Regex)'; +$lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel'; + $lang['add']['title'] = 'Objekt anlegen'; $lang['add']['domain'] = 'Domain'; $lang['add']['active'] = 'Aktiv'; diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 801d8479..3600d154 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -106,14 +106,16 @@ $lang['user']['alias'] = 'Alias'; $lang['user']['aliases'] = 'Aliases'; $lang['user']['is_catch_all'] = 'Catch-all for domain/s'; $lang['user']['aliases_also_send_as'] = 'Also allowed to send as'; -$lang['user']['aliases_send_as_all'] = 'Do not check sender access for following domains'; +$lang['user']['aliases_send_as_all'] = 'Do not check sender access for following domain/s'; $lang['user']['alias_create_random'] = 'Generate random alias'; $lang['user']['alias_extend_all'] = 'Extend aliases by 1 hour'; $lang['user']['alias_valid_until'] = 'Valid until'; $lang['user']['alias_remove_all'] = 'Remove all aliases'; $lang['user']['alias_time_left'] = 'Time left'; $lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T'; +$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T'; $lang['user']['alias_select_validity'] = 'Period of validity'; +$lang['user']['sync_jobs'] = 'Sync jobs'; $lang['user']['hour'] = 'Hour'; $lang['user']['hours'] = 'Hours'; $lang['user']['day'] = 'Day'; @@ -153,6 +155,18 @@ $lang['user']['tag_help_explain'] = 'In subfolder: a new subfolder named after t In subject: the tags name will be prepended to the mails subject, example: "[Facebook] Meine Neuigkeiten".'; $lang['user']['tag_help_example'] = 'Example for a tagged email address: ich+Facebook@example.org'; +$lang['user']['encryption'] = 'Encyrption'; +$lang['user']['username'] = 'Username'; +$lang['user']['password'] = 'Password'; +$lang['user']['last_run'] = 'Last run'; +$lang['user']['excludes'] = 'Excludes'; +$lang['user']['interval'] = 'Interval'; +$lang['user']['active'] = 'Active'; +$lang['user']['action'] = 'Action'; +$lang['user']['edit'] = 'Edit'; +$lang['user']['remove'] = 'Remove'; +$lang['user']['create_syncjob'] = 'Create new sync job'; + $lang['start']['dashboard'] = '%s - dashboard'; $lang['start']['start_rc'] = 'Open Roundcube'; $lang['start']['start_sogo'] = 'Open SOGo'; @@ -218,27 +232,36 @@ $lang['info']['no_action'] = 'No action applicable'; $lang['delete']['title'] = 'Remove object'; $lang['delete']['remove_domain_warning'] = 'Warning: You are about to remove the domain %s!'; +$lang['delete']['remove_syncjob_warning'] = 'Warning: You are about to remove a sync job for user %s!'; $lang['delete']['remove_domainalias_warning'] = 'Warning: You are about to remove the domain alias %s!'; $lang['delete']['remove_domainadmin_warning'] = 'Warning: You are about to remove the domain administrator %s!'; $lang['delete']['remove_alias_warning'] = 'Warning: You are about to remove the alias address %s!'; $lang['delete']['remove_mailbox_warning'] = 'Warning: You are about to remove the mailbox %s!'; $lang['delete']['remove_mailbox_details'] = 'The mailbox will be purged permanently!'; $lang['delete']['remove_domain_details'] = 'This also removes domain aliases.

A domain must be empty to be removed.'; +$lang['delete']['remove_syncjob_details'] = 'Objects from this sync job will not be pulled from the remote server anymore.'; $lang['delete']['remove_alias_details'] = 'Users will no longer be able to receive mail for or send mail from this address.'; $lang['delete']['remove_button'] = 'Remove'; $lang['delete']['previous'] = 'Previous page'; +$lang['edit']['syncjob'] = 'Edit sync job'; +$lang['edit']['save'] = 'Save changes'; +$lang['edit']['username'] = 'Save changes'; +$lang['edit']['hostname'] = 'Hostname'; +$lang['edit']['encryption'] = 'Encryption'; +$lang['edit']['mins_interval'] = 'Interval (min)'; +$lang['edit']['exclude'] = 'Exclude objects (regex)'; $lang['edit']['save'] = 'Save changes'; $lang['edit']['archive'] = 'Archive access'; -$lang['edit']['max_mailboxes'] = 'Max. possible mailboxes:'; +$lang['edit']['max_mailboxes'] = 'Max. possible mailboxes'; $lang['edit']['title'] = 'Edit object'; -$lang['edit']['target_address'] = 'Goto address/es (comma-separated):'; +$lang['edit']['target_address'] = 'Goto address/es (comma-separated)'; $lang['edit']['active'] = 'Active'; -$lang['edit']['target_domain'] = 'Target domain:'; -$lang['edit']['password'] = 'Password:'; -$lang['edit']['ratelimit'] = 'Outgoing rate limit/h:'; +$lang['edit']['target_domain'] = 'Target domain'; +$lang['edit']['password'] = 'Password'; +$lang['edit']['ratelimit'] = 'Outgoing rate limit/h'; $lang['danger']['ratelimt_less_one'] = 'Outgoing rate limit/h must not be less than 1'; -$lang['edit']['password_repeat'] = 'Confirmation password (repeat):'; +$lang['edit']['password_repeat'] = 'Confirmation password (repeat)'; $lang['edit']['domain_admin'] = 'Edit domain administrator'; $lang['edit']['domain'] = 'Edit domain'; $lang['edit']['alias_domain'] = 'Alias domain'; @@ -247,14 +270,14 @@ $lang['edit']['domains'] = 'Domains'; $lang['edit']['destroy'] = 'Manual data input'; $lang['edit']['alias'] = 'Edit alias'; $lang['edit']['mailbox'] = 'Edit mailbox'; -$lang['edit']['description'] = 'Description:'; -$lang['edit']['max_aliases'] = 'Max. aliases:'; -$lang['edit']['max_quota'] = 'Max. quota per mailbox (MiB):'; -$lang['edit']['domain_quota'] = 'Domain quota:'; -$lang['edit']['backup_mx_options'] = 'Backup MX options:'; +$lang['edit']['description'] = 'Description'; +$lang['edit']['max_aliases'] = 'Max. aliases'; +$lang['edit']['max_quota'] = 'Max. quota per mailbox (MiB)'; +$lang['edit']['domain_quota'] = 'Domain quota'; +$lang['edit']['backup_mx_options'] = 'Backup MX options'; $lang['edit']['relay_domain'] = 'Relay domain'; $lang['edit']['relay_all'] = 'Relay all recipients'; -$lang['edit']['dkim_signature'] = 'DKIM signature:'; +$lang['edit']['dkim_signature'] = 'DKIM signature'; $lang['edit']['dkim_record_info'] = 'Please add a TXT record with the given value to your DNS settings.'; $lang['edit']['relay_all_info'] = 'If you choose not to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.'; $lang['edit']['full_name'] = 'Full name'; @@ -267,6 +290,15 @@ $lang['edit']['previous'] = 'Previous page'; $lang['edit']['unchanged_if_empty'] = 'If unchanged leave blank'; $lang['edit']['dont_check_sender_acl'] = 'Do not check sender for domain %s'; +$lang['add']['syncjob'] = 'Add sync job'; +$lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!'; +$lang['add']['hostname'] = 'Hostname'; +$lang['add']['username'] = 'Username'; +$lang['add']['enc_method'] = 'Encryption method'; +$lang['add']['mins_interval'] = 'Polling interval (minutes)'; +$lang['add']['exclude'] = 'Exclude objects (regex)'; +$lang['add']['delete2duplicates'] = 'Delete duplicates on destination'; + $lang['add']['title'] = 'Add object'; $lang['add']['domain'] = 'Domain'; $lang['add']['active'] = 'Active'; diff --git a/data/web/user.php b/data/web/user.php index 08d129d7..7d55d0c1 100644 --- a/data/web/user.php +++ b/data/web/user.php @@ -9,7 +9,6 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user ?>

-

@@ -26,13 +25,13 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
- +
- +

@@ -102,6 +101,7 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
  • +

  • @@ -364,8 +364,96 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
    +
    + + + + + + + + + + + + + + + + prepare("SELECT *, CONCAT(LEFT(`password1`, 3), '…') as `password1_short` + FROM `imapsync` + WHERE `user2` = :username"); + $stmt->execute(array(':username' => $username)); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + } + if(!empty($rows)): + while ($row = array_shift($rows)): + ?> + + + + + + + + + + + + + + + + + + + + +
    Server:PortLog
    min + + Open logs + + +
    + + +
    +
    + +
    +
    +
    +