From 4146cec3b9abf44227c9c8b0e4f47ee0b722fdd3 Mon Sep 17 00:00:00 2001 From: andryyy Date: Sun, 15 Jan 2017 17:39:17 +0100 Subject: [PATCH] Some changes in functions --- data/web/add.php | 14 +- data/web/edit.php | 14 +- data/web/inc/functions.inc.php | 871 ++++++++++++++++++++++------- data/web/inc/header.inc.php | 6 +- data/web/inc/init.sql | 259 ++++----- data/web/inc/prerequisites.inc.php | 17 +- data/web/inc/triggers.inc.php | 14 + data/web/js/user.js | 5 +- data/web/lang/lang.de.php | 11 +- data/web/lang/lang.en.php | 9 +- data/web/mailbox.php | 334 ++++------- data/web/user.php | 72 ++- 12 files changed, 1010 insertions(+), 616 deletions(-) diff --git a/data/web/add.php b/data/web/add.php index e7b73d13..276082df 100644 --- a/data/web/add.php +++ b/data/web/add.php @@ -259,7 +259,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm

@@ -305,6 +305,18 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "use +
+ +
+ +
+
+
+ +
+ +
+
diff --git a/data/web/edit.php b/data/web/edit.php index b89ba1cd..3ab5fff0 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -517,7 +517,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm " required>
+
+ +
+ +
+
+
+ +
+ +
+
diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index 5ed427b2..c21b6d2a 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -36,7 +36,7 @@ function hasDomainAccess($username, $role, $domain) { function init_db_schema() { global $pdo; try { - $stmt = $pdo->prepare("SELECT `username` FROM `admin`"); + $stmt = $pdo->prepare("SELECT NULL FROM `admin`, `imapsync`"); $stmt->execute(); } catch (Exception $e) { @@ -84,30 +84,6 @@ 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 @@ -286,6 +262,16 @@ function dkim_table($action, $item) { } } function mailbox_add_domain($postarray) { + // Array elements + // domain string + // description string + // aliases int + // mailboxes int + // maxquota int + // quota int + // active int + // relay_all_recipients int + // backupmx int global $pdo; global $lang; if ($_SESSION['mailcow_cc_role'] != "admin") { @@ -296,9 +282,9 @@ function mailbox_add_domain($postarray) { return false; } $domain = idn_to_ascii(strtolower(trim($postarray['domain']))); - $description = $postarray['description']; + $description = $postarray['description']; $aliases = $postarray['aliases']; - $mailboxes = $postarray['mailboxes']; + $mailboxes = $postarray['mailboxes']; $maxquota = $postarray['maxquota']; $quota = $postarray['quota']; @@ -310,10 +296,10 @@ function mailbox_add_domain($postarray) { return false; } - isset($postarray['active']) ? $active = '1' : $active = '0'; - isset($postarray['relay_all_recipients']) ? $relay_all_recipients = '1' : $relay_all_recipients = '0'; - isset($postarray['backupmx']) ? $backupmx = '1' : $backupmx = '0'; - isset($postarray['relay_all_recipients']) ? $backupmx = '1' : true; + isset($postarray['active']) ? $active = '1' : $active = '0'; + isset($postarray['relay_all_recipients']) ? $relay_all_recipients = '1' : $relay_all_recipients = '0'; + isset($postarray['backupmx']) ? $backupmx = '1' : $backupmx = '0'; + isset($postarray['relay_all_recipients']) ? $backupmx = '1' : true; if (!is_valid_domain_name($domain)) { $_SESSION['return'] = array( @@ -374,12 +360,6 @@ function mailbox_add_domain($postarray) { ':modified' => date('Y-m-d H:i:s'), ':relay_all_recipients' => $relay_all_recipients )); - // - // PoC for a restart with supervisord unix socket - // * $sock = stream_socket_client("unix:///var/run/controller/supervisord.sock", $errno, $errstr, 30); - // * fwrite($sock, "GET ?processname=sogo&action=restart HTTP/1.0\r\nAccept: */*\r\n\r\n"); - // * fclose($sock); - // $_SESSION['return'] = array( 'type' => 'success', 'msg' => sprintf($lang['success']['domain_added'], htmlspecialchars($domain)) @@ -394,10 +374,14 @@ function mailbox_add_domain($postarray) { } } function mailbox_add_alias($postarray) { + // Array elements + // address string (separated by " ", "," ";" "\n") - email address or domain + // goto string (separated by " ", "," ";" "\n") + // active int global $lang; global $pdo; - $addresses = array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['address'])); - $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['goto'])); + $addresses = array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['address'])); + $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['goto'])); isset($postarray['active']) ? $active = '1' : $active = '0'; if (empty($addresses[0])) { $_SESSION['return'] = array( @@ -420,9 +404,30 @@ function mailbox_add_alias($postarray) { continue; } - $domain = idn_to_ascii(substr(strstr($address, '@'), 1)); - $local_part = strstr($address, '@', true); - $address = $local_part.'@'.$domain; + $domain = idn_to_ascii(substr(strstr($address, '@'), 1)); + $local_part = strstr($address, '@', true); + $address = $local_part.'@'.$domain; + + try { + $stmt = $pdo->prepare("SELECT `domain` FROM `domain` + WHERE `domain`= :domain"); + $stmt->execute(array(':domain' => $domain)); + $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']['domain_not_found'], $domain) + ); + return false; + } if ((!filter_var($address, FILTER_VALIDATE_EMAIL) === true) && !empty($local_part)) { $_SESSION['return'] = array( @@ -553,11 +558,17 @@ function mailbox_add_alias($postarray) { ); } function mailbox_add_alias_domain($postarray) { + // Array elements + // active int + // alias_domain string + // target_domain string global $lang; global $pdo; isset($postarray['active']) ? $active = '1' : $active = '0'; + $alias_domain = idn_to_ascii(strtolower(trim($postarray['alias_domain']))); + $target_domain = idn_to_ascii(strtolower(trim($postarray['target_domain']))); - if (!is_valid_domain_name($postarray['alias_domain'])) { + if (!is_valid_domain_name($alias_domain)) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['alias_domain_invalid']) @@ -565,7 +576,7 @@ function mailbox_add_alias_domain($postarray) { return false; } - if (!is_valid_domain_name($postarray['target_domain'])) { + if (!is_valid_domain_name($target_domain)) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['target_domain_invalid']) @@ -573,7 +584,7 @@ function mailbox_add_alias_domain($postarray) { return false; } - if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $postarray['target_domain'])) { + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $target_domain)) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['access_denied']) @@ -581,7 +592,7 @@ function mailbox_add_alias_domain($postarray) { return false; } - if ($postarray['alias_domain'] == $postarray['target_domain']) { + if ($alias_domain == $target_domain) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['aliasd_targetd_identical']) @@ -589,9 +600,6 @@ function mailbox_add_alias_domain($postarray) { return false; } - $alias_domain = strtolower(trim($postarray['alias_domain'])); - $target_domain = strtolower(trim($postarray['target_domain'])); - try { $stmt = $pdo->prepare("SELECT `domain` FROM `domain` WHERE `domain`= :target_domain"); @@ -660,12 +668,15 @@ function mailbox_add_alias_domain($postarray) { } function mailbox_edit_alias_domain($postarray) { + // Array elements + // active int + // alias_domain_now string + // alias_domain string global $lang; global $pdo; isset($postarray['active']) ? $active = '1' : $active = '0'; - $alias_domain = idn_to_ascii($postarray['alias_domain']); - $alias_domain = strtolower(trim($alias_domain)); - $alias_domain_now = strtolower(trim($postarray['alias_domain_now'])); + $alias_domain = idn_to_ascii(strtolower(trim($postarray['alias_domain']))); + $alias_domain_now = strtolower(trim($postarray['alias_domain_now'])); if (!is_valid_domain_name($alias_domain)) { $_SESSION['return'] = array( 'type' => 'danger', @@ -746,9 +757,21 @@ function mailbox_edit_alias_domain($postarray) { ); } function mailbox_add_mailbox($postarray) { + // Array elements + // active int + // local_part string + // domain string + // name string (username if empty) + // password string + // password2 string + // quota int (MiB) + // active int + global $pdo; global $lang; - $username = strtolower(trim($postarray['local_part'])).'@'.strtolower(trim($postarray['domain'])); + $local_part = strtolower(trim($postarray['local_part'])); + $domain = idn_to_ascii(strtolower(trim($postarray['domain']))); + $username = $local_part . '@' . $domain; if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { $_SESSION['return'] = array( 'type' => 'danger', @@ -763,12 +786,10 @@ function mailbox_add_mailbox($postarray) { ); return false; } - $domain = strtolower(trim($postarray['domain'])); - $password = $postarray['password']; - $password2 = $postarray['password2']; - $local_part = strtolower(trim($postarray['local_part'])); - $name = $postarray['name']; - $quota_m = $postarray['quota']; + $password = $postarray['password']; + $password2 = $postarray['password2']; + $name = $postarray['name']; + $quota_m = filter_var($postarray['quota'], FILTER_SANITIZE_NUMBER_FLOAT); if (empty($name)) { $name = $local_part; @@ -935,7 +956,7 @@ function mailbox_add_mailbox($postarray) { if ($num_results == 0) { $_SESSION['return'] = array( 'type' => 'danger', - 'msg' => $lang['danger']['domain_not_found'] + 'msg' => sprintf($lang['danger']['domain_not_found'], $domain) ); return false; } @@ -1002,11 +1023,15 @@ function mailbox_add_mailbox($postarray) { } } function mailbox_edit_alias($postarray) { + // Array elements + // address string + // goto string (separated by " ", "," ";" "\n") - email address or domain + // active int global $lang; global $pdo; - $address = $postarray['address']; - $domain = idn_to_ascii(substr(strstr($address, '@'), 1)); - $local_part = strstr($address, '@', true); + $address = $postarray['address']; + $domain = idn_to_ascii(substr(strstr($address, '@'), 1)); + $local_part = strstr($address, '@', true); if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { $_SESSION['return'] = array( 'type' => 'danger', @@ -1073,13 +1098,25 @@ function mailbox_edit_alias($postarray) { } } function mailbox_edit_domain($postarray) { + // Array elements + // domain string + // description string + // active int + // relay_all_recipients int + // backupmx int + // aliases float + // mailboxes float + // maxquota float + // quota float (Byte) + // active int + global $lang; global $pdo; - $domain = $postarray['domain']; - $description = $postarray['description']; + $domain = idn_to_ascii($postarray['domain']); + $description = $postarray['description']; $aliases = filter_var($postarray['aliases'], FILTER_SANITIZE_NUMBER_FLOAT); - $mailboxes = filter_var($postarray['mailboxes'], FILTER_SANITIZE_NUMBER_FLOAT); + $mailboxes = filter_var($postarray['mailboxes'], FILTER_SANITIZE_NUMBER_FLOAT); $maxquota = filter_var($postarray['maxquota'], FILTER_SANITIZE_NUMBER_FLOAT); $quota = filter_var($postarray['quota'], FILTER_SANITIZE_NUMBER_FLOAT); @@ -1217,122 +1254,337 @@ function mailbox_edit_domain($postarray) { } } -function edit_domain_admin($postarray) { +function mailbox_get_mailboxes($domain) { global $lang; global $pdo; - $username = $postarray['username']; - $password = $postarray['password']; - $password2 = $postarray['password2']; - isset($postarray['active']) ? $active = '1' : $active = '0'; - - if ($_SESSION['mailcow_cc_role'] != "admin") { + $mailboxes = array(); + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['access_denied']) ); return false; } - - foreach ($postarray['domain'] as $domain) { - if (!is_valid_domain_name($domain)) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => sprintf($lang['danger']['domain_invalid']) - ); - return false; - } - } - - if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) { + try { + $stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `domain` != 'ALL' AND `domain` = :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $mailboxes[] = $row['username']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + return $mailboxes; +} +function mailbox_get_alias_domains($domain) { + global $lang; + global $pdo; + $aliasdomains = array(); + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { $_SESSION['return'] = array( 'type' => 'danger', - 'msg' => sprintf($lang['danger']['username_invalid']) + 'msg' => sprintf($lang['danger']['access_denied']) ); return false; } - try { - $stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username"); - $stmt->execute(array( - ':username' => $username, - )); - } - catch (PDOException $e) { + try { + $stmt = $pdo->prepare("SELECT `alias_domain` FROM `alias_domain` WHERE `target_domain` = :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $aliasdomains[] = $row['alias_domain']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + return $aliasdomains; +} +function mailbox_get_aliases($domain) { + global $lang; + global $pdo; + $aliases = array(); + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { $_SESSION['return'] = array( 'type' => 'danger', - 'msg' => 'MySQL: '.$e + 'msg' => sprintf($lang['danger']['access_denied']) ); return false; } - foreach ($postarray['domain'] as $domain) { - try { - $stmt = $pdo->prepare("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`) - VALUES (:username, :domain, :created, :active)"); - $stmt->execute(array( - ':username' => $username, - ':domain' => $domain, - ':created' => date('Y-m-d H:i:s'), - ':active' => $active - )); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } + try { + $stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE `address` != `goto` AND `domain` = :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $aliases[] = $row['address']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + return $aliases; +} +function mailbox_get_alias_details($address) { + global $lang; + global $pdo; + $aliasdata = array(); + try { + $stmt = $pdo->prepare("SELECT + `domain`, + `goto`, + `address`, + CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `created`, + `modified` + FROM `alias` + WHERE `address` = :address AND `address` != `goto`"); + $stmt->execute(array( + ':address' => $address, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $aliasdata['domain'] = $row['domain']; + $aliasdata['goto'] = $row['goto']; + $aliasdata['address'] = $row['address']; + (!filter_var($aliasdata['address'], FILTER_VALIDATE_EMAIL)) ? $aliasdata['is_catch_all'] = 1 : $aliasdata['is_catch_all'] = 0; + $aliasdata['active'] = $row['active']; + $aliasdata['created'] = $row['created']; + $aliasdata['modified'] = $row['modified']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if (isset($aliasdata['domain']) && !hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $aliasdata['domain'])) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + return $aliasdata; +} +function mailbox_get_alias_domain_details($aliasdomain) { + global $lang; + global $pdo; + $aliasdomaindata = array(); + try { + $stmt = $pdo->prepare("SELECT + `alias_domain`, + `target_domain`, + CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `created`, + `modified` + FROM `alias_domain` + WHERE `alias_domain` = :aliasdomain"); + $stmt->execute(array( + ':aliasdomain' => $aliasdomain, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $aliasdomaindata['alias_domain'] = $row['alias_domain']; + $aliasdomaindata['target_domain'] = $row['target_domain']; + $aliasdomaindata['active'] = $row['active']; + $aliasdomaindata['created'] = $row['created']; + $aliasdomaindata['modified'] = $row['modified']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if (isset($aliasdomaindata['target_domain']) && !hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $aliasdomaindata['target_domain'])) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + return $aliasdomaindata; +} +function mailbox_get_domains() { + global $lang; + global $pdo; + + try { + $domains = array(); + $stmt = $pdo->prepare("SELECT `domain` FROM `domain` + WHERE (`domain` IN ( + SELECT `domain` from `domain_admins` + WHERE (`active`='1' AND `username` = :username)) + ) + OR ('admin'= :role) + AND `domain` != 'ALL'"); + $stmt->execute(array( + ':username' => $_SESSION['mailcow_cc_username'], + ':role' => $_SESSION['mailcow_cc_role'], + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $domains[] = $row['domain']; + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + return $domains; +} +function mailbox_get_domain_details($domain) { + global $lang; + global $pdo; + + $domain = idn_to_ascii(strtolower(trim($domain))); + + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; } - if (!empty($password) && !empty($password2)) { - if ($password != $password2) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => sprintf($lang['danger']['password_mismatch']) - ); - return false; - } - $password_hashed = hash_password($password); - try { - $stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active, `password` = :password_hashed WHERE `username` = :username"); - $stmt->execute(array( - ':password_hashed' => $password_hashed, - ':username' => $username, - ':modified' => date('Y-m-d H:i:s'), - ':active' => $active - )); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } - } - else { - try { - $stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active WHERE `username` = :username"); - $stmt->execute(array( - ':username' => $username, - ':modified' => date('Y-m-d H:i:s'), - ':active' => $active - )); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } - } + try { + $stmt = $pdo->prepare("SELECT + `domain`, + `aliases`, + `mailboxes`, + `maxquota`, + `quota`, + CASE `backupmx` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `backupmx`, + CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + FROM `domain` WHERE `domain`= :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $domaindata['domain_name'] = $row['domain']; + $domaindata['max_num_aliases_for_domain'] = $row['aliases']; + $domaindata['max_num_mboxes_for_domain'] = $row['mailboxes']; + $domaindata['max_quota_for_mbox'] = formatBytes(intval($row['maxquota'] * 1048576), 2); + $domaindata['max_quota_for_domain'] = formatBytes(intval($row['quota'] * 1048576), 2); + $domaindata['backupmx'] = $row['backupmx']; + $domaindata['active'] = $row['active']; + } - $_SESSION['return'] = array( - 'type' => 'success', - 'msg' => sprintf($lang['success']['domain_admin_modified'], htmlspecialchars($username)) - ); + $stmt = $pdo->prepare("SELECT COUNT(*) AS `alias_count` FROM `alias` + WHERE `domain`= :domain + AND `address` NOT IN ( + SELECT `username` FROM `mailbox` + )"); + $stmt->execute(array( + ':domain' => $domain, + )); + $row = $stmt->fetchAll(); + $domaindata['aliases_in_domain'] = $row[0]['alias_count']; + + $stmt = $pdo->prepare("SELECT COUNT(`username`) AS `mailbox_count`, SUM(`quota`) AS `quota` FROM `mailbox` + WHERE `domain` = :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); + $row = $stmt->fetchAll(); + $domaindata['mboxes_in_domain'] = $row[0]['mailbox_count']; + $domaindata['quota_used_in_domain'] = formatBytes(intval($row[0]['quota']), 2); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + + return $domaindata; +} +function mailbox_get_mailbox_details($mailbox) { + global $lang; + global $pdo; + try { + $stmt = $pdo->prepare("SELECT + `domain`.`backupmx`, + `mailbox`.`username`, + `mailbox`.`name`, + CASE `mailbox`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `mailbox`.`domain`, + `mailbox`.`quota`, + `quota2`.`bytes`, + `quota2`.`messages` + FROM `mailbox`, `quota2`, `domain` + WHERE `mailbox`.`username` = `quota2`.`username` AND `domain`.`domain` = `mailbox`.`domain` AND `mailbox`.`username` = :mailbox"); + $stmt->execute(array( + ':mailbox' => $mailbox, + )); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $mailboxdata['username'] = $row['username']; + $mailboxdata['is_relayed'] = $row['backupmx']; + $mailboxdata['name'] = $row['name']; + $mailboxdata['active'] = $row['active']; + $mailboxdata['domain'] = $row['domain']; + $mailboxdata['quota'] = formatBytes(intval($row['quota']), 2); + $mailboxdata['quota_used'] = formatBytes(intval($row['bytes']), 2); + $mailboxdata['percent_in_use'] = round((intval($row['bytes']) / intval($row['quota'])) * 100); + $mailboxdata['messages'] = $row['messages']; + if ($mailboxdata['percent_in_use'] >= 90) { + $mailboxdata['percent_class'] = "danger"; + } + elseif ($mailboxdata['percent_in_use'] >= 75) { + $mailboxdata['percent_class'] = "warning"; + } + else { + $mailboxdata['percent_class'] = "success"; + } + } + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if (isset($mailboxdata['domain']) && !hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $mailboxdata['domain'])) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + return $mailboxdata; } function mailbox_edit_mailbox($postarray) { global $lang; @@ -1808,6 +2060,122 @@ function mailbox_delete_mailbox($postarray) { 'msg' => sprintf($lang['success']['mailbox_removed'], htmlspecialchars($username)) ); } +function edit_domain_admin($postarray) { + global $lang; + global $pdo; + $username = $postarray['username']; + $password = $postarray['password']; + $password2 = $postarray['password2']; + isset($postarray['active']) ? $active = '1' : $active = '0'; + + if ($_SESSION['mailcow_cc_role'] != "admin") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + + foreach ($postarray['domain'] as $domain) { + if (!is_valid_domain_name($domain)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['domain_invalid']) + ); + return false; + } + } + + if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['username_invalid']) + ); + return false; + } + + try { + $stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username"); + $stmt->execute(array( + ':username' => $username, + )); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + + foreach ($postarray['domain'] as $domain) { + try { + $stmt = $pdo->prepare("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`) + VALUES (:username, :domain, :created, :active)"); + $stmt->execute(array( + ':username' => $username, + ':domain' => $domain, + ':created' => date('Y-m-d H:i:s'), + ':active' => $active + )); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + } + + if (!empty($password) && !empty($password2)) { + if ($password != $password2) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['password_mismatch']) + ); + return false; + } + $password_hashed = hash_password($password); + try { + $stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active, `password` = :password_hashed WHERE `username` = :username"); + $stmt->execute(array( + ':password_hashed' => $password_hashed, + ':username' => $username, + ':modified' => date('Y-m-d H:i:s'), + ':active' => $active + )); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + } + else { + try { + $stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active WHERE `username` = :username"); + $stmt->execute(array( + ':username' => $username, + ':modified' => date('Y-m-d H:i:s'), + ':active' => $active + )); + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + } + $_SESSION['return'] = array( + 'type' => 'success', + 'msg' => sprintf($lang['success']['domain_admin_modified'], htmlspecialchars($username)) + ); +} function set_admin_account($postarray) { global $lang; global $pdo; @@ -1912,11 +2280,19 @@ function set_time_limited_aliases($postarray) { global $lang; global $pdo; $username = $_SESSION['mailcow_cc_username']; - $domain = substr($username, strpos($username, '@')); - if (($_SESSION['mailcow_cc_role'] != "user" && - $_SESSION['mailcow_cc_role'] != "domainadmin") || - empty($username) || - empty($domain)) { + try { + $stmt = $pdo->prepare("SELECT `domain` FROM `mailbox` WHERE `username` = :username"); + $stmt->execute(array(':username' => $username)); + $domain = $stmt->fetch(PDO::FETCH_ASSOC)['domain']; + } + catch (PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; + } + if ($_SESSION['mailcow_cc_role'] != "user" || empty($username) || empty($domain)) { $_SESSION['return'] = array( 'type' => 'danger', 'msg' => sprintf($lang['danger']['access_denied']) @@ -1939,7 +2315,7 @@ function set_time_limited_aliases($postarray) { $stmt = $pdo->prepare("INSERT INTO `spamalias` (`address`, `goto`, `validity`) VALUES (:address, :goto, :validity)"); $stmt->execute(array( - ':address' => $random_name.$domain, + ':address' => $random_name . '@' . $domain, ':goto' => $username, ':validity' => $validity )); @@ -1956,7 +2332,7 @@ function set_time_limited_aliases($postarray) { 'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username)) ); break; - case "delete": + case "deleteall": try { $stmt = $pdo->prepare("DELETE FROM `spamalias` WHERE `goto` = :username"); $stmt->execute(array( @@ -1975,6 +2351,34 @@ function set_time_limited_aliases($postarray) { 'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username)) ); break; + case "delete": + if (empty($postarray['item']) || !filter_var($postarray['item'], FILTER_VALIDATE_EMAIL)) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } + $item = $postarray['item']; + try { + $stmt = $pdo->prepare("DELETE FROM `spamalias` WHERE `goto` = :username AND `address` = :item"); + $stmt->execute(array( + ':username' => $username, + ':item' => $item + )); + } + 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)) + ); + break; case "extend": try { $stmt = $pdo->prepare("UPDATE `spamalias` SET `validity` = (`validity` + 3600) @@ -2538,6 +2942,7 @@ function set_syncjob($postarray, $action) { ); return true; } + // ADD elseif ($action == "add") { isset($postarray['active']) ? $active = '1' : $active = '0'; isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0'; @@ -2545,10 +2950,26 @@ function set_syncjob($postarray, $action) { $host1 = $postarray['host1']; $password1 = $postarray['password1']; $exclude = $postarray['exclude']; + $maxage = $postarray['maxage']; + $subfolder2 = $postarray['subfolder2']; $user1 = $postarray['user1']; $mins_interval = $postarray['mins_interval']; $enc1 = $postarray['enc1']; + if (empty($subfolder2)) { + $subfolder2 = ""; + } + if (empty($maxage)) { + $maxage = 0; + } + + if (!filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 0, 'max_range' => 32767)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) { $_SESSION['return'] = array( 'type' => 'danger', @@ -2605,11 +3026,13 @@ function set_syncjob($postarray, $action) { 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 = $pdo->prepare("INSERT INTO `imapsync` (`user2`, `exclude`, `maxage`, `subfolder2`, `host1`, `authmech1`, `user1`, `password1`, `mins_interval`, `port1`, `enc1`, `delete2duplicates`, `active`) + VALUES (:user2, :exclude, :maxage, :subfolder2, :host1, :authmech1, :user1, :password1, :mins_interval, :port1, :enc1, :delete2duplicates, :active)"); $stmt->execute(array( ':user2' => $username, ':exclude' => $exclude, + ':maxage' => $maxage, + ':subfolder2' => $subfolder2, ':host1' => $host1, ':authmech1' => 'PLAIN', ':user1' => $user1, @@ -2634,6 +3057,7 @@ function set_syncjob($postarray, $action) { ); return true; } + // EDIT elseif ($action == "edit") { isset($postarray['active']) ? $active = '1' : $active = '0'; isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0'; @@ -2642,9 +3066,26 @@ function set_syncjob($postarray, $action) { $host1 = $postarray['host1']; $password1 = $postarray['password1']; $exclude = $postarray['exclude']; + $maxage = $postarray['maxage']; + $subfolder2 = $postarray['subfolder2']; $user1 = $postarray['user1']; $mins_interval = $postarray['mins_interval']; $enc1 = $postarray['enc1']; + + if (empty($subfolder2)) { + $subfolder2 = ""; + } + if (empty($maxage)) { + $maxage = 0; + } + + if (!filter_var($maxage, FILTER_VALIDATE_INT, array('options' => array('min_range' => 0, 'max_range' => 32767)))) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) { $_SESSION['return'] = array( 'type' => 'danger', @@ -2701,12 +3142,14 @@ function set_syncjob($postarray, $action) { 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 + $stmt = $pdo->prepare("UPDATE `imapsync` set `maxage` = :maxage, `subfolder2` = :subfolder2, `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, + ':maxage' => $maxage, + ':subfolder2' => $subfolder2, ':host1' => $host1, ':user1' => $user1, ':password1' => $password1, @@ -2966,50 +3409,58 @@ function tagging_options($action, $data = null) { } return false; } -function user_object_info($action, $data = null) { +function user_get_alias_details($username) { global $lang; global $pdo; - $username = $_SESSION['mailcow_cc_username']; - if ($action == "get") { - if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { - return false; - } - try { - $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') AS `aliases` FROM `alias` WHERE `goto` = :username_goto AND `address` NOT LIKE '@%' AND `address` != :username_address"); - $stmt->execute(array(':username_goto' => $username, ':username_address' => $username)); - $run = $stmt->fetchAll(PDO::FETCH_ASSOC); - while ($row = array_shift($run)) { - $data['aliases'] = $row['aliases']; - } - $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';"); - $stmt->execute(array(':username' => $username)); - $run = $stmt->fetchAll(PDO::FETCH_ASSOC); - while ($row = array_shift($run)) { - $data['aliases_also_send_as'] = $row['send_as']; - } - $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` LIKE '@%';"); - $stmt->execute(array(':username' => $username)); - $run = $stmt->fetchAll(PDO::FETCH_ASSOC); - while ($row = array_shift($run)) { - $data['aliases_send_as_all'] = $row['send_as']; - } - $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') as `address` FROM `alias` WHERE `goto` = :username AND `address` LIKE '@%';"); - $stmt->execute(array(':username' => $username)); - $run = $stmt->fetchAll(PDO::FETCH_ASSOC); - while ($row = array_shift($run)) { - $data['is_catch_all'] = $row['address']; - } - return $data; - } - catch(PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } + if ($_SESSION['mailcow_cc_role'] == "user") { + $username = $_SESSION['mailcow_cc_username']; + } + if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { + return false; + } + try { + $data['address'] = $username; + $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') AS `aliases` FROM `alias` WHERE `goto` = :username_goto AND `address` NOT LIKE '@%' AND `address` != :username_address"); + $stmt->execute(array(':username_goto' => $username, ':username_address' => $username)); + $run = $stmt->fetchAll(PDO::FETCH_ASSOC); + while ($row = array_shift($run)) { + $data['aliases'] = $row['aliases']; + } + $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ', '), '✘') AS `ad_alias` FROM `mailbox` + LEFT OUTER JOIN `alias_domain` on `target_domain` = `domain` + WHERE `username` = :username ;"); + $stmt->execute(array(':username' => $username)); + $run = $stmt->fetchAll(PDO::FETCH_ASSOC); + while ($row = array_shift($run)) { + $data['ad_alias'] = $row['ad_alias']; + } + $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';"); + $stmt->execute(array(':username' => $username)); + $run = $stmt->fetchAll(PDO::FETCH_ASSOC); + while ($row = array_shift($run)) { + $data['aliases_also_send_as'] = $row['send_as']; + } + $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` LIKE '@%';"); + $stmt->execute(array(':username' => $username)); + $run = $stmt->fetchAll(PDO::FETCH_ASSOC); + while ($row = array_shift($run)) { + $data['aliases_send_as_all'] = $row['send_as']; + } + $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') as `address` FROM `alias` WHERE `goto` = :username AND `address` LIKE '@%';"); + $stmt->execute(array(':username' => $username)); + $run = $stmt->fetchAll(PDO::FETCH_ASSOC); + while ($row = array_shift($run)) { + $data['is_catch_all'] = $row['address']; + } + return $data; + } + catch(PDOException $e) { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => 'MySQL: '.$e + ); + return false; } - return false; } function is_valid_domain_name($domain_name) { if (empty($domain_name)) { diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php index d72ec73f..43e1119c 100644 --- a/data/web/inc/header.inc.php +++ b/data/web/inc/header.inc.php @@ -232,10 +232,14 @@ endif; ?>
  • +
  • + diff --git a/data/web/inc/init.sql b/data/web/inc/init.sql index a85d6bfb..64d7da5a 100644 --- a/data/web/inc/init.sql +++ b/data/web/inc/init.sql @@ -1,120 +1,125 @@ CREATE TABLE IF NOT EXISTS `admin` ( - `username` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `superadmin` tinyint(1) NOT NULL DEFAULT '0', - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `modified` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `active` tinyint(1) NOT NULL DEFAULT '1', + `username` VARCHAR(255) NOT NULL, + `password` VARCHAR(255) NOT NULL, + `superadmin` TINYINT(1) NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `active` TINYINT(1) NOT NULL DEFAULT '1', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `alias` ( - `address` varchar(255) NOT NULL, - `goto` text NOT NULL, - `domain` varchar(255) NOT NULL, - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `modified` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `active` tinyint(1) NOT NULL DEFAULT '1', + `address` VARCHAR(255) NOT NULL, + `goto` TEXT NOT NULL, + `domain` VARCHAR(255) NOT NULL, + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `active` TINYINT(1) NOT NULL DEFAULT '1', PRIMARY KEY (`address`), KEY `domain` (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `sender_acl` ( - `logged_in_as` varchar(255) NOT NULL, - `send_as` varchar(255) NOT NULL + `logged_in_as` VARCHAR(255) NOT NULL, + `send_as` VARCHAR(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `spamalias` ( - `address` varchar(255) NOT NULL, - `goto` text NOT NULL, - `validity` int(11) NOT NULL, + `address` VARCHAR(255) NOT NULL, + `goto` TEXT NOT NULL, + `validity` INT(11) NOT NULL, PRIMARY KEY (`address`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `alias_domain` ( - `alias_domain` varchar(255) NOT NULL, - `target_domain` varchar(255) NOT NULL, - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `modified` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `active` tinyint(1) NOT NULL DEFAULT '1', + `alias_domain` VARCHAR(255) NOT NULL, + `target_domain` VARCHAR(255) NOT NULL, + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `active` TINYINT(1) NOT NULL DEFAULT '1', PRIMARY KEY (`alias_domain`), KEY `active` (`active`), KEY `target_domain` (`target_domain`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `domain` ( - `domain` varchar(255) NOT NULL, - `description` varchar(255), - `aliases` int(10) NOT NULL DEFAULT '0', - `mailboxes` int(10) NOT NULL DEFAULT '0', - `maxquota` bigint(20) NOT NULL DEFAULT '0', - `quota` bigint(20) NOT NULL DEFAULT '0', - `transport` varchar(255) NOT NULL, - `backupmx` tinyint(1) NOT NULL DEFAULT '0', - `relay_all_recipients` tinyint(1) NOT NULL DEFAULT '0', - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `modified` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `active` tinyint(1) NOT NULL DEFAULT '1', + `domain` VARCHAR(255) NOT NULL, + `description` VARCHAR(255), + `aliases` INT(10) NOT NULL DEFAULT '0', + `mailboxes` INT(10) NOT NULL DEFAULT '0', + `maxquota` BIGINT(20) NOT NULL DEFAULT '0', + `quota` BIGINT(20) NOT NULL DEFAULT '0', + `transport` VARCHAR(255) NOT NULL, + `backupmx` TINYINT(1) NOT NULL DEFAULT '0', + `relay_all_recipients` TINYINT(1) NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `active` TINYINT(1) NOT NULL DEFAULT '1', PRIMARY KEY (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `domain_admins` ( - `username` varchar(255) NOT NULL, - `domain` varchar(255) NOT NULL, - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `active` tinyint(1) NOT NULL DEFAULT '1', + `username` VARCHAR(255) NOT NULL, + `domain` VARCHAR(255) NOT NULL, + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `active` TINYINT(1) NOT NULL DEFAULT '1', KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `mailbox` ( - `username` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `name` varchar(255), - `maildir` varchar(255) NOT NULL, - `quota` bigint(20) NOT NULL DEFAULT '0', - `local_part` varchar(255) NOT NULL, - `domain` varchar(255) NOT NULL, - `created` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `modified` datetime NOT NULL DEFAULT '2016-01-01 00:00:00', - `tls_enforce_in` tinyint(1) NOT NULL DEFAULT '0', - `tls_enforce_out` tinyint(1) NOT NULL DEFAULT '0', - `kind` varchar(100) NOT NULL DEFAULT '', - `multiple_bookings` tinyint(1) NOT NULL DEFAULT '0', - `wants_tagged_subject` tinyint(1) NOT NULL DEFAULT '0', - `active` tinyint(1) NOT NULL DEFAULT '1', + `username` VARCHAR(255) NOT NULL, + `password` VARCHAR(255) NOT NULL, + `name` VARCHAR(255), + `maildir` VARCHAR(255) NOT NULL, + `quota` BIGINT(20) NOT NULL DEFAULT '0', + `local_part` VARCHAR(255) NOT NULL, + `domain` VARCHAR(255) NOT NULL, + `created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00', + `tls_enforce_in` TINYINT(1) NOT NULL DEFAULT '0', + `tls_enforce_out` TINYINT(1) NOT NULL DEFAULT '0', + `kind` VARCHAR(100) NOT NULL DEFAULT '', + `multiple_bookings` TINYINT(1) NOT NULL DEFAULT '0', + `wants_tagged_subject` TINYINT(1) NOT NULL DEFAULT '0', + `active` TINYINT(1) NOT NULL DEFAULT '1', PRIMARY KEY (`username`), KEY `domain` (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `quota2` ( - `username` varchar(100) NOT NULL, - `bytes` bigint(20) NOT NULL DEFAULT '0', - `messages` int(11) NOT NULL DEFAULT '0', + `username` VARCHAR(100) NOT NULL, + `bytes` BIGINT(20) NOT NULL DEFAULT '0', + `messages` INT(11) NOT NULL DEFAULT '0', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS `filterconf` ( - `object` varchar(100) NOT NULL DEFAULT '', - `option` varchar(50) NOT NULL DEFAULT '', - `value` varchar(100) NOT NULL DEFAULT '', - `prefid` int(11) NOT NULL AUTO_INCREMENT, + `object` VARCHAR(100) NOT NULL DEFAULT '', + `option` VARCHAR(50) NOT NULL DEFAULT '', + `value` VARCHAR(100) NOT NULL DEFAULT '', + `prefid` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`prefid`), 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, + `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, + `regextrans2` VARCHAR(255) DEFAULT '', + `authmd51` TINYINT(1) NOT NULL DEFAULT 0, + `domain2` VARCHAR(255) NOT NULL DEFAULT '', + `subfolder2` VARCHAR(255) NOT NULL DEFAULT '', + `user1` VARCHAR(255) NOT NULL, + `password1` VARCHAR(255) NOT NULL, `exclude` VARCHAR(500) NOT NULL DEFAULT '', - `mins_interval` VARCHAR(50) NOT NULL, + `maxage` SMALLINT NOT NULL DEFAULT '0', + `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, + `returned_TEXT` TEXT, `last_run` TIMESTAMP NULL DEFAULT NULL, `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -143,80 +148,80 @@ SELECT username, IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ' ' LEFT OUTER JOIN alias_domain on target_domain=domain GROUP BY username; CREATE TABLE IF NOT EXISTS sogo_acl ( - c_folder_id integer NOT NULL, + c_folder_id INTeger NOT NULL, c_object character varying(255) NOT NULL, c_uid character varying(255) NOT NULL, c_role character varying(80) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_alarms_folder ( - c_path varchar(255) NOT NULL, - c_name varchar(255) NOT NULL, - c_uid varchar(255) NOT NULL, - c_recurrence_id int(11) DEFAULT NULL, - c_alarm_number int(11) NOT NULL, - c_alarm_date int(11) NOT NULL + c_path VARCHAR(255) NOT NULL, + c_name VARCHAR(255) NOT NULL, + c_uid VARCHAR(255) NOT NULL, + c_recurrence_id INT(11) DEFAULT NULL, + c_alarm_number INT(11) NOT NULL, + c_alarm_date INT(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_cache_folder ( - c_uid varchar(255) NOT NULL, - c_path varchar(255) NOT NULL, - c_parent_path varchar(255) DEFAULT NULL, - c_type tinyint(3) unsigned NOT NULL, - c_creationdate int(11) NOT NULL, - c_lastmodified int(11) NOT NULL, - c_version int(11) NOT NULL DEFAULT '0', - c_deleted tinyint(4) NOT NULL DEFAULT '0', - c_content longtext, + c_uid VARCHAR(255) NOT NULL, + c_path VARCHAR(255) NOT NULL, + c_parent_path VARCHAR(255) DEFAULT NULL, + c_type TINYINT(3) unsigned NOT NULL, + c_creationdate INT(11) NOT NULL, + c_lastmodified INT(11) NOT NULL, + c_version INT(11) NOT NULL DEFAULT '0', + c_deleted TINYINT(4) NOT NULL DEFAULT '0', + c_content longTEXT, PRIMARY KEY (c_uid,c_path) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_folder_info ( - c_folder_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, - c_path varchar(255) NOT NULL, - c_path1 varchar(255) NOT NULL, - c_path2 varchar(255) DEFAULT NULL, - c_path3 varchar(255) DEFAULT NULL, - c_path4 varchar(255) DEFAULT NULL, - c_foldername varchar(255) NOT NULL, - c_location integer NULL, - c_quick_location varchar(2048) DEFAULT NULL, - c_acl_location varchar(2048) DEFAULT NULL, - c_folder_type varchar(255) NOT NULL, + c_folder_id BIGINT(20) unsigned NOT NULL AUTO_INCREMENT, + c_path VARCHAR(255) NOT NULL, + c_path1 VARCHAR(255) NOT NULL, + c_path2 VARCHAR(255) DEFAULT NULL, + c_path3 VARCHAR(255) DEFAULT NULL, + c_path4 VARCHAR(255) DEFAULT NULL, + c_foldername VARCHAR(255) NOT NULL, + c_location INTeger NULL, + c_quick_location VARCHAR(2048) DEFAULT NULL, + c_acl_location VARCHAR(2048) DEFAULT NULL, + c_folder_type VARCHAR(255) NOT NULL, PRIMARY KEY (c_path), UNIQUE KEY c_folder_id (c_folder_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -CREATE TABLE IF NOT EXISTS sogo_quick_appointment ( - c_folder_id integer NOT NULL, +CREATE TABLE IF NOT EXISTS sogo_quick_appoINTment ( + c_folder_id INTeger NOT NULL, c_name character varying(255) NOT NULL, c_uid character varying(255) NOT NULL, - c_startdate integer, - c_enddate integer, - c_cycleenddate integer, + c_startdate INTeger, + c_enddate INTeger, + c_cycleenddate INTeger, c_title character varying(1000) NOT NULL, - c_participants text, - c_isallday integer, - c_iscycle integer, - c_cycleinfo text, - c_classification integer NOT NULL, - c_isopaque integer NOT NULL, - c_status integer NOT NULL, - c_priority integer, + c_participants TEXT, + c_isallday INTeger, + c_iscycle INTeger, + c_cycleinfo TEXT, + c_classification INTeger NOT NULL, + c_isopaque INTeger NOT NULL, + c_status INTeger NOT NULL, + c_priority INTeger, c_location character varying(255), c_orgmail character varying(255), - c_partmails text, - c_partstates text, + c_partmails TEXT, + c_partstates TEXT, c_category character varying(255), - c_sequence integer, + c_sequence INTeger, c_component character varying(10) NOT NULL, - c_nextalarm integer, - c_description text, - CONSTRAINT sogo_quick_appointment_pkey PRIMARY KEY (c_folder_id, c_name) + c_nextalarm INTeger, + c_description TEXT, + CONSTRAINT sogo_quick_appoINTment_pkey PRIMARY KEY (c_folder_id, c_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_quick_contact ( - c_folder_id integer NOT NULL, + c_folder_id INTeger NOT NULL, c_name character varying(255) NOT NULL, c_givenname character varying(255), c_cn character varying(255), @@ -233,28 +238,28 @@ CREATE TABLE IF NOT EXISTS sogo_quick_contact ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_sessions_folder ( - c_id varchar(255) NOT NULL, - c_value varchar(255) NOT NULL, - c_creationdate int(11) NOT NULL, - c_lastseen int(11) NOT NULL, + c_id VARCHAR(255) NOT NULL, + c_value VARCHAR(255) NOT NULL, + c_creationdate INT(11) NOT NULL, + c_lastseen INT(11) NOT NULL, PRIMARY KEY (c_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_store ( - c_folder_id integer NOT NULL, + c_folder_id INTeger NOT NULL, c_name character varying(255) NOT NULL, - c_content mediumtext NOT NULL, - c_creationdate integer NOT NULL, - c_lastmodified integer NOT NULL, - c_version integer NOT NULL, - c_deleted integer, + c_content mediumTEXT NOT NULL, + c_creationdate INTeger NOT NULL, + c_lastmodified INTeger NOT NULL, + c_version INTeger NOT NULL, + c_deleted INTeger, CONSTRAINT sogo_store_pkey PRIMARY KEY (c_folder_id, c_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE IF NOT EXISTS sogo_user_profile ( - c_uid varchar(255) NOT NULL, - c_defaults text, - c_settings text, + c_uid VARCHAR(255) NOT NULL, + c_defaults TEXT, + c_settings TEXT, PRIMARY KEY (c_uid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/data/web/inc/prerequisites.inc.php b/data/web/inc/prerequisites.inc.php index cec7454d..4ec73e52 100644 --- a/data/web/inc/prerequisites.inc.php +++ b/data/web/inc/prerequisites.inc.php @@ -3,10 +3,17 @@ //ini_set("session.cookie_httponly", 1); session_start(); if (isset($_POST["logout"])) { - session_unset(); - session_destroy(); - session_write_close(); - setcookie(session_name(),'',0,'/'); + if (isset($_SESSION["dual-login"])) { + $_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"]; + $_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"]; + unset($_SESSION["dual-login"]); + } + else { + session_unset(); + session_destroy(); + session_write_close(); + setcookie(session_name(),'',0,'/'); + } } require_once 'inc/vars.inc.php'; @@ -75,4 +82,4 @@ require_once 'lang/lang.en.php'; include 'lang/lang.'.$_SESSION['mailcow_locale'].'.php'; require_once 'inc/functions.inc.php'; require_once 'inc/triggers.inc.php'; -init_db_schema(); +(!isset($_SESSION['mailcow_cc_username'])) ? init_db_schema() : null; diff --git a/data/web/inc/triggers.inc.php b/data/web/inc/triggers.inc.php index c2588148..00de3a9e 100644 --- a/data/web/inc/triggers.inc.php +++ b/data/web/inc/triggers.inc.php @@ -25,6 +25,20 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) { } } if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") { + if (isset($_GET["duallogin"])) { + if (filter_var($_GET["duallogin"], FILTER_VALIDATE_EMAIL)) { + $stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `username` = :duallogin"); + $stmt->execute(array(':duallogin' => $_GET["duallogin"])); + $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); + if ($num_results != 0) { + $_SESSION["dual-login"]["username"] = $_SESSION['mailcow_cc_username']; + $_SESSION["dual-login"]["role"] = $_SESSION['mailcow_cc_role']; + $_SESSION['mailcow_cc_username'] = $_GET["duallogin"]; + $_SESSION['mailcow_cc_role'] = "user"; + header("Location: /user.php"); + } + } + } if (isset($_POST["trigger_set_admin"])) { set_admin_account($_POST); } diff --git a/data/web/js/user.js b/data/web/js/user.js index 821ff99d..9dbca08c 100644 --- a/data/web/js/user.js +++ b/data/web/js/user.js @@ -15,6 +15,9 @@ $(document).ready(function() { } }); + $(function () { + $('[data-toggle="tooltip"]').tooltip() + }) // Show generate button after time selection $('#trigger_set_time_limited_aliases').hide(); $('#validity').change(function(){ @@ -29,6 +32,6 @@ $(document).ready(function() { // Log modal $('#logModal').on('show.bs.modal', function(e) { var logText = $(e.relatedTarget).data('log-text'); - $(e.currentTarget).find('#logText').html('
    ' + logText + '
    '); + $(e.currentTarget).find('#logText').html('
    ' + logText + '
    '); }); }); \ No newline at end of file diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php index 328167cb..de983776 100644 --- a/data/web/lang/lang.de.php +++ b/data/web/lang/lang.de.php @@ -66,7 +66,7 @@ $lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse'; $lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox oder ein Alias mit der Adresse %s ist bereits vorhanden"; $lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse'; $lang['danger']['quota_not_0_not_numeric'] = 'Speicherplatz muss numerisch und >= 0 sein'; -$lang['danger']['domain_not_found'] = 'Domain nicht gefunden.'; +$lang['danger']['domain_not_found'] = 'Domain "%s" nicht gefunden.'; $lang['danger']['max_mailbox_exceeded'] = 'Anzahl an Mailboxen überschritten (%d von %d)'; $lang['danger']['mailbox_quota_exceeded'] = 'Speicherplatz überschreitet das Limit (max. %d MiB)'; $lang['danger']['mailbox_quota_left_exceeded'] = 'Nicht genügend Speicherplatz vorhanden (Speicherplatz anwendbar: %d MiB)'; @@ -102,6 +102,7 @@ $lang['user']['did_you_know'] = 'Wussten Sie schon? Sie können Ihre E-Ma $lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse'; $lang['user']['alias'] = 'Alias'; $lang['user']['aliases'] = 'Aliasse'; +$lang['user']['domain_aliases'] = 'Domain-Alias Adressen'; $lang['user']['is_catch_all'] = 'Ist Catch-All Adresse für Domain(s)'; $lang['user']['aliases_also_send_as'] = 'Darf außerdem versenden als'; $lang['user']['aliases_send_as_all'] = 'Absender für folgende Domains nicht prüfen'; @@ -163,6 +164,7 @@ $lang['user']['active'] = 'Aktiv'; $lang['user']['action'] = 'Aktion'; $lang['user']['edit'] = 'Bearbeiten'; $lang['user']['remove'] = 'Entfernen'; +$lang['user']['delete_now'] = 'Sofort löschen'; $lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen'; $lang['start']['dashboard'] = '%s - Dashboard'; @@ -194,6 +196,7 @@ $lang['header']['mailboxes'] = 'Mailboxen'; $lang['header']['user_settings'] = 'Benutzereinstellungen'; $lang['header']['login'] = 'Anmeldung'; $lang['header']['logged_in_as_logout'] = 'Eingeloggt als %s (abmelden)'; +$lang['header']['logged_in_as_logout_dual'] = 'Eingeloggt als %s [%s]'; $lang['header']['locale'] = 'Sprache'; $lang['mailbox']['domain'] = 'Domain'; $lang['mailbox']['alias'] = 'Alias'; @@ -220,7 +223,7 @@ $lang['mailbox']['msg_num'] = 'Anzahl Nachrichten'; $lang['mailbox']['remove'] = 'Entfernen'; $lang['mailbox']['edit'] = 'Bearbeiten'; $lang['mailbox']['archive'] = 'Archiv-Zugriff'; -$lang['mailbox']['no_record'] = 'Kein Eintrag'; +$lang['mailbox']['no_record'] = 'Kein Eintrag für Objekt %s'; $lang['mailbox']['add_domain'] = 'Domain hinzufügen'; $lang['mailbox']['add_domain_alias'] = 'Domain-Alias hinzufügen'; $lang['mailbox']['add_mailbox'] = 'Mailbox hinzufügen'; @@ -247,6 +250,8 @@ $lang['edit']['save'] = 'Änderungen speichern'; $lang['edit']['username'] = 'Benutzername'; $lang['edit']['hostname'] = 'Servername'; $lang['edit']['encryption'] = 'Verschlüsselungsmethode'; +$lang['edit']['maxage'] = 'Maximales Alter in Tagen einer Nachricht, die kopiert werden soll
    (0 = alle Nachrichten kopieren)'; +$lang['edit']['subfolder2'] = 'Ziel-Ordner
    (leer = kein Unterordner)'; $lang['edit']['mins_interval'] = 'Intervall (min)'; $lang['edit']['exclude'] = 'Elemente ausschließen (Regex)'; $lang['edit']['archive'] = 'Archiv-Zugriff'; @@ -292,6 +297,8 @@ $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']['maxage'] = 'Maximum age of messages that will be polled from remote (0 = ignore age)'; +$lang['add']['subfolder2'] = 'Sync into subfolder on destination'; $lang['add']['mins_interval'] = 'Abrufintervall (Minuten)'; $lang['add']['exclude'] = 'Elemente ausschließen (Regex)'; $lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel'; diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 3600d154..e764985c 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -104,6 +104,7 @@ $lang['user']['did_you_know'] = 'Did you know? You can use tags in your e $lang['user']['spam_aliases'] = 'Temporary email aliases'; $lang['user']['alias'] = 'Alias'; $lang['user']['aliases'] = 'Aliases'; +$lang['user']['domain_aliases'] = 'Domain alias addresses'; $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 domain/s'; @@ -165,6 +166,7 @@ $lang['user']['active'] = 'Active'; $lang['user']['action'] = 'Action'; $lang['user']['edit'] = 'Edit'; $lang['user']['remove'] = 'Remove'; +$lang['user']['delete_now'] = 'Remove now'; $lang['user']['create_syncjob'] = 'Create new sync job'; $lang['start']['dashboard'] = '%s - dashboard'; @@ -196,6 +198,7 @@ $lang['header']['mailboxes'] = 'Mailboxes'; $lang['header']['user_settings'] = 'User settings'; $lang['header']['login'] = 'Login'; $lang['header']['logged_in_as_logout'] = 'Logged in as %s (logout)'; +$lang['header']['logged_in_as_logout_dual'] = 'Logged in as %s [%s]'; $lang['header']['locale'] = 'Language'; $lang['mailbox']['domain'] = 'Domain'; $lang['mailbox']['alias'] = 'Alias'; @@ -222,7 +225,7 @@ $lang['mailbox']['msg_num'] = 'Message #'; $lang['mailbox']['remove'] = 'Remove'; $lang['mailbox']['edit'] = 'Edit'; $lang['mailbox']['archive'] = 'Archive'; -$lang['mailbox']['no_record'] = 'No Record'; +$lang['mailbox']['no_record'] = 'No Record for object %s'; $lang['mailbox']['add_domain'] = 'Add domain'; $lang['mailbox']['add_domain_alias'] = 'Add domain alias'; $lang['mailbox']['add_mailbox'] = 'Add mailbox'; @@ -249,6 +252,8 @@ $lang['edit']['save'] = 'Save changes'; $lang['edit']['username'] = 'Save changes'; $lang['edit']['hostname'] = 'Hostname'; $lang['edit']['encryption'] = 'Encryption'; +$lang['edit']['maxage'] = 'Maximum age of messages in days that will be polled from remote
    (0 = ignore age)'; +$lang['edit']['subfolder2'] = 'Sync into subfolder on destination
    (empty = do not use subfolder)'; $lang['edit']['mins_interval'] = 'Interval (min)'; $lang['edit']['exclude'] = 'Exclude objects (regex)'; $lang['edit']['save'] = 'Save changes'; @@ -296,6 +301,8 @@ $lang['add']['hostname'] = 'Hostname'; $lang['add']['username'] = 'Username'; $lang['add']['enc_method'] = 'Encryption method'; $lang['add']['mins_interval'] = 'Polling interval (minutes)'; +$lang['add']['maxage'] = 'Maximum age of messages that will be polled from remote (0 = ignore age)'; +$lang['add']['subfolder2'] = 'Sync into subfolder on destination'; $lang['add']['exclude'] = 'Exclude objects (regex)'; $lang['add']['delete2duplicates'] = 'Delete duplicates on destination'; diff --git a/data/web/mailbox.php b/data/web/mailbox.php index b04523f4..26c799b6 100644 --- a/data/web/mailbox.php +++ b/data/web/mailbox.php @@ -49,80 +49,32 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; prepare("SELECT - `domain`, - `aliases`, - `mailboxes`, - `maxquota` * 1048576 AS `maxquota`, - `quota` * 1048576 AS `quota`, - CASE `backupmx` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `backupmx`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` - FROM `domain` WHERE - `domain` IN ( - SELECT `domain` FROM `domain_admins` WHERE `username`= :username AND `active`='1' - ) - OR 'admin'= :admin"); - $stmt->execute(array( - ':username' => $_SESSION['mailcow_cc_username'], - ':admin' => $_SESSION['mailcow_cc_role'], - )); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } - if(!empty($rows)): - while($row = array_shift($rows)): - try { - $stmt = $pdo->prepare("SELECT COUNT(*) AS `count` FROM `alias` - WHERE `domain`= :domain - AND `address` NOT IN ( - SELECT `username` FROM `mailbox`)"); - $stmt->execute(array(':domain' => $row['domain'])); - $AliasData = $stmt->fetch(PDO::FETCH_ASSOC); - - $stmt = $pdo->prepare("SELECT - COUNT(*) AS `count`, - COALESCE(SUM(`quota`), '0') AS `quota` - FROM `mailbox` - WHERE `domain` = :domain"); - $stmt->execute(array(':domain' => $row['domain'])); - $MailboxData = $stmt->fetch(PDO::FETCH_ASSOC); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } + $domains = mailbox_get_domains(); + if (!empty($domains)): + foreach ($domains as $domain): + $domaindata = mailbox_get_domain_details($domain); ?> - - / - / - - / + + / + / + + / - + - +
    - - + +
    - +
    - - - + + prepare("SELECT - `alias_domain`, - `target_domain`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` - FROM `alias_domain` - WHERE `target_domain` IN ( - SELECT `domain` FROM `domain_admins` - WHERE `username`= :username - AND `active`='1' - ) - OR 'admin' = :admin"); - $stmt->execute(array( - ':username' => $_SESSION['mailcow_cc_username'], - ':admin' => $_SESSION['mailcow_cc_role'], - )); - $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)): - ?> - - - - - -
    - - -
    - - - + + + + + +
    + + +
    + + + - + + } + } + ?> @@ -278,91 +212,45 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; prepare("SELECT - `domain`.`backupmx`, - `mailbox`.`username`, - `mailbox`.`name`, - CASE `mailbox`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, - `mailbox`.`domain`, - `mailbox`.`quota`, - `quota2`.`bytes`, - `quota2`.`messages` - FROM `mailbox`, `quota2`, `domain` - WHERE (`mailbox`.`username` = `quota2`.`username`) - AND (`domain`.`domain` = `mailbox`.`domain`) - AND (`mailbox`.`domain` IN ( - SELECT `domain` FROM `domain_admins` - WHERE `username`= :username - AND `active`='1' - ) - OR 'admin' = :admin)"); - $stmt->execute(array( - ':username' => $_SESSION['mailcow_cc_username'], - ':admin' => $_SESSION['mailcow_cc_role'], - )); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } - if(!empty($rows)): - while($row = array_shift($rows)): + foreach (mailbox_get_domains() as $domain) { + $mailboxes = mailbox_get_mailboxes($domain); + if (!empty($mailboxes)) { + foreach ($mailboxes as $mailbox) { + $mailboxdata = mailbox_get_mailbox_details($mailbox); ?> - - - - - - - - / + ' . htmlspecialchars($mailboxdata['username']) . '';?> + + + / - = 90) { - $pbar = "progress-bar-danger"; - } - elseif ($percentInUse >= 75) { - $pbar = "progress-bar-warning"; - } - else { - $pbar = "progress-bar-success"; - } - ?>
    -
    - % +
    + %
    - - + +
    - - + + + + Login +
    - - + + @@ -405,76 +293,42 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; prepare("SELECT - `address`, - `goto`, - `domain`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` - FROM alias - WHERE ( - `address` NOT IN ( - SELECT `username` FROM `mailbox` - ) - AND `address` != `goto` - ) AND (`domain` IN ( - SELECT `domain` FROM `domain_admins` - WHERE `username` = :username - AND active='1' - ) - OR 'admin' = :admin)"); - $stmt->execute(array( - ':username' => $_SESSION['mailcow_cc_username'], - ':admin' => $_SESSION['mailcow_cc_role'], - )); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - } - catch (PDOException $e) { - $_SESSION['return'] = array( - 'type' => 'danger', - 'msg' => 'MySQL: '.$e - ); - return false; - } - if(!empty($rows)): - while($row = array_shift($rows)): + foreach (mailbox_get_domains() as $domain) { + $aliases = mailbox_get_aliases($domain); + if (!empty($aliases)) { + foreach ($aliases as $alias) { + $aliasdata = mailbox_get_alias_details($alias); ?> - - Catch-all @ - + Catch-all ' . htmlspecialchars($aliasdata['address']) : htmlspecialchars($aliasdata['address']); ?> - - + +
    - - + +
    - - - + + + diff --git a/data/web/user.php b/data/web/user.php index 7d55d0c1..33e26e81 100644 --- a/data/web/user.php +++ b/data/web/user.php @@ -51,29 +51,35 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
    + $user_get_alias_details = user_get_alias_details($username);?>
    :
    -

    +

    +
    +
    +
    +
    :
    +
    +

    :
    -

    +

    :
    -

    +

    :
    -

    +


    @@ -107,16 +113,16 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
    -
    -
    - - - - - - - - +
    +
    +

    +
    +
    +

    +
    +
    +

    +
    prepare("SELECT `address`, @@ -137,21 +143,31 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user if(!empty($rows)): while ($row = array_shift($rows)): ?> -
    - - - +
    +

    +
    +
    +

    +
    +
    + + + + + +
    - +
    +
    +
    - -
    +