chore: 🚚 rename fail2ban to netfilter
Netfilter is a lot more correct than fail2ban since the implementation does not use fail2ban
This commit is contained in:
parent
49bbdd064e
commit
2b656174ba
|
@ -22,12 +22,12 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "DOVECOT_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("`REDIS_SLAVEOF_IP`")
|
||||
persist-name("redis2")
|
||||
port(`REDIS_SLAVEOF_PORT`)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
filter f_mail { facility(mail); };
|
||||
|
@ -41,5 +41,5 @@ log {
|
|||
destination(d_stdout);
|
||||
filter(f_mail);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
|
|
|
@ -22,12 +22,12 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "DOVECOT_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("redis-mailcow")
|
||||
persist-name("redis2")
|
||||
port(6379)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
filter f_mail { facility(mail); };
|
||||
|
@ -41,5 +41,5 @@ log {
|
|||
destination(d_stdout);
|
||||
filter(f_mail);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -23,12 +23,12 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "POSTFIX_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("`REDIS_SLAVEOF_IP`")
|
||||
persist-name("redis2")
|
||||
port(`REDIS_SLAVEOF_PORT`)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
filter f_mail { facility(mail); };
|
||||
|
@ -49,5 +49,5 @@ log {
|
|||
destination(d_stdout);
|
||||
filter(f_mail);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
|
|
|
@ -23,12 +23,12 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "POSTFIX_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("redis-mailcow")
|
||||
persist-name("redis2")
|
||||
port(6379)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
filter f_mail { facility(mail); };
|
||||
|
@ -49,5 +49,5 @@ log {
|
|||
destination(d_stdout);
|
||||
filter(f_mail);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
|
|
|
@ -25,18 +25,18 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "SOGO_LOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("`REDIS_SLAVEOF_IP`")
|
||||
persist-name("redis2")
|
||||
port(`REDIS_SLAVEOF_PORT`)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
log {
|
||||
source(s_sogo);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
log {
|
||||
source(s_sogo);
|
||||
|
|
|
@ -25,18 +25,18 @@ destination d_redis_ui_log {
|
|||
command("LPUSH" "SOGO_LOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n")
|
||||
);
|
||||
};
|
||||
destination d_redis_f2b_channel {
|
||||
destination d_redis_netfilter_channel {
|
||||
redis(
|
||||
host("redis-mailcow")
|
||||
persist-name("redis2")
|
||||
port(6379)
|
||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||
);
|
||||
};
|
||||
log {
|
||||
source(s_sogo);
|
||||
destination(d_redis_ui_log);
|
||||
destination(d_redis_f2b_channel);
|
||||
destination(d_redis_netfilter_channel);
|
||||
};
|
||||
log {
|
||||
source(s_sogo);
|
||||
|
|
|
@ -48,7 +48,7 @@ until [[ $(${REDIS_CMDLINE} PING) == "PONG" ]]; do
|
|||
sleep 2
|
||||
done
|
||||
|
||||
${REDIS_CMDLINE} DEL F2B_RES > /dev/null
|
||||
${REDIS_CMDLINE} DEL NETFILTER_RES > /dev/null
|
||||
|
||||
# Common functions
|
||||
get_ipv6(){
|
||||
|
@ -116,7 +116,7 @@ function mail_error() {
|
|||
fi
|
||||
WATCHDOG_NOTIFY_EMAIL=$(echo "${WATCHDOG_NOTIFY_EMAIL}" | sed 's/"//;s|"$||')
|
||||
# Some exceptions for subject and body formats
|
||||
if [[ ${1} == "fail2ban" ]]; then
|
||||
if [[ ${1} == "netfilter" ]]; then
|
||||
SUBJECT="${BODY}"
|
||||
BODY="Please see netfilter-mailcow for more details and triggered rules."
|
||||
else
|
||||
|
@ -607,29 +607,29 @@ mailq_checks() {
|
|||
return 1
|
||||
}
|
||||
|
||||
fail2ban_checks() {
|
||||
netfilter_checks() {
|
||||
err_count=0
|
||||
diff_c=0
|
||||
THRESHOLD=${FAIL2BAN_THRESHOLD}
|
||||
F2B_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS F2B_ACTIVE_BANS))
|
||||
F2B_RES=
|
||||
THRESHOLD=${NETFILTER_THRESHOLD}
|
||||
NETFILTER_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS NETFILTER_ACTIVE_BANS))
|
||||
NETFILTER_RES=
|
||||
# Reduce error count by 2 after restarting an unhealthy container
|
||||
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
|
||||
while [ ${err_count} -lt ${THRESHOLD} ]; do
|
||||
err_c_cur=${err_count}
|
||||
F2B_LOG_STATUS_PREV=(${F2B_LOG_STATUS[@]})
|
||||
F2B_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS F2B_ACTIVE_BANS))
|
||||
array_diff F2B_RES F2B_LOG_STATUS F2B_LOG_STATUS_PREV
|
||||
if [[ ! -z "${F2B_RES}" ]]; then
|
||||
NETFILTER_LOG_STATUS_PREV=(${NETFILTER_LOG_STATUS[@]})
|
||||
NETFILTER_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS NETFILTER_ACTIVE_BANS))
|
||||
array_diff NETFILTER_RES NETFILTER_LOG_STATUS NETFILTER_LOG_STATUS_PREV
|
||||
if [[ ! -z "${NETFILTER_RES}" ]]; then
|
||||
err_count=$(( ${err_count} + 1 ))
|
||||
echo -n "${F2B_RES[@]}" | tr -cd "[a-fA-F0-9.:/] " | timeout 3s ${REDIS_CMDLINE} -x SET F2B_RES > /dev/null
|
||||
echo -n "${NETFILTER_RES[@]}" | tr -cd "[a-fA-F0-9.:/] " | timeout 3s ${REDIS_CMDLINE} -x SET NETFILTER_RES > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
${REDIS_CMDLINE} -x DEL F2B_RES
|
||||
${REDIS_CMDLINE} -x DEL NETFILTER_RES
|
||||
fi
|
||||
fi
|
||||
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
|
||||
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
|
||||
progress "Fail2ban" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
|
||||
progress "Netfilter" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
|
||||
if [[ $? == 10 ]]; then
|
||||
diff_c=0
|
||||
sleep 1
|
||||
|
@ -944,14 +944,14 @@ BACKGROUND_TASKS+=(${PID})
|
|||
|
||||
(
|
||||
while true; do
|
||||
if ! fail2ban_checks; then
|
||||
log_msg "Fail2ban hit error limit"
|
||||
echo fail2ban > /tmp/com_pipe
|
||||
if ! netfilter_checks; then
|
||||
log_msg "Netfilter hit error limit"
|
||||
echo netfilter > /tmp/com_pipe
|
||||
fi
|
||||
done
|
||||
) &
|
||||
PID=$!
|
||||
echo "Spawned fail2ban_checks with PID ${PID}"
|
||||
echo "Spawned netfilter_checks with PID ${PID}"
|
||||
BACKGROUND_TASKS+=(${PID})
|
||||
|
||||
(
|
||||
|
@ -1056,15 +1056,15 @@ while true; do
|
|||
log_msg "acme-mailcow did not complete successfully"
|
||||
# Define $2 to override message text, else print service was restarted at ...
|
||||
[[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please check acme-mailcow for further information."
|
||||
elif [[ ${com_pipe_answer} == "fail2ban" ]]; then
|
||||
F2B_RES=($(timeout 4s ${REDIS_CMDLINE} --raw GET F2B_RES 2> /dev/null))
|
||||
if [[ ! -z "${F2B_RES}" ]]; then
|
||||
${REDIS_CMDLINE} DEL F2B_RES > /dev/null
|
||||
elif [[ ${com_pipe_answer} == "netfilter" ]]; then
|
||||
NETFILTER_RES=($(timeout 4s ${REDIS_CMDLINE} --raw GET NETFILTER_RES 2> /dev/null))
|
||||
if [[ ! -z "${NETFILTER_RES}" ]]; then
|
||||
${REDIS_CMDLINE} DEL NETFILTER_RES > /dev/null
|
||||
host=
|
||||
for host in "${F2B_RES[@]}"; do
|
||||
for host in "${NETFILTER_RES[@]}"; do
|
||||
log_msg "Banned ${host}"
|
||||
rm /tmp/fail2ban 2> /dev/null
|
||||
timeout 2s whois "${host}" > /tmp/fail2ban
|
||||
rm /tmp/netfilter 2> /dev/null
|
||||
timeout 2s whois "${host}" > /tmp/netfilter
|
||||
[[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && [[ ${WATCHDOG_NOTIFY_BAN} =~ ^([yY][eE][sS]|[yY])+$ ]] && mail_error "${com_pipe_answer}" "IP ban: ${host}"
|
||||
done
|
||||
fi
|
||||
|
|
|
@ -14,4 +14,4 @@ catch (Exception $e) {
|
|||
header('Content-Type: application/json');
|
||||
echo '{"error":"Unauthorized"}';
|
||||
error_log("Rspamd UI: Invalid password by " . $_SERVER['REMOTE_ADDR']);
|
||||
$redis->publish("F2B_CHANNEL", "Rspamd UI: Invalid password by " . $_SERVER['REMOTE_ADDR']);
|
||||
$redis->publish("NETFILTER_CHANNEL", "Rspamd UI: Invalid password by " . $_SERVER['REMOTE_ADDR']);
|
||||
|
|
|
@ -96,7 +96,7 @@ $template_data = [
|
|||
'domains' => $domains,
|
||||
'all_domains' => $all_domains,
|
||||
'mailboxes' => $mailboxes,
|
||||
'f2b_data' => fail2ban('get'),
|
||||
'netfilter_data' => netfilter('get'),
|
||||
'q_data' => quarantine('settings'),
|
||||
'qn_data' => quota_notification('get'),
|
||||
'rsettings_map' => file_get_contents('http://nginx:8081/settings.php'),
|
||||
|
|
|
@ -1999,7 +1999,7 @@ paths:
|
|||
- domain.tld
|
||||
- domain2.tld
|
||||
properties:
|
||||
items:
|
||||
items:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
|
@ -2993,7 +2993,7 @@ paths:
|
|||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
log:
|
||||
|
@ -3105,7 +3105,7 @@ paths:
|
|||
type: string
|
||||
type: object
|
||||
summary: Update domain
|
||||
/api/v1/edit/fail2ban:
|
||||
/api/v1/edit/netfilter:
|
||||
post:
|
||||
responses:
|
||||
"401":
|
||||
|
@ -3132,11 +3132,11 @@ paths:
|
|||
description: OK
|
||||
headers: {}
|
||||
tags:
|
||||
- Fail2Ban
|
||||
- Netfilter
|
||||
description: >-
|
||||
Using this endpoint you can edit the Fail2Ban config and black or
|
||||
Using this endpoint you can edit the Netfilter config and black or
|
||||
whitelist new ips.
|
||||
operationId: Edit Fail2Ban
|
||||
operationId: Edit Netfilter
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
|
@ -3153,7 +3153,7 @@ paths:
|
|||
items: none
|
||||
properties:
|
||||
attr:
|
||||
description: array containing the fail2ban settings
|
||||
description: array containing the netfilter settings
|
||||
properties:
|
||||
backlist:
|
||||
description: the backlisted ips or hostnames separated by comma
|
||||
|
@ -3182,7 +3182,7 @@ paths:
|
|||
items:
|
||||
description: has to be none
|
||||
type: object
|
||||
summary: Edit Fail2Ban
|
||||
summary: Edit Netfilter
|
||||
/api/v1/edit/mailbox:
|
||||
post:
|
||||
responses:
|
||||
|
@ -4069,7 +4069,7 @@ paths:
|
|||
description: You can list all domains existing in system.
|
||||
operationId: Get domains
|
||||
summary: Get domains
|
||||
/api/v1/get/fail2ban:
|
||||
/api/v1/get/netfilter:
|
||||
get:
|
||||
responses:
|
||||
"401":
|
||||
|
@ -4095,10 +4095,10 @@ paths:
|
|||
description: OK
|
||||
headers: {}
|
||||
tags:
|
||||
- Fail2Ban
|
||||
description: Gets the current Fail2Ban configuration.
|
||||
operationId: Get Fail2Ban Config
|
||||
summary: Get Fail2Ban Config
|
||||
- Netfilter
|
||||
description: Gets the current Netfilter configuration.
|
||||
operationId: Get Netfilter Config
|
||||
summary: Get Netfilter Config
|
||||
/api/v1/get/fwdhost/all:
|
||||
get:
|
||||
responses:
|
||||
|
@ -4522,7 +4522,7 @@ paths:
|
|||
hpnow: "1"
|
||||
hptotal: "1"
|
||||
lvl: "100"
|
||||
service: Fail2ban
|
||||
service: Netfilter
|
||||
time: "1569938958"
|
||||
- hpdiff: "0"
|
||||
hpnow: "5"
|
||||
|
@ -5580,8 +5580,8 @@ tags:
|
|||
description: Manage the postfix mail queue
|
||||
- name: Quarantine
|
||||
description: Check what emails went to quarantine
|
||||
- name: Fail2Ban
|
||||
description: Manage the Netfilter fail2ban options
|
||||
- name: Netfilter
|
||||
description: Manage the Netfilter netfilter options
|
||||
- name: DKIM
|
||||
description: Manage DKIM keys
|
||||
- name: Domain admin
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,329 +1,329 @@
|
|||
<?php
|
||||
function fail2ban($_action, $_data = null) {
|
||||
global $redis;
|
||||
$_data_log = $_data;
|
||||
switch ($_action) {
|
||||
case 'get':
|
||||
$f2b_options = array();
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
$f2b_options = json_decode($redis->Get('F2B_OPTIONS'), true);
|
||||
$f2b_options['regex'] = json_decode($redis->Get('F2B_REGEX'), true);
|
||||
$wl = $redis->hGetAll('F2B_WHITELIST');
|
||||
if (is_array($wl)) {
|
||||
foreach ($wl as $key => $value) {
|
||||
$tmp_wl_data[] = $key;
|
||||
}
|
||||
if (isset($tmp_wl_data)) {
|
||||
natsort($tmp_wl_data);
|
||||
$f2b_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data);
|
||||
}
|
||||
else {
|
||||
$f2b_options['whitelist'] = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$f2b_options['whitelist'] = "";
|
||||
}
|
||||
$bl = $redis->hGetAll('F2B_BLACKLIST');
|
||||
if (is_array($bl)) {
|
||||
foreach ($bl as $key => $value) {
|
||||
$tmp_bl_data[] = $key;
|
||||
}
|
||||
if (isset($tmp_bl_data)) {
|
||||
natsort($tmp_bl_data);
|
||||
$f2b_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data);
|
||||
}
|
||||
else {
|
||||
$f2b_options['blacklist'] = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$f2b_options['blacklist'] = "";
|
||||
}
|
||||
$pb = $redis->hGetAll('F2B_PERM_BANS');
|
||||
if (is_array($pb)) {
|
||||
foreach ($pb as $key => $value) {
|
||||
$f2b_options['perm_bans'][] = array(
|
||||
'network'=>$key,
|
||||
'ip' => strtok($key,'/')
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
$f2b_options['perm_bans'] = "";
|
||||
}
|
||||
$active_bans = $redis->hGetAll('F2B_ACTIVE_BANS');
|
||||
$queue_unban = $redis->hGetAll('F2B_QUEUE_UNBAN');
|
||||
if (is_array($active_bans)) {
|
||||
foreach ($active_bans as $network => $banned_until) {
|
||||
$queued_for_unban = (isset($queue_unban[$network]) && $queue_unban[$network] == 1) ? 1 : 0;
|
||||
$difference = $banned_until - time();
|
||||
$f2b_options['active_bans'][] = array(
|
||||
'queued_for_unban' => $queued_for_unban,
|
||||
'network' => $network,
|
||||
'ip' => strtok($network,'/'),
|
||||
'banned_until' => sprintf('%02dh %02dm %02ds', ($difference/3600), ($difference/60%60), $difference%60)
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$f2b_options['active_bans'] = "";
|
||||
}
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return $f2b_options;
|
||||
break;
|
||||
case 'edit':
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
// Start to read actions, if any
|
||||
if (isset($_data['action'])) {
|
||||
// Reset regex filters
|
||||
if ($_data['action'] == "reset-regex") {
|
||||
try {
|
||||
$redis->Del('F2B_REGEX');
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
// Rules will also be recreated on log events, but rules may seem empty for a second in the UI
|
||||
docker('post', 'netfilter-mailcow', 'restart');
|
||||
$fail_count = 0;
|
||||
$regex_result = json_decode($redis->Get('F2B_REGEX'), true);
|
||||
while (empty($regex_result) && $fail_count < 10) {
|
||||
$regex_result = json_decode($redis->Get('F2B_REGEX'), true);
|
||||
$fail_count++;
|
||||
sleep(1);
|
||||
}
|
||||
if ($fail_count >= 10) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('reset_f2b_regex')
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
elseif ($_data['action'] == "edit-regex") {
|
||||
if (!empty($_data['regex'])) {
|
||||
$rule_id = 1;
|
||||
$regex_array = array();
|
||||
foreach($_data['regex'] as $regex) {
|
||||
$regex_array[$rule_id] = $regex;
|
||||
$rule_id++;
|
||||
}
|
||||
if (!empty($regex_array)) {
|
||||
$redis->Set('F2B_REGEX', json_encode($regex_array, JSON_UNESCAPED_SLASHES));
|
||||
}
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('object_modified', htmlspecialchars($network))
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Start actions in dependency of network
|
||||
if (!empty($_data['network'])) {
|
||||
$networks = (array)$_data['network'];
|
||||
foreach ($networks as $network) {
|
||||
// Unban network
|
||||
if ($_data['action'] == "unban") {
|
||||
if (valid_network($network)) {
|
||||
try {
|
||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Whitelist network
|
||||
elseif ($_data['action'] == "whitelist") {
|
||||
if (empty($network)) { continue; }
|
||||
if (valid_network($network)) {
|
||||
try {
|
||||
$redis->hSet('F2B_WHITELIST', $network, 1);
|
||||
$redis->hDel('F2B_BLACKLIST', $network, 1);
|
||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $network)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Blacklist network
|
||||
elseif ($_data['action'] == "blacklist") {
|
||||
if (empty($network)) { continue; }
|
||||
if (valid_network($network) && !in_array($network, array(
|
||||
'0.0.0.0',
|
||||
'0.0.0.0/0',
|
||||
getenv('IPV4_NETWORK') . '0/24',
|
||||
getenv('IPV4_NETWORK') . '0',
|
||||
getenv('IPV6_NETWORK')
|
||||
))) {
|
||||
try {
|
||||
$redis->hSet('F2B_BLACKLIST', $network, 1);
|
||||
$redis->hDel('F2B_WHITELIST', $network, 1);
|
||||
//$response = docker('post', 'netfilter-mailcow', 'restart');
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $network)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('object_modified', htmlspecialchars($network))
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Start default edit without specific action
|
||||
$is_now = fail2ban('get');
|
||||
if (!empty($is_now)) {
|
||||
$ban_time = intval((isset($_data['ban_time'])) ? $_data['ban_time'] : $is_now['ban_time']);
|
||||
$max_attempts = intval((isset($_data['max_attempts'])) ? $_data['max_attempts'] : $is_now['max_attempts']);
|
||||
$retry_window = intval((isset($_data['retry_window'])) ? $_data['retry_window'] : $is_now['retry_window']);
|
||||
$netban_ipv4 = intval((isset($_data['netban_ipv4'])) ? $_data['netban_ipv4'] : $is_now['netban_ipv4']);
|
||||
$netban_ipv6 = intval((isset($_data['netban_ipv6'])) ? $_data['netban_ipv6'] : $is_now['netban_ipv6']);
|
||||
$wl = (isset($_data['whitelist'])) ? $_data['whitelist'] : $is_now['whitelist'];
|
||||
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$f2b_options = array();
|
||||
$f2b_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
|
||||
$f2b_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
|
||||
$f2b_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
|
||||
$f2b_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
|
||||
$f2b_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
|
||||
$f2b_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
|
||||
$f2b_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
|
||||
try {
|
||||
$redis->Set('F2B_OPTIONS', json_encode($f2b_options));
|
||||
$redis->Del('F2B_WHITELIST');
|
||||
$redis->Del('F2B_BLACKLIST');
|
||||
if(!empty($wl)) {
|
||||
$wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));
|
||||
$wl_array = array_filter($wl_array);
|
||||
if (is_array($wl_array)) {
|
||||
foreach ($wl_array as $wl_item) {
|
||||
if (valid_network($wl_item) || valid_hostname($wl_item)) {
|
||||
$redis->hSet('F2B_WHITELIST', $wl_item, 1);
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $wl_item)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($bl)) {
|
||||
$bl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $bl));
|
||||
$bl_array = array_filter($bl_array);
|
||||
if (is_array($bl_array)) {
|
||||
foreach ($bl_array as $bl_item) {
|
||||
if (valid_network($bl_item) && !in_array($bl_item, array(
|
||||
'0.0.0.0',
|
||||
'0.0.0.0/0',
|
||||
getenv('IPV4_NETWORK') . '0/24',
|
||||
getenv('IPV4_NETWORK') . '0',
|
||||
getenv('IPV6_NETWORK')
|
||||
))) {
|
||||
$redis->hSet('F2B_BLACKLIST', $bl_item, 1);
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $bl_item)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'f2b_modified'
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
<?php
|
||||
function netfilter($_action, $_data = null) {
|
||||
global $redis;
|
||||
$_data_log = $_data;
|
||||
switch ($_action) {
|
||||
case 'get':
|
||||
$netfilter_options = array();
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
$netfilter_options = json_decode($redis->Get('NETFILTER_OPTIONS'), true);
|
||||
$netfilter_options['regex'] = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||
$wl = $redis->hGetAll('NETFILTER_WHITELIST');
|
||||
if (is_array($wl)) {
|
||||
foreach ($wl as $key => $value) {
|
||||
$tmp_wl_data[] = $key;
|
||||
}
|
||||
if (isset($tmp_wl_data)) {
|
||||
natsort($tmp_wl_data);
|
||||
$netfilter_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data);
|
||||
}
|
||||
else {
|
||||
$netfilter_options['whitelist'] = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$netfilter_options['whitelist'] = "";
|
||||
}
|
||||
$bl = $redis->hGetAll('NETFILTER_BLACKLIST');
|
||||
if (is_array($bl)) {
|
||||
foreach ($bl as $key => $value) {
|
||||
$tmp_bl_data[] = $key;
|
||||
}
|
||||
if (isset($tmp_bl_data)) {
|
||||
natsort($tmp_bl_data);
|
||||
$netfilter_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data);
|
||||
}
|
||||
else {
|
||||
$netfilter_options['blacklist'] = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$netfilter_options['blacklist'] = "";
|
||||
}
|
||||
$pb = $redis->hGetAll('NETFILTER_PERM_BANS');
|
||||
if (is_array($pb)) {
|
||||
foreach ($pb as $key => $value) {
|
||||
$netfilter_options['perm_bans'][] = array(
|
||||
'network'=>$key,
|
||||
'ip' => strtok($key,'/')
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
$netfilter_options['perm_bans'] = "";
|
||||
}
|
||||
$active_bans = $redis->hGetAll('NETFILTER_ACTIVE_BANS');
|
||||
$queue_unban = $redis->hGetAll('NETFILTER_QUEUE_UNBAN');
|
||||
if (is_array($active_bans)) {
|
||||
foreach ($active_bans as $network => $banned_until) {
|
||||
$queued_for_unban = (isset($queue_unban[$network]) && $queue_unban[$network] == 1) ? 1 : 0;
|
||||
$difference = $banned_until - time();
|
||||
$netfilter_options['active_bans'][] = array(
|
||||
'queued_for_unban' => $queued_for_unban,
|
||||
'network' => $network,
|
||||
'ip' => strtok($network,'/'),
|
||||
'banned_until' => sprintf('%02dh %02dm %02ds', ($difference/3600), ($difference/60%60), $difference%60)
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$netfilter_options['active_bans'] = "";
|
||||
}
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return $netfilter_options;
|
||||
break;
|
||||
case 'edit':
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
// Start to read actions, if any
|
||||
if (isset($_data['action'])) {
|
||||
// Reset regex filters
|
||||
if ($_data['action'] == "reset-regex") {
|
||||
try {
|
||||
$redis->Del('NETFILTER_REGEX');
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
// Rules will also be recreated on log events, but rules may seem empty for a second in the UI
|
||||
docker('post', 'netfilter-mailcow', 'restart');
|
||||
$fail_count = 0;
|
||||
$regex_result = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||
while (empty($regex_result) && $fail_count < 10) {
|
||||
$regex_result = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||
$fail_count++;
|
||||
sleep(1);
|
||||
}
|
||||
if ($fail_count >= 10) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('reset_netfilter_regex')
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
elseif ($_data['action'] == "edit-regex") {
|
||||
if (!empty($_data['regex'])) {
|
||||
$rule_id = 1;
|
||||
$regex_array = array();
|
||||
foreach($_data['regex'] as $regex) {
|
||||
$regex_array[$rule_id] = $regex;
|
||||
$rule_id++;
|
||||
}
|
||||
if (!empty($regex_array)) {
|
||||
$redis->Set('NETFILTER_REGEX', json_encode($regex_array, JSON_UNESCAPED_SLASHES));
|
||||
}
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('object_modified', htmlspecialchars($network))
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Start actions in dependency of network
|
||||
if (!empty($_data['network'])) {
|
||||
$networks = (array)$_data['network'];
|
||||
foreach ($networks as $network) {
|
||||
// Unban network
|
||||
if ($_data['action'] == "unban") {
|
||||
if (valid_network($network)) {
|
||||
try {
|
||||
$redis->hSet('NETFILTER_QUEUE_UNBAN', $network, 1);
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Whitelist network
|
||||
elseif ($_data['action'] == "whitelist") {
|
||||
if (empty($network)) { continue; }
|
||||
if (valid_network($network)) {
|
||||
try {
|
||||
$redis->hSet('NETFILTER_WHITELIST', $network, 1);
|
||||
$redis->hDel('NETFILTER_BLACKLIST', $network, 1);
|
||||
$redis->hSet('NETFILTER_QUEUE_UNBAN', $network, 1);
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $network)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Blacklist network
|
||||
elseif ($_data['action'] == "blacklist") {
|
||||
if (empty($network)) { continue; }
|
||||
if (valid_network($network) && !in_array($network, array(
|
||||
'0.0.0.0',
|
||||
'0.0.0.0/0',
|
||||
getenv('IPV4_NETWORK') . '0/24',
|
||||
getenv('IPV4_NETWORK') . '0',
|
||||
getenv('IPV6_NETWORK')
|
||||
))) {
|
||||
try {
|
||||
$redis->hSet('NETFILTER_BLACKLIST', $network, 1);
|
||||
$redis->hDel('NETFILTER_WHITELIST', $network, 1);
|
||||
//$response = docker('post', 'netfilter-mailcow', 'restart');
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $network)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('object_modified', htmlspecialchars($network))
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Start default edit without specific action
|
||||
$is_now = netfilter('get');
|
||||
if (!empty($is_now)) {
|
||||
$ban_time = intval((isset($_data['ban_time'])) ? $_data['ban_time'] : $is_now['ban_time']);
|
||||
$max_attempts = intval((isset($_data['max_attempts'])) ? $_data['max_attempts'] : $is_now['max_attempts']);
|
||||
$retry_window = intval((isset($_data['retry_window'])) ? $_data['retry_window'] : $is_now['retry_window']);
|
||||
$netban_ipv4 = intval((isset($_data['netban_ipv4'])) ? $_data['netban_ipv4'] : $is_now['netban_ipv4']);
|
||||
$netban_ipv6 = intval((isset($_data['netban_ipv6'])) ? $_data['netban_ipv6'] : $is_now['netban_ipv6']);
|
||||
$wl = (isset($_data['whitelist'])) ? $_data['whitelist'] : $is_now['whitelist'];
|
||||
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$netfilter_options = array();
|
||||
$netfilter_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
|
||||
$netfilter_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
|
||||
$netfilter_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
|
||||
$netfilter_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
|
||||
$netfilter_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
|
||||
$netfilter_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
|
||||
$netfilter_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
|
||||
try {
|
||||
$redis->Set('NETFILTER_OPTIONS', json_encode($netfilter_options));
|
||||
$redis->Del('NETFILTER_WHITELIST');
|
||||
$redis->Del('NETFILTER_BLACKLIST');
|
||||
if(!empty($wl)) {
|
||||
$wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));
|
||||
$wl_array = array_filter($wl_array);
|
||||
if (is_array($wl_array)) {
|
||||
foreach ($wl_array as $wl_item) {
|
||||
if (valid_network($wl_item) || valid_hostname($wl_item)) {
|
||||
$redis->hSet('NETFILTER_WHITELIST', $wl_item, 1);
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $wl_item)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($bl)) {
|
||||
$bl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $bl));
|
||||
$bl_array = array_filter($bl_array);
|
||||
if (is_array($bl_array)) {
|
||||
foreach ($bl_array as $bl_item) {
|
||||
if (valid_network($bl_item) && !in_array($bl_item, array(
|
||||
'0.0.0.0',
|
||||
'0.0.0.0/0',
|
||||
getenv('IPV4_NETWORK') . '0/24',
|
||||
getenv('IPV4_NETWORK') . '0',
|
||||
getenv('IPV6_NETWORK')
|
||||
))) {
|
||||
$redis->hSet('NETFILTER_BLACKLIST', $bl_item, 1);
|
||||
}
|
||||
else {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('network_host_invalid', $bl_item)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||
'msg' => 'netfilter_modified'
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -274,7 +274,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.customize.inc.php';
|
|||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.dkim.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.docker.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.domain_admin.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.fail2ban.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.netfilter.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.fwdhost.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailbox.inc.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailq.inc.php';
|
||||
|
@ -317,7 +317,7 @@ $UI_TEXTS = customize('get', 'ui_texts');
|
|||
if (file_exists('/web/css/themes/'.$UI_THEME.'-bootstrap.css'))
|
||||
$css_minifier->add('/web/css/themes/'.$UI_THEME.'-bootstrap.css');
|
||||
else
|
||||
$css_minifier->add('/web/css/themes/lumen-bootstrap.css');
|
||||
$css_minifier->add('/web/css/themes/lumen-bootstrap.css');
|
||||
// minify css build files
|
||||
foreach ($css_dir as $css_file) {
|
||||
$css_minifier->add('/web/css/build/' . $css_file);
|
||||
|
|
|
@ -1,140 +1,140 @@
|
|||
<?php
|
||||
// Start session
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_httponly", 1);
|
||||
ini_set('session.gc_maxlifetime', $SESSION_LIFETIME);
|
||||
}
|
||||
|
||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
|
||||
strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_secure", 1);
|
||||
}
|
||||
$IS_HTTPS = true;
|
||||
}
|
||||
elseif (isset($_SERVER['HTTPS'])) {
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_secure", 1);
|
||||
}
|
||||
$IS_HTTPS = true;
|
||||
}
|
||||
else {
|
||||
$IS_HTTPS = false;
|
||||
}
|
||||
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (!isset($_SESSION['CSRF']['TOKEN'])) {
|
||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||
}
|
||||
|
||||
// Set session UA
|
||||
if (!isset($_SESSION['SESS_REMOTE_UA'])) {
|
||||
$_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
|
||||
}
|
||||
|
||||
// Keep session active
|
||||
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $SESSION_LIFETIME)) {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
}
|
||||
$_SESSION['LAST_ACTIVITY'] = time();
|
||||
|
||||
// API
|
||||
if (!empty($_SERVER['HTTP_X_API_KEY'])) {
|
||||
$stmt = $pdo->prepare("SELECT * FROM `api` WHERE `api_key` = :api_key AND `active` = '1';");
|
||||
$stmt->execute(array(
|
||||
':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY'])
|
||||
));
|
||||
$api_return = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!empty($api_return['api_key'])) {
|
||||
$skip_ip_check = ($api_return['skip_ip_check'] == 1);
|
||||
$remote = get_remote_ip(false);
|
||||
$allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from']));
|
||||
if ($skip_ip_check === true || ip_acl($remote, $allow_from)) {
|
||||
$_SESSION['mailcow_cc_username'] = 'API';
|
||||
$_SESSION['mailcow_cc_role'] = 'admin';
|
||||
$_SESSION['mailcow_cc_api'] = true;
|
||||
if ($api_return['access'] == 'rw') {
|
||||
$_SESSION['mailcow_cc_api_access'] = 'rw';
|
||||
}
|
||||
else {
|
||||
$_SESSION['mailcow_cc_api_access'] = 'ro';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
||||
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||
http_response_code(401);
|
||||
echo json_encode(array(
|
||||
'type' => 'error',
|
||||
'msg' => 'api access denied for ip ' . $_SERVER['REMOTE_ADDR']
|
||||
));
|
||||
unset($_POST);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
||||
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||
http_response_code(401);
|
||||
echo json_encode(array(
|
||||
'type' => 'error',
|
||||
'msg' => 'authentication failed'
|
||||
));
|
||||
unset($_POST);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
// Handle logouts
|
||||
if (isset($_POST["logout"])) {
|
||||
if (isset($_SESSION["dual-login"])) {
|
||||
$_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
|
||||
$_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
|
||||
unset($_SESSION["dual-login"]);
|
||||
header("Location: /mailbox");
|
||||
exit();
|
||||
}
|
||||
else {
|
||||
session_regenerate_id(true);
|
||||
session_unset();
|
||||
session_destroy();
|
||||
session_write_close();
|
||||
header("Location: /");
|
||||
}
|
||||
}
|
||||
|
||||
// Check session
|
||||
function session_check() {
|
||||
if (isset($_SESSION['mailcow_cc_api']) && $_SESSION['mailcow_cc_api'] === true) {
|
||||
return true;
|
||||
}
|
||||
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'warning',
|
||||
'msg' => 'session_ua'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (!empty($_POST)) {
|
||||
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'warning',
|
||||
'msg' => 'session_token'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
unset($_POST['csrf_token']);
|
||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||
$_SESSION['CSRF']['TIME'] = time();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
|
||||
$_POST = array();
|
||||
$_FILES = array();
|
||||
}
|
||||
<?php
|
||||
// Start session
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_httponly", 1);
|
||||
ini_set('session.gc_maxlifetime', $SESSION_LIFETIME);
|
||||
}
|
||||
|
||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
|
||||
strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_secure", 1);
|
||||
}
|
||||
$IS_HTTPS = true;
|
||||
}
|
||||
elseif (isset($_SERVER['HTTPS'])) {
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
ini_set("session.cookie_secure", 1);
|
||||
}
|
||||
$IS_HTTPS = true;
|
||||
}
|
||||
else {
|
||||
$IS_HTTPS = false;
|
||||
}
|
||||
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (!isset($_SESSION['CSRF']['TOKEN'])) {
|
||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||
}
|
||||
|
||||
// Set session UA
|
||||
if (!isset($_SESSION['SESS_REMOTE_UA'])) {
|
||||
$_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
|
||||
}
|
||||
|
||||
// Keep session active
|
||||
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $SESSION_LIFETIME)) {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
}
|
||||
$_SESSION['LAST_ACTIVITY'] = time();
|
||||
|
||||
// API
|
||||
if (!empty($_SERVER['HTTP_X_API_KEY'])) {
|
||||
$stmt = $pdo->prepare("SELECT * FROM `api` WHERE `api_key` = :api_key AND `active` = '1';");
|
||||
$stmt->execute(array(
|
||||
':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY'])
|
||||
));
|
||||
$api_return = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!empty($api_return['api_key'])) {
|
||||
$skip_ip_check = ($api_return['skip_ip_check'] == 1);
|
||||
$remote = get_remote_ip(false);
|
||||
$allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from']));
|
||||
if ($skip_ip_check === true || ip_acl($remote, $allow_from)) {
|
||||
$_SESSION['mailcow_cc_username'] = 'API';
|
||||
$_SESSION['mailcow_cc_role'] = 'admin';
|
||||
$_SESSION['mailcow_cc_api'] = true;
|
||||
if ($api_return['access'] == 'rw') {
|
||||
$_SESSION['mailcow_cc_api_access'] = 'rw';
|
||||
}
|
||||
else {
|
||||
$_SESSION['mailcow_cc_api_access'] = 'ro';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$redis->publish("NETFILTER_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
||||
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||
http_response_code(401);
|
||||
echo json_encode(array(
|
||||
'type' => 'error',
|
||||
'msg' => 'api access denied for ip ' . $_SERVER['REMOTE_ADDR']
|
||||
));
|
||||
unset($_POST);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$redis->publish("NETFILTER_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
||||
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||
http_response_code(401);
|
||||
echo json_encode(array(
|
||||
'type' => 'error',
|
||||
'msg' => 'authentication failed'
|
||||
));
|
||||
unset($_POST);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
// Handle logouts
|
||||
if (isset($_POST["logout"])) {
|
||||
if (isset($_SESSION["dual-login"])) {
|
||||
$_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
|
||||
$_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
|
||||
unset($_SESSION["dual-login"]);
|
||||
header("Location: /mailbox");
|
||||
exit();
|
||||
}
|
||||
else {
|
||||
session_regenerate_id(true);
|
||||
session_unset();
|
||||
session_destroy();
|
||||
session_write_close();
|
||||
header("Location: /");
|
||||
}
|
||||
}
|
||||
|
||||
// Check session
|
||||
function session_check() {
|
||||
if (isset($_SESSION['mailcow_cc_api']) && $_SESSION['mailcow_cc_api'] === true) {
|
||||
return true;
|
||||
}
|
||||
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'warning',
|
||||
'msg' => 'session_ua'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (!empty($_POST)) {
|
||||
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'warning',
|
||||
'msg' => 'session_token'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
unset($_POST['csrf_token']);
|
||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||
$_SESSION['CSRF']['TIME'] = time();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
|
||||
$_POST = array();
|
||||
$_FILES = array();
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ jQuery(function($){
|
|||
event.preventDefault();
|
||||
var regex_map_id = $(this).data('regex-map');
|
||||
var regex_data = $(jq(regex_map_id)).val().split(/\r?\n/);
|
||||
var regex_valid = true;
|
||||
for(var i = 0;i < regex_data.length;i++){
|
||||
if(regex_data[i].startsWith('#') || !regex_data[i]){
|
||||
continue;
|
||||
|
@ -706,9 +705,9 @@ jQuery(function($){
|
|||
cols = '<td><input class="input-sm input-xs-lg form-control" data-id="app_links" type="text" name="app" required></td>';
|
||||
cols += '<td><input class="input-sm input-xs-lg form-control" data-id="app_links" type="text" name="href" required></td>';
|
||||
cols += '<td><a href="#" role="button" class="btn btn-sm btn-xs-lg btn-secondary h-100 w-100" type="button">' + lang.remove_row + '</a></td>';
|
||||
} else if (type == "f2b_regex") {
|
||||
cols = '<td><input style="text-align:center" class="input-sm input-xs-lg form-control" data-id="f2b_regex" type="text" value="+" disabled></td>';
|
||||
cols += '<td><input class="input-sm input-xs-lg form-control regex-input" data-id="f2b_regex" type="text" name="regex" required></td>';
|
||||
} else if (type == "netfilter_regex") {
|
||||
cols = '<td><input style="text-align:center" class="input-sm input-xs-lg form-control" data-id="netfilter_regex" type="text" value="+" disabled></td>';
|
||||
cols += '<td><input class="input-sm input-xs-lg form-control regex-input" data-id="netfilter_regex" type="text" name="regex" required></td>';
|
||||
cols += '<td><a href="#" role="button" class="btn btn-sm btn-xs-lg btn-secondary h-100 w-100" type="button">' + lang.remove_row + '</a></td>';
|
||||
}
|
||||
row.append(cols);
|
||||
|
@ -718,14 +717,14 @@ jQuery(function($){
|
|||
e.preventDefault();
|
||||
$(this).parents('tr').remove();
|
||||
});
|
||||
$('#f2b_regex_table').on('click', 'tr a', function (e) {
|
||||
$('#netfilter_regex_table').on('click', 'tr a', function (e) {
|
||||
e.preventDefault();
|
||||
$(this).parents('tr').remove();
|
||||
});
|
||||
$('#add_app_link_row').click(function() {
|
||||
add_table_row($('#app_link_table'), "app_link");
|
||||
});
|
||||
$('#add_f2b_regex_row').click(function() {
|
||||
add_table_row($('#f2b_regex_table'), "f2b_regex");
|
||||
$('#add_netfilter_regex_row').click(function() {
|
||||
add_table_row($('#netfilter_regex_table'), "netfilter_regex");
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1310,10 +1310,10 @@ if (isset($_GET['query'])) {
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case "fail2ban":
|
||||
case "netfilter":
|
||||
switch ($object) {
|
||||
default:
|
||||
$data = fail2ban('get');
|
||||
$data = netfilter('get');
|
||||
process_get_return($data);
|
||||
break;
|
||||
}
|
||||
|
@ -1917,8 +1917,8 @@ if (isset($_GET['query'])) {
|
|||
case "fwdhost":
|
||||
process_edit_return(fwdhost('edit', array_merge(array('fwdhost' => $items), $attr)));
|
||||
break;
|
||||
case "fail2ban":
|
||||
process_edit_return(fail2ban('edit', array_merge(array('network' => $items), $attr)));
|
||||
case "netfilter":
|
||||
process_edit_return(netfilter('edit', array_merge(array('network' => $items), $attr)));
|
||||
break;
|
||||
case "ui_texts":
|
||||
process_edit_return(customize('edit', 'ui_texts', $attr));
|
||||
|
|
|
@ -90,13 +90,13 @@
|
|||
"domain_admins": "Administradores de dominio",
|
||||
"edit": "Editar",
|
||||
"empty": "Sense resultats",
|
||||
"f2b_ban_time": "Temsp de bloqueig (s)",
|
||||
"f2b_max_attempts": "Intents màx.",
|
||||
"f2b_netban_ipv4": "Suxarxa IPv4 on aplicar el bloqueig (8-32)",
|
||||
"f2b_netban_ipv6": "Suxarxa IPv6 on aplicar el bloqueig (8-128)",
|
||||
"f2b_parameters": "Fail2ban",
|
||||
"f2b_retry_window": "Finestra de reintent (s) per intents màx.",
|
||||
"f2b_whitelist": "Llista blanca de xarxes/hosts",
|
||||
"netfilter_ban_time": "Temsp de bloqueig (s)",
|
||||
"netfilter_max_attempts": "Intents màx.",
|
||||
"netfilter_netban_ipv4": "Suxarxa IPv4 on aplicar el bloqueig (8-32)",
|
||||
"netfilter_netban_ipv6": "Suxarxa IPv6 on aplicar el bloqueig (8-128)",
|
||||
"netfilter_parameters": "Netfilter",
|
||||
"netfilter_retry_window": "Finestra de reintent (s) per intents màx.",
|
||||
"netfilter_whitelist": "Llista blanca de xarxes/hosts",
|
||||
"filter_table": "Filtrar taula",
|
||||
"forwarding_hosts": "Forwarding Hosts",
|
||||
"forwarding_hosts_add_hint": "Podeu especificar adreces IPv4/IPv6, xarxes en notació CIDR, noms de host (que es resoldran a adreces IP) o noms de domini (que es resoldran a les adreces IP consultant els registres SPF o, si no n'hi ha, registres MX ).",
|
||||
|
@ -418,7 +418,7 @@
|
|||
"domain_modified": "S'han desat els canvis fets al domini %s",
|
||||
"domain_removed": "S'ha elminat el domini %s",
|
||||
"eas_reset": "S'ha fet un reset als dispositius ActiveSync de l'usuari %s",
|
||||
"f2b_modified": "S'han desat els canvis fets als parametres del Fail2ban",
|
||||
"netfilter_modified": "S'han desat els canvis fets als parametres del Netfilter",
|
||||
"forwarding_host_added": "Forwarding host %s afegit",
|
||||
"forwarding_host_removed": "Forwarding host %s esborrat",
|
||||
"item_deleted": "S'ha esborrat %s",
|
||||
|
|
|
@ -174,17 +174,17 @@
|
|||
"edit": "Upravit",
|
||||
"empty": "Žádné výsledky",
|
||||
"excludes": "Vyloučit tyto příjemce",
|
||||
"f2b_ban_time": "Doba blokování (s)",
|
||||
"f2b_blacklist": "Sítě/hostitelé na blacklistu",
|
||||
"f2b_filter": "Regex filtre",
|
||||
"f2b_list_info": "Síť nebo hostitelé na blacklistu mají vždy větší váhu než položky na whitelistu. Blacklist se sestavuje vždy při startu kontejneru.",
|
||||
"f2b_max_attempts": "Max. pokusů",
|
||||
"f2b_netban_ipv4": "Rozsah IPv4 podsítě k zablokování (8-32)",
|
||||
"f2b_netban_ipv6": "Rozsah IPv6 podsítě k zablokování (8-128)",
|
||||
"f2b_parameters": "Parametry automatického firewallu",
|
||||
"f2b_regex_info": "Záznamy které se berou v úvahu: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Časový horizont pro maximum pokusů (s)",
|
||||
"f2b_whitelist": "Sítě/hostitelé na whitelistu",
|
||||
"netfilter_ban_time": "Doba blokování (s)",
|
||||
"netfilter_blacklist": "Sítě/hostitelé na blacklistu",
|
||||
"netfilter_filter": "Regex filtre",
|
||||
"netfilter_list_info": "Síť nebo hostitelé na blacklistu mají vždy větší váhu než položky na whitelistu. Blacklist se sestavuje vždy při startu kontejneru.",
|
||||
"netfilter_max_attempts": "Max. pokusů",
|
||||
"netfilter_netban_ipv4": "Rozsah IPv4 podsítě k zablokování (8-32)",
|
||||
"netfilter_netban_ipv6": "Rozsah IPv6 podsítě k zablokování (8-128)",
|
||||
"netfilter_parameters": "Parametry automatického firewallu",
|
||||
"netfilter_regex_info": "Záznamy které se berou v úvahu: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Časový horizont pro maximum pokusů (s)",
|
||||
"netfilter_whitelist": "Sítě/hostitelé na whitelistu",
|
||||
"filter_table": "Tabulka filtrů",
|
||||
"forwarding_hosts": "Předávající servery",
|
||||
"forwarding_hosts_add_hint": "Lze zadat IPv4/IPv6 adresy, sítě ve formátu CIDR, názvy serverů (budou převedeny na IP adresy) nebo názvy domén (budou převedeny na IP pomocí SPF záznamů, příp. MX záznamů).",
|
||||
|
@ -423,7 +423,7 @@
|
|||
"redis_error": "Chyba Redis: %s",
|
||||
"relayhost_invalid": "Položky %s je neplatná",
|
||||
"release_send_failed": "Zprávu nelze propustit: %s",
|
||||
"reset_f2b_regex": "Regex filtr se nepodařilo resetovat, zkuste to znovu nebo počkejte pár sekund a obnovte stránku.",
|
||||
"reset_netfilter_regex": "Regex filtr se nepodařilo resetovat, zkuste to znovu nebo počkejte pár sekund a obnovte stránku.",
|
||||
"resource_invalid": "Název zdroje %s je neplatný",
|
||||
"rl_timeframe": "Nesprávný časový rámec omezení provozu",
|
||||
"rspamd_ui_pw_length": "Heslo pro Rspamd UI musí mít alespoň 6 znaků",
|
||||
|
@ -938,7 +938,7 @@
|
|||
"domain_removed": "Doména %s odebrána",
|
||||
"dovecot_restart_success": "Dovecot byl úspěšně restartován",
|
||||
"eas_reset": "ActiveSync zařízení uživatele %s vyresetováno",
|
||||
"f2b_modified": "Změny v parametrech automatického firewallu uloženy",
|
||||
"netfilter_modified": "Změny v parametrech automatického firewallu uloženy",
|
||||
"forwarding_host_added": "Předávající hostitel %s přidán",
|
||||
"forwarding_host_removed": "Předávající hostitel %s odebrán",
|
||||
"global_filter_written": "Filtr byl úspěšně zapsán",
|
||||
|
|
|
@ -165,17 +165,17 @@
|
|||
"edit": "Redigere",
|
||||
"empty": "Ingen resultater",
|
||||
"excludes": "Ekskluderer disse modtagere",
|
||||
"f2b_ban_time": "Udelukkelses tid (s)",
|
||||
"f2b_blacklist": "Sortlistede netværk/værter",
|
||||
"f2b_filter": "Regex filtre",
|
||||
"f2b_list_info": "En sortlistet vært eller et netværk opvejer altid en hvidlisted eksistens. <b> Listeopdateringer tager nogle få sekunder at blive anvendt. </b> ",
|
||||
"f2b_max_attempts": "Max. forsøg",
|
||||
"f2b_netban_ipv4": "IPv4 subnet størrelse at anvende forbud mod (8-32)",
|
||||
"f2b_netban_ipv6": "IPv6 subnet størrelse at anvende forbud mod (8-128)",
|
||||
"f2b_parameters": "Fail2ban parametre",
|
||||
"f2b_regex_info": "Logfiler taget i betragtning: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Genindlæs vindue om (s) for max. forsøg",
|
||||
"f2b_whitelist": "Hvidlisted netværk/vært",
|
||||
"netfilter_ban_time": "Udelukkelses tid (s)",
|
||||
"netfilter_blacklist": "Sortlistede netværk/værter",
|
||||
"netfilter_filter": "Regex filtre",
|
||||
"netfilter_list_info": "En sortlistet vært eller et netværk opvejer altid en hvidlisted eksistens. <b> Listeopdateringer tager nogle få sekunder at blive anvendt. </b> ",
|
||||
"netfilter_max_attempts": "Max. forsøg",
|
||||
"netfilter_netban_ipv4": "IPv4 subnet størrelse at anvende forbud mod (8-32)",
|
||||
"netfilter_netban_ipv6": "IPv6 subnet størrelse at anvende forbud mod (8-128)",
|
||||
"netfilter_parameters": "Netfilter parametre",
|
||||
"netfilter_regex_info": "Logfiler taget i betragtning: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Genindlæs vindue om (s) for max. forsøg",
|
||||
"netfilter_whitelist": "Hvidlisted netværk/vært",
|
||||
"filter_table": "Filtertabel",
|
||||
"forwarding_hosts": "Videresendelse af værter",
|
||||
"forwarding_hosts_add_hint": "Du kan enten angive IPv4 / IPv6-adresser, netværk i CIDR-notation, værtsnavne (som løses til IP-adresser) eller domænenavne (som løses til IP-adresser ved at spørge SPF-poster eller i mangel af MX-poster).",
|
||||
|
@ -395,7 +395,7 @@
|
|||
"redis_error": "Redis fejl: %s",
|
||||
"relayhost_invalid": "Kortindtastning %s er ugyldig",
|
||||
"release_send_failed": "Beskeden kunne ikke frigives: %s",
|
||||
"reset_f2b_regex": "Regex filter kunne ikke nulstilles i tide, prøv igen eller vent et par sekunder mere, og genindlæs webstedet.",
|
||||
"reset_netfilter_regex": "Regex filter kunne ikke nulstilles i tide, prøv igen eller vent et par sekunder mere, og genindlæs webstedet.",
|
||||
"resource_invalid": "Ressource navn %s er ugyldig",
|
||||
"rl_timeframe": "Tidsramme for satsbegrænsning er forkert",
|
||||
"rspamd_ui_pw_length": "Rspamd UI adgangskoden skal være mindst 6 tegn lang",
|
||||
|
@ -845,7 +845,7 @@
|
|||
"domain_removed": "Domæne %s er blevet fjernet",
|
||||
"dovecot_restart_success": "Dovecot blev genstartet",
|
||||
"eas_reset": "ActiveSync-enheder til bruger %s blev nulstillet",
|
||||
"f2b_modified": "Changes to Fail2ban parameters have been saved",
|
||||
"netfilter_modified": "Changes to Netfilter parameters have been saved",
|
||||
"forwarding_host_added": "Videresendende vært %s er tilføjet",
|
||||
"forwarding_host_removed": "Videresendende vært %s er blevet fjernet",
|
||||
"global_filter_written": "Filtret blev skrevet til filen",
|
||||
|
|
|
@ -174,17 +174,17 @@
|
|||
"edit": "Bearbeiten",
|
||||
"empty": "Keine Einträge vorhanden",
|
||||
"excludes": "Diese Empfänger ausschließen",
|
||||
"f2b_ban_time": "Bannzeit in Sekunden",
|
||||
"f2b_blacklist": "Blacklist für Netzwerke und Hosts",
|
||||
"f2b_filter": "Regex-Filter",
|
||||
"f2b_list_info": "Ein Host oder Netzwerk auf der Blacklist wird immer eine Whitelist-Einheit überwiegen. <b>Die Aktualisierung der Liste dauert einige Sekunden.</b>",
|
||||
"f2b_max_attempts": "Max. Versuche",
|
||||
"f2b_netban_ipv4": "Netzbereich für IPv4-Banns (8-32)",
|
||||
"f2b_netban_ipv6": "Netzbereich für IPv6-Banns (8-128)",
|
||||
"f2b_parameters": "Fail2ban-Parameter",
|
||||
"f2b_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Wiederholungen im Zeitraum von (s)",
|
||||
"f2b_whitelist": "Whitelist für Netzwerke und Hosts",
|
||||
"netfilter_ban_time": "Bannzeit in Sekunden",
|
||||
"netfilter_blacklist": "Blacklist für Netzwerke und Hosts",
|
||||
"netfilter_filter": "Regex-Filter",
|
||||
"netfilter_list_info": "Ein Host oder Netzwerk auf der Blacklist wird immer eine Whitelist-Einheit überwiegen. <b>Die Aktualisierung der Liste dauert einige Sekunden.</b>",
|
||||
"netfilter_max_attempts": "Max. Versuche",
|
||||
"netfilter_netban_ipv4": "Netzbereich für IPv4-Banns (8-32)",
|
||||
"netfilter_netban_ipv6": "Netzbereich für IPv6-Banns (8-128)",
|
||||
"netfilter_parameters": "Netfilter-Parameter",
|
||||
"netfilter_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Wiederholungen im Zeitraum von (s)",
|
||||
"netfilter_whitelist": "Whitelist für Netzwerke und Hosts",
|
||||
"filter_table": "Tabelle filtern",
|
||||
"forwarding_hosts": "Weiterleitungs-Hosts",
|
||||
"forwarding_hosts_add_hint": "Sie können entweder IPv4-/IPv6-Adressen, Netzwerke in CIDR-Notation, Hostnamen (die zu IP-Adressen aufgelöst werden), oder Domainnamen (die zu IP-Adressen aufgelöst werden, indem ihr SPF-Record abgefragt wird oder, in dessen Abwesenheit, ihre MX-Records) angeben.",
|
||||
|
@ -431,7 +431,7 @@
|
|||
"redis_error": "Redis Fehler: %s",
|
||||
"relayhost_invalid": "Map-Eintrag %s ist ungültig",
|
||||
"release_send_failed": "Die Nachricht konnte nicht versendet werden: %s",
|
||||
"reset_f2b_regex": "Regex-Filter konnten nicht in vorgegebener Zeit zurückgesetzt werden, bitte erneut versuchen oder die Webseite neu laden.",
|
||||
"reset_netfilter_regex": "Regex-Filter konnten nicht in vorgegebener Zeit zurückgesetzt werden, bitte erneut versuchen oder die Webseite neu laden.",
|
||||
"resource_invalid": "Ressourcenname %s ist ungültig",
|
||||
"rl_timeframe": "Ratelimit-Zeitraum ist inkorrekt",
|
||||
"rspamd_ui_pw_length": "Rspamd UI-Passwort muss mindestens 6 Zeichen lang sein",
|
||||
|
@ -1002,7 +1002,7 @@
|
|||
"domain_removed": "Domain %s wurde entfernt",
|
||||
"dovecot_restart_success": "Dovecot wurde erfolgreich neu gestartet",
|
||||
"eas_reset": "ActiveSync Gerät des Benutzers %s wurde zurückgesetzt",
|
||||
"f2b_modified": "Änderungen an Fail2ban-Parametern wurden gespeichert",
|
||||
"netfilter_modified": "Änderungen an Netfilter-Parametern wurden gespeichert",
|
||||
"forwarding_host_added": "Weiterleitungs-Host %s wurde hinzugefügt",
|
||||
"forwarding_host_removed": "Weiterleitungs-Host %s wurde entfernt",
|
||||
"global_filter_written": "Filterdatei wurde erfolgreich geschrieben",
|
||||
|
|
|
@ -176,17 +176,17 @@
|
|||
"edit": "Edit",
|
||||
"empty": "No results",
|
||||
"excludes": "Excludes these recipients",
|
||||
"f2b_ban_time": "Ban time (s)",
|
||||
"f2b_blacklist": "Blacklisted networks/hosts",
|
||||
"f2b_filter": "Regex filters",
|
||||
"f2b_list_info": "A blacklisted host or network will always outweigh a whitelist entity. <b>List updates will take a few seconds to be applied.</b>",
|
||||
"f2b_max_attempts": "Max. attempts",
|
||||
"f2b_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||
"f2b_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||
"f2b_parameters": "Fail2ban parameters",
|
||||
"f2b_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Retry window (s) for max. attempts",
|
||||
"f2b_whitelist": "Whitelisted networks/hosts",
|
||||
"netfilter_ban_time": "Ban time (s)",
|
||||
"netfilter_blacklist": "Blacklisted networks/hosts",
|
||||
"netfilter_filter": "Regex filters",
|
||||
"netfilter_list_info": "A blacklisted host or network will always outweigh a whitelist entity. <b>List updates will take a few seconds to be applied.</b>",
|
||||
"netfilter_max_attempts": "Max. attempts",
|
||||
"netfilter_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||
"netfilter_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||
"netfilter_parameters": "Netfilter parameters",
|
||||
"netfilter_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Retry window (s) for max. attempts",
|
||||
"netfilter_whitelist": "Whitelisted networks/hosts",
|
||||
"filter_table": "Filter table",
|
||||
"forwarding_hosts": "Forwarding Hosts",
|
||||
"forwarding_hosts_add_hint": "You can either specify IPv4/IPv6 addresses, networks in CIDR notation, host names (which will be resolved to IP addresses), or domain names (which will be resolved to IP addresses by querying SPF records or, in their absence, MX records).",
|
||||
|
@ -432,7 +432,7 @@
|
|||
"redis_error": "Redis error: %s",
|
||||
"relayhost_invalid": "Map entry %s is invalid",
|
||||
"release_send_failed": "Message could not be released: %s",
|
||||
"reset_f2b_regex": "Regex filter could not be reset in time, please try again or wait a few more seconds and reload the website.",
|
||||
"reset_netfilter_regex": "Regex filter could not be reset in time, please try again or wait a few more seconds and reload the website.",
|
||||
"resource_invalid": "Resource name %s is invalid",
|
||||
"rl_timeframe": "Rate limit time frame is incorrect",
|
||||
"rspamd_ui_pw_length": "Rspamd UI password should be at least 6 chars long",
|
||||
|
@ -1015,7 +1015,7 @@
|
|||
"domain_removed": "Domain %s has been removed",
|
||||
"dovecot_restart_success": "Dovecot was restarted successfully",
|
||||
"eas_reset": "ActiveSync devices for user %s were reset",
|
||||
"f2b_modified": "Changes to Fail2ban parameters have been saved",
|
||||
"netfilter_modified": "Changes to Netfilter parameters have been saved",
|
||||
"forwarding_host_added": "Forwarding host %s has been added",
|
||||
"forwarding_host_removed": "Forwarding host %s has been removed",
|
||||
"global_filter_written": "Filter was successfully written to file",
|
||||
|
|
|
@ -140,15 +140,15 @@
|
|||
"edit": "Editar",
|
||||
"empty": "Sin resultados",
|
||||
"excludes": "Excluye a estos destinatarios",
|
||||
"f2b_ban_time": "Tiempo de restricción (s)",
|
||||
"f2b_blacklist": "Redes y hosts en lista negra",
|
||||
"f2b_list_info": "Un host o red en lista negra siempre superará a una entidad de la lista blanca. <b>Las actualizaciones de la lista tardarán unos segundos en aplicarse.</b>",
|
||||
"f2b_max_attempts": "Max num. de intentos",
|
||||
"f2b_netban_ipv4": "Tamaño de subred IPv4 para aplicar la restricción (8-32)",
|
||||
"f2b_netban_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)",
|
||||
"f2b_parameters": "Parametros Fail2ban",
|
||||
"f2b_retry_window": "Ventana de tiempo entre reintentos",
|
||||
"f2b_whitelist": "Redes y hosts en lista blanca",
|
||||
"netfilter_ban_time": "Tiempo de restricción (s)",
|
||||
"netfilter_blacklist": "Redes y hosts en lista negra",
|
||||
"netfilter_list_info": "Un host o red en lista negra siempre superará a una entidad de la lista blanca. <b>Las actualizaciones de la lista tardarán unos segundos en aplicarse.</b>",
|
||||
"netfilter_max_attempts": "Max num. de intentos",
|
||||
"netfilter_netban_ipv4": "Tamaño de subred IPv4 para aplicar la restricción (8-32)",
|
||||
"netfilter_netban_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)",
|
||||
"netfilter_parameters": "Parametros Netfilter",
|
||||
"netfilter_retry_window": "Ventana de tiempo entre reintentos",
|
||||
"netfilter_whitelist": "Redes y hosts en lista blanca",
|
||||
"filter_table": "Filtrar tabla",
|
||||
"forwarding_hosts": "Hosts de reenvío",
|
||||
"forwarding_hosts_add_hint": "Se puede especificar direcciones IPv4 / IPv6, redes en notación CIDR, nombres de host (que se resolverán en direcciones IP) o dominios (que se resolverán en direcciones IP consultando registros SPF o, en su defecto, registros MX)",
|
||||
|
|
|
@ -149,15 +149,15 @@
|
|||
"edit": "Muokata",
|
||||
"empty": "Ei tuloksia",
|
||||
"excludes": "Sulkee pois nämä vastaanottajat",
|
||||
"f2b_ban_time": "Ban aika (s)",
|
||||
"f2b_blacklist": "Mustalla listalla verkot/isännät",
|
||||
"f2b_list_info": "Mustalla listalla oleva isäntä tai verkko on aina suurempi kuin sallitut-entiteetti. <b>Luettelon päivitykset otetaan käyttöön muutaman sekunnin kuluttua.</b>",
|
||||
"f2b_max_attempts": "Maksmi. Yritykset",
|
||||
"f2b_netban_ipv4": "IPv4 aliverkon koko kiellon soveltamiseksi (8-32)",
|
||||
"f2b_netban_ipv6": "IPv6 aliverkon koko kiellon soveltamiseksi (8-128)",
|
||||
"f2b_parameters": "Fail2ban parametrit",
|
||||
"f2b_retry_window": "Yritä uudelleen-ikkuna (s) Max. Yrittää",
|
||||
"f2b_whitelist": "Sallitut verkot/isännät",
|
||||
"netfilter_ban_time": "Ban aika (s)",
|
||||
"netfilter_blacklist": "Mustalla listalla verkot/isännät",
|
||||
"netfilter_list_info": "Mustalla listalla oleva isäntä tai verkko on aina suurempi kuin sallitut-entiteetti. <b>Luettelon päivitykset otetaan käyttöön muutaman sekunnin kuluttua.</b>",
|
||||
"netfilter_max_attempts": "Maksmi. Yritykset",
|
||||
"netfilter_netban_ipv4": "IPv4 aliverkon koko kiellon soveltamiseksi (8-32)",
|
||||
"netfilter_netban_ipv6": "IPv6 aliverkon koko kiellon soveltamiseksi (8-128)",
|
||||
"netfilter_parameters": "Netfilter parametrit",
|
||||
"netfilter_retry_window": "Yritä uudelleen-ikkuna (s) Max. Yrittää",
|
||||
"netfilter_whitelist": "Sallitut verkot/isännät",
|
||||
"filter_table": "Suodata taulukko",
|
||||
"forwarding_hosts": "Palveluntarjoajien välittäminen",
|
||||
"forwarding_hosts_add_hint": "Voit joko määrittää IPv4 / IPv6-osoitteet, verkot CIDR-merkinnässä, isäntänimet (jotka määritetään IP-osoitteiksi) tai verkkotunnusten nimet (jotka määritetään IP-osoitteiksi kyselyllä SPF-tietueista tai niiden puuttuessa MX-tietueista). .",
|
||||
|
@ -725,7 +725,7 @@
|
|||
"domain_modified": "Muutokset verkkotunnus alueeseen %s on tallennettu",
|
||||
"domain_removed": "Verkkotunnus %s on poistettu",
|
||||
"eas_reset": "ActiveSync-laitteet käyttäjälle %s nollataan",
|
||||
"f2b_modified": "Fail2ban parametrien muutokset on tallennettu",
|
||||
"netfilter_modified": "Netfilter parametrien muutokset on tallennettu",
|
||||
"forwarding_host_added": "Välitys host %s on lisätty",
|
||||
"forwarding_host_removed": "Välitys host %s on poistettu",
|
||||
"hash_deleted": "Hash poistettu",
|
||||
|
|
|
@ -171,17 +171,17 @@
|
|||
"edit": "Editer",
|
||||
"empty": "Aucun résultat",
|
||||
"excludes": "Exclure ces destinataires",
|
||||
"f2b_ban_time": "Durée du bannissement(s)",
|
||||
"f2b_blacklist": "Réseaux/Domaines sur Liste Noire",
|
||||
"f2b_filter": "Filtre(s) Regex",
|
||||
"f2b_list_info": "Un hôte ou un réseau sur liste noire l'emportera toujours sur une entité de liste blanche. <b>L'application des mises à jour de liste prendra quelques secondes.</b>",
|
||||
"f2b_max_attempts": "Nb max. de tentatives",
|
||||
"f2b_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)",
|
||||
"f2b_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)",
|
||||
"f2b_parameters": "Paramètres Fail2ban",
|
||||
"f2b_regex_info": "Logs pris en compte : SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives",
|
||||
"f2b_whitelist": "Réseaux/hôtes en liste blanche",
|
||||
"netfilter_ban_time": "Durée du bannissement(s)",
|
||||
"netfilter_blacklist": "Réseaux/Domaines sur Liste Noire",
|
||||
"netfilter_filter": "Filtre(s) Regex",
|
||||
"netfilter_list_info": "Un hôte ou un réseau sur liste noire l'emportera toujours sur une entité de liste blanche. <b>L'application des mises à jour de liste prendra quelques secondes.</b>",
|
||||
"netfilter_max_attempts": "Nb max. de tentatives",
|
||||
"netfilter_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)",
|
||||
"netfilter_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)",
|
||||
"netfilter_parameters": "Paramètres Netfilter",
|
||||
"netfilter_regex_info": "Logs pris en compte : SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives",
|
||||
"netfilter_whitelist": "Réseaux/hôtes en liste blanche",
|
||||
"filter_table": "Table de filtrage",
|
||||
"forwarding_hosts": "Hôtes de réexpédition",
|
||||
"forwarding_hosts_add_hint": "Vous pouvez aussi bien indiquer des adresses IPv4/IPv6, des réseaux en notation CIDR, des noms d'hôtes (qui seront convertis en adresses IP), ou des noms de domaine (qui seront convertis en adresses IP par une requête SPF ou, en son absence, l'enregistrement MX).",
|
||||
|
@ -410,7 +410,7 @@
|
|||
"redis_error": "Erreur Redis : %s",
|
||||
"relayhost_invalid": "La saisie de la carte %s est invalide",
|
||||
"release_send_failed": "Le message n’a pas pu être diffusé : %s",
|
||||
"reset_f2b_regex": "Le filtre regex n'a pas pu être réinitialisé à temps, veuillez réessayer ou attendre quelques secondes de plus et recharger le site web.",
|
||||
"reset_netfilter_regex": "Le filtre regex n'a pas pu être réinitialisé à temps, veuillez réessayer ou attendre quelques secondes de plus et recharger le site web.",
|
||||
"resource_invalid": "Le nom de la resource %s n'est pas valide",
|
||||
"rl_timeframe": "Le délai limite du taux est incorrect",
|
||||
"rspamd_ui_pw_length": "Le mot de passe de l'interface Rspamd doit être de 6 caratères au minimum",
|
||||
|
@ -874,7 +874,7 @@
|
|||
"domain_removed": "Le domaine %s a été supprimé",
|
||||
"dovecot_restart_success": "Dovecot a été relancé avec succès",
|
||||
"eas_reset": "Les périphériques Activesync pour l’utilisateur %s ont été réinitialisés",
|
||||
"f2b_modified": "Les modifications apportées aux paramètres Fail2ban ont été enregistrées",
|
||||
"netfilter_modified": "Les modifications apportées aux paramètres Netfilter ont été enregistrées",
|
||||
"forwarding_host_added": "Ajout de l’hôte de réacheminement %s",
|
||||
"forwarding_host_removed": "Suppression de l’hôte de réacheminement %s",
|
||||
"global_filter_written": "Le filtre a été écrit avec succès dans le fichier",
|
||||
|
|
|
@ -174,17 +174,17 @@
|
|||
"edit": "Modifica",
|
||||
"empty": "Nessun risultato",
|
||||
"excludes": "Esclude questi destinatari",
|
||||
"f2b_ban_time": "Tempo di blocco (s)",
|
||||
"f2b_blacklist": "Host/reti in blacklist",
|
||||
"f2b_filter": "Filtri Regex",
|
||||
"f2b_list_info": "Un host oppure una rete in blacklist, avrà sempre un peso maggiore rispetto ad una in whitelist. <b>L'aggiornamento della lista richiede alcuni secondi per la sua entrata in azione.</b>",
|
||||
"f2b_max_attempts": "Tentativi massimi",
|
||||
"f2b_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||
"f2b_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||
"f2b_parameters": "Parametri Fail2ban",
|
||||
"f2b_regex_info": "Log presi in considerazione: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Retry window (s) for max. attempts",
|
||||
"f2b_whitelist": "Host/reti in whitelist",
|
||||
"netfilter_ban_time": "Tempo di blocco (s)",
|
||||
"netfilter_blacklist": "Host/reti in blacklist",
|
||||
"netfilter_filter": "Filtri Regex",
|
||||
"netfilter_list_info": "Un host oppure una rete in blacklist, avrà sempre un peso maggiore rispetto ad una in whitelist. <b>L'aggiornamento della lista richiede alcuni secondi per la sua entrata in azione.</b>",
|
||||
"netfilter_max_attempts": "Tentativi massimi",
|
||||
"netfilter_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||
"netfilter_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||
"netfilter_parameters": "Parametri Netfilter",
|
||||
"netfilter_regex_info": "Log presi in considerazione: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Retry window (s) for max. attempts",
|
||||
"netfilter_whitelist": "Host/reti in whitelist",
|
||||
"filter_table": "Tabella filtro",
|
||||
"forwarding_hosts": "Inoltro degli host",
|
||||
"forwarding_hosts_add_hint": "È possibile specificare indirizzi IPv4 / IPv6, reti nella notazione CIDR, nomi host (che verranno risolti in indirizzi IP) o nomi di dominio (che verranno risolti agli indirizzi IP richiamando i record SPF o, in assenza, i record MX) .",
|
||||
|
@ -426,7 +426,7 @@
|
|||
"redis_error": "Redis error: %s",
|
||||
"relayhost_invalid": "Map entry %s is invalid",
|
||||
"release_send_failed": "Message could not be released: %s",
|
||||
"reset_f2b_regex": "Regex filter could not be reset in time, please try again or wait a few more seconds and reload the website.",
|
||||
"reset_netfilter_regex": "Regex filter could not be reset in time, please try again or wait a few more seconds and reload the website.",
|
||||
"resource_invalid": "Il nome della risorsa non è valido",
|
||||
"rl_timeframe": "Rate limit time frame is incorrect",
|
||||
"rspamd_ui_pw_length": "Rspamd UI password should be at least 6 chars long",
|
||||
|
@ -972,7 +972,7 @@
|
|||
"domain_removed": "Il dominio %s è stato aggiunto",
|
||||
"dovecot_restart_success": "Dovecot è stato riavviato con successo",
|
||||
"eas_reset": "I dispositivi ActiveSync dell'utente %s sono stati resettati",
|
||||
"f2b_modified": "Le modifiche ai parametri Fail2ban sono state salvate",
|
||||
"netfilter_modified": "Le modifiche ai parametri Netfilter sono state salvate",
|
||||
"forwarding_host_added": "Inoltro dell' host %s è stato aggiunto",
|
||||
"forwarding_host_removed": "Inoltro dell' host %s è stato rimosso",
|
||||
"global_filter_written": "Il filtro è stato scritto con successo nel file",
|
||||
|
|
|
@ -163,15 +163,15 @@
|
|||
"edit": "편집",
|
||||
"empty": "값이 없음",
|
||||
"excludes": "다음 수신자 제외",
|
||||
"f2b_ban_time": "차단 시간 (s)",
|
||||
"f2b_blacklist": "블랙리스트에 기록된 네트워크/호스트",
|
||||
"f2b_list_info": "블랙리스트에 기록된 호스트 혹은 네트워크는 항상 화이트 리스트보다 먼저 고려됩니다. <b>리스트를 업데이트하면 적용되는데 시간이 조금 걸릴 수 있습니다.</b>",
|
||||
"f2b_max_attempts": "최대 시도 횟수",
|
||||
"f2b_netban_ipv4": "차단할 IPv4 서브넷 크기 (8-32)",
|
||||
"f2b_netban_ipv6": "차단할 IPv6 서브넷 크기 (8-128)",
|
||||
"f2b_parameters": "Fail2ban 변수",
|
||||
"f2b_retry_window": "최대 시도 횟수",
|
||||
"f2b_whitelist": "화이트리스트에 저장된 네트워크/호스트",
|
||||
"netfilter_ban_time": "차단 시간 (s)",
|
||||
"netfilter_blacklist": "블랙리스트에 기록된 네트워크/호스트",
|
||||
"netfilter_list_info": "블랙리스트에 기록된 호스트 혹은 네트워크는 항상 화이트 리스트보다 먼저 고려됩니다. <b>리스트를 업데이트하면 적용되는데 시간이 조금 걸릴 수 있습니다.</b>",
|
||||
"netfilter_max_attempts": "최대 시도 횟수",
|
||||
"netfilter_netban_ipv4": "차단할 IPv4 서브넷 크기 (8-32)",
|
||||
"netfilter_netban_ipv6": "차단할 IPv6 서브넷 크기 (8-128)",
|
||||
"netfilter_parameters": "Netfilter 변수",
|
||||
"netfilter_retry_window": "최대 시도 횟수",
|
||||
"netfilter_whitelist": "화이트리스트에 저장된 네트워크/호스트",
|
||||
"filter_table": "필터 테이블",
|
||||
"forwarding_hosts": "포워딩 호스트",
|
||||
"forwarding_hosts_add_hint": "IPv4/IPv6 주소, CIDR 방식의 네트워크, 호스트 이름 (IP 주소로 확인된 호스트 이름), 또는 도메인 이름 (SPF 레코드를 쿼리하거나 MX레코드가 없는 경우 IP 주소로 확인된 도메인 이름)을 지정할 수 있습니다.",
|
||||
|
@ -819,7 +819,7 @@
|
|||
"domain_removed": "Domain %s has been removed",
|
||||
"dovecot_restart_success": "Dovecot was restarted successfully",
|
||||
"eas_reset": "ActiveSync devices for user %s were reset",
|
||||
"f2b_modified": "Changes to Fail2ban parameters have been saved",
|
||||
"netfilter_modified": "Changes to Netfilter parameters have been saved",
|
||||
"forwarding_host_added": "Forwarding host %s has been added",
|
||||
"forwarding_host_removed": "Forwarding host %s has been removed",
|
||||
"global_filter_written": "Filter was successfully written to file",
|
||||
|
|
|
@ -89,13 +89,13 @@
|
|||
"domain_admins": "Domēna administratori",
|
||||
"edit": "Labot",
|
||||
"empty": "Nav rezultātu",
|
||||
"f2b_ban_time": "Aizlieguma laiks (s)",
|
||||
"f2b_max_attempts": "Maks. piegājieni",
|
||||
"f2b_netban_ipv4": "IPv4 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-32)",
|
||||
"f2b_netban_ipv6": "IPv6 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-128)",
|
||||
"f2b_parameters": "Fail2ban parametri",
|
||||
"f2b_retry_window": "Atkārtošanas logs (s) priekš maks. piegājiena",
|
||||
"f2b_whitelist": "Baltā saraksta tīkls/hosts",
|
||||
"netfilter_ban_time": "Aizlieguma laiks (s)",
|
||||
"netfilter_max_attempts": "Maks. piegājieni",
|
||||
"netfilter_netban_ipv4": "IPv4 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-32)",
|
||||
"netfilter_netban_ipv6": "IPv6 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-128)",
|
||||
"netfilter_parameters": "Netfilter parametri",
|
||||
"netfilter_retry_window": "Atkārtošanas logs (s) priekš maks. piegājiena",
|
||||
"netfilter_whitelist": "Baltā saraksta tīkls/hosts",
|
||||
"filter_table": "Filtru tabula",
|
||||
"forwarding_hosts": "Hostu pārsūtīšana",
|
||||
"forwarding_hosts_add_hint": "Jūs varat norādīt IPv4/IPv6 addreses, tīklu iekš CIDR apzīmējuma, hosta nosaukumu (kas tiks atrisinātas IP adresēs), vai domēna vārdos (kas tiks atrisināts IP adresēs vaicājot SPF ierakstus vai, ja tādu nav, MX ierakstus).",
|
||||
|
@ -426,7 +426,7 @@
|
|||
"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",
|
||||
"f2b_modified": "Izmaiņas Fail2ban parameteriem ir saglabātas",
|
||||
"netfilter_modified": "Izmaiņas Netfilter parameteriem ir saglabātas",
|
||||
"forwarding_host_added": "Pāradresācijas hosts %s pievienotsd",
|
||||
"forwarding_host_removed": "Pāradresācijas hosts %s noņemts",
|
||||
"item_deleted": "Vērtība %s veiksmīgi dzēsta",
|
||||
|
|
|
@ -167,17 +167,17 @@
|
|||
"edit": "Wijzig",
|
||||
"empty": "Geen resultaten",
|
||||
"excludes": "Exclusief",
|
||||
"f2b_ban_time": "Verbanningstijd (s)",
|
||||
"f2b_blacklist": "Netwerken/hosts op de blacklist",
|
||||
"f2b_filter": "Regex-filters",
|
||||
"f2b_list_info": "Een host of netwerk op de blacklist staat altijd boven eenzelfde op de whitelist. <b>Het doorvoeren van wijzigingen kan enkele seconden in beslag nemen.</b>",
|
||||
"f2b_max_attempts": "Maximaal aantal pogingen",
|
||||
"f2b_netban_ipv4": "Voer de IPv4-subnetgrootte in waar de verbanning van kracht moet zijn (8-32)",
|
||||
"f2b_netban_ipv6": "Voer de IPv6-subnetgrootte in waar de verbanning van kracht moet zijn (8-128)",
|
||||
"f2b_parameters": "Fail2ban",
|
||||
"f2b_regex_info": "De volgende logs worden gebruikt: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Tijdsbestek voor maximale pogingen (s)",
|
||||
"f2b_whitelist": "Netwerken/hosts op de whitelist",
|
||||
"netfilter_ban_time": "Verbanningstijd (s)",
|
||||
"netfilter_blacklist": "Netwerken/hosts op de blacklist",
|
||||
"netfilter_filter": "Regex-filters",
|
||||
"netfilter_list_info": "Een host of netwerk op de blacklist staat altijd boven eenzelfde op de whitelist. <b>Het doorvoeren van wijzigingen kan enkele seconden in beslag nemen.</b>",
|
||||
"netfilter_max_attempts": "Maximaal aantal pogingen",
|
||||
"netfilter_netban_ipv4": "Voer de IPv4-subnetgrootte in waar de verbanning van kracht moet zijn (8-32)",
|
||||
"netfilter_netban_ipv6": "Voer de IPv6-subnetgrootte in waar de verbanning van kracht moet zijn (8-128)",
|
||||
"netfilter_parameters": "Netfilter",
|
||||
"netfilter_regex_info": "De volgende logs worden gebruikt: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Tijdsbestek voor maximale pogingen (s)",
|
||||
"netfilter_whitelist": "Netwerken/hosts op de whitelist",
|
||||
"filter_table": "Filtertabel",
|
||||
"forwarding_hosts": "Forwarding hosts",
|
||||
"forwarding_hosts_add_hint": "Het is mogelijk om IPv4- of IPv6-adressen, netwerken in CIDR-notatie, hostnames (worden omgezet naar IP-adressen) of domeinnamen (worden tevens omgezet naar IP-adressen of, bij gebrek daaraan, MX-records) op te geven.",
|
||||
|
@ -397,7 +397,7 @@
|
|||
"redis_error": "Redis-error: %s",
|
||||
"relayhost_invalid": "Invoer %s is ongeldig",
|
||||
"release_send_failed": "Het volgende bericht kon niet worden vrijgegeven: %s",
|
||||
"reset_f2b_regex": "Regex-filters konden niet worden hersteld, probeer het opnieuw of herlaad de pagina over enkele seconden.",
|
||||
"reset_netfilter_regex": "Regex-filters konden niet worden hersteld, probeer het opnieuw of herlaad de pagina over enkele seconden.",
|
||||
"resource_invalid": "Naam van resource %s is ongeldig",
|
||||
"rl_timeframe": "Ratelimit-tijdsbestek is ongeldig",
|
||||
"rspamd_ui_pw_length": "Rspamd-wachtwoord dient minstens 6 tekens lang te zijn",
|
||||
|
@ -857,7 +857,7 @@
|
|||
"domain_removed": "Domein %s is verwijderd",
|
||||
"dovecot_restart_success": "Dovecot is succesvol herstart",
|
||||
"eas_reset": "De ActiveSync-apparaatcache van gebruiker %s is hersteld",
|
||||
"f2b_modified": "Wijzigingen aan Fail2ban zijn opgeslagen",
|
||||
"netfilter_modified": "Wijzigingen aan Netfilter zijn opgeslagen",
|
||||
"forwarding_host_added": "Forwarding host %s is toegevoegd",
|
||||
"forwarding_host_removed": "Forwarding host %s is verwijderd",
|
||||
"global_filter_written": "Filter is opgeslagen",
|
||||
|
|
|
@ -66,11 +66,11 @@
|
|||
"domain_admins": "Administratorzy domeny",
|
||||
"edit": "Edytuj",
|
||||
"empty": "Brak wyników",
|
||||
"f2b_ban_time": "Czas bana (s)",
|
||||
"f2b_max_attempts": "Max. ilość prób",
|
||||
"f2b_parameters": "Parametry Fail2ban",
|
||||
"f2b_retry_window": "Spróbuj ponownie (s) dla max. ilości prób",
|
||||
"f2b_whitelist": "Biała lista sieci/hosty",
|
||||
"netfilter_ban_time": "Czas bana (s)",
|
||||
"netfilter_max_attempts": "Max. ilość prób",
|
||||
"netfilter_parameters": "Parametry Netfilter",
|
||||
"netfilter_retry_window": "Spróbuj ponownie (s) dla max. ilości prób",
|
||||
"netfilter_whitelist": "Biała lista sieci/hosty",
|
||||
"filter_table": "Tabela filtru",
|
||||
"forwarding_hosts": "Hosty przekazujące",
|
||||
"forwarding_hosts_add_hint": "Możesz albo wyszczególnić adresy IPv4/IPv6, sieci w notacji CIDR, nazwy hostów (które zostaną rozłożone na adresy IP), albo nazwy domen (które zostaną rozłożone na adresy IP poprzez sprawdzanie rekordów SPF lub, w razie ich braku, rekordów MX).",
|
||||
|
@ -310,7 +310,7 @@
|
|||
"domain_modified": "Zapisano zmiany w domenie %s",
|
||||
"domain_removed": "Usunięto domenę %s",
|
||||
"eas_reset": "Zresetowano urządzenia ActiveSync dla użytkownika %s",
|
||||
"f2b_modified": "Zmiany w Fail2ban zostały zapisane",
|
||||
"netfilter_modified": "Zmiany w Netfilter zostały zapisane",
|
||||
"forwarding_host_added": "Dodano hosta przekazującego %s",
|
||||
"forwarding_host_removed": "Usunięto hosta przekazującego %s",
|
||||
"item_deleted": "",
|
||||
|
|
|
@ -175,17 +175,17 @@
|
|||
"edit": "Editează",
|
||||
"empty": "Nici un rezultat",
|
||||
"excludes": "Exclude acești destinatari",
|
||||
"f2b_ban_time": "Timp interdicție (s)",
|
||||
"f2b_blacklist": "Rețele/gazde pe lista neagră",
|
||||
"f2b_filter": "Filtre regex",
|
||||
"f2b_list_info": "O gazdă sau o rețea pe lista neagră va depăși întotdeauna o entitate pe lista albă. Înregistrările din lista neagră sunt create la data încărcării containerului. Înregistrările din lista albă sunt citite de fiecare dată când se va aplica o interdicție.",
|
||||
"f2b_max_attempts": "Număr maxim încercări",
|
||||
"f2b_netban_ipv4": "Dimensiunea subrețelei IPv4 pentru a aplica interdicția (8-32)",
|
||||
"f2b_netban_ipv6": "Dimensiunea subrețelei IPv6 pentru a aplica interdicția (8-128)",
|
||||
"f2b_parameters": "Parametrii fail2ban",
|
||||
"f2b_regex_info": "Jurnalele luate în considerare: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Reîncercați fereastra (ele) pentru max. încercări",
|
||||
"f2b_whitelist": "Rețele/gazde pe lista albă",
|
||||
"netfilter_ban_time": "Timp interdicție (s)",
|
||||
"netfilter_blacklist": "Rețele/gazde pe lista neagră",
|
||||
"netfilter_filter": "Filtre regex",
|
||||
"netfilter_list_info": "O gazdă sau o rețea pe lista neagră va depăși întotdeauna o entitate pe lista albă. Înregistrările din lista neagră sunt create la data încărcării containerului. Înregistrările din lista albă sunt citite de fiecare dată când se va aplica o interdicție.",
|
||||
"netfilter_max_attempts": "Număr maxim încercări",
|
||||
"netfilter_netban_ipv4": "Dimensiunea subrețelei IPv4 pentru a aplica interdicția (8-32)",
|
||||
"netfilter_netban_ipv6": "Dimensiunea subrețelei IPv6 pentru a aplica interdicția (8-128)",
|
||||
"netfilter_parameters": "Parametrii Netfilter",
|
||||
"netfilter_regex_info": "Jurnalele luate în considerare: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Reîncercați fereastra (ele) pentru max. încercări",
|
||||
"netfilter_whitelist": "Rețele/gazde pe lista albă",
|
||||
"filter_table": "Tabel filtre",
|
||||
"forwarding_hosts": "Gazde de redirecționare",
|
||||
"forwarding_hosts_add_hint": "Poți specifica fie adrese IPv4 / IPv6, rețele în notație CIDR, nume gazdă (care vor fi rezolvate la adrese IP), fie nume de domenii (care vor fi rezolvate la adrese IP prin interogarea înregistrărilor SPF sau, în absența acestora, a înregistrărilor MX).",
|
||||
|
@ -423,7 +423,7 @@
|
|||
"redis_error": "Eroare Redis: %s",
|
||||
"relayhost_invalid": "Intrarea hărții %s este invalidă",
|
||||
"release_send_failed": "Mesajul nu a putut fi eliberat: %s",
|
||||
"reset_f2b_regex": "Filtrul regex nu a putut fi resetat la timp, încercați din nou sau așteptați câteva secunde și reîncărcați pagina.",
|
||||
"reset_netfilter_regex": "Filtrul regex nu a putut fi resetat la timp, încercați din nou sau așteptați câteva secunde și reîncărcați pagina.",
|
||||
"resource_invalid": "Numele de resurse %s este invalid",
|
||||
"rl_timeframe": "Rata limită pentru intervalul de timp este incorectă",
|
||||
"rspamd_ui_pw_length": "Parola Rspamd UI ar trebui să aibă cel puțin 6 caractere",
|
||||
|
@ -944,7 +944,7 @@
|
|||
"domain_removed": "Domeniul %s a fost adăugat",
|
||||
"dovecot_restart_success": "Dovecot a fost restartat cu succes",
|
||||
"eas_reset": "Dispozitivele ActiveSync pentru utilizatorul %s au fost resetate",
|
||||
"f2b_modified": "Modificările parametrilor Fail2ban au fost salvate",
|
||||
"netfilter_modified": "Modificările parametrilor Netfilter au fost salvate",
|
||||
"forwarding_host_added": "Gazda de redirecționare %s a fost adăugată",
|
||||
"forwarding_host_removed": "Gazda de redirecționare %s a fost eliminată",
|
||||
"global_filter_written": "Filtru a fost scris cu succes în fișier",
|
||||
|
|
|
@ -176,17 +176,17 @@
|
|||
"edit": "Изменить",
|
||||
"empty": "Пусто",
|
||||
"excludes": "Исключает этих получателей",
|
||||
"f2b_ban_time": "Время бана (в секундах)",
|
||||
"f2b_blacklist": "Черный список подсетей/хостов",
|
||||
"f2b_filter": "Правила фильтрации с помощью регулярных выражений",
|
||||
"f2b_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
||||
"f2b_max_attempts": "Максимальное количество попыток",
|
||||
"f2b_netban_ipv4": "Размер подсети IPv4 для применения бана (8-32)",
|
||||
"f2b_netban_ipv6": "Размер подсети IPv6 для применения бана (8-128)",
|
||||
"f2b_parameters": "Настройки Fail2ban",
|
||||
"f2b_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
||||
"f2b_whitelist": "Белый список подсетей/хостов",
|
||||
"netfilter_ban_time": "Время бана (в секундах)",
|
||||
"netfilter_blacklist": "Черный список подсетей/хостов",
|
||||
"netfilter_filter": "Правила фильтрации с помощью регулярных выражений",
|
||||
"netfilter_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
||||
"netfilter_max_attempts": "Максимальное количество попыток",
|
||||
"netfilter_netban_ipv4": "Размер подсети IPv4 для применения бана (8-32)",
|
||||
"netfilter_netban_ipv6": "Размер подсети IPv6 для применения бана (8-128)",
|
||||
"netfilter_parameters": "Настройки Netfilter",
|
||||
"netfilter_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
||||
"netfilter_whitelist": "Белый список подсетей/хостов",
|
||||
"filter_table": "Поиск",
|
||||
"forwarding_hosts": "Переадресация хостов",
|
||||
"forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).",
|
||||
|
@ -425,7 +425,7 @@
|
|||
"redis_error": "Ошибка в Redis: %s",
|
||||
"relayhost_invalid": "Правило %s не валидное",
|
||||
"release_send_failed": "Сообщение не может быть восстановлено: %s",
|
||||
"reset_f2b_regex": "Сброс фильтров не был выполнен за отведённый промежуток времени, пожалуйста, повторите попытку или подождите еще несколько секунд и перезагрузите веб страницу.",
|
||||
"reset_netfilter_regex": "Сброс фильтров не был выполнен за отведённый промежуток времени, пожалуйста, повторите попытку или подождите еще несколько секунд и перезагрузите веб страницу.",
|
||||
"resource_invalid": "Недопустимое имя ресурса",
|
||||
"rl_timeframe": "Не верный временной интервал для лимита отправки",
|
||||
"rspamd_ui_pw_length": "Длина пароля должна составлять не менее 6 символов для Rspamd UI",
|
||||
|
@ -942,7 +942,7 @@
|
|||
"domain_removed": "Домен %s удалён",
|
||||
"dovecot_restart_success": "Dovecot перезапущен успешно",
|
||||
"eas_reset": "Кеш ActiveSync для пользователя %s был сброшен",
|
||||
"f2b_modified": "Изменения параметров Fail2ban сохранены",
|
||||
"netfilter_modified": "Изменения параметров Netfilter сохранены",
|
||||
"forwarding_host_added": "Перенаправление узла %s добавлено",
|
||||
"forwarding_host_removed": "Перенаправление узла %s удалено",
|
||||
"global_filter_written": "Фильтр успешно записан в файл",
|
||||
|
|
|
@ -175,17 +175,17 @@
|
|||
"edit": "Upraviť",
|
||||
"empty": "Žiadne výsledky",
|
||||
"excludes": "Vylúčiť týchto príjemcov",
|
||||
"f2b_ban_time": "Dĺžka blokovania (s)",
|
||||
"f2b_blacklist": "Blacklist sietí/hostiteľov",
|
||||
"f2b_filter": "Regex filtre",
|
||||
"f2b_list_info": "Blacklist hostiteľov alebo sietí vždy preváži nad whitelistom. <b>Aktualizácia zoznamov potrvá niekoľko sekúnd.</b>",
|
||||
"f2b_max_attempts": "Max. počet pokusov",
|
||||
"f2b_netban_ipv4": "Veľkosť IPv4 subnetu na ktorý sa aplikuje zákaz (8-32)",
|
||||
"f2b_netban_ipv6": "Veľkosť IPv6 subnetu na ktorý sa aplikuje zákaz (8-128)",
|
||||
"f2b_parameters": "Parametre automatického firewallu",
|
||||
"f2b_regex_info": "Záznamy ktoré sa berú do úvahy: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Čas v ktorom je treba uplatniť max. počet pokusov (s)",
|
||||
"f2b_whitelist": "Whitelist sietí/hostiteľov",
|
||||
"netfilter_ban_time": "Dĺžka blokovania (s)",
|
||||
"netfilter_blacklist": "Blacklist sietí/hostiteľov",
|
||||
"netfilter_filter": "Regex filtre",
|
||||
"netfilter_list_info": "Blacklist hostiteľov alebo sietí vždy preváži nad whitelistom. <b>Aktualizácia zoznamov potrvá niekoľko sekúnd.</b>",
|
||||
"netfilter_max_attempts": "Max. počet pokusov",
|
||||
"netfilter_netban_ipv4": "Veľkosť IPv4 subnetu na ktorý sa aplikuje zákaz (8-32)",
|
||||
"netfilter_netban_ipv6": "Veľkosť IPv6 subnetu na ktorý sa aplikuje zákaz (8-128)",
|
||||
"netfilter_parameters": "Parametre automatického firewallu",
|
||||
"netfilter_regex_info": "Záznamy ktoré sa berú do úvahy: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Čas v ktorom je treba uplatniť max. počet pokusov (s)",
|
||||
"netfilter_whitelist": "Whitelist sietí/hostiteľov",
|
||||
"filter_table": "Tabuľka filtrov",
|
||||
"forwarding_hosts": "Preposielacie servery",
|
||||
"forwarding_hosts_add_hint": "Môžete buď špecifikovať IPv4/IPv6 adresy, siete v CIDR notácii, názvy serverov (ktoré budú preložené na IP adresy), alebo doménové mená (ktoré budú ako IP získané z SPF záznamov, alebo v prípade ich neprítomnosti, pomocou MX záznamov).",
|
||||
|
@ -424,7 +424,7 @@
|
|||
"redis_error": "Redis chyba: %s",
|
||||
"relayhost_invalid": "Položka %s je neplatná",
|
||||
"release_send_failed": "Správa nemohla byť uvoľnená: %s",
|
||||
"reset_f2b_regex": "Regex filter sa nepodarilo resetovať, skúste to znovu alebo počkajte pár sekúnd a obnovte stránku.",
|
||||
"reset_netfilter_regex": "Regex filter sa nepodarilo resetovať, skúste to znovu alebo počkajte pár sekúnd a obnovte stránku.",
|
||||
"resource_invalid": "Zdrojové meno %s je neplatné",
|
||||
"rl_timeframe": "Obmedzenie časového rámca je nesprávny",
|
||||
"rspamd_ui_pw_length": "Heslo pre Rspamd rozhranie by malo mať minimálne 6 znakov",
|
||||
|
@ -944,7 +944,7 @@
|
|||
"domain_removed": "Doména %s odstránená",
|
||||
"dovecot_restart_success": "Dovecot sa úspešne reštartoval",
|
||||
"eas_reset": "ActiveSync zariadenia pre používateľa %s resetovaný",
|
||||
"f2b_modified": "Zmeny v parametroch automatického firewallu uložené",
|
||||
"netfilter_modified": "Zmeny v parametroch automatického firewallu uložené",
|
||||
"forwarding_host_added": "Doručovací hostiteľ %s pridaný",
|
||||
"forwarding_host_removed": "Doručovací hostiteľ %s vymazaný",
|
||||
"global_filter_written": "Filter bol úspešne zapísaný do súboru",
|
||||
|
|
|
@ -173,17 +173,17 @@
|
|||
"edit": "Ändra",
|
||||
"empty": "Inga resultat",
|
||||
"excludes": "Exkludera dessa mottagare",
|
||||
"f2b_ban_time": "Banlysning i sekunder",
|
||||
"f2b_blacklist": "Svartlistade nätverk/värdar",
|
||||
"f2b_filter": "Regex-filter",
|
||||
"f2b_list_info": "En värd eller ett nätverk som finns på en svartlista kommer alltid stå över en vitlista. <b>Uppdateringar av listan kan ta några sekunder att genomföra.</b>",
|
||||
"f2b_max_attempts": "Maximalt antal försök",
|
||||
"f2b_netban_ipv4": "Storleken på ett IPv4 subnät, att applicera banlysning på (8-32)",
|
||||
"f2b_netban_ipv6": "Storleken på ett IPv6 subnät, att applicera banlysning på (8-128)",
|
||||
"f2b_parameters": "Fail2ban parametrar",
|
||||
"f2b_regex_info": "Loggarna avser: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Tidsfönster för antal försök",
|
||||
"f2b_whitelist": "Vitlistade nätverk/värdar",
|
||||
"netfilter_ban_time": "Banlysning i sekunder",
|
||||
"netfilter_blacklist": "Svartlistade nätverk/värdar",
|
||||
"netfilter_filter": "Regex-filter",
|
||||
"netfilter_list_info": "En värd eller ett nätverk som finns på en svartlista kommer alltid stå över en vitlista. <b>Uppdateringar av listan kan ta några sekunder att genomföra.</b>",
|
||||
"netfilter_max_attempts": "Maximalt antal försök",
|
||||
"netfilter_netban_ipv4": "Storleken på ett IPv4 subnät, att applicera banlysning på (8-32)",
|
||||
"netfilter_netban_ipv6": "Storleken på ett IPv6 subnät, att applicera banlysning på (8-128)",
|
||||
"netfilter_parameters": "Netfilter parametrar",
|
||||
"netfilter_regex_info": "Loggarna avser: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Tidsfönster för antal försök",
|
||||
"netfilter_whitelist": "Vitlistade nätverk/värdar",
|
||||
"filter_table": "Filtrera tebellen",
|
||||
"forwarding_hosts": "Värdar för inkommande e-post servrar",
|
||||
"forwarding_hosts_add_hint": "Du kan antingen specifiera IPv4-/IPv6-adresser, nätverk med CIDR betäckning, värdnamn (hämtar IP-adressen), eller domännamn (hämtar IP-adressen från SPF-uppslaget, eller från MX-uppslag).",
|
||||
|
@ -414,7 +414,7 @@
|
|||
"redis_error": "Redis fel: %s",
|
||||
"relayhost_invalid": "Posten %s är ogiltig",
|
||||
"release_send_failed": "Meddelandet kunde inte skickas: %s",
|
||||
"reset_f2b_regex": "Regex-filtret kunde inte återställas inom en rimlig tid, försök igen eller ladda om sidan.",
|
||||
"reset_netfilter_regex": "Regex-filtret kunde inte återställas inom en rimlig tid, försök igen eller ladda om sidan.",
|
||||
"resource_invalid": "Resursnamnet %s är ogiltigt",
|
||||
"rl_timeframe": "Intervallet för hastighetsbegränsningen är felaktig",
|
||||
"rspamd_ui_pw_length": "Lösenordet för Rspamd UI måste vara minst 6 tecken långt",
|
||||
|
@ -882,7 +882,7 @@
|
|||
"domain_removed": "Domänen %s har tagits bort",
|
||||
"dovecot_restart_success": "Dovecot kunde startas om",
|
||||
"eas_reset": "AktivSynk enheter för användaren %s har återställts",
|
||||
"f2b_modified": "Ändringarna på Fail2ban parametrarna har sparats",
|
||||
"netfilter_modified": "Ändringarna på Netfilter parametrarna har sparats",
|
||||
"forwarding_host_added": "Vidarbefodringsvärden %s har lagts till",
|
||||
"forwarding_host_removed": "Vidarbefodringsvärden %s har tagits bort",
|
||||
"global_filter_written": "Data har skrivits till filterfilen",
|
||||
|
|
|
@ -79,8 +79,8 @@
|
|||
"domain_s": "Alan ad(ları)",
|
||||
"duplicate": "Çift",
|
||||
"duplicate_dkim": "Çift DKIM kayıtları",
|
||||
"f2b_ban_time": "Yasaklama süresi (saniye)",
|
||||
"f2b_max_attempts": "Maksimum giriş denemesi",
|
||||
"f2b_retry_window": "Maksimum girişim için deneme pencere(leri)"
|
||||
"netfilter_ban_time": "Yasaklama süresi (saniye)",
|
||||
"netfilter_max_attempts": "Maksimum giriş denemesi",
|
||||
"netfilter_retry_window": "Maksimum girişim için deneme pencere(leri)"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,15 +162,15 @@
|
|||
"duplicate": "Копіювати",
|
||||
"edit": "Змінити",
|
||||
"empty": "Пусто",
|
||||
"f2b_ban_time": "Час бану (у секундах)",
|
||||
"f2b_blacklist": "Чорний список підмереж/хостів",
|
||||
"f2b_max_attempts": "Максимальна кількість спроб",
|
||||
"f2b_netban_ipv4": "Розмір підмережі IPv4 для блокування (8-32)",
|
||||
"f2b_netban_ipv6": "Розмір підмережі IPv6 для блокування (8-128)",
|
||||
"f2b_parameters": "Налаштування Fail2ban",
|
||||
"f2b_regex_info": "Журнали, які приймаються до уваги: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"f2b_retry_window": "Проміжок часу для наступного блокування (у секундах)",
|
||||
"f2b_whitelist": "Білий список підмереж/хостів",
|
||||
"netfilter_ban_time": "Час бану (у секундах)",
|
||||
"netfilter_blacklist": "Чорний список підмереж/хостів",
|
||||
"netfilter_max_attempts": "Максимальна кількість спроб",
|
||||
"netfilter_netban_ipv4": "Розмір підмережі IPv4 для блокування (8-32)",
|
||||
"netfilter_netban_ipv6": "Розмір підмережі IPv6 для блокування (8-128)",
|
||||
"netfilter_parameters": "Налаштування Netfilter",
|
||||
"netfilter_regex_info": "Журнали, які приймаються до уваги: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||
"netfilter_retry_window": "Проміжок часу для наступного блокування (у секундах)",
|
||||
"netfilter_whitelist": "Білий список підмереж/хостів",
|
||||
"filter_table": "Пошук",
|
||||
"forwarding_hosts": "Переадресація хостів",
|
||||
"from": "Від",
|
||||
|
@ -303,8 +303,8 @@
|
|||
"dkim_to_title": "Цільовий домен(и) (DKIM буде перезаписаний)",
|
||||
"duplicate_dkim": "Копіювання DKIM запису",
|
||||
"excludes": "Виключає цих отримувачів",
|
||||
"f2b_filter": "Правила фільтрування за допомогою регулярних виразів",
|
||||
"f2b_list_info": "Хости або підмережі, занесені до чорного списку, завжди переважатимуть об'єкти з білого списку. <b>Оновлення списку займе декілька секунд.</b>",
|
||||
"netfilter_filter": "Правила фільтрування за допомогою регулярних виразів",
|
||||
"netfilter_list_info": "Хости або підмережі, занесені до чорного списку, завжди переважатимуть об'єкти з білого списку. <b>Оновлення списку займе декілька секунд.</b>",
|
||||
"forwarding_hosts_add_hint": "Можна вказувати: IPv4/IPv6 підмережі в нотації CIDR, імена хостів (які будуть дозволятися в IP-адреси) або доменні імена (які будуть вирішуватися з IP-адресами шляхом запиту SPF записів або, у разі їх відсутності, запитом MX записів).",
|
||||
"forwarding_hosts_hint": "Вхідні повідомлення приймаються від будь-яких хостів, перерахованих тут. Ці хости не проходять перевірку DNSBL і greylisting. Спам, отриманий від них, ніколи не відхиляється, але за бажання можна включити спам-фільтр і листи з поганим рейтингом потраплятимуть до спаму. Найбільш поширене використання – вказати поштові сервери, на яких ви встановили правило, яке перенаправляє вхідні електронні листи на ваш поштовий сервер mailcow.",
|
||||
"guid_and_license": "Ліцензія та GUID",
|
||||
|
@ -446,7 +446,7 @@
|
|||
"private_key_error": "Помилка приватного ключа: %s",
|
||||
"pushover_token": "Токен Pushover вказано у неправильному форматі",
|
||||
"relayhost_invalid": "Правило %s невірне",
|
||||
"reset_f2b_regex": "Скидання фільтрів не було виконано за відведений проміжок часу, будь ласка, повторіть спробу або зачекайте ще кілька секунд і перезавантажте веб-сторінку.",
|
||||
"reset_netfilter_regex": "Скидання фільтрів не було виконано за відведений проміжок часу, будь ласка, повторіть спробу або зачекайте ще кілька секунд і перезавантажте веб-сторінку.",
|
||||
"sender_acl_invalid": "Неприпустиме значення ACL для %s",
|
||||
"spam_learn_error": "Помилка при навчанні спам фільтра: %s",
|
||||
"targetd_relay_domain": "Цільовий домен %s є доменом ретрансляції",
|
||||
|
@ -977,7 +977,7 @@
|
|||
"deleted_syncjobs": "Завдання синхронізації видалені: %s",
|
||||
"domain_admin_added": "Адміністратора домену %s додано",
|
||||
"domain_modified": "Зберегти зміни домену %s",
|
||||
"f2b_modified": "Зміни параметрів Fail2ban збережено",
|
||||
"netfilter_modified": "Зміни параметрів Netfilter збережено",
|
||||
"global_filter_written": "Фільтр успішно записано у файл",
|
||||
"items_deleted": "Елемент %s успішно видалено",
|
||||
"license_modified": "Зміни у ліцензії збережені",
|
||||
|
|
|
@ -176,17 +176,17 @@
|
|||
"edit": "编辑",
|
||||
"empty": "结果为空",
|
||||
"excludes": "除了",
|
||||
"f2b_ban_time": "封禁时间 (秒)",
|
||||
"f2b_blacklist": "网络/主机黑名单",
|
||||
"f2b_filter": "正则表达式过滤器",
|
||||
"f2b_list_info": "黑名单的优先级总是高于白名单。 <b>列表更新将会在几秒之后完成。</b>",
|
||||
"f2b_max_attempts": "最多尝试次数",
|
||||
"f2b_netban_ipv4": "应用封禁的 IPv4 子网大小 (8-32)",
|
||||
"f2b_netban_ipv6": "应用封禁的 IPv6 子网大小 (8-128)",
|
||||
"f2b_parameters": "Fail2ban 参数",
|
||||
"f2b_regex_info": "将会过滤这些应用的日志: SOGo,Postfix,Dovecot 和 PHP-FPM。",
|
||||
"f2b_retry_window": "最多尝试次数重试窗口 (秒)",
|
||||
"f2b_whitelist": "网络/主机白名单",
|
||||
"netfilter_ban_time": "封禁时间 (秒)",
|
||||
"netfilter_blacklist": "网络/主机黑名单",
|
||||
"netfilter_filter": "正则表达式过滤器",
|
||||
"netfilter_list_info": "黑名单的优先级总是高于白名单。 <b>列表更新将会在几秒之后完成。</b>",
|
||||
"netfilter_max_attempts": "最多尝试次数",
|
||||
"netfilter_netban_ipv4": "应用封禁的 IPv4 子网大小 (8-32)",
|
||||
"netfilter_netban_ipv6": "应用封禁的 IPv6 子网大小 (8-128)",
|
||||
"netfilter_parameters": "Netfilter 参数",
|
||||
"netfilter_regex_info": "将会过滤这些应用的日志: SOGo,Postfix,Dovecot 和 PHP-FPM。",
|
||||
"netfilter_retry_window": "最多尝试次数重试窗口 (秒)",
|
||||
"netfilter_whitelist": "网络/主机白名单",
|
||||
"filter_table": "筛选表格",
|
||||
"forwarding_hosts": "转发主机",
|
||||
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的网络、主机名 (解析为 IP 地址),或者邮箱域名 (查询 SPF 记录或 MX 记录并解析为 IP 地址)。",
|
||||
|
@ -426,7 +426,7 @@
|
|||
"redis_error": "Redis 错误: %s",
|
||||
"relayhost_invalid": "中继主机条目 %s 已存在",
|
||||
"release_send_failed": "消息不能被释放: %s",
|
||||
"reset_f2b_regex": "暂时不能重置正则表达式过滤器,请重试或在几秒后重载网页。",
|
||||
"reset_netfilter_regex": "暂时不能重置正则表达式过滤器,请重试或在几秒后重载网页。",
|
||||
"resource_invalid": "资源名称 %s 无效",
|
||||
"rl_timeframe": "频率限制时间设置错误",
|
||||
"rspamd_ui_pw_length": "Rspamd UI 密码至少为为6个字符",
|
||||
|
@ -947,7 +947,7 @@
|
|||
"domain_removed": "已删除域名 %s",
|
||||
"dovecot_restart_success": "Dovecot 重新启动成功",
|
||||
"eas_reset": "已重置用户 %s 的 ActiveSync 设备",
|
||||
"f2b_modified": "已保存 Fail2ban 参数的更改",
|
||||
"netfilter_modified": "已保存 Netfilter 参数的更改",
|
||||
"forwarding_host_added": "已添加转发主机 %s",
|
||||
"forwarding_host_removed": "已删除转发主机 %s",
|
||||
"global_filter_written": "成功将过滤器写入到文件",
|
||||
|
|
|
@ -176,17 +176,17 @@
|
|||
"edit": "編輯",
|
||||
"empty": "沒有結果",
|
||||
"excludes": "排除這些收件者",
|
||||
"f2b_ban_time": "封鎖時間 (秒)",
|
||||
"f2b_blacklist": "網路/主機黑名單",
|
||||
"f2b_filter": "正規表示式過濾器",
|
||||
"f2b_list_info": "黑名單優先於白名單。 <b>清單更新需要幾秒才能套用。</b>",
|
||||
"f2b_max_attempts": "嘗試次數上限",
|
||||
"f2b_netban_ipv4": "封鎖的 IPv4 子網路大小 (8-32)",
|
||||
"f2b_netban_ipv6": "封鎖的 IPv6 子網路大小 (8-128)",
|
||||
"f2b_parameters": "Fail2ban 參數",
|
||||
"f2b_regex_info": "納入過濾參考的應用程式紀錄: SOGo、Postfix、Dovecot、PHP-FPM。",
|
||||
"f2b_retry_window": "重試次數的時間區間大小 (秒)",
|
||||
"f2b_whitelist": "網路/主機白名單",
|
||||
"netfilter_ban_time": "封鎖時間 (秒)",
|
||||
"netfilter_blacklist": "網路/主機黑名單",
|
||||
"netfilter_filter": "正規表示式過濾器",
|
||||
"netfilter_list_info": "黑名單優先於白名單。 <b>清單更新需要幾秒才能套用。</b>",
|
||||
"netfilter_max_attempts": "嘗試次數上限",
|
||||
"netfilter_netban_ipv4": "封鎖的 IPv4 子網路大小 (8-32)",
|
||||
"netfilter_netban_ipv6": "封鎖的 IPv6 子網路大小 (8-128)",
|
||||
"netfilter_parameters": "Netfilter 參數",
|
||||
"netfilter_regex_info": "納入過濾參考的應用程式紀錄: SOGo、Postfix、Dovecot、PHP-FPM。",
|
||||
"netfilter_retry_window": "重試次數的時間區間大小 (秒)",
|
||||
"netfilter_whitelist": "網路/主機白名單",
|
||||
"filter_table": "篩選表格",
|
||||
"forwarding_hosts": "轉發主機",
|
||||
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的網路、主機名稱 (會被自動解析為 IP 地址),或者信箱域名 (會自動查詢 SPF 紀錄或 MX 紀錄並解析為 IP 地址)。",
|
||||
|
@ -425,7 +425,7 @@
|
|||
"redis_error": "Redis 錯誤: %s",
|
||||
"relayhost_invalid": "無效的中繼主機規則 %s",
|
||||
"release_send_failed": "郵件無法被釋放: %s",
|
||||
"reset_f2b_regex": "暫時無法重設正規表示式過濾器,請重試或在稍後重新載入網頁。",
|
||||
"reset_netfilter_regex": "暫時無法重設正規表示式過濾器,請重試或在稍後重新載入網頁。",
|
||||
"resource_invalid": "無效的資源名稱 %s",
|
||||
"rl_timeframe": "速率限制間隔時間不正確",
|
||||
"rspamd_ui_pw_length": "Rspamd UI 密碼至少要 6 個字元",
|
||||
|
@ -941,7 +941,7 @@
|
|||
"domain_removed": "域名 %s 已刪除",
|
||||
"dovecot_restart_success": "Dovecot 成功重新啟動",
|
||||
"eas_reset": "使用者 %s 的 ActiveSync 裝置已重設",
|
||||
"f2b_modified": "Fail2ban 參數更改已儲存",
|
||||
"netfilter_modified": "Netfilter 參數更改已儲存",
|
||||
"forwarding_host_added": "轉發主機 %s 已新增",
|
||||
"forwarding_host_removed": "轉發主機 %s 已刪除",
|
||||
"global_filter_written": "過濾器已成功寫入到檔案",
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-dkim" aria-selected="false" aria-controls="tab-config-dkim" role="tab" data-bs-toggle="tab">{{ lang.admin.dkim_keys }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-fwdhosts" aria-selected="false" aria-controls="tab-config-fwdhosts" role="tab" data-bs-toggle="tab">{{ lang.admin.forwarding_hosts }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-f2b" aria-selected="false" aria-controls="tab-config-f2b" role="tab" data-bs-toggle="tab">{{ lang.admin.f2b_parameters }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-netfilter" aria-selected="false" aria-controls="tab-config-netfilter" role="tab" data-bs-toggle="tab">{{ lang.admin.netfilter_parameters }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-quarantine" aria-selected="false" aria-controls="tab-config-quarantine" role="tab" data-bs-toggle="tab">{{ lang.admin.quarantine }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-quota" aria-selected="false" aria-controls="tab-config-quota" role="tab" data-bs-toggle="tab">{{ lang.admin.quota_notifications }}</button></li>
|
||||
<li><button class="dropdown-item" data-bs-target="#tab-config-rsettings" aria-selected="false" aria-controls="tab-config-rsettings" role="tab" data-bs-toggle="tab">{{ lang.admin.rspamd_settings_map }}</button></li>
|
||||
|
@ -46,7 +46,7 @@
|
|||
{% include 'admin/tab-routing.twig' %}
|
||||
{% include 'admin/tab-config-dkim.twig' %}
|
||||
{% include 'admin/tab-config-fwdhosts.twig' %}
|
||||
{% include 'admin/tab-config-f2b.twig' %}
|
||||
{% include 'admin/tab-config-netfilter.twig' %}
|
||||
{% include 'admin/tab-config-quarantine.twig' %}
|
||||
{% include 'admin/tab-config-quota.twig' %}
|
||||
{% include 'admin/tab-config-rsettings.twig' %}
|
||||
|
@ -57,7 +57,7 @@
|
|||
</div>
|
||||
</div> <!-- /col-md-12 -->
|
||||
</div> <!-- /row -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% include 'modals/admin.twig' %}
|
||||
|
||||
|
|
|
@ -1,116 +0,0 @@
|
|||
<div role="tabpanel" class="tab-pane fade" id="tab-config-f2b" role="tabpanel" aria-labelledby="tab-config-f2b">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex fs-5">
|
||||
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-f2b" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-f2b">
|
||||
{{ lang.admin.f2b_parameters }}
|
||||
</button>
|
||||
<span class="d-none d-md-block">{{ lang.admin.f2b_parameters }}</span>
|
||||
</div>
|
||||
<div id="collapse-tab-config-f2b" class="card-body collapse" data-bs-parent="#admin-content">
|
||||
<form class="form" data-id="f2b" role="form" method="post">
|
||||
<div class="mb-4">
|
||||
<label for="f2b_ban_time">{{ lang.admin.f2b_ban_time }}:</label>
|
||||
<input type="number" class="form-control" id="f2b_ban_time" name="ban_time" value="{{ f2b_data.ban_time }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="f2b_max_attempts">{{ lang.admin.f2b_max_attempts }}:</label>
|
||||
<input type="number" class="form-control" id="f2b_max_attempts" name="max_attempts" value="{{ f2b_data.max_attempts }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="f2b_retry_window">{{ lang.admin.f2b_retry_window }}:</label>
|
||||
<input type="number" class="form-control" id="f2b_retry_window" name="retry_window" value="{{ f2b_data.retry_window }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="f2b_netban_ipv4">{{ lang.admin.f2b_netban_ipv4 }}:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">/</span>
|
||||
<input type="number" class="form-control" id="f2b_netban_ipv4" name="netban_ipv4" value="{{ f2b_data.netban_ipv4 }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="f2b_netban_ipv6">{{ lang.admin.f2b_netban_ipv6 }}:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">/</span>
|
||||
<input type="number" class="form-control" id="f2b_netban_ipv6" name="netban_ipv6" value="{{ f2b_data.netban_ipv6 }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<p class="text-muted">{{ lang.admin.f2b_list_info|raw }}</p>
|
||||
<div class="mb-2">
|
||||
<label for="f2b_whitelist">{{ lang.admin.f2b_whitelist }}:</label>
|
||||
<textarea class="form-control" id="f2b_whitelist" name="whitelist" rows="5">{{ f2b_data.whitelist }}</textarea>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="f2b_blacklist">{{ lang.admin.f2b_blacklist }}:</label>
|
||||
<textarea class="form-control" id="f2b_blacklist" name="blacklist" rows="5">{{ f2b_data.blacklist }}</textarea>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="self" data-id="f2b" data-api-url='edit/fail2ban' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
|
||||
<a href="#" role="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" data-bs-toggle="modal" data-container="netfilter-mailcow" data-bs-target="#RestartContainer"><i class="bi bi-arrow-repeat"></i> {{ lang.header.restart_netfilter }}</a>
|
||||
</div>
|
||||
</form>
|
||||
<legend data-bs-target="#f2b_regex_filters" style="margin-top:40px;cursor:pointer" unselectable="on" data-bs-toggle="collapse">
|
||||
<i style="font-size:10pt;" class="bi bi-plus-square"></i> {{ lang.admin.f2b_filter }}
|
||||
</legend>
|
||||
<hr />
|
||||
<div id="f2b_regex_filters" class="collapse">
|
||||
<p class="text-muted">{{ lang.admin.f2b_regex_info }}</p>
|
||||
<form class="form-inline" data-id="f2b_regex" role="form" method="post">
|
||||
<table class="table table-condensed" id="f2b_regex_table">
|
||||
<tr>
|
||||
<th width="50px">ID</th>
|
||||
<th>RegExp</th>
|
||||
<th width="100px"> </th>
|
||||
</tr>
|
||||
{% for regex_id, regex_val in f2b_data.regex %}
|
||||
<tr>
|
||||
<td><input disabled class="input-sm input-xs-lg form-control" style="text-align:center" data-id="f2b_regex" type="text" name="app" required value="{{ regex_id }}"></td>
|
||||
<td><input class="input-sm input-xs-lg form-control regex-input" data-id="f2b_regex" type="text" name="regex" required value="{{ regex_val }}"></td>
|
||||
<td><a href="#" role="button" class="btn btn-sm btn-xs-lg btn-secondary h-100 w-100" type="button">{{ lang.admin.remove_row }}</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<p><div class="btn-group">
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="admin" data-id="f2b_regex" data-reload="no" data-api-url='edit/fail2ban' data-api-attr='{"action":"edit-regex"}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary admin-ays-dialog" data-action="edit_selected" data-item="self" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"reset-regex"}' href="#">{{ lang.admin.reset_default }}</button>
|
||||
<button class="btn btn-sm d-block d-sm-inline btn-secondary" type="button" id="add_f2b_regex_row"><i class="bi bi-plus-lg"></i> {{ lang.admin.add_row }}</button>
|
||||
</div></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<p class="text-muted">{{ lang.admin.ban_list_info|raw }}</p>
|
||||
{% if not f2b_data.active_bans and not f2b_data.perm_bans %}
|
||||
<i>{{ lang.admin.no_active_bans }}</i>
|
||||
{% endif %}
|
||||
{% for active_ban in f2b_data.active_bans %}
|
||||
<p>
|
||||
<span class="badge fs-5 bg-info" style="padding:4px;font-size:85%;">
|
||||
<i class="bi bi-funnel-fill"></i>
|
||||
<a href="https://bgp.he.net/ip/{{ active_ban.ip }}" target="_blank" style="color:white">
|
||||
{{ active_ban.network }}
|
||||
</a>
|
||||
({{ active_ban.banned_until }}) -
|
||||
{% if active_ban.queued_for_unban == 0 %}
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"unban"}' href="#">[{{ lang.admin.queue_unban }}]</a>
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"whitelist"}' href="#">[whitelist]</a>
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"blacklist"}' href="#">[blacklist (<b>needs restart</b>)]</a>
|
||||
{% else %}
|
||||
<i>{{ lang.admin.unban_pending }}</i>
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
{% endfor %}
|
||||
<hr>
|
||||
{% for perm_ban in f2b_data.perm_bans %}
|
||||
<p>
|
||||
<span class="badge fs-5 bg-danger" style="padding: 0.1em 0.4em 0.1em;">
|
||||
<i class="bi bi-funnel-fill"></i>
|
||||
<a href="https://bgp.he.net/ip/{{ perm_ban.ip }}" target="_blank" style="color:white">
|
||||
{{ perm_ban.network }}
|
||||
</a>
|
||||
</span>
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,116 @@
|
|||
<div role="tabpanel" class="tab-pane fade" id="tab-config-netfilter" role="tabpanel" aria-labelledby="tab-config-netfilter">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex fs-5">
|
||||
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-netfilter" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-netfilter">
|
||||
{{ lang.admin.netfilter_parameters }}
|
||||
</button>
|
||||
<span class="d-none d-md-block">{{ lang.admin.netfilter_parameters }}</span>
|
||||
</div>
|
||||
<div id="collapse-tab-config-netfilter" class="card-body collapse" data-bs-parent="#admin-content">
|
||||
<form class="form" data-id="netfilter" role="form" method="post">
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_ban_time">{{ lang.admin.netfilter_ban_time }}:</label>
|
||||
<input type="number" class="form-control" id="netfilter_ban_time" name="ban_time" value="{{ netfilter_data.ban_time }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_max_attempts">{{ lang.admin.netfilter_max_attempts }}:</label>
|
||||
<input type="number" class="form-control" id="netfilter_max_attempts" name="max_attempts" value="{{ netfilter_data.max_attempts }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_retry_window">{{ lang.admin.netfilter_retry_window }}:</label>
|
||||
<input type="number" class="form-control" id="netfilter_retry_window" name="retry_window" value="{{ netfilter_data.retry_window }}" required>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_netban_ipv4">{{ lang.admin.netfilter_netban_ipv4 }}:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">/</span>
|
||||
<input type="number" class="form-control" id="netfilter_netban_ipv4" name="netban_ipv4" value="{{ netfilter_data.netban_ipv4 }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_netban_ipv6">{{ lang.admin.netfilter_netban_ipv6 }}:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">/</span>
|
||||
<input type="number" class="form-control" id="netfilter_netban_ipv6" name="netban_ipv6" value="{{ netfilter_data.netban_ipv6 }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<p class="text-muted">{{ lang.admin.netfilter_list_info|raw }}</p>
|
||||
<div class="mb-2">
|
||||
<label for="netfilter_whitelist">{{ lang.admin.netfilter_whitelist }}:</label>
|
||||
<textarea class="form-control" id="netfilter_whitelist" name="whitelist" rows="5">{{ netfilter_data.whitelist }}</textarea>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="netfilter_blacklist">{{ lang.admin.netfilter_blacklist }}:</label>
|
||||
<textarea class="form-control" id="netfilter_blacklist" name="blacklist" rows="5">{{ netfilter_data.blacklist }}</textarea>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="self" data-id="netfilter" data-api-url='edit/netfilter' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
|
||||
<a href="#" role="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" data-bs-toggle="modal" data-container="netfilter-mailcow" data-bs-target="#RestartContainer"><i class="bi bi-arrow-repeat"></i> {{ lang.header.restart_netfilter }}</a>
|
||||
</div>
|
||||
</form>
|
||||
<legend data-bs-target="#netfilter_regex_filters" style="margin-top:40px;cursor:pointer" unselectable="on" data-bs-toggle="collapse">
|
||||
<i style="font-size:10pt;" class="bi bi-plus-square"></i> {{ lang.admin.netfilter_filter }}
|
||||
</legend>
|
||||
<hr />
|
||||
<div id="netfilter_regex_filters" class="collapse">
|
||||
<p class="text-muted">{{ lang.admin.netfilter_regex_info }}</p>
|
||||
<form class="form-inline" data-id="netfilter_regex" role="form" method="post">
|
||||
<table class="table table-condensed" id="netfilter_regex_table">
|
||||
<tr>
|
||||
<th width="50px">ID</th>
|
||||
<th>RegExp</th>
|
||||
<th width="100px"> </th>
|
||||
</tr>
|
||||
{% for regex_id, regex_val in netfilter_data.regex %}
|
||||
<tr>
|
||||
<td><input disabled class="input-sm input-xs-lg form-control" style="text-align:center" data-id="netfilter_regex" type="text" name="app" required value="{{ regex_id }}"></td>
|
||||
<td><input class="input-sm input-xs-lg form-control regex-input" data-id="netfilter_regex" type="text" name="regex" required value="{{ regex_val }}"></td>
|
||||
<td><a href="#" role="button" class="btn btn-sm btn-xs-lg btn-secondary h-100 w-100" type="button">{{ lang.admin.remove_row }}</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<p><div class="btn-group">
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="admin" data-id="netfilter_regex" data-reload="no" data-api-url='edit/netfilter' data-api-attr='{"action":"edit-regex"}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary admin-ays-dialog" data-action="edit_selected" data-item="self" data-id="netfilter-quick" data-api-url='edit/netfilter' data-api-attr='{"action":"reset-regex"}' href="#">{{ lang.admin.reset_default }}</button>
|
||||
<button class="btn btn-sm d-block d-sm-inline btn-secondary" type="button" id="add_netfilter_regex_row"><i class="bi bi-plus-lg"></i> {{ lang.admin.add_row }}</button>
|
||||
</div></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<p class="text-muted">{{ lang.admin.ban_list_info|raw }}</p>
|
||||
{% if not netfilter_data.active_bans and not netfilter_data.perm_bans %}
|
||||
<i>{{ lang.admin.no_active_bans }}</i>
|
||||
{% endif %}
|
||||
{% for active_ban in netfilter_data.active_bans %}
|
||||
<p>
|
||||
<span class="badge fs-5 bg-info" style="padding:4px;font-size:85%;">
|
||||
<i class="bi bi-funnel-fill"></i>
|
||||
<a href="https://bgp.he.net/ip/{{ active_ban.ip }}" target="_blank" style="color:white">
|
||||
{{ active_ban.network }}
|
||||
</a>
|
||||
({{ active_ban.banned_until }}) -
|
||||
{% if active_ban.queued_for_unban == 0 %}
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="netfilter-quick" data-api-url='edit/netfilter' data-api-attr='{"action":"unban"}' href="#">[{{ lang.admin.queue_unban }}]</a>
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="netfilter-quick" data-api-url='edit/netfilter' data-api-attr='{"action":"whitelist"}' href="#">[whitelist]</a>
|
||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="netfilter-quick" data-api-url='edit/netfilter' data-api-attr='{"action":"blacklist"}' href="#">[blacklist (<b>needs restart</b>)]</a>
|
||||
{% else %}
|
||||
<i>{{ lang.admin.unban_pending }}</i>
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
{% endfor %}
|
||||
<hr>
|
||||
{% for perm_ban in netfilter_data.perm_bans %}
|
||||
<p>
|
||||
<span class="badge fs-5 bg-danger" style="padding: 0.1em 0.4em 0.1em;">
|
||||
<i class="bi bi-funnel-fill"></i>
|
||||
<a href="https://bgp.he.net/ip/{{ perm_ban.ip }}" target="_blank" style="color:white">
|
||||
{{ perm_ban.network }}
|
||||
</a>
|
||||
</span>
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -9,7 +9,7 @@
|
|||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item active" role="tab" aria-selected="true" aria-controls="tab-user-auth" data-bs-toggle="tab" data-bs-target="#tab-user-auth">{{ lang.user.mailbox_general }}</button></li>
|
||||
<li><button class="dropdown-item" role="tab" aria-selected="false" aria-controls="tab-config-fwdhosts" data-bs-toggle="tab" data-bs-target="#tab-user-details">{{ lang.user.mailbox_details }}</button></li>
|
||||
<li><button class="dropdown-item" role="tab" aria-selected="false" aria-controls="tab-config-f2b" data-bs-toggle="tab" data-bs-target="#tab-user-settings">{{ lang.user.mailbox_settings }}</button></li>
|
||||
<li><button class="dropdown-item" role="tab" aria-selected="false" aria-controls="tab-config-netfilter" data-bs-toggle="tab" data-bs-target="#tab-user-settings">{{ lang.user.mailbox_settings }}</button></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="SpamAliases" role="tab" data-bs-toggle="tab" data-bs-target="#SpamAliases">{{ lang.user.spam_aliases }}</button></li>
|
||||
|
|
Loading…
Reference in New Issue