commit
0f9acdf238
|
@ -13,7 +13,9 @@ mail_location = maildir:~/
|
||||||
mail_plugins = quota acl zlib antispam
|
mail_plugins = quota acl zlib antispam
|
||||||
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
|
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
|
||||||
ssl_protocols = !SSLv3 !SSLv2
|
ssl_protocols = !SSLv3 !SSLv2
|
||||||
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
|
ssl_prefer_server_ciphers = yes
|
||||||
|
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
|
||||||
|
ssl_options = no_compression
|
||||||
# Automatically regenerates every week
|
# Automatically regenerates every week
|
||||||
ssl_dh_parameters_length = 2048
|
ssl_dh_parameters_length = 2048
|
||||||
log_timestamp = "%Y-%m-%d %H:%M:%S "
|
log_timestamp = "%Y-%m-%d %H:%M:%S "
|
||||||
|
|
|
@ -7,6 +7,18 @@ require "envelope";
|
||||||
if header :contains "X-Spam-Flag" "YES" {
|
if header :contains "X-Spam-Flag" "YES" {
|
||||||
fileinto "Junk";
|
fileinto "Junk";
|
||||||
}
|
}
|
||||||
if envelope :detail :matches "to" "*" {
|
|
||||||
fileinto :create "INBOX/${1}";
|
if allof (
|
||||||
|
envelope :detail :matches "to" "*",
|
||||||
|
header :contains "X-Moo-Tag" "YES",
|
||||||
|
mailboxexists "INBOX/${s}"
|
||||||
|
) {
|
||||||
|
fileinto "INBOX/${s}";
|
||||||
|
}
|
||||||
|
elsif allof (
|
||||||
|
envelope :detail :matches "to" "*",
|
||||||
|
header :contains "X-Moo-Tag" "YES"
|
||||||
|
) {
|
||||||
|
set :lower "s" "${1}";
|
||||||
|
fileinto :create "INBOX/${s}";
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@ server {
|
||||||
ssl_certificate_key /etc/ssl/mail/key.pem;
|
ssl_certificate_key /etc/ssl/mail/key.pem;
|
||||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||||
ssl_prefer_server_ciphers on;
|
ssl_prefer_server_ciphers on;
|
||||||
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
|
ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA';
|
||||||
|
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
|
||||||
ssl_ecdh_curve secp384r1;
|
ssl_ecdh_curve secp384r1;
|
||||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
|
|
||||||
index index.php index.html;
|
index index.php index.html;
|
||||||
server_name _ autodiscover.* autoconfig.*;
|
server_name _ autodiscover.* autoconfig.*;
|
||||||
error_log /var/log/nginx/error.log;
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
|
@ -69,12 +69,16 @@ smtpd_tls_dh1024_param_file = /etc/ssl/mail/dhparams.pem
|
||||||
smtpd_tls_eecdh_grade = strong
|
smtpd_tls_eecdh_grade = strong
|
||||||
smtpd_tls_exclude_ciphers = ECDHE-RSA-RC4-SHA, RC4, aNULL
|
smtpd_tls_exclude_ciphers = ECDHE-RSA-RC4-SHA, RC4, aNULL
|
||||||
smtpd_tls_loglevel = 1
|
smtpd_tls_loglevel = 1
|
||||||
smtpd_tls_mandatory_ciphers = high
|
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
|
||||||
smtpd_tls_mandatory_exclude_ciphers = ECDHE-RSA-RC4-SHA, RC4, aNULL
|
smtp_tls_protocols = !SSLv2, !SSLv3
|
||||||
|
lmtp_tls_mandatory_protocols = !SSLv2, !SSLv3
|
||||||
|
lmtp_tls_protocols = !SSLv2, !SSLv3
|
||||||
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
|
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
|
||||||
smtpd_tls_protocols = !SSLv2, !SSLv3
|
smtpd_tls_protocols = !SSLv2, !SSLv3
|
||||||
|
smtpd_tls_mandatory_ciphers = high
|
||||||
smtpd_tls_security_level = may
|
smtpd_tls_security_level = may
|
||||||
tls_high_cipherlist = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
|
tls_ssl_options = NO_COMPRESSION
|
||||||
|
tls_high_cipherlist = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
|
||||||
virtual_alias_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_domain_catchall_maps.cf
|
virtual_alias_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_alias_domain_catchall_maps.cf
|
||||||
virtual_gid_maps = static:5000
|
virtual_gid_maps = static:5000
|
||||||
virtual_mailbox_base = /var/vmail/
|
virtual_mailbox_base = /var/vmail/
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
ini_set('error_reporting', 0);
|
||||||
|
header('Content-Type: text/plain');
|
||||||
|
require_once "vars.inc.php";
|
||||||
|
$dsn = $database_type . ':host=' . $database_host . ';dbname=' . $database_name;
|
||||||
|
$opt = [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
];
|
||||||
|
$pdo = new PDO($dsn, $database_user, $database_pass, $opt);
|
||||||
|
$stmt = $pdo->query("SELECT `domain` FROM `domain`");
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($rows)) {
|
||||||
|
echo strtolower(trim($row['domain'])) . PHP_EOL;
|
||||||
|
}
|
||||||
|
$stmt = $pdo->query("SELECT `alias_domain` FROM `alias_domain`");
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($rows)) {
|
||||||
|
echo strtolower(trim($row['alias_domain'])) . PHP_EOL;
|
||||||
|
}
|
||||||
|
?>
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
ini_set('error_reporting', 0);
|
||||||
|
header('Content-Type: text/plain');
|
||||||
|
require_once "vars.inc.php";
|
||||||
|
$dsn = $database_type . ':host=' . $database_host . ';dbname=' . $database_name;
|
||||||
|
$opt = [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
];
|
||||||
|
$pdo = new PDO($dsn, $database_user, $database_pass, $opt);
|
||||||
|
$stmt = $pdo->query("SELECT `username` FROM `mailbox` WHERE `wants_tagged_subject` = '1'");
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($rows)) {
|
||||||
|
echo strtolower(trim($row['username'])) . PHP_EOL;
|
||||||
|
}
|
||||||
|
?>
|
|
@ -10,3 +10,52 @@ rspamd_config.MAILCOW_AUTH = {
|
||||||
rspamd_config.MAILCOW_MOO = function (task)
|
rspamd_config.MAILCOW_MOO = function (task)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local modify_subject_map = rspamd_config:add_map({
|
||||||
|
url = 'http://nginx:8081/tags.php',
|
||||||
|
type = 'map',
|
||||||
|
description = 'Map of users to use subject tags for'
|
||||||
|
})
|
||||||
|
|
||||||
|
local auth_domain_map = rspamd_config:add_map({
|
||||||
|
url = 'http://nginx:8081/authoritative.php',
|
||||||
|
type = 'map',
|
||||||
|
description = 'Map of domains we are authoritative for'
|
||||||
|
})
|
||||||
|
|
||||||
|
rspamd_config.ADD_DELIMITER_TAG = {
|
||||||
|
callback = function(task)
|
||||||
|
local util = require("rspamd_util")
|
||||||
|
local rspamd_logger = require "rspamd_logger"
|
||||||
|
local user_tagged = task:get_recipients(1)[1]['user']
|
||||||
|
local domain = task:get_recipients(1)[1]['domain']
|
||||||
|
local user, tag = user_tagged:match("([^+]+)+(.*)")
|
||||||
|
local authdomain = auth_domain_map:get_key(domain)
|
||||||
|
|
||||||
|
if tag and authdomain then
|
||||||
|
rspamd_logger.infox("Domain %s is part of mailcow, start reading tag settings", domain)
|
||||||
|
local user_untagged = user .. '@' .. domain
|
||||||
|
rspamd_logger.infox("Querying tag settings for user %1", user_untagged)
|
||||||
|
if modify_subject_map:get_key(user_untagged) then
|
||||||
|
rspamd_logger.infox("User wants subject modified for tagged mail")
|
||||||
|
local sbj = task:get_header('Subject')
|
||||||
|
if tag then
|
||||||
|
rspamd_logger.infox("Found tag %1, will modify subject header", tag)
|
||||||
|
new_sbj = '=?UTF-8?B?' .. tostring(util.encode_base64('[' .. tag .. '] ' .. sbj)) .. '?='
|
||||||
|
task:set_rmilter_reply({
|
||||||
|
remove_headers = {['Subject'] = 1},
|
||||||
|
add_headers = {['Subject'] = new_sbj}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
rspamd_logger.infox("Add X-Moo-Tag header")
|
||||||
|
task:set_rmilter_reply({
|
||||||
|
add_headers = {['X-Moo-Tag'] = 'YES'}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
rspamd_logger.infox("Skip delimiter handling for untagged message or authenticated user")
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin"):
|
||||||
?>
|
?>
|
||||||
<div id="RestartSOGo" class="modal fade" role="dialog">
|
<div id="RestartSOGo" class="modal fade" role="dialog">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
|
@ -75,8 +75,8 @@ $(document).ready(function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
// IE fix to hide scrollbars when table body is empty
|
// IE fix to hide scrollbars when table body is empty
|
||||||
$('tbody').filter(function (index) {
|
$('tbody').filter(function (index) {
|
||||||
return $(this).children().length < 1;
|
return $(this).children().length < 1;
|
||||||
}).remove();
|
}).remove();
|
||||||
|
|
||||||
// Init Bootstrap Selectpicker
|
// Init Bootstrap Selectpicker
|
||||||
|
|
|
@ -52,6 +52,7 @@ function init_db_schema() {
|
||||||
$data = '';
|
$data = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Create index if not exists
|
||||||
$stmt = $pdo->query("SHOW INDEX FROM sogo_acl WHERE KEY_NAME = 'sogo_acl_c_folder_id_idx'");
|
$stmt = $pdo->query("SHOW INDEX FROM sogo_acl WHERE KEY_NAME = 'sogo_acl_c_folder_id_idx'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
if ($num_results == 0) {
|
if ($num_results == 0) {
|
||||||
|
@ -67,6 +68,22 @@ function init_db_schema() {
|
||||||
'msg' => 'Database initialization completed.'
|
'msg' => 'Database initialization completed.'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Add newly added columns
|
||||||
|
$stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'kind'");
|
||||||
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
if ($num_results == 0) {
|
||||||
|
$pdo->query("ALTER TABLE `mailbox` ADD `kind` varchar(100) NOT NULL DEFAULT ''");
|
||||||
|
}
|
||||||
|
$stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'multiple_bookings'");
|
||||||
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
if ($num_results == 0) {
|
||||||
|
$pdo->query("ALTER TABLE `mailbox` ADD `multiple_bookings` tinyint(1) NOT NULL DEFAULT '0'");
|
||||||
|
}
|
||||||
|
$stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'wants_tagged_subject'");
|
||||||
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
if ($num_results == 0) {
|
||||||
|
$pdo->query("ALTER TABLE `mailbox` ADD `wants_tagged_subject` tinyint(1) NOT NULL DEFAULT '0'");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function verify_ssha256($hash, $password) {
|
function verify_ssha256($hash, $password) {
|
||||||
// Remove tag if any
|
// Remove tag if any
|
||||||
|
@ -2630,6 +2647,101 @@ function get_sender_acl_handles($mailbox, $which) {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
function tagging_options($action, $data = null) {
|
||||||
|
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 `wants_tagged_subject` FROM `mailbox` WHERE `username` = :username");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$SelectData = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
catch(PDOException $e) {
|
||||||
|
$_SESSION['return'] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'msg' => 'MySQL: '.$e
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $SelectData['wants_tagged_subject'];
|
||||||
|
}
|
||||||
|
elseif ($action == "set") {
|
||||||
|
($data['tagged_mail_handler'] == "subject") ? $wants_tagged_subject = '1' : $wants_tagged_subject = '0';
|
||||||
|
if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
|
||||||
|
$_SESSION['return'] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'msg' => sprintf($lang['danger']['username_invalid'])
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$stmt = $pdo->prepare("UPDATE `mailbox` SET `wants_tagged_subject` = :wants_tagged_subject WHERE `username` = :username");
|
||||||
|
$stmt->execute(array(':username' => $username, ':wants_tagged_subject' => $wants_tagged_subject));
|
||||||
|
$SelectData = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
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 false;
|
||||||
|
}
|
||||||
|
function user_object_info($action, $data = null) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
function is_valid_domain_name($domain_name) {
|
function is_valid_domain_name($domain_name) {
|
||||||
if (empty($domain_name)) {
|
if (empty($domain_name)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -78,6 +78,9 @@ CREATE TABLE IF NOT EXISTS `mailbox` (
|
||||||
`modified` 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_in` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
`tls_enforce_out` 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',
|
`active` tinyint(1) NOT NULL DEFAULT '1',
|
||||||
PRIMARY KEY (`username`),
|
PRIMARY KEY (`username`),
|
||||||
KEY `domain` (`domain`)
|
KEY `domain` (`domain`)
|
||||||
|
|
|
@ -51,6 +51,9 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "user
|
||||||
if (isset($_POST["trigger_set_spam_score"])) {
|
if (isset($_POST["trigger_set_spam_score"])) {
|
||||||
set_spam_score($_POST);
|
set_spam_score($_POST);
|
||||||
}
|
}
|
||||||
|
if (isset($_POST["trigger_set_tagging_options"])) {
|
||||||
|
tagging_options('set', $_POST);
|
||||||
|
}
|
||||||
if (isset($_POST["trigger_set_policy_list"])) {
|
if (isset($_POST["trigger_set_policy_list"])) {
|
||||||
set_policy_list($_POST);
|
set_policy_list($_POST);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ $database_name = getenv('DBNAME');
|
||||||
|
|
||||||
// Other variables
|
// Other variables
|
||||||
$mailcow_hostname = getenv('MAILCOW_HOSTNAME');
|
$mailcow_hostname = getenv('MAILCOW_HOSTNAME');
|
||||||
date_default_timezone_set(getenv('TZ'));
|
|
||||||
|
|
||||||
// Where to go after adding and editing objects
|
// Where to go after adding and editing objects
|
||||||
// Can be "form" or "previous"
|
// Can be "form" or "previous"
|
||||||
|
|
|
@ -102,6 +102,8 @@ $lang['user']['did_you_know'] = '<b>Wussten Sie schon?</b> Sie können Ihre E-Ma
|
||||||
$lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse';
|
$lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse';
|
||||||
$lang['user']['alias'] = 'Alias';
|
$lang['user']['alias'] = 'Alias';
|
||||||
$lang['user']['aliases'] = 'Aliasse';
|
$lang['user']['aliases'] = 'Aliasse';
|
||||||
|
$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';
|
$lang['user']['aliases_send_as_all'] = 'Absender für folgende Domains nicht prüfen';
|
||||||
$lang['user']['alias_create_random'] = 'Zufälligen Alias generieren';
|
$lang['user']['alias_create_random'] = 'Zufälligen Alias generieren';
|
||||||
$lang['user']['alias_extend_all'] = 'Gültigkeit +1h';
|
$lang['user']['alias_extend_all'] = 'Gültigkeit +1h';
|
||||||
|
@ -141,6 +143,14 @@ $lang['user']['no_record'] = 'Kein Eintrag';
|
||||||
|
|
||||||
$lang['user']['misc_settings'] = 'Sonstige Kontoeinstellungen';
|
$lang['user']['misc_settings'] = 'Sonstige Kontoeinstellungen';
|
||||||
$lang['user']['misc_delete_profile'] = 'Sonstige Kontoeinstellungen';
|
$lang['user']['misc_delete_profile'] = 'Sonstige Kontoeinstellungen';
|
||||||
|
|
||||||
|
$lang['user']['tag_handling'] = 'Umgang mit getaggten E-Mails steuern';
|
||||||
|
$lang['user']['tag_in_subfolder'] = 'In Unterordner';
|
||||||
|
$lang['user']['tag_in_subject'] = 'In Betreff';
|
||||||
|
$lang['user']['tag_help_explain'] = 'Als Unterordner: Es wird ein Ordner mit dem Namen des Tags unterhalb der Inbox erstellt ("INBOX/Facebook").<br />
|
||||||
|
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<b>+Facebook</b>@example.org';
|
||||||
|
|
||||||
$lang['start']['dashboard'] = '%s - Dashboard';
|
$lang['start']['dashboard'] = '%s - Dashboard';
|
||||||
$lang['start']['start_rc'] = 'Roundcube öffnen';
|
$lang['start']['start_rc'] = 'Roundcube öffnen';
|
||||||
$lang['start']['start_sogo'] = 'SOGo öffnen';
|
$lang['start']['start_sogo'] = 'SOGo öffnen';
|
||||||
|
|
|
@ -103,6 +103,10 @@ $lang['user']['new_password_description'] = 'Requirement: 6 characters long, let
|
||||||
$lang['user']['did_you_know'] = '<b>Did you know?</b> You can use tags in your email address ("me+<b>privat</b>@example.com") to move messages to a folder automatically (example: "privat").';
|
$lang['user']['did_you_know'] = '<b>Did you know?</b> You can use tags in your email address ("me+<b>privat</b>@example.com") to move messages to a folder automatically (example: "privat").';
|
||||||
$lang['user']['spam_aliases'] = 'Temporary email aliases';
|
$lang['user']['spam_aliases'] = 'Temporary email aliases';
|
||||||
$lang['user']['alias'] = 'Alias';
|
$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']['alias_create_random'] = 'Generate random alias';
|
$lang['user']['alias_create_random'] = 'Generate random alias';
|
||||||
$lang['user']['alias_extend_all'] = 'Extend aliases by 1 hour';
|
$lang['user']['alias_extend_all'] = 'Extend aliases by 1 hour';
|
||||||
$lang['user']['alias_valid_until'] = 'Valid until';
|
$lang['user']['alias_valid_until'] = 'Valid until';
|
||||||
|
@ -141,6 +145,14 @@ $lang['user']['no_record'] = 'No Record';
|
||||||
|
|
||||||
$lang['user']['misc_settings'] = 'Other profile settings';
|
$lang['user']['misc_settings'] = 'Other profile settings';
|
||||||
$lang['user']['misc_delete_profile'] = 'Other profile settings';
|
$lang['user']['misc_delete_profile'] = 'Other profile settings';
|
||||||
|
|
||||||
|
$lang['user']['tag_handling'] = 'Set handling for tagged mail';
|
||||||
|
$lang['user']['tag_in_subfolder'] = 'In subfolder';
|
||||||
|
$lang['user']['tag_in_subject'] = 'In subject';
|
||||||
|
$lang['user']['tag_help_explain'] = 'In subfolder: a new subfolder named after the tag will be created below INBOX ("INBOX/Facebook").<br />
|
||||||
|
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<b>+Facebook</b>@example.org';
|
||||||
|
|
||||||
$lang['start']['dashboard'] = '%s - dashboard';
|
$lang['start']['dashboard'] = '%s - dashboard';
|
||||||
$lang['start']['start_rc'] = 'Open Roundcube';
|
$lang['start']['start_rc'] = 'Open Roundcube';
|
||||||
$lang['start']['start_sogo'] = 'Open SOGo';
|
$lang['start']['start_sogo'] = 'Open SOGo';
|
||||||
|
|
|
@ -14,42 +14,86 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading"><?=$lang['user']['mailbox_details'];?></div>
|
<div class="panel-heading"><?=$lang['user']['mailbox_details'];?></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form class="form-horizontal" role="form" method="post" autocomplete="off">
|
<form class="form-horizontal" role="form" method="post" autocomplete="off">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-3 col-sm-10">
|
<div class="col-sm-offset-3 col-sm-10">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label><input type="checkbox" name="togglePwNew" id="togglePwNew"> <?=$lang['user']['change_password'];?></label>
|
<label><input type="checkbox" name="togglePwNew" id="togglePwNew"> <?=$lang['user']['change_password'];?></label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="passFields">
|
<div class="passFields">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-3" for="user_new_pass"><?=$lang['user']['new_password'];?></label>
|
<label class="control-label col-sm-3" for="user_new_pass"><?=$lang['user']['new_password'];?></label>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<input type="password" class="form-control" pattern=".{6,}" name="user_new_pass" id="user_new_pass" autocomplete="off" disabled="disabled" required>
|
<input type="password" class="form-control" pattern=".{6,}" name="user_new_pass" id="user_new_pass" autocomplete="off" disabled="disabled" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-3" for="user_new_pass2"><?=$lang['user']['new_password_repeat'];?></label>
|
<label class="control-label col-sm-3" for="user_new_pass2"><?=$lang['user']['new_password_repeat'];?></label>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<input type="password" class="form-control" pattern=".{6,}" name="user_new_pass2" id="user_new_pass2" disabled="disabled" autocomplete="off" required>
|
<input type="password" class="form-control" pattern=".{6,}" name="user_new_pass2" id="user_new_pass2" disabled="disabled" autocomplete="off" required>
|
||||||
<p class="help-block"><?=$lang['user']['new_password_description'];?></p>
|
<p class="help-block"><?=$lang['user']['new_password_description'];?></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-3" for="user_old_pass"><?=$lang['user']['password_now'];?></label>
|
<label class="control-label col-sm-3" for="user_old_pass"><?=$lang['user']['password_now'];?></label>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<input type="password" class="form-control" name="user_old_pass" id="user_old_pass" autocomplete="off" required>
|
<input type="password" class="form-control" name="user_old_pass" id="user_old_pass" autocomplete="off" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-3 col-sm-9">
|
<div class="col-sm-offset-3 col-sm-9">
|
||||||
<button type="submit" name="trigger_set_user_account" class="btn btn-success btn-default"><?=$lang['user']['save_changes'];?></button>
|
<button type="submit" name="trigger_set_user_account" class="btn btn-success btn-default"><?=$lang['user']['save_changes'];?></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<hr>
|
||||||
|
<?php // Get user information about aliases
|
||||||
|
$get_user_object_info = user_object_info('get');?>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases'];?>:</div>
|
||||||
|
<div class="col-md-9 col-xs-7">
|
||||||
|
<p><?=$get_user_object_info['aliases'];?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases_also_send_as'];?>:</div>
|
||||||
|
<div class="col-md-9 col-xs-7">
|
||||||
|
<p><?=$get_user_object_info['aliases_also_send_as'];?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases_send_as_all'];?>:</div>
|
||||||
|
<div class="col-md-9 col-xs-7">
|
||||||
|
<p><?=$get_user_object_info['aliases_send_as_all'];?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['is_catch_all'];?>:</div>
|
||||||
|
<div class="col-md-9 col-xs-7">
|
||||||
|
<p><?=$get_user_object_info['is_catch_all'];?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<?php // Show tagging options ?>
|
||||||
|
<form class="form-horizontal" role="form" method="post">
|
||||||
|
<?php $get_tagging_options = tagging_options('get');?>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['tag_handling'];?>:</div>
|
||||||
|
<div class="col-md-9 col-xs-7">
|
||||||
|
<input type="hidden" name="trigger_set_tagging_options" value="1">
|
||||||
|
<select name="tagged_mail_handler" class="selectpicker" onchange="this.form.submit()">
|
||||||
|
<option value="subfolder" <?=($get_tagging_options == "0") ? 'selected' : null; ?>><?=$lang['user']['tag_in_subfolder'];?></option>
|
||||||
|
<option value="subject" <?=($get_tagging_options == "1") ? 'selected' : null; ?>><?=$lang['user']['tag_in_subject'];?></option>
|
||||||
|
</select>
|
||||||
|
<p class="help-block"><?=$lang['user']['tag_help_explain'];?></p>
|
||||||
|
<p class="help-block"><?=$lang['user']['tag_help_example'];?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -321,8 +365,7 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<br />
|
||||||
|
|
||||||
</div> <!-- /container -->
|
</div> <!-- /container -->
|
||||||
<script src="js/sorttable.js"></script>
|
<script src="js/sorttable.js"></script>
|
||||||
<script src="js/user.js"></script>
|
<script src="js/user.js"></script>
|
||||||
|
|
|
@ -70,6 +70,7 @@ services:
|
||||||
|
|
||||||
php-fpm-mailcow:
|
php-fpm-mailcow:
|
||||||
image: andryyy/mailcow-dockerized:phpfpm
|
image: andryyy/mailcow-dockerized:phpfpm
|
||||||
|
command: "php-fpm -d date.timezone=${TZ}"
|
||||||
depends_on:
|
depends_on:
|
||||||
- pdns-mailcow
|
- pdns-mailcow
|
||||||
volumes:
|
volumes:
|
||||||
|
@ -84,7 +85,6 @@ services:
|
||||||
- DBUSER=${DBUSER}
|
- DBUSER=${DBUSER}
|
||||||
- DBPASS=${DBPASS}
|
- DBPASS=${DBPASS}
|
||||||
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
|
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
|
||||||
- TZ=${TZ}
|
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
mailcow-network:
|
mailcow-network:
|
||||||
|
|
Loading…
Reference in New Issue