From f6847e6f8c3bcce2b787ee8b28dcaa31cbb02fff Mon Sep 17 00:00:00 2001 From: Daniel Lo Nigro Date: Sat, 13 Mar 2021 10:46:32 -0800 Subject: [PATCH 01/24] Add comment about maildir_very_dirty_syncs to dovecot.conf --- data/conf/dovecot/dovecot.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index 1076c31cf..74b186c1e 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -24,6 +24,10 @@ mail_plugins = Date: Sun, 2 May 2021 16:39:26 -0700 Subject: [PATCH 02/24] Enable maildir_very_dirty_syncs rather than just adding comment --- data/conf/dovecot/dovecot.conf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index 74b186c1e..04860d1ba 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -25,9 +25,10 @@ mail_attachment_fs = crypt:set_prefix=mail_crypt_global:posix: mail_attachment_dir = /var/attachments mail_attachment_min_size = 128k # Significantly speeds up very large mailboxes, but is only safe to enable if -# you do not manually modify the files in the `cur` directories in -# mailcowdockerized_vmail-vol-1. Disabled by default. -#maildir_very_dirty_syncs=yes +# you do not manually modify the files in the `cur` directories in +# mailcowdockerized_vmail-vol-1. +# https://mailcow.github.io/mailcow-dockerized-docs/u_e-dovecot-perf/ +maildir_very_dirty_syncs=yes # Dovecot 2.2 #ssl_protocols = !SSLv3 From 1606658cb1010d526be70a86efb885374360d6f8 Mon Sep 17 00:00:00 2001 From: Daniel Lo Nigro Date: Sat, 28 Aug 2021 20:02:39 -0700 Subject: [PATCH 03/24] Add missing spaces --- data/conf/dovecot/dovecot.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index 04860d1ba..d5327f9ac 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -28,7 +28,7 @@ mail_attachment_min_size = 128k # you do not manually modify the files in the `cur` directories in # mailcowdockerized_vmail-vol-1. # https://mailcow.github.io/mailcow-dockerized-docs/u_e-dovecot-perf/ -maildir_very_dirty_syncs=yes +maildir_very_dirty_syncs = yes # Dovecot 2.2 #ssl_protocols = !SSLv3 From 959dcb9980996547fefb5ef0411125b1d7f8c4a5 Mon Sep 17 00:00:00 2001 From: Ethan Wong <58529979+ewong012@users.noreply.github.com> Date: Thu, 20 Apr 2023 13:52:46 -0700 Subject: [PATCH 04/24] [Update.sh] Fix install docs link Old link returns 404. --- update.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/update.sh b/update.sh index 73ee975ca..5d5b4f103 100755 --- a/update.sh +++ b/update.sh @@ -188,7 +188,7 @@ if ! [[ "${DOCKER_COMPOSE_VERSION}" =~ ^(native|standalone)$ ]]; then echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m" else echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" + echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/i_u_m/i_u_m_install/\e[0m" exit 1 fi elif docker-compose > /dev/null 2>&1; then @@ -203,14 +203,14 @@ if ! [[ "${DOCKER_COMPOSE_VERSION}" =~ ^(native|standalone)$ ]]; then echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" else echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install regarding to this doc site: https://docs.mailcow.email/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" + echo -e "\e[31mPlease update/install regarding to this doc site: https://docs.mailcow.email/i_u_m/i_u_m_install/\e[0m" exit 1 fi fi else echo -e "\e[31mCannot find Docker Compose.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" + echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/i_u_m/i_u_m_install/\e[0m" exit 1 fi @@ -223,7 +223,7 @@ elif [ "${DOCKER_COMPOSE_VERSION}" == "native" ]; then if ! $COMPOSE_COMMAND > /dev/null 2>&1 || ! $COMPOSE_COMMAND --version | grep "^2." > /dev/null 2>&1; then # IF it cannot find Standalone in > 2.X, then script stops echo -e "\e[31mCannot find Docker Compose or the Version is lower then 2.X.X.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" + echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/i_u_m/i_u_m_install/\e[0m" exit 1 fi # If it finds the standalone Plugin it will use this instead and change the mailcow.conf Variable accordingly @@ -243,7 +243,7 @@ elif [ "${DOCKER_COMPOSE_VERSION}" == "standalone" ]; then if ! $COMPOSE_COMMAND > /dev/null 2>&1; then # IF it cannot find Native in > 2.X, then script stops echo -e "\e[31mCannot find Docker Compose.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" + echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/i_u_m/i_u_m_install/\e[0m" exit 1 fi # If it finds the native Plugin it will use this instead and change the mailcow.conf Variable accordingly From 6824a5650f265d0e5b347064654ebe33b1895fa8 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 11:21:43 +0200 Subject: [PATCH 05/24] [Web] Fix BCC validation --- .../inc/functions.address_rewriting.inc.php | 4 ++- data/web/inc/functions.mailbox.inc.php | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/data/web/inc/functions.address_rewriting.inc.php b/data/web/inc/functions.address_rewriting.inc.php index 8193c0527..140ae4764 100644 --- a/data/web/inc/functions.address_rewriting.inc.php +++ b/data/web/inc/functions.address_rewriting.inc.php @@ -49,7 +49,9 @@ function bcc($_action, $_data = null, $_attr = null) { } elseif (filter_var($local_dest, FILTER_VALIDATE_EMAIL)) { $mailbox = mailbox('get', 'mailbox_details', $local_dest); - if ($mailbox === false && array_key_exists($local_dest, array_merge($direct_aliases, $shared_aliases)) === false) { + $shared_aliases = mailbox('get', 'shared_aliases'); + $direct_aliases = mailbox('get', 'direct_aliases'); + if ($mailbox === false && in_array($local_dest, array_merge($direct_aliases, $shared_aliases)) === false) { $_SESSION['return'][] = array( 'type' => 'danger', 'log' => array(__FUNCTION__, $_action, $_data, $_attr), diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 4e036b99c..bd2584839 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -3965,6 +3965,39 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { } return $aliasdomaindata; break; + case 'shared_aliases': + $shared_aliases = array(); + $stmt = $pdo->query("SELECT `address` FROM `alias` + WHERE `goto` REGEXP ',' + AND `address` NOT LIKE '@%' + AND `goto` != `address`"); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + while($row = array_shift($rows)) { + $domain = explode("@", $row['address'])[1]; + if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { + $shared_aliases[] = $row['address']; + } + } + + return $shared_aliases; + break; + case 'direct_aliases': + $direct_aliases = array(); + $stmt = $pdo->query("SELECT `address` FROM `alias` + WHERE `goto` NOT LIKE '%,%' + AND `address` NOT LIKE '@%' + AND `goto` != `address`"); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + while($row = array_shift($rows)) { + $domain = explode("@", $row['address'])[1]; + if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { + $direct_aliases[] = $row['address']; + } + } + + return $direct_aliases; + break; case 'domains': $domains = array(); if ($_SESSION['mailcow_cc_role'] != "admin" && $_SESSION['mailcow_cc_role'] != "domainadmin") { From cf1cc24e33ec0410f79be808c52507844ac4e18e Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 12:26:50 +0200 Subject: [PATCH 06/24] [Web] Fix temporary email aliases sorting --- data/web/js/build/013-mailcow.js | 10 ++++++++++ data/web/js/site/debug.js | 10 ---------- data/web/js/site/user.js | 25 +++++++++++++++++++------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/data/web/js/build/013-mailcow.js b/data/web/js/build/013-mailcow.js index e060a2d0d..e659915b2 100644 --- a/data/web/js/build/013-mailcow.js +++ b/data/web/js/build/013-mailcow.js @@ -1,3 +1,13 @@ +const LOCALE = undefined; +const DATETIME_FORMAT = { + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit" +}; + $(document).ready(function() { // mailcow alert box generator window.mailcow_alert_box = function(message, type) { diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js index 55b6660bb..4e4c5692f 100644 --- a/data/web/js/site/debug.js +++ b/data/web/js/site/debug.js @@ -1,13 +1,3 @@ -const LOCALE = undefined; -const DATETIME_FORMAT = { - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit" -}; - $(document).ready(function() { // Parse seconds ago to date // Get "now" timestamp diff --git a/data/web/js/site/user.js b/data/web/js/site/user.js index b21398297..2227e0b05 100644 --- a/data/web/js/site/user.js +++ b/data/web/js/site/user.js @@ -127,6 +127,20 @@ jQuery(function($){ } } + + function createSortableDate(td, cellData, date_string = false) { + if (date_string) + var date = new Date(cellData); + else + var date = new Date(cellData ? cellData * 1000 : 0); + + var timestamp = date.getTime(); + $(td).attr({ + "data-order": timestamp, + "data-sort": timestamp + }); + $(td).html(date.toLocaleDateString(LOCALE, DATETIME_FORMAT)); + } function draw_tla_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#tla_table') ) { @@ -144,6 +158,7 @@ jQuery(function($){ "tr" + "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", language: lang_datatables, + order: [[4, 'desc']], ajax: { type: "GET", url: "/api/v1/get/time_limited_aliases", @@ -191,18 +206,16 @@ jQuery(function($){ title: lang.alias_valid_until, data: 'validity', defaultContent: '', - render: function (data, type) { - var date = new Date(data ? data * 1000 : 0); - return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"}); + createdCell: function(td, cellData) { + createSortableDate(td, cellData) } }, { title: lang.created_on, data: 'created', defaultContent: '', - render: function (data, type) { - var date = new Date(data.replace(/-/g, "/")); - return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"}); + createdCell: function(td, cellData) { + createSortableDate(td, cellData, true) } }, { From d7dfa95e1b810e3bf0362426aa08ff3c879a5a0b Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 13:47:13 +0200 Subject: [PATCH 07/24] [Web] Fix deleting sender_acl when mbox is deleted --- data/web/inc/functions.mailbox.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 4e036b99c..fa22fc81d 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -4956,9 +4956,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt->execute(array( ':username' => $username )); - $stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `logged_in_as` = :username"); + $stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `logged_in_as` = :logged_in_as OR `send_as` = :send_as"); $stmt->execute(array( - ':username' => $username + ':logged_in_as' => $username, + ':send_as' => $username )); // fk, better safe than sorry $stmt = $pdo->prepare("DELETE FROM `user_acl` WHERE `username` = :username"); From 6e79c486404e423425097d4506b956265f23eb7d Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 16:15:16 +0200 Subject: [PATCH 08/24] [Dockerapi] Fix typo in dockerapi sieve print --- data/Dockerfiles/dockerapi/dockerapi.py | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Dockerfiles/dockerapi/dockerapi.py b/data/Dockerfiles/dockerapi/dockerapi.py index 1ab651b5b..dc894549a 100644 --- a/data/Dockerfiles/dockerapi/dockerapi.py +++ b/data/Dockerfiles/dockerapi/dockerapi.py @@ -370,7 +370,7 @@ class DockerUtils: return exec_run_handler('utf8_text_only', sieve_return) # api call: container_post - post_action: exec - cmd: sieve - task: print def container_post__exec__sieve__print(self, container_id, request_json): - if 'username' in request.json and 'script_name' in request_json: + if 'username' in request_json and 'script_name' in request_json: for container in self.docker_client.containers.list(filters={"id": container_id}): cmd = ["/bin/bash", "-c", "/usr/bin/doveadm sieve get -u '" + request_json['username'].replace("'", "'\\''") + "' '" + request_json['script_name'].replace("'", "'\\''") + "'"] sieve_return = container.exec_run(cmd) diff --git a/docker-compose.yml b/docker-compose.yml index 23bd308f7..2585cda49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -510,7 +510,7 @@ services: - watchdog dockerapi-mailcow: - image: mailcow/dockerapi:2.03 + image: mailcow/dockerapi:2.04 security_opt: - label=disable restart: always From c2bcc4e086a20097f2956522877d09ab219c3dce Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 17:03:40 +0200 Subject: [PATCH 09/24] [Web] hide user tabs if acl is missing --- data/web/templates/user.twig | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/data/web/templates/user.twig b/data/web/templates/user.twig index 22cc00d0d..5536abe4e 100644 --- a/data/web/templates/user.twig +++ b/data/web/templates/user.twig @@ -12,11 +12,21 @@
  • + {% if acl.spam_alias == 1 %} + {% endif %} + {% if acl.spam_score == 1 %} + {% endif %} + {% if acl.syncjobs == 1 %} + {% endif %} + {% if acl.app_passwds == 1 %} + {% endif %} + {% if acl.pushover == 1 %} + {% endif %}
    @@ -25,11 +35,11 @@ {% include 'user/tab-user-auth.twig' %} {% include 'user/tab-user-details.twig' %} {% include 'user/tab-user-settings.twig' %} - {% include 'user/SpamAliases.twig' %} - {% include 'user/Spamfilter.twig' %} - {% include 'user/Syncjobs.twig' %} - {% include 'user/AppPasswds.twig' %} - {% include 'user/Pushover.twig' %} + {% if acl.spam_alias == 1 %}{% include 'user/SpamAliases.twig' %}{% endif %} + {% if acl.spam_score == 1 %}{% include 'user/Spamfilter.twig' %}{% endif %} + {% if acl.syncjobs == 1 %}{% include 'user/Syncjobs.twig' %}{% endif %} + {% if acl.app_passwds == 1 %}{% include 'user/AppPasswds.twig' %}{% endif %} + {% if acl.pushover == 1 %}{% include 'user/Pushover.twig' %}{% endif %}
    From f3322c05772c8192160628c6e7a5e6477e87f7e6 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 Apr 2023 19:43:20 +0200 Subject: [PATCH 10/24] Add IP Connect Inc --- data/conf/rspamd/custom/bad_asn.map | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/conf/rspamd/custom/bad_asn.map b/data/conf/rspamd/custom/bad_asn.map index 1858c55f8..a8d49cf39 100644 --- a/data/conf/rspamd/custom/bad_asn.map +++ b/data/conf/rspamd/custom/bad_asn.map @@ -27,4 +27,5 @@ #197518 2 #Rackmarkt SL, Spain #197695 2 #Domain names registrar REG.RU Ltd, Russia #198068 2 #P.A.G.M. OU, Estonia -#201942 5 #Soltia Consulting SL, Spain \ No newline at end of file +#201942 5 #Soltia Consulting SL, Spain +#213373 4 #IP Connect Inc \ No newline at end of file From 0372a2150d438ad71c1acc853db2a8556486ee82 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Fri, 21 Apr 2023 20:14:43 +0200 Subject: [PATCH 11/24] [Web] fix rspamd table on sm devices --- data/web/js/site/debug.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js index 55b6660bb..542ba1853 100644 --- a/data/web/js/site/debug.js +++ b/data/web/js/site/debug.js @@ -829,13 +829,10 @@ jQuery(function($){ url: '/api/v1/get/rspamd/actions', async: true, success: function(data){ - console.log(data); - var total = 0; $(data).map(function(){total += this[1];}); var labels = $.makeArray($(data).map(function(){return this[0] + ' ' + Math.round(this[1]/total * 100) + '%';})); var values = $.makeArray($(data).map(function(){return this[1];})); - console.log(values); var graphdata = { labels: labels, @@ -951,12 +948,15 @@ jQuery(function($){ title: 'Score', data: 'score', defaultContent: '', + class: 'text-nowrap', createdCell: function(td, cellData) { $(td).attr({ "data-order": cellData.sortBy, "data-sort": cellData.sortBy }); - $(td).html(cellData.value); + }, + render: function (data) { + return data.value; } }, { From 856b3b62f2800440d063c9cfc58ae9eaaf1010d3 Mon Sep 17 00:00:00 2001 From: Michael Kuron Date: Sat, 22 Apr 2023 14:16:42 +0200 Subject: [PATCH 12/24] Clean up old sasl_log entries --- data/Dockerfiles/phpfpm/docker-entrypoint.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/data/Dockerfiles/phpfpm/docker-entrypoint.sh b/data/Dockerfiles/phpfpm/docker-entrypoint.sh index cefebcdf5..37370113d 100755 --- a/data/Dockerfiles/phpfpm/docker-entrypoint.sh +++ b/data/Dockerfiles/phpfpm/docker-entrypoint.sh @@ -172,6 +172,24 @@ BEGIN END; // DELIMITER ; +DROP EVENT IF EXISTS clean_sasl_log; +DELIMITER // +CREATE EVENT clean_sasl_log +ON SCHEDULE EVERY 1 DAY DO +BEGIN + DELETE sasl_log.* FROM sasl_log + LEFT JOIN ( + SELECT username, service, MAX(datetime) AS lastdate + FROM sasl_log + GROUP BY username, service + ) AS last ON sasl_log.username = last.username AND sasl_log.service = last.service + WHERE datetime < DATE_SUB(NOW(), INTERVAL 31 DAY) AND datetime < lastdate; + DELETE FROM sasl_log + WHERE username NOT IN (SELECT username FROM mailbox) AND + datetime < DATE_SUB(NOW(), INTERVAL 31 DAY); +END; +// +DELIMITER ; EOF fi From 6b65f0fc74c6026dec1d8d0996e26cec74566ac4 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 25 Apr 2023 20:59:05 +0200 Subject: [PATCH 13/24] [Web] Updated lang.ru-ru.json (#5210) Co-authored-by: Vakhtang --- data/web/lang/lang.ru-ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index 65dd4bae1..bad64184c 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -336,7 +336,9 @@ "validate_license_now": "Получить лицензию на основе GUID с сервера лицензий", "verify": "Проверить", "yes": "✓", - "queue_unban": "разблокировать" + "queue_unban": "разблокировать", + "f2b_ban_time_increment": "Время бана увеличивается с каждым баном", + "f2b_max_ban_time": "Максимальное время блокировки" }, "danger": { "access_denied": "Доступ запрещён, или указаны неверные данные", From fd203abd473d15c6b0d178ba4711b4a12c1a0fb3 Mon Sep 17 00:00:00 2001 From: goodygh Date: Tue, 25 Apr 2023 22:11:04 +0200 Subject: [PATCH 14/24] Fix typo in mobileconfig redirect --- data/web/inc/triggers.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/web/inc/triggers.inc.php b/data/web/inc/triggers.inc.php index fde1507f8..c40453a25 100644 --- a/data/web/inc/triggers.inc.php +++ b/data/web/inc/triggers.inc.php @@ -63,7 +63,7 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) { unset($_SESSION['index_query_string']); if (in_array('mobileconfig', $http_parameters)) { if (in_array('only_email', $http_parameters)) { - header("Location: /mobileconfig.php?email_only"); + header("Location: /mobileconfig.php?only_email"); die(); } header("Location: /mobileconfig.php"); From fb60c4a150b9a3758bf2a2e3459cd9f9ec268cee Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 26 Apr 2023 18:43:54 +0200 Subject: [PATCH 15/24] Add update_postscreen_access_list.yml --- .../update_postscreen_access_list.yml | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/update_postscreen_access_list.yml diff --git a/.github/workflows/update_postscreen_access_list.yml b/.github/workflows/update_postscreen_access_list.yml new file mode 100644 index 000000000..5d31eb9a6 --- /dev/null +++ b/.github/workflows/update_postscreen_access_list.yml @@ -0,0 +1,39 @@ +name: Update postscreen_access.cidr + +on: + schedule: + # Monthly + - cron: "0 0 1 * *" + workflow_dispatch: # Allow to run workflow manually + +permissions: + contents: read # to fetch code (actions/checkout) + + +jobs: + Update-postscreen_access_cidr: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Generate postscreen_access.cidr + run: | + bash helper-scripts/update_postscreen_whitelist.sh + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.mailcow_action_Update_postscreen_access_cidr_pat }} + commit-message: update postscreen_access.cidr + committer: milkmaker + author: milkmaker + signoff: false + branch: update/postscreen_access.cidr + base: staging + delete-branch: true + add-paths: | + data/conf/postfix/postscreen_access.cidr + title: '[Postfix] update postscreen_access.cidr' + body: | + This PR updates the postscreen_access.cidr using GitHub Actions and [helper-scripts/update_postscreen_whitelist.sh](https://github.com/mailcow/mailcow-dockerized/blob/master/helper-scripts/update_postscreen_whitelist.sh) \ No newline at end of file From e5f03e85260acc16e35a00f43d65990524b57db3 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 26 Apr 2023 18:44:35 +0200 Subject: [PATCH 16/24] Update update_postscreen_whitelist.sh --- helper-scripts/update_postscreen_whitelist.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/helper-scripts/update_postscreen_whitelist.sh b/helper-scripts/update_postscreen_whitelist.sh index 8dd1b834a..04335bda5 100644 --- a/helper-scripts/update_postscreen_whitelist.sh +++ b/helper-scripts/update_postscreen_whitelist.sh @@ -6,7 +6,7 @@ SPFTOOLS_DIR=${WORKING_DIR}/spf-tools POSTWHITE_DIR=${WORKING_DIR}/postwhite POSTWHITE_CONF=${POSTWHITE_DIR}/postwhite.conf -COSTOM_HOSTS="web.de gmx.net mail.de freenet.de arcor.de unity-mail.de" +CUSTOM_HOSTS='"web.de gmx.net mail.de freenet.de arcor.de unity-mail.de"' STATIC_HOSTS=( "194.25.134.0/24 permit # t-online.de" ) @@ -19,16 +19,23 @@ function set_config() { sudo sed -i "s@^\($1\s*=\s*\).*\$@\1$2@" ${POSTWHITE_CONF} } -set_config custom_hosts ${COSTOM_HOSTS} +set_config custom_hosts "${CUSTOM_HOSTS}" set_config reload_postfix no set_config postfixpath /. set_config spftoolspath ${WORKING_DIR}/spf-tools set_config whitelist .${SCRIPT_DIR}/../data/conf/postfix/postscreen_access.cidr set_config yahoo_static_hosts ${POSTWHITE_DIR}/yahoo_static_hosts.txt +#Fix URL for Yahoo!: https://github.com/stevejenkins/postwhite/issues/59 +sudo sed -i \ + -e 's#yahoo_url="https://help.yahoo.com/kb/SLN23997.html"#yahoo_url="https://senders.yahooinc.com/outbound-mail-servers/"#' \ + -e 's#echo "ipv6:$line";#echo "ipv6:$line" | grep -v "ipv6:::";#' \ + -e 's#`command -v wget`#`command -v skip-wget`#' \ + ${POSTWHITE_DIR}/scrape_yahoo + cd ${POSTWHITE_DIR} ./postwhite ${POSTWHITE_CONF} ( IFS=$'\n'; echo "${STATIC_HOSTS[*]}" >> "${SCRIPT_DIR}/../data/conf/postfix/postscreen_access.cidr") -rm -r ${WORKING_DIR} +rm -r ${WORKING_DIR} \ No newline at end of file From fe4a418af45fd7e82df7facfb9cdfb71efd17fb3 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Thu, 27 Apr 2023 10:45:11 +0200 Subject: [PATCH 17/24] [Web] fix rspamd table scan_time on sm devices --- data/web/js/site/debug.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js index 542ba1853..0b42e2c7c 100644 --- a/data/web/js/site/debug.js +++ b/data/web/js/site/debug.js @@ -979,7 +979,9 @@ jQuery(function($){ "data-order": cellData.sortBy, "data-sort": cellData.sortBy }); - $(td).html(cellData.value); + }, + render: function (data) { + return data.value; } }, { From b5acf56e20a79d36496619116af2e460d7e20a87 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 2 May 2023 16:08:58 +0000 Subject: [PATCH 18/24] Added Platform Information on Status Page --- data/Dockerfiles/dockerapi/dockerapi.py | 4 +++- data/web/js/site/debug.js | 8 +++++++- data/web/lang/lang.de-de.json | 4 +++- data/web/lang/lang.en-gb.json | 4 +++- data/web/templates/debug.twig | 8 +++++++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/data/Dockerfiles/dockerapi/dockerapi.py b/data/Dockerfiles/dockerapi/dockerapi.py index 1ab651b5b..63436b62b 100644 --- a/data/Dockerfiles/dockerapi/dockerapi.py +++ b/data/Dockerfiles/dockerapi/dockerapi.py @@ -9,6 +9,7 @@ import os import json import asyncio import redis +import platform from datetime import datetime import logging from logging.config import dictConfig @@ -485,7 +486,8 @@ async def get_host_stats(wait=5): "swap": psutil.swap_memory() }, "uptime": time.time() - psutil.boot_time(), - "system_time": system_time.strftime("%d.%m.%Y %H:%M:%S") + "system_time": system_time.strftime("%d.%m.%Y %H:%M:%S"), + "architecture": platform.machine() } redis_client.set('host_stats', json.dumps(host_stats), ex=10) diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js index 55b6660bb..78a4ccaa9 100644 --- a/data/web/js/site/debug.js +++ b/data/web/js/site/debug.js @@ -43,7 +43,7 @@ $(document).ready(function() { if (mailcow_info.branch === "master"){ check_update(mailcow_info.version_tag, mailcow_info.project_url); } - $("#maiclow_version").click(function(){ + $("#mailcow_version").click(function(){ if (mailcow_cc_role !== "admin" && mailcow_cc_role !== "domainadmin" || mailcow_info.branch !== "master") return; @@ -1302,6 +1302,12 @@ function update_stats(timeout=5){ $("#host_cpu_usage").text(parseInt(data.cpu.usage).toString() + "%"); $("#host_memory_total").text((data.memory.total / (1024 ** 3)).toFixed(2).toString() + "GB"); $("#host_memory_usage").text(parseInt(data.memory.usage).toString() + "%"); + if (data.architecture == "aarch64"){ + $("#host_architecture").html('' + data.architecture + ' ⚠️'); + } + else { + $("#host_architecture").html(data.architecture); + } // update cpu and mem chart var cpu_chart = Chart.getChart("host_cpu_chart"); diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 4bd4b3faa..e1cfee1b4 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -498,6 +498,7 @@ } }, "debug": { + "architecture": "Architektur", "chart_this_server": "Chart (dieser Server)", "containers_info": "Container-Information", "container_running": "Läuft", @@ -534,7 +535,8 @@ "update_available": "Es ist ein Update verfügbar", "no_update_available": "Das System ist auf aktuellem Stand", "update_failed": "Es konnte nicht nach einem Update gesucht werden", - "username": "Benutzername" + "username": "Benutzername", + "wip": "Aktuell noch in Arbeit" }, "diagnostics": { "cname_from_a": "Wert abgeleitet von A/AAAA-Eintrag. Wird unterstützt, sofern der Eintrag auf die korrekte Ressource zeigt.", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index df83987cb..56a5bf905 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -498,6 +498,7 @@ } }, "debug": { + "architecture": "Architecture", "chart_this_server": "Chart (this server)", "containers_info": "Container information", "container_running": "Running", @@ -534,7 +535,8 @@ "update_available": "There is an update available", "no_update_available": "The System is on the latest version", "update_failed": "Could not check for an Update", - "username": "Username" + "username": "Username", + "wip": "Currently Work in Progress" }, "diagnostics": { "cname_from_a": "Value derived from A/AAAA record. This is supported as long as the record points to the correct resource.", diff --git a/data/web/templates/debug.twig b/data/web/templates/debug.twig index d24d7ed68..adc19b267 100644 --- a/data/web/templates/debug.twig +++ b/data/web/templates/debug.twig @@ -49,6 +49,12 @@

    {{ hostname }}

    + + {{ lang.debug.architecture }} +
    +

    -

    +
    + IPs @@ -70,7 +76,7 @@ Version From 1265302a8e08a4f966ceb40df5d53a6d8ce4a71f Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 2 May 2023 18:11:59 +0200 Subject: [PATCH 19/24] [DockerAPI] Update to 2.04 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 23bd308f7..2585cda49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -510,7 +510,7 @@ services: - watchdog dockerapi-mailcow: - image: mailcow/dockerapi:2.03 + image: mailcow/dockerapi:2.04 security_opt: - label=disable restart: always From ee607dc3cc5f996091b2f4f40ef5726fb6206b11 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 2 May 2023 18:29:38 +0200 Subject: [PATCH 20/24] Translations update from Weblate (#5218) * [Web] Updated lang.en-gb.json Co-authored-by: Peter * [Web] Updated lang.cs-cz.json Co-authored-by: Peter * [Web] Updated lang.de-de.json Co-authored-by: Peter * [Web] Updated lang.fr-fr.json Co-authored-by: Peter * [Web] Updated lang.ro-ro.json Co-authored-by: Peter * [Web] Updated lang.sk-sk.json Co-authored-by: Peter * [Web] Updated lang.zh-cn.json Co-authored-by: Peter * [Web] Updated lang.it-it.json Co-authored-by: Peter * [Web] Updated lang.zh-tw.json Co-authored-by: Peter --------- Co-authored-by: Peter --- data/web/lang/lang.cs-cz.json | 2 +- data/web/lang/lang.de-de.json | 4 ++-- data/web/lang/lang.en-gb.json | 4 ++-- data/web/lang/lang.fr-fr.json | 2 +- data/web/lang/lang.it-it.json | 4 ++-- data/web/lang/lang.ro-ro.json | 2 +- data/web/lang/lang.sk-sk.json | 4 ++-- data/web/lang/lang.zh-cn.json | 4 ++-- data/web/lang/lang.zh-tw.json | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index 712b8c77e..d4f624959 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -541,7 +541,7 @@ "inactive": "Neaktivní", "kind": "Druh", "last_modified": "Naposledy změněn", - "lookup_mx": "Cíl je regulární výraz který se shoduje s MX záznamem (.*google\\.com směřuje veškerou poštu na MX které jsou cílem pro google.com přes tento skok)", + "lookup_mx": "Cíl je regulární výraz který se shoduje s MX záznamem (.*\\.google\\.com směřuje veškerou poštu na MX které jsou cílem pro google.com přes tento skok)", "mailbox": "Úprava mailové schránky", "mailbox_quota_def": "Výchozí kvóta schránky", "mailbox_relayhost_info": "Aplikované jen na uživatelskou schránku a přímé aliasy, přepisuje předávající server domény.", diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index e1cfee1b4..6b280bbb8 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -216,7 +216,7 @@ "loading": "Bitte warten...", "login_time": "Zeit", "logo_info": "Die hochgeladene Grafik wird für die Navigationsleiste auf eine Höhe von 40px skaliert. Für die Darstellung auf der Login-Maske beträgt die skalierte Breite maximal 250px. Eine frei skalierbare Grafik (etwa SVG) wird empfohlen.", - "lookup_mx": "Ziel mit MX vergleichen (Regex, etwa .*google\\.com, um alle Ziele mit MX *google.com zu routen)", + "lookup_mx": "Ziel mit MX vergleichen (Regex, etwa .*\\.google\\.com, um alle Ziele mit MX *google.com zu routen)", "main_name": "\"mailcow UI\" Name", "merged_vars_hint": "Ausgegraute Reihen wurden aus der Datei vars.(local.)inc.php gelesen und können hier nicht verändert werden.", "message": "Nachricht", @@ -595,7 +595,7 @@ "inactive": "Inaktiv", "kind": "Art", "last_modified": "Zuletzt geändert", - "lookup_mx": "Ziel mit MX vergleichen (Regex, etwa .*google\\.com, um alle Ziele mit MX *google.com zu routen)", + "lookup_mx": "Ziel mit MX vergleichen (Regex, etwa .*\\.google\\.com, um alle Ziele mit MX *google.com zu routen)", "mailbox": "Mailbox bearbeiten", "mailbox_quota_def": "Standard-Quota einer Mailbox", "mailbox_relayhost_info": "Wird auf eine Mailbox und direkte Alias-Adressen angewendet. Überschreibt die Einstellung einer Domain.", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 56a5bf905..e53fe896c 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -218,7 +218,7 @@ "loading": "Please wait...", "login_time": "Login time", "logo_info": "Your image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. A scalable graphic is highly recommended.", - "lookup_mx": "Destination is a regular expression to match against MX name (.*google\\.com to route all mail targeted to a MX ending in google.com over this hop)", + "lookup_mx": "Destination is a regular expression to match against MX name (.*\\.google\\.com to route all mail targeted to a MX ending in google.com over this hop)", "main_name": "\"mailcow UI\" name", "merged_vars_hint": "Greyed out rows were merged from vars.(local.)inc.php and cannot be modified.", "message": "Message", @@ -595,7 +595,7 @@ "inactive": "Inactive", "kind": "Kind", "last_modified": "Last modified", - "lookup_mx": "Destination is a regular expression to match against MX name (.*google\\.com to route all mail targeted to a MX ending in google.com over this hop)", + "lookup_mx": "Destination is a regular expression to match against MX name (.*\\.google\\.com to route all mail targeted to a MX ending in google.com over this hop)", "mailbox": "Edit mailbox", "mailbox_quota_def": "Default mailbox quota", "mailbox_relayhost_info": "Applied to the mailbox and direct aliases only, does override a domain relayhost.", diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index d64f62f70..0bc0ba02d 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -588,7 +588,7 @@ "unchanged_if_empty": "Si non modifié, laisser en blanc", "username": "Nom d'utilisateur", "validate_save": "Valider et sauver", - "lookup_mx": "La destination est une expression régulière qui doit correspondre avec le nom du MX (.*google\\.com pour acheminer tout le courrier destiné à un MX se terminant par google.com via ce saut)", + "lookup_mx": "La destination est une expression régulière qui doit correspondre avec le nom du MX (.*\\.google\\.com pour acheminer tout le courrier destiné à un MX se terminant par google.com via ce saut)", "mailbox_relayhost_info": "S'applique uniquement à la boîte aux lettres et aux alias directs, remplace le relayhost du domaine." }, "footer": { diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index 4d21547cd..0d5b3f252 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -213,7 +213,7 @@ "loading": "Caricamento in corso...", "login_time": "Ora di accesso", "logo_info": "La tua immagine verrà ridimensionata a 40px di altezza, quando verrà usata nella barra di navigazione in alto, ed ad una larghezza massima di 250px nella schermata iniziale. È altamente consigliato l'utilizzo di un'immagine modulabile.", - "lookup_mx": "Destination is a regular expression to match against MX name (.*google\\.com to route all mail targeted to a MX ending in google.com over this hop)", + "lookup_mx": "Destination is a regular expression to match against MX name (.*\\.google\\.com to route all mail targeted to a MX ending in google.com over this hop)", "main_name": "Nome \"mailcow UI\"", "merged_vars_hint": "Greyed out rows were merged from vars.(local.)inc.php and cannot be modified.", "message": "Messaggio", @@ -554,7 +554,7 @@ "hostname": "Hostname", "inactive": "Inattivo", "kind": "Genere", - "lookup_mx": "Destination is a regular expression to match against MX name (.*google\\.com to route all mail targeted to a MX ending in google.com over this hop)", + "lookup_mx": "Destination is a regular expression to match against MX name (.*\\.google\\.com to route all mail targeted to a MX ending in google.com over this hop)", "mailbox": "Modifica casella di posta", "mailbox_quota_def": "Default mailbox quota", "mailbox_relayhost_info": "Applied to the mailbox and direct aliases only, does override a domain relayhost.", diff --git a/data/web/lang/lang.ro-ro.json b/data/web/lang/lang.ro-ro.json index 8e6e1d454..e6315db02 100644 --- a/data/web/lang/lang.ro-ro.json +++ b/data/web/lang/lang.ro-ro.json @@ -539,7 +539,7 @@ "inactive": "Inactiv", "kind": "Fel", "last_modified": "Ultima modificare", - "lookup_mx": "Destinația este o expresie regulată care potrivită cu numele MX (.*google\\.com pentru a direcționa toate e-mailurile vizate către un MX care se termină în google.com peste acest hop)", + "lookup_mx": "Destinația este o expresie regulată care potrivită cu numele MX (.*\\.google\\.com pentru a direcționa toate e-mailurile vizate către un MX care se termină în google.com peste acest hop)", "mailbox": "Editează căsuța poștală", "mailbox_quota_def": "Cota implicită a căsuței poștale", "mailbox_relayhost_info": "Aplicat numai căsuței poștale și aliasurilor directe, suprascrie un transport dependent de domeniu.", diff --git a/data/web/lang/lang.sk-sk.json b/data/web/lang/lang.sk-sk.json index 2b93650fc..29b36c44e 100644 --- a/data/web/lang/lang.sk-sk.json +++ b/data/web/lang/lang.sk-sk.json @@ -213,7 +213,7 @@ "loading": "Čakajte prosím ...", "login_time": "Čas prihlásenia", "logo_info": "Váš obrázok bude upravený na výšku 40px pre vrchný navigačný riadok a na maximálnu šírku 250px pre úvodnú stránku. Odporúča sa škálovateľná grafika.", - "lookup_mx": "Cieľ je regulárny výraz ktorý sa porovnáva s MX záznamom (.*google\\.com smeruje všetku poštu určenú pre MX ktoré sú cieľom pre google.com cez tento skok)", + "lookup_mx": "Cieľ je regulárny výraz ktorý sa porovnáva s MX záznamom (.*\\.google\\.com smeruje všetku poštu určenú pre MX ktoré sú cieľom pre google.com cez tento skok)", "main_name": "\"mailcow UI\" názov", "merged_vars_hint": "Sivé riadky boli načítané z vars.(local.)inc.php a nemôžu byť modifikované cez UI.", "message": "Správa", @@ -539,7 +539,7 @@ "inactive": "Neaktívny", "kind": "Druh", "last_modified": "Naposledy upravené", - "lookup_mx": "Cieľ je regulárny výraz ktorý sa zhoduje s MX záznamom (.*google\\.com smeruje všetku poštu na MX ktoré sú cieľom pre google.com cez tento skok)", + "lookup_mx": "Cieľ je regulárny výraz ktorý sa zhoduje s MX záznamom (.*\\.google\\.com smeruje všetku poštu na MX ktoré sú cieľom pre google.com cez tento skok)", "mailbox": "Upraviť mailovú schránku", "mailbox_quota_def": "Predvolená veľkosť mailovej schránky", "mailbox_relayhost_info": "Aplikované len na používateľské schránky a priame aliasy, prepisuje doménového preposielateľa.", diff --git a/data/web/lang/lang.zh-cn.json b/data/web/lang/lang.zh-cn.json index e57ea2a7f..90888efd8 100644 --- a/data/web/lang/lang.zh-cn.json +++ b/data/web/lang/lang.zh-cn.json @@ -213,7 +213,7 @@ "loading": "请等待...", "login_time": "登录时间", "logo_info": "你的图片将会在顶部导航栏被缩放为 40px 高,在起始页被缩放为最大 250px 高。强烈推荐使用能较好适应缩放的图片。", - "lookup_mx": "应当为一个正则表达式,用于匹配 MX 记录 (例如 .*google\\.com 将转发所有拥有以 google.com 结尾的 MX 记录的邮件)", + "lookup_mx": "应当为一个正则表达式,用于匹配 MX 记录 (例如 .*\\.google\\.com 将转发所有拥有以 google.com 结尾的 MX 记录的邮件)", "main_name": "Mailcow UI 的名称", "merged_vars_hint": "灰色行来自 vars.(local.)inc.php 文件并且无法修改。", "message": "消息", @@ -544,7 +544,7 @@ "hostname": "主机名", "inactive": "禁用", "kind": "类型", - "lookup_mx": "应当为一个正则表达式,用于匹配 MX 记录 (例如 .*google\\.com 将转发所有拥有以 google.com 结尾的 MX 记录的邮件)", + "lookup_mx": "应当为一个正则表达式,用于匹配 MX 记录 (例如 .*\\.google\\.com 将转发所有拥有以 google.com 结尾的 MX 记录的邮件)", "mailbox": "编辑邮箱", "mailbox_quota_def": "邮箱默认配额", "mailbox_relayhost_info": "只适用于邮箱和邮箱别名,不会覆盖域名的中继主机。", diff --git a/data/web/lang/lang.zh-tw.json b/data/web/lang/lang.zh-tw.json index 916188dbc..ff9ed334c 100644 --- a/data/web/lang/lang.zh-tw.json +++ b/data/web/lang/lang.zh-tw.json @@ -213,7 +213,7 @@ "loading": "請稍等...", "login_time": "登入時間", "logo_info": "你的起始頁面圖片會在頂部導覽列的限制下被縮放為 40px 高,以及最大 250px 高度。強烈推薦使用能較好縮放的圖片。", - "lookup_mx": "目的地是可以用來匹配 MX 紀錄的正規表達式 (.*google\\.com 會將所有 MX 結尾於 google.com 的郵件轉發到此主機。)", + "lookup_mx": "目的地是可以用來匹配 MX 紀錄的正規表達式 (.*\\.google\\.com 會將所有 MX 結尾於 google.com 的郵件轉發到此主機。)", "main_name": "\"mailcow UI\" 名稱", "merged_vars_hint": "灰色列來自 vars.(local.)inc.php 並且不能修改。", "message": "訊息", @@ -540,7 +540,7 @@ "inactive": "停用", "kind": "種類", "last_modified": "上次修改時間", - "lookup_mx": "目的地是可以用來匹配 MX 紀錄的正規表達式 (.*google\\.com 會將所有 MX 結尾於 google.com 的郵件轉發到此主機。)", + "lookup_mx": "目的地是可以用來匹配 MX 紀錄的正規表達式 (.*\\.google\\.com 會將所有 MX 結尾於 google.com 的郵件轉發到此主機。)", "mailbox": "編輯信箱", "mailbox_quota_def": "預設信箱容量配額", "mailbox_relayhost_info": "只會套用於信箱和直接別名,不會覆寫域名中繼主機。", From aabcd1053969e7bd3601c0dd7e7aa3e5b333cb97 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Wed, 3 May 2023 09:59:49 +0200 Subject: [PATCH 21/24] [Web] fix bcc localdest selectpicker --- data/web/js/site/mailbox.js | 56 ++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index d7fca848d..3ddeea944 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -1458,30 +1458,37 @@ jQuery(function($){ } function draw_bcc_table() { $.get("/api/v1/get/bcc-destination-options", function(data){ + var optgroup = ""; // Domains - var optgroup = ""; - $.each(data.domains, function(index, domain){ - optgroup += ""; - }); - optgroup += ""; - $('#bcc-local-dest').append(optgroup); - // Alias domains - var optgroup = ""; - $.each(data.alias_domains, function(index, alias_domain){ - optgroup += ""; - }); - optgroup += "" - $('#bcc-local-dest').append(optgroup); - // Mailboxes and aliases - $.each(data.mailboxes, function(mailbox, aliases){ - var optgroup = ""; - $.each(aliases, function(index, alias){ - optgroup += ""; + if (data.domains && data.domains.length > 0) { + optgroup = ""; + $.each(data.domains, function(index, domain){ + optgroup += ""; }); optgroup += ""; $('#bcc-local-dest').append(optgroup); - }); - // Finish + } + // Alias domains + if (data.alias_domains && data.alias_domains.length > 0) { + optgroup = ""; + $.each(data.alias_domains, function(index, alias_domain){ + optgroup += ""; + }); + optgroup += "" + $('#bcc-local-dest').append(optgroup); + } + // Mailboxes and aliases + if (data.mailboxes && Object.keys(data.mailboxes).length > 0) { + $.each(data.mailboxes, function(mailbox, aliases){ + optgroup = ""; + $.each(aliases, function(index, alias){ + optgroup += ""; + }); + optgroup += ""; + $('#bcc-local-dest').append(optgroup); + }); + } + // Recreate picker $('#bcc-local-dest').selectpicker('refresh'); }); @@ -2326,16 +2333,19 @@ jQuery(function($){ // detect element visibility changes function onVisible(element, callback) { $(document).ready(function() { - element_object = document.querySelector(element); + let element_object = document.querySelector(element); if (element_object === null) return; - new IntersectionObserver((entries, observer) => { + let observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if(entry.intersectionRatio > 0) { callback(element_object); + observer.unobserve(element_object); } }); - }).observe(element_object); + }) + + observer.observe(element_object); }); } From bd6c98047a902c476b983976782cab83ca15fc05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 01:50:21 +0000 Subject: [PATCH 22/24] Update alpine Docker tag to v3.18 Signed-off-by: milkmaker --- .../EXTERNAL_MYSQL_SOCKET/docker-compose.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helper-scripts/docker-compose.override.yml.d/EXTERNAL_MYSQL_SOCKET/docker-compose.override.yml b/helper-scripts/docker-compose.override.yml.d/EXTERNAL_MYSQL_SOCKET/docker-compose.override.yml index 8fcc6fff7..f014ea674 100644 --- a/helper-scripts/docker-compose.override.yml.d/EXTERNAL_MYSQL_SOCKET/docker-compose.override.yml +++ b/helper-scripts/docker-compose.override.yml.d/EXTERNAL_MYSQL_SOCKET/docker-compose.override.yml @@ -26,6 +26,6 @@ services: - /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysqld.sock mysql-mailcow: - image: alpine:3.17 + image: alpine:3.18 command: /bin/true restart: "no" From 33c97fb318ad7cc7d6550ff9864d665bffacbaae Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 10 May 2023 20:32:38 +0200 Subject: [PATCH 23/24] change domain for docs --- data/conf/dovecot/dovecot.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index d5327f9ac..e4adb5a3e 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -27,7 +27,7 @@ mail_attachment_min_size = 128k # Significantly speeds up very large mailboxes, but is only safe to enable if # you do not manually modify the files in the `cur` directories in # mailcowdockerized_vmail-vol-1. -# https://mailcow.github.io/mailcow-dockerized-docs/u_e-dovecot-perf/ +# https://docs.mailcow.email/manual-guides/Dovecot/u_e-dovecot-performance/ maildir_very_dirty_syncs = yes # Dovecot 2.2 From 55b019105044f855d904c18938b73902cdd4cc50 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 23 May 2023 10:46:21 +0200 Subject: [PATCH 24/24] [PHP] Update to 1.84 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2585cda49..f53b54c43 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -106,7 +106,7 @@ services: - rspamd php-fpm-mailcow: - image: mailcow/phpfpm:1.83 + image: mailcow/phpfpm:1.84 command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" depends_on: - redis-mailcow