Skip to content

Commit 586b3a2

Browse files
Merge pull request #6838 from mailcow/staging
Update 2025-10
2 parents 6bfa586 + 6af2add commit 586b3a2

File tree

14 files changed

+203
-55
lines changed

14 files changed

+203
-55
lines changed

data/Dockerfiles/netfilter/docker-entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/sh
22

3-
backend=iptables
3+
backend=nftables
44

55
nft list table ip filter &>/dev/null
66
nftables_found=$?

data/Dockerfiles/netfilter/main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,11 @@ def before_quit():
449449
tables = NFTables(chain_name, logger)
450450
else:
451451
logger.logInfo('Using IPTables backend')
452+
logger.logWarn(
453+
"DEPRECATION: iptables-legacy is deprecated and will be removed in future releases. "
454+
"Please switch to nftables on your host to ensure complete compatibility."
455+
)
456+
time.sleep(5)
452457
tables = IPTables(chain_name, logger)
453458

454459
clear()
Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22
import json
3+
import datetime
34

45
class Logger:
56
def __init__(self):
@@ -8,17 +9,28 @@ def __init__(self):
89
def set_redis(self, redis):
910
self.r = redis
1011

12+
def _format_timestamp(self):
13+
# Local time with milliseconds
14+
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
15+
1116
def log(self, priority, message):
12-
tolog = {}
13-
tolog['time'] = int(round(time.time()))
14-
tolog['priority'] = priority
15-
tolog['message'] = message
16-
print(message)
17+
# build redis-friendly dict
18+
tolog = {
19+
'time': int(round(time.time())), # keep raw timestamp for Redis
20+
'priority': priority,
21+
'message': message
22+
}
23+
24+
# print human-readable message with timestamp
25+
ts = self._format_timestamp()
26+
print(f"{ts} {priority.upper()}: {message}", flush=True)
27+
28+
# also push JSON to Redis if connected
1729
if self.r is not None:
1830
try:
1931
self.r.lpush('NETFILTER_LOG', json.dumps(tolog, ensure_ascii=False))
2032
except Exception as ex:
21-
print('Failed logging to redis: %s' % (ex))
33+
print(f'{ts} WARN: Failed logging to redis: {ex}', flush=True)
2234

2335
def logWarn(self, message):
2436
self.log('warn', message)
@@ -27,4 +39,4 @@ def logCrit(self, message):
2739
self.log('crit', message)
2840

2941
def logInfo(self, message):
30-
self.log('info', message)
42+
self.log('info', message)

data/Dockerfiles/phpfpm/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ FROM php:8.2-fpm-alpine3.21
33
LABEL maintainer = "The Infrastructure Company GmbH <info@servercow.de>"
44

55
# renovate: datasource=github-tags depName=krakjoe/apcu versioning=semver-coerced extractVersion=^v(?<version>.*)$
6-
ARG APCU_PECL_VERSION=5.1.26
6+
ARG APCU_PECL_VERSION=5.1.27
77
# renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced extractVersion=(?<version>.*)$
88
ARG IMAGICK_PECL_VERSION=3.8.0
99
# renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?<version>.*)$
10-
ARG MAILPARSE_PECL_VERSION=3.1.8
10+
ARG MAILPARSE_PECL_VERSION=3.1.9
1111
# renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced extractVersion=^v(?<version>.*)$
1212
ARG MEMCACHED_PECL_VERSION=3.3.0
1313
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?<version>.*)$

data/Dockerfiles/rspamd/Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM debian:bookworm-slim
22
LABEL maintainer="The Infrastructure Company GmbH <info@servercow.de>"
33

44
ARG DEBIAN_FRONTEND=noninteractive
5-
ARG RSPAMD_VER=rspamd_3.12.1-1~6dbfca2fa
5+
ARG RSPAMD_VER=rspamd_3.13.2-1~8bf602278
66
ARG CODENAME=bookworm
77
ENV LC_ALL=C
88

@@ -14,8 +14,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1414
dnsutils \
1515
netcat-traditional \
1616
wget \
17-
redis-tools \
18-
procps \
17+
redis-tools \
18+
procps \
1919
nano \
2020
lua-cjson \
2121
&& arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) \
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
; NOTE: Restart phpfpm on ANY manual changes to PHP files!
2+
3+
; opcache
14
opcache.enable=1
25
opcache.enable_cli=1
36
opcache.interned_strings_buffer=16
47
opcache.max_accelerated_files=10000
58
opcache.memory_consumption=128
69
opcache.save_comments=1
7-
opcache.revalidate_freq=1
10+
opcache.revalidate_freq=120
11+
opcache.validate_timestamps=0
12+
13+
; JIT
14+
opcache.jit=1255
15+
opcache.jit_buffer_size=8M

data/web/autodiscover.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.inc.php';
88
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.auth.inc.php';
99
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/sessions.inc.php';
10+
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailbox.inc.php';
11+
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.ratelimit.inc.php';
1012
$default_autodiscover_config = $autodiscover_config;
1113
$autodiscover_config = array_merge($default_autodiscover_config, $autodiscover_config);
1214

data/web/inc/functions.inc.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ function edit_user_account($_data) {
10061006
update_sogo_static_view();
10071007
}
10081008
// edit password recovery email
1009-
elseif (isset($pw_recovery_email)) {
1009+
elseif (!empty($password_old) && isset($pw_recovery_email)) {
10101010
if (!isset($_SESSION['acl']['pw_reset']) || $_SESSION['acl']['pw_reset'] != "1" ) {
10111011
$_SESSION['return'][] = array(
10121012
'type' => 'danger',
@@ -1016,6 +1016,21 @@ function edit_user_account($_data) {
10161016
return false;
10171017
}
10181018

1019+
$stmt = $pdo->prepare("SELECT `password` FROM `mailbox`
1020+
WHERE `kind` NOT REGEXP 'location|thing|group'
1021+
AND `username` = :user AND authsource = 'mailcow'");
1022+
$stmt->execute(array(':user' => $username));
1023+
$row = $stmt->fetch(PDO::FETCH_ASSOC);
1024+
1025+
if (!verify_hash($row['password'], $password_old)) {
1026+
$_SESSION['return'][] = array(
1027+
'type' => 'danger',
1028+
'log' => array(__FUNCTION__, $_data_log),
1029+
'msg' => 'access_denied'
1030+
);
1031+
return false;
1032+
}
1033+
10191034
$pw_recovery_email = (!filter_var($pw_recovery_email, FILTER_VALIDATE_EMAIL)) ? '' : $pw_recovery_email;
10201035
$stmt = $pdo->prepare("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.recovery_email', :recovery_email)
10211036
WHERE `username` = :username AND authsource = 'mailcow'");

data/web/index.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
$user_details = mailbox("get", "mailbox_details", $_SESSION['mailcow_cc_username']);
1313
$is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
1414
if (intval($user_details['attributes']['sogo_access']) == 1 && !$is_dual && getenv('SKIP_SOGO') != "y") {
15-
header("Location: /SOGo/so/{$_SESSION['mailcow_cc_username']}");
15+
header("Location: /SOGo/so/");
1616
} else {
1717
header("Location: /user");
1818
}

data/web/js/site/user.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,17 @@ jQuery(function($){
9797
var datetime = new Date(item.datetime.replace(/-/g, "/"));
9898
var local_datetime = datetime.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
9999
var service = '<div class="badge bg-secondary">' + item.service.toUpperCase() + '</div>';
100-
var app_password = item.app_password ? ' <a href="/edit/app-passwd/' + item.app_password + '"><i class="bi bi-app-indicator"></i> ' + escapeHtml(item.app_password_name || "App") + '</a>' : '';
100+
var app_password = item.app_password ? ' <a href="/edit/app-passwd/' + item.app_password + '"><i class="bi bi-key-fill"></i><span class="ms-1">' + escapeHtml(item.app_password_name || "App") + '</span></a>' : '';
101101
var real_rip = item.real_rip.startsWith("Web") ? item.real_rip : '<a href="https://bgp.tools/prefix/' + item.real_rip + '" target="_blank">' + item.real_rip + "</a>";
102102
var ip_location = item.location ? ' <span class="flag-icon flag-icon-' + item.location.toLowerCase() + '"></span>' : '';
103103
var ip_data = real_rip + ip_location + app_password;
104104

105105
$(".last-sasl-login").append(`
106106
<li class="list-group-item d-flex justify-content-between align-items-start">
107107
<div class="ms-2 me-auto d-flex flex-column">
108-
<div class="fw-bold">` + real_rip + `</div>
109-
<small class="fst-italic mt-2">` + service + ` ` + local_datetime + `</small>
108+
<div class="fw-bold">` + ip_location + real_rip + `</div>
109+
<small class="fst-italic mt-2">` + service + ` ` + local_datetime + `</small>` + app_password + `
110110
</div>
111-
<span>` + ip_location + `</span>
112111
</li>
113112
`);
114113
})

0 commit comments

Comments
 (0)