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 @@
+
=$lang['add']['syncjob'];?>
+ =$lang['add']['syncjob_hint'];?>
+
+
=$lang['danger']['access_denied'];?>
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)) {
+ ?>
+ =sprintf($lang['delete']['remove_syncjob_warning'], htmlspecialchars($_SESSION['mailcow_cc_username']));?>
+ =$lang['delete']['remove_syncjob_details'];?>
+
+
+ =$lang['info']['no_action'];?>
+
+ =$lang['info']['no_action'];?>
+
=$lang['danger']['access_denied'];?>
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)) {
+ ?>
+ =$lang['edit']['syncjob'];?>
+
+
+ =$lang['info']['no_action'];?>
+
+ =$lang['info']['no_action'];?>
+
=$lang['danger']['access_denied'];?>
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
?>
=$lang['user']['mailbox_settings'];?>
-
=$lang['user']['did_you_know'];?>
+
+
+
+
+ Server:Port |
+ =$lang['user']['encryption'];?> |
+ =$lang['user']['username'];?> |
+ =$lang['user']['excludes'];?> |
+ =$lang['user']['interval'];?> |
+ =$lang['user']['last_run'];?> |
+ Log |
+ =$lang['user']['active'];?> |
+ =$lang['user']['action'];?> |
+
+
+
+ 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)):
+ ?>
+
+ =htmlspecialchars($row['host1'] . ':' . $row['port1']);?> |
+ =htmlspecialchars($row['enc1']);?> |
+ =htmlspecialchars($row['user1']);?> |
+ =($row['exclude'] == '') ? '✘' : $row['exclude'];?> |
+ =htmlspecialchars($row['mins_interval']);?> min |
+ =(empty($row['last_run'])) ? '✘' : htmlspecialchars(date($lang['user']['syncjob_full_date'], strtotime($row['last_run'])));?> |
+
+
+ Open logs
+
+ |
+ =($row['active'] == '1') ? '✔' : '✘';?> |
+
+
+ |
+
+
+ =$lang['user']['no_record'];?> |
+
+
+
+
+
+ =$lang['user']['create_syncjob'];?>
+ |
+
+
+
+
+
+