'
);
});
}
From 95bf46c1e4f3efe304857074bfa7d324d9f85fe9 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 19 Mar 2026 12:44:50 +0100
Subject: [PATCH 005/123] escape HTML in autodiscover logs
---
data/web/js/site/dashboard.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/data/web/js/site/dashboard.js b/data/web/js/site/dashboard.js
index 760e878f..aee36171 100644
--- a/data/web/js/site/dashboard.js
+++ b/data/web/js/site/dashboard.js
@@ -1128,6 +1128,11 @@ jQuery(function($){
item.ua = escapeHtml(item.ua);
}
item.ua = '' + item.ua + '';
+ if (item.user == null) {
+ item.user = 'unknown';
+ } else {
+ item.user = escapeHtml(item.user);
+ }
if (item.service == "activesync") {
item.service = 'ActiveSync';
}
From 8c039f694fe3cd7a736249b4e017def1414c47e9 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 19 Mar 2026 12:48:43 +0100
Subject: [PATCH 006/123] Improve template URI escaping and parameter handling
---
data/web/inc/header.inc.php | 2 +-
data/web/inc/twig.inc.php | 4 +++-
data/web/templates/base.twig | 2 +-
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php
index d2ce6f3d..e5737b63 100644
--- a/data/web/inc/header.inc.php
+++ b/data/web/inc/header.inc.php
@@ -89,7 +89,7 @@ $globalVariables = [
'app_links' => $app_links,
'app_links_processed' => $app_links_processed,
'is_root_uri' => (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) == '/'),
- 'uri' => $_SERVER['REQUEST_URI'],
+ 'uri' => parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) ?: '/',
];
foreach ($globalVariables as $globalVariableName => $globalVariableValue) {
diff --git a/data/web/inc/twig.inc.php b/data/web/inc/twig.inc.php
index a3bc02d9..c4d0669d 100644
--- a/data/web/inc/twig.inc.php
+++ b/data/web/inc/twig.inc.php
@@ -13,7 +13,9 @@ $twig = new Environment($loader, [
// functions
$twig->addFunction(new TwigFunction('query_string', function (array $params = []) {
- return http_build_query(array_merge($_GET, $params));
+ $allowed = ['lang', 'mobileconfig'];
+ $filtered = array_intersect_key($_GET, array_flip($allowed));
+ return http_build_query(array_merge($filtered, $params));
}));
$twig->addFunction(new TwigFunction('is_uri', function (string $uri, string $where = null) {
diff --git a/data/web/templates/base.twig b/data/web/templates/base.twig
index e1708950..9e20b08a 100644
--- a/data/web/templates/base.twig
+++ b/data/web/templates/base.twig
@@ -193,7 +193,7 @@ $(window).scroll(function() {
});
// Select language and reopen active URL without POST
function setLang(sel) {
- $.post( '{{ uri }}', {lang: sel} );
+ $.post( '{{ uri|escape("js") }}', {lang: sel} );
window.location.href = window.location.pathname + window.location.search;
}
// FIDO2 functions
From 5a00b5124b58c4399b6320270947683efb080e89 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Sun, 29 Mar 2026 12:08:45 +0200
Subject: [PATCH 007/123] [Web][Dovecot] Add parameterized queries and input
validation for quarantine_category
---
data/Dockerfiles/dovecot/quarantine_notify.py | 15 ++++++-----
data/web/inc/functions.mailbox.inc.php | 27 +++++++++++++++++++
data/web/lang/lang.de-de.json | 1 +
data/web/lang/lang.en-gb.json | 1 +
docker-compose.yml | 2 +-
5 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/data/Dockerfiles/dovecot/quarantine_notify.py b/data/Dockerfiles/dovecot/quarantine_notify.py
index a681c1fd..5757cdf5 100755
--- a/data/Dockerfiles/dovecot/quarantine_notify.py
+++ b/data/Dockerfiles/dovecot/quarantine_notify.py
@@ -47,7 +47,7 @@ try:
if max_score == "":
max_score = 9999.0
- def query_mysql(query, headers = True, update = False):
+ def query_mysql(query, params = None, headers = True, update = False):
while True:
try:
cnx = MySQLdb.connect(user=os.environ.get('DBUSER'), password=os.environ.get('DBPASS'), database=os.environ.get('DBNAME'), charset="utf8mb4", collation="utf8mb4_general_ci")
@@ -57,7 +57,10 @@ try:
else:
break
cur = cnx.cursor()
- cur.execute(query)
+ if params:
+ cur.execute(query, params)
+ else:
+ cur.execute(query)
if not update:
result = []
columns = tuple( [d[0] for d in cur.description] )
@@ -76,7 +79,7 @@ try:
def notify_rcpt(rcpt, msg_count, quarantine_acl, category):
if category == "add_header": category = "add header"
- meta_query = query_mysql('SELECT `qhash`, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = "%s" AND score < %f AND (action = "%s" OR "all" = "%s")' % (rcpt, max_score, category, category))
+ meta_query = query_mysql('SELECT `qhash`, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = %s AND score < %s AND (action = %s OR "all" = %s)', (rcpt, max_score, category, category))
print("%s: %d of %d messages qualify for notification" % (rcpt, len(meta_query), msg_count))
if len(meta_query) == 0:
return
@@ -130,7 +133,7 @@ try:
server.sendmail(msg['From'], [str(redirect)] + [str(bcc)], text)
server.quit()
for res in meta_query:
- query_mysql('UPDATE quarantine SET notified = 1 WHERE id = "%d"' % (res['id']), update = True)
+ query_mysql('UPDATE quarantine SET notified = 1 WHERE id = %s', (res['id'],), update = True)
r.hset('Q_LAST_NOTIFIED', record['rcpt'], time_now)
break
except Exception as ex:
@@ -138,7 +141,7 @@ try:
print('%s' % (ex))
time.sleep(3)
- records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND score < %f AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt' % (max_score))
+ records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND score < %s AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt', (max_score,))
for record in records:
attrs = ''
@@ -156,7 +159,7 @@ try:
except Exception as ex:
print('Could not determine last notification for %s, assuming never' % (record['rcpt']))
last_notification = 0
- attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = "%s"' % (record['rcpt']))
+ attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = %s', (record['rcpt'],))
attrs = attrs_json[0]['attributes']
if isinstance(attrs, str):
# if attr is str then just load it
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 49642163..adb330ea 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -1111,6 +1111,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$relayhost = (isset($_data['relayhost'])) ? intval($_data['relayhost']) : 0;
$quarantine_notification = (isset($_data['quarantine_notification'])) ? strval($_data['quarantine_notification']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']);
$quarantine_category = (isset($_data['quarantine_category'])) ? strval($_data['quarantine_category']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_category']);
+ // Validate quarantine_category
+ if (!in_array($quarantine_category, array('add_header', 'reject', 'all'))) {
+ $_SESSION['return'][] = array(
+ 'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
+ 'msg' => 'quarantine_category_invalid'
+ );
+ return false;
+ }
$quota_b = ($quota_m * 1048576);
$attribute_hash = (!empty($_data['attribute_hash'])) ? $_data['attribute_hash'] : '';
if (in_array($authsource, array('keycloak', 'generic-oidc', 'ldap'))){
@@ -1733,6 +1742,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$attr["tagged_mail_handler"] = (!empty($_data['tagged_mail_handler'])) ? $_data['tagged_mail_handler'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['tagged_mail_handler']);
$attr["quarantine_notification"] = (!empty($_data['quarantine_notification'])) ? $_data['quarantine_notification'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']);
$attr["quarantine_category"] = (!empty($_data['quarantine_category'])) ? $_data['quarantine_category'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_category']);
+ // Validate quarantine_category
+ if (!in_array($attr["quarantine_category"], array('add_header', 'reject', 'all'))) {
+ $_SESSION['return'][] = array(
+ 'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_extra),
+ 'msg' => 'quarantine_category_invalid'
+ );
+ return false;
+ }
$attr["rl_frame"] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s";
$attr["rl_value"] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : "";
$attr["force_pw_update"] = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update']);
@@ -3798,6 +3816,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$attr["tagged_mail_handler"] = (!empty($_data['tagged_mail_handler'])) ? $_data['tagged_mail_handler'] : $is_now['tagged_mail_handler'];
$attr["quarantine_notification"] = (!empty($_data['quarantine_notification'])) ? $_data['quarantine_notification'] : $is_now['quarantine_notification'];
$attr["quarantine_category"] = (!empty($_data['quarantine_category'])) ? $_data['quarantine_category'] : $is_now['quarantine_category'];
+ // Validate quarantine_category
+ if (!in_array($attr["quarantine_category"], array('add_header', 'reject', 'all'))) {
+ $_SESSION['return'][] = array(
+ 'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_extra),
+ 'msg' => 'quarantine_category_invalid'
+ );
+ continue;
+ }
$attr["rl_frame"] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : $is_now['rl_frame'];
$attr["rl_value"] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : $is_now['rl_value'];
$attr["force_pw_update"] = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : $is_now['force_pw_update'];
diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json
index 487300fe..3672762d 100644
--- a/data/web/lang/lang.de-de.json
+++ b/data/web/lang/lang.de-de.json
@@ -512,6 +512,7 @@
"pushover_credentials_missing": "Pushover Token und/oder Key fehlen",
"pushover_key": "Pushover Key hat das falsche Format",
"pushover_token": "Pushover Token hat das falsche Format",
+ "quarantine_category_invalid": "Quarantäne-Kategorie muss eine der folgenden sein: add_header, reject, all",
"quota_not_0_not_numeric": "Speicherplatz muss numerisch und >= 0 sein",
"recipient_map_entry_exists": "Eine Empfängerumschreibung für Objekt \"%s\" existiert bereits",
"recovery_email_failed": "E-Mail zur Wiederherstellung konnte nicht gesendet werden. Bitte wenden Sie sich an Ihren Administrator.",
diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json
index eb26e3fc..e786bcbe 100644
--- a/data/web/lang/lang.en-gb.json
+++ b/data/web/lang/lang.en-gb.json
@@ -513,6 +513,7 @@
"pushover_credentials_missing": "Pushover token and or key missing",
"pushover_key": "Pushover key has a wrong format",
"pushover_token": "Pushover token has a wrong format",
+ "quarantine_category_invalid": "Quarantine category must be one of: add_header, reject, all",
"quota_not_0_not_numeric": "Quota must be numeric and >= 0",
"recipient_map_entry_exists": "A Recipient map entry \"%s\" exists",
"recovery_email_failed": "Could not send a recovery email. Please contact your administrator.",
diff --git a/docker-compose.yml b/docker-compose.yml
index edddc655..0a9578de 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -252,7 +252,7 @@ services:
- sogo
dovecot-mailcow:
- image: ghcr.io/mailcow/dovecot:2.3.21.1-1
+ image: ghcr.io/mailcow/dovecot:2.3.21.1-2
depends_on:
- mysql-mailcow
- netfilter-mailcow
From 08278a8be9f8e44357516250a8a5993458c737f5 Mon Sep 17 00:00:00 2001
From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com>
Date: Mon, 30 Mar 2026 23:51:05 +0200
Subject: [PATCH 008/123] Update RSPAMD version to 4.0.0 in Dockerfile
---
data/Dockerfiles/rspamd/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile
index d0c71042..aed261ab 100644
--- a/data/Dockerfiles/rspamd/Dockerfile
+++ b/data/Dockerfiles/rspamd/Dockerfile
@@ -2,7 +2,7 @@ FROM debian:trixie-slim
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG RSPAMD_VER=rspamd_3.14.3-1~236eb65
+ARG RSPAMD_VER=rspamd_4.0.0-1~4a2ab73
ARG CODENAME=trixie
ENV LC_ALL=C
From dc15994d4014a0b0cad2d408090aae9e7fbea3cd Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Thu, 2 Apr 2026 11:50:05 +0200
Subject: [PATCH 009/123] update postscreen_access.cidr (#7177)
---
data/conf/postfix/postscreen_access.cidr | 98 ++++++++++++++++++++----
1 file changed, 85 insertions(+), 13 deletions(-)
diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr
index de38fe39..2f7891cd 100644
--- a/data/conf/postfix/postscreen_access.cidr
+++ b/data/conf/postfix/postscreen_access.cidr
@@ -1,6 +1,6 @@
-# Whitelist generated by Postwhite v3.4 on Sun Mar 1 00:29:01 UTC 2026
+# Whitelist generated by Postwhite v3.4 on Wed Apr 1 00:33:31 UTC 2026
# https://github.com/stevejenkins/postwhite/
-# 2174 total rules
+# 2246 total rules
2a00:1450:4000::/36 permit
2a01:111:f400::/48 permit
2a01:111:f403:2800::/53 permit
@@ -31,8 +31,10 @@
2a02:a60:0:5::/64 permit
2a0f:f640::/56 permit
2c0f:fb50:4000::/36 permit
+2.207.151.32/27 permit
2.207.151.53 permit
2.207.217.30 permit
+2.207.223.160/27 permit
3.64.237.68 permit
3.65.3.180 permit
3.70.123.177 permit
@@ -58,8 +60,8 @@
8.40.222.0/23 permit
8.40.222.250/31 permit
12.130.86.238 permit
-13.107.213.51 permit
-13.107.246.51 permit
+13.107.213.38 permit
+13.107.246.38 permit
13.108.16.0/20 permit
13.110.208.0/21 permit
13.110.209.0/24 permit
@@ -368,6 +370,7 @@
64.132.88.0/23 permit
64.132.92.0/24 permit
64.181.194.190 permit
+64.181.213.254 permit
64.207.219.7 permit
64.207.219.8 permit
64.207.219.9 permit
@@ -453,7 +456,11 @@
66.218.75.252/31 permit
66.218.75.254 permit
66.220.144.128/25 permit
+66.220.144.178 permit
+66.220.144.179 permit
66.220.155.0/24 permit
+66.220.155.178 permit
+66.220.155.179 permit
66.220.157.0/25 permit
66.231.80.0/20 permit
66.240.227.0/24 permit
@@ -518,6 +525,8 @@
69.162.98.0/24 permit
69.169.224.0/20 permit
69.171.232.0/24 permit
+69.171.232.180 permit
+69.171.232.181 permit
69.171.244.0/23 permit
70.42.149.35 permit
72.3.185.0/24 permit
@@ -639,6 +648,7 @@
77.238.189.148/30 permit
79.135.106.0/24 permit
79.135.107.0/24 permit
+80.225.160.128/25 permit
81.169.146.243 permit
81.169.146.245 permit
81.169.146.246 permit
@@ -657,6 +667,9 @@
82.165.159.45 permit
82.165.159.130 permit
82.165.159.131 permit
+84.8.68.0/25 permit
+84.8.192.128/25 permit
+84.8.224.128/25 permit
85.9.206.169 permit
85.9.210.45 permit
85.158.136.0/21 permit
@@ -1408,6 +1421,20 @@
129.146.88.28 permit
129.146.147.105 permit
129.146.236.58 permit
+129.148.135.0/25 permit
+129.148.148.0/25 permit
+129.148.164.0/25 permit
+129.148.180.0/25 permit
+129.148.215.0/25 permit
+129.149.6.0/25 permit
+129.149.22.0/25 permit
+129.149.38.0/25 permit
+129.149.52.0/25 permit
+129.149.68.0/25 permit
+129.149.84.0/25 permit
+129.149.100.0/25 permit
+129.149.118.0/25 permit
+129.149.126.0/25 permit
129.151.67.221 permit
129.153.62.216 permit
129.153.104.71 permit
@@ -1420,16 +1447,19 @@
129.159.22.159 permit
129.159.87.137 permit
129.213.195.191 permit
+130.35.116.0/25 permit
130.61.9.72 permit
130.162.39.83 permit
130.248.172.0/24 permit
130.248.173.0/24 permit
+131.186.12.0/25 permit
131.253.30.0/24 permit
131.253.121.0/26 permit
132.145.13.209 permit
132.226.26.225 permit
132.226.49.32 permit
132.226.56.24 permit
+134.98.248.128/25 permit
134.128.64.0/19 permit
134.128.96.0/19 permit
134.170.27.8 permit
@@ -1460,6 +1490,10 @@
136.147.182.0/24 permit
136.147.224.0/20 permit
136.179.50.206 permit
+136.248.224.128/25 permit
+136.248.232.128/25 permit
+138.1.108.0/25 permit
+138.1.170.0/24 permit
139.60.152.0/22 permit
139.138.35.44 permit
139.138.46.121 permit
@@ -1468,6 +1502,7 @@
139.138.57.55 permit
139.138.58.119 permit
139.167.79.86 permit
+139.177.108.0/25 permit
139.180.17.0/24 permit
140.238.148.191 permit
141.148.55.217 permit
@@ -1506,6 +1541,9 @@
146.88.28.0/24 permit
146.148.116.76 permit
147.154.32.0/25 permit
+147.154.63.0/24 permit
+147.154.126.0/24 permit
+147.154.191.0/24 permit
147.243.1.47 permit
147.243.1.48 permit
147.243.1.153 permit
@@ -1517,12 +1555,16 @@
149.72.234.184 permit
149.72.248.236 permit
149.97.173.180 permit
+149.118.160.128/25 permit
150.136.21.199 permit
150.230.98.160 permit
151.145.38.14 permit
152.67.105.195 permit
152.69.200.236 permit
152.70.155.126 permit
+155.248.135.128/25 permit
+155.248.140.0/25 permit
+155.248.148.0/25 permit
155.248.208.51 permit
155.248.220.138 permit
155.248.234.149 permit
@@ -1531,10 +1573,14 @@
157.58.30.128/25 permit
157.58.196.96/29 permit
157.58.249.3 permit
+157.137.32.128/25 permit
+157.137.96.128/25 permit
157.151.208.65 permit
157.255.1.64/29 permit
158.101.211.207 permit
158.247.16.0/20 permit
+158.247.100.0/25 permit
+159.13.4.0/25 permit
159.92.154.0/24 permit
159.92.155.0/24 permit
159.92.157.0/24 permit
@@ -1568,6 +1614,7 @@
161.71.64.0/20 permit
162.88.4.0/23 permit
162.88.8.0/24 permit
+162.88.24.0/23 permit
162.88.24.0/24 permit
162.88.25.0/24 permit
162.88.36.0/24 permit
@@ -1585,10 +1632,12 @@
164.152.23.32 permit
164.152.25.241 permit
164.177.132.168/30 permit
+165.1.100.0/25 permit
165.173.128.0/24 permit
165.173.180.1 permit
165.173.180.250/31 permit
165.173.182.250/31 permit
+165.173.189.205 permit
166.78.68.0/22 permit
166.78.68.221 permit
166.78.69.169 permit
@@ -1607,9 +1656,12 @@
167.89.75.126 permit
167.89.75.136 permit
167.89.75.164 permit
-167.89.101.2 permit
-167.89.101.192/28 permit
167.220.67.232/29 permit
+168.107.248.128/25 permit
+168.110.160.128/25 permit
+168.110.248.128/25 permit
+168.129.184.128/25 permit
+168.129.248.128/25 permit
168.138.5.36 permit
168.138.73.51 permit
168.138.77.31 permit
@@ -1745,8 +1797,24 @@
192.18.139.154 permit
192.18.145.36 permit
192.18.152.58 permit
+192.22.32.128/25 permit
+192.22.96.128/25 permit
+192.22.160.128/25 permit
+192.22.224.128/25 permit
192.28.128.0/18 permit
+192.29.24.0/25 permit
+192.29.44.0/25 permit
+192.29.72.0/25 permit
+192.29.88.0/25 permit
192.29.103.128/25 permit
+192.29.134.0/25 permit
+192.29.151.128/25 permit
+192.29.172.0/25 permit
+192.29.178.0/25 permit
+192.29.200.0/25 permit
+192.29.216.0/25 permit
+192.29.232.0/25 permit
+192.29.248.0/25 permit
192.30.252.0/22 permit
192.161.144.0/20 permit
192.162.87.0/24 permit
@@ -1754,11 +1822,6 @@
192.237.159.42 permit
192.237.159.43 permit
192.254.112.0/20 permit
-192.254.112.60 permit
-192.254.112.98/31 permit
-192.254.113.10 permit
-192.254.113.101 permit
-192.254.114.176 permit
193.109.254.0/23 permit
193.122.128.100 permit
193.123.56.63 permit
@@ -1927,6 +1990,7 @@
207.211.30.128/25 permit
207.211.31.0/25 permit
207.211.41.113 permit
+207.211.132.0/25 permit
207.218.90.0/24 permit
207.218.90.122 permit
207.250.68.0/24 permit
@@ -1934,6 +1998,8 @@
208.43.21.28/30 permit
208.43.21.64/29 permit
208.43.21.72/30 permit
+208.56.9.224 permit
+208.56.13.196 permit
208.64.132.0/22 permit
208.71.40.63 permit
208.71.40.64/31 permit
@@ -1960,6 +2026,7 @@
208.71.42.214 permit
208.72.249.240/29 permit
208.75.120.0/22 permit
+208.76.62.0/23 permit
208.76.62.0/24 permit
208.76.63.0/24 permit
208.82.237.96/29 permit
@@ -2120,6 +2187,7 @@
216.136.168.80/28 permit
216.139.64.0/19 permit
216.145.221.0/24 permit
+216.146.32.0/23 permit
216.146.32.0/24 permit
216.146.33.0/24 permit
216.198.0.0/18 permit
@@ -2140,6 +2208,7 @@
223.165.120.0/23 permit
2001:0868:0100:0600::/64 permit
2001:4860:4000::/36 permit
+2001:4860:4864::/56 permit
2001:748:100:40::2:0/112 permit
2001:748:400:1300::3 permit
2001:748:400:1300::4 permit
@@ -2157,10 +2226,12 @@
2001:748:400:3301::3 permit
2001:748:400:3301::4 permit
2404:6800:4000::/36 permit
+2404:6800:4864::/56 permit
2607:13c0:0001:0000:0000:0000:0000:7000/116 permit
2607:13c0:0002:0000:0000:0000:0000:1000/116 permit
2607:13c0:0004:0000:0000:0000:0000:0000/116 permit
2607:f8b0:4000::/36 permit
+2607:f8b0:4864::/56 permit
2620:109:c003:104::/64 permit
2620:109:c003:104::215 permit
2620:109:c006:104::/64 permit
@@ -2172,8 +2243,9 @@
2620:10d:c09c:400::8:1 permit
2620:119:50c0:207::/64 permit
2620:119:50c0:207::215 permit
-2620:1ec:46::51 permit
-2620:1ec:bdf::51 permit
+2620:1ec:46::38 permit
+2620:1ec:bdf::38 permit
2800:3f0:4000::/36 permit
+2800:3f0:4864::/56 permit
49.12.4.251 permit # checks.mailcow.email
2a01:4f8:c17:7906::10 permit # checks.mailcow.email
From 694d7519155cdc9365fc1c886b6eab8e2e537197 Mon Sep 17 00:00:00 2001
From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com>
Date: Mon, 6 Apr 2026 17:28:14 +0200
Subject: [PATCH 010/123] Update RSPAMD version in Dockerfile
---
data/Dockerfiles/rspamd/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile
index aed261ab..4a666613 100644
--- a/data/Dockerfiles/rspamd/Dockerfile
+++ b/data/Dockerfiles/rspamd/Dockerfile
@@ -2,7 +2,7 @@ FROM debian:trixie-slim
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG RSPAMD_VER=rspamd_4.0.0-1~4a2ab73
+ARG RSPAMD_VER=rspamd_4.0.-1~8700333
ARG CODENAME=trixie
ENV LC_ALL=C
From b0873edb6a49d3ff0ffd2043d3ce3b8b9e856ac8 Mon Sep 17 00:00:00 2001
From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com>
Date: Mon, 6 Apr 2026 17:28:32 +0200
Subject: [PATCH 011/123] Update RSPAMD version in Dockerfile
---
data/Dockerfiles/rspamd/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile
index 4a666613..ab9aaa5a 100644
--- a/data/Dockerfiles/rspamd/Dockerfile
+++ b/data/Dockerfiles/rspamd/Dockerfile
@@ -2,7 +2,7 @@ FROM debian:trixie-slim
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG RSPAMD_VER=rspamd_4.0.-1~8700333
+ARG RSPAMD_VER=rspamd_4.0.1-1~8700333
ARG CODENAME=trixie
ENV LC_ALL=C
From 886dbcc4196e0660912d843a98ab089fe75a8e7a Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Sat, 11 Apr 2026 21:25:03 +0200
Subject: [PATCH 012/123] Translations update from Weblate (#7190)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [Web] Updated lang.az-az.json
[Web] Added lang.az-az.json
Co-authored-by: Nemoralis
Co-authored-by: Peter
Co-authored-by: milkmaker
* [Web] Updated lang.si-si.json
Co-authored-by: Matjaž Tekavec
* [Web] Updated lang.pt-br.json
Co-authored-by: André Ribas
---------
Co-authored-by: Nemoralis
Co-authored-by: Peter
Co-authored-by: Matjaž Tekavec
Co-authored-by: André Ribas
---
data/web/lang/lang.az-az.json | 5 +++
data/web/lang/lang.pt-br.json | 58 ++++++++++++++++++++++-------------
data/web/lang/lang.si-si.json | 3 +-
3 files changed, 43 insertions(+), 23 deletions(-)
create mode 100644 data/web/lang/lang.az-az.json
diff --git a/data/web/lang/lang.az-az.json b/data/web/lang/lang.az-az.json
new file mode 100644
index 00000000..0862f691
--- /dev/null
+++ b/data/web/lang/lang.az-az.json
@@ -0,0 +1,5 @@
+{
+ "acl": {
+ "login_as": "E-poçt qutusu istifadəçisi olaraq daxil ol"
+ }
+}
diff --git a/data/web/lang/lang.pt-br.json b/data/web/lang/lang.pt-br.json
index b01d9765..24105db1 100644
--- a/data/web/lang/lang.pt-br.json
+++ b/data/web/lang/lang.pt-br.json
@@ -111,7 +111,8 @@
"validation_success": "Validado com sucesso",
"dry": "Simular sincronização",
"internal": "Interno",
- "internal_info": "Aliases internos são acessíveis apenas a partir do próprio domínio ou alias de domínio."
+ "internal_info": "Aliases internos são acessíveis apenas a partir do próprio domínio ou alias de domínio.",
+ "sender_allowed": "Permitir enviar como este alias"
},
"admin": {
"access": "Acesso",
@@ -151,7 +152,7 @@
"arrival_time": "Hora de chegada (hora do servidor)",
"authed_user": "Usuário autoritário",
"ays": "Tem certeza de que deseja continuar?",
- "ban_list_info": "Veja uma lista de IPs banidos abaixo: rede (tempo restante de banimento) - [ações]. Os IPs na fila para serem desbanidos serão removidos da lista de banimentos ativos em alguns segundos. Rótulos vermelhos indicam proibições permanentes ativas na lista negra.",
+ "ban_list_info": "Veja abaixo a lista de IPs banidos: rede (tempo restante do banimento) - [ações]. IPs na fila para serem desbanidos serão removidos da lista de banimentos ativos em alguns segundos. Rótulos vermelhos indicam banimentos permanentes ativos na lista de bloqueio.",
"change_logo": "Alterar logotipo",
"logo_normal_label": "Normal",
"logo_dark_label": "Invertido para o modo escuro",
@@ -188,9 +189,9 @@
"excludes": "Exclui esses destinatários",
"f2b_ban_time": "Tempo (s) de proibição",
"f2b_ban_time_increment": "O tempo de banimento é incrementado com cada banimento",
- "f2b_blacklist": "Redes/hosts na lista negra",
+ "f2b_blacklist": "Redes/hosts na lista de bloqueio",
"f2b_filter": "Filtros Regex",
- "f2b_list_info": "Um host ou rede na lista negra sempre superará uma entidade na lista branca. As atualizações da lista levarão alguns segundos para serem aplicadas.",
+ "f2b_list_info": "Um host ou rede na lista de bloqueio sempre terá prioridade sobre uma entidade na lista de permissões. As atualizações das listas levarão alguns segundos para serem aplicadas.",
"f2b_manage_external": "Gerenciar Fail2Ban externamente",
"f2b_manage_external_info": "O Fail2ban ainda manterá a lista de banimentos, mas não definirá ativamente regras para bloquear o tráfego. Use a lista de banimento gerada abaixo para bloquear externamente o tráfego.",
"f2b_max_attempts": "Máximo de tentativas",
@@ -200,7 +201,7 @@
"f2b_parameters": "Parâmetros do Fail2ban",
"f2b_regex_info": "Registros considerados: SoGo, Postfix, Dovecot, PHP-FPM.",
"f2b_retry_window": "Repita a (s) janela (s) para o máximo de tentativas",
- "f2b_whitelist": "Redes/hosts incluídos na lista branca",
+ "f2b_whitelist": "Redes/hosts na lista de permissões",
"filter_table": "Tabela de filtros",
"forwarding_hosts": "Anfitriões de encaminhamento",
"forwarding_hosts_add_hint": "Você pode especificar endereços IPv4/IPv6, redes em notação CIDR, nomes de host (que serão resolvidos para endereços IP) ou nomes de domínio (que serão resolvidos para endereços IP consultando registros SPF ou, na ausência deles, registros MX).",
@@ -320,8 +321,8 @@
"rspamd_com_settings": "Um nome de configuração será gerado automaticamente, veja os exemplos de predefinições abaixo. Para obter mais detalhes, consulte a documentação do Rspamd",
"rspamd_global_filters": "Mapas de filtro globais",
"rspamd_global_filters_agree": "Eu vou ter cuidado!",
- "rspamd_global_filters_info": "Os mapas de filtros globais contêm diferentes tipos de listas negras e brancas globais.",
- "rspamd_global_filters_regex": "Seus nomes explicam seu propósito. Todo o conteúdo deve conter uma expressão regular válida no formato “/padrão/opções” (por exemplo, /. + @domain\\ .tld/i). \r\n Embora verificações rudimentares estejam sendo executadas em cada linha de regex, a funcionalidade do Rspamd pode ser interrompida se não conseguir ler a sintaxe corretamente. \r\n O Rspamd tentará ler o conteúdo do mapa quando alterado. Se você tiver problemas, reinicie o Rspamd para forçar o recarregamento do mapa. Os elementos da lista negra são excluídos da quarentena.",
+ "rspamd_global_filters_info": "Os mapas de filtros globais contêm diferentes tipos de listas globais de bloqueio e de permissões.",
+ "rspamd_global_filters_regex": "Os nomes explicam sua finalidade. Todo o conteúdo deve conter uma expressão regular válida no formato \"/padrão/opções\" (por exemplo, /.[+@domain.tld](mailto:+@domain.tld)/i). \nEmbora verificações básicas sejam executadas em cada linha de regex, a funcionalidade do Rspamd pode ser comprometida se ele não conseguir ler a sintaxe corretamente. \nO Rspamd tentará ler o conteúdo do mapa quando ele for alterado. Se você tiver problemas, reinicie o Rspamd para forçar o recarregamento do mapa. Elementos na lista de bloqueio são excluídos da quarentena.",
"rspamd_settings_map": "Mapa de configurações do Rspamd",
"sal_level": "Nível de humor",
"save": "Salvar alterações",
@@ -556,7 +557,9 @@
"mode_invalid": "Modo %s é inválido",
"mx_invalid": "Registro MX %s é inválido",
"required_data_missing": "Dados obrigatórios %s estão ausentes",
- "version_invalid": "Versão %s é inválida"
+ "version_invalid": "Versão %s é inválida",
+ "tfa_removal_blocked": "A autenticação de dois fatores não pode ser removida, pois é obrigatória para a sua conta.",
+ "quarantine_category_invalid": "A categoria da quarentena deve ser uma das seguintes: add_header, reject, all"
},
"datatables": {
"collapse_all": "Recolher tudo",
@@ -746,13 +749,13 @@
"sieve_desc": "Breve descrição",
"sieve_type": "Tipo de filtro",
"skipcrossduplicates": "Ignore mensagens duplicadas entre pastas (primeiro a chegar, primeiro a ser servido)",
- "sogo_access": "Encaminhamento direto para o SOGoo",
- "sogo_access_info": "Depois de fazer login, o usuário é automaticamente redirecionado para o SOGo.",
+ "sogo_access": "Encaminhamento direto para o SOGo",
+ "sogo_access_info": "Após o login, o usuário é automaticamente redirecionado para o SOGo.",
"sogo_visible": "O alias é visível no SoGo",
"sogo_visible_info": "Essa opção afeta somente objetos, que podem ser exibidos no SoGo (endereços de alias compartilhados ou não compartilhados apontando para pelo menos uma mailbox local). Se estiver oculto, um alias não aparecerá como remetente selecionável no SoGo.",
"spam_alias": "Crie ou altere endereços de alias com limite de tempo",
"spam_filter": "Filtro de spam",
- "spam_policy": "Adicionar ou remover itens da lista branca/negra",
+ "spam_policy": "Adicionar ou remover itens da lista de permissões/bloqueio",
"spam_score": "Defina uma pontuação de spam personalizada",
"subfolder2": "Sincronizar na subpasta no destino (vazio = não usar subpasta)",
"syncjob": "Editar tarefa de sincronização",
@@ -781,7 +784,9 @@
"mta_sts_max_age_info": "Tempo em segundos que servidores de email de recepção podem armazenar esta política em cache até buscar novamente.",
"mta_sts_mx": "Servidor MX",
"mta_sts_mx_info": "Permite envio apenas para nomes de host de servidor de email explicitamente listados; o MTA de envio verifica se o nome do host DNS MX corresponde à lista de políticas e permite entrega apenas com certificado TLS válido (protege contra MITM).",
- "mta_sts_mx_notice": "Múltiplos servidores MX podem ser especificados (separados por vírgulas)."
+ "mta_sts_mx_notice": "Múltiplos servidores MX podem ser especificados (separados por vírgulas).",
+ "sender_allowed": "Permitir enviar como este alias",
+ "sender_allowed_info": "Se desativado, este alias poderá apenas receber e-mails. Use a ACL de remetente para substituir essa configuração e conceder a caixas de correio específicas permissão para enviar."
},
"fido2": {
"confirm": "Confirme",
@@ -970,7 +975,7 @@
"recipient_map_new": "Novo destinatário",
"recipient_map_new_info": "O destino do mapa do destinatário deve ser um endereço de e-mail válido ou um nome de domínio.",
"recipient_map_old": "Destinatário original",
- "recipient_map_old_info": "O destino original do mapa de um destinatário deve ser um endereço de e-mail válido ou um nome de domínio.",
+ "recipient_map_old_info": "O destino original do mapa de destinatário deve ser um endereço de e-mail válido ou um nome de domínio.",
"recipient_maps": "Mapas de destinatários",
"relay_all": "Retransmita todos os destinatários",
"relay_unknown": "Retransmitir mailboxes desconhecidas",
@@ -1061,7 +1066,7 @@
"notified": "Notificado",
"qhandler_success": "Solicitação enviada com sucesso para o sistema. Agora você pode fechar a janela.",
"qid": "Respand AID",
- "qinfo": "O sistema de quarentena salvará as mensagens rejeitadas no banco de dados (o remetente não terá a impressão de uma mensagem entregue), bem como as mensagens, que são entregues como cópia na pasta Lixo eletrônico de uma mailbox.\n “Aprenda como spam e exclua” aprenderá uma mensagem como spam por meio do Teorema de Bayes e também calculará hashes difusos para negar mensagens semelhantes no futuro.\n Esteja ciente de que aprender várias mensagens pode ser demorado, dependendo do seu sistema. Os elementos da lista negra são excluídos da quarentena.",
+ "qinfo": "O sistema de quarentena irá salvar no banco de dados os e-mails rejeitados (o remetente não terá a impressão de que o e-mail foi entregue), bem como os e-mails que são entregues como cópia na pasta de spam de uma mailbox.\n “Aprender como spam e excluir” irá classificar a mensagem como spam por meio do Teorema de Bayes e também calcular hashes fuzzy para bloquear mensagens semelhantes no futuro.\n Esteja ciente de que o aprendizado de múltiplas mensagens pode, dependendo do seu sistema, levar tempo. Elementos na lista de bloqueio são excluídos da quarentena.",
"qitem": "Item de quarentena",
"quarantine": "Quarentena",
"quick_actions": "Ações",
@@ -1237,7 +1242,12 @@
"webauthn": "Autenticação WebAuthn",
"waiting_usb_auth": "Aguardando o dispositivo USB...
Toque no botão no seu dispositivo USB agora.",
"waiting_usb_register": "Aguardando o dispositivo USB...
Digite sua senha acima e confirme seu registro tocando no botão no seu dispositivo USB.",
- "yubi_otp": "Autenticação Yubico OTP"
+ "yubi_otp": "Autenticação Yubico OTP",
+ "force_tfa": "Forçar o cadastro de 2FA no login",
+ "force_tfa_info": "O usuário será obrigado a configurar a autenticação de dois fatores antes de acessar o painel.",
+ "setup_title": "Autenticação de Dois Fatores Obrigatória",
+ "setup_required": "Sua conta exige autenticação de dois fatores. Configure um método de 2FA para continuar.",
+ "cancel_setup": "Cancelar e sair"
},
"user": {
"action": "Ação",
@@ -1276,7 +1286,7 @@
"delete_ays": "Confirme o processo de exclusão.",
"direct_aliases": "Endereços de alias diretos",
"direct_aliases_desc": "Os endereços de alias diretos são afetados pelo filtro de spam e pelas configurações da política TLS.",
- "direct_protocol_access": "Esse usuário da mailbox tem acesso externo direto aos seguintes protocolos e aplicativos. Essa configuração é controlada pelo administrador. As senhas de aplicativos podem ser criadas para conceder acesso a protocolos e aplicativos individuais. O botão “Login no webmail” fornece login único no SoGo e está sempre disponível.",
+ "direct_protocol_access": "Este usuário da mailbox possui acesso direto e externo aos seguintes protocolos e aplicações. Esta configuração é controlada pelo seu administrador. Senhas de aplicativo podem ser criadas para conceder acesso a protocolos e aplicações específicos. O botão “Webmail” fornece login único (SSO) para o SOGo e está sempre disponível.",
"eas_reset": "Redefinir o cache do dispositivo ActiveSync",
"eas_reset_help": "Em muitos casos, uma redefinição do cache do dispositivo ajudará a recuperar um perfil quebrado do ActiveSync. Atenção: Todos os elementos serão baixados novamente!",
"eas_reset_now": "Reinicie agora",
@@ -1352,12 +1362,12 @@
"sogo_profile_reset": "Redefinir perfil SoGo",
"sogo_profile_reset_help": "Isso destruirá o perfil SoGo de um usuário e excluirá todos os dados de contato e calendário irrecuperáveis.",
"sogo_profile_reset_now": "Redefina o perfil agora",
- "spam_aliases": "Aliases de e-mail temporários",
+ "spam_aliases": "Aliases de e-mail de spam",
"spam_score_reset": "Redefinir para o padrão do servidor",
"spamfilter": "Filtro de spam",
"spamfilter_behavior": "Avaliação",
- "spamfilter_bl": "Lista negra",
- "spamfilter_bl_desc": "Endereços de e-mail na lista negra para sempre serem classificados como spam e rejeitados. E-mails rejeitados não serão copiados para a quarentena. Podem ser usados curingas. Um filtro só é aplicado a aliases diretos (aliases com uma única caixa de correio de destino), excluindo aliases abrangentes e a própria mailbox.",
+ "spamfilter_bl": "Lista de bloqueio",
+ "spamfilter_bl_desc": "Endereços de e-mail na lista de bloqueio para sempre classificar como spam e rejeitados. E-mails rejeitados não serão copiados para a quarentena. Coringas podem ser utilizados. O filtro é aplicado apenas a aliases diretos (aliases com uma única mailbox de destino), excluindo aliases catch-all e a própria mailbox.",
"spamfilter_default_score": "Valores padrão",
"spamfilter_green": "Verde: esta mensagem não é spam",
"spamfilter_hint": "O primeiro valor descreve a “pontuação baixa de spam”, o segundo representa a “alta pontuação de spam”.",
@@ -1368,8 +1378,8 @@
"spamfilter_table_empty": "Não há dados para exibir",
"spamfilter_table_remove": "remover",
"spamfilter_table_rule": "Regra",
- "spamfilter_wl": "Lista branca",
- "spamfilter_wl_desc": "Os endereços de e-mail incluídos na lista branca são programados para nunca serem classificados como spam. Podem ser usados curingas. Um filtro só é aplicado a aliases diretos (aliases com uma única mailbox de destino), excluindo aliases abrangentes e a própria mailbox.",
+ "spamfilter_wl": "Lista de permissões",
+ "spamfilter_wl_desc": "Endereços de e-mail na lista de permissões são configurados para nunca serem classificados como spam. Coringas podem ser utilizados. O filtro é aplicado apenas a aliases diretos (aliases com uma única mailbox de destino), excluindo aliases catch-all e a própria mailbox.",
"spamfilter_yellow": "Amarelo: esta mensagem pode ser spam, será marcada como spam e movida para sua pasta de lixo eletrônico",
"status": "Status",
"sync_jobs": "Trabalhos de sincronização",
@@ -1408,7 +1418,11 @@
"authentication": "Autenticação",
"overview": "Visão geral",
"protocols": "Protocolos",
- "tfa_info": "A autenticação de dois fatores ajuda a proteger sua conta. Se você habilitá-la, precisará de senhas de aplicativo para fazer login em aplicativos ou serviços que não suportam autenticação de dois fatores (por exemplo, clientes de email)."
+ "tfa_info": "A autenticação de dois fatores ajuda a proteger sua conta. Se você habilitá-la, precisará de senhas de aplicativo para fazer login em aplicativos ou serviços que não suportam autenticação de dois fatores (por exemplo, clientes de email).",
+ "expire_never": "Nunca expirar",
+ "forever": "Para sempre",
+ "pw_update_required": "Sua conta exige a alteração de senha. Defina uma nova senha para continuar.",
+ "spam_aliases_info": "Um alias de spam é um endereço de e-mail temporário que pode ser usado para proteger endereços de e-mail reais. Opcionalmente, pode-se definir um tempo de expiração para que o alias seja automaticamente desativado após o período definido, descartando efetivamente endereços que tenham sido abusados ou vazados."
},
"warning": {
"cannot_delete_self": "Não é possível excluir o usuário conectado",
diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json
index 5b7b8574..f5ba53f9 100644
--- a/data/web/lang/lang.si-si.json
+++ b/data/web/lang/lang.si-si.json
@@ -558,7 +558,8 @@
"mode_invalid": "Način %s ni veljaven",
"mx_invalid": "Zapis MX %s je neveljaven",
"version_invalid": "Različica %s je neveljavna",
- "tfa_removal_blocked": "Dvofaktorske avtentikacije ni mogoče odstraniti, ker je obvezna za vaš račun."
+ "tfa_removal_blocked": "Dvofaktorske avtentikacije ni mogoče odstraniti, ker je obvezna za vaš račun.",
+ "quarantine_category_invalid": "Kategorija karantene mora biti ena od: add_header, reject, all"
},
"debug": {
"containers_info": "Informacije o zabojniku",
From 8ead057ce9f6015327ce4eb8f51fef41a1292190 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Wed, 15 Apr 2026 09:33:23 +0200
Subject: [PATCH 013/123] [Web] Create default mailbox template with eas and
dav access
---
data/web/inc/init_db.inc.php | 2 ++
1 file changed, 2 insertions(+)
diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php
index 72018a6b..23aa5e77 100644
--- a/data/web/inc/init_db.inc.php
+++ b/data/web/inc/init_db.inc.php
@@ -1464,6 +1464,8 @@ function init_db_schema()
"pop3_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['pop3_access']),
"smtp_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['smtp_access']),
"sieve_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sieve_access']),
+ "eas_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['eas_access']),
+ "dav_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['dav_access']),
"acl_spam_alias" => 1,
"acl_tls_policy" => 1,
"acl_spam_score" => 1,
From d42c3823c434ef9a04a04b81783b945948f80b99 Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Sat, 2 May 2026 19:15:14 +0200
Subject: [PATCH 014/123] update postscreen_access.cidr (#7209)
---
data/conf/postfix/postscreen_access.cidr | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr
index 2f7891cd..285ea7a8 100644
--- a/data/conf/postfix/postscreen_access.cidr
+++ b/data/conf/postfix/postscreen_access.cidr
@@ -1,7 +1,8 @@
-# Whitelist generated by Postwhite v3.4 on Wed Apr 1 00:33:31 UTC 2026
+# Whitelist generated by Postwhite v3.4 on Fri May 1 00:43:37 UTC 2026
# https://github.com/stevejenkins/postwhite/
-# 2246 total rules
+# 2249 total rules
2a00:1450:4000::/36 permit
+2a00:1450:4864::/56 permit
2a01:111:f400::/48 permit
2a01:111:f403:2800::/53 permit
2a01:111:f403:8000::/51 permit
@@ -31,6 +32,7 @@
2a02:a60:0:5::/64 permit
2a0f:f640::/56 permit
2c0f:fb50:4000::/36 permit
+2c0f:fb50:4864::/56 permit
2.207.151.32/27 permit
2.207.151.53 permit
2.207.217.30 permit
@@ -60,8 +62,8 @@
8.40.222.0/23 permit
8.40.222.250/31 permit
12.130.86.238 permit
-13.107.213.38 permit
-13.107.246.38 permit
+13.107.213.40 permit
+13.107.246.40 permit
13.108.16.0/20 permit
13.110.208.0/21 permit
13.110.209.0/24 permit
@@ -279,6 +281,7 @@
50.56.130.221 permit
50.56.130.222 permit
50.112.246.219 permit
+51.83.17.38 permit
52.1.14.157 permit
52.5.230.59 permit
52.6.74.205 permit
@@ -1678,6 +1681,7 @@
169.148.144.0/25 permit
169.148.144.10 permit
169.148.146.0/23 permit
+169.148.174.10 permit
169.148.175.3 permit
169.148.179.3 permit
169.148.188.0/24 permit
@@ -2227,6 +2231,7 @@
2001:748:400:3301::4 permit
2404:6800:4000::/36 permit
2404:6800:4864::/56 permit
+2603:1061:14:72::1 permit
2607:13c0:0001:0000:0000:0000:0000:7000/116 permit
2607:13c0:0002:0000:0000:0000:0000:1000/116 permit
2607:13c0:0004:0000:0000:0000:0000:0000/116 permit
@@ -2243,8 +2248,6 @@
2620:10d:c09c:400::8:1 permit
2620:119:50c0:207::/64 permit
2620:119:50c0:207::215 permit
-2620:1ec:46::38 permit
-2620:1ec:bdf::38 permit
2800:3f0:4000::/36 permit
2800:3f0:4864::/56 permit
49.12.4.251 permit # checks.mailcow.email
From 539c32d99c665e64afb4a3baf7f6372b2494cd4f Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Fri, 8 May 2026 16:46:10 +0200
Subject: [PATCH 015/123] Translations update from Weblate (#7218)
* [Web] Updated lang.az-az.json
Co-authored-by: Nemoralis
* [Web] Updated lang.nl-nl.json
Co-authored-by: Tom18314
* [Web] Updated lang.pl-pl.json
Co-authored-by: pmuch78
---------
Co-authored-by: Nemoralis
Co-authored-by: Tom18314
Co-authored-by: pmuch78
---
data/web/lang/lang.az-az.json | 14 +++++++++++++-
data/web/lang/lang.nl-nl.json | 3 ++-
data/web/lang/lang.pl-pl.json | 2 +-
3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/data/web/lang/lang.az-az.json b/data/web/lang/lang.az-az.json
index 0862f691..958ed8e2 100644
--- a/data/web/lang/lang.az-az.json
+++ b/data/web/lang/lang.az-az.json
@@ -1,5 +1,17 @@
{
"acl": {
- "login_as": "E-poçt qutusu istifadəçisi olaraq daxil ol"
+ "login_as": "E-poçt qutusu istifadəçisi olaraq daxil ol",
+ "alias_domains": "Alternativ domenlər əlavə et",
+ "app_passwds": "Tətbiq parollarını idarə et",
+ "bcc_maps": "BCC yönləndirmə xəritələri",
+ "delimiter_action": "Ayırıcı əməliyyatı",
+ "domain_desc": "Domen təsvirini dəyiş",
+ "domain_relayhost": "Domen üçün relay serveri dəyiş",
+ "eas_reset": "EAS cihazlarını sıfırla",
+ "extend_sender_acl": "Göndərən ACL-ni xarici ünvanlarla genişləndirməyə icazə ver",
+ "filters": "Filtrlər",
+ "mailbox_relayhost": "E-poçt qutusu üçün relay serveri dəyiş",
+ "prohibited": "ACL tərəfindən məhdudlaşdırılıb",
+ "protocol_access": "Protokol girişini dəyiş"
}
}
diff --git a/data/web/lang/lang.nl-nl.json b/data/web/lang/lang.nl-nl.json
index 7b341cec..6ed9e322 100644
--- a/data/web/lang/lang.nl-nl.json
+++ b/data/web/lang/lang.nl-nl.json
@@ -27,7 +27,8 @@
"tls_policy": "Versleutelingsbeleid",
"unlimited_quota": "Onbeperkte quota voor mailboxen",
"domain_desc": "Wijzig domeinbeschrijving",
- "pw_reset": "Toegang om mailcow gebruikers wachtwoord te resetten"
+ "pw_reset": "Toegang om mailcow gebruikers wachtwoord te resetten",
+ "domain_relayhost": "Verander relayhost voor een domein"
},
"add": {
"activate_filter_warn": "Alle andere filters worden gedeactiveerd zolang deze geactiveerd is.",
diff --git a/data/web/lang/lang.pl-pl.json b/data/web/lang/lang.pl-pl.json
index 758d0cb4..b1ec3591 100644
--- a/data/web/lang/lang.pl-pl.json
+++ b/data/web/lang/lang.pl-pl.json
@@ -1226,7 +1226,7 @@
"decimal": ".",
"emptyTable": "Brak danych w tabeli",
"expand_all": "Rozszerz wszystko",
- "info": "Wyświetlanie od START do END z TOTAL wpisów",
+ "info": "Wyświetlanie od _START_ do _END_ z _TOTAL_ wpisów",
"infoEmpty": "Wyświetlanie od 0 do 0 z 0 wpisów",
"infoFiltered": "(filtrowane z _MAX_ suma wpisów)",
"thousands": ",",
From 33547d1d73237270e6d2f21edace5b2317856a1c Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Tue, 12 May 2026 08:31:51 +0200
Subject: [PATCH 016/123] [Web] escape HTML in sieve filter edit view and queue
manager
---
data/web/js/site/queue.js | 13 ++++++++-----
data/web/templates/edit/filter.twig | 2 +-
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/data/web/js/site/queue.js b/data/web/js/site/queue.js
index 26c15091..9adc79b5 100644
--- a/data/web/js/site/queue.js
+++ b/data/web/js/site/queue.js
@@ -48,13 +48,13 @@ jQuery(function($){
url: "/api/v1/get/mailq/all",
dataSrc: function(data){
$.each(data, function (i, item) {
- item.chkbox = '';
+ item.chkbox = '';
rcpts = $.map(item.recipients, function(i) {
return escapeHtml(i);
});
item.recipients = rcpts.join('');
item.action = '
From ff3d5710545202f1c8457f34cea2b5fb8fd9ed00 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Wed, 13 May 2026 10:31:23 +0200
Subject: [PATCH 017/123] [SOGo] Update to 5.12.8
---
data/Dockerfiles/sogo/Dockerfile | 6 +++---
docker-compose.yml | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile
index 96d2e0a4..1c728720 100644
--- a/data/Dockerfiles/sogo/Dockerfile
+++ b/data/Dockerfiles/sogo/Dockerfile
@@ -1,6 +1,6 @@
# SOGo built from source to enable security patch application
# Repository: https://github.com/Alinto/sogo
-# Version: SOGo-5.12.4
+# Version: SOGo-5.12.8
#
# Applied security patches:
# -
@@ -12,8 +12,8 @@ FROM debian:bookworm
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG SOGO_VERSION=SOGo-5.12.5
-ARG SOPE_VERSION=SOPE-5.12.5
+ARG SOGO_VERSION=SOGo-5.12.8
+ARG SOPE_VERSION=SOPE-5.12.8
# Security patches to apply (space-separated commit hashes)
ARG SOGO_SECURITY_PATCHES=""
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?.*)$
diff --git a/docker-compose.yml b/docker-compose.yml
index 0a9578de..90e5518d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -200,7 +200,7 @@ services:
- phpfpm
sogo-mailcow:
- image: ghcr.io/mailcow/sogo:5.12.5-3
+ image: ghcr.io/mailcow/sogo:5.12.8-1
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
From b0d16bbceec562b3ef39464bc5bad9221d6332ee Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Wed, 13 May 2026 16:42:03 +0200
Subject: [PATCH 018/123] [Web] Updated lang.pt-br.json (#7228)
Co-authored-by: Edson Wolf
---
data/web/lang/lang.pt-br.json | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/data/web/lang/lang.pt-br.json b/data/web/lang/lang.pt-br.json
index 24105db1..db3c8cac 100644
--- a/data/web/lang/lang.pt-br.json
+++ b/data/web/lang/lang.pt-br.json
@@ -38,7 +38,7 @@
"add_domain_only": "Adicionar somente domínio",
"add_domain_restart": "Adicionar domínio e reiniciar o SoGo",
"alias_address": "Endereço (s) de alias",
- "alias_address_info": "Endereço/s de e-mail completo ou @example .com, para capturar todas as mensagens de um domínio (separadas por vírgula). somente domínios mailcow.",
+ "alias_address_info": "Endereço(s) de e-mail completo(s) ou @example.com, para capturar todas as mensagens de um domínio (separadas por vírgula). Apenas domínios do Mailcow.",
"alias_domain": "Domínio de alias",
"alias_domain_info": "Somente nomes de domínio válidos (separados por vírgula).",
"app_name": "Nome do aplicativo",
@@ -158,7 +158,7 @@
"logo_dark_label": "Invertido para o modo escuro",
"configuration": "Configuração",
"convert_html_to_text": "Converter HTML em texto sem formatação",
- "copy_to_clipboard": "Text copied to clipboard!",
+ "copy_to_clipboard": "Copiado para a área de transferência!",
"cors_settings": "Configurações do CORS",
"credentials_transport_warning": "Aviso: Adicionar uma nova entrada no mapa de transporte atualizará as credenciais de todas as entradas com uma coluna correspondente do próximo salto.",
"customer_id": "ID do cliente",
@@ -223,7 +223,7 @@
"includes": "Inclua esses destinatários",
"ip_check": "Verificação de IP",
"ip_check_disabled": "A verificação de IP está desativada. Você pode ativá-lo em Sistema > Configuração > Opções > Personalizar",
- "ip_check_opt_in": "Opte por usar o serviço de terceiros ipv4.mailcow.email. e ipv6.mailcow.email para resolver endereços IP externos.",
+ "ip_check_opt_in": "Opte por usar o serviço de terceiros ipv4.mailcow.email e ipv6.mailcow.email para resolver endereços IP externos.",
"is_mx_based": "Baseado em MX",
"last_applied": "Aplicado pela última vez",
"license_info": "Uma licença não é necessária, mas ajuda no desenvolvimento. Registre seu GUID aqui ou comprar suporte para sua instalação de mailcow.",
@@ -245,7 +245,7 @@
"oauth2_add_client": "Adicionar cliente OAuth2",
"oauth2_client_id": "ID do cliente",
"oauth2_client_secret": "Segredo do cliente",
- "oauth2_info": "A implementação OAuth2 suporta o tipo de concessão \"Código de Autorização\" e emite tokens de atualização. \nO servidor também emite automaticamente novos tokens de atualização, depois que um token de atualização foi usado.
\n• O escopo padrão é perfil. Somente usuários com caixa de e-mail podem ser autenticados contra o OAuth2. Se o parâmetro de escopo for omitido, ele voltará para perfil. \nCaminhos para solicitações OAuth2 API: \n
\n
Endpoint de autorização: /oauth/authorize
\n
Endpoint token: /oauth/token
\n
Página de recursos: /oauth/profile
\n
\nRegenerar o segredo do cliente não expirará os códigos de autorização existentes, mas eles não renovarão seu token.
\nA revogação dos tokens do cliente causará o término imediato de todas as sessões ativas. Todos os clientes precisam se autenticar novamente.",
+ "oauth2_info": "A implementação do OAuth2 suporta o tipo de concessão \"Código de Autorização\" e emite tokens de atualização. \nO servidor também emite automaticamente novos tokens de atualização após um token de atualização ter sido usado. \nO escopo padrão é profile. Somente usuários de caixa de correio podem ser autenticados com o OAuth2. Se o parâmetro de escopo for omitido, o padrão será profile. \nO parâmetro state deve ser enviado pelo cliente como parte da solicitação de autorização.
\nCaminhos para solicitações à API OAuth2: \n\n
\n
Ponto de extremidade de autorização: /oauth/authorize
\n
Endpoint do token: /oauth/token
\n
Página de recursos: /oauth/profile
\n
\n\nRegenerar o segredo do cliente não expirará os códigos de autorização existentes, mas impedirá a renovação do token.
\nA revogação dos tokens de cliente causará o encerramento imediato de todas as sessões ativas. Todos os clientes precisarão se autenticar novamente.",
"oauth2_redirect_uri": "URI de redirecionamento",
"oauth2_renew_secret": "Gere um novo segredo de cliente",
"oauth2_revoke_tokens": "Revogar todos os tokens do cliente",
@@ -730,7 +730,7 @@
"pushover_verify": "Verifique as credenciais",
"quota_mb": "Cota (MiB)",
"quota_warning_bcc": "Aviso de cota BCC",
- "quota_warning_bcc_info": "Os avisos serão enviados em cópias separadas para os seguintes destinatários. O assunto será sufixado pelo nome de usuário correspondente entre colchetes, por exemplo: Aviso de cota (user@example.com).",
+ "quota_warning_bcc_info": "Os avisos serão enviados em cópias separadas para os seguintes destinatários. O assunto será precedido pelo nome de usuário correspondente entre colchetes, por exemplo: Aviso de cota (user@example.com).",
"ratelimit": "Limite de taxa",
"redirect_uri": "URL de redirecionamento/retorno de chamada",
"relay_all": "Retransmita todos os destinatários",
@@ -759,7 +759,7 @@
"spam_score": "Defina uma pontuação de spam personalizada",
"subfolder2": "Sincronizar na subpasta no destino (vazio = não usar subpasta)",
"syncjob": "Editar tarefa de sincronização",
- "target_address": "Ir para endereço/es (separados por vírgula)",
+ "target_address": "Ir para o(s) endereço(s) (separados por vírgula)",
"target_domain": "Domínio de destino",
"timeout1": "Tempo limite para conexão com o host remoto",
"timeout2": "Tempo limite para conexão com o host local",
@@ -807,7 +807,7 @@
"cancel": "Cancelar",
"confirm_delete": "Confirme a exclusão",
"delete_now": "Excluir agora",
- "delete_these_items": "Confirme suas alterações no seguinte ID de objeto",
+ "delete_these_items": "Por favor, confirme as alterações feitas no seguinte ID de objeto.",
"hibp_check": "Verifique em haveibeenpwned.com",
"hibp_nok": "Combinado! Essa é uma senha potencialmente perigosa!",
"hibp_ok": "Nenhuma combinação encontrada.",
@@ -1393,7 +1393,7 @@
"syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Não é possível se conectar ao servidor remoto",
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Nome de usuário ou senha incorretos",
"tag_handling": "Definir o tratamento para e-mails marcados",
- "tag_help_example": "Exemplo de um endereço de e-mail marcado: me +Facebook @example .org",
+ "tag_help_example": "Exemplo de endereço de e-mail com tag: eu+Facebook@exemplo.org",
"tag_help_explain": "Na subpasta: uma nova subpasta com o nome da tag será criada abaixo da CAIXA DE ENTRADA (“Caixa de entrada/Facebook”). \r\nNo assunto: o nome das tags será anexado ao assunto do e-mail, por exemplo: “[Facebook] Minhas notícias”.",
"tag_in_none": "Não faça nada",
"tag_in_subfolder": "Na subpasta",
From 4ddcee28e4c0be584dae3e4b149723222d35a9cd Mon Sep 17 00:00:00 2001
From: Jahongir Qurbonov <109198731+Jahongir-Qurbonov@users.noreply.github.com>
Date: Wed, 13 May 2026 19:42:38 +0500
Subject: [PATCH 019/123] Add Uzbek language (#7224)
---
data/web/inc/vars.inc.php | 1 +
data/web/lang/lang.uz-uz.json | 1440 +++++++++++++++++++++++++++++++++
2 files changed, 1441 insertions(+)
create mode 100644 data/web/lang/lang.uz-uz.json
diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php
index 2f4a4b07..cec402a9 100644
--- a/data/web/inc/vars.inc.php
+++ b/data/web/inc/vars.inc.php
@@ -112,6 +112,7 @@ $AVAILABLE_LANGUAGES = array(
'sv-se' => 'Svenska (Swedish)',
'tr-tr' => 'Türkçe (Turkish)',
'uk-ua' => 'Українська (Ukrainian)',
+ 'uz-uz' => 'Oʻzbekcha (Uzbek)',
'vi-vn' => 'Tiếng Việt (Vietnamese)',
'zh-cn' => '简体中文 (Simplified Chinese)',
'zh-tw' => '繁體中文 (Traditional Chinese)',
diff --git a/data/web/lang/lang.uz-uz.json b/data/web/lang/lang.uz-uz.json
new file mode 100644
index 00000000..a8d2ecf8
--- /dev/null
+++ b/data/web/lang/lang.uz-uz.json
@@ -0,0 +1,1440 @@
+{
+ "acl": {
+ "alias_domains": "Taxallus domenlarini qoʻshish",
+ "app_passwds": "Ilova parollarini boshqarish",
+ "bcc_maps": "BCC xaritalari",
+ "delimiter_action": "Ajratuvchi amali",
+ "domain_desc": "Domen tavsifini oʻzgartirish",
+ "domain_relayhost": "Domen uchun relay xostni oʻzgartirish",
+ "eas_reset": "EAS qurilmalarini tiklash",
+ "extend_sender_acl": "Tashqi manzillar yordamida joʻnatuvchi ACL ni kengaytirishga ruxsat berish",
+ "filters": "Filtrlar",
+ "login_as": "Pochta qutisi foydalanuvchisi sifatida kirish",
+ "mailbox_relayhost": "Pochta qutisi uchun relay xostni oʻzgartirish",
+ "prohibited": "ACL tomonidan taqiqlangan",
+ "protocol_access": "Protokolga kirishni oʻzgartirish",
+ "pushover": "Pushover",
+ "pw_reset": "mailcow foydalanuvchi parolini tiklashga ruxsat berish",
+ "quarantine": "Karantin amallari",
+ "quarantine_attachments": "Karantindagi ilovalar",
+ "quarantine_category": "Karantin bildirishnoma turkumini oʻzgartirish",
+ "quarantine_notification": "Karantin bildirishnomalarini oʻzgartirish",
+ "ratelimit": "Tezlik chegarasi",
+ "recipient_maps": "Qabul qiluvchi xaritalari",
+ "smtp_ip_access": "SMTP uchun ruxsat etilgan xostlarni oʻzgartirish",
+ "sogo_access": "SOGo kirishini boshqarishga ruxsat berish",
+ "sogo_profile_reset": "SOGo profilini tiklash",
+ "spam_alias": "Vaqtinchalik taxalluslar",
+ "spam_policy": "Qora roʻyxat/Oq roʻyxat",
+ "spam_score": "Spam bahosi",
+ "syncjobs": "Sinxronizatsiya vazifalari",
+ "tls_policy": "TLS siyosati",
+ "unlimited_quota": "Pochta qutilari uchun cheksiz kvota"
+ },
+ "add": {
+ "activate_filter_warn": "Faol belgilansa, boshqa barcha filtrlar oʻchirib qoʻyiladi.",
+ "active": "Faol",
+ "add": "Qoʻshish",
+ "add_domain_only": "Faqat domen qoʻshish",
+ "add_domain_restart": "Domen qoʻshish va SOGoni qayta ishga tushirish",
+ "alias_address": "Taxallus manzil(lar)i",
+ "alias_address_info": "Toʻliq e-pochta manzil(lar)i yoki @example.com — domenga keladigan barcha xabarlarni qabul qilish uchun (vergul bilan ajratilgan). Faqat mailcow domenlari.",
+ "alias_domain": "Taxallus domeni",
+ "alias_domain_info": "Faqat haqiqiy domen nomlari (vergul bilan ajratilgan).",
+ "app_name": "Ilova nomi",
+ "app_password": "Ilova paroli qoʻshish",
+ "app_passwd_protocols": "Ilova paroli uchun ruxsat etilgan protokollar",
+ "automap": "Papkalarni avtomatik xaritalashga harakat qilish (\"Sent items\", \"Sent\" => \"Sent\" va h.k.)",
+ "backup_mx_options": "Relay sozlamalari",
+ "bcc_dest_format": "BCC manzili bitta haqiqiy e-pochta manzili boʻlishi kerak. Agar bir nechta manzilga nusxa joʻnatish kerak boʻlsa, taxallus yarating va shu yerda ishlating.",
+ "comment_info": "Maxfiy izoh foydalanuvchiga koʻrinmaydi, ommaviy izoh esa foydalanuvchi koʻrinishida ustiga sichqoncha kelganda maslahat sifatida koʻrsatiladi",
+ "custom_params": "Maxsus parametrlar",
+ "custom_params_hint": "Toʻgʻri: --param=xy, notoʻgʻri: --param xy",
+ "delete1": "Tugatilgach manbadan oʻchirish",
+ "delete2": "Manbada boʻlmagan xabarlarni manzildan oʻchirish",
+ "delete2duplicates": "Manzildagi dublikatlarni oʻchirish",
+ "description": "Tavsif",
+ "destination": "Manzil",
+ "disable_login": "Kirishni taqiqlash (kiruvchi pochta hali ham qabul qilinadi)",
+ "domain": "Domen",
+ "domain_matches_hostname": "%s domeni xost nomiga mos keladi",
+ "domain_quota_m": "Domenning umumiy kvotasi (MiB)",
+ "dry": "Sinxronizatsiyani simulyatsiya qilish",
+ "enc_method": "Shifrlash usuli",
+ "exclude": "Obyektlarni istisno qilish (regex)",
+ "full_name": "Toʻliq ism",
+ "gal": "Global manzillar roʻyxati",
+ "gal_info": "GAL domenning barcha obyektlarini oʻz ichiga oladi va hech bir foydalanuvchi tomonidan tahrirlanmaydi. Oʻchirilsa, SOGodagi bandlik maʼlumotlari yoʻqoladi! Oʻzgarishlarni qoʻllash uchun SOGoni qayta ishga tushiring.",
+ "generate": "yaratish",
+ "goto_ham": "ham sifatida oʻrgatish",
+ "goto_null": "Xatni jimgina rad etish",
+ "goto_spam": "spam sifatida oʻrgatish",
+ "hostname": "Xost",
+ "inactive": "Nofaol",
+ "internal": "Ichki",
+ "internal_info": "Ichki taxalluslarga faqat oʻz domeni yoki taxallus domenlaridan kirish mumkin.",
+ "sender_allowed": "Ushbu taxallus orqali joʻnatishga ruxsat berish",
+ "kind": "Turi",
+ "mailbox_quota_def": "Standart pochta qutisi kvotasi",
+ "mailbox_quota_m": "Bitta pochta qutisining maks. kvotasi (MiB)",
+ "mailbox_username": "Foydalanuvchi nomi (e-pochta manzilining chap qismi)",
+ "max_aliases": "Mumkin boʻlgan maks. taxalluslar",
+ "max_mailboxes": "Mumkin boʻlgan maks. pochta qutilari",
+ "mins_interval": "Soʻrov oraligʻi (daqiqa)",
+ "multiple_bookings": "Bir nechta bandlovlar",
+ "nexthop": "Keyingi nuqta",
+ "password": "Parol",
+ "password_repeat": "Tasdiqlash paroli (takrorlang)",
+ "port": "Port",
+ "post_domain_add": "Yangi domen qoʻshilgandan keyin SOGo konteyneri (\"sogo-mailcow\") qayta ishga tushirilishi kerak!
Bundan tashqari, domenning DNS sozlamalarini koʻrib chiqing. DNS sozlamalari tasdiqlangach, yangi domeningiz (autoconfig.<domain>, autodiscover.<domain>) uchun sertifikatlarni avtomatik yaratish uchun \"acme-mailcow\" konteynerini qayta ishga tushiring. Bu qadam ixtiyoriy va har 24 soatda qayta urinib koʻriladi.",
+ "private_comment": "Maxfiy izoh",
+ "public_comment": "Ommaviy izoh",
+ "quota_mb": "Kvota (MiB)",
+ "relay_all": "Barcha qabul qiluvchilarni relay qilish",
+ "relay_all_info": "↪ Agar barcha qabul qiluvchilarni relay qilmaslikni tanlasangiz, relay qilinishi kerak boʻlgan har bir qabul qiluvchi uchun (\"koʻr\") pochta qutisi qoʻshishingiz kerak boʻladi.",
+ "relay_domain": "Ushbu domenni relay qilish",
+ "relay_transport_info": "
Maʼlumot
Bu domen uchun maxsus manzilga transport xaritalarini belgilashingiz mumkin. Agar oʻrnatilmagan boʻlsa, MX qidiruvi amalga oshiriladi.",
+ "relay_unknown_only": "Faqat mavjud boʻlmagan pochta qutilarini relay qilish. Mavjud pochta qutilari mahalliy yetkazib beriladi.",
+ "relayhost_wrapped_tls_info": "Iltimos, TLS-oʻralgan portlardan foydalanmang (asosan 465-portda). \r\nO'ralmagan istalgan portdan foydalaning va STARTTLS chiqaring. TLS ni majburlash uchun TLS siyosatini \"TLS siyosati xaritalari\"da yaratish mumkin.",
+ "select": "Iltimos, tanlang...",
+ "select_domain": "Avval domenni tanlang",
+ "sieve_desc": "Qisqa tavsif",
+ "sieve_type": "Filtr turi",
+ "skipcrossduplicates": "Papkalararo dublikat xabarlarni oʻtkazib yuborish (birinchi kelgan, birinchi xizmatlanadi)",
+ "subscribeall": "Barcha papkalarga obuna boʻlish",
+ "syncjob": "Sinxronizatsiya vazifasi qoʻshish",
+ "syncjob_hint": "Parollar oddiy matn sifatida saqlanishini unutmang!",
+ "tags": "Teglar",
+ "target_address": "Yoʻnaltirish manzillari",
+ "target_address_info": "Toʻliq e-pochta manzil(lar)i (vergul bilan ajratilgan).",
+ "target_domain": "Maqsad domen",
+ "timeout1": "Masofaviy xostga ulanish vaqtining tugashi",
+ "timeout2": "Mahalliy xostga ulanish vaqtining tugashi",
+ "username": "Foydalanuvchi nomi",
+ "validate": "Tekshirish",
+ "validation_success": "Muvaffaqiyatli tekshirildi"
+ },
+ "admin": {
+ "access": "Kirish",
+ "action": "Amal",
+ "activate_api": "API ni faollashtirish",
+ "activate_send": "Joʻnatish tugmasini faollashtirish",
+ "active": "Faol",
+ "active_rspamd_settings_map": "Faol sozlamalar xaritasi",
+ "add": "Qoʻshish",
+ "add_admin": "Administrator qoʻshish",
+ "add_domain_admin": "Domen administratorini qoʻshish",
+ "add_forwarding_host": "Yoʻnaltirish xosti qoʻshish",
+ "add_relayhost": "Joʻnatuvchiga bogʻliq transport qoʻshish",
+ "add_relayhost_hint": "Autentifikatsiya maʼlumotlari, agar boʻlsa, oddiy matn sifatida saqlanishini unutmang.",
+ "add_row": "Satr qoʻshish",
+ "add_settings_rule": "Sozlamalar qoidasini qoʻshish",
+ "add_transport": "Transport qoʻshish",
+ "add_transports_hint": "Autentifikatsiya maʼlumotlari, agar boʻlsa, oddiy matn sifatida saqlanishini unutmang.",
+ "additional_rows": " ta qoʻshimcha satr qoʻshildi",
+ "admin": "Administrator",
+ "admin_details": "Administrator maʼlumotlarini tahrirlash",
+ "admin_domains": "Domen tayinlashlari",
+ "admins": "Administratorlar",
+ "admins_ldap": "LDAP administratorlari",
+ "admin_quicklink": "Admin kirish sahifasiga tezkor havolani yashirish",
+ "advanced_settings": "Kengaytirilgan sozlamalar",
+ "allowed_methods": "Access-Control-Allow-Methods",
+ "allowed_origins": "Access-Control-Allow-Origin",
+ "api_allow_from": "API kirishini ushbu IP / CIDR tarmoq belgilanishlaridan ruxsat berish",
+ "api_info": "API ishlab chiqilmoqda. Hujjatlarni /api manzilida topishingiz mumkin",
+ "api_key": "API kaliti",
+ "api_read_only": "Faqat oʻqish uchun kirish",
+ "api_read_write": "Oʻqish va yozish uchun kirish",
+ "api_skip_ip_check": "API uchun IP tekshiruvini oʻtkazib yuborish",
+ "app_hide": "Kirishda yashirish",
+ "app_links": "Ilova havolalari",
+ "app_name": "Ilova nomi",
+ "apps_name": "\"mailcow Apps\" nomi",
+ "arrival_time": "Kelish vaqti (server vaqti)",
+ "authed_user": "Avtorizatsiya qilingan foydalanuvchi",
+ "ays": "Davom etishni xohlayotganingizga ishonchingiz komilmi?",
+ "ban_list_info": "Quyida bloklangan IP roʻyxati keltirilgan: tarmoq (qolgan blok vaqti) - [amallar]. Blokdan chiqarishga navbatga qoʻyilgan IP lar bir necha soniya ichida faol bloklash roʻyxatidan olib tashlanadi. Qizil yorliqlar qora roʻyxat orqali faol doimiy bloklarni bildiradi.",
+ "change_logo": "Logotipni oʻzgartirish",
+ "logo_normal_label": "Oddiy",
+ "logo_dark_label": "Qorongʻi rejim uchun teskari",
+ "configuration": "Konfiguratsiya",
+ "convert_html_to_text": "HTMLni oddiy matnga aylantirish",
+ "copy_to_clipboard": "Matn vaqtinchalik xotiraga koʻchirildi!",
+ "cors_settings": "CORS sozlamalari",
+ "credentials_transport_warning": "Diqqat: Yangi transport xaritasi yozuvi qoʻshish keyingi nuqta ustunlari mos keladigan barcha yozuvlar uchun maʼlumotlarni yangilaydi.",
+ "customer_id": "Mijoz ID",
+ "customize": "Sozlash",
+ "login_page": "Kirish sahifasi",
+ "destination": "Manzil",
+ "dkim_add_key": "ARC/DKIM kaliti qoʻshish",
+ "dkim_domains_selector": "Tanlovchi",
+ "dkim_domains_wo_keys": "Kalit yetishmaydigan domenlarni tanlash",
+ "dkim_from": "Kimdan",
+ "dkim_from_title": "Maʼlumotlarni koʻchirib olish uchun manba domen",
+ "dkim_key_length": "DKIM kalit uzunligi (bit)",
+ "dkim_key_missing": "Kalit yetishmaydi",
+ "dkim_key_unused": "Kalit ishlatilmagan",
+ "dkim_key_valid": "Kalit haqiqiy",
+ "dkim_keys": "ARC/DKIM kalitlari",
+ "dkim_overwrite_key": "Mavjud DKIM kalitini ustidan yozish",
+ "dkim_private_key": "Maxfiy kalit",
+ "dkim_to": "Kimga",
+ "dkim_to_title": "Maqsad domen(lar) — ustidan yoziladi",
+ "domain": "Domen",
+ "domain_admin": "Domen administratori",
+ "domain_admins": "Domen administratorlari",
+ "domainadmin_quicklink": "Domen admin kirish sahifasiga tezkor havolani yashirish",
+ "domain_s": "Domen(lar)",
+ "duplicate": "Nusxalash",
+ "duplicate_dkim": "DKIM yozuvini nusxalash",
+ "edit": "Tahrirlash",
+ "empty": "Natijalar yoʻq",
+ "excludes": "Ushbu qabul qiluvchilarni istisno qiladi",
+ "f2b_ban_time": "Bloklash vaqti (s)",
+ "f2b_ban_time_increment": "Har bir bloklashda blok vaqti ortadi",
+ "f2b_blacklist": "Qora roʻyxatdagi tarmoqlar/xostlar",
+ "f2b_filter": "Regex filtrlari",
+ "f2b_list_info": "Qora roʻyxatdagi xost yoki tarmoq har doim oq roʻyxat elementidan ustun keladi. Roʻyxat yangilanishlarini qoʻllash uchun bir necha soniya kerak boʻladi.",
+ "f2b_manage_external": "Fail2ban ni tashqi boshqarish",
+ "f2b_manage_external_info": "Fail2ban hali ham banlist ni saqlaydi, ammo trafikni bloklash uchun faol qoidalarni oʻrnatmaydi. Trafikni tashqi tomondan bloklash uchun quyida yaratilgan banlist dan foydalaning.",
+ "f2b_max_attempts": "Maks. urinishlar",
+ "f2b_max_ban_time": "Maks. bloklash vaqti (s)",
+ "f2b_netban_ipv4": "Blokni qoʻllash uchun IPv4 subtarmoq oʻlchami (8-32)",
+ "f2b_netban_ipv6": "Blokni qoʻllash uchun IPv6 subtarmoq oʻlchami (8-128)",
+ "f2b_parameters": "Fail2ban parametrlari",
+ "f2b_regex_info": "Eʼtiborga olinadigan jurnallar: SOGo, Postfix, Dovecot, PHP-FPM.",
+ "f2b_retry_window": "Maks. urinishlar uchun qayta urinish oynasi (s)",
+ "f2b_whitelist": "Oq roʻyxatdagi tarmoqlar/xostlar",
+ "filter": "Filtr",
+ "filter_table": "Filtr jadvali",
+ "force_sso_text": "Tashqi OIDC provayder sozlangan boʻlsa, bu variant standart mailcow kirish formalarini yashiradi va faqat Yagona kirish tugmasini koʻrsatadi",
+ "force_sso": "mailcow kirishini oʻchirib, faqat Yagona kirishni koʻrsatish",
+ "forwarding_hosts": "Yoʻnaltirish xostlari",
+ "forwarding_hosts_add_hint": "Siz IPv4/IPv6 manzillarini, CIDR yozuvidagi tarmoqlarni, xost nomlarini (IP manzillariga aylantiriladi) yoki domen nomlarini (SPF TXT yoki yoʻq boʻlsa MX yozuvlarini soʻrash orqali IP manzillariga aylantiriladi) belgilashingiz mumkin.",
+ "forwarding_hosts_hint": "Kiruvchi xabarlar bu yerda keltirilgan istalgan xostlardan shartsiz qabul qilinadi. Bu xostlar keyin DNSBL ga qarshi tekshirilmaydi yoki greylisting ga olinmaydi. Ulardan kelgan spam hech qachon rad etilmaydi, ammo ixtiyoriy ravishda Junk papkasiga joylashtirilishi mumkin. Buning eng keng tarqalgan ishlatilishi — mailcow serveringizga kiruvchi xatlarni yoʻnaltirish qoidasi oʻrnatilgan pochta serverlarini koʻrsatish.",
+ "from": "Kimdan",
+ "generate": "yaratish",
+ "guid": "GUID - noyob nusxa ID si",
+ "guid_and_license": "GUID va litsenziya",
+ "hash_remove_info": "Ratelimit hashini oʻchirish (agar mavjud boʻlsa) uning hisoblagichini butunlay tiklaydi. \r\n Har bir hash alohida rang bilan koʻrsatiladi.",
+ "help_text": "Kirish maskasi ostidagi yordam matnini bekor qilish (HTML ruxsat etilgan)",
+ "host": "Xost",
+ "html": "HTML",
+ "iam": "Identifikatsiya provayderi",
+ "iam_attribute_field": "Atribut maydoni",
+ "iam_authorize_url": "Avtorizatsiya nuqtasi",
+ "iam_auth_flow": "Autentifikatsiya oqimi",
+ "iam_auth_flow_info": "Yagona kirish (SSO) uchun ishlatiladigan Authorization Code Flow (Keycloak da Standard Flow) qoʻshimcha ravishda, mailcow toʻgʻridan-toʻgʻri maʼlumotlar bilan Autentifikatsiya oqimini ham qoʻllab-quvvatlaydi. Mailpassword Flow Keycloak Admin REST API yordamida foydalanuvchi maʼlumotlarini tekshirishga harakat qiladi. mailcow Keycloakda xaritalangan mailcow_password atributidan xeshlangan parolni oladi.",
+ "iam_basedn": "Base DN",
+ "iam_client_id": "Mijoz ID",
+ "iam_client_secret": "Mijoz maxfiy soʻzi",
+ "iam_client_scopes": "Mijoz qamrovlari",
+ "iam_default_template": "Standart shablon",
+ "iam_default_template_description": "Agar foydalanuvchiga shablon tayinlanmagan boʻlsa, pochta qutisini yaratishda standart shablon ishlatiladi, lekin pochta qutisini yangilash uchun emas.",
+ "iam_description": "Autentifikatsiya uchun tashqi provayderni sozlash Foydalanuvchi pochta qutilari atribut xaritalashi oʻrnatilgan boʻlsa, ular birinchi marta kirgan zahoti avtomatik yaratiladi.",
+ "iam_extra_permission": "Quyidagi sozlamalarning ishlashi uchun Keycloak dagi mailcow mijoziga Service account va view-users ruxsati kerak.",
+ "iam_host": "Xost",
+ "iam_host_info": "Bir yoki bir nechta LDAP xostni vergul bilan ajratib kiriting.",
+ "iam_import_users": "Foydalanuvchilarni import qilish",
+ "iam_login_provisioning": "Kirishda foydalanuvchilarni avto-yaratish",
+ "iam_mapping": "Atribut xaritalashi",
+ "iam_bindpass": "Bind paroli",
+ "iam_periodic_full_sync": "Davriy toʻliq sinxronizatsiya",
+ "iam_port": "Port",
+ "iam_realm": "Realm",
+ "iam_redirect_url": "Yoʻnaltirish URL",
+ "iam_rest_flow": "Mailpassword Flow",
+ "iam_server_url": "Server URL",
+ "iam_sso": "Yagona kirish (SSO)",
+ "iam_sync_interval": "Sinxronizatsiya / import oraligʻi (daqiqa)",
+ "iam_test_connection": "Ulanishni tekshirish",
+ "iam_token_url": "Token nuqtasi",
+ "iam_userinfo_url": "Foydalanuvchi maʼlumotlari nuqtasi",
+ "iam_username_field": "Foydalanuvchi nomi maydoni",
+ "iam_binddn": "Bind DN",
+ "iam_use_ssl": "SSL dan foydalanish",
+ "iam_use_ssl_info": "SSL yoqilsa va port 389 ga oʻrnatilgan boʻlsa, u avtomatik ravishda 636 ga oʻzgartiriladi.",
+ "iam_use_tls": "StartTLS dan foydalanish",
+ "iam_use_tls_info": "TLS yoqilsa, LDAP serveringiz uchun standart portni (389) ishlatishingiz kerak. SSL portlari ishlatilmaydi.",
+ "iam_version": "Versiya",
+ "ignore_ssl_error": "SSL xatolarini eʼtiborsiz qoldirish",
+ "import": "Import",
+ "import_private_key": "Maxfiy kalitni import qilish",
+ "in_use_by": "Kim ishlatadi",
+ "inactive": "Nofaol",
+ "include_exclude": "Kiritish/Istisno qilish",
+ "include_exclude_info": "Standart holatda — tanlovsiz — barcha pochta qutilariga murojaat qilinadi",
+ "includes": "Ushbu qabul qiluvchilarni kiritish",
+ "ip_check": "IP tekshiruvi",
+ "ip_check_disabled": "IP tekshiruvi oʻchirilgan. Uni quyidagi joydan yoqishingiz mumkin: Tizim > Konfiguratsiya > Variantlar > Sozlash",
+ "ip_check_opt_in": "Tashqi IP manzillarni aniqlash uchun ipv4.mailcow.email va ipv6.mailcow.email uchinchi tomon xizmatidan foydalanishga rozilik.",
+ "is_mx_based": "MX asosida",
+ "last_applied": "Oxirgi qoʻllanilgan",
+ "license_info": "Litsenziya talab qilinmaydi, ammo bu loyihaning rivojlanishiga yordam beradi. GUID ni bu yerda roʻyxatdan oʻtkazing yoki mailcow oʻrnatmangiz uchun yordam sotib oling.",
+ "link": "Havola",
+ "loading": "Iltimos, kuting...",
+ "login_time": "Kirish vaqti",
+ "logo_info": "Tasviringiz yuqori navigatsiya paneli uchun 40px balandlikka, bosh sahifa uchun maks. 250px kenglikka oʻlchanadi. Masshtablanadigan grafika tavsiya etiladi.",
+ "lookup_mx": "Manzil — MX nomiga mos keladigan muntazam ifoda (.*\\.google\\.com — google.com bilan tugaydigan MX ga yoʻnaltirilgan barcha pochtani ushbu nuqta orqali yoʻnaltirish uchun)",
+ "main_name": "\"mailcow UI\" nomi",
+ "merged_vars_hint": "Kulrang satrlar vars.(local.)inc.php dan birlashtirilgan va oʻzgartirib boʻlmaydi.",
+ "message": "Xabar",
+ "message_size": "Xabar oʻlchami",
+ "nexthop": "Keyingi nuqta",
+ "needs_restart": "qayta ishga tushirish kerak",
+ "no": "✕",
+ "no_active_bans": "Faol bloklar yoʻq",
+ "no_new_rows": "Boshqa satrlar mavjud emas",
+ "no_record": "Yozuv yoʻq",
+ "oauth2_apps": "OAuth2 ilovalari",
+ "oauth2_add_client": "OAuth2 mijozini qoʻshish",
+ "oauth2_client_id": "Mijoz ID",
+ "oauth2_client_secret": "Mijoz maxfiy soʻzi",
+ "oauth2_info": "OAuth2 amalga oshirilishi \"Authorization Code\" grant turini qoʻllab-quvvatlaydi va refresh tokenlarini chiqaradi. \r\nServer shuningdek refresh token ishlatilgandan keyin avtomatik ravishda yangi refresh tokenlarini chiqaradi.
\r\n• Standart qamrov — profile. Faqat pochta qutisi foydalanuvchilari OAuth2 ga qarshi autentifikatsiya qilinishi mumkin. Agar scope parametri tashlab ketilgan boʻlsa, u profile ga qaytadi. \r\n• state parametri mijoz tomonidan avtorizatsiya soʻrovining bir qismi sifatida yuborilishi shart.
\r\nOAuth2 API ga soʻrovlar uchun yoʻllar: \r\n
\r\n
Avtorizatsiya nuqtasi: /oauth/authorize
\r\n
Token nuqtasi: /oauth/token
\r\n
Resurs sahifasi: /oauth/profile
\r\n
\r\nMijoz maxfiy soʻzini qayta yaratish mavjud avtorizatsiya kodlarini muddati tugashiga olib kelmaydi, lekin ular tokenni yangilashda muvaffaqiyatsiz boʻladi.
\r\nMijoz tokenlarini bekor qilish barcha faol sessiyalarning darhol tugashiga olib keladi. Barcha mijozlar qayta autentifikatsiya qilishlari kerak.",
+ "oauth2_redirect_uri": "Yoʻnaltirish URI",
+ "oauth2_renew_secret": "Yangi mijoz maxfiy soʻzini yaratish",
+ "oauth2_revoke_tokens": "Barcha mijoz tokenlarini bekor qilish",
+ "optional": "ixtiyoriy",
+ "options": "Variantlar",
+ "password": "Parol",
+ "password_length": "Parol uzunligi",
+ "password_policy": "Parol siyosati",
+ "password_policy_chars": "Kamida bitta alifbo belgisini oʻz ichiga olishi kerak",
+ "password_policy_length": "Minimal parol uzunligi %d",
+ "password_policy_lowerupper": "Kichik va katta harflarni oʻz ichiga olishi kerak",
+ "password_policy_numbers": "Kamida bitta raqamni oʻz ichiga olishi kerak",
+ "password_policy_special_chars": "Maxsus belgilarni oʻz ichiga olishi kerak",
+ "password_repeat": "Tasdiqlash paroli (takrorlang)",
+ "password_reset_info": "Agar tiklash uchun e-pochta kiritilmagan boʻlsa, bu funksiyadan foydalanib boʻlmaydi.",
+ "password_reset_settings": "Parolni tiklash sozlamalari",
+ "password_reset_tmpl_html": "HTML shablon",
+ "password_reset_tmpl_text": "Matnli shablon",
+ "password_settings": "Parol sozlamalari",
+ "priority": "Muhimlik darajasi",
+ "private_key": "Maxfiy kalit",
+ "quarantine": "Karantin",
+ "quarantine_bcc": "Barcha bildirishnomalarning nusxasini (BCC) ushbu qabul qiluvchiga yuborish: Oʻchirish uchun boʻsh qoldiring. Imzolanmagan, tekshirilmagan xat. Faqat ichki yetkazib berilishi kerak.",
+ "quarantine_exclude_domains": "Domenlar va taxallus domenlarini istisno qilish",
+ "quarantine_max_age": "Maksimal yosh (kunlarda) Qiymat 1 kun yoki undan koʻp boʻlishi kerak.",
+ "quarantine_max_score": "Agar xatning spam bahosi ushbu qiymatdan yuqori boʻlsa, bildirishnomani rad etish: Standart 9999.0",
+ "quarantine_max_size": "Maksimal oʻlcham (MiB) (kattaroq elementlar rad etiladi): 0 cheksizlikni bildirmaydi.",
+ "quarantine_notification_html": "Bildirishnoma e-pochta shabloni: Standart shablonni tiklash uchun boʻsh qoldiring.",
+ "quarantine_notification_sender": "Bildirishnoma e-pochta joʻnatuvchisi",
+ "quarantine_notification_subject": "Bildirishnoma e-pochta mavzusi",
+ "quarantine_redirect": "Barcha bildirishnomalarni ushbu qabul qiluvchiga yoʻnaltirish: Oʻchirish uchun boʻsh qoldiring. Imzolanmagan, tekshirilmagan xat. Faqat ichki yetkazib berilishi kerak.",
+ "quarantine_release_format": "Chiqarilgan elementlar formati",
+ "quarantine_release_format_att": "Ilova sifatida",
+ "quarantine_release_format_raw": "Oʻzgartirilmagan asl nusxa",
+ "quarantine_retention_size": "Pochta qutisi uchun saqlash: 0 — nofaolligini bildiradi.",
+ "quicklink_text": "Boshqa kirish sahifalariga tezkor havolalarni kirish formasi ostida koʻrsatish yoki yashirish",
+ "quota_notification_html": "Bildirishnoma e-pochta shabloni: Standart shablonni tiklash uchun boʻsh qoldiring.",
+ "quota_notification_sender": "Bildirishnoma e-pochta joʻnatuvchisi",
+ "quota_notification_subject": "Bildirishnoma e-pochta mavzusi",
+ "quota_notifications": "Kvota bildirishnomalari",
+ "quota_notifications_info": "Kvota bildirishnomalari foydalanuvchilarga foydalanish 80% va 95% ga yetganda bir martadan yuboriladi.",
+ "quota_notifications_vars": "{{percent}} — foydalanuvchining joriy kvotasi {{username}} — pochta qutisi nomi",
+ "queue_unban": "blokdan chiqarish",
+ "r_active": "Faol cheklovlar",
+ "r_inactive": "Nofaol cheklovlar",
+ "r_info": "Faol cheklovlar roʻyxatidagi kulrang/oʻchirilgan elementlar mailcow uchun haqiqiy cheklovlar sifatida tanilmaydi va koʻchirib boʻlmaydi. Nomaʼlum cheklovlar baribir koʻrinish tartibida oʻrnatiladi. inc/vars.local.inc.php da yangi elementlarni qoʻshib, ularni almashtirishingiz mumkin.",
+ "rate_name": "Tezlik nomi",
+ "recipients": "Qabul qiluvchilar",
+ "refresh": "Yangilash",
+ "regen_api_key": "API kalitini qayta yaratish",
+ "regex_maps": "Regex xaritalari",
+ "relay_from": "\"From:\" manzili",
+ "relay_rcpt": "\"To:\" manzili",
+ "relay_run": "Sinovni ishga tushirish",
+ "relayhosts": "Joʻnatuvchiga bogʻliq transportlar",
+ "relayhosts_hint": "Domen konfiguratsiya muloqotida tanlash mumkin boʻlgan joʻnatuvchiga bogʻliq transportlarni belgilang. \r\n Transport xizmati har doim \"smtp:\" va shuning uchun taklif qilinganda TLS ga harakat qiladi. Oʻralgan TLS (SMTPS) qoʻllab-quvvatlanmaydi. Foydalanuvchining individual chiquvchi TLS siyosati sozlamasi eʼtiborga olinadi. \r\n Taxallus domenlari bilan birga tanlangan domenlarga taʼsir qiladi.",
+ "remove": "Olib tashlash",
+ "remove_row": "Satrni olib tashlash",
+ "reset_default": "Standartga qaytarish",
+ "reset_limit": "Hash ni olib tashlash",
+ "reset_password_vars": "{{link}} Yaratilgan parolni tiklash havolasi {{username}} Parolni tiklashni soʻragan foydalanuvchining pochta qutisi nomi {{username2}} Tiklash uchun pochta qutisi nomi {{date}} Parolni tiklash soʻrovi qilingan sana {{token_lifetime}} Daqiqalardagi token muddati {{hostname}} mailcow xost nomi",
+ "restore_template": "Standart shablonni tiklash uchun boʻsh qoldiring.",
+ "routing": "Yoʻnaltirish",
+ "rsetting_add_rule": "Qoida qoʻshish",
+ "rsetting_content": "Qoida mazmuni",
+ "rsetting_desc": "Qisqa tavsif",
+ "rsetting_no_selection": "Iltimos, qoidani tanlang",
+ "rsetting_none": "Qoidalar mavjud emas",
+ "rsettings_insert_preset": "Misol presetini kiritish \"%s\"",
+ "rsettings_preset_1": "Autentifikatsiya qilingan foydalanuvchilar uchun DKIM va tezlik chegarasidan boshqa hamma narsani oʻchirib qoʻyish",
+ "rsettings_preset_2": "Postmasterlar spamni xohlaydi",
+ "rsettings_preset_3": "Pochta qutisi uchun faqat maxsus joʻnatuvchilarga ruxsat berish (yaʼni, faqat ichki pochta qutisi sifatida ishlatish)",
+ "rsettings_preset_4": "Domen uchun Rspamd ni oʻchirish",
+ "rspamd_com_settings": "Sozlama nomi avtomatik yaratiladi, quyidagi misol presetlariga qarang. Batafsil maʼlumot uchun Rspamd hujjatlariga qarang",
+ "rspamd_global_filters": "Global filtr xaritalari",
+ "rspamd_global_filters_agree": "Ehtiyot boʻlaman!",
+ "rspamd_global_filters_info": "Global filtr xaritalari turli xil global rad etish va ruxsat berish roʻyxatlarini oʻz ichiga oladi.",
+ "rspamd_global_filters_regex": "Ularning nomlari ularning maqsadini tushuntiradi. Barcha mazmun \"/pattern/options\" formatidagi haqiqiy muntazam ifodalarni oʻz ichiga olishi kerak (masalan, /.+@domain\\.tld/i). \r\n Har bir regex satriga oddiy tekshiruvlar bajariladi, ammo agar Rspamd sintaksisni toʻgʻri oʻqiy olmasa, uning funksionalligi buzilishi mumkin. \r\n Rspamd oʻzgarganda xarita mazmunini oʻqishga harakat qiladi. Agar muammolarga duch kelsangiz, xarita qayta yuklanishi uchun Rspamd ni qayta ishga tushiring. Qora roʻyxatdagi elementlar karantindan istisno qilinadi.",
+ "rspamd_settings_map": "Rspamd sozlamalar xaritasi",
+ "sal_level": "Moo darajasi",
+ "save": "Oʻzgarishlarni saqlash",
+ "search_domain_da": "Domenlarni qidirish",
+ "send": "Joʻnatish",
+ "sender": "Joʻnatuvchi",
+ "service": "Xizmat",
+ "service_id": "Xizmat ID",
+ "source": "Manba",
+ "spamfilter": "Spam filtri",
+ "subject": "Mavzu",
+ "success": "Muvaffaqiyatli",
+ "sys_mails": "Tizim xatlari",
+ "task": "Vazifa",
+ "text": "Matn",
+ "time": "Vaqt",
+ "title": "Sarlavha",
+ "title_name": "\"mailcow UI\" veb-sayt sarlavhasi",
+ "to_top": "Yuqoriga qaytish",
+ "transport_dest_format": "Regex yoki sintaksis: example.org, .example.org, *, box@example.org (bir nechta qiymatlarni vergul bilan ajratish mumkin)",
+ "transport_maps": "Transport xaritalari",
+ "transport_test_rcpt_info": "• Tashqi manzilga relay qilishni sinash uchun null@hosted.mailcow.de dan foydalaning.",
+ "transports_hint": "• Transport xaritasi yozuvi joʻnatuvchiga bogʻliq transport xaritasidan ustun. \r\n• MX asosidagi transportlar afzalroq ishlatiladi. \r\n• Foydalanuvchi boʻyicha chiquvchi TLS siyosati sozlamalari eʼtiborga olinmaydi va faqat TLS siyosati xaritasi yozuvlari orqali majburlanishi mumkin. \r\n• Belgilangan transportlar uchun transport xizmati har doim \"smtp:\" va shuning uchun taklif qilinganda TLS ga harakat qiladi. Oʻralgan TLS (SMTPS) qoʻllab-quvvatlanmaydi. \r\n• \"/localhost$/\" ga mos keladigan manzillar har doim \"local:\" orqali tashiladi, shuning uchun \"*\" manzili bu manzillarga qoʻllanmaydi. \r\n• Misol uchun keyingi nuqta \"[host]:25\" uchun maʼlumotlarni aniqlash uchun, Postfix har doim \"[host]:25\" ni qidirishdan oldin \"host\" ni soʻraydi. Bu xatti-harakat \"host\" va \"[host]:25\" ni bir vaqtning oʻzida ishlatishni imkonsiz qiladi.",
+ "ui_footer": "Pastki qism (HTML ruxsat etilgan)",
+ "ui_header_announcement": "Eʼlonlar",
+ "ui_header_announcement_active": "Eʼlonni faollashtirish",
+ "ui_header_announcement_content": "Matn (HTML ruxsat etilgan)",
+ "ui_header_announcement_help": "Eʼlon barcha tizimga kirgan foydalanuvchilarga va UI ning kirish ekranida koʻrinadi.",
+ "ui_header_announcement_select": "Eʼlon turini tanlang",
+ "ui_header_announcement_type": "Tur",
+ "ui_header_announcement_type_danger": "Juda muhim",
+ "ui_header_announcement_type_info": "Maʼlumot",
+ "ui_header_announcement_type_warning": "Muhim",
+ "ui_texts": "UI yorliqlari va matnlari",
+ "unban_pending": "blokdan chiqarish kutilmoqda",
+ "unchanged_if_empty": "Oʻzgartirilmagan boʻlsa, boʻsh qoldiring",
+ "upload": "Yuklash",
+ "username": "Foydalanuvchi nomi",
+ "user_link": "Foydalanuvchi havolasi",
+ "user_quicklink": "Foydalanuvchi kirish sahifasiga tezkor havolani yashirish",
+ "validate_license_now": "GUID ni litsenziya serveriga qarshi tekshirish",
+ "verify": "Tasdiqlash",
+ "yes": "✓"
+ },
+ "danger": {
+ "access_denied": "Kirish rad etildi yoki noma'lum forma ma'lumotlari",
+ "tfa_removal_blocked": "Ikki faktorli autentifikatsiyani olib tashlab boʻlmaydi, chunki u sizning hisobingiz uchun talab qilinadi.",
+ "alias_domain_invalid": "%s taxallus domeni noto'g'ri",
+ "alias_empty": "Taxallus manzili boʻsh boʻlmasligi kerak",
+ "alias_goto_identical": "Taxallus va yoʻnaltirish manzili bir xil boʻlmasligi kerak",
+ "alias_invalid": "%s taxallus manzili noto'g'ri",
+ "aliasd_targetd_identical": "Taxallus domeni maqsad domeniga teng boʻlmasligi kerak: %s",
+ "aliases_in_use": "Maks. taxalluslar %d dan katta yoki teng boʻlishi kerak",
+ "app_name_empty": "Ilova nomi boʻsh boʻlolmaydi",
+ "app_passwd_id_invalid": "Ilova paroli ID %s noto'g'ri",
+ "authsource_in_use": "Identifikatsiya provayderini oʻzgartirib yoki oʻchirib boʻlmaydi, chunki u hozirda bir yoki bir nechta foydalanuvchilar tomonidan ishlatilmoqda.",
+ "bcc_empty": "BCC manzili boʻsh boʻlolmaydi",
+ "bcc_exists": "%s turi uchun %s BCC xaritasi mavjud",
+ "bcc_must_be_email": "BCC manzili %s haqiqiy e-pochta manzili emas",
+ "comment_too_long": "Izoh juda uzun, maks. 160 ta belgiga ruxsat berilgan",
+ "cors_invalid_method": "Noto'g'ri Allow-Method belgilangan",
+ "cors_invalid_origin": "Noto'g'ri Allow-Origin belgilangan",
+ "defquota_empty": "Bitta pochta qutisi uchun standart kvota 0 boʻlmasligi kerak.",
+ "demo_mode_enabled": "Demo rejim yoqilgan",
+ "description_invalid": "%s uchun resurs tavsifi noto'g'ri",
+ "dkim_domain_or_sel_exists": "\"%s\" uchun DKIM kaliti mavjud va u ustidan yozilmaydi",
+ "dkim_domain_or_sel_invalid": "DKIM domeni yoki tanlovchi noto'g'ri: %s",
+ "domain_cannot_match_hostname": "Domen xost nomiga mos kelishi mumkin emas",
+ "domain_exists": "%s domeni allaqachon mavjud",
+ "domain_invalid": "Domen nomi boʻsh yoki noto'g'ri",
+ "domain_not_empty": "Boʻsh boʻlmagan %s domenini olib tashlab boʻlmaydi",
+ "domain_not_found": "%s domeni topilmadi",
+ "domain_quota_m_in_use": "Domen kvotasi %s MiB dan katta yoki teng boʻlishi kerak",
+ "extended_sender_acl_denied": "Tashqi joʻnatuvchi manzillarini oʻrnatish uchun ACL yetishmayapti",
+ "extra_acl_invalid": "Tashqi joʻnatuvchi manzili \"%s\" noto'g'ri",
+ "extra_acl_invalid_domain": "Tashqi joʻnatuvchi \"%s\" noto'g'ri domendan foydalanmoqda",
+ "fido2_verification_failed": "FIDO2 tekshiruvi muvaffaqiyatsiz: %s",
+ "file_open_error": "Faylni yozish uchun ochib boʻlmadi",
+ "filter_type": "Notoʻgʻri filtr turi",
+ "from_invalid": "Joʻnatuvchi boʻsh boʻlmasligi kerak",
+ "generic_server_error": "Kutilmagan server xatosi yuz berdi. Iltimos, administratoringiz bilan bogʻlaning.",
+ "global_filter_write_error": "Filtr faylini yozib boʻlmadi: %s",
+ "global_map_invalid": "Global xarita ID %s noto'g'ri",
+ "global_map_write_error": "Global xarita ID %s ni yozib boʻlmadi: %s",
+ "goto_empty": "Taxallus manzili kamida bitta haqiqiy yoʻnaltirish manzilini oʻz ichiga olishi kerak",
+ "goto_invalid": "Yoʻnaltirish manzili %s noto'g'ri",
+ "ham_learn_error": "Ham oʻrgatish xatosi: %s",
+ "iam_test_connection": "Ulanish muvaffaqiyatsiz",
+ "imagick_exception": "Xato: Tasvirni oʻqishda Imagick istisnosi",
+ "img_dimensions_exceeded": "Tasvir maksimal tasvir oʻlchamidan oshib ketdi",
+ "img_invalid": "Tasvir faylini tekshirib boʻlmadi",
+ "img_size_exceeded": "Tasvir maksimal fayl oʻlchamidan oshib ketdi",
+ "img_tmp_missing": "Tasvir faylini tekshirib boʻlmadi: Vaqtinchalik fayl topilmadi",
+ "invalid_bcc_map_type": "Noto'g'ri BCC xarita turi",
+ "invalid_destination": "Manzil formati \"%s\" noto'g'ri",
+ "invalid_filter_type": "Noto'g'ri filtr turi",
+ "invalid_host": "Noto'g'ri xost belgilangan: %s",
+ "invalid_mime_type": "Noto'g'ri MIME turi",
+ "invalid_nexthop": "Keyingi nuqta formati noto'g'ri",
+ "invalid_nexthop_authenticated": "Keyingi nuqta boshqa maʼlumotlar bilan mavjud, iltimos avval bu keyingi nuqta uchun mavjud maʼlumotlarni yangilang.",
+ "invalid_recipient_map_new": "Yangi qabul qiluvchi noto'g'ri belgilangan: %s",
+ "invalid_recipient_map_old": "Asl qabul qiluvchi noto'g'ri belgilangan: %s",
+ "invalid_reset_token": "Noto'g'ri tiklash tokeni",
+ "ip_list_empty": "Ruxsat etilgan IP roʻyxati boʻsh boʻlolmaydi",
+ "is_alias": "%s allaqachon taxallus manzili sifatida tanilgan",
+ "is_alias_or_mailbox": "%s allaqachon taxallus, pochta qutisi yoki taxallus domenidan kengaytirilgan taxallus manzili sifatida tanilgan.",
+ "is_spam_alias": "%s allaqachon vaqtinchalik taxallus manzili (spam taxallus manzili) sifatida tanilgan",
+ "last_key": "Oxirgi kalitni oʻchirib boʻlmaydi, iltimos uning oʻrniga TFA ni oʻchiring.",
+ "login_failed": "Kirish muvaffaqiyatsiz",
+ "mailbox_defquota_exceeds_mailbox_maxquota": "Standart kvota maksimal kvota chegarasidan oshib ketdi",
+ "mailbox_invalid": "Pochta qutisi nomi noto'g'ri",
+ "mailbox_quota_exceeded": "Kvota domen chegarasidan oshib ketdi (maks. %d MiB)",
+ "mailbox_quota_exceeds_domain_quota": "Maks. kvota domen kvota chegarasidan oshib ketdi",
+ "mailbox_quota_left_exceeded": "Yetarli joy qolmadi (qolgan joy: %d MiB)",
+ "mailboxes_in_use": "Maks. pochta qutilari %d dan katta yoki teng boʻlishi kerak",
+ "malformed_username": "Noto'g'ri shakldagi foydalanuvchi nomi",
+ "map_content_empty": "Xarita mazmuni boʻsh boʻlolmaydi",
+ "max_age_invalid": "Maks. yosh %s noto'g'ri",
+ "max_alias_exceeded": "Maks. taxalluslar oshib ketdi",
+ "max_mailbox_exceeded": "Maks. pochta qutilari oshib ketdi (%d / %d)",
+ "max_quota_in_use": "Pochta qutisi kvotasi %d MiB dan katta yoki teng boʻlishi kerak",
+ "maxquota_empty": "Bitta pochta qutisi uchun maks. kvota 0 boʻlmasligi kerak.",
+ "mode_invalid": "Rejim %s noto'g'ri",
+ "mx_invalid": "MX yozuvi %s noto'g'ri",
+ "mysql_error": "MySQL xatosi: %s",
+ "network_host_invalid": "Noto'g'ri tarmoq yoki xost: %s",
+ "next_hop_interferes": "%s keyingi nuqta %s bilan tortishuvga kirishadi",
+ "next_hop_interferes_any": "Mavjud keyingi nuqta %s bilan tortishuvga kirishadi",
+ "nginx_reload_failed": "Nginx qayta yuklash muvaffaqiyatsiz: %s",
+ "no_user_defined": "Foydalanuvchi belgilanmagan",
+ "object_exists": "%s obyekti allaqachon mavjud",
+ "object_is_not_numeric": "%s qiymati raqamli emas",
+ "password_complexity": "Parol siyosatga mos kelmaydi",
+ "password_empty": "Parol boʻsh boʻlmasligi kerak",
+ "password_mismatch": "Tasdiqlash paroli mos kelmadi",
+ "password_reset_invalid_user": "Pochta qutisi topilmadi yoki tiklash uchun e-pochta oʻrnatilmagan",
+ "password_reset_na": "Parolni tiklash hozirda mavjud emas. Iltimos, administratoringiz bilan bogʻlaning.",
+ "policy_list_from_exists": "Berilgan nomli yozuv mavjud",
+ "policy_list_from_invalid": "Yozuv noto'g'ri formatga ega",
+ "private_key_error": "Maxfiy kalit xatosi: %s",
+ "pushover_credentials_missing": "Pushover tokeni va/yoki kaliti yetishmayapti",
+ "pushover_key": "Pushover kaliti notoʻgʻri formatga ega",
+ "pushover_token": "Pushover tokeni notoʻgʻri formatga ega",
+ "quarantine_category_invalid": "Karantin turkumi quyidagilardan biri boʻlishi kerak: add_header, reject, all",
+ "quota_not_0_not_numeric": "Kvota raqamli va >= 0 boʻlishi kerak",
+ "recipient_map_entry_exists": "Qabul qiluvchi xaritasi yozuvi \"%s\" mavjud",
+ "recovery_email_failed": "Tiklash e-pochtasini yuborib boʻlmadi. Iltimos, administratoringiz bilan bogʻlaning.",
+ "redis_error": "Redis xatosi: %s",
+ "relayhost_invalid": "Xarita yozuvi %s noto'g'ri",
+ "release_send_failed": "Xabarni chiqarib boʻlmadi: %s",
+ "required_data_missing": "Talab qilinadigan ma'lumotlar %s yetishmayapti",
+ "reset_f2b_regex": "Regex filtrini oʻz vaqtida tiklab boʻlmadi, iltimos qaytadan urinib koʻring yoki bir necha soniya kuting va sahifani qayta yuklang.",
+ "reset_token_limit_exceeded": "Tiklash tokeni chegarasi oshib ketdi. Iltimos, keyinroq urinib koʻring.",
+ "resource_invalid": "Resurs nomi %s noto'g'ri",
+ "rl_timeframe": "Tezlik chegarasi vaqt oraligʻi noto'g'ri",
+ "rspamd_ui_pw_length": "Rspamd UI paroli kamida 6 ta belgi uzunlikda boʻlishi kerak",
+ "script_empty": "Skript boʻsh boʻlolmaydi",
+ "sender_acl_invalid": "Joʻnatuvchi ACL qiymati %s noto'g'ri",
+ "set_acl_failed": "ACL ni oʻrnatib boʻlmadi",
+ "settings_map_invalid": "Sozlamalar xaritasi ID %s noto'g'ri",
+ "sieve_error": "Sieve tahlilchisi xatosi: %s",
+ "spam_learn_error": "Spam oʻrgatish xatosi: %s",
+ "subject_empty": "Mavzu boʻsh boʻlmasligi kerak",
+ "target_domain_invalid": "Maqsad domen %s noto'g'ri",
+ "targetd_not_found": "Maqsad domen %s topilmadi",
+ "targetd_relay_domain": "Maqsad domen %s relay domen",
+ "template_exists": "%s shabloni allaqachon mavjud",
+ "template_id_invalid": "Shablon ID %s noto'g'ri",
+ "template_name_invalid": "Shablon nomi noto'g'ri",
+ "temp_error": "Vaqtinchalik xato",
+ "text_empty": "Matn boʻsh boʻlmasligi kerak",
+ "tfa_token_invalid": "TFA tokeni noto'g'ri",
+ "tls_policy_map_dest_invalid": "Siyosat manzili noto'g'ri",
+ "tls_policy_map_entry_exists": "TLS siyosati xaritasi yozuvi \"%s\" mavjud",
+ "tls_policy_map_parameter_invalid": "Siyosat parametri noto'g'ri",
+ "to_invalid": "Qabul qiluvchi boʻsh boʻlmasligi kerak",
+ "totp_verification_failed": "TOTP tekshiruvi muvaffaqiyatsiz",
+ "transport_dest_exists": "Transport manzili \"%s\" mavjud",
+ "webauthn_verification_failed": "WebAuthn tekshiruvi muvaffaqiyatsiz: %s",
+ "webauthn_authenticator_failed": "Tanlangan autentifikator topilmadi",
+ "webauthn_publickey_failed": "Tanlangan autentifikator uchun ochiq kalit saqlanmagan",
+ "webauthn_username_failed": "Tanlangan autentifikator boshqa hisobga tegishli",
+ "unknown": "Noma'lum xato yuz berdi",
+ "unknown_tfa_method": "Noma'lum TFA usuli",
+ "unlimited_quota_acl": "Cheksiz kvota ACL tomonidan taqiqlangan",
+ "username_invalid": "Foydalanuvchi nomi %s ishlatib boʻlmaydi",
+ "validity_missing": "Iltimos, amal qilish muddatini tayinlang",
+ "value_missing": "Iltimos, barcha qiymatlarni kiriting",
+ "version_invalid": "Versiya %s noto'g'ri",
+ "yotp_verification_failed": "Yubico OTP tekshiruvi muvaffaqiyatsiz: %s"
+ },
+ "datatables": {
+ "collapse_all": "Hammasini yigʻish",
+ "decimal": ".",
+ "emptyTable": "Jadvalda ma'lumot mavjud emas",
+ "expand_all": "Hammasini kengaytirish",
+ "info": "_TOTAL_ tadan _START_ dan _END_ gacha koʻrsatilmoqda",
+ "infoEmpty": "0 tadan 0 dan 0 gacha koʻrsatilmoqda",
+ "infoFiltered": "(jami _MAX_ tadan filtrlangan)",
+ "infoPostFix": "",
+ "thousands": ",",
+ "lengthMenu": "_MENU_ ta yozuvni koʻrsatish",
+ "loadingRecords": "Yuklanmoqda...",
+ "processing": "Iltimos, kuting...",
+ "search": "Qidirish:",
+ "zeroRecords": "Mos keladigan yozuvlar topilmadi",
+ "paginate": {
+ "first": "Birinchi",
+ "last": "Oxirgi",
+ "next": "Keyingi",
+ "previous": "Oldingi"
+ },
+ "aria": {
+ "sortAscending": ": ustunni oʻsish boʻyicha saralash uchun faollashtiring",
+ "sortDescending": ": ustunni kamayish boʻyicha saralash uchun faollashtiring"
+ }
+ },
+ "debug": {
+ "architecture": "Arxitektura",
+ "chart_this_server": "Diagramma (bu server)",
+ "containers_info": "Konteyner ma'lumotlari",
+ "container_running": "Ishlamoqda",
+ "container_disabled": "Konteyner toʻxtatilgan yoki oʻchirilgan",
+ "container_stopped": "Toʻxtatilgan",
+ "cores": "Yadrolar",
+ "current_time": "Tizim vaqti",
+ "disk_usage": "Disk foydalanish",
+ "docs": "Hujjatlar",
+ "error_show_ip": "Ommaviy IP manzillarini aniqlab boʻlmadi",
+ "external_logs": "Tashqi jurnallar",
+ "history_all_servers": "Tarix (barcha serverlar)",
+ "in_memory_logs": "Xotiradagi jurnallar",
+ "last_modified": "Oxirgi oʻzgartirilgan",
+ "log_info": "
mailcow xotiradagi jurnallar Redis roʻyxatlarida toʻplanadi va har daqiqada hammomilik kamaytirish uchun LOG_LINES (%d) ga qisqartiriladi.\r\n Xotiradagi jurnallar doimiy boʻlishi mumkin emas. Xotirada jurnal yurituvchi barcha ilovalar ham Docker daemoniga, demak standart jurnal yuritish drayveriga ham yozadi.\r\n Xotiradagi jurnal turi konteynerlar bilan kichik muammolarni nosozliklarni bartaraf etish uchun ishlatilishi kerak.
\r\n
Tashqi jurnallar berilgan ilovaning API si orqali toʻplanadi.
\r\n
Statik jurnallar asosan faollik jurnallaridir, ular Dockerd ga yozilmaydi, lekin baribir doimiy boʻlishi kerak (API jurnallaridan tashqari).
",
+ "login_time": "Vaqt",
+ "logs": "Jurnallar",
+ "memory": "Xotira",
+ "online_users": "Onlayn foydalanuvchilar",
+ "restart_container": "Qayta ishga tushirish",
+ "service": "Xizmat",
+ "show_ip": "Ommaviy IP ni koʻrsatish",
+ "size": "Oʻlcham",
+ "started_at": "Boshlangan vaqt",
+ "started_on": "Boshlangan sana",
+ "static_logs": "Statik jurnallar",
+ "success": "Muvaffaqiyatli",
+ "system_containers": "Tizim va konteynerlar",
+ "timezone": "Vaqt mintaqasi",
+ "uptime": "Ishlash vaqti",
+ "update_available": "Yangilanish mavjud",
+ "no_update_available": "Tizim oxirgi versiyada",
+ "update_failed": "Yangilanishni tekshirib boʻlmadi",
+ "username": "Foydalanuvchi nomi",
+ "wip": "Hozir ishlab chiqilmoqda"
+ },
+ "diagnostics": {
+ "cname_from_a": "Qiymat A/AAAA yozuvidan olingan. Yozuv toʻgʻri resursga ishora qilsa, bu qoʻllab-quvvatlanadi.",
+ "dns_records": "DNS yozuvlari",
+ "dns_records_24hours": "DNS ga kiritilgan oʻzgarishlar ushbu sahifada toʻgʻri aks ettirilishi uchun 24 soatgacha vaqt ketishi mumkinligini hisobga oling. Bu DNS yozuvlaringizni qanday sozlash kerakligini osongina koʻrish va barcha yozuvlaringiz DNS da toʻgʻri saqlanganligini tekshirish uchun moʻljallangan.",
+ "dns_records_data": "Toʻgʻri ma'lumot",
+ "dns_records_docs": "Iltimos, hujjatlarga ham murojaat qiling.",
+ "dns_records_name": "Nomi",
+ "dns_records_status": "Joriy holat",
+ "dns_records_type": "Tur",
+ "optional": "Bu yozuv ixtiyoriy."
+ },
+ "edit": {
+ "acl": "ACL (Ruxsat)",
+ "active": "Faol",
+ "admin": "Administratorni tahrirlash",
+ "advanced_settings": "Kengaytirilgan sozlamalar",
+ "alias": "Taxallusni tahrirlash",
+ "allow_from_smtp": "Faqat ushbu IP larga SMTP dan foydalanishga ruxsat berish",
+ "allow_from_smtp_info": "Barcha joʻnatuvchilarga ruxsat berish uchun boʻsh qoldiring. IPv4/IPv6 manzillari va tarmoqlari.",
+ "allowed_protocols": "Toʻgʻridan-toʻgʻri foydalanuvchi kirishi uchun ruxsat etilgan protokollar (ilova paroli protokollariga taʼsir qilmaydi)",
+ "app_name": "Ilova nomi",
+ "app_passwd": "Ilova paroli",
+ "app_passwd_protocols": "Ilova paroli uchun ruxsat etilgan protokollar",
+ "automap": "Papkalarni avtomatik xaritalashga harakat qilish (\"Sent items\", \"Sent\" => \"Sent\" va h.k.)",
+ "backup_mx_options": "Relay sozlamalari",
+ "bcc_dest_format": "BCC manzili bitta haqiqiy e-pochta manzili boʻlishi kerak. Agar bir nechta manzilga nusxa joʻnatish kerak boʻlsa, taxallus yarating va shu yerda ishlating.",
+ "client_id": "Mijoz ID",
+ "client_secret": "Mijoz maxfiy soʻzi",
+ "comment_info": "Maxfiy izoh foydalanuvchiga koʻrinmaydi, ommaviy izoh esa foydalanuvchi koʻrinishida ustiga sichqoncha kelganda maslahat sifatida koʻrsatiladi",
+ "created_on": "Yaratilgan sana",
+ "custom_attributes": "Maxsus atributlar",
+ "delete1": "Tugatilgach manbadan oʻchirish",
+ "delete2": "Manbada boʻlmagan xabarlarni manzildan oʻchirish",
+ "delete2duplicates": "Manzildagi dublikatlarni oʻchirish",
+ "delete_ays": "Iltimos, oʻchirish jarayonini tasdiqlang.",
+ "description": "Tavsif",
+ "disable_login": "Kirishni taqiqlash (kiruvchi pochta hali ham qabul qilinadi)",
+ "domain": "Domenni tahrirlash",
+ "domain_admin": "Domen administratorini tahrirlash",
+ "domain_footer": "Domen boʻyicha pastki qism",
+ "domain_footer_html": "HTML pastki qism",
+ "domain_footer_info": "Domen boʻyicha pastki qismlar ushbu domendagi manzilga bog'liq barcha chiquvchi xatlarga qoʻshiladi. Pastki qism uchun quyidagi oʻzgaruvchilarni ishlatish mumkin:",
+ "domain_footer_info_vars": {
+ "auth_user": "{= auth_user =} - MTA tomonidan belgilangan autentifikatsiya qilingan foydalanuvchi nomi",
+ "from_user": "{= from_user =} - Konvertning Kimdan qismi, masalan \"moo@mailcow.tld\" uchun \"moo\" qaytaradi",
+ "from_name": "{= from_name =} - Konvertning Kimdan ismi, masalan \"Mailcow <moo@mailcow.tld>\" uchun \"Mailcow\" qaytaradi",
+ "from_addr": "{= from_addr =} - Konvertning Kimdan manzili qismi",
+ "from_domain": "{= from_domain =} - Konvertning Kimdan domeni qismi",
+ "custom": "{= foo =} - Agar pochta qutisida \"bar\" qiymatli \"foo\" maxsus atributi boʻlsa \"bar\" qaytaradi"
+ },
+ "domain_footer_plain": "PLAIN pastki qism",
+ "domain_footer_skip_replies": "Javob xatlarida pastki qismni e'tiborsiz qoldirish",
+ "domain_quota": "Domen kvotasi",
+ "domains": "Domenlar",
+ "dont_check_sender_acl": "%s domeni uchun joʻnatuvchi tekshiruvini oʻchirish (+ taxallus domenlari)",
+ "edit_alias_domain": "Taxallus domenini tahrirlash",
+ "encryption": "Shifrlash",
+ "exclude": "Obyektlarni istisno qilish (regex)",
+ "extended_sender_acl": "Tashqi joʻnatuvchi manzillari",
+ "extended_sender_acl_info": "DKIM domen kaliti mavjud boʻlsa, import qilinishi kerak. \r\n Ushbu serverni mos SPF TXT yozuviga qoʻshishni unutmang. \r\n Ushbu serverga tashqi manzil bilan ust-ust tushadigan domen yoki taxallus domeni qoʻshilganda, tashqi manzil olib tashlanadi. \r\n *@domain.tld sifatida joʻnatishga ruxsat berish uchun @domain.tld dan foydalaning.",
+ "force_pw_update": "Keyingi kirishda parolni majburiy yangilash",
+ "force_pw_update_info": "Bu foydalanuvchi faqat %s ga kira oladi. Ilova parollari ishlash holatida qoladi.",
+ "footer_exclude": "Pastki qismdan istisno qilish",
+ "full_name": "Toʻliq ism",
+ "gal": "Global manzillar roʻyxati",
+ "gal_info": "GAL domenning barcha obyektlarini oʻz ichiga oladi va hech bir foydalanuvchi tomonidan tahrirlanmaydi. Oʻchirilsa, SOGodagi bandlik maʼlumotlari yoʻqoladi! Oʻzgarishlarni qoʻllash uchun SOGoni qayta ishga tushiring.",
+ "generate": "yaratish",
+ "grant_types": "Grant turlari",
+ "hostname": "Xost nomi",
+ "inactive": "Nofaol",
+ "internal": "Ichki",
+ "internal_info": "Ichki taxalluslarga faqat oʻz domeni yoki taxallus domenlaridan kirish mumkin.",
+ "sender_allowed": "Ushbu taxallus orqali joʻnatishga ruxsat berish",
+ "sender_allowed_info": "Oʻchirilgan boʻlsa, bu taxallus faqat xat qabul qilishi mumkin. Maxsus pochta qutilariga joʻnatishga ruxsat berish uchun joʻnatuvchi ACL dan foydalaning.",
+ "kind": "Turi",
+ "last_modified": "Oxirgi oʻzgartirilgan",
+ "lookup_mx": "Manzil — MX nomiga mos keladigan muntazam ifoda (.*\\.google\\.com — google.com bilan tugaydigan MX ga yoʻnaltirilgan barcha pochtani ushbu nuqta orqali yoʻnaltirish uchun)",
+ "mailbox": "Pochta qutisini tahrirlash",
+ "mailbox_quota_def": "Standart pochta qutisi kvotasi",
+ "mailbox_relayhost_info": "Faqat pochta qutisi va to'g'ridan-to'g'ri taxalluslarga qoʻllaniladi, domen relay xostini bekor qiladi.",
+ "mailbox_rename": "Pochta qutisini qayta nomlash",
+ "mailbox_rename_agree": "Men zaxira nusxasini yaratdim.",
+ "mailbox_rename_warning": "MUHIM! Pochta qutisini qayta nomlashdan oldin zaxira nusxasi yarating.",
+ "mailbox_rename_alias": "Taxallusni avtomatik yaratish",
+ "mailbox_rename_title": "Yangi mahalliy pochta qutisi nomi",
+ "max_aliases": "Maks. taxalluslar",
+ "max_mailboxes": "Mumkin boʻlgan maks. pochta qutilari",
+ "max_quota": "Bitta pochta qutisining maks. kvotasi (MiB)",
+ "maxage": "Masofadan soʻraladigan xabarlarning maksimal yoshi (kunlarda) (0 = yoshni e'tiborsiz qoldirish)",
+ "maxbytespersecond": "Maks. soniyaga bayt (0 = cheksiz)",
+ "mbox_rl_info": "Bu tezlik chegarasi SASL kirish nomiga qoʻllaniladi, u kirgan foydalanuvchi tomonidan ishlatiladigan har qanday \"from\" manziliga mos keladi. Pochta qutisi tezlik chegarasi domen boʻyicha tezlik chegarasini bekor qiladi.",
+ "mins_interval": "Oraliq (daqiqa)",
+ "mta_sts": "MTA-STS",
+ "mta_sts_info": "MTA-STS — pochta serverlari oʻrtasida xat yetkazib berishni haqiqiy sertifikatli TLS dan foydalanishga majburlovchi standart. U DNSSEC mavjud emasligi yoki qoʻllab-quvvatlanmasligi sababli DANE imkoni boʻlmaganda ishlatiladi. Eslatma: Agar qabul qiluvchi domen DNSSEC bilan DANE ni qoʻllab-quvvatlasa, DANE har doim afzal koʻriladi — MTA-STS faqat zaxira sifatida ishlaydi.",
+ "mta_sts_version": "Versiya",
+ "mta_sts_version_info": "MTA-STS standartining versiyasini belgilaydi — hozirda faqat STSv1 haqiqiy.",
+ "mta_sts_mode": "Rejim",
+ "mta_sts_mode_info": "Tanlash uchun uchta rejim mavjud:
testing — siyosat faqat kuzatiladi, buzilishlar taʼsir koʻrsatmaydi.
enforce — siyosat qatʼiy qoʻllaniladi, haqiqiy TLS siz ulanishlar rad etiladi.
none — siyosat eʼlon qilinadi, ammo qoʻllanilmaydi.
",
+ "mta_sts_max_age": "Maks. yosh",
+ "mta_sts_max_age_info": "Qabul qiluvchi pochta serverlari ushbu siyosatni qayta olishdan oldin keshlashi mumkin boʻlgan vaqt (soniyalarda).",
+ "mta_sts_mx": "MX server",
+ "mta_sts_mx_info": "Faqat aniq sanab oʻtilgan pochta server xost nomlariga joʻnatishga ruxsat beradi; joʻnatuvchi MTA DNS MX xost nomi siyosat roʻyxatiga mos kelishini tekshiradi va faqat haqiqiy TLS sertifikati bilan yetkazib berishga ruxsat beradi (MITM ga qarshi himoya qiladi).",
+ "mta_sts_mx_notice": "Bir nechta MX serverlar belgilanishi mumkin (vergul bilan ajratilgan).",
+ "multiple_bookings": "Bir nechta bandlovlar",
+ "none_inherit": "Hech biri / Meros qilib olish",
+ "nexthop": "Keyingi nuqta",
+ "password": "Parol",
+ "password_recovery_email": "Parolni tiklash e-pochtasi",
+ "password_repeat": "Tasdiqlash paroli (takrorlang)",
+ "previous": "Oldingi sahifa",
+ "private_comment": "Maxfiy izoh",
+ "public_comment": "Ommaviy izoh",
+ "pushover": "Pushover",
+ "pushover_evaluate_x_prio": "Yuqori muhimlikdagi xatni eskalatsiya qilish [X-Priority: 1]",
+ "pushover_info": "Push bildirishnoma sozlamalari %s ga taxalluslar bilan birga (umumiy, umumiy boʻlmagan, teglangan) yetkazib beriladigan barcha toza (spam boʻlmagan) xatlarga qoʻllaniladi.",
+ "pushover_only_x_prio": "Faqat yuqori muhimlikdagi xatlarni koʻrib chiqish [X-Priority: 1]",
+ "pushover_sender_array": "Faqat quyidagi joʻnatuvchi e-pochta manzillarini koʻrib chiqish (vergul bilan ajratilgan)",
+ "pushover_sender_regex": "Quyidagi joʻnatuvchi regexini koʻrib chiqish",
+ "pushover_text": "Bildirishnoma matni",
+ "pushover_title": "Bildirishnoma sarlavhasi",
+ "pushover_sound": "Tovush",
+ "pushover_vars": "Joʻnatuvchi filtri belgilanmagan boʻlsa, barcha xatlar koʻrib chiqiladi. Regex filtrlari va aniq joʻnatuvchi tekshiruvlari alohida belgilanishi mumkin va ketma-ket koʻrib chiqiladi. Ular bir-biriga bogʻliq emas. Matn va sarlavha uchun ishlatiladigan oʻzgaruvchilar (ma'lumotlarni himoya qilish siyosatiga e'tibor bering)",
+ "pushover_verify": "Maʼlumotlarni tekshirish",
+ "quota_mb": "Kvota (MiB)",
+ "quota_warning_bcc": "Kvota ogohlantirishi BCC",
+ "quota_warning_bcc_info": "Ogohlantirishlar alohida nusxa sifatida quyidagi qabul qiluvchilarga yuboriladi. Mavzu mos foydalanuvchi nomi bilan qavs ichida qoʻshib qoʻyiladi, masalan: Kvota ogohlantirishi (user@example.com).",
+ "ratelimit": "Tezlik chegarasi",
+ "redirect_uri": "Yoʻnaltirish/Qaytarish URL",
+ "relay_all": "Barcha qabul qiluvchilarni relay qilish",
+ "relay_all_info": "↪ Agar barcha qabul qiluvchilarni relay qilmaslikni tanlasangiz, relay qilinishi kerak boʻlgan har bir qabul qiluvchi uchun (\"koʻr\") pochta qutisi qoʻshishingiz kerak boʻladi.",
+ "relay_domain": "Ushbu domenni relay qilish",
+ "relay_transport_info": "
Maʼlumot
Bu domen uchun maxsus manzilga transport xaritalarini belgilashingiz mumkin. Agar oʻrnatilmagan boʻlsa, MX qidiruvi amalga oshiriladi.",
+ "relay_unknown_only": "Faqat mavjud boʻlmagan pochta qutilarini relay qilish. Mavjud pochta qutilari mahalliy yetkazib beriladi.",
+ "relayhost": "Joʻnatuvchiga bogʻliq transportlar",
+ "remove": "Olib tashlash",
+ "resource": "Resurs",
+ "save": "Oʻzgarishlarni saqlash",
+ "scope": "Qamrov",
+ "sender_acl": "Quyidagi sifatida joʻnatishga ruxsat berish",
+ "sender_acl_disabled": "Joʻnatuvchi tekshiruvi oʻchirilgan",
+ "sender_acl_info": "Agar A pochta qutisi foydalanuvchisi B pochta qutisi foydalanuvchisi sifatida joʻnatishga ruxsat etilgan boʻlsa, joʻnatuvchi manzili SOGo da tanlanadigan \"from\" maydoni sifatida avtomatik koʻrsatilmaydi. \r\n B pochta qutisi foydalanuvchisi A pochta qutisi foydalanuvchisi oʻz manzilini joʻnatuvchi sifatida tanlay olishi uchun SOGo da delegatsiya yaratishi kerak. SOGo da pochta qutisini delegatsiya qilish uchun pochta koʻrinishida yuqori chap qismdagi pochta qutisi nomingiz oʻng tomonidagi menyudan (uch nuqta) foydalaning. Bu xatti-harakat taxallus manzillariga qoʻllanmaydi.",
+ "sieve_desc": "Qisqa tavsif",
+ "sieve_type": "Filtr turi",
+ "skipcrossduplicates": "Papkalararo dublikat xabarlarni oʻtkazib yuborish (birinchi kelgan, birinchi xizmatlanadi)",
+ "sogo_access": "SOGo ga toʻgʻridan-toʻgʻri yoʻnaltirish",
+ "sogo_access_info": "Tizimga kirgandan keyin foydalanuvchi avtomatik ravishda SOGo ga yoʻnaltiriladi.",
+ "sogo_visible": "Taxallus SOGo da koʻrinadi",
+ "sogo_visible_info": "Bu variant faqat SOGo da koʻrsatilishi mumkin boʻlgan obyektlarga taʼsir qiladi (kamida bitta mahalliy pochta qutisiga ishora qiluvchi umumiy yoki umumiy boʻlmagan taxallus manzillari). Yashirilgan boʻlsa, taxallus SOGo da tanlanadigan joʻnatuvchi sifatida koʻrinmaydi.",
+ "spam_alias": "Vaqt cheklangan taxallus manzillarini yaratish yoki oʻzgartirish",
+ "spam_filter": "Spam filtri",
+ "spam_policy": "Elementlarni ruxsat etilgan/qora roʻyxatga qoʻshish yoki olib tashlash",
+ "spam_score": "Maxsus spam bahosini oʻrnatish",
+ "subfolder2": "Manzilning subpapkasiga sinxronizatsiya qilish (boʻsh = subpapkadan foydalanmang)",
+ "syncjob": "Sinxronizatsiya vazifasini tahrirlash",
+ "target_address": "Yoʻnaltirish manzil(lar)i (vergul bilan ajratilgan)",
+ "target_domain": "Maqsad domen",
+ "timeout1": "Masofaviy xostga ulanish vaqtining tugashi",
+ "timeout2": "Mahalliy xostga ulanish vaqtining tugashi",
+ "title": "Obyektni tahrirlash",
+ "unchanged_if_empty": "Oʻzgartirilmagan boʻlsa, boʻsh qoldiring",
+ "username": "Foydalanuvchi nomi",
+ "validate_save": "Tekshirish va saqlash"
+ },
+ "fido2": {
+ "confirm": "Tasdiqlash",
+ "fido2_auth": "FIDO2 bilan kirish",
+ "fido2_success": "Qurilma muvaffaqiyatli roʻyxatdan oʻtkazildi",
+ "fido2_validation_failed": "Tekshirish muvaffaqiyatsiz",
+ "fn": "Doʻstona nom",
+ "known_ids": "Maʼlum ID lar",
+ "none": "Oʻchirilgan",
+ "register_status": "Roʻyxatga olish holati",
+ "rename": "Qayta nomlash",
+ "set_fido2": "FIDO2 qurilmasini roʻyxatdan oʻtkazish",
+ "set_fido2_touchid": "Apple M1 da Touch ID ni roʻyxatdan oʻtkazish",
+ "set_fn": "Doʻstona nomni oʻrnatish",
+ "start_fido2_validation": "FIDO2 tekshiruvini boshlash"
+ },
+ "footer": {
+ "cancel": "Bekor qilish",
+ "confirm_delete": "Oʻchirishni tasdiqlash",
+ "delete_now": "Hozir oʻchirish",
+ "delete_these_items": "Iltimos, quyidagi obyekt ID siga oʻzgarishlaringizni tasdiqlang",
+ "hibp_check": "haveibeenpwned.com ga qarshi tekshirish",
+ "hibp_nok": "Mos keldi! Bu xavfli parol boʻlishi mumkin!",
+ "hibp_ok": "Mos kelmadi.",
+ "loading": "Iltimos, kuting...",
+ "nothing_selected": "Hech narsa tanlanmadi",
+ "restart_container": "Konteynerni qayta ishga tushirish",
+ "restart_container_info": "Muhim: Yumshoq qayta ishga tushirish biroz vaqt olishi mumkin, iltimos uning tugashini kuting.",
+ "restart_now": "Hozir qayta ishga tushirish",
+ "restarting_container": "Konteyner qayta ishga tushirilmoqda, bu biroz vaqt olishi mumkin"
+ },
+ "header": {
+ "administration": "Konfiguratsiya va tafsilotlar",
+ "apps": "Ilovalar",
+ "debug": "Maʼlumot",
+ "email": "E-pochta",
+ "mailcow_system": "Tizim",
+ "mailcow_config": "Konfiguratsiya",
+ "quarantine": "Karantin",
+ "restart_netfilter": "Netfilterni qayta ishga tushirish",
+ "restart_sogo": "SOGoni qayta ishga tushirish",
+ "user_settings": "Foydalanuvchi sozlamalari"
+ },
+ "info": {
+ "awaiting_tfa_confirmation": "TFA tasdiqlanishi kutilmoqda",
+ "no_action": "Amal qoʻllanib boʻlmaydi",
+ "session_expires": "Sessiyangiz taxminan 15 soniyadan keyin tugaydi"
+ },
+ "login": {
+ "back_to_mailcow": "mailcow ga qaytish",
+ "delayed": "Kirish %s soniyaga kechiktirildi.",
+ "fido2_webauthn": "FIDO2/WebAuthn kirish",
+ "forgot_password": "> Parolni unutdingizmi?",
+ "invalid_pass_reset_token": "Parolni tiklash tokeni noto'g'ri yoki muddati tugagan. Iltimos, yangi parolni tiklash havolasini soʻrang.",
+ "login": "Kirish",
+ "login_linkstext": "Toʻgʻri kirish emasmi?",
+ "login_usertext": "Foydalanuvchi sifatida kirish",
+ "login_domainadmintext": "Domen administratori sifatida kirish",
+ "login_admintext": "Administrator sifatida kirish",
+ "login_user": "Foydalanuvchi kirishi",
+ "login_dadmin": "Domen-administratori kirishi",
+ "login_admin": "Administrator kirishi",
+ "mobileconfig_info": "Soʻralgan Apple ulanish profilini yuklab olish uchun pochta qutisi foydalanuvchisi sifatida kiring.",
+ "new_password": "Yangi parol",
+ "new_password_confirm": "Yangi parolni tasdiqlang",
+ "other_logins": "yoki quyidagi orqali kiring",
+ "password": "Parol",
+ "reset_password": "Parolni tiklash",
+ "request_reset_password": "Parol oʻzgartirishni soʻrash",
+ "username": "Foydalanuvchi nomi",
+ "email": "E-pochta manzili"
+ },
+ "mailbox": {
+ "action": "Amal",
+ "activate": "Faollashtirish",
+ "active": "Faol",
+ "add": "Qoʻshish",
+ "add_alias": "Taxallus qoʻshish",
+ "add_alias_expand": "Taxallusni taxallus domenlari boʻylab kengaytirish",
+ "add_bcc_entry": "BCC xaritasi qoʻshish",
+ "add_domain": "Domen qoʻshish",
+ "add_domain_alias": "Domen taxallusini qoʻshish",
+ "add_domain_record_first": "Iltimos, avval domen qoʻshing",
+ "add_filter": "Filtr qoʻshish",
+ "add_mailbox": "Pochta qutisi qoʻshish",
+ "add_recipient_map_entry": "Qabul qiluvchi xaritasini qoʻshish",
+ "add_resource": "Resurs qoʻshish",
+ "add_template": "Shablon qoʻshish",
+ "add_tls_policy_map": "TLS siyosati xaritasini qoʻshish",
+ "address_rewriting": "Manzilni qayta yozish",
+ "alias": "Taxallus",
+ "alias_domain_alias_hint": "Taxalluslar domen taxalluslariga avtomatik qoʻllanilmaydi. my-alias@domain taxallus manzili my-alias@alias-domain manzilini qoplamaydi (bu yerda \"alias-domain\" — \"domain\" uchun tasavvur qilingan taxallus domeni). Tashqi pochta qutisiga xatni yoʻnaltirish uchun sieve filtridan foydalaning (\"Filtrlar\" yorligʻiga qarang yoki SOGo -> Forwarder dan foydalaning). Yoʻq taxalluslarni avtomatik qoʻshish uchun \"Taxallusni taxallus domenlari boʻylab kengaytirish\" dan foydalaning.",
+ "alias_domain_backupmx": "Relay domeni uchun taxallus domeni nofaol",
+ "aliases": "Taxalluslar",
+ "all_domains": "Barcha domenlar",
+ "allow_from_smtp": "Faqat ushbu IP larga SMTP dan foydalanishga ruxsat berish",
+ "allow_from_smtp_info": "Barcha joʻnatuvchilarga ruxsat berish uchun boʻsh qoldiring. IPv4/IPv6 manzillari va tarmoqlari.",
+ "allowed_protocols": "Ruxsat etilgan protokollar",
+ "backup_mx": "Relay domeni",
+ "bcc": "BCC",
+ "bcc_destination": "BCC manzili",
+ "bcc_destinations": "BCC manzili",
+ "bcc_info": "BCC xaritalari barcha xabarlarning nusxalarini boshqa manzilga jimgina yoʻnaltirish uchun ishlatiladi. Qabul qiluvchi xaritasi turi yozuvi mahalliy manzil xatning qabul qiluvchisi sifatida ishlaganda ishlatiladi. Joʻnatuvchi xaritalari ham xuddi shu tamoyilga muvofiq ishlaydi. \r\n Mahalliy manzilga yetkazib berish muvaffaqiyatsiz boʻlsa, xabar berilmaydi.",
+ "bcc_local_dest": "Mahalliy manzil",
+ "bcc_map": "BCC xaritasi",
+ "bcc_map_type": "BCC turi",
+ "bcc_maps": "BCC xaritalari",
+ "bcc_rcpt_map": "Qabul qiluvchi xaritasi",
+ "bcc_sender_map": "Joʻnatuvchi xaritasi",
+ "bcc_to_rcpt": "Qabul qiluvchi xaritasi turiga oʻtish",
+ "bcc_to_sender": "Joʻnatuvchi xaritasi turiga oʻtish",
+ "bcc_type": "BCC turi",
+ "booking_null": "Doimo boʻsh sifatida koʻrsatish",
+ "booking_0_short": "Doimo boʻsh",
+ "booking_custom": "Maxsus bandlovlar soni bilan qatʼiy cheklash",
+ "booking_custom_short": "Qatʼiy chegara",
+ "booking_ltnull": "Cheksiz, lekin bandlangan boʻlsa band sifatida koʻrsatish",
+ "booking_lt0_short": "Yumshoq chegara",
+ "catch_all": "Hammasini-qabul qilish",
+ "created_on": "Yaratilgan sana",
+ "daily": "Kunlik",
+ "deactivate": "Oʻchirish",
+ "description": "Tavsif",
+ "disable_login": "Kirishni taqiqlash (kiruvchi pochta hali ham qabul qilinadi)",
+ "disable_x": "Oʻchirish",
+ "dkim_domains_selector": "Tanlovchi",
+ "dkim_key_length": "DKIM kalit uzunligi (bit)",
+ "domain": "Domen",
+ "domain_admins": "Domen administratorlari",
+ "domain_aliases": "Domen taxalluslari",
+ "domain_templates": "Domen shablonlari",
+ "domain_quota": "Kvota",
+ "domain_quota_total": "Umumiy domen kvotasi",
+ "domains": "Domenlar",
+ "edit": "Tahrirlash",
+ "empty": "Natijalar yoʻq",
+ "enable_x": "Yoqish",
+ "excludes": "Istisnolar",
+ "filter_table": "Filtr jadvali",
+ "filters": "Filtrlar",
+ "fname": "Toʻliq ism",
+ "force_pw_update": "Keyingi kirishda parolni majburiy yangilash",
+ "gal": "Global manzillar roʻyxati",
+ "goto_ham": "ham sifatida oʻrgatish",
+ "goto_spam": "spam sifatida oʻrgatish",
+ "hourly": "Soatlik",
+ "iam": "Identifikatsiya provayderi",
+ "in_use": "Foydalanilmoqda (%)",
+ "inactive": "Nofaol",
+ "insert_preset": "Misol presetini kiritish \"%s\"",
+ "internal": "Ichki",
+ "kind": "Turi",
+ "last_mail_login": "Oxirgi pochta kirishi",
+ "last_modified": "Oxirgi oʻzgartirilgan",
+ "last_pw_change": "Oxirgi parol oʻzgarishi",
+ "last_run": "Oxirgi ishga tushirilgan",
+ "last_run_reset": "Keyingisini rejalashtirish",
+ "mailbox": "Pochta qutisi",
+ "mailbox_defaults": "Standart sozlamalar",
+ "mailbox_defaults_info": "Yangi pochta qutilari uchun standart sozlamalarni belgilang.",
+ "mailbox_defquota": "Standart pochta qutisi oʻlchami",
+ "mailbox_templates": "Pochta qutisi shablonlari",
+ "mailbox_quota": "Pochta qutisining maks. oʻlchami",
+ "mailboxes": "Pochta qutilari",
+ "max_aliases": "Maks. taxalluslar",
+ "max_mailboxes": "Mumkin boʻlgan maks. pochta qutilari",
+ "max_quota": "Bitta pochta qutisining maks. kvotasi",
+ "mins_interval": "Oraliq (daqiqa)",
+ "msg_num": "Xabar #",
+ "multiple_bookings": "Bir nechta bandlovlar",
+ "never": "Hech qachon",
+ "no": "✕",
+ "no_record": "%s obyekti uchun yozuv yoʻq",
+ "no_record_single": "Yozuv yoʻq",
+ "open_logs": "Jurnallarni ochish",
+ "owner": "Egasi",
+ "private_comment": "Maxfiy izoh",
+ "public_comment": "Ommaviy izoh",
+ "q_add_header": "Junk papkasiga koʻchirilganda",
+ "q_all": " Junk papkasiga koʻchirilganda va rad etilganda",
+ "q_reject": "rad etilganda",
+ "quarantine_category": "Karantin bildirishnoma turkumi",
+ "quarantine_notification": "Karantin bildirishnomalari",
+ "quick_actions": "Amallar",
+ "recipient": "Qabul qiluvchi",
+ "recipient_map": "Qabul qiluvchi xaritasi",
+ "recipient_map_info": "Qabul qiluvchi xaritalari xabar yetkazib berilishidan oldin manzilni almashtirish uchun ishlatiladi.",
+ "recipient_map_new": "Yangi qabul qiluvchi",
+ "recipient_map_new_info": "Qabul qiluvchi xaritasi manzili haqiqiy e-pochta manzili yoki domen nomi boʻlishi kerak.",
+ "recipient_map_old": "Asl qabul qiluvchi",
+ "recipient_map_old_info": "Qabul qiluvchi xaritasining asl manzili haqiqiy e-pochta manzili yoki domen nomi boʻlishi kerak.",
+ "recipient_maps": "Qabul qiluvchi xaritalari",
+ "relay_all": "Barcha qabul qiluvchilarni relay qilish",
+ "relay_unknown": "Nomaʼlum pochta qutilarini relay qilish",
+ "remove": "Olib tashlash",
+ "resources": "Resurslar",
+ "running": "Ishlamoqda",
+ "sender": "Joʻnatuvchi",
+ "set_postfilter": "Postfiltr sifatida belgilash",
+ "set_prefilter": "Prefiltr sifatida belgilash",
+ "sieve_info": "Bitta foydalanuvchi uchun bir nechta filtrlarni saqlash mumkin, lekin bir vaqtning oʻzida faqat bitta prefiltr va bitta postfiltr faol boʻlishi mumkin. \r\nHar bir filtr tasvirlangan tartibda qayta ishlanadi. Muvaffaqiyatsiz skript ham, chiqarilgan \"keep;\" ham keyingi skriptlarning qayta ishlanishini toʻxtatmaydi. Global sieve skriptlariga oʻzgartirishlar Dovecot ni qayta ishga tushirishni keltirib chiqaradi.
Global sieve prefilter • Prefilter • Foydalanuvchi skriptlari • Postfilter • Global sieve postfilter",
+ "sieve_preset_1": "Xavfli boʻlishi mumkin boʻlgan fayl turlari bilan xatlarni rad etish",
+ "sieve_preset_2": "Aniq joʻnatuvchining xatini har doim oʻqilgan deb belgilash",
+ "sieve_preset_3": "Jimgina rad etish, keyingi sieve qayta ishlashini toʻxtatish",
+ "sieve_preset_4": "INBOX ga joylash, sieve filtrlari tomonidan keyingi qayta ishlashni oʻtkazib yuborish",
+ "sieve_preset_5": "Avto-javob (taʼtil)",
+ "sieve_preset_6": "Javob bilan xatni rad etish",
+ "sieve_preset_7": "Yoʻnaltirish va saqlash/tashlash",
+ "sieve_preset_8": "Aniq joʻnatuvchining xatini yoʻnaltirish, oʻqilgan deb belgilash va subpapkaga saralash",
+ "sieve_preset_header": "Iltimos, quyidagi misol presetlariga qarang. Batafsil maʼlumot uchun Wikipediaga qarang.",
+ "sogo_visible": "Taxallus SOGo da koʻrinadi",
+ "sogo_visible_n": "Taxallusni SOGo da yashirish",
+ "sogo_visible_y": "Taxallusni SOGo da koʻrsatish",
+ "spam_aliases": "Vaqt. taxallus",
+ "stats": "Statistika",
+ "status": "Holat",
+ "sync_jobs": "Sinxronizatsiya vazifalari",
+ "syncjob_check_log": "Jurnalni tekshirish",
+ "syncjob_last_run_result": "Oxirgi ishga tushirilgan natija",
+ "syncjob_EX_OK": "Muvaffaqiyatli",
+ "syncjob_EXIT_CONNECTION_FAILURE": "Ulanish muammosi",
+ "syncjob_EXIT_TLS_FAILURE": "Shifrlangan ulanish bilan muammo",
+ "syncjob_EXIT_AUTHENTICATION_FAILURE": "Autentifikatsiya muammosi",
+ "syncjob_EXIT_OVERQUOTA": "Maqsad pochta qutisi kvotadan oshib ketdi",
+ "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Masofaviy serverga ulanib boʻlmadi",
+ "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Notoʻgʻri foydalanuvchi nomi yoki parol",
+ "table_size": "Jadval oʻlchami",
+ "table_size_show_n": "%s ta element koʻrsatish",
+ "target_address": "Yoʻnaltirish manzili",
+ "target_domain": "Maqsad domen",
+ "templates": "Shablonlar",
+ "template": "Shablon",
+ "tls_enforce_in": "Kiruvchi TLS ni majburlash",
+ "tls_enforce_out": "Chiquvchi TLS ni majburlash",
+ "tls_map_dest": "Manzil",
+ "tls_map_dest_info": "Misollar: example.org, .example.org, [mail.example.org]:25",
+ "tls_map_parameters": "Parametrlar",
+ "tls_map_parameters_info": "Boʻsh yoki parametrlar, masalan: protocols=!SSLv2 ciphers=medium exclude=3DES",
+ "tls_map_policy": "Siyosat",
+ "tls_policy_maps": "TLS siyosati xaritalari",
+ "tls_policy_maps_enforced_tls": "Bu siyosatlar chiquvchi TLS ulanishlarini majburlovchi pochta qutisi foydalanuvchilari uchun ham xatti-harakatni bekor qiladi. Agar quyida siyosat boʻlmasa, bu foydalanuvchilar smtp_tls_mandatory_protocols va smtp_tls_mandatory_ciphers sifatida belgilangan standart qiymatlarni qoʻllaydi.",
+ "tls_policy_maps_info": "Bu siyosat xaritasi foydalanuvchining TLS siyosati sozlamalaridan mustaqil ravishda chiquvchi TLS transport qoidalarini bekor qiladi. \r\n Batafsil maʼlumot uchun \"smtp_tls_policy_maps\" hujjatlarini tekshiring.",
+ "tls_policy_maps_long": "Chiquvchi TLS siyosati xaritasi bekor qilishlari",
+ "toggle_all": "Hammasini almashtirish",
+ "username": "Foydalanuvchi nomi",
+ "waiting": "Kutilmoqda",
+ "weekly": "Haftalik",
+ "yes": "✓"
+ },
+ "oauth2": {
+ "access_denied": "OAuth2 orqali kirishga ruxsat berish uchun pochta qutisi egasi sifatida kiring.",
+ "authorize_app": "Ilovaga ruxsat berish",
+ "deny": "Rad etish",
+ "permit": "Ilovaga ruxsat berish",
+ "profile": "Profil",
+ "profile_desc": "Shaxsiy maʼlumotlarni koʻrish: foydalanuvchi nomi, toʻliq ism, yaratilgan, oʻzgartirilgan, faol",
+ "scope_ask_permission": "Ilova quyidagi ruxsatlarni soʻradi"
+ },
+ "quarantine": {
+ "action": "Amal",
+ "atts": "Ilovalar",
+ "check_hash": "VT da fayl hashini qidirish",
+ "confirm": "Tasdiqlash",
+ "confirm_delete": "Ushbu elementni oʻchirishni tasdiqlang.",
+ "danger": "Xavf",
+ "deliver_inbox": "Inbox ga yetkazib berish",
+ "disabled_by_config": "Joriy tizim konfiguratsiyasi karantin funksiyasini oʻchirib qoʻyadi. Iltimos, karantin elementlari uchun \"pochta qutisi boʻyicha saqlash\" va \"maksimal oʻlcham\"ni oʻrnating.",
+ "download_eml": "Yuklab olish (.eml)",
+ "empty": "Natijalar yoʻq",
+ "high_danger": "Yuqori",
+ "info": "Maʼlumot",
+ "junk_folder": "Junk papkasi",
+ "learn_spam_delete": "Spam sifatida oʻrgatish va oʻchirish",
+ "low_danger": "Past",
+ "medium_danger": "Oʻrtacha",
+ "neutral_danger": "Neytral",
+ "notified": "Xabar berildi",
+ "qhandler_success": "Soʻrov tizimga muvaffaqiyatli yuborildi. Endi oynani yopishingiz mumkin.",
+ "qid": "Rspamd QID",
+ "qinfo": "Karantin tizimi rad etilgan xatni (joʻnatuvchiga xat yetkazib berilgandek taassurot bermay) hamda pochta qutisining Junk papkasiga nusxa sifatida yetkazib berilgan xatni maʼlumotlar bazasiga saqlaydi.\r\n \"Spam sifatida oʻrgatish va oʻchirish\" xabarni Bayesian teoremasi orqali spam sifatida oʻrgatadi va kelajakda oʻxshash xabarlarni rad etish uchun fuzzy hashlarni hisoblaydi.\r\n Bir nechta xabarlarni oʻrgatish — tizimingizga qarab — vaqt talab qilishi mumkinligini unutmang. Qora roʻyxatdagi elementlar karantindan istisno qilinadi.",
+ "qitem": "Karantin elementi",
+ "quarantine": "Karantin",
+ "quick_actions": "Amallar",
+ "quick_delete_link": "Tezkor oʻchirish havolasini ochish",
+ "quick_info_link": "Maʼlumot havolasini ochish",
+ "quick_release_link": "Tezkor chiqarish havolasini ochish",
+ "rcpt": "Qabul qiluvchi",
+ "received": "Qabul qilingan",
+ "recipients": "Qabul qiluvchilar",
+ "refresh": "Yangilash",
+ "rejected": "Rad etilgan",
+ "release": "Chiqarish",
+ "release_body": "Xabaringizni ushbu xabarga eml fayl sifatida ilova qildik.",
+ "release_subject": "Potensial xavfli karantin elementi %s",
+ "remove": "Olib tashlash",
+ "rewrite_subject": "Mavzuni qayta yozish",
+ "rspamd_result": "Rspamd natijasi",
+ "sender": "Joʻnatuvchi (SMTP)",
+ "sender_header": "Joʻnatuvchi (\"From\" sarlavhasi)",
+ "settings_info": "Karantinga olinadigan maksimal elementlar soni: %s Maksimal e-pochta oʻlchami: %s MiB",
+ "show_item": "Elementni koʻrsatish",
+ "spam": "Spam",
+ "spam_score": "Baho",
+ "subj": "Mavzu",
+ "table_size": "Jadval oʻlchami",
+ "table_size_show_n": "%s ta element koʻrsatish",
+ "text_from_html_content": "Mazmun (oʻzgartirilgan html)",
+ "text_plain_content": "Mazmun (text/plain)",
+ "toggle_all": "Hammasini almashtirish",
+ "type": "Tur"
+ },
+ "queue": {
+ "delete": "Hammasini oʻchirish",
+ "flush": "Navbatni tozalash",
+ "info": "Pochta navbati yetkazib berilishini kutayotgan barcha xatlarni oʻz ichiga oladi. Agar e-pochta uzoq vaqt davomida pochta navbatida tursa, u tizim tomonidan avtomatik ravishda oʻchiriladi. Tegishli xatning xato xabari xat nima uchun yetkazib berilmaganligi haqida maʼlumot beradi.",
+ "legend": "Pochta navbati amallari funksiyalari:",
+ "ays": "Iltimos, joriy navbatdagi barcha elementlarni oʻchirishni tasdiqlang.",
+ "deliver_mail": "Yetkazib berish",
+ "deliver_mail_legend": "Tanlangan xatlarni qayta yetkazib berishga harakat qiladi.",
+ "hold_mail": "Ushlab turish",
+ "hold_mail_legend": "Tanlangan xatlarni ushlab turadi. (Keyingi yetkazib berish urinishlarining oldini oladi)",
+ "queue_manager": "Navbat menejeri",
+ "show_message": "Xabarni koʻrsatish",
+ "unban": "navbatdan blokdan chiqarish",
+ "unhold_mail": "Ushlab turishni bekor qilish",
+ "unhold_mail_legend": "Tanlangan xatlarni yetkazib berish uchun chiqaradi. (Avval ushlab turish talab qilinadi)"
+ },
+ "ratelimit": {
+ "disabled": "Oʻchirilgan",
+ "second": "xabarlar / soniya",
+ "minute": "xabarlar / daqiqa",
+ "hour": "xabarlar / soat",
+ "day": "xabarlar / kun"
+ },
+ "start": {
+ "help": "Yordam panelini koʻrsatish/yashirish",
+ "imap_smtp_server_auth_info": "Iltimos, toʻliq e-pochta manzilingiz va PLAIN autentifikatsiya mexanizmidan foydalaning. \r\nKirish maʼlumotlaringiz server tomonidagi majburiy shifrlash orqali shifrlanadi."
+ },
+ "success": {
+ "acl_saved": "%s obyekti uchun ACL saqlandi",
+ "admin_added": "Administrator %s qoʻshildi",
+ "admin_api_modified": "API ga oʻzgarishlar saqlandi",
+ "admin_modified": "Administrator oʻzgarishlari saqlandi",
+ "admin_removed": "Administrator %s olib tashlandi",
+ "alias_added": "Taxallus manzili %s (%d) qoʻshildi",
+ "alias_domain_removed": "Taxallus domeni %s olib tashlandi",
+ "alias_modified": "Taxallus manzili %s ga oʻzgarishlar saqlandi",
+ "alias_removed": "Taxallus %s olib tashlandi",
+ "aliasd_added": "Taxallus domeni %s qoʻshildi",
+ "aliasd_modified": "Taxallus domeni %s ga oʻzgarishlar saqlandi",
+ "app_links": "Ilova havolalariga oʻzgarishlar saqlandi",
+ "app_passwd_added": "Yangi ilova paroli qoʻshildi",
+ "app_passwd_removed": "Ilova paroli ID %s olib tashlandi",
+ "bcc_deleted": "BCC xaritasi yozuvlari oʻchirildi: %s",
+ "bcc_edited": "BCC xaritasi yozuvi %s tahrirlandi",
+ "bcc_saved": "BCC xaritasi yozuvi saqlandi",
+ "cors_headers_edited": "CORS sozlamalari saqlandi",
+ "custom_login_modified": "Kirishni sozlash muvaffaqiyatli saqlandi",
+ "db_init_complete": "Maʼlumotlar bazasini ishga tushirish tugadi",
+ "delete_filter": "Filtr ID %s oʻchirildi",
+ "delete_filters": "Filtrlar oʻchirildi: %s",
+ "deleted_syncjob": "Sinxronizatsiya vazifasi ID %s oʻchirildi",
+ "deleted_syncjobs": "Sinxronizatsiya vazifalari oʻchirildi: %s",
+ "dkim_added": "DKIM kaliti %s saqlandi",
+ "domain_add_dkim_available": "DKIM kaliti allaqachon mavjud edi",
+ "dkim_duplicated": "%s domeni uchun DKIM kaliti %s ga nusxalandi",
+ "dkim_removed": "DKIM kaliti %s olib tashlandi",
+ "domain_added": "Domen %s qoʻshildi",
+ "domain_admin_added": "Domen administratori %s qoʻshildi",
+ "domain_admin_modified": "Domen administratori %s ga oʻzgarishlar saqlandi",
+ "domain_admin_removed": "Domen administratori %s olib tashlandi",
+ "domain_footer_modified": "Domen pastki qismi %s ga oʻzgarishlar saqlandi",
+ "domain_modified": "Domen %s ga oʻzgarishlar saqlandi",
+ "domain_removed": "Domen %s olib tashlandi",
+ "dovecot_restart_success": "Dovecot muvaffaqiyatli qayta ishga tushirildi",
+ "eas_reset": "%s foydalanuvchisi uchun ActiveSync qurilmalari tiklandi",
+ "f2b_banlist_refreshed": "Banlist ID muvaffaqiyatli yangilandi.",
+ "f2b_modified": "Fail2ban parametrlariga oʻzgarishlar saqlandi",
+ "forwarding_host_added": "Yoʻnaltirish xosti %s qoʻshildi",
+ "forwarding_host_removed": "Yoʻnaltirish xosti %s olib tashlandi",
+ "global_filter_written": "Filtr faylga muvaffaqiyatli yozildi",
+ "hash_deleted": "Hash oʻchirildi",
+ "iam_test_connection": "Ulanish muvaffaqiyatli",
+ "ip_check_opt_in_modified": "IP tekshiruvi muvaffaqiyatli saqlandi",
+ "item_deleted": "Element %s muvaffaqiyatli oʻchirildi",
+ "item_released": "Element %s chiqarildi",
+ "items_deleted": "Element %s muvaffaqiyatli oʻchirildi",
+ "items_released": "Tanlangan elementlar chiqarildi",
+ "learned_ham": "ID %s ham sifatida muvaffaqiyatli oʻrgatildi",
+ "license_modified": "Litsenziyaga oʻzgarishlar saqlandi",
+ "logged_in_as": "%s sifatida tizimga kirildi",
+ "mailbox_added": "Pochta qutisi %s qoʻshildi",
+ "mailbox_modified": "Pochta qutisi %s ga oʻzgarishlar saqlandi",
+ "mailbox_removed": "Pochta qutisi %s olib tashlandi",
+ "mailbox_renamed": "Pochta qutisi %s dan %s ga qayta nomlandi",
+ "nginx_reloaded": "Nginx qayta yuklandi",
+ "object_modified": "Obyekt %s ga oʻzgarishlar saqlandi",
+ "password_policy_saved": "Parol siyosati muvaffaqiyatli saqlandi",
+ "password_changed_success": "Parol muvaffaqiyatli oʻzgartirildi",
+ "pushover_settings_edited": "Pushover sozlamalari muvaffaqiyatli oʻrnatildi, iltimos maʼlumotlarni tekshiring.",
+ "qlearn_spam": "Xabar ID %s spam sifatida oʻrgatildi va oʻchirildi",
+ "queue_command_success": "Navbat buyrugʻi muvaffaqiyatli yakunlandi",
+ "recipient_map_entry_deleted": "Qabul qiluvchi xaritasi ID %s oʻchirildi",
+ "recipient_map_entry_saved": "Qabul qiluvchi xaritasi yozuvi \"%s\" saqlandi",
+ "recovery_email_sent": "Tiklash e-pochtasi %s ga yuborildi",
+ "relayhost_added": "Xarita yozuvi %s qoʻshildi",
+ "relayhost_removed": "Xarita yozuvi %s olib tashlandi",
+ "reset_main_logo": "Standart logotipga qaytarildi",
+ "resource_added": "Resurs %s qoʻshildi",
+ "resource_modified": "Pochta qutisi %s ga oʻzgarishlar saqlandi",
+ "resource_removed": "Resurs %s olib tashlandi",
+ "rl_saved": "%s obyekti uchun tezlik chegarasi saqlandi",
+ "rspamd_ui_pw_set": "Rspamd UI paroli muvaffaqiyatli oʻrnatildi",
+ "saved_settings": "Sozlamalar saqlandi",
+ "settings_map_added": "Sozlamalar xaritasi yozuvi qoʻshildi",
+ "settings_map_removed": "Sozlamalar xaritasi ID %s olib tashlandi",
+ "sogo_profile_reset": "%s foydalanuvchisi uchun SOGo profili tiklandi",
+ "template_added": "Shablon %s qoʻshildi",
+ "template_modified": "Shablon %s ga oʻzgarishlar saqlandi",
+ "template_removed": "Shablon ID %s oʻchirildi",
+ "tls_policy_map_entry_deleted": "TLS siyosati xaritasi ID %s oʻchirildi",
+ "tls_policy_map_entry_saved": "TLS siyosati xaritasi yozuvi \"%s\" saqlandi",
+ "ui_texts": "UI matnlariga oʻzgarishlar saqlandi",
+ "upload_success": "Fayl muvaffaqiyatli yuklandi",
+ "verified_fido2_login": "FIDO2 kirishi tasdiqlandi",
+ "verified_totp_login": "TOTP kirishi tasdiqlandi",
+ "verified_webauthn_login": "WebAuthn kirishi tasdiqlandi",
+ "verified_yotp_login": "Yubico OTP kirishi tasdiqlandi"
+ },
+ "tfa": {
+ "authenticators": "Autentifikatorlar",
+ "api_register": "%s Yubico Cloud API dan foydalanadi. Iltimos, kalitingiz uchun API kalitini bu yerdan oling",
+ "confirm": "Tasdiqlash",
+ "confirm_totp_token": "Iltimos, yaratilgan tokenni kiritib oʻzgarishlaringizni tasdiqlang",
+ "delete_tfa": "TFA ni oʻchirish",
+ "disable_tfa": "Keyingi muvaffaqiyatli kirishgacha TFA ni oʻchirish",
+ "force_tfa": "Kirishda 2FA roʻyxatdan oʻtkazishni majburlash",
+ "force_tfa_info": "Foydalanuvchidan panelga kirishdan oldin ikki faktorli autentifikatsiyani sozlash talab qilinadi.",
+ "setup_title": "Ikki faktorli autentifikatsiya talab qilinadi",
+ "setup_required": "Hisobingiz ikki faktorli autentifikatsiyani talab qiladi. Davom etish uchun 2FA usulini sozlang.",
+ "cancel_setup": "Bekor qilish va chiqish",
+ "enter_qr_code": "Agar qurilmangiz QR kodlarni skanerlay olmasa, TOTP kodingiz",
+ "error_code": "Xato kodi",
+ "init_webauthn": "Ishga tushirilmoqda, iltimos kuting...",
+ "key_id": "Qurilmangiz uchun identifikator",
+ "key_id_totp": "Kalitingiz uchun identifikator",
+ "none": "Oʻchirish",
+ "reload_retry": "- (xato davom etsa, brauzerni qayta yuklang)",
+ "scan_qr_code": "Iltimos, quyidagi kodni autentifikator ilovangiz bilan skanerlang yoki kodni qoʻlda kiriting.",
+ "select": "Iltimos, tanlang",
+ "set_tfa": "Ikki faktorli autentifikatsiya usulini oʻrnatish",
+ "start_webauthn_validation": "Tekshiruvni boshlash",
+ "tfa": "Ikki faktorli autentifikatsiya",
+ "tfa_token_invalid": "TFA tokeni noto'g'ri",
+ "totp": "Vaqt asosidagi OTP (Google Authenticator, Authy va h.k.)",
+ "u2f_deprecated": "Sizning kalitingiz eskirgan U2F usulidan foydalanib roʻyxatdan oʻtkazilganga oʻxshaydi. Biz siz uchun ikki faktorli autentifikatsiyani oʻchirib qoʻyamiz va kalitingizni oʻchiramiz.",
+ "u2f_deprecated_important": "Iltimos, kalitingizni admin panelida yangi WebAuthn usuli bilan roʻyxatdan oʻtkazing.",
+ "webauthn": "WebAuthn autentifikatsiya",
+ "waiting_usb_auth": "USB qurilmasi kutilmoqda...
Iltimos, hozir USB qurilmangizdagi tugmani bosing.",
+ "waiting_usb_register": "USB qurilmasi kutilmoqda...
Iltimos, yuqorida parolingizni kiriting va USB qurilmangizdagi tugmani bosib roʻyxatga olinishingizni tasdiqlang.",
+ "yubi_otp": "Yubico OTP autentifikatsiya"
+ },
+ "user": {
+ "action": "Amal",
+ "active": "Faol",
+ "active_sieve": "Faol filtr",
+ "advanced_settings": "Kengaytirilgan sozlamalar",
+ "alias": "Taxallus",
+ "alias_create_random": "Tasodifiy taxallus yaratish",
+ "alias_extend_all": "Taxalluslarni 1 soatga uzaytirish",
+ "alias_full_date": "d.m.Y, H:i:s T",
+ "alias_remove_all": "Barcha taxalluslarni olib tashlash",
+ "alias_select_validity": "Amal qilish muddati",
+ "alias_time_left": "Qolgan vaqt",
+ "alias_valid_until": "Amal qiladi (gacha)",
+ "aliases_also_send_as": "Foydalanuvchi sifatida ham joʻnatishga ruxsat berilgan",
+ "aliases_send_as_all": "Quyidagi domen(lar) va ularning taxallus domenlari uchun joʻnatuvchi kirishini tekshirmaslik",
+ "app_hint": "Ilova parollari sizning IMAP, SMTP, CalDAV, CardDAV va EAS kirishi uchun muqobil parollardir. Foydalanuvchi nomi oʻzgarmaydi. SOGo webmail ilova parollari orqali mavjud emas.",
+ "allowed_protocols": "Ruxsat etilgan protokollar",
+ "app_name": "Ilova nomi",
+ "app_passwds": "Ilova parollari",
+ "apple_connection_profile": "Apple ulanish profili",
+ "apple_connection_profile_complete": "Bu ulanish profili Apple qurilmasi uchun IMAP va SMTP parametrlari hamda CalDAV (kalendarlar) va CardDAV (kontaktlar) yoʻllarini oʻz ichiga oladi.",
+ "apple_connection_profile_mailonly": "Bu ulanish profili Apple qurilmasi uchun IMAP va SMTP konfiguratsiya parametrlarini oʻz ichiga oladi.",
+ "apple_connection_profile_with_app_password": "Yangi ilova paroli yaratiladi va profilga qoʻshiladi, shunda qurilmangizni sozlashda parol kiritish kerak boʻlmaydi. Iltimos, faylni ulashmang, chunki u pochta qutingizga toʻliq kirish huquqini beradi.",
+ "attribute": "Atribut",
+ "authentication": "Autentifikatsiya",
+ "change_password": "Parolni oʻzgartirish",
+ "change_password_hint_app_passwords": "Hisobingizda %d ta ilova paroli mavjud va ular oʻzgartirilmaydi. Ularni boshqarish uchun Ilova parollari yorligʻiga oʻting.",
+ "clear_recent_successful_connections": "Koʻrilgan muvaffaqiyatli ulanishlarni tozalash",
+ "client_configuration": "E-pochta mijozlari va smartfonlar uchun konfiguratsiya qoʻllanmalarini koʻrsatish",
+ "create_app_passwd": "Ilova paroli yaratish",
+ "create_syncjob": "Yangi sinxronizatsiya vazifasi yaratish",
+ "created_on": "Yaratilgan sana",
+ "daily": "Kunlik",
+ "day": "kun",
+ "description": "Tavsif",
+ "delete_ays": "Iltimos, oʻchirish jarayonini tasdiqlang.",
+ "direct_aliases": "Toʻgʻridan-toʻgʻri taxallus manzillari",
+ "direct_aliases_desc": "Toʻgʻridan-toʻgʻri taxallus manzillariga spam filtri va TLS siyosati sozlamalari taʼsir qiladi.",
+ "direct_protocol_access": "Bu pochta qutisi foydalanuvchisi quyidagi protokollar va ilovalarga toʻgʻridan-toʻgʻri, tashqi kirishga ega. Bu sozlama administratoringiz tomonidan boshqariladi. Maxsus protokollar va ilovalarga kirishga ruxsat berish uchun ilova parollarini yaratish mumkin. \"Webmail\" tugmasi SOGo ga yagona kirish (SSO) imkonini beradi va doimo mavjud.",
+ "eas_reset": "ActiveSync qurilma keshini tiklash",
+ "eas_reset_help": "Koʻp hollarda qurilma keshini tiklash buzilgan ActiveSync profilini tiklashga yordam beradi. Diqqat: Barcha elementlar qayta yuklab olinadi!",
+ "eas_reset_now": "Hozir tiklash",
+ "edit": "Tahrirlash",
+ "email": "E-pochta",
+ "email_and_dav": "E-pochta, kalendarlar va kontaktlar",
+ "empty": "Natijalar yoʻq",
+ "encryption": "Shifrlash",
+ "excludes": "Istisnolar",
+ "expire_in": "Tugaydi",
+ "expire_never": "Hech qachon tugamasin",
+ "fido2_webauthn": "FIDO2/WebAuthn",
+ "forever": "Abadiy",
+ "force_pw_update": "Guruh dasturi xizmatlariga kirish uchun siz yangi parol oʻrnatishingiz kerak.",
+ "from": "dan",
+ "generate": "yaratish",
+ "hour": "soat",
+ "hourly": "Soatlik",
+ "hours": "soat",
+ "in_use": "Foydalanilmoqda",
+ "interval": "Oraliq",
+ "is_catch_all": "Domen(lar) uchun Hammasini-qabul qilish",
+ "last_mail_login": "Oxirgi pochta kirishi",
+ "last_pw_change": "Oxirgi parol oʻzgarishi",
+ "last_run": "Oxirgi ishga tushirilgan",
+ "last_ui_login": "Oxirgi UI kirishi",
+ "loading": "Yuklanmoqda...",
+ "login_history": "Kirish tarixi",
+ "mailbox": "Pochta qutisi",
+ "mailbox_details": "Tafsilotlar",
+ "mailbox_general": "Umumiy",
+ "mailbox_settings": "Sozlamalar",
+ "messages": "xabarlar",
+ "month": "oy",
+ "months": "oy",
+ "never": "Hech qachon",
+ "new_password": "Yangi parol",
+ "new_password_repeat": "Tasdiqlash paroli (takrorlang)",
+ "no_active_filter": "Faol filtr mavjud emas",
+ "no_last_login": "Oxirgi UI kirishi haqida maʼlumot yoʻq",
+ "no_record": "Yozuv yoʻq",
+ "open_logs": "Jurnallarni ochish",
+ "open_webmail_sso": "Webmail",
+ "overview": "Umumiy koʻrinish",
+ "password": "Parol",
+ "password_now": "Joriy parol (oʻzgarishlarni tasdiqlang)",
+ "pw_update_required": "Hisobingiz parol oʻzgartirishni talab qiladi. Davom etish uchun yangi parolni oʻrnating.",
+ "password_repeat": "Parol (takrorlang)",
+ "password_reset_info": "Agar parolni tiklash uchun e-pochta kiritilmagan boʻlsa, bu funksiyadan foydalanib boʻlmaydi.",
+ "protocols": "Protokollar",
+ "pushover_evaluate_x_prio": "Yuqori muhimlikdagi xatni eskalatsiya qilish [X-Priority: 1]",
+ "pushover_info": "Push bildirishnoma sozlamalari %s ga taxalluslar bilan birga (umumiy, umumiy boʻlmagan, teglangan) yetkazib beriladigan barcha toza (spam boʻlmagan) xatlarga qoʻllaniladi.",
+ "pushover_only_x_prio": "Faqat yuqori muhimlikdagi xatlarni koʻrib chiqish [X-Priority: 1]",
+ "pushover_sender_array": "Quyidagi joʻnatuvchi e-pochta manzillarini koʻrib chiqish (vergul bilan ajratilgan)",
+ "pushover_sender_regex": "Joʻnatuvchilarni quyidagi regex orqali mos kelishini tekshirish",
+ "pushover_text": "Bildirishnoma matni",
+ "pushover_title": "Bildirishnoma sarlavhasi",
+ "pushover_sound": "Tovush",
+ "pushover_vars": "Joʻnatuvchi filtri belgilanmagan boʻlsa, barcha xatlar koʻrib chiqiladi. Regex filtrlari va aniq joʻnatuvchi tekshiruvlari alohida belgilanishi mumkin va ketma-ket koʻrib chiqiladi. Ular bir-biriga bogʻliq emas. Matn va sarlavha uchun ishlatiladigan oʻzgaruvchilar (ma'lumotlarni himoya qilish siyosatiga e'tibor bering)",
+ "pushover_verify": "Maʼlumotlarni tekshirish",
+ "pw_recovery_email": "Parolni tiklash e-pochtasi",
+ "q_add_header": "Junk papkasi",
+ "q_all": "Barcha turkumlar",
+ "q_reject": "Rad etilgan",
+ "quarantine_category": "Karantin bildirishnoma turkumi",
+ "quarantine_category_info": "\"Rad etilgan\" bildirishnoma turkumi rad etilgan xatlarni oʻz ichiga oladi, \"Junk papkasi\" esa Junk papkasiga joylashtirilgan xatlar haqida foydalanuvchini xabardor qiladi.",
+ "quarantine_notification": "Karantin bildirishnomalari",
+ "quarantine_notification_info": "Bildirishnoma yuborilgandan keyin elementlar \"xabar berildi\" deb belgilanadi va bu element uchun keyingi bildirishnomalar yuborilmaydi.",
+ "recent_successful_connections": "Koʻrilgan muvaffaqiyatli ulanishlar",
+ "remove": "Olib tashlash",
+ "running": "Ishlamoqda",
+ "save": "Oʻzgarishlarni saqlash",
+ "save_changes": "Oʻzgarishlarni saqlash",
+ "sender_acl_disabled": "Joʻnatuvchi tekshiruvi oʻchirilgan",
+ "shared_aliases": "Umumiy taxallus manzillari",
+ "shared_aliases_desc": "Umumiy taxalluslarga foydalanuvchining maxsus sozlamalari (spam filtri yoki shifrlash siyosati kabi) taʼsir qilmaydi. Mos spam filtrlarini faqat administrator domen boʻyicha siyosat sifatida sozlashi mumkin.",
+ "show_sieve_filters": "Faol foydalanuvchi sieve filtrini koʻrsatish",
+ "sogo_profile_reset": "SOGo profilini tiklash",
+ "sogo_profile_reset_help": "Bu foydalanuvchining SOGo profilini yoʻq qiladi va barcha kontakt va kalendar maʼlumotlarini qaytarib boʻlmas tarzda oʻchiradi.",
+ "sogo_profile_reset_now": "Profilni hozir tiklash",
+ "spam_aliases": "Spam e-pochta taxalluslari",
+ "spam_aliases_info": "Spam taxallusi — bu haqiqiy e-pochta manzillarini himoya qilish uchun ishlatilishi mumkin boʻlgan vaqtinchalik e-pochta manzilidir. Ixtiyoriy ravishda muddat tugash vaqtini belgilash mumkin, shunda taxallus belgilangan davrdan keyin avtomatik oʻchirib qoʻyiladi, suiisteʼmol qilingan yoki tarqalib ketgan manzillarni samarali tarzda chiqarib tashlaydi.",
+ "spam_score_reset": "Server standartiga qaytarish",
+ "spamfilter": "Spam filtri",
+ "spamfilter_behavior": "Baholash",
+ "spamfilter_bl": "Qora roʻyxat",
+ "spamfilter_bl_desc": "Qora roʻyxatdagi e-pochta manzillari har doim spam sifatida tasniflanadi va rad etiladi. Rad etilgan xat karantinga nusxalanmaydi. Joker belgilar ishlatilishi mumkin. Filtr faqat toʻgʻridan-toʻgʻri taxalluslarga (bitta maqsad pochta qutisiga ega taxalluslarga) qoʻllaniladi, hammasini-qabul qilish taxalluslari va pochta qutisining oʻzi istisno qilinadi.",
+ "spamfilter_default_score": "Standart qiymatlar",
+ "spamfilter_green": "Yashil: bu xabar spam emas",
+ "spamfilter_hint": "Birinchi qiymat \"past spam bahosi\"ni tavsiflaydi, ikkinchisi \"yuqori spam bahosi\"ni ifodalaydi.",
+ "spamfilter_red": "Qizil: bu xabar spam va server tomonidan rad etiladi",
+ "spamfilter_table_action": "Amal",
+ "spamfilter_table_add": "Element qoʻshish",
+ "spamfilter_table_domain_policy": "n/a (domen siyosati)",
+ "spamfilter_table_empty": "Koʻrsatish uchun ma'lumot yoʻq",
+ "spamfilter_table_remove": "olib tashlash",
+ "spamfilter_table_rule": "Qoida",
+ "spamfilter_wl": "Oq roʻyxat",
+ "spamfilter_wl_desc": "Oq roʻyxatdagi e-pochta manzillari hech qachon spam sifatida tasniflanmaydi. Joker belgilar ishlatilishi mumkin. Filtr faqat toʻgʻridan-toʻgʻri taxalluslarga (bitta maqsad pochta qutisiga ega taxalluslarga) qoʻllaniladi, hammasini-qabul qilish taxalluslari va pochta qutisining oʻzi istisno qilinadi.",
+ "spamfilter_yellow": "Sariq: bu xabar spam boʻlishi mumkin, spam sifatida belgilanadi va Junk papkangizga koʻchiriladi",
+ "status": "Holat",
+ "sync_jobs": "Sinxronizatsiya vazifalari",
+ "syncjob_check_log": "Jurnalni tekshirish",
+ "syncjob_last_run_result": "Oxirgi ishga tushirilgan natija",
+ "syncjob_EX_OK": "Muvaffaqiyatli",
+ "syncjob_EXIT_CONNECTION_FAILURE": "Ulanish muammosi",
+ "syncjob_EXIT_TLS_FAILURE": "Shifrlangan ulanish bilan muammo",
+ "syncjob_EXIT_AUTHENTICATION_FAILURE": "Autentifikatsiya muammosi",
+ "syncjob_EXIT_OVERQUOTA": "Maqsad pochta qutisi kvotadan oshib ketdi",
+ "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Masofaviy serverga ulanib boʻlmadi",
+ "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Notoʻgʻri foydalanuvchi nomi yoki parol",
+ "tag_handling": "Teglangan xat uchun ishlovni oʻrnatish",
+ "tag_help_example": "Teglangan e-pochta manzili misoli: me+Facebook@example.org",
+ "tag_help_explain": "Subpapkada: tegga qarab nomlangan yangi subpapka INBOX ostida yaratiladi (\"INBOX/Facebook\"). \r\nMavzuda: teg nomi xatning mavzusiga oldindan qoʻshiladi, misol: \"[Facebook] Mening yangiliklarim\".",
+ "tag_in_none": "Hech narsa qilmaslik",
+ "tag_in_subfolder": "Subpapkada",
+ "tag_in_subject": "Mavzuda",
+ "text": "Matn",
+ "tfa_info": "Ikki faktorli autentifikatsiya hisobingizni himoya qilishga yordam beradi. Uni yoqsangiz, ikki faktorli autentifikatsiyani qoʻllab-quvvatlamaydigan ilovalar yoki xizmatlarga (masalan, pochta mijozlari) kirish uchun ilova parollari kerak boʻladi.",
+ "title": "Sarlavha",
+ "tls_enforce_in": "Kiruvchi TLS ni majburlash",
+ "tls_enforce_out": "Chiquvchi TLS ni majburlash",
+ "tls_policy": "Shifrlash siyosati",
+ "tls_policy_warning": "Diqqat: Agar shifrlangan pochta transferini majburlashga qaror qilsangiz, e-pochtalarni yoʻqotishingiz mumkin. Siyosatga mos kelmaydigan xabarlar pochta tizimi tomonidan qatʼiy muvaffaqiyatsizlik bilan qaytariladi. Bu variant sizning asosiy e-pochta manzilingiz (kirish nomingiz), taxallus domenlaridan olingan barcha manzillar va faqat ushbu pochta qutisi maqsad sifatida boʻlgan taxallus manzillariga qoʻllaniladi.",
+ "user_settings": "Foydalanuvchi sozlamalari",
+ "username": "Foydalanuvchi nomi",
+ "value": "Qiymat",
+ "verify": "Tasdiqlash",
+ "waiting": "Kutilmoqda",
+ "week": "hafta",
+ "weekly": "Haftalik",
+ "weeks": "hafta",
+ "with_app_password": "ilova paroli bilan",
+ "year": "yil",
+ "years": "yil"
+ },
+ "warning": {
+ "cannot_delete_self": "Tizimga kirgan foydalanuvchini oʻchirib boʻlmaydi",
+ "domain_added_sogo_failed": "Domen qoʻshildi, ammo SOGoni qayta ishga tushirib boʻlmadi, iltimos server jurnallaringizni tekshiring.",
+ "dovecot_restart_failed": "Dovecot qayta ishga tushirib boʻlmadi, iltimos jurnallarni tekshiring",
+ "fuzzy_learn_error": "Fuzzy hash oʻrgatish xatosi: %s",
+ "hash_not_found": "Hash topilmadi yoki allaqachon oʻchirilgan",
+ "ip_invalid": "Notoʻgʻri IP oʻtkazib yuborildi: %s",
+ "is_not_primary_alias": "Asosiy boʻlmagan taxallus oʻtkazib yuborildi: %s",
+ "no_active_admin": "Oxirgi faol administratorni oʻchirib boʻlmaydi",
+ "quota_exceeded_scope": "Domen kvotasi oshib ketdi: Bu domen doirasida faqat cheksiz pochta qutilari yaratilishi mumkin.",
+ "session_token": "Forma tokeni noto'g'ri: Token mos kelmadi",
+ "session_ua": "Forma tokeni noto'g'ri: User-Agent tekshiruvi xatosi"
+ }
+}
From 104af5862889dcadfd51c354d55dfbdeea47ace6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 14 May 2026 18:33:03 +0000
Subject: [PATCH 020/123] Update dependency php/pecl-mail-mailparse to v3.2.0
Signed-off-by: milkmaker
---
data/Dockerfiles/phpfpm/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile
index 7917d7f7..a23a0425 100644
--- a/data/Dockerfiles/phpfpm/Dockerfile
+++ b/data/Dockerfiles/phpfpm/Dockerfile
@@ -7,7 +7,7 @@ ARG APCU_PECL_VERSION=5.1.28
# renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced extractVersion=(?.*)$
ARG IMAGICK_PECL_VERSION=3.8.1
# renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?.*)$
-ARG MAILPARSE_PECL_VERSION=3.1.9
+ARG MAILPARSE_PECL_VERSION=3.2.0
# renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced extractVersion=^v(?.*)$
ARG MEMCACHED_PECL_VERSION=3.4.0
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?.*)$
From 07373907e3722fe15d31e68d93a281f92d344400 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 18 May 2026 08:38:18 +0200
Subject: [PATCH 021/123] Update devops-infra/action-pull-request action to
v1.1.1 (#7234)
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index 548fabde..d0f8ccf7 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.0.2
+ uses: devops-infra/action-pull-request@v1.1.1
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From f553f38635bc87ef6a2f00e3a39a04b82599aa30 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Wed, 20 May 2026 17:24:41 +0200
Subject: [PATCH 022/123] [Nginx] Update to 1.30.1
---
data/Dockerfiles/nginx/Dockerfile | 2 +-
docker-compose.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/Dockerfiles/nginx/Dockerfile b/data/Dockerfiles/nginx/Dockerfile
index 7d2ce34f..b8746684 100644
--- a/data/Dockerfiles/nginx/Dockerfile
+++ b/data/Dockerfiles/nginx/Dockerfile
@@ -1,4 +1,4 @@
-FROM nginx:alpine
+FROM nginx:1.30.1-alpine
LABEL maintainer "The Infrastructure Company GmbH "
ENV PIP_BREAK_SYSTEM_PACKAGES=1
diff --git a/docker-compose.yml b/docker-compose.yml
index 90e5518d..eab23c8a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -419,7 +419,7 @@ services:
- php-fpm-mailcow
- sogo-mailcow
- rspamd-mailcow
- image: ghcr.io/mailcow/nginx:1.06
+ image: ghcr.io/mailcow/nginx:1.30.1-1
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
From cbd3d8b9bcb9772642bdc65111a4e615a8d8ee27 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Wed, 20 May 2026 17:53:47 +0200
Subject: [PATCH 023/123] escape HTML in quarantine table
---
data/web/js/site/quarantine.js | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/data/web/js/site/quarantine.js b/data/web/js/site/quarantine.js
index 8334ff50..a9b7845b 100644
--- a/data/web/js/site/quarantine.js
+++ b/data/web/js/site/quarantine.js
@@ -102,18 +102,21 @@ jQuery(function($){
{
title: 'ID',
data: 'id',
- defaultContent: ''
+ defaultContent: '',
+ render: $.fn.dataTable.render.text()
},
{
title: lang.qid,
data: 'qid',
- defaultContent: ''
+ defaultContent: '',
+ render: $.fn.dataTable.render.text()
},
{
title: lang.sender,
data: 'sender',
className: 'senders-mw220',
- defaultContent: ''
+ defaultContent: '',
+ render: $.fn.dataTable.render.text()
},
{
title: lang.subj,
@@ -128,7 +131,8 @@ jQuery(function($){
{
title: lang.rcpt,
data: 'rcpt',
- defaultContent: ''
+ defaultContent: '',
+ render: $.fn.dataTable.render.text()
},
{
title: lang.danger,
From da586682f64631bd683c4d07e24665bd85168554 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 21 May 2026 10:04:58 +0200
Subject: [PATCH 024/123] Update actions/stale action to v10.3.0 (#7242)
Signed-off-by: milkmaker
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/close_old_issues_and_prs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/close_old_issues_and_prs.yml b/.github/workflows/close_old_issues_and_prs.yml
index e55b2706..855684df 100644
--- a/.github/workflows/close_old_issues_and_prs.yml
+++ b/.github/workflows/close_old_issues_and_prs.yml
@@ -14,7 +14,7 @@ jobs:
pull-requests: write
steps:
- name: Mark/Close Stale Issues and Pull Requests 🗑️
- uses: actions/stale@v10.2.0
+ uses: actions/stale@v10.3.0
with:
repo-token: ${{ secrets.STALE_ACTION_PAT }}
days-before-stale: 60
From 4f2348631a8cc3791e6168acfb09e2e2d61ac0a2 Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Thu, 21 May 2026 17:16:34 +0200
Subject: [PATCH 025/123] [Web] Updated lang.pl-pl.json (#7245)
Co-authored-by: Adrian-Kozien
---
data/web/lang/lang.pl-pl.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/web/lang/lang.pl-pl.json b/data/web/lang/lang.pl-pl.json
index b1ec3591..de3557c0 100644
--- a/data/web/lang/lang.pl-pl.json
+++ b/data/web/lang/lang.pl-pl.json
@@ -189,7 +189,7 @@
"api_info": "API jest w trakcie prac. Dokumentację można znaleźć pod adresem /api",
"api_key": "klucz API",
"api_read_only": "Dostęp tylko do odczytu",
- "api_read_write": "Dostęp tylko do odczytu",
+ "api_read_write": "Dostęp do odczytu i zapisu",
"api_skip_ip_check": "Pomiń sprawdzenie IP dla API",
"app_hide": "Ukryj dla logowania",
"app_links": "Linki aplikacji",
From aed440bcb3b33308b48f81ded97443f5b1d6ea1f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 21 May 2026 21:09:43 +0200
Subject: [PATCH 026/123] Update devops-infra/action-pull-request action to
v1.1.2 (#7247)
Signed-off-by: milkmaker
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index d0f8ccf7..f9ccc0fd 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.1.1
+ uses: devops-infra/action-pull-request@v1.1.2
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From 7d17715e2e8081cac5167f144142d05155974377 Mon Sep 17 00:00:00 2001
From: SYNLINQ <69972447+SYNLINQ@users.noreply.github.com>
Date: Fri, 22 May 2026 16:26:47 +0200
Subject: [PATCH 027/123] Update Dockerfile
install unbound package from alpine:edge
---
data/Dockerfiles/unbound/Dockerfile | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/data/Dockerfiles/unbound/Dockerfile b/data/Dockerfiles/unbound/Dockerfile
index 7c492138..b1ec99e4 100644
--- a/data/Dockerfiles/unbound/Dockerfile
+++ b/data/Dockerfiles/unbound/Dockerfile
@@ -2,11 +2,14 @@ FROM alpine:3.23
LABEL maintainer = "The Infrastructure Company GmbH "
+# install unbound from alpine:edge to get security patches
+RUN apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/main unbound
+
+# install other packages from regular alpine stable repo
RUN apk add --update --no-cache \
curl \
bind-tools \
coreutils \
- unbound \
bash \
openssl \
drill \
From efc2e761597b25d46ce1c51ad5b6b9c03afdb80d Mon Sep 17 00:00:00 2001
From: SYNLINQ <69972447+SYNLINQ@users.noreply.github.com>
Date: Fri, 22 May 2026 16:27:43 +0200
Subject: [PATCH 028/123] Update docker-compose.yml
bump unbound version
---
docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index eab23c8a..52fa15ec 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
services:
unbound-mailcow:
- image: ghcr.io/mailcow/unbound:1.25
+ image: ghcr.io/mailcow/unbound:1.25.1
environment:
- TZ=${TZ}
- SKIP_UNBOUND_HEALTHCHECK=${SKIP_UNBOUND_HEALTHCHECK:-n}
From ce3ceaf5b8fd57197f43c4e27400a36130b3b399 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 23 May 2026 08:36:46 +0200
Subject: [PATCH 029/123] Update devops-infra/action-pull-request action to
v1.1.3 (#7253)
Signed-off-by: milkmaker
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index f9ccc0fd..9ed6be38 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.1.2
+ uses: devops-infra/action-pull-request@v1.1.3
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From e6fa0c5099aa0c39f91c04807695b09afb4aa6a0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 23 May 2026 22:10:51 +0200
Subject: [PATCH 030/123] Update devops-infra/action-pull-request action to
v1.2.0 (#7254)
Signed-off-by: milkmaker
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index 9ed6be38..a3ea5d80 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.1.3
+ uses: devops-infra/action-pull-request@v1.2.0
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From ffbc37a00c0245a5ad6aa87d8aa34f677da698c5 Mon Sep 17 00:00:00 2001
From: Michael Kuron <1748330+mkuron@users.noreply.github.com>
Date: Sat, 2 May 2026 16:24:01 +0200
Subject: [PATCH 031/123] Escape generated password in mobileconfig
Escape ampersand, less than, greater than to avoid generating invalid XML.
Fixes #7171
---
data/web/mobileconfig.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/data/web/mobileconfig.php b/data/web/mobileconfig.php
index 7c0ead7f..c57c4885 100644
--- a/data/web/mobileconfig.php
+++ b/data/web/mobileconfig.php
@@ -65,6 +65,7 @@ if (isset($_GET['app_password'])) {
$attr['protocols'][] = 'dav_access';
}
app_passwd("add", $attr);
+ $password = htmlspecialchars($password, ENT_NOQUOTES);
} else {
$app_password = false;
}
From db4e3b4d5405c5a594d5aed8f37cfe0151e50a28 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Tue, 26 May 2026 10:36:39 +0200
Subject: [PATCH 032/123] [Nginx] Update to 1.30.2
---
data/Dockerfiles/nginx/Dockerfile | 2 +-
docker-compose.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/Dockerfiles/nginx/Dockerfile b/data/Dockerfiles/nginx/Dockerfile
index b8746684..30297362 100644
--- a/data/Dockerfiles/nginx/Dockerfile
+++ b/data/Dockerfiles/nginx/Dockerfile
@@ -1,4 +1,4 @@
-FROM nginx:1.30.1-alpine
+FROM nginx:1.30.2-alpine
LABEL maintainer "The Infrastructure Company GmbH "
ENV PIP_BREAK_SYSTEM_PACKAGES=1
diff --git a/docker-compose.yml b/docker-compose.yml
index eab23c8a..af15a246 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -419,7 +419,7 @@ services:
- php-fpm-mailcow
- sogo-mailcow
- rspamd-mailcow
- image: ghcr.io/mailcow/nginx:1.30.1-1
+ image: ghcr.io/mailcow/nginx:1.30.2-1
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
From faac56a6110f315288cb3f420412f380efc9c8a0 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Tue, 26 May 2026 10:43:25 +0200
Subject: [PATCH 033/123] [Unbound] Change version tag
---
docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index ebf203ae..615e19f5 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
services:
unbound-mailcow:
- image: ghcr.io/mailcow/unbound:1.25.1
+ image: ghcr.io/mailcow/unbound:1.25.1-1
environment:
- TZ=${TZ}
- SKIP_UNBOUND_HEALTHCHECK=${SKIP_UNBOUND_HEALTHCHECK:-n}
From a7f2b2145f49ac09531a87a18489fd66ebaef06b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 26 May 2026 22:00:43 +0200
Subject: [PATCH 034/123] Update devops-infra/action-pull-request action to
v1.2.1 (#7258)
Signed-off-by: milkmaker
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index a3ea5d80..0b0738e9 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.2.0
+ uses: devops-infra/action-pull-request@v1.2.1
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From eac1bf02fc9042eb3d3b5d7b198443927ceb9a57 Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Tue, 26 May 2026 22:02:05 +0200
Subject: [PATCH 035/123] [Web] Updated lang.lv-lv.json (#7262)
Co-authored-by: Edgars Andersons
---
data/web/lang/lang.lv-lv.json | 58 ++++++++++++++++++++++++-----------
1 file changed, 40 insertions(+), 18 deletions(-)
diff --git a/data/web/lang/lang.lv-lv.json b/data/web/lang/lang.lv-lv.json
index fd29e594..df169728 100644
--- a/data/web/lang/lang.lv-lv.json
+++ b/data/web/lang/lang.lv-lv.json
@@ -13,7 +13,7 @@
"domain_relayhost": "Mainīt domēna relayhost",
"eas_reset": "EAS ierīču atiestatīšana",
"extend_sender_acl": "Ļauj paplašināt sūtītāja ACL ar ārējām adresēm",
- "login_as": "Pieteikšanās kā pastkastes lietotājam",
+ "login_as": "Pieteikties kā pastkastes lietotājam",
"mailbox_relayhost": "Pasta kastītes relayhost maiņa",
"prohibited": "Aizliegts ar ACL",
"protocol_access": "Protokola piekļuves maiņa",
@@ -91,12 +91,12 @@
"activate_api": "Aktivizēt API",
"active": "Aktīvs",
"add": "Pievienot",
- "add_domain_admin": "Pievienot domēna administratoru",
+ "add_domain_admin": "Pievienot domēna pārvaldītāju",
"add_forwarding_host": "Pievienot pāradresācijas hostu",
"add_relayhost": "Pievienot Relayhost",
"add_row": "Pievienot rindu",
- "admin": "Administrators",
- "admin_details": "Labot administratora detaļas",
+ "admin": "Pārvaldītājs",
+ "admin_details": "Labot informāciju par pārvaldītāju",
"admin_domains": "Domēna uzdevumi",
"api_allow_from": "Atļaut API piekļuvi no šīm IP",
"api_key": "API atslēga",
@@ -114,7 +114,7 @@
"dkim_keys": "ARC/DKIM atslēgas",
"dkim_private_key": "Privāta atslēga",
"domain": "Domēns",
- "domain_admins": "Domēna administratori",
+ "domain_admins": "Domēna pārvaldītāji",
"edit": "Labot",
"empty": "Nav iznākuma",
"f2b_ban_time": "Aizlieguma laiks (s)",
@@ -188,7 +188,14 @@
"quarantine_max_score": "Atmest paziņojumu, ja e-pasta ziņojuma mēstuļu novērtējums ir augstāks par šo vērtību: Noklusējums ir 9999.0",
"options": "Iespējas",
"password_reset_settings": "Paroļu atkopes iestatījumi",
- "password_settings": "Paroļu iestatījumi"
+ "password_settings": "Paroļu iestatījumi",
+ "add_admin": "Pievienot pārvaldītāju",
+ "admins": "Pārvaldītāji",
+ "admins_ldap": "LDAP pārvaldītāji",
+ "admin_quicklink": "Paslēpt ātro saiti uz pārvaldītāju pieteikšanās lapu",
+ "domain_admin": "Domēna pārvaldītājs",
+ "domainadmin_quicklink": "Paslēpt ātro saiti uz domēna pārvaldītāju pieteikšanās lapu",
+ "user_quicklink": "Paslēpt ātro saiti uz lietotāju pieteikšanās lapu"
},
"danger": {
"access_denied": "Piekļuve liegta, vai nepareizi dati",
@@ -244,7 +251,10 @@
"app_passwd_id_invalid": "Lietotnes paroles Id %s ir nederīgs",
"img_dimensions_exceeded": "Attēls pārsniedz lielāko pieļaujamo attēla lielumu",
"img_size_exceeded": "Attēls pārsniedz lielāko pieļaujamo datnes lielumu",
- "version_invalid": "Versija %s ir nederīga"
+ "version_invalid": "Versija %s ir nederīga",
+ "generic_server_error": "Atgadījās neparedzēta servera kļūda. Lūgums sazināties ar pārvaldītāju.",
+ "password_reset_na": "Paroļu atkope šobrīd nav pieejama. Lūgums sazināties ar pārvaldītāju.",
+ "recovery_email_failed": "Nevarēja nosūtīt atkopes e-pasta ziņojumu. Lūgums sazināties ar pārvaldītāju."
},
"diagnostics": {
"cname_from_a": "Vērtība, kas iegūta no A/AAAA ieraksta. Tas tiek atbalstīts tik ilgi, kamēr ieraksts norāda uz pareizo resursu.",
@@ -266,7 +276,7 @@
"delete2duplicates": "Izdzēst atkārtojošos vienumus galamērķī",
"description": "Apraksts",
"domain": "Labot domēnu",
- "domain_admin": "Labot domēna administratoru",
+ "domain_admin": "Labot domēna pārvaldītāju",
"domain_quota": "Domēna kvota",
"domains": "Domēni",
"dont_check_sender_acl": "Atspējot sūtītāju pārbaudi domēnam %s (+ aizstājdomēni)",
@@ -329,7 +339,8 @@
"app_passwd": "Lietotnes parole",
"mta_sts_version": "Versija",
"mta_sts_version_info": "Norāda MTA-STS standarta versiju – pašreiz ir derīga tikai STSv1.",
- "sender_acl_disabled": "Sūtītāja pārbaude ir atspējota"
+ "sender_acl_disabled": "Sūtītāja pārbaude ir atspējota",
+ "admin": "Labot pārvaldītāju"
},
"footer": {
"cancel": "Atcelt",
@@ -362,7 +373,14 @@
"username": "Lietotājvārds",
"fido2_webauthn": "FIDO/WebAuthn pieteikšanās",
"mobileconfig_info": "Lūgums pieteikties kā pastkastes lietotājam, lai lejupielādētu pieprasīto Apple savienojuma profilu.",
- "other_logins": "vai pieslēgties ar"
+ "other_logins": "vai pieteikties ar",
+ "forgot_password": "> Aizmirsta parole?",
+ "login_linkstext": "Nepareiza pieteikšanās?",
+ "login_domainadmintext": "Pieteikties kā domēna pārvaldītājam",
+ "login_admintext": "Pieteikties kā pārvaldītājam",
+ "login_user": "Lietotu pieteikšanās",
+ "login_dadmin": "Domēna pārvaldītāju pieteikšanās",
+ "login_admin": "Pārvaldītāju pieteikšanās"
},
"mailbox": {
"action": "Rīcība",
@@ -397,7 +415,7 @@
"description": "Apraksts",
"dkim_key_length": "DKIM atslēgas garums (bits)",
"domain": "Domēns",
- "domain_admins": "Domēna administratori",
+ "domain_admins": "Domēna pārvaldītāji",
"domain_aliases": "Domēna aizstājvārdi",
"domain_quota": "Kvota",
"domain_quota_total": "Kopējais domēna ierobežojums",
@@ -507,7 +525,7 @@
"imap_smtp_server_auth_info": "Lūgums izmantot pilnu e-pasta adresi un PLAIN autentificēšanās mehānismu. \nPieteikšanās dati tiks šifrēti ar servera puses obligātu šifrēšanu."
},
"success": {
- "admin_modified": "Izmaiņas administrātoram ir saglabātas",
+ "admin_modified": "Pārvaldītāja izmaiņas tika saglabātas",
"alias_added": "Aizstājadrese %s (%d) tika pievienota",
"alias_domain_removed": "Aizstājdomēns %s tika noņemts",
"alias_modified": "Aizstājadreses izmaiņas %s tika saglabātas",
@@ -518,9 +536,9 @@
"dkim_added": "DKIM atslēga saglabāta",
"dkim_removed": "DKIM atslēga %s ir noņemta",
"domain_added": "Pievienots domēns %s",
- "domain_admin_added": "Domēna administrātors %s pievienots",
- "domain_admin_modified": "Izmaiņas domēna administrātoram %s ir saglabātas",
- "domain_admin_removed": "Domēna administrators %s tika noņemts",
+ "domain_admin_added": "Tika pievienots domēna pārvaldītājs %s",
+ "domain_admin_modified": "Domēna pārvaldītāja %s izmaiņas tika saglabātas",
+ "domain_admin_removed": "Tika noņemts domēna pārvaldītājs %s",
"domain_modified": "Izmaiņas domēnam %s ir saglabātas",
"domain_removed": "Domēns %s ir noņemts",
"eas_reset": "ActiveSync ierīces priekš lietotāja %s tika atiestatītas",
@@ -548,7 +566,9 @@
"verified_yotp_login": "Apliecināta Yubico OTP pieteikšanās",
"app_passwd_removed": "Noņemta lietotnes parole ar Id %s",
"app_passwd_added": "Pievienota jauna lietotnes parole",
- "f2b_banlist_refreshed": "Liegumu saraksta Id tika sekmīgi atsvaidzināts."
+ "f2b_banlist_refreshed": "Liegumu saraksta Id tika sekmīgi atsvaidzināts.",
+ "admin_added": "Tika pievienots pārvaldītājs %s",
+ "admin_removed": "Tika noņemts pārvaldītājs %s"
},
"tfa": {
"api_register": "%s izmanto Yubico Cloud API. Lūdzu iegūstiet API atslēgu priekš Jūsu atslēgashere",
@@ -569,7 +589,8 @@
"waiting_usb_auth": "Gaida USB ierīci...
Lūdzu, tagad nospiežiet pogu uz Jūsu WebAuthn USB ierīces.",
"waiting_usb_register": "Gaida USB ierīci...
Lūgums augstāk ievadīt savu paroli un apstiprināt reģistrēšanos ar USB ierīces pogas nospiešanu.",
"yubi_otp": "Yubico OTP autentifikators",
- "authenticators": "Autentificētāji"
+ "authenticators": "Autentificētāji",
+ "u2f_deprecated_important": "Lūgums reģistrēt savu atslēgu pārvaldības lapā ar jauno WebAuthn veidu."
},
"user": {
"action": "Rīcība",
@@ -701,7 +722,8 @@
"warning": {
"domain_added_sogo_failed": "Domēns pievienots, bet neizdevās pārsāknēt SOGO. Lūgums pārbaudīt servera žurnālus.",
"dovecot_restart_failed": "Dovecot neizdevās pārsāknēties. Lūgums pārbaudīt žurnālus",
- "is_not_primary_alias": "Izlaists aizstājvārds %s, kas nav galvenais"
+ "is_not_primary_alias": "Izlaists aizstājvārds %s, kas nav galvenais",
+ "no_active_admin": "Nevar deaktivēt pēdējo aktīvo pārvaldītāju"
},
"oauth2": {
"access_denied": "Lūgums pieteikties kā pastkastes īpašniekam, lai nodrošinātu piekļuvi ar OAuth2."
From 3fcda21c4ec798d47e8e753c253401b7d1f712ec Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Wed, 27 May 2026 17:46:42 +0200
Subject: [PATCH 036/123] [Web] Updated lang.vi-vn.json (#7263)
Co-authored-by: Phu D. Nguyen
---
data/web/lang/lang.vi-vn.json | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/data/web/lang/lang.vi-vn.json b/data/web/lang/lang.vi-vn.json
index 523b5dca..42813fd2 100644
--- a/data/web/lang/lang.vi-vn.json
+++ b/data/web/lang/lang.vi-vn.json
@@ -268,10 +268,10 @@
"includes": "Bao gồm những người nhận này",
"ip_check": "Kiểm tra IP",
"ip_check_disabled": "Kiểm tra IP đã bị vô hiệu hóa. Bạn có thể bật nó trong Hệ thống > Cấu hình > Tùy chọn > Tùy chỉnh",
- "ip_check_opt_in": "Chọn tham gia sử dụng dịch vụ bên thứ ba ipv4.mailcow.email và ipv6.mailcow.email để phân giải địa chỉ IP bên ngoài.",
+ "ip_check_opt_in": "Đăng ký tham gia sử dụng dịch vụ bên thứ ba dùng ipv4.mailcow.email và ipv6.mailcow.email để phân giải địa chỉ IP bên ngoài.",
"is_mx_based": "Dựa trên MX",
"last_applied": "Áp dụng lần cuối",
- "license_info": "Giấy phép không bắt buộc nhưng giúp phát triển thêm. Đăng ký GUID của bạn tại đây hoặc mua hỗ trợ cho cài đặt mailcow của bạn.",
+ "license_info": "Giấy phép tuy không bắt buộc nhưng giúp phát triển thêm. Đăng ký GUID của bạn tại đây hoặc mua hỗ trợ cho cài đặt mailcow của bạn.",
"link": "Liên kết",
"loading": "Vui lòng đợi...",
"login_time": "Thời gian đăng nhập",
@@ -556,7 +556,9 @@
"validity_missing": "Vui lòng gán thời hạn hiệu lực",
"value_missing": "Vui lòng cung cấp tất cả các giá trị",
"version_invalid": "Phiên bản %s không hợp lệ",
- "yotp_verification_failed": "Xác thực Yubico OTP thất bại: %s"
+ "yotp_verification_failed": "Xác thực Yubico OTP thất bại: %s",
+ "tfa_removal_blocked": "Xác thực hai yếu tố không thể bị xóa vì đây là yêu cầu bắt buộc đối với tài khoản của bạn.",
+ "quarantine_category_invalid": "Danh mục cách ly phải là một trong các loại sau : add_header, reject, all."
},
"datatables": {
"collapse_all": "Thu gọn tất cả",
@@ -579,7 +581,9 @@
"aria": {
"sortAscending": ": kích hoạt để sắp xếp cột tăng dần",
"sortDescending": ": kích hoạt để sắp xếp cột giảm dần"
- }
+ },
+ "decimal": ".",
+ "thousands": ","
},
"debug": {
"architecture": "Kiến trúc",
@@ -693,6 +697,19 @@
"internal_info": "Bí danh nội bộ chỉ có thể truy cập từ tên miền sở hữu hoặc tên miền bí danh.",
"kind": "Loại",
"last_modified": "Sửa đổi lần cuối",
- "lookup_mx": "Đích là một biểu thức chính quy để khớp với tên MX (.*.google.com để định tuyến tất cả thư nhắm đến MX kết thúc bằng google.com qua bước nhảy này)"
+ "lookup_mx": "Đích là một biểu thức chính quy để khớp với tên MX (.*.google.com để định tuyến tất cả thư nhắm đến MX kết thúc bằng google.com qua bước nhảy này)",
+ "sender_allowed": "Cho phép gửi đi bằng bí danh",
+ "sender_allowed_info": "Nếu bị vô hiệu hóa, bí danh này chỉ có thể nhận thư. Sử dụng ACL của người gửi để ghi đè và cấp quyền gửi cho các hộp thư cụ thể.",
+ "mailbox": "Chỉnh sửa hộp thư",
+ "mailbox_quota_def": "Hạn mức hộp thư mặc định",
+ "mailbox_relayhost_info": "Chỉ áp dụng cho hộp thư và các bí danh trực tiếp, thao tác này sẽ ghi đè lên máy chủ chuyển tiếp tên miền.",
+ "mailbox_rename": "Đổi tên hộp thư",
+ "mailbox_rename_agree": "Tôi đã tạo bản sao lưu.",
+ "mailbox_rename_warning": "QUAN TRỌNG! Hãy tạo bản sao lưu trước khi đổi tên hộp thư.",
+ "mailbox_rename_alias": "Tạo tự động bí danh",
+ "mailbox_rename_title": "Tên mới của hộp thư cục bộ",
+ "max_aliases": "Số lượng Bí danh tối đa",
+ "max_mailboxes": "Số lượng hộp thư tối đa có thể có",
+ "max_quota": "Dung lượng tối đa cho mỗi hộp thư (MiB)"
}
}
From 175878f8f1808103bc487717f2f23467c1455826 Mon Sep 17 00:00:00 2001
From: goodygh <101992094+goodygh@users.noreply.github.com>
Date: Thu, 28 May 2026 22:20:26 +0200
Subject: [PATCH 037/123] ui, fail2ban fix german ban_list_info translation
(#7265)
---
data/web/lang/lang.de-de.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json
index 3672762d..17277a03 100644
--- a/data/web/lang/lang.de-de.json
+++ b/data/web/lang/lang.de-de.json
@@ -150,7 +150,7 @@
"arrival_time": "Ankunftszeit (Serverzeit)",
"authed_user": "Auth. Benutzer",
"ays": "Soll der Vorgang wirklich ausgeführt werden?",
- "ban_list_info": "Übersicht ausgesperrter Netzwerke: Netzwerk (verbleibende Bannzeit) - [Aktionen]. IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden. Rote Labels sind Indikatoren für aktive Allowlist-Einträge.",
+ "ban_list_info": "Übersicht ausgesperrter Netzwerke: Netzwerk (verbleibende Bannzeit) - [Aktionen]. IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden. Rote Labels kennzeichnen aktive permanente Sperren durch Denylisting.",
"change_logo": "Logo ändern",
"configuration": "Konfiguration",
"convert_html_to_text": "Konvertiere HTML zu reinem Text",
From 23e4e4f3739549d43a8f7ea3ae1bc03874c775aa Mon Sep 17 00:00:00 2001
From: goodygh <101992094+goodygh@users.noreply.github.com>
Date: Fri, 29 May 2026 01:39:38 +0200
Subject: [PATCH 038/123] [SOGo] Update to 5.12.9
---
data/Dockerfiles/sogo/Dockerfile | 6 +++---
docker-compose.yml | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile
index 1c728720..b4b401e8 100644
--- a/data/Dockerfiles/sogo/Dockerfile
+++ b/data/Dockerfiles/sogo/Dockerfile
@@ -1,6 +1,6 @@
# SOGo built from source to enable security patch application
# Repository: https://github.com/Alinto/sogo
-# Version: SOGo-5.12.8
+# Version: SOGo-5.12.9
#
# Applied security patches:
# -
@@ -12,8 +12,8 @@ FROM debian:bookworm
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG SOGO_VERSION=SOGo-5.12.8
-ARG SOPE_VERSION=SOPE-5.12.8
+ARG SOGO_VERSION=SOGo-5.12.9
+ARG SOPE_VERSION=SOPE-5.12.9
# Security patches to apply (space-separated commit hashes)
ARG SOGO_SECURITY_PATCHES=""
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?.*)$
diff --git a/docker-compose.yml b/docker-compose.yml
index 615e19f5..4da149d7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -200,7 +200,7 @@ services:
- phpfpm
sogo-mailcow:
- image: ghcr.io/mailcow/sogo:5.12.8-1
+ image: ghcr.io/mailcow/sogo:5.12.9-1
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
From 843db5854c2dd9d85f89cd35cde6361f43d9a999 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 4 Jun 2026 11:04:42 +0000
Subject: [PATCH 039/123] Update dependency composer/composer to v2.10.1
Signed-off-by: milkmaker
---
data/Dockerfiles/phpfpm/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile
index 7917d7f7..9181374a 100644
--- a/data/Dockerfiles/phpfpm/Dockerfile
+++ b/data/Dockerfiles/phpfpm/Dockerfile
@@ -13,7 +13,7 @@ ARG MEMCACHED_PECL_VERSION=3.4.0
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?.*)$
ARG REDIS_PECL_VERSION=6.3.0
# renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced extractVersion=(?.*)$
-ARG COMPOSER_VERSION=2.9.5
+ARG COMPOSER_VERSION=2.10.1
RUN apk add -U --no-cache autoconf \
aspell-dev \
From 0fafda696bc9ee997e3c2a368b28f4600037aaca Mon Sep 17 00:00:00 2001
From: Snafu
Date: Sun, 7 Jun 2026 16:42:47 +0200
Subject: [PATCH 040/123] Fix force_tfa not available in mailbox template #7216
---
data/web/api/openapi.yaml | 14 +++++++++++++-
data/web/inc/functions.mailbox.inc.php | 1 +
data/web/js/site/mailbox.js | 11 +++++++++++
data/web/lang/lang.en-gb.json | 1 +
data/web/templates/edit/mailbox-templates.twig | 9 +++++++++
5 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/data/web/api/openapi.yaml b/data/web/api/openapi.yaml
index cf54f6ad..77c58b60 100644
--- a/data/web/api/openapi.yaml
+++ b/data/web/api/openapi.yaml
@@ -1072,6 +1072,7 @@ paths:
password2: "*"
quota: "3072"
force_pw_update: "1"
+ force_tfa: "1"
tls_enforce_in: "1"
tls_enforce_out: "1"
tags: ["tag1", "tag2"]
@@ -1118,6 +1119,7 @@ paths:
password2: atedismonsin
quota: "3072"
force_pw_update: "1"
+ force_tfa: "1"
tls_enforce_in: "1"
tls_enforce_out: "1"
tags: ["tag1", "tag2"]
@@ -1151,6 +1153,9 @@ paths:
force_pw_update:
description: forces the user to update its password on first login
type: boolean
+ force_tfa:
+ description: force 2FA enrollment at login
+ type: boolean
tls_enforce_in:
description: force inbound email tls encryption
type: boolean
@@ -2510,7 +2515,7 @@ paths:
description: >-
Using this endpoint you can perform actions on quarantine items. It is possible to release
emails from quarantine into to the inbox, or learn them as ham to improve Rspamd filtering.
- You must provide the quarantine item IDs. You can get the IDs using the GET method.
+ You must provide the quarantine item IDs. You can get the IDs using the GET method.
operationId: Edit mails in Quarantine
requestBody:
content:
@@ -3414,6 +3419,7 @@ paths:
- mailbox
- active: "1"
force_pw_update: "0"
+ force_tfa: "0"
name: Full name
password: "*"
password2: "*"
@@ -3464,6 +3470,7 @@ paths:
attr:
active: "1"
force_pw_update: "0"
+ force_tfa: "0"
name: Full name
authsource: mailcow
password: ""
@@ -3487,6 +3494,9 @@ paths:
force_pw_update:
description: force user to change password on next login
type: boolean
+ force_tfa:
+ description: force 2FA enrollment at login
+ type: boolean
name:
description: Full name of the mailbox user
type: string
@@ -4881,6 +4891,7 @@ paths:
- active: "1"
attributes:
force_pw_update: "0"
+ force_tfa: "0"
mailbox_format: "maildir:"
quarantine_notification: never
sogo_access: "1"
@@ -5805,6 +5816,7 @@ paths:
- active: "1"
attributes:
force_pw_update: "0"
+ force_tfa: "0"
mailbox_format: "maildir:"
quarantine_notification: never
sogo_access: "1"
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index adb330ea..b6d683e1 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -3828,6 +3828,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$attr["rl_frame"] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : $is_now['rl_frame'];
$attr["rl_value"] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : $is_now['rl_value'];
$attr["force_pw_update"] = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : $is_now['force_pw_update'];
+ $attr["force_tfa"] = isset($_data['force_tfa']) ? intval($_data['force_tfa']) : $is_now['force_tfa'];
$attr["sogo_access"] = isset($_data['sogo_access']) ? intval($_data['sogo_access']) : $is_now['sogo_access'];
$attr["active"] = isset($_data['active']) ? intval($_data['active']) : $is_now['active'];
$attr["tls_enforce_in"] = isset($_data['tls_enforce_in']) ? intval($_data['tls_enforce_in']) : $is_now['tls_enforce_in'];
diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js
index e8edb994..0a019279 100644
--- a/data/web/js/site/mailbox.js
+++ b/data/web/js/site/mailbox.js
@@ -424,6 +424,11 @@ $(document).ready(function() {
} else {
$('#force_pw_update').prop('checked', false);
}
+ if (template.force_tfa == 1){
+ $('#force_tfa').prop('checked', true);
+ } else {
+ $('#force_tfa').prop('checked', false);
+ }
if (template.sogo_access == 1){
$('#sogo_access').prop('checked', true);
} else {
@@ -1242,6 +1247,7 @@ jQuery(function($){
item.attributes.eas_access = '' + (item.attributes.eas_access == 1 ? '1' : '0') + '';
item.attributes.dav_access = '' + (item.attributes.dav_access == 1 ? '1' : '0') + '';
item.attributes.sogo_access = '' + (item.attributes.sogo_access == 1 ? '1' : '0') + '';
+ item.attributes.force_tfa = '' + (item.attributes.force_tfa == 1 ? '1' : '0') + '';
if (item.attributes.quarantine_notification === 'never') {
item.attributes.quarantine_notification = lang.never;
} else if (item.attributes.quarantine_notification === 'hourly') {
@@ -1385,6 +1391,11 @@ jQuery(function($){
return 1==data?'':'';
}
},
+ {
+ title: lang.force_tfa,
+ data: 'attributes.force_tfa',
+ defaultContent: ''
+ },
{
title: lang_edit.ratelimit,
data: 'attributes.ratelimit',
diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json
index e786bcbe..d2412fbf 100644
--- a/data/web/lang/lang.en-gb.json
+++ b/data/web/lang/lang.en-gb.json
@@ -929,6 +929,7 @@
"filters": "Filters",
"fname": "Full name",
"force_pw_update": "Force password update at next login",
+ "force_tfa": "TFA",
"gal": "Global Address List",
"goto_ham": "Learn as ham",
"goto_spam": "Learn as spam",
diff --git a/data/web/templates/edit/mailbox-templates.twig b/data/web/templates/edit/mailbox-templates.twig
index ddc13958..8384fa05 100644
--- a/data/web/templates/edit/mailbox-templates.twig
+++ b/data/web/templates/edit/mailbox-templates.twig
@@ -8,6 +8,7 @@
+
@@ -165,6 +166,14 @@
+
+
+
+
+ {{ lang.tfa.force_tfa_info }}
+
+
+
{% if not skip_sogo %}
From cce02e2b15ae96984803cc5a1906b0a8d268e587 Mon Sep 17 00:00:00 2001
From: Bobby
Date: Mon, 8 Jun 2026 00:01:43 +0700
Subject: [PATCH 041/123] Refresh SOGo view after mailbox activation
---
data/web/inc/functions.mailbox.inc.php | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index adb330ea..326f1a09 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -3502,11 +3502,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
'msg' => array('mailbox_modified', $username)
);
- // Track affected mailboxes for SOGo update
- $update_sogo_mailboxes[] = $username;
- }
- return true;
- break;
+ // Track affected mailboxes for SOGo update
+ $update_sogo_mailboxes[] = $username;
+ }
+ break;
case 'mailbox_rename':
$domain = $_data['domain'];
$old_local_part = $_data['old_local_part'];
From 15891960f78fd10e90aac0cc3ab5267720a0b38f Mon Sep 17 00:00:00 2001
From: Dmytro Alieksieiev <1865999+dragoangel@users.noreply.github.com>
Date: Tue, 9 Jun 2026 01:19:06 +0200
Subject: [PATCH 042/123] Update RSPAMD version to 4.1.0
---
data/Dockerfiles/rspamd/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile
index ab9aaa5a..d37d1226 100644
--- a/data/Dockerfiles/rspamd/Dockerfile
+++ b/data/Dockerfiles/rspamd/Dockerfile
@@ -2,7 +2,7 @@ FROM debian:trixie-slim
LABEL maintainer="The Infrastructure Company GmbH "
ARG DEBIAN_FRONTEND=noninteractive
-ARG RSPAMD_VER=rspamd_4.0.1-1~8700333
+ARG RSPAMD_VER=rspamd_4.1.0-1~e2b0b18
ARG CODENAME=trixie
ENV LC_ALL=C
From c0050e8836a2b11233d3fb2ec132cf252b63e24b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 9 Jun 2026 12:19:09 +0200
Subject: [PATCH 043/123] Update devops-infra/action-pull-request action to
v1.3.0 (#7272)
---
.github/workflows/pr_to_nightly.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index 0b0738e9..01d7a91a 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -12,7 +12,7 @@ jobs:
with:
fetch-depth: 0
- name: Run the Action
- uses: devops-infra/action-pull-request@v1.2.1
+ uses: devops-infra/action-pull-request@v1.3.0
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
From 03c31f825ab128c22c2ce69398d2f3f61754c972 Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Tue, 9 Jun 2026 12:20:53 +0200
Subject: [PATCH 044/123] update postscreen_access.cidr (#7269)
---
data/conf/postfix/postscreen_access.cidr | 73 ++----------------------
1 file changed, 5 insertions(+), 68 deletions(-)
diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr
index 285ea7a8..70fd2651 100644
--- a/data/conf/postfix/postscreen_access.cidr
+++ b/data/conf/postfix/postscreen_access.cidr
@@ -1,6 +1,6 @@
-# Whitelist generated by Postwhite v3.4 on Fri May 1 00:43:37 UTC 2026
+# Whitelist generated by Postwhite v3.4 on Mon Jun 1 00:52:17 UTC 2026
# https://github.com/stevejenkins/postwhite/
-# 2249 total rules
+# 2186 total rules
2a00:1450:4000::/36 permit
2a00:1450:4864::/56 permit
2a01:111:f400::/48 permit
@@ -56,14 +56,8 @@
8.25.194.0/23 permit
8.25.196.0/23 permit
8.36.116.0/24 permit
-8.39.54.0/23 permit
-8.39.54.250/31 permit
8.39.144.0/24 permit
-8.40.222.0/23 permit
-8.40.222.250/31 permit
12.130.86.238 permit
-13.107.213.40 permit
-13.107.246.40 permit
13.108.16.0/20 permit
13.110.208.0/21 permit
13.110.209.0/24 permit
@@ -73,7 +67,6 @@
13.111.191.0/24 permit
13.216.7.111 permit
13.216.54.180 permit
-13.247.164.219 permit
15.200.21.50 permit
15.200.44.248 permit
15.200.201.185 permit
@@ -177,7 +170,6 @@
34.215.104.144 permit
34.218.115.239 permit
34.225.212.172 permit
-34.241.242.183 permit
35.83.148.184 permit
35.155.198.111 permit
35.158.23.94 permit
@@ -201,7 +193,6 @@
40.233.64.216 permit
40.233.83.78 permit
40.233.88.28 permit
-43.239.212.33 permit
44.206.138.57 permit
44.210.169.44 permit
44.217.45.156 permit
@@ -284,7 +275,6 @@
51.83.17.38 permit
52.1.14.157 permit
52.5.230.59 permit
-52.6.74.205 permit
52.12.53.23 permit
52.13.214.179 permit
52.26.1.71 permit
@@ -341,7 +331,6 @@
54.244.54.130 permit
54.244.242.0/24 permit
54.255.61.23 permit
-56.124.6.228 permit
57.103.64.0/18 permit
57.129.93.249 permit
62.13.128.0/24 permit
@@ -408,7 +397,6 @@
65.110.161.77 permit
65.123.29.213 permit
65.123.29.220 permit
-65.154.166.0/24 permit
65.212.180.36 permit
66.102.0.0/20 permit
66.119.150.192/26 permit
@@ -1222,9 +1210,6 @@
99.78.197.208/28 permit
103.9.96.0/22 permit
103.28.42.0/24 permit
-103.84.217.15 permit
-103.84.217.238 permit
-103.89.75.238 permit
103.151.192.0/23 permit
103.168.172.128/27 permit
103.237.104.0/22 permit
@@ -1385,9 +1370,6 @@
117.120.16.0/21 permit
119.42.242.52/31 permit
119.42.242.156 permit
-121.244.91.48 permit
-121.244.91.52 permit
-122.15.156.182 permit
123.126.78.64/29 permit
124.108.96.24/31 permit
124.108.96.28/31 permit
@@ -1470,21 +1452,7 @@
134.170.141.64/26 permit
134.170.143.0/24 permit
134.170.174.0/24 permit
-135.84.80.0/24 permit
-135.84.81.0/24 permit
-135.84.82.0/24 permit
-135.84.83.0/24 permit
135.84.216.0/22 permit
-136.143.160.0/24 permit
-136.143.161.0/24 permit
-136.143.162.0/24 permit
-136.143.176.0/24 permit
-136.143.177.0/24 permit
-136.143.178.49 permit
-136.143.182.0/23 permit
-136.143.184.0/24 permit
-136.143.188.0/24 permit
-136.143.190.0/23 permit
136.146.128.0/20 permit
136.147.128.0/20 permit
136.147.135.0/24 permit
@@ -1504,7 +1472,6 @@
139.138.46.219 permit
139.138.57.55 permit
139.138.58.119 permit
-139.167.79.86 permit
139.177.108.0/25 permit
139.180.17.0/24 permit
140.238.148.191 permit
@@ -1554,12 +1521,14 @@
147.243.128.26 permit
148.105.0.0/16 permit
148.105.8.0/21 permit
+148.116.32.128/25 permit
149.72.0.0/16 permit
149.72.234.184 permit
149.72.248.236 permit
149.97.173.180 permit
149.118.160.128/25 permit
150.136.21.199 permit
+150.171.109.118 permit
150.230.98.160 permit
151.145.38.14 permit
152.67.105.195 permit
@@ -1636,11 +1605,6 @@
164.152.25.241 permit
164.177.132.168/30 permit
165.1.100.0/25 permit
-165.173.128.0/24 permit
-165.173.180.1 permit
-165.173.180.250/31 permit
-165.173.182.250/31 permit
-165.173.189.205 permit
166.78.68.0/22 permit
166.78.68.221 permit
166.78.69.169 permit
@@ -1673,19 +1637,6 @@
168.245.12.252 permit
168.245.46.9 permit
168.245.127.231 permit
-169.148.129.0/24 permit
-169.148.131.0/24 permit
-169.148.138.0/24 permit
-169.148.142.10 permit
-169.148.142.33 permit
-169.148.144.0/25 permit
-169.148.144.10 permit
-169.148.146.0/23 permit
-169.148.174.10 permit
-169.148.175.3 permit
-169.148.179.3 permit
-169.148.188.0/24 permit
-169.148.188.182 permit
170.9.232.254 permit
170.10.128.0/24 permit
170.10.129.0/24 permit
@@ -1891,16 +1842,7 @@
199.16.156.0/22 permit
199.33.145.1 permit
199.33.145.32 permit
-199.34.22.36 permit
199.59.148.0/22 permit
-199.67.80.2 permit
-199.67.80.20 permit
-199.67.82.2 permit
-199.67.82.20 permit
-199.67.84.0/24 permit
-199.67.86.0/24 permit
-199.67.88.0/24 permit
-199.67.90.0/24 permit
199.101.161.130 permit
199.101.162.0/25 permit
199.122.120.0/21 permit
@@ -1956,8 +1898,6 @@
204.92.114.187 permit
204.92.114.203 permit
204.92.114.204/31 permit
-204.141.32.0/23 permit
-204.141.42.0/23 permit
204.216.164.202 permit
204.220.160.0/21 permit
204.220.168.0/21 permit
@@ -2231,10 +2171,7 @@
2001:748:400:3301::4 permit
2404:6800:4000::/36 permit
2404:6800:4864::/56 permit
-2603:1061:14:72::1 permit
-2607:13c0:0001:0000:0000:0000:0000:7000/116 permit
-2607:13c0:0002:0000:0000:0000:0000:1000/116 permit
-2607:13c0:0004:0000:0000:0000:0000:0000/116 permit
+2603:1061:14:40::1 permit
2607:f8b0:4000::/36 permit
2607:f8b0:4864::/56 permit
2620:109:c003:104::/64 permit
From 24cc369d84935428f58a4c6bef5b18a58ad248ed Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 11 Jun 2026 09:34:27 +0200
Subject: [PATCH 045/123] [Rspamd] Migrate metadata_exporter to multipart
formatter
---
.../rspamd/local.d/metadata_exporter.conf | 6 +-
data/conf/rspamd/meta_exporter/pipe.php | 59 +++++++++----------
data/conf/rspamd/meta_exporter/pushover.php | 48 +++++++--------
docker-compose.yml | 2 +-
4 files changed, 52 insertions(+), 63 deletions(-)
diff --git a/data/conf/rspamd/local.d/metadata_exporter.conf b/data/conf/rspamd/local.d/metadata_exporter.conf
index daaa79b4..cc85faac 100644
--- a/data/conf/rspamd/local.d/metadata_exporter.conf
+++ b/data/conf/rspamd/local.d/metadata_exporter.conf
@@ -3,8 +3,7 @@ rules {
backend = "http";
url = "http://nginx:9081/pipe.php";
selector = "reject_no_global_bl";
- formatter = "default";
- meta_headers = true;
+ formatter = "multipart";
}
RLINFO {
backend = "http";
@@ -16,8 +15,7 @@ rules {
backend = "http";
url = "http://nginx:9081/pushover.php";
selector = "mailcow_rcpt";
- formatter = "json";
- meta_headers = true;
+ formatter = "multipart";
}
}
diff --git a/data/conf/rspamd/meta_exporter/pipe.php b/data/conf/rspamd/meta_exporter/pipe.php
index 003639b0..0a9ed59e 100644
--- a/data/conf/rspamd/meta_exporter/pipe.php
+++ b/data/conf/rspamd/meta_exporter/pipe.php
@@ -32,47 +32,42 @@ function parse_email($email) {
$a = strrpos($email, '@');
return array('local' => substr($email, 0, $a), 'domain' => substr(substr($email, $a), 1));
}
-if (!function_exists('getallheaders')) {
- function getallheaders() {
- if (!is_array($_SERVER)) {
- return array();
- }
- $headers = array();
- foreach ($_SERVER as $name => $value) {
- if (substr($name, 0, 5) == 'HTTP_') {
- $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
- }
- }
- return $headers;
- }
+// rspamd metadata_exporter (multipart formatter):
+// - $_POST['metadata'] JSON with the rspamd metadata
+// - $_FILES['message'] raw RFC822 message
+if (empty($_POST['metadata']) || !isset($_FILES['message']) || $_FILES['message']['error'] !== UPLOAD_ERR_OK) {
+ error_log("QUARANTINE: missing multipart parts from rspamd" . PHP_EOL);
+ http_response_code(400);
+ exit;
}
-$raw_data_content = file_get_contents('php://input');
+$meta = json_decode($_POST['metadata'], true);
+if (!is_array($meta)) {
+ error_log("QUARANTINE: cannot decode metadata JSON" . PHP_EOL);
+ http_response_code(400);
+ exit;
+}
+
+$raw_data_content = file_get_contents($_FILES['message']['tmp_name']);
$raw_data = mb_convert_encoding($raw_data_content, 'HTML-ENTITIES', "UTF-8");
-$headers = getallheaders();
+$raw_size = (int)$_FILES['message']['size'];
-$qid = $headers['X-Rspamd-Qid'];
-$fuzzy = $headers['X-Rspamd-Fuzzy'];
-$subject = iconv_mime_decode($headers['X-Rspamd-Subject']);
-$score = $headers['X-Rspamd-Score'];
-$rcpts = $headers['X-Rspamd-Rcpt'];
-$user = $headers['X-Rspamd-User'];
-$ip = $headers['X-Rspamd-Ip'];
-$action = $headers['X-Rspamd-Action'];
-$sender = $headers['X-Rspamd-From'];
-$symbols = $headers['X-Rspamd-Symbols'];
-
-$raw_size = (int)$_SERVER['CONTENT_LENGTH'];
+$qid = $meta['qid'] ?? 'unknown';
+$subject = iconv_mime_decode($meta['subject'] ?? '');
+$score = $meta['score'] ?? 0;
+$rcpts = $meta['rcpt'] ?? array();
+$user = $meta['user'] ?? 'unknown';
+$ip = $meta['ip'] ?? 'unknown';
+$action = $meta['action'] ?? 'no action';
+$sender = $meta['from'] ?? '';
+$symbols = json_encode($meta['symbols'] ?? array());
+$fuzzy = json_encode(is_array($meta['fuzzy'] ?? null) ? $meta['fuzzy'] : array());
if (empty($sender)) {
error_log("QUARANTINE: Unknown sender, assuming empty-env-from@localhost" . PHP_EOL);
$sender = 'empty-env-from@localhost';
}
-if ($fuzzy == 'unknown') {
- $fuzzy = '[]';
-}
-
try {
$max_size = (int)$redis->Get('Q_MAX_SIZE');
if (($max_size * 1048576) < $raw_size) {
@@ -94,7 +89,7 @@ catch (RedisException $e) {
$rcpt_final_mailboxes = array();
// Loop through all rcpts
-foreach (json_decode($rcpts, true) as $rcpt) {
+foreach ($rcpts as $rcpt) {
// Remove tag
$rcpt = preg_replace('/^(.*?)\+.*(@.*)$/', '$1$2', $rcpt);
diff --git a/data/conf/rspamd/meta_exporter/pushover.php b/data/conf/rspamd/meta_exporter/pushover.php
index efe5fdd5..a2cd0995 100644
--- a/data/conf/rspamd/meta_exporter/pushover.php
+++ b/data/conf/rspamd/meta_exporter/pushover.php
@@ -32,50 +32,46 @@ function parse_email($email) {
$a = strrpos($email, '@');
return array('local' => substr($email, 0, $a), 'domain' => substr(substr($email, $a), 1));
}
-if (!function_exists('getallheaders')) {
- function getallheaders() {
- if (!is_array($_SERVER)) {
- return array();
- }
- $headers = array();
- foreach ($_SERVER as $name => $value) {
- if (substr($name, 0, 5) == 'HTTP_') {
- $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
- }
- }
- return $headers;
- }
+// rspamd metadata_exporter (multipart formatter): metadata JSON arrives as $_POST['metadata'].
+if (empty($_POST['metadata'])) {
+ error_log("NOTIFY: missing metadata part from rspamd" . PHP_EOL);
+ http_response_code(400);
+ exit;
}
-$headers = getallheaders();
-$json_body = json_decode(file_get_contents('php://input'));
+$meta = json_decode($_POST['metadata'], true);
+if (!is_array($meta)) {
+ error_log("NOTIFY: cannot decode metadata JSON" . PHP_EOL);
+ http_response_code(400);
+ exit;
+}
-$qid = $headers['X-Rspamd-Qid'];
-$rcpts = $headers['X-Rspamd-Rcpt'];
-$sender = $headers['X-Rspamd-From'];
-$ip = $headers['X-Rspamd-Ip'];
-$subject = iconv_mime_decode($headers['X-Rspamd-Subject']);
-$messageid= $json_body->message_id;
+$qid = $meta['qid'] ?? 'unknown';
+$rcpts = $meta['rcpt'] ?? array();
+$sender = $meta['from'] ?? '';
+$ip = $meta['ip'] ?? 'unknown';
+$subject = iconv_mime_decode($meta['subject'] ?? '');
+$messageid= $meta['message_id'] ?? '';
$priority = 0;
-$symbols_array = json_decode($headers['X-Rspamd-Symbols'], true);
+$symbols_array = $meta['symbols'] ?? array();
if (is_array($symbols_array)) {
foreach ($symbols_array as $symbol) {
- if ($symbol['name'] == 'HAS_X_PRIO_ONE') {
+ if (($symbol['name'] ?? null) == 'HAS_X_PRIO_ONE') {
$priority = 1;
break;
}
}
}
-$sender_address = $json_body->header_from[0];
+$sender_address = $meta['header_from'][0] ?? '';
$sender_name = '-';
if (preg_match('/(?.*?)<(?.*?)>/i', $sender_address, $matches)) {
$sender_address = $matches['address'];
$sender_name = trim($matches['name'], '"\' ');
}
-$to_address = $json_body->header_to[0];
+$to_address = $meta['header_to'][0] ?? '';
$to_name = '-';
if (preg_match('/(?.*?)<(?.*?)>/i', $to_address, $matches)) {
$to_address = $matches['address'];
@@ -85,7 +81,7 @@ if (preg_match('/(?.*?)<(?.*?)>/i', $to_address, $matches)) {
$rcpt_final_mailboxes = array();
// Loop through all rcpts
-foreach (json_decode($rcpts, true) as $rcpt) {
+foreach ($rcpts as $rcpt) {
// Remove tag
$rcpt = preg_replace('/^(.*?)\+.*(@.*)$/', '$1$2', $rcpt);
diff --git a/docker-compose.yml b/docker-compose.yml
index 615e19f5..16370a7b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -84,7 +84,7 @@ services:
- clamd
rspamd-mailcow:
- image: ghcr.io/mailcow/rspamd:3.14.3-1
+ image: ghcr.io/mailcow/rspamd:4.1.0-1
stop_grace_period: 30s
depends_on:
- dovecot-mailcow
From 277a307fb91f701f2f2619debd50ec183ca34192 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 11 Jun 2026 09:55:32 +0200
Subject: [PATCH 046/123] [Web] Fix refresh SOGo view on mailbox deletion
---
data/web/inc/functions.mailbox.inc.php | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 326f1a09..127374e8 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -3502,10 +3502,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
'msg' => array('mailbox_modified', $username)
);
- // Track affected mailboxes for SOGo update
- $update_sogo_mailboxes[] = $username;
- }
- break;
+ // Track affected mailboxes for SOGo update
+ $update_sogo_mailboxes[] = $username;
+ }
+ break;
case 'mailbox_rename':
$domain = $_data['domain'];
$old_local_part = $_data['old_local_part'];
@@ -6126,7 +6126,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
// Track affected mailboxes for SOGo update
$update_sogo_mailboxes[] = $username;
}
- return true;
break;
case 'mailbox_templates':
if ($_SESSION['mailcow_cc_role'] != "admin") {
From fa154c71f3fc855c99fae503a222790b92e1e42e Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 11 Jun 2026 10:29:01 +0200
Subject: [PATCH 047/123] [PHP] Rebuild Image
---
docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 87b739ed..cccf3a21 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -117,7 +117,7 @@ services:
- rspamd
php-fpm-mailcow:
- image: ghcr.io/mailcow/phpfpm:8.2.29-2
+ image: ghcr.io/mailcow/phpfpm:8.2.29-3
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
- redis-mailcow
From 7e6c36dce1c106e95334410ad8313d1174fe15fa Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 11 Jun 2026 11:35:03 +0200
Subject: [PATCH 048/123] Update alpine Docker tag to v3.24 (#7280)
---
.../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 5ef729a4..fd47e15f 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
@@ -25,6 +25,6 @@ services:
- /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysqld.sock
mysql-mailcow:
- image: alpine:3.23
+ image: alpine:3.24
command: /bin/true
restart: "no"
From ddcce811c1f77658d857ec3357505eba1fce264d Mon Sep 17 00:00:00 2001
From: Chris Haumesser <5400416-wryfi@users.noreply.gitlab.com>
Date: Fri, 12 Jun 2026 16:32:22 -0600
Subject: [PATCH 049/123] Fixes #7150 (Dovecot passwd-verify.lua wipes auth
cache during any nginx restart or unavailability)
- distinguishes between text and numeric responses from nginx
- prevents auth cache from being invalidated due to nginx unavailability
---
data/conf/dovecot/auth/passwd-verify.lua | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/data/conf/dovecot/auth/passwd-verify.lua b/data/conf/dovecot/auth/passwd-verify.lua
index ea847932..a22488ea 100644
--- a/data/conf/dovecot/auth/passwd-verify.lua
+++ b/data/conf/dovecot/auth/passwd-verify.lua
@@ -32,8 +32,17 @@ function auth_password_verify(request, password)
-- Returning PASSDB_RESULT_PASSWORD_MISMATCH will reset the user's auth cache entry.
-- Returning PASSDB_RESULT_INTERNAL_FAILURE keeps the existing cache entry,
-- even if the TTL has expired. Useful to avoid cache eviction during backend issues.
+
+ -- On a network-level failure (nginx unreachable, DNS failure, timeout) https.request
+ -- returns nil plus an error string, so c is not a numeric HTTP status code. Treat this
+ -- as a backend outage and keep the cache entry, rather than wiping it as a mismatch.
+ if type(c) ~= "number" then
+ dovecot.i_info("HTTP request to auth backend failed with " .. tostring(c) .. " for user " .. request.user)
+ return dovecot.auth.PASSDB_RESULT_INTERNAL_FAILURE, "Upstream unreachable"
+ end
+
if c ~= 200 and c ~= 401 then
- dovecot.i_info("HTTP request failed with " .. c .. " for user " .. request.user)
+ dovecot.i_info("HTTP request failed with " .. tostring(c) .. " for user " .. request.user)
return dovecot.auth.PASSDB_RESULT_PASSWORD_MISMATCH, "Upstream error"
end
From 47e4552b44ddfd528b99987545ccdaf61135f2c9 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 19 Jun 2026 08:34:02 +0200
Subject: [PATCH 050/123] Update actions/checkout action to v7 (#7300)
---
.github/workflows/image_builds.yml | 2 +-
.github/workflows/pr_to_nightly.yml | 2 +-
.github/workflows/rebuild_backup_image.yml | 2 +-
.github/workflows/update_postscreen_access_list.yml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/image_builds.yml b/.github/workflows/image_builds.yml
index c8ec7cca..aa56b038 100644
--- a/.github/workflows/image_builds.yml
+++ b/.github/workflows/image_builds.yml
@@ -27,7 +27,7 @@ jobs:
- "watchdog-mailcow"
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- name: Setup Docker
run: |
curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh
diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml
index 01d7a91a..5c361af7 100644
--- a/.github/workflows/pr_to_nightly.yml
+++ b/.github/workflows/pr_to_nightly.yml
@@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Run the Action
diff --git a/.github/workflows/rebuild_backup_image.yml b/.github/workflows/rebuild_backup_image.yml
index b18d339b..4490afee 100644
--- a/.github/workflows/rebuild_backup_image.yml
+++ b/.github/workflows/rebuild_backup_image.yml
@@ -13,7 +13,7 @@ jobs:
packages: write
steps:
- name: Checkout
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
diff --git a/.github/workflows/update_postscreen_access_list.yml b/.github/workflows/update_postscreen_access_list.yml
index 066616ae..ed63281c 100644
--- a/.github/workflows/update_postscreen_access_list.yml
+++ b/.github/workflows/update_postscreen_access_list.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
- name: Generate postscreen_access.cidr
run: |
From 9e723e942d02de31ba8ca78aa5e34a68b62ed38b Mon Sep 17 00:00:00 2001
From: milkmaker
Date: Sat, 20 Jun 2026 13:57:15 +0200
Subject: [PATCH 051/123] Translations update from Weblate (#7302)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [Web] Updated lang.fr-fr.json
Co-authored-by: Romain Ayme
* [Web] Updated lang.si-si.json
Co-authored-by: Matjaž Tekavec
---------
Co-authored-by: Romain Ayme
Co-authored-by: Matjaž Tekavec
---
data/web/lang/lang.fr-fr.json | 23 +++++++++++++++++------
data/web/lang/lang.si-si.json | 3 ++-
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json
index 43c9c065..9ee91671 100644
--- a/data/web/lang/lang.fr-fr.json
+++ b/data/web/lang/lang.fr-fr.json
@@ -111,7 +111,8 @@
"app_passwd_protocols": "Protocoles autorisés pour le mot de passe de l'application",
"dry": "Simuler la synchronisation",
"internal": "Interne",
- "internal_info": "Les alias internes sont accessibles uniquement depuis le domaine ou les alias du domaine."
+ "internal_info": "Les alias internes sont accessibles uniquement depuis le domaine ou les alias du domaine.",
+ "sender_allowed": "Autoriser l'envoi sous cet alias"
},
"admin": {
"access": "Accès",
@@ -556,7 +557,9 @@
"max_age_invalid": "L'âge maximum %s est invalide",
"mode_invalid": "Le mode %s est invalide",
"mx_invalid": "L'enregistrement MX %s est invalide",
- "version_invalid": "La version %s est invalide"
+ "version_invalid": "La version %s est invalide",
+ "tfa_removal_blocked": "L’authentification à deux facteurs ne peut pas être supprimée, car elle est requise pour votre compte.",
+ "quarantine_category_invalid": "La catégorie de quarantaine doit être l’une des suivantes : add_header, reject, all\""
},
"debug": {
"chart_this_server": "Graphique (ce serveur)",
@@ -755,7 +758,9 @@
"mta_sts_info": "MTA-STS est un standard qui oblige la délivrance des courriels entre les serveurs de courriels à utiliser TLS avec des certificats valides. Il est utilisé quand DANE n'est pas possible à cause d'un manque ou d'un non support de DNSSEC. Note : Si le domaine du destinataire supporte DANE avec DNSSEC, DANE est toujours préféré – MTA-STS sert seulement en secours.",
"mta_sts_mode_info": "Il y a trois modes parmi lesquels choisir :
testing – la politique est seulement surveillée, les violations n'ont pas d'impact.
enforce – la politique est appliquée strictement, les connexions sans TLS valide sont rejetées.
none – la politique est publiée mais non appliquée.
",
"mta_sts_max_age_info": "Durée en secondes pendant laquelle les serveurs de courriel peuvent mettre en cache cette politique avant de revérifier.",
- "mta_sts_mx_info": "Autoriser l'envoi uniquement aux noms d'hôtes des serveurs de courriels indiqués explicitement ; le MTA émetteur vérifie si le nom d'hôte DNS du MX correspond à la liste de la politique, et autorise la délivrance seulement avec un certificat TLS valide (protège contre le MITM)."
+ "mta_sts_mx_info": "Autoriser l'envoi uniquement aux noms d'hôtes des serveurs de courriels indiqués explicitement ; le MTA émetteur vérifie si le nom d'hôte DNS du MX correspond à la liste de la politique, et autorise la délivrance seulement avec un certificat TLS valide (protège contre le MITM).",
+ "sender_allowed": "Autoriser l'envoi sous cet alias",
+ "sender_allowed_info": "Si cette option est désactivée, cet alias peut uniquement recevoir des courriels. Utilisez les ACL d’expéditeur pour autoriser certaines boîtes aux lettres à envoyer des messages via cet alias."
},
"footer": {
"cancel": "Annuler",
@@ -988,7 +993,8 @@
"recipient": "Destinataire",
"open_logs": "Afficher les journaux",
"iam": "Fournisseur d'identité",
- "internal": "Interne"
+ "internal": "Interne",
+ "force_tfa": "TFA"
},
"oauth2": {
"access_denied": "Veuillez vous connecter en tant que propriétaire de la boîte de réception pour accorder l’accès via Oauth2.",
@@ -1189,7 +1195,11 @@
"yubi_otp": "Authentification OTP Yubico",
"authenticators": "Authentificateurs",
"u2f_deprecated_important": "Veuillez enregistrer votre clé dans le panneau d'administration avec la nouvelle méthode WebAuthn.",
- "u2f_deprecated": "Il semble que votre clé ait été enregistrée à l'aide de la méthode U2F obsolète. Nous allons désactiver l'authentification à deux facteurs pour vous et supprimer votre clé."
+ "u2f_deprecated": "Il semble que votre clé ait été enregistrée à l'aide de la méthode U2F obsolète. Nous allons désactiver l'authentification à deux facteurs pour vous et supprimer votre clé.",
+ "force_tfa": "Imposer l'authentification à deux facteurs lors de la connexion",
+ "force_tfa_info": "L’utilisateur doit configurer l’authentification à deux facteurs avant de pouvoir accéder à l’interface.",
+ "setup_title": "Authentification à deux facteurs requise",
+ "setup_required": "Votre compte nécessite l’authentification à deux facteurs. Veuillez configurer une méthode 2FA pour continuer."
},
"fido2": {
"set_fn": "Définir un nom",
@@ -1378,7 +1388,8 @@
"forever": "Pour toujours",
"spam_aliases_info": "Un alias de spam est une adresse de courriel temporaire qui peut être utilisée pour protéger les véritables adresses de courriel. De manière optionnelle, une durée d'expiration peut être définie afin que l'alias soit automatiquement désactivé après la période définie, éliminant ainsi les adresses étant abusées ou ayant fuité.",
"authentication": "Authentification",
- "protocols": "Protocoles"
+ "protocols": "Protocoles",
+ "pw_update_required": "Votre compte nécessite un changement de mot de passe. Veuillez définir un nouveau mot de passe pour continuer."
},
"warning": {
"cannot_delete_self": "Impossible de supprimer l’utilisateur connecté",
diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json
index f5ba53f9..39d57eb3 100644
--- a/data/web/lang/lang.si-si.json
+++ b/data/web/lang/lang.si-si.json
@@ -1001,7 +1001,8 @@
"weekly": "Tedensko",
"sieve_info": "Na uporabnika lahko shranite več filtrov, vendar je lahko hkrati aktiven le en predfilter in en postfilter. \nVsak filter bo obdelan v opisanem vrstnem redu. Niti neuspešen skript niti izdan ukaz »keep;« ne bosta ustavila obdelave nadaljnjih skript. Spremembe globalnih skriptov sita bodo sprožile ponovni zagon Dovecota.
From 887b8a3594cbcb3b88ce8a74000d37c36f1cc5d8 Mon Sep 17 00:00:00 2001
From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com>
Date: Thu, 15 Oct 2026 14:46:57 +0200
Subject: [PATCH 113/123] [Web] Add servercow theme
---
data/web/css/themes/servercow/dark.css | 203 ++++++
.../servercow/fonts/LICENSE-RobotoSlab.txt | 202 ++++++
.../themes/servercow/fonts/OFL-Poppins.txt | 93 +++
.../poppins-v24-latin_latin-ext-500.woff | Bin 0 -> 14300 bytes
.../poppins-v24-latin_latin-ext-500.woff2 | Bin 0 -> 10708 bytes
.../poppins-v24-latin_latin-ext-600.woff | Bin 0 -> 14592 bytes
.../poppins-v24-latin_latin-ext-600.woff2 | Bin 0 -> 10992 bytes
.../poppins-v24-latin_latin-ext-italic.woff | Bin 0 -> 15680 bytes
.../poppins-v24-latin_latin-ext-italic.woff2 | Bin 0 -> 11804 bytes
.../poppins-v24-latin_latin-ext-regular.woff | Bin 0 -> 14556 bytes
.../poppins-v24-latin_latin-ext-regular.woff2 | Bin 0 -> 10892 bytes
...oto-slab-v36-cyrillic_greek_latin-500.woff | Bin 0 -> 55256 bytes
...to-slab-v36-cyrillic_greek_latin-500.woff2 | Bin 0 -> 43656 bytes
...slab-v36-cyrillic_greek_latin-regular.woff | Bin 0 -> 52848 bytes
...lab-v36-cyrillic_greek_latin-regular.woff2 | Bin 0 -> 41868 bytes
data/web/css/themes/servercow/theme.css | 576 ++++++++++++++++++
data/web/css/themes/servercow/theme.json | 4 +
17 files changed, 1078 insertions(+)
create mode 100644 data/web/css/themes/servercow/dark.css
create mode 100644 data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt
create mode 100644 data/web/css/themes/servercow/fonts/OFL-Poppins.txt
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff2
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff2
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff2
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff
create mode 100644 data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff2
create mode 100644 data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff
create mode 100644 data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff2
create mode 100644 data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff
create mode 100644 data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff2
create mode 100644 data/web/css/themes/servercow/theme.css
create mode 100644 data/web/css/themes/servercow/theme.json
diff --git a/data/web/css/themes/servercow/dark.css b/data/web/css/themes/servercow/dark.css
new file mode 100644
index 00000000..0ede978d
--- /dev/null
+++ b/data/web/css/themes/servercow/dark.css
@@ -0,0 +1,203 @@
+/* servercow theme, dark mode, bundled after mailcow core dark mode */
+
+:root {
+ --sc-brown-hover: #806b55;
+ --sc-brown-active: #8a745c;
+ --sc-brown-soft: rgba(201, 180, 154, .18);
+ --sc-brown-tint: rgba(201, 180, 154, .08);
+ --sc-link: #c9b49a;
+ --sc-danger-text: #ff8a8a;
+ --sc-ink: #ece7e1;
+ --sc-muted: #a89f94;
+ --sc-placeholder: #8a8177;
+ --sc-bg: #171513;
+ --sc-surface: #211e1b;
+ --sc-cap: #2a2622;
+ --sc-addon: #2a2622;
+ --sc-line: #463f38;
+ --sc-divider: #34302b;
+ --sc-cap-line: #3d3732;
+ --sc-stripe: rgba(255, 255, 255, .025);
+ --sc-hover: rgba(201, 180, 154, .08);
+ --sc-focus-border: #8a7864;
+ --sc-focus: rgba(201, 180, 154, .25);
+ --sc-shadow: 0 0 10px 0 rgba(0, 0, 0, .5);
+ --bs-body-color: #ece7e1;
+ --bs-body-bg: #171513;
+ /* core dark tokens, see css/themes/mailcow-darkmode.css */
+ --mc-body-bg: var(--sc-bg);
+ --mc-body-color: var(--sc-ink);
+ --mc-surface: var(--sc-surface);
+ --mc-surface-alt: var(--sc-cap);
+ --mc-text: var(--sc-ink);
+ --mc-text-soft: var(--sc-ink);
+ --mc-muted: var(--sc-muted);
+ --mc-border: var(--sc-divider);
+ --mc-tab-border: var(--sc-divider);
+ --mc-link: var(--sc-link);
+ --mc-link-hover: #e0cfba;
+ --mc-btn-bg: var(--sc-cap);
+ --mc-btn-border: var(--sc-line);
+ --mc-input-bg: var(--sc-bg);
+ --mc-input-color: var(--sc-ink);
+ --mc-input-border: var(--sc-line);
+ --mc-dropdown-bg: var(--sc-surface);
+ --mc-table-bg: transparent;
+ --mc-table-stripe: var(--sc-stripe);
+ --mc-table-stripe-row: transparent;
+ --mc-table-hover: var(--sc-hover);
+ --mc-table-border: var(--sc-divider);
+ --mc-progress-bg: var(--sc-cap);
+ --mc-placeholder: var(--sc-placeholder);
+ --mc-hr: var(--sc-divider);
+ --mc-btn-outline-color: var(--sc-ink);
+ --mc-btn-outline-border: var(--sc-line);
+ --mc-btn-outline-hover-bg: var(--sc-brown-tint);
+ --mc-btn-outline-active-bg: var(--sc-brown);
+ --mc-btn-light-active-color: #fff;
+ --mc-btn-light-active-bg: var(--sc-brown);
+ --mc-btn-light-active-border: var(--sc-brown);
+ --mc-btn-dark-bg: var(--sc-brown);
+ --mc-input-disabled-bg: var(--sc-cap);
+ --mc-input-disabled-color: var(--sc-muted);
+ --mc-list-header-bg: var(--sc-cap);
+ --mc-list-details-bg: var(--sc-surface);
+ --mc-chip-bg: var(--sc-cap);
+ --mc-table-child-bg: var(--sc-surface);
+ --mc-dtr-bg: var(--sc-cap);
+ --mc-dtr-border: var(--sc-line);
+ --mc-dtr-color: var(--sc-link);
+ --mc-dtr-hover-bg: var(--sc-hover);
+ --mc-dtr-active-bg: var(--sc-brown-soft);
+}
+
+/* navbar */
+.navbar.bg-light {
+ background-color: var(--sc-surface) !important;
+ border-bottom-color: var(--sc-green);
+}
+.navbar-light .navbar-nav .nav-link {
+ color: var(--sc-ink) !important;
+}
+.navbar-light .navbar-nav .nav-link:hover,
+.navbar-light .navbar-nav .nav-link:focus,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .show > .nav-link {
+ color: var(--sc-link) !important;
+}
+.dropdown-menu {
+ border-color: var(--sc-cap-line);
+}
+.dropdown-item:hover, .dropdown-item:focus {
+ color: var(--sc-link) !important;
+}
+
+/* cards and modals */
+.card-header {
+ color: var(--sc-ink);
+ background-color: var(--sc-cap);
+ border-color: var(--sc-cap-line);
+}
+.modal-content {
+ background-color: var(--sc-surface);
+}
+.modal-header {
+ border-color: var(--sc-cap-line);
+}
+.input-group-text {
+ background-color: var(--sc-addon);
+}
+.form-check-input:not(:checked) {
+ background-color: var(--sc-bg);
+ border-color: var(--sc-line);
+}
+kbd {
+ color: var(--sc-ink);
+ background-color: var(--sc-cap);
+}
+
+/* buttons */
+.btn-secondary:hover, .btn-secondary:focus, .btn-light:hover, .btn-light:focus, .page-link:hover {
+ color: var(--sc-link) !important;
+ background-color: var(--sc-line) !important;
+}
+.btn-check:checked + .btn-secondary, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle,
+.page-item.active .page-link {
+ color: #fff !important;
+ background-color: var(--sc-brown) !important;
+ border-color: var(--sc-brown) !important;
+}
+
+/* tabs */
+.nav-tabs .nav-link {
+ color: var(--sc-ink) !important;
+ border-bottom-color: transparent !important;
+}
+.nav-tabs .nav-link:not(.disabled):hover, .nav-tabs .nav-link:not(.disabled):focus,
+.card .nav-tabs .nav-link:not(.disabled):hover, .card .nav-tabs .nav-link:not(.disabled):focus {
+ color: var(--sc-link) !important;
+ border-bottom-color: transparent !important;
+}
+.nav-tabs .nav-link.active, .card .nav-tabs .nav-link.active {
+ color: var(--sc-link) !important;
+ border-bottom-color: var(--sc-link) !important;
+}
+
+/* semantic text */
+.text-success {
+ color: var(--sc-green) !important;
+}
+.text-warning {
+ color: var(--sc-warning) !important;
+}
+
+/* alerts, opaque dark tints (also used for floating notifications) */
+.alert-primary {
+ color: #e6d9c9 !important;
+ background-color: #3c342b !important;
+ border-color: #5e4f3e !important;
+}
+.alert-info {
+ color: #cfe9f6 !important;
+ background-color: #2f3334 !important;
+ border-color: #44535a !important;
+}
+.alert-success {
+ color: #cdeea0;
+ background-color: #2e3419;
+ border-color: #405515;
+}
+.alert-danger {
+ color: #f9c4c4;
+ background-color: #402a28;
+ border-color: #693a38;
+}
+.alert-warning {
+ color: #f5d496;
+ background-color: #3c2f19;
+ border-color: #654815;
+}
+.alert-secondary, .alert-light {
+ color: var(--sc-ink) !important;
+ background-color: var(--sc-cap) !important;
+ border-color: var(--sc-divider) !important;
+}
+
+.alert .btn-close {
+ filter: invert(1) grayscale(100%) brightness(200%);
+}
+
+/* slider */
+.noUi-target {
+ background: var(--sc-bg);
+ border-color: var(--sc-line);
+ box-shadow: none;
+}
+.noUi-handle {
+ background: var(--sc-cap);
+ border-color: var(--sc-line);
+ box-shadow: none;
+}
+.noUi-handle::before, .noUi-handle::after {
+ background: var(--sc-line);
+}
diff --git a/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt b/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/data/web/css/themes/servercow/fonts/OFL-Poppins.txt b/data/web/css/themes/servercow/fonts/OFL-Poppins.txt
new file mode 100644
index 00000000..76df3b56
--- /dev/null
+++ b/data/web/css/themes/servercow/fonts/OFL-Poppins.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff
new file mode 100644
index 0000000000000000000000000000000000000000..fc6d5c76363bc0dcf7d3965dde70701342b7e463
GIT binary patch
literal 14300
zcmYkj19T?M^9K6H#wHuvwz+Y#v2E*(&5bwa#