|
|
|
@@ -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;
|
|
|
|
|