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")
|
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(
|
redis(
|
||||||
host("`REDIS_SLAVEOF_IP`")
|
host("`REDIS_SLAVEOF_IP`")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(`REDIS_SLAVEOF_PORT`)
|
port(`REDIS_SLAVEOF_PORT`)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
filter f_mail { facility(mail); };
|
filter f_mail { facility(mail); };
|
||||||
|
@ -41,5 +41,5 @@ log {
|
||||||
destination(d_stdout);
|
destination(d_stdout);
|
||||||
filter(f_mail);
|
filter(f_mail);
|
||||||
destination(d_redis_ui_log);
|
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")
|
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(
|
redis(
|
||||||
host("redis-mailcow")
|
host("redis-mailcow")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(6379)
|
port(6379)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
filter f_mail { facility(mail); };
|
filter f_mail { facility(mail); };
|
||||||
|
@ -41,5 +41,5 @@ log {
|
||||||
destination(d_stdout);
|
destination(d_stdout);
|
||||||
filter(f_mail);
|
filter(f_mail);
|
||||||
destination(d_redis_ui_log);
|
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")
|
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(
|
redis(
|
||||||
host("`REDIS_SLAVEOF_IP`")
|
host("`REDIS_SLAVEOF_IP`")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(`REDIS_SLAVEOF_PORT`)
|
port(`REDIS_SLAVEOF_PORT`)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
filter f_mail { facility(mail); };
|
filter f_mail { facility(mail); };
|
||||||
|
@ -49,5 +49,5 @@ log {
|
||||||
destination(d_stdout);
|
destination(d_stdout);
|
||||||
filter(f_mail);
|
filter(f_mail);
|
||||||
destination(d_redis_ui_log);
|
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")
|
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(
|
redis(
|
||||||
host("redis-mailcow")
|
host("redis-mailcow")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(6379)
|
port(6379)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
filter f_mail { facility(mail); };
|
filter f_mail { facility(mail); };
|
||||||
|
@ -49,5 +49,5 @@ log {
|
||||||
destination(d_stdout);
|
destination(d_stdout);
|
||||||
filter(f_mail);
|
filter(f_mail);
|
||||||
destination(d_redis_ui_log);
|
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")
|
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(
|
redis(
|
||||||
host("`REDIS_SLAVEOF_IP`")
|
host("`REDIS_SLAVEOF_IP`")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(`REDIS_SLAVEOF_PORT`)
|
port(`REDIS_SLAVEOF_PORT`)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
log {
|
log {
|
||||||
source(s_sogo);
|
source(s_sogo);
|
||||||
destination(d_redis_ui_log);
|
destination(d_redis_ui_log);
|
||||||
destination(d_redis_f2b_channel);
|
destination(d_redis_netfilter_channel);
|
||||||
};
|
};
|
||||||
log {
|
log {
|
||||||
source(s_sogo);
|
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")
|
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(
|
redis(
|
||||||
host("redis-mailcow")
|
host("redis-mailcow")
|
||||||
persist-name("redis2")
|
persist-name("redis2")
|
||||||
port(6379)
|
port(6379)
|
||||||
command("PUBLISH" "F2B_CHANNEL" "$(sanitize $MESSAGE)")
|
command("PUBLISH" "NETFILTER_CHANNEL" "$(sanitize $MESSAGE)")
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
log {
|
log {
|
||||||
source(s_sogo);
|
source(s_sogo);
|
||||||
destination(d_redis_ui_log);
|
destination(d_redis_ui_log);
|
||||||
destination(d_redis_f2b_channel);
|
destination(d_redis_netfilter_channel);
|
||||||
};
|
};
|
||||||
log {
|
log {
|
||||||
source(s_sogo);
|
source(s_sogo);
|
||||||
|
|
|
@ -48,7 +48,7 @@ until [[ $(${REDIS_CMDLINE} PING) == "PONG" ]]; do
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
|
|
||||||
${REDIS_CMDLINE} DEL F2B_RES > /dev/null
|
${REDIS_CMDLINE} DEL NETFILTER_RES > /dev/null
|
||||||
|
|
||||||
# Common functions
|
# Common functions
|
||||||
get_ipv6(){
|
get_ipv6(){
|
||||||
|
@ -116,7 +116,7 @@ function mail_error() {
|
||||||
fi
|
fi
|
||||||
WATCHDOG_NOTIFY_EMAIL=$(echo "${WATCHDOG_NOTIFY_EMAIL}" | sed 's/"//;s|"$||')
|
WATCHDOG_NOTIFY_EMAIL=$(echo "${WATCHDOG_NOTIFY_EMAIL}" | sed 's/"//;s|"$||')
|
||||||
# Some exceptions for subject and body formats
|
# Some exceptions for subject and body formats
|
||||||
if [[ ${1} == "fail2ban" ]]; then
|
if [[ ${1} == "netfilter" ]]; then
|
||||||
SUBJECT="${BODY}"
|
SUBJECT="${BODY}"
|
||||||
BODY="Please see netfilter-mailcow for more details and triggered rules."
|
BODY="Please see netfilter-mailcow for more details and triggered rules."
|
||||||
else
|
else
|
||||||
|
@ -607,29 +607,29 @@ mailq_checks() {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fail2ban_checks() {
|
netfilter_checks() {
|
||||||
err_count=0
|
err_count=0
|
||||||
diff_c=0
|
diff_c=0
|
||||||
THRESHOLD=${FAIL2BAN_THRESHOLD}
|
THRESHOLD=${NETFILTER_THRESHOLD}
|
||||||
F2B_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS F2B_ACTIVE_BANS))
|
NETFILTER_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS NETFILTER_ACTIVE_BANS))
|
||||||
F2B_RES=
|
NETFILTER_RES=
|
||||||
# Reduce error count by 2 after restarting an unhealthy container
|
# Reduce error count by 2 after restarting an unhealthy container
|
||||||
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
|
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
|
||||||
while [ ${err_count} -lt ${THRESHOLD} ]; do
|
while [ ${err_count} -lt ${THRESHOLD} ]; do
|
||||||
err_c_cur=${err_count}
|
err_c_cur=${err_count}
|
||||||
F2B_LOG_STATUS_PREV=(${F2B_LOG_STATUS[@]})
|
NETFILTER_LOG_STATUS_PREV=(${NETFILTER_LOG_STATUS[@]})
|
||||||
F2B_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS F2B_ACTIVE_BANS))
|
NETFILTER_LOG_STATUS=($(${REDIS_CMDLINE} --raw HKEYS NETFILTER_ACTIVE_BANS))
|
||||||
array_diff F2B_RES F2B_LOG_STATUS F2B_LOG_STATUS_PREV
|
array_diff NETFILTER_RES NETFILTER_LOG_STATUS NETFILTER_LOG_STATUS_PREV
|
||||||
if [[ ! -z "${F2B_RES}" ]]; then
|
if [[ ! -z "${NETFILTER_RES}" ]]; then
|
||||||
err_count=$(( ${err_count} + 1 ))
|
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
|
if [ $? -ne 0 ]; then
|
||||||
${REDIS_CMDLINE} -x DEL F2B_RES
|
${REDIS_CMDLINE} -x DEL NETFILTER_RES
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
|
[ ${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} ))
|
[ ${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
|
if [[ $? == 10 ]]; then
|
||||||
diff_c=0
|
diff_c=0
|
||||||
sleep 1
|
sleep 1
|
||||||
|
@ -944,14 +944,14 @@ BACKGROUND_TASKS+=(${PID})
|
||||||
|
|
||||||
(
|
(
|
||||||
while true; do
|
while true; do
|
||||||
if ! fail2ban_checks; then
|
if ! netfilter_checks; then
|
||||||
log_msg "Fail2ban hit error limit"
|
log_msg "Netfilter hit error limit"
|
||||||
echo fail2ban > /tmp/com_pipe
|
echo netfilter > /tmp/com_pipe
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
) &
|
) &
|
||||||
PID=$!
|
PID=$!
|
||||||
echo "Spawned fail2ban_checks with PID ${PID}"
|
echo "Spawned netfilter_checks with PID ${PID}"
|
||||||
BACKGROUND_TASKS+=(${PID})
|
BACKGROUND_TASKS+=(${PID})
|
||||||
|
|
||||||
(
|
(
|
||||||
|
@ -1056,15 +1056,15 @@ while true; do
|
||||||
log_msg "acme-mailcow did not complete successfully"
|
log_msg "acme-mailcow did not complete successfully"
|
||||||
# Define $2 to override message text, else print service was restarted at ...
|
# 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."
|
[[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please check acme-mailcow for further information."
|
||||||
elif [[ ${com_pipe_answer} == "fail2ban" ]]; then
|
elif [[ ${com_pipe_answer} == "netfilter" ]]; then
|
||||||
F2B_RES=($(timeout 4s ${REDIS_CMDLINE} --raw GET F2B_RES 2> /dev/null))
|
NETFILTER_RES=($(timeout 4s ${REDIS_CMDLINE} --raw GET NETFILTER_RES 2> /dev/null))
|
||||||
if [[ ! -z "${F2B_RES}" ]]; then
|
if [[ ! -z "${NETFILTER_RES}" ]]; then
|
||||||
${REDIS_CMDLINE} DEL F2B_RES > /dev/null
|
${REDIS_CMDLINE} DEL NETFILTER_RES > /dev/null
|
||||||
host=
|
host=
|
||||||
for host in "${F2B_RES[@]}"; do
|
for host in "${NETFILTER_RES[@]}"; do
|
||||||
log_msg "Banned ${host}"
|
log_msg "Banned ${host}"
|
||||||
rm /tmp/fail2ban 2> /dev/null
|
rm /tmp/netfilter 2> /dev/null
|
||||||
timeout 2s whois "${host}" > /tmp/fail2ban
|
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}"
|
[[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && [[ ${WATCHDOG_NOTIFY_BAN} =~ ^([yY][eE][sS]|[yY])+$ ]] && mail_error "${com_pipe_answer}" "IP ban: ${host}"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -14,4 +14,4 @@ catch (Exception $e) {
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
echo '{"error":"Unauthorized"}';
|
echo '{"error":"Unauthorized"}';
|
||||||
error_log("Rspamd UI: Invalid password by " . $_SERVER['REMOTE_ADDR']);
|
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,
|
'domains' => $domains,
|
||||||
'all_domains' => $all_domains,
|
'all_domains' => $all_domains,
|
||||||
'mailboxes' => $mailboxes,
|
'mailboxes' => $mailboxes,
|
||||||
'f2b_data' => fail2ban('get'),
|
'netfilter_data' => netfilter('get'),
|
||||||
'q_data' => quarantine('settings'),
|
'q_data' => quarantine('settings'),
|
||||||
'qn_data' => quota_notification('get'),
|
'qn_data' => quota_notification('get'),
|
||||||
'rsettings_map' => file_get_contents('http://nginx:8081/settings.php'),
|
'rsettings_map' => file_get_contents('http://nginx:8081/settings.php'),
|
||||||
|
|
|
@ -1999,7 +1999,7 @@ paths:
|
||||||
- domain.tld
|
- domain.tld
|
||||||
- domain2.tld
|
- domain2.tld
|
||||||
properties:
|
properties:
|
||||||
items:
|
items:
|
||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
|
@ -2993,7 +2993,7 @@ paths:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
log:
|
log:
|
||||||
|
@ -3105,7 +3105,7 @@ paths:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
summary: Update domain
|
summary: Update domain
|
||||||
/api/v1/edit/fail2ban:
|
/api/v1/edit/netfilter:
|
||||||
post:
|
post:
|
||||||
responses:
|
responses:
|
||||||
"401":
|
"401":
|
||||||
|
@ -3132,11 +3132,11 @@ paths:
|
||||||
description: OK
|
description: OK
|
||||||
headers: {}
|
headers: {}
|
||||||
tags:
|
tags:
|
||||||
- Fail2Ban
|
- Netfilter
|
||||||
description: >-
|
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.
|
whitelist new ips.
|
||||||
operationId: Edit Fail2Ban
|
operationId: Edit Netfilter
|
||||||
requestBody:
|
requestBody:
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
|
@ -3153,7 +3153,7 @@ paths:
|
||||||
items: none
|
items: none
|
||||||
properties:
|
properties:
|
||||||
attr:
|
attr:
|
||||||
description: array containing the fail2ban settings
|
description: array containing the netfilter settings
|
||||||
properties:
|
properties:
|
||||||
backlist:
|
backlist:
|
||||||
description: the backlisted ips or hostnames separated by comma
|
description: the backlisted ips or hostnames separated by comma
|
||||||
|
@ -3182,7 +3182,7 @@ paths:
|
||||||
items:
|
items:
|
||||||
description: has to be none
|
description: has to be none
|
||||||
type: object
|
type: object
|
||||||
summary: Edit Fail2Ban
|
summary: Edit Netfilter
|
||||||
/api/v1/edit/mailbox:
|
/api/v1/edit/mailbox:
|
||||||
post:
|
post:
|
||||||
responses:
|
responses:
|
||||||
|
@ -4069,7 +4069,7 @@ paths:
|
||||||
description: You can list all domains existing in system.
|
description: You can list all domains existing in system.
|
||||||
operationId: Get domains
|
operationId: Get domains
|
||||||
summary: Get domains
|
summary: Get domains
|
||||||
/api/v1/get/fail2ban:
|
/api/v1/get/netfilter:
|
||||||
get:
|
get:
|
||||||
responses:
|
responses:
|
||||||
"401":
|
"401":
|
||||||
|
@ -4095,10 +4095,10 @@ paths:
|
||||||
description: OK
|
description: OK
|
||||||
headers: {}
|
headers: {}
|
||||||
tags:
|
tags:
|
||||||
- Fail2Ban
|
- Netfilter
|
||||||
description: Gets the current Fail2Ban configuration.
|
description: Gets the current Netfilter configuration.
|
||||||
operationId: Get Fail2Ban Config
|
operationId: Get Netfilter Config
|
||||||
summary: Get Fail2Ban Config
|
summary: Get Netfilter Config
|
||||||
/api/v1/get/fwdhost/all:
|
/api/v1/get/fwdhost/all:
|
||||||
get:
|
get:
|
||||||
responses:
|
responses:
|
||||||
|
@ -4522,7 +4522,7 @@ paths:
|
||||||
hpnow: "1"
|
hpnow: "1"
|
||||||
hptotal: "1"
|
hptotal: "1"
|
||||||
lvl: "100"
|
lvl: "100"
|
||||||
service: Fail2ban
|
service: Netfilter
|
||||||
time: "1569938958"
|
time: "1569938958"
|
||||||
- hpdiff: "0"
|
- hpdiff: "0"
|
||||||
hpnow: "5"
|
hpnow: "5"
|
||||||
|
@ -5580,8 +5580,8 @@ tags:
|
||||||
description: Manage the postfix mail queue
|
description: Manage the postfix mail queue
|
||||||
- name: Quarantine
|
- name: Quarantine
|
||||||
description: Check what emails went to quarantine
|
description: Check what emails went to quarantine
|
||||||
- name: Fail2Ban
|
- name: Netfilter
|
||||||
description: Manage the Netfilter fail2ban options
|
description: Manage the Netfilter netfilter options
|
||||||
- name: DKIM
|
- name: DKIM
|
||||||
description: Manage DKIM keys
|
description: Manage DKIM keys
|
||||||
- name: Domain admin
|
- name: Domain admin
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,329 +1,329 @@
|
||||||
<?php
|
<?php
|
||||||
function fail2ban($_action, $_data = null) {
|
function netfilter($_action, $_data = null) {
|
||||||
global $redis;
|
global $redis;
|
||||||
$_data_log = $_data;
|
$_data_log = $_data;
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'get':
|
case 'get':
|
||||||
$f2b_options = array();
|
$netfilter_options = array();
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$f2b_options = json_decode($redis->Get('F2B_OPTIONS'), true);
|
$netfilter_options = json_decode($redis->Get('NETFILTER_OPTIONS'), true);
|
||||||
$f2b_options['regex'] = json_decode($redis->Get('F2B_REGEX'), true);
|
$netfilter_options['regex'] = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||||
$wl = $redis->hGetAll('F2B_WHITELIST');
|
$wl = $redis->hGetAll('NETFILTER_WHITELIST');
|
||||||
if (is_array($wl)) {
|
if (is_array($wl)) {
|
||||||
foreach ($wl as $key => $value) {
|
foreach ($wl as $key => $value) {
|
||||||
$tmp_wl_data[] = $key;
|
$tmp_wl_data[] = $key;
|
||||||
}
|
}
|
||||||
if (isset($tmp_wl_data)) {
|
if (isset($tmp_wl_data)) {
|
||||||
natsort($tmp_wl_data);
|
natsort($tmp_wl_data);
|
||||||
$f2b_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data);
|
$netfilter_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['whitelist'] = "";
|
$netfilter_options['whitelist'] = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['whitelist'] = "";
|
$netfilter_options['whitelist'] = "";
|
||||||
}
|
}
|
||||||
$bl = $redis->hGetAll('F2B_BLACKLIST');
|
$bl = $redis->hGetAll('NETFILTER_BLACKLIST');
|
||||||
if (is_array($bl)) {
|
if (is_array($bl)) {
|
||||||
foreach ($bl as $key => $value) {
|
foreach ($bl as $key => $value) {
|
||||||
$tmp_bl_data[] = $key;
|
$tmp_bl_data[] = $key;
|
||||||
}
|
}
|
||||||
if (isset($tmp_bl_data)) {
|
if (isset($tmp_bl_data)) {
|
||||||
natsort($tmp_bl_data);
|
natsort($tmp_bl_data);
|
||||||
$f2b_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data);
|
$netfilter_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['blacklist'] = "";
|
$netfilter_options['blacklist'] = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['blacklist'] = "";
|
$netfilter_options['blacklist'] = "";
|
||||||
}
|
}
|
||||||
$pb = $redis->hGetAll('F2B_PERM_BANS');
|
$pb = $redis->hGetAll('NETFILTER_PERM_BANS');
|
||||||
if (is_array($pb)) {
|
if (is_array($pb)) {
|
||||||
foreach ($pb as $key => $value) {
|
foreach ($pb as $key => $value) {
|
||||||
$f2b_options['perm_bans'][] = array(
|
$netfilter_options['perm_bans'][] = array(
|
||||||
'network'=>$key,
|
'network'=>$key,
|
||||||
'ip' => strtok($key,'/')
|
'ip' => strtok($key,'/')
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['perm_bans'] = "";
|
$netfilter_options['perm_bans'] = "";
|
||||||
}
|
}
|
||||||
$active_bans = $redis->hGetAll('F2B_ACTIVE_BANS');
|
$active_bans = $redis->hGetAll('NETFILTER_ACTIVE_BANS');
|
||||||
$queue_unban = $redis->hGetAll('F2B_QUEUE_UNBAN');
|
$queue_unban = $redis->hGetAll('NETFILTER_QUEUE_UNBAN');
|
||||||
if (is_array($active_bans)) {
|
if (is_array($active_bans)) {
|
||||||
foreach ($active_bans as $network => $banned_until) {
|
foreach ($active_bans as $network => $banned_until) {
|
||||||
$queued_for_unban = (isset($queue_unban[$network]) && $queue_unban[$network] == 1) ? 1 : 0;
|
$queued_for_unban = (isset($queue_unban[$network]) && $queue_unban[$network] == 1) ? 1 : 0;
|
||||||
$difference = $banned_until - time();
|
$difference = $banned_until - time();
|
||||||
$f2b_options['active_bans'][] = array(
|
$netfilter_options['active_bans'][] = array(
|
||||||
'queued_for_unban' => $queued_for_unban,
|
'queued_for_unban' => $queued_for_unban,
|
||||||
'network' => $network,
|
'network' => $network,
|
||||||
'ip' => strtok($network,'/'),
|
'ip' => strtok($network,'/'),
|
||||||
'banned_until' => sprintf('%02dh %02dm %02ds', ($difference/3600), ($difference/60%60), $difference%60)
|
'banned_until' => sprintf('%02dh %02dm %02ds', ($difference/3600), ($difference/60%60), $difference%60)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$f2b_options['active_bans'] = "";
|
$netfilter_options['active_bans'] = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return $f2b_options;
|
return $netfilter_options;
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Start to read actions, if any
|
// Start to read actions, if any
|
||||||
if (isset($_data['action'])) {
|
if (isset($_data['action'])) {
|
||||||
// Reset regex filters
|
// Reset regex filters
|
||||||
if ($_data['action'] == "reset-regex") {
|
if ($_data['action'] == "reset-regex") {
|
||||||
try {
|
try {
|
||||||
$redis->Del('F2B_REGEX');
|
$redis->Del('NETFILTER_REGEX');
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Rules will also be recreated on log events, but rules may seem empty for a second in the UI
|
// Rules will also be recreated on log events, but rules may seem empty for a second in the UI
|
||||||
docker('post', 'netfilter-mailcow', 'restart');
|
docker('post', 'netfilter-mailcow', 'restart');
|
||||||
$fail_count = 0;
|
$fail_count = 0;
|
||||||
$regex_result = json_decode($redis->Get('F2B_REGEX'), true);
|
$regex_result = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||||
while (empty($regex_result) && $fail_count < 10) {
|
while (empty($regex_result) && $fail_count < 10) {
|
||||||
$regex_result = json_decode($redis->Get('F2B_REGEX'), true);
|
$regex_result = json_decode($redis->Get('NETFILTER_REGEX'), true);
|
||||||
$fail_count++;
|
$fail_count++;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
if ($fail_count >= 10) {
|
if ($fail_count >= 10) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('reset_f2b_regex')
|
'msg' => array('reset_netfilter_regex')
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($_data['action'] == "edit-regex") {
|
elseif ($_data['action'] == "edit-regex") {
|
||||||
if (!empty($_data['regex'])) {
|
if (!empty($_data['regex'])) {
|
||||||
$rule_id = 1;
|
$rule_id = 1;
|
||||||
$regex_array = array();
|
$regex_array = array();
|
||||||
foreach($_data['regex'] as $regex) {
|
foreach($_data['regex'] as $regex) {
|
||||||
$regex_array[$rule_id] = $regex;
|
$regex_array[$rule_id] = $regex;
|
||||||
$rule_id++;
|
$rule_id++;
|
||||||
}
|
}
|
||||||
if (!empty($regex_array)) {
|
if (!empty($regex_array)) {
|
||||||
$redis->Set('F2B_REGEX', json_encode($regex_array, JSON_UNESCAPED_SLASHES));
|
$redis->Set('NETFILTER_REGEX', json_encode($regex_array, JSON_UNESCAPED_SLASHES));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('object_modified', htmlspecialchars($network))
|
'msg' => array('object_modified', htmlspecialchars($network))
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start actions in dependency of network
|
// Start actions in dependency of network
|
||||||
if (!empty($_data['network'])) {
|
if (!empty($_data['network'])) {
|
||||||
$networks = (array)$_data['network'];
|
$networks = (array)$_data['network'];
|
||||||
foreach ($networks as $network) {
|
foreach ($networks as $network) {
|
||||||
// Unban network
|
// Unban network
|
||||||
if ($_data['action'] == "unban") {
|
if ($_data['action'] == "unban") {
|
||||||
if (valid_network($network)) {
|
if (valid_network($network)) {
|
||||||
try {
|
try {
|
||||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
$redis->hSet('NETFILTER_QUEUE_UNBAN', $network, 1);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Whitelist network
|
// Whitelist network
|
||||||
elseif ($_data['action'] == "whitelist") {
|
elseif ($_data['action'] == "whitelist") {
|
||||||
if (empty($network)) { continue; }
|
if (empty($network)) { continue; }
|
||||||
if (valid_network($network)) {
|
if (valid_network($network)) {
|
||||||
try {
|
try {
|
||||||
$redis->hSet('F2B_WHITELIST', $network, 1);
|
$redis->hSet('NETFILTER_WHITELIST', $network, 1);
|
||||||
$redis->hDel('F2B_BLACKLIST', $network, 1);
|
$redis->hDel('NETFILTER_BLACKLIST', $network, 1);
|
||||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
$redis->hSet('NETFILTER_QUEUE_UNBAN', $network, 1);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('network_host_invalid', $network)
|
'msg' => array('network_host_invalid', $network)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Blacklist network
|
// Blacklist network
|
||||||
elseif ($_data['action'] == "blacklist") {
|
elseif ($_data['action'] == "blacklist") {
|
||||||
if (empty($network)) { continue; }
|
if (empty($network)) { continue; }
|
||||||
if (valid_network($network) && !in_array($network, array(
|
if (valid_network($network) && !in_array($network, array(
|
||||||
'0.0.0.0',
|
'0.0.0.0',
|
||||||
'0.0.0.0/0',
|
'0.0.0.0/0',
|
||||||
getenv('IPV4_NETWORK') . '0/24',
|
getenv('IPV4_NETWORK') . '0/24',
|
||||||
getenv('IPV4_NETWORK') . '0',
|
getenv('IPV4_NETWORK') . '0',
|
||||||
getenv('IPV6_NETWORK')
|
getenv('IPV6_NETWORK')
|
||||||
))) {
|
))) {
|
||||||
try {
|
try {
|
||||||
$redis->hSet('F2B_BLACKLIST', $network, 1);
|
$redis->hSet('NETFILTER_BLACKLIST', $network, 1);
|
||||||
$redis->hDel('F2B_WHITELIST', $network, 1);
|
$redis->hDel('NETFILTER_WHITELIST', $network, 1);
|
||||||
//$response = docker('post', 'netfilter-mailcow', 'restart');
|
//$response = docker('post', 'netfilter-mailcow', 'restart');
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('network_host_invalid', $network)
|
'msg' => array('network_host_invalid', $network)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('object_modified', htmlspecialchars($network))
|
'msg' => array('object_modified', htmlspecialchars($network))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Start default edit without specific action
|
// Start default edit without specific action
|
||||||
$is_now = fail2ban('get');
|
$is_now = netfilter('get');
|
||||||
if (!empty($is_now)) {
|
if (!empty($is_now)) {
|
||||||
$ban_time = intval((isset($_data['ban_time'])) ? $_data['ban_time'] : $is_now['ban_time']);
|
$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']);
|
$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']);
|
$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_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']);
|
$netban_ipv6 = intval((isset($_data['netban_ipv6'])) ? $_data['netban_ipv6'] : $is_now['netban_ipv6']);
|
||||||
$wl = (isset($_data['whitelist'])) ? $_data['whitelist'] : $is_now['whitelist'];
|
$wl = (isset($_data['whitelist'])) ? $_data['whitelist'] : $is_now['whitelist'];
|
||||||
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$f2b_options = array();
|
$netfilter_options = array();
|
||||||
$f2b_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
|
$netfilter_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
|
||||||
$f2b_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
|
$netfilter_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
|
||||||
$f2b_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
|
$netfilter_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
|
||||||
$f2b_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
|
$netfilter_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
|
||||||
$f2b_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
|
$netfilter_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
|
||||||
$f2b_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
|
$netfilter_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
|
||||||
$f2b_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
|
$netfilter_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
|
||||||
try {
|
try {
|
||||||
$redis->Set('F2B_OPTIONS', json_encode($f2b_options));
|
$redis->Set('NETFILTER_OPTIONS', json_encode($netfilter_options));
|
||||||
$redis->Del('F2B_WHITELIST');
|
$redis->Del('NETFILTER_WHITELIST');
|
||||||
$redis->Del('F2B_BLACKLIST');
|
$redis->Del('NETFILTER_BLACKLIST');
|
||||||
if(!empty($wl)) {
|
if(!empty($wl)) {
|
||||||
$wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));
|
$wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));
|
||||||
$wl_array = array_filter($wl_array);
|
$wl_array = array_filter($wl_array);
|
||||||
if (is_array($wl_array)) {
|
if (is_array($wl_array)) {
|
||||||
foreach ($wl_array as $wl_item) {
|
foreach ($wl_array as $wl_item) {
|
||||||
if (valid_network($wl_item) || valid_hostname($wl_item)) {
|
if (valid_network($wl_item) || valid_hostname($wl_item)) {
|
||||||
$redis->hSet('F2B_WHITELIST', $wl_item, 1);
|
$redis->hSet('NETFILTER_WHITELIST', $wl_item, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('network_host_invalid', $wl_item)
|
'msg' => array('network_host_invalid', $wl_item)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!empty($bl)) {
|
if(!empty($bl)) {
|
||||||
$bl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $bl));
|
$bl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $bl));
|
||||||
$bl_array = array_filter($bl_array);
|
$bl_array = array_filter($bl_array);
|
||||||
if (is_array($bl_array)) {
|
if (is_array($bl_array)) {
|
||||||
foreach ($bl_array as $bl_item) {
|
foreach ($bl_array as $bl_item) {
|
||||||
if (valid_network($bl_item) && !in_array($bl_item, array(
|
if (valid_network($bl_item) && !in_array($bl_item, array(
|
||||||
'0.0.0.0',
|
'0.0.0.0',
|
||||||
'0.0.0.0/0',
|
'0.0.0.0/0',
|
||||||
getenv('IPV4_NETWORK') . '0/24',
|
getenv('IPV4_NETWORK') . '0/24',
|
||||||
getenv('IPV4_NETWORK') . '0',
|
getenv('IPV4_NETWORK') . '0',
|
||||||
getenv('IPV6_NETWORK')
|
getenv('IPV6_NETWORK')
|
||||||
))) {
|
))) {
|
||||||
$redis->hSet('F2B_BLACKLIST', $bl_item, 1);
|
$redis->hSet('NETFILTER_BLACKLIST', $bl_item, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('network_host_invalid', $bl_item)
|
'msg' => array('network_host_invalid', $bl_item)
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'f2b_modified'
|
'msg' => 'netfilter_modified'
|
||||||
);
|
);
|
||||||
break;
|
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.dkim.inc.php';
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.docker.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.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.fwdhost.inc.php';
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailbox.inc.php';
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailbox.inc.php';
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailq.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'))
|
if (file_exists('/web/css/themes/'.$UI_THEME.'-bootstrap.css'))
|
||||||
$css_minifier->add('/web/css/themes/'.$UI_THEME.'-bootstrap.css');
|
$css_minifier->add('/web/css/themes/'.$UI_THEME.'-bootstrap.css');
|
||||||
else
|
else
|
||||||
$css_minifier->add('/web/css/themes/lumen-bootstrap.css');
|
$css_minifier->add('/web/css/themes/lumen-bootstrap.css');
|
||||||
// minify css build files
|
// minify css build files
|
||||||
foreach ($css_dir as $css_file) {
|
foreach ($css_dir as $css_file) {
|
||||||
$css_minifier->add('/web/css/build/' . $css_file);
|
$css_minifier->add('/web/css/build/' . $css_file);
|
||||||
|
|
|
@ -1,140 +1,140 @@
|
||||||
<?php
|
<?php
|
||||||
// Start session
|
// Start session
|
||||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||||
ini_set("session.cookie_httponly", 1);
|
ini_set("session.cookie_httponly", 1);
|
||||||
ini_set('session.gc_maxlifetime', $SESSION_LIFETIME);
|
ini_set('session.gc_maxlifetime', $SESSION_LIFETIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
|
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
|
||||||
strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
|
strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
|
||||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||||
ini_set("session.cookie_secure", 1);
|
ini_set("session.cookie_secure", 1);
|
||||||
}
|
}
|
||||||
$IS_HTTPS = true;
|
$IS_HTTPS = true;
|
||||||
}
|
}
|
||||||
elseif (isset($_SERVER['HTTPS'])) {
|
elseif (isset($_SERVER['HTTPS'])) {
|
||||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||||
ini_set("session.cookie_secure", 1);
|
ini_set("session.cookie_secure", 1);
|
||||||
}
|
}
|
||||||
$IS_HTTPS = true;
|
$IS_HTTPS = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$IS_HTTPS = false;
|
$IS_HTTPS = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||||
session_start();
|
session_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($_SESSION['CSRF']['TOKEN'])) {
|
if (!isset($_SESSION['CSRF']['TOKEN'])) {
|
||||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set session UA
|
// Set session UA
|
||||||
if (!isset($_SESSION['SESS_REMOTE_UA'])) {
|
if (!isset($_SESSION['SESS_REMOTE_UA'])) {
|
||||||
$_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
|
$_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep session active
|
// Keep session active
|
||||||
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $SESSION_LIFETIME)) {
|
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $SESSION_LIFETIME)) {
|
||||||
session_unset();
|
session_unset();
|
||||||
session_destroy();
|
session_destroy();
|
||||||
}
|
}
|
||||||
$_SESSION['LAST_ACTIVITY'] = time();
|
$_SESSION['LAST_ACTIVITY'] = time();
|
||||||
|
|
||||||
// API
|
// API
|
||||||
if (!empty($_SERVER['HTTP_X_API_KEY'])) {
|
if (!empty($_SERVER['HTTP_X_API_KEY'])) {
|
||||||
$stmt = $pdo->prepare("SELECT * FROM `api` WHERE `api_key` = :api_key AND `active` = '1';");
|
$stmt = $pdo->prepare("SELECT * FROM `api` WHERE `api_key` = :api_key AND `active` = '1';");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY'])
|
':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY'])
|
||||||
));
|
));
|
||||||
$api_return = $stmt->fetch(PDO::FETCH_ASSOC);
|
$api_return = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (!empty($api_return['api_key'])) {
|
if (!empty($api_return['api_key'])) {
|
||||||
$skip_ip_check = ($api_return['skip_ip_check'] == 1);
|
$skip_ip_check = ($api_return['skip_ip_check'] == 1);
|
||||||
$remote = get_remote_ip(false);
|
$remote = get_remote_ip(false);
|
||||||
$allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from']));
|
$allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from']));
|
||||||
if ($skip_ip_check === true || ip_acl($remote, $allow_from)) {
|
if ($skip_ip_check === true || ip_acl($remote, $allow_from)) {
|
||||||
$_SESSION['mailcow_cc_username'] = 'API';
|
$_SESSION['mailcow_cc_username'] = 'API';
|
||||||
$_SESSION['mailcow_cc_role'] = 'admin';
|
$_SESSION['mailcow_cc_role'] = 'admin';
|
||||||
$_SESSION['mailcow_cc_api'] = true;
|
$_SESSION['mailcow_cc_api'] = true;
|
||||||
if ($api_return['access'] == 'rw') {
|
if ($api_return['access'] == 'rw') {
|
||||||
$_SESSION['mailcow_cc_api_access'] = 'rw';
|
$_SESSION['mailcow_cc_api_access'] = 'rw';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['mailcow_cc_api_access'] = 'ro';
|
$_SESSION['mailcow_cc_api_access'] = 'ro';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
$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']);
|
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||||
http_response_code(401);
|
http_response_code(401);
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
'type' => 'error',
|
'type' => 'error',
|
||||||
'msg' => 'api access denied for ip ' . $_SERVER['REMOTE_ADDR']
|
'msg' => 'api access denied for ip ' . $_SERVER['REMOTE_ADDR']
|
||||||
));
|
));
|
||||||
unset($_POST);
|
unset($_POST);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']);
|
$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']);
|
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||||
http_response_code(401);
|
http_response_code(401);
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
'type' => 'error',
|
'type' => 'error',
|
||||||
'msg' => 'authentication failed'
|
'msg' => 'authentication failed'
|
||||||
));
|
));
|
||||||
unset($_POST);
|
unset($_POST);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle logouts
|
// Handle logouts
|
||||||
if (isset($_POST["logout"])) {
|
if (isset($_POST["logout"])) {
|
||||||
if (isset($_SESSION["dual-login"])) {
|
if (isset($_SESSION["dual-login"])) {
|
||||||
$_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
|
$_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
|
||||||
$_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
|
$_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
|
||||||
unset($_SESSION["dual-login"]);
|
unset($_SESSION["dual-login"]);
|
||||||
header("Location: /mailbox");
|
header("Location: /mailbox");
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
session_regenerate_id(true);
|
session_regenerate_id(true);
|
||||||
session_unset();
|
session_unset();
|
||||||
session_destroy();
|
session_destroy();
|
||||||
session_write_close();
|
session_write_close();
|
||||||
header("Location: /");
|
header("Location: /");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check session
|
// Check session
|
||||||
function session_check() {
|
function session_check() {
|
||||||
if (isset($_SESSION['mailcow_cc_api']) && $_SESSION['mailcow_cc_api'] === true) {
|
if (isset($_SESSION['mailcow_cc_api']) && $_SESSION['mailcow_cc_api'] === true) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'msg' => 'session_ua'
|
'msg' => 'session_ua'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!empty($_POST)) {
|
if (!empty($_POST)) {
|
||||||
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'msg' => 'session_token'
|
'msg' => 'session_token'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
unset($_POST['csrf_token']);
|
unset($_POST['csrf_token']);
|
||||||
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
$_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
|
||||||
$_SESSION['CSRF']['TIME'] = time();
|
$_SESSION['CSRF']['TIME'] = time();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
|
if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
|
||||||
$_POST = array();
|
$_POST = array();
|
||||||
$_FILES = array();
|
$_FILES = array();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ jQuery(function($){
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
var regex_map_id = $(this).data('regex-map');
|
var regex_map_id = $(this).data('regex-map');
|
||||||
var regex_data = $(jq(regex_map_id)).val().split(/\r?\n/);
|
var regex_data = $(jq(regex_map_id)).val().split(/\r?\n/);
|
||||||
var regex_valid = true;
|
|
||||||
for(var i = 0;i < regex_data.length;i++){
|
for(var i = 0;i < regex_data.length;i++){
|
||||||
if(regex_data[i].startsWith('#') || !regex_data[i]){
|
if(regex_data[i].startsWith('#') || !regex_data[i]){
|
||||||
continue;
|
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="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><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>';
|
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") {
|
} else if (type == "netfilter_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 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="f2b_regex" type="text" name="regex" required></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>';
|
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);
|
row.append(cols);
|
||||||
|
@ -718,14 +717,14 @@ jQuery(function($){
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$(this).parents('tr').remove();
|
$(this).parents('tr').remove();
|
||||||
});
|
});
|
||||||
$('#f2b_regex_table').on('click', 'tr a', function (e) {
|
$('#netfilter_regex_table').on('click', 'tr a', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$(this).parents('tr').remove();
|
$(this).parents('tr').remove();
|
||||||
});
|
});
|
||||||
$('#add_app_link_row').click(function() {
|
$('#add_app_link_row').click(function() {
|
||||||
add_table_row($('#app_link_table'), "app_link");
|
add_table_row($('#app_link_table'), "app_link");
|
||||||
});
|
});
|
||||||
$('#add_f2b_regex_row').click(function() {
|
$('#add_netfilter_regex_row').click(function() {
|
||||||
add_table_row($('#f2b_regex_table'), "f2b_regex");
|
add_table_row($('#netfilter_regex_table'), "netfilter_regex");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1310,10 +1310,10 @@ if (isset($_GET['query'])) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "fail2ban":
|
case "netfilter":
|
||||||
switch ($object) {
|
switch ($object) {
|
||||||
default:
|
default:
|
||||||
$data = fail2ban('get');
|
$data = netfilter('get');
|
||||||
process_get_return($data);
|
process_get_return($data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1917,8 +1917,8 @@ if (isset($_GET['query'])) {
|
||||||
case "fwdhost":
|
case "fwdhost":
|
||||||
process_edit_return(fwdhost('edit', array_merge(array('fwdhost' => $items), $attr)));
|
process_edit_return(fwdhost('edit', array_merge(array('fwdhost' => $items), $attr)));
|
||||||
break;
|
break;
|
||||||
case "fail2ban":
|
case "netfilter":
|
||||||
process_edit_return(fail2ban('edit', array_merge(array('network' => $items), $attr)));
|
process_edit_return(netfilter('edit', array_merge(array('network' => $items), $attr)));
|
||||||
break;
|
break;
|
||||||
case "ui_texts":
|
case "ui_texts":
|
||||||
process_edit_return(customize('edit', 'ui_texts', $attr));
|
process_edit_return(customize('edit', 'ui_texts', $attr));
|
||||||
|
|
|
@ -90,13 +90,13 @@
|
||||||
"domain_admins": "Administradores de dominio",
|
"domain_admins": "Administradores de dominio",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"empty": "Sense resultats",
|
"empty": "Sense resultats",
|
||||||
"f2b_ban_time": "Temsp de bloqueig (s)",
|
"netfilter_ban_time": "Temsp de bloqueig (s)",
|
||||||
"f2b_max_attempts": "Intents màx.",
|
"netfilter_max_attempts": "Intents màx.",
|
||||||
"f2b_netban_ipv4": "Suxarxa IPv4 on aplicar el bloqueig (8-32)",
|
"netfilter_netban_ipv4": "Suxarxa IPv4 on aplicar el bloqueig (8-32)",
|
||||||
"f2b_netban_ipv6": "Suxarxa IPv6 on aplicar el bloqueig (8-128)",
|
"netfilter_netban_ipv6": "Suxarxa IPv6 on aplicar el bloqueig (8-128)",
|
||||||
"f2b_parameters": "Fail2ban",
|
"netfilter_parameters": "Netfilter",
|
||||||
"f2b_retry_window": "Finestra de reintent (s) per intents màx.",
|
"netfilter_retry_window": "Finestra de reintent (s) per intents màx.",
|
||||||
"f2b_whitelist": "Llista blanca de xarxes/hosts",
|
"netfilter_whitelist": "Llista blanca de xarxes/hosts",
|
||||||
"filter_table": "Filtrar taula",
|
"filter_table": "Filtrar taula",
|
||||||
"forwarding_hosts": "Forwarding Hosts",
|
"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 ).",
|
"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_modified": "S'han desat els canvis fets al domini %s",
|
||||||
"domain_removed": "S'ha elminat el domini %s",
|
"domain_removed": "S'ha elminat el domini %s",
|
||||||
"eas_reset": "S'ha fet un reset als dispositius ActiveSync de l'usuari %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_added": "Forwarding host %s afegit",
|
||||||
"forwarding_host_removed": "Forwarding host %s esborrat",
|
"forwarding_host_removed": "Forwarding host %s esborrat",
|
||||||
"item_deleted": "S'ha esborrat %s",
|
"item_deleted": "S'ha esborrat %s",
|
||||||
|
|
|
@ -174,17 +174,17 @@
|
||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"empty": "Žádné výsledky",
|
"empty": "Žádné výsledky",
|
||||||
"excludes": "Vyloučit tyto příjemce",
|
"excludes": "Vyloučit tyto příjemce",
|
||||||
"f2b_ban_time": "Doba blokování (s)",
|
"netfilter_ban_time": "Doba blokování (s)",
|
||||||
"f2b_blacklist": "Sítě/hostitelé na blacklistu",
|
"netfilter_blacklist": "Sítě/hostitelé na blacklistu",
|
||||||
"f2b_filter": "Regex filtre",
|
"netfilter_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.",
|
"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.",
|
||||||
"f2b_max_attempts": "Max. pokusů",
|
"netfilter_max_attempts": "Max. pokusů",
|
||||||
"f2b_netban_ipv4": "Rozsah IPv4 podsítě k zablokování (8-32)",
|
"netfilter_netban_ipv4": "Rozsah IPv4 podsítě k zablokování (8-32)",
|
||||||
"f2b_netban_ipv6": "Rozsah IPv6 podsítě k zablokování (8-128)",
|
"netfilter_netban_ipv6": "Rozsah IPv6 podsítě k zablokování (8-128)",
|
||||||
"f2b_parameters": "Parametry automatického firewallu",
|
"netfilter_parameters": "Parametry automatického firewallu",
|
||||||
"f2b_regex_info": "Záznamy které se berou v úvahu: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Záznamy které se berou v úvahu: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Časový horizont pro maximum pokusů (s)",
|
"netfilter_retry_window": "Časový horizont pro maximum pokusů (s)",
|
||||||
"f2b_whitelist": "Sítě/hostitelé na whitelistu",
|
"netfilter_whitelist": "Sítě/hostitelé na whitelistu",
|
||||||
"filter_table": "Tabulka filtrů",
|
"filter_table": "Tabulka filtrů",
|
||||||
"forwarding_hosts": "Předávající servery",
|
"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ů).",
|
"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",
|
"redis_error": "Chyba Redis: %s",
|
||||||
"relayhost_invalid": "Položky %s je neplatná",
|
"relayhost_invalid": "Položky %s je neplatná",
|
||||||
"release_send_failed": "Zprávu nelze propustit: %s",
|
"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ý",
|
"resource_invalid": "Název zdroje %s je neplatný",
|
||||||
"rl_timeframe": "Nesprávný časový rámec omezení provozu",
|
"rl_timeframe": "Nesprávný časový rámec omezení provozu",
|
||||||
"rspamd_ui_pw_length": "Heslo pro Rspamd UI musí mít alespoň 6 znaků",
|
"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",
|
"domain_removed": "Doména %s odebrána",
|
||||||
"dovecot_restart_success": "Dovecot byl úspěšně restartován",
|
"dovecot_restart_success": "Dovecot byl úspěšně restartován",
|
||||||
"eas_reset": "ActiveSync zařízení uživatele %s vyresetováno",
|
"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_added": "Předávající hostitel %s přidán",
|
||||||
"forwarding_host_removed": "Předávající hostitel %s odebrán",
|
"forwarding_host_removed": "Předávající hostitel %s odebrán",
|
||||||
"global_filter_written": "Filtr byl úspěšně zapsán",
|
"global_filter_written": "Filtr byl úspěšně zapsán",
|
||||||
|
|
|
@ -165,17 +165,17 @@
|
||||||
"edit": "Redigere",
|
"edit": "Redigere",
|
||||||
"empty": "Ingen resultater",
|
"empty": "Ingen resultater",
|
||||||
"excludes": "Ekskluderer disse modtagere",
|
"excludes": "Ekskluderer disse modtagere",
|
||||||
"f2b_ban_time": "Udelukkelses tid (s)",
|
"netfilter_ban_time": "Udelukkelses tid (s)",
|
||||||
"f2b_blacklist": "Sortlistede netværk/værter",
|
"netfilter_blacklist": "Sortlistede netværk/værter",
|
||||||
"f2b_filter": "Regex filtre",
|
"netfilter_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> ",
|
"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> ",
|
||||||
"f2b_max_attempts": "Max. forsøg",
|
"netfilter_max_attempts": "Max. forsøg",
|
||||||
"f2b_netban_ipv4": "IPv4 subnet størrelse at anvende forbud mod (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "IPv6 subnet størrelse at anvende forbud mod (8-128)",
|
||||||
"f2b_parameters": "Fail2ban parametre",
|
"netfilter_parameters": "Netfilter parametre",
|
||||||
"f2b_regex_info": "Logfiler taget i betragtning: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Logfiler taget i betragtning: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Genindlæs vindue om (s) for max. forsøg",
|
"netfilter_retry_window": "Genindlæs vindue om (s) for max. forsøg",
|
||||||
"f2b_whitelist": "Hvidlisted netværk/vært",
|
"netfilter_whitelist": "Hvidlisted netværk/vært",
|
||||||
"filter_table": "Filtertabel",
|
"filter_table": "Filtertabel",
|
||||||
"forwarding_hosts": "Videresendelse af værter",
|
"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).",
|
"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",
|
"redis_error": "Redis fejl: %s",
|
||||||
"relayhost_invalid": "Kortindtastning %s er ugyldig",
|
"relayhost_invalid": "Kortindtastning %s er ugyldig",
|
||||||
"release_send_failed": "Beskeden kunne ikke frigives: %s",
|
"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",
|
"resource_invalid": "Ressource navn %s er ugyldig",
|
||||||
"rl_timeframe": "Tidsramme for satsbegrænsning er forkert",
|
"rl_timeframe": "Tidsramme for satsbegrænsning er forkert",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI adgangskoden skal være mindst 6 tegn lang",
|
"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",
|
"domain_removed": "Domæne %s er blevet fjernet",
|
||||||
"dovecot_restart_success": "Dovecot blev genstartet",
|
"dovecot_restart_success": "Dovecot blev genstartet",
|
||||||
"eas_reset": "ActiveSync-enheder til bruger %s blev nulstillet",
|
"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_added": "Videresendende vært %s er tilføjet",
|
||||||
"forwarding_host_removed": "Videresendende vært %s er blevet fjernet",
|
"forwarding_host_removed": "Videresendende vært %s er blevet fjernet",
|
||||||
"global_filter_written": "Filtret blev skrevet til filen",
|
"global_filter_written": "Filtret blev skrevet til filen",
|
||||||
|
|
|
@ -174,17 +174,17 @@
|
||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"empty": "Keine Einträge vorhanden",
|
"empty": "Keine Einträge vorhanden",
|
||||||
"excludes": "Diese Empfänger ausschließen",
|
"excludes": "Diese Empfänger ausschließen",
|
||||||
"f2b_ban_time": "Bannzeit in Sekunden",
|
"netfilter_ban_time": "Bannzeit in Sekunden",
|
||||||
"f2b_blacklist": "Blacklist für Netzwerke und Hosts",
|
"netfilter_blacklist": "Blacklist für Netzwerke und Hosts",
|
||||||
"f2b_filter": "Regex-Filter",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Max. Versuche",
|
"netfilter_max_attempts": "Max. Versuche",
|
||||||
"f2b_netban_ipv4": "Netzbereich für IPv4-Banns (8-32)",
|
"netfilter_netban_ipv4": "Netzbereich für IPv4-Banns (8-32)",
|
||||||
"f2b_netban_ipv6": "Netzbereich für IPv6-Banns (8-128)",
|
"netfilter_netban_ipv6": "Netzbereich für IPv6-Banns (8-128)",
|
||||||
"f2b_parameters": "Fail2ban-Parameter",
|
"netfilter_parameters": "Netfilter-Parameter",
|
||||||
"f2b_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Wiederholungen im Zeitraum von (s)",
|
"netfilter_retry_window": "Wiederholungen im Zeitraum von (s)",
|
||||||
"f2b_whitelist": "Whitelist für Netzwerke und Hosts",
|
"netfilter_whitelist": "Whitelist für Netzwerke und Hosts",
|
||||||
"filter_table": "Tabelle filtern",
|
"filter_table": "Tabelle filtern",
|
||||||
"forwarding_hosts": "Weiterleitungs-Hosts",
|
"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.",
|
"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",
|
"redis_error": "Redis Fehler: %s",
|
||||||
"relayhost_invalid": "Map-Eintrag %s ist ungültig",
|
"relayhost_invalid": "Map-Eintrag %s ist ungültig",
|
||||||
"release_send_failed": "Die Nachricht konnte nicht versendet werden: %s",
|
"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",
|
"resource_invalid": "Ressourcenname %s ist ungültig",
|
||||||
"rl_timeframe": "Ratelimit-Zeitraum ist inkorrekt",
|
"rl_timeframe": "Ratelimit-Zeitraum ist inkorrekt",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI-Passwort muss mindestens 6 Zeichen lang sein",
|
"rspamd_ui_pw_length": "Rspamd UI-Passwort muss mindestens 6 Zeichen lang sein",
|
||||||
|
@ -1002,7 +1002,7 @@
|
||||||
"domain_removed": "Domain %s wurde entfernt",
|
"domain_removed": "Domain %s wurde entfernt",
|
||||||
"dovecot_restart_success": "Dovecot wurde erfolgreich neu gestartet",
|
"dovecot_restart_success": "Dovecot wurde erfolgreich neu gestartet",
|
||||||
"eas_reset": "ActiveSync Gerät des Benutzers %s wurde zurückgesetzt",
|
"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_added": "Weiterleitungs-Host %s wurde hinzugefügt",
|
||||||
"forwarding_host_removed": "Weiterleitungs-Host %s wurde entfernt",
|
"forwarding_host_removed": "Weiterleitungs-Host %s wurde entfernt",
|
||||||
"global_filter_written": "Filterdatei wurde erfolgreich geschrieben",
|
"global_filter_written": "Filterdatei wurde erfolgreich geschrieben",
|
||||||
|
|
|
@ -176,17 +176,17 @@
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"empty": "No results",
|
"empty": "No results",
|
||||||
"excludes": "Excludes these recipients",
|
"excludes": "Excludes these recipients",
|
||||||
"f2b_ban_time": "Ban time (s)",
|
"netfilter_ban_time": "Ban time (s)",
|
||||||
"f2b_blacklist": "Blacklisted networks/hosts",
|
"netfilter_blacklist": "Blacklisted networks/hosts",
|
||||||
"f2b_filter": "Regex filters",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Max. attempts",
|
"netfilter_max_attempts": "Max. attempts",
|
||||||
"f2b_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
"netfilter_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||||
"f2b_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
"netfilter_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||||
"f2b_parameters": "Fail2ban parameters",
|
"netfilter_parameters": "Netfilter parameters",
|
||||||
"f2b_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Retry window (s) for max. attempts",
|
"netfilter_retry_window": "Retry window (s) for max. attempts",
|
||||||
"f2b_whitelist": "Whitelisted networks/hosts",
|
"netfilter_whitelist": "Whitelisted networks/hosts",
|
||||||
"filter_table": "Filter table",
|
"filter_table": "Filter table",
|
||||||
"forwarding_hosts": "Forwarding Hosts",
|
"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).",
|
"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",
|
"redis_error": "Redis error: %s",
|
||||||
"relayhost_invalid": "Map entry %s is invalid",
|
"relayhost_invalid": "Map entry %s is invalid",
|
||||||
"release_send_failed": "Message could not be released: %s",
|
"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",
|
"resource_invalid": "Resource name %s is invalid",
|
||||||
"rl_timeframe": "Rate limit time frame is incorrect",
|
"rl_timeframe": "Rate limit time frame is incorrect",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI password should be at least 6 chars long",
|
"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",
|
"domain_removed": "Domain %s has been removed",
|
||||||
"dovecot_restart_success": "Dovecot was restarted successfully",
|
"dovecot_restart_success": "Dovecot was restarted successfully",
|
||||||
"eas_reset": "ActiveSync devices for user %s were reset",
|
"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_added": "Forwarding host %s has been added",
|
||||||
"forwarding_host_removed": "Forwarding host %s has been removed",
|
"forwarding_host_removed": "Forwarding host %s has been removed",
|
||||||
"global_filter_written": "Filter was successfully written to file",
|
"global_filter_written": "Filter was successfully written to file",
|
||||||
|
|
|
@ -140,15 +140,15 @@
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"empty": "Sin resultados",
|
"empty": "Sin resultados",
|
||||||
"excludes": "Excluye a estos destinatarios",
|
"excludes": "Excluye a estos destinatarios",
|
||||||
"f2b_ban_time": "Tiempo de restricción (s)",
|
"netfilter_ban_time": "Tiempo de restricción (s)",
|
||||||
"f2b_blacklist": "Redes y hosts en lista negra",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Max num. de intentos",
|
"netfilter_max_attempts": "Max num. de intentos",
|
||||||
"f2b_netban_ipv4": "Tamaño de subred IPv4 para aplicar la restricción (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)",
|
||||||
"f2b_parameters": "Parametros Fail2ban",
|
"netfilter_parameters": "Parametros Netfilter",
|
||||||
"f2b_retry_window": "Ventana de tiempo entre reintentos",
|
"netfilter_retry_window": "Ventana de tiempo entre reintentos",
|
||||||
"f2b_whitelist": "Redes y hosts en lista blanca",
|
"netfilter_whitelist": "Redes y hosts en lista blanca",
|
||||||
"filter_table": "Filtrar tabla",
|
"filter_table": "Filtrar tabla",
|
||||||
"forwarding_hosts": "Hosts de reenvío",
|
"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)",
|
"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",
|
"edit": "Muokata",
|
||||||
"empty": "Ei tuloksia",
|
"empty": "Ei tuloksia",
|
||||||
"excludes": "Sulkee pois nämä vastaanottajat",
|
"excludes": "Sulkee pois nämä vastaanottajat",
|
||||||
"f2b_ban_time": "Ban aika (s)",
|
"netfilter_ban_time": "Ban aika (s)",
|
||||||
"f2b_blacklist": "Mustalla listalla verkot/isännät",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Maksmi. Yritykset",
|
"netfilter_max_attempts": "Maksmi. Yritykset",
|
||||||
"f2b_netban_ipv4": "IPv4 aliverkon koko kiellon soveltamiseksi (8-32)",
|
"netfilter_netban_ipv4": "IPv4 aliverkon koko kiellon soveltamiseksi (8-32)",
|
||||||
"f2b_netban_ipv6": "IPv6 aliverkon koko kiellon soveltamiseksi (8-128)",
|
"netfilter_netban_ipv6": "IPv6 aliverkon koko kiellon soveltamiseksi (8-128)",
|
||||||
"f2b_parameters": "Fail2ban parametrit",
|
"netfilter_parameters": "Netfilter parametrit",
|
||||||
"f2b_retry_window": "Yritä uudelleen-ikkuna (s) Max. Yrittää",
|
"netfilter_retry_window": "Yritä uudelleen-ikkuna (s) Max. Yrittää",
|
||||||
"f2b_whitelist": "Sallitut verkot/isännät",
|
"netfilter_whitelist": "Sallitut verkot/isännät",
|
||||||
"filter_table": "Suodata taulukko",
|
"filter_table": "Suodata taulukko",
|
||||||
"forwarding_hosts": "Palveluntarjoajien välittäminen",
|
"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). .",
|
"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_modified": "Muutokset verkkotunnus alueeseen %s on tallennettu",
|
||||||
"domain_removed": "Verkkotunnus %s on poistettu",
|
"domain_removed": "Verkkotunnus %s on poistettu",
|
||||||
"eas_reset": "ActiveSync-laitteet käyttäjälle %s nollataan",
|
"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_added": "Välitys host %s on lisätty",
|
||||||
"forwarding_host_removed": "Välitys host %s on poistettu",
|
"forwarding_host_removed": "Välitys host %s on poistettu",
|
||||||
"hash_deleted": "Hash poistettu",
|
"hash_deleted": "Hash poistettu",
|
||||||
|
|
|
@ -171,17 +171,17 @@
|
||||||
"edit": "Editer",
|
"edit": "Editer",
|
||||||
"empty": "Aucun résultat",
|
"empty": "Aucun résultat",
|
||||||
"excludes": "Exclure ces destinataires",
|
"excludes": "Exclure ces destinataires",
|
||||||
"f2b_ban_time": "Durée du bannissement(s)",
|
"netfilter_ban_time": "Durée du bannissement(s)",
|
||||||
"f2b_blacklist": "Réseaux/Domaines sur Liste Noire",
|
"netfilter_blacklist": "Réseaux/Domaines sur Liste Noire",
|
||||||
"f2b_filter": "Filtre(s) Regex",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Nb max. de tentatives",
|
"netfilter_max_attempts": "Nb max. de tentatives",
|
||||||
"f2b_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)",
|
||||||
"f2b_parameters": "Paramètres Fail2ban",
|
"netfilter_parameters": "Paramètres Netfilter",
|
||||||
"f2b_regex_info": "Logs pris en compte : SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_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",
|
"netfilter_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives",
|
||||||
"f2b_whitelist": "Réseaux/hôtes en liste blanche",
|
"netfilter_whitelist": "Réseaux/hôtes en liste blanche",
|
||||||
"filter_table": "Table de filtrage",
|
"filter_table": "Table de filtrage",
|
||||||
"forwarding_hosts": "Hôtes de réexpédition",
|
"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).",
|
"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",
|
"redis_error": "Erreur Redis : %s",
|
||||||
"relayhost_invalid": "La saisie de la carte %s est invalide",
|
"relayhost_invalid": "La saisie de la carte %s est invalide",
|
||||||
"release_send_failed": "Le message n’a pas pu être diffusé : %s",
|
"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",
|
"resource_invalid": "Le nom de la resource %s n'est pas valide",
|
||||||
"rl_timeframe": "Le délai limite du taux est incorrect",
|
"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",
|
"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é",
|
"domain_removed": "Le domaine %s a été supprimé",
|
||||||
"dovecot_restart_success": "Dovecot a été relancé avec succès",
|
"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",
|
"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_added": "Ajout de l’hôte de réacheminement %s",
|
||||||
"forwarding_host_removed": "Suppression 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",
|
"global_filter_written": "Le filtre a été écrit avec succès dans le fichier",
|
||||||
|
|
|
@ -174,17 +174,17 @@
|
||||||
"edit": "Modifica",
|
"edit": "Modifica",
|
||||||
"empty": "Nessun risultato",
|
"empty": "Nessun risultato",
|
||||||
"excludes": "Esclude questi destinatari",
|
"excludes": "Esclude questi destinatari",
|
||||||
"f2b_ban_time": "Tempo di blocco (s)",
|
"netfilter_ban_time": "Tempo di blocco (s)",
|
||||||
"f2b_blacklist": "Host/reti in blacklist",
|
"netfilter_blacklist": "Host/reti in blacklist",
|
||||||
"f2b_filter": "Filtri Regex",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Tentativi massimi",
|
"netfilter_max_attempts": "Tentativi massimi",
|
||||||
"f2b_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
"netfilter_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)",
|
||||||
"f2b_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
"netfilter_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)",
|
||||||
"f2b_parameters": "Parametri Fail2ban",
|
"netfilter_parameters": "Parametri Netfilter",
|
||||||
"f2b_regex_info": "Log presi in considerazione: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Log presi in considerazione: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Retry window (s) for max. attempts",
|
"netfilter_retry_window": "Retry window (s) for max. attempts",
|
||||||
"f2b_whitelist": "Host/reti in whitelist",
|
"netfilter_whitelist": "Host/reti in whitelist",
|
||||||
"filter_table": "Tabella filtro",
|
"filter_table": "Tabella filtro",
|
||||||
"forwarding_hosts": "Inoltro degli host",
|
"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) .",
|
"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",
|
"redis_error": "Redis error: %s",
|
||||||
"relayhost_invalid": "Map entry %s is invalid",
|
"relayhost_invalid": "Map entry %s is invalid",
|
||||||
"release_send_failed": "Message could not be released: %s",
|
"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",
|
"resource_invalid": "Il nome della risorsa non è valido",
|
||||||
"rl_timeframe": "Rate limit time frame is incorrect",
|
"rl_timeframe": "Rate limit time frame is incorrect",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI password should be at least 6 chars long",
|
"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",
|
"domain_removed": "Il dominio %s è stato aggiunto",
|
||||||
"dovecot_restart_success": "Dovecot è stato riavviato con successo",
|
"dovecot_restart_success": "Dovecot è stato riavviato con successo",
|
||||||
"eas_reset": "I dispositivi ActiveSync dell'utente %s sono stati resettati",
|
"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_added": "Inoltro dell' host %s è stato aggiunto",
|
||||||
"forwarding_host_removed": "Inoltro dell' host %s è stato rimosso",
|
"forwarding_host_removed": "Inoltro dell' host %s è stato rimosso",
|
||||||
"global_filter_written": "Il filtro è stato scritto con successo nel file",
|
"global_filter_written": "Il filtro è stato scritto con successo nel file",
|
||||||
|
|
|
@ -163,15 +163,15 @@
|
||||||
"edit": "편집",
|
"edit": "편집",
|
||||||
"empty": "값이 없음",
|
"empty": "값이 없음",
|
||||||
"excludes": "다음 수신자 제외",
|
"excludes": "다음 수신자 제외",
|
||||||
"f2b_ban_time": "차단 시간 (s)",
|
"netfilter_ban_time": "차단 시간 (s)",
|
||||||
"f2b_blacklist": "블랙리스트에 기록된 네트워크/호스트",
|
"netfilter_blacklist": "블랙리스트에 기록된 네트워크/호스트",
|
||||||
"f2b_list_info": "블랙리스트에 기록된 호스트 혹은 네트워크는 항상 화이트 리스트보다 먼저 고려됩니다. <b>리스트를 업데이트하면 적용되는데 시간이 조금 걸릴 수 있습니다.</b>",
|
"netfilter_list_info": "블랙리스트에 기록된 호스트 혹은 네트워크는 항상 화이트 리스트보다 먼저 고려됩니다. <b>리스트를 업데이트하면 적용되는데 시간이 조금 걸릴 수 있습니다.</b>",
|
||||||
"f2b_max_attempts": "최대 시도 횟수",
|
"netfilter_max_attempts": "최대 시도 횟수",
|
||||||
"f2b_netban_ipv4": "차단할 IPv4 서브넷 크기 (8-32)",
|
"netfilter_netban_ipv4": "차단할 IPv4 서브넷 크기 (8-32)",
|
||||||
"f2b_netban_ipv6": "차단할 IPv6 서브넷 크기 (8-128)",
|
"netfilter_netban_ipv6": "차단할 IPv6 서브넷 크기 (8-128)",
|
||||||
"f2b_parameters": "Fail2ban 변수",
|
"netfilter_parameters": "Netfilter 변수",
|
||||||
"f2b_retry_window": "최대 시도 횟수",
|
"netfilter_retry_window": "최대 시도 횟수",
|
||||||
"f2b_whitelist": "화이트리스트에 저장된 네트워크/호스트",
|
"netfilter_whitelist": "화이트리스트에 저장된 네트워크/호스트",
|
||||||
"filter_table": "필터 테이블",
|
"filter_table": "필터 테이블",
|
||||||
"forwarding_hosts": "포워딩 호스트",
|
"forwarding_hosts": "포워딩 호스트",
|
||||||
"forwarding_hosts_add_hint": "IPv4/IPv6 주소, CIDR 방식의 네트워크, 호스트 이름 (IP 주소로 확인된 호스트 이름), 또는 도메인 이름 (SPF 레코드를 쿼리하거나 MX레코드가 없는 경우 IP 주소로 확인된 도메인 이름)을 지정할 수 있습니다.",
|
"forwarding_hosts_add_hint": "IPv4/IPv6 주소, CIDR 방식의 네트워크, 호스트 이름 (IP 주소로 확인된 호스트 이름), 또는 도메인 이름 (SPF 레코드를 쿼리하거나 MX레코드가 없는 경우 IP 주소로 확인된 도메인 이름)을 지정할 수 있습니다.",
|
||||||
|
@ -819,7 +819,7 @@
|
||||||
"domain_removed": "Domain %s has been removed",
|
"domain_removed": "Domain %s has been removed",
|
||||||
"dovecot_restart_success": "Dovecot was restarted successfully",
|
"dovecot_restart_success": "Dovecot was restarted successfully",
|
||||||
"eas_reset": "ActiveSync devices for user %s were reset",
|
"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_added": "Forwarding host %s has been added",
|
||||||
"forwarding_host_removed": "Forwarding host %s has been removed",
|
"forwarding_host_removed": "Forwarding host %s has been removed",
|
||||||
"global_filter_written": "Filter was successfully written to file",
|
"global_filter_written": "Filter was successfully written to file",
|
||||||
|
|
|
@ -89,13 +89,13 @@
|
||||||
"domain_admins": "Domēna administratori",
|
"domain_admins": "Domēna administratori",
|
||||||
"edit": "Labot",
|
"edit": "Labot",
|
||||||
"empty": "Nav rezultātu",
|
"empty": "Nav rezultātu",
|
||||||
"f2b_ban_time": "Aizlieguma laiks (s)",
|
"netfilter_ban_time": "Aizlieguma laiks (s)",
|
||||||
"f2b_max_attempts": "Maks. piegājieni",
|
"netfilter_max_attempts": "Maks. piegājieni",
|
||||||
"f2b_netban_ipv4": "IPv4 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "IPv6 apakštīkla izmērs, lai piemērotu aizliegumu uz (8-128)",
|
||||||
"f2b_parameters": "Fail2ban parametri",
|
"netfilter_parameters": "Netfilter parametri",
|
||||||
"f2b_retry_window": "Atkārtošanas logs (s) priekš maks. piegājiena",
|
"netfilter_retry_window": "Atkārtošanas logs (s) priekš maks. piegājiena",
|
||||||
"f2b_whitelist": "Baltā saraksta tīkls/hosts",
|
"netfilter_whitelist": "Baltā saraksta tīkls/hosts",
|
||||||
"filter_table": "Filtru tabula",
|
"filter_table": "Filtru tabula",
|
||||||
"forwarding_hosts": "Hostu pārsūtīšana",
|
"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).",
|
"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_modified": "Izmaiņas domēnam %s ir saglabātas",
|
||||||
"domain_removed": "Domēns %s ir noņemts",
|
"domain_removed": "Domēns %s ir noņemts",
|
||||||
"eas_reset": "ActiveSync ierīces priekš lietotāja %s tika atiestatītas",
|
"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_added": "Pāradresācijas hosts %s pievienotsd",
|
||||||
"forwarding_host_removed": "Pāradresācijas hosts %s noņemts",
|
"forwarding_host_removed": "Pāradresācijas hosts %s noņemts",
|
||||||
"item_deleted": "Vērtība %s veiksmīgi dzēsta",
|
"item_deleted": "Vērtība %s veiksmīgi dzēsta",
|
||||||
|
|
|
@ -167,17 +167,17 @@
|
||||||
"edit": "Wijzig",
|
"edit": "Wijzig",
|
||||||
"empty": "Geen resultaten",
|
"empty": "Geen resultaten",
|
||||||
"excludes": "Exclusief",
|
"excludes": "Exclusief",
|
||||||
"f2b_ban_time": "Verbanningstijd (s)",
|
"netfilter_ban_time": "Verbanningstijd (s)",
|
||||||
"f2b_blacklist": "Netwerken/hosts op de blacklist",
|
"netfilter_blacklist": "Netwerken/hosts op de blacklist",
|
||||||
"f2b_filter": "Regex-filters",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Maximaal aantal pogingen",
|
"netfilter_max_attempts": "Maximaal aantal pogingen",
|
||||||
"f2b_netban_ipv4": "Voer de IPv4-subnetgrootte in waar de verbanning van kracht moet zijn (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Voer de IPv6-subnetgrootte in waar de verbanning van kracht moet zijn (8-128)",
|
||||||
"f2b_parameters": "Fail2ban",
|
"netfilter_parameters": "Netfilter",
|
||||||
"f2b_regex_info": "De volgende logs worden gebruikt: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "De volgende logs worden gebruikt: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Tijdsbestek voor maximale pogingen (s)",
|
"netfilter_retry_window": "Tijdsbestek voor maximale pogingen (s)",
|
||||||
"f2b_whitelist": "Netwerken/hosts op de whitelist",
|
"netfilter_whitelist": "Netwerken/hosts op de whitelist",
|
||||||
"filter_table": "Filtertabel",
|
"filter_table": "Filtertabel",
|
||||||
"forwarding_hosts": "Forwarding hosts",
|
"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.",
|
"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",
|
"redis_error": "Redis-error: %s",
|
||||||
"relayhost_invalid": "Invoer %s is ongeldig",
|
"relayhost_invalid": "Invoer %s is ongeldig",
|
||||||
"release_send_failed": "Het volgende bericht kon niet worden vrijgegeven: %s",
|
"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",
|
"resource_invalid": "Naam van resource %s is ongeldig",
|
||||||
"rl_timeframe": "Ratelimit-tijdsbestek is ongeldig",
|
"rl_timeframe": "Ratelimit-tijdsbestek is ongeldig",
|
||||||
"rspamd_ui_pw_length": "Rspamd-wachtwoord dient minstens 6 tekens lang te zijn",
|
"rspamd_ui_pw_length": "Rspamd-wachtwoord dient minstens 6 tekens lang te zijn",
|
||||||
|
@ -857,7 +857,7 @@
|
||||||
"domain_removed": "Domein %s is verwijderd",
|
"domain_removed": "Domein %s is verwijderd",
|
||||||
"dovecot_restart_success": "Dovecot is succesvol herstart",
|
"dovecot_restart_success": "Dovecot is succesvol herstart",
|
||||||
"eas_reset": "De ActiveSync-apparaatcache van gebruiker %s is hersteld",
|
"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_added": "Forwarding host %s is toegevoegd",
|
||||||
"forwarding_host_removed": "Forwarding host %s is verwijderd",
|
"forwarding_host_removed": "Forwarding host %s is verwijderd",
|
||||||
"global_filter_written": "Filter is opgeslagen",
|
"global_filter_written": "Filter is opgeslagen",
|
||||||
|
|
|
@ -66,11 +66,11 @@
|
||||||
"domain_admins": "Administratorzy domeny",
|
"domain_admins": "Administratorzy domeny",
|
||||||
"edit": "Edytuj",
|
"edit": "Edytuj",
|
||||||
"empty": "Brak wyników",
|
"empty": "Brak wyników",
|
||||||
"f2b_ban_time": "Czas bana (s)",
|
"netfilter_ban_time": "Czas bana (s)",
|
||||||
"f2b_max_attempts": "Max. ilość prób",
|
"netfilter_max_attempts": "Max. ilość prób",
|
||||||
"f2b_parameters": "Parametry Fail2ban",
|
"netfilter_parameters": "Parametry Netfilter",
|
||||||
"f2b_retry_window": "Spróbuj ponownie (s) dla max. ilości prób",
|
"netfilter_retry_window": "Spróbuj ponownie (s) dla max. ilości prób",
|
||||||
"f2b_whitelist": "Biała lista sieci/hosty",
|
"netfilter_whitelist": "Biała lista sieci/hosty",
|
||||||
"filter_table": "Tabela filtru",
|
"filter_table": "Tabela filtru",
|
||||||
"forwarding_hosts": "Hosty przekazujące",
|
"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).",
|
"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_modified": "Zapisano zmiany w domenie %s",
|
||||||
"domain_removed": "Usunięto domenę %s",
|
"domain_removed": "Usunięto domenę %s",
|
||||||
"eas_reset": "Zresetowano urządzenia ActiveSync dla użytkownika %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_added": "Dodano hosta przekazującego %s",
|
||||||
"forwarding_host_removed": "Usunięto hosta przekazującego %s",
|
"forwarding_host_removed": "Usunięto hosta przekazującego %s",
|
||||||
"item_deleted": "",
|
"item_deleted": "",
|
||||||
|
|
|
@ -175,17 +175,17 @@
|
||||||
"edit": "Editează",
|
"edit": "Editează",
|
||||||
"empty": "Nici un rezultat",
|
"empty": "Nici un rezultat",
|
||||||
"excludes": "Exclude acești destinatari",
|
"excludes": "Exclude acești destinatari",
|
||||||
"f2b_ban_time": "Timp interdicție (s)",
|
"netfilter_ban_time": "Timp interdicție (s)",
|
||||||
"f2b_blacklist": "Rețele/gazde pe lista neagră",
|
"netfilter_blacklist": "Rețele/gazde pe lista neagră",
|
||||||
"f2b_filter": "Filtre regex",
|
"netfilter_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.",
|
"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.",
|
||||||
"f2b_max_attempts": "Număr maxim încercări",
|
"netfilter_max_attempts": "Număr maxim încercări",
|
||||||
"f2b_netban_ipv4": "Dimensiunea subrețelei IPv4 pentru a aplica interdicția (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Dimensiunea subrețelei IPv6 pentru a aplica interdicția (8-128)",
|
||||||
"f2b_parameters": "Parametrii fail2ban",
|
"netfilter_parameters": "Parametrii Netfilter",
|
||||||
"f2b_regex_info": "Jurnalele luate în considerare: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Jurnalele luate în considerare: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Reîncercați fereastra (ele) pentru max. încercări",
|
"netfilter_retry_window": "Reîncercați fereastra (ele) pentru max. încercări",
|
||||||
"f2b_whitelist": "Rețele/gazde pe lista albă",
|
"netfilter_whitelist": "Rețele/gazde pe lista albă",
|
||||||
"filter_table": "Tabel filtre",
|
"filter_table": "Tabel filtre",
|
||||||
"forwarding_hosts": "Gazde de redirecționare",
|
"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).",
|
"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",
|
"redis_error": "Eroare Redis: %s",
|
||||||
"relayhost_invalid": "Intrarea hărții %s este invalidă",
|
"relayhost_invalid": "Intrarea hărții %s este invalidă",
|
||||||
"release_send_failed": "Mesajul nu a putut fi eliberat: %s",
|
"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",
|
"resource_invalid": "Numele de resurse %s este invalid",
|
||||||
"rl_timeframe": "Rata limită pentru intervalul de timp este incorectă",
|
"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",
|
"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",
|
"domain_removed": "Domeniul %s a fost adăugat",
|
||||||
"dovecot_restart_success": "Dovecot a fost restartat cu succes",
|
"dovecot_restart_success": "Dovecot a fost restartat cu succes",
|
||||||
"eas_reset": "Dispozitivele ActiveSync pentru utilizatorul %s au fost resetate",
|
"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_added": "Gazda de redirecționare %s a fost adăugată",
|
||||||
"forwarding_host_removed": "Gazda de redirecționare %s a fost eliminată",
|
"forwarding_host_removed": "Gazda de redirecționare %s a fost eliminată",
|
||||||
"global_filter_written": "Filtru a fost scris cu succes în fișier",
|
"global_filter_written": "Filtru a fost scris cu succes în fișier",
|
||||||
|
|
|
@ -176,17 +176,17 @@
|
||||||
"edit": "Изменить",
|
"edit": "Изменить",
|
||||||
"empty": "Пусто",
|
"empty": "Пусто",
|
||||||
"excludes": "Исключает этих получателей",
|
"excludes": "Исключает этих получателей",
|
||||||
"f2b_ban_time": "Время бана (в секундах)",
|
"netfilter_ban_time": "Время бана (в секундах)",
|
||||||
"f2b_blacklist": "Черный список подсетей/хостов",
|
"netfilter_blacklist": "Черный список подсетей/хостов",
|
||||||
"f2b_filter": "Правила фильтрации с помощью регулярных выражений",
|
"netfilter_filter": "Правила фильтрации с помощью регулярных выражений",
|
||||||
"f2b_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
"netfilter_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
||||||
"f2b_max_attempts": "Максимальное количество попыток",
|
"netfilter_max_attempts": "Максимальное количество попыток",
|
||||||
"f2b_netban_ipv4": "Размер подсети IPv4 для применения бана (8-32)",
|
"netfilter_netban_ipv4": "Размер подсети IPv4 для применения бана (8-32)",
|
||||||
"f2b_netban_ipv6": "Размер подсети IPv6 для применения бана (8-128)",
|
"netfilter_netban_ipv6": "Размер подсети IPv6 для применения бана (8-128)",
|
||||||
"f2b_parameters": "Настройки Fail2ban",
|
"netfilter_parameters": "Настройки Netfilter",
|
||||||
"f2b_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
"netfilter_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
||||||
"f2b_whitelist": "Белый список подсетей/хостов",
|
"netfilter_whitelist": "Белый список подсетей/хостов",
|
||||||
"filter_table": "Поиск",
|
"filter_table": "Поиск",
|
||||||
"forwarding_hosts": "Переадресация хостов",
|
"forwarding_hosts": "Переадресация хостов",
|
||||||
"forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).",
|
"forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).",
|
||||||
|
@ -425,7 +425,7 @@
|
||||||
"redis_error": "Ошибка в Redis: %s",
|
"redis_error": "Ошибка в Redis: %s",
|
||||||
"relayhost_invalid": "Правило %s не валидное",
|
"relayhost_invalid": "Правило %s не валидное",
|
||||||
"release_send_failed": "Сообщение не может быть восстановлено: %s",
|
"release_send_failed": "Сообщение не может быть восстановлено: %s",
|
||||||
"reset_f2b_regex": "Сброс фильтров не был выполнен за отведённый промежуток времени, пожалуйста, повторите попытку или подождите еще несколько секунд и перезагрузите веб страницу.",
|
"reset_netfilter_regex": "Сброс фильтров не был выполнен за отведённый промежуток времени, пожалуйста, повторите попытку или подождите еще несколько секунд и перезагрузите веб страницу.",
|
||||||
"resource_invalid": "Недопустимое имя ресурса",
|
"resource_invalid": "Недопустимое имя ресурса",
|
||||||
"rl_timeframe": "Не верный временной интервал для лимита отправки",
|
"rl_timeframe": "Не верный временной интервал для лимита отправки",
|
||||||
"rspamd_ui_pw_length": "Длина пароля должна составлять не менее 6 символов для Rspamd UI",
|
"rspamd_ui_pw_length": "Длина пароля должна составлять не менее 6 символов для Rspamd UI",
|
||||||
|
@ -942,7 +942,7 @@
|
||||||
"domain_removed": "Домен %s удалён",
|
"domain_removed": "Домен %s удалён",
|
||||||
"dovecot_restart_success": "Dovecot перезапущен успешно",
|
"dovecot_restart_success": "Dovecot перезапущен успешно",
|
||||||
"eas_reset": "Кеш ActiveSync для пользователя %s был сброшен",
|
"eas_reset": "Кеш ActiveSync для пользователя %s был сброшен",
|
||||||
"f2b_modified": "Изменения параметров Fail2ban сохранены",
|
"netfilter_modified": "Изменения параметров Netfilter сохранены",
|
||||||
"forwarding_host_added": "Перенаправление узла %s добавлено",
|
"forwarding_host_added": "Перенаправление узла %s добавлено",
|
||||||
"forwarding_host_removed": "Перенаправление узла %s удалено",
|
"forwarding_host_removed": "Перенаправление узла %s удалено",
|
||||||
"global_filter_written": "Фильтр успешно записан в файл",
|
"global_filter_written": "Фильтр успешно записан в файл",
|
||||||
|
|
|
@ -175,17 +175,17 @@
|
||||||
"edit": "Upraviť",
|
"edit": "Upraviť",
|
||||||
"empty": "Žiadne výsledky",
|
"empty": "Žiadne výsledky",
|
||||||
"excludes": "Vylúčiť týchto príjemcov",
|
"excludes": "Vylúčiť týchto príjemcov",
|
||||||
"f2b_ban_time": "Dĺžka blokovania (s)",
|
"netfilter_ban_time": "Dĺžka blokovania (s)",
|
||||||
"f2b_blacklist": "Blacklist sietí/hostiteľov",
|
"netfilter_blacklist": "Blacklist sietí/hostiteľov",
|
||||||
"f2b_filter": "Regex filtre",
|
"netfilter_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>",
|
"netfilter_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",
|
"netfilter_max_attempts": "Max. počet pokusov",
|
||||||
"f2b_netban_ipv4": "Veľkosť IPv4 subnetu na ktorý sa aplikuje zákaz (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Veľkosť IPv6 subnetu na ktorý sa aplikuje zákaz (8-128)",
|
||||||
"f2b_parameters": "Parametre automatického firewallu",
|
"netfilter_parameters": "Parametre automatického firewallu",
|
||||||
"f2b_regex_info": "Záznamy ktoré sa berú do úvahy: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_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)",
|
"netfilter_retry_window": "Čas v ktorom je treba uplatniť max. počet pokusov (s)",
|
||||||
"f2b_whitelist": "Whitelist sietí/hostiteľov",
|
"netfilter_whitelist": "Whitelist sietí/hostiteľov",
|
||||||
"filter_table": "Tabuľka filtrov",
|
"filter_table": "Tabuľka filtrov",
|
||||||
"forwarding_hosts": "Preposielacie servery",
|
"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).",
|
"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",
|
"redis_error": "Redis chyba: %s",
|
||||||
"relayhost_invalid": "Položka %s je neplatná",
|
"relayhost_invalid": "Položka %s je neplatná",
|
||||||
"release_send_failed": "Správa nemohla byť uvoľnená: %s",
|
"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é",
|
"resource_invalid": "Zdrojové meno %s je neplatné",
|
||||||
"rl_timeframe": "Obmedzenie časového rámca je nesprávny",
|
"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",
|
"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á",
|
"domain_removed": "Doména %s odstránená",
|
||||||
"dovecot_restart_success": "Dovecot sa úspešne reštartoval",
|
"dovecot_restart_success": "Dovecot sa úspešne reštartoval",
|
||||||
"eas_reset": "ActiveSync zariadenia pre používateľa %s resetovaný",
|
"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_added": "Doručovací hostiteľ %s pridaný",
|
||||||
"forwarding_host_removed": "Doručovací hostiteľ %s vymazaný",
|
"forwarding_host_removed": "Doručovací hostiteľ %s vymazaný",
|
||||||
"global_filter_written": "Filter bol úspešne zapísaný do súboru",
|
"global_filter_written": "Filter bol úspešne zapísaný do súboru",
|
||||||
|
|
|
@ -173,17 +173,17 @@
|
||||||
"edit": "Ändra",
|
"edit": "Ändra",
|
||||||
"empty": "Inga resultat",
|
"empty": "Inga resultat",
|
||||||
"excludes": "Exkludera dessa mottagare",
|
"excludes": "Exkludera dessa mottagare",
|
||||||
"f2b_ban_time": "Banlysning i sekunder",
|
"netfilter_ban_time": "Banlysning i sekunder",
|
||||||
"f2b_blacklist": "Svartlistade nätverk/värdar",
|
"netfilter_blacklist": "Svartlistade nätverk/värdar",
|
||||||
"f2b_filter": "Regex-filter",
|
"netfilter_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>",
|
"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>",
|
||||||
"f2b_max_attempts": "Maximalt antal försök",
|
"netfilter_max_attempts": "Maximalt antal försök",
|
||||||
"f2b_netban_ipv4": "Storleken på ett IPv4 subnät, att applicera banlysning på (8-32)",
|
"netfilter_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)",
|
"netfilter_netban_ipv6": "Storleken på ett IPv6 subnät, att applicera banlysning på (8-128)",
|
||||||
"f2b_parameters": "Fail2ban parametrar",
|
"netfilter_parameters": "Netfilter parametrar",
|
||||||
"f2b_regex_info": "Loggarna avser: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Loggarna avser: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Tidsfönster för antal försök",
|
"netfilter_retry_window": "Tidsfönster för antal försök",
|
||||||
"f2b_whitelist": "Vitlistade nätverk/värdar",
|
"netfilter_whitelist": "Vitlistade nätverk/värdar",
|
||||||
"filter_table": "Filtrera tebellen",
|
"filter_table": "Filtrera tebellen",
|
||||||
"forwarding_hosts": "Värdar för inkommande e-post servrar",
|
"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).",
|
"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",
|
"redis_error": "Redis fel: %s",
|
||||||
"relayhost_invalid": "Posten %s är ogiltig",
|
"relayhost_invalid": "Posten %s är ogiltig",
|
||||||
"release_send_failed": "Meddelandet kunde inte skickas: %s",
|
"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",
|
"resource_invalid": "Resursnamnet %s är ogiltigt",
|
||||||
"rl_timeframe": "Intervallet för hastighetsbegränsningen är felaktig",
|
"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",
|
"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",
|
"domain_removed": "Domänen %s har tagits bort",
|
||||||
"dovecot_restart_success": "Dovecot kunde startas om",
|
"dovecot_restart_success": "Dovecot kunde startas om",
|
||||||
"eas_reset": "AktivSynk enheter för användaren %s har återställts",
|
"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_added": "Vidarbefodringsvärden %s har lagts till",
|
||||||
"forwarding_host_removed": "Vidarbefodringsvärden %s har tagits bort",
|
"forwarding_host_removed": "Vidarbefodringsvärden %s har tagits bort",
|
||||||
"global_filter_written": "Data har skrivits till filterfilen",
|
"global_filter_written": "Data har skrivits till filterfilen",
|
||||||
|
|
|
@ -79,8 +79,8 @@
|
||||||
"domain_s": "Alan ad(ları)",
|
"domain_s": "Alan ad(ları)",
|
||||||
"duplicate": "Çift",
|
"duplicate": "Çift",
|
||||||
"duplicate_dkim": "Çift DKIM kayıtları",
|
"duplicate_dkim": "Çift DKIM kayıtları",
|
||||||
"f2b_ban_time": "Yasaklama süresi (saniye)",
|
"netfilter_ban_time": "Yasaklama süresi (saniye)",
|
||||||
"f2b_max_attempts": "Maksimum giriş denemesi",
|
"netfilter_max_attempts": "Maksimum giriş denemesi",
|
||||||
"f2b_retry_window": "Maksimum girişim için deneme pencere(leri)"
|
"netfilter_retry_window": "Maksimum girişim için deneme pencere(leri)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,15 +162,15 @@
|
||||||
"duplicate": "Копіювати",
|
"duplicate": "Копіювати",
|
||||||
"edit": "Змінити",
|
"edit": "Змінити",
|
||||||
"empty": "Пусто",
|
"empty": "Пусто",
|
||||||
"f2b_ban_time": "Час бану (у секундах)",
|
"netfilter_ban_time": "Час бану (у секундах)",
|
||||||
"f2b_blacklist": "Чорний список підмереж/хостів",
|
"netfilter_blacklist": "Чорний список підмереж/хостів",
|
||||||
"f2b_max_attempts": "Максимальна кількість спроб",
|
"netfilter_max_attempts": "Максимальна кількість спроб",
|
||||||
"f2b_netban_ipv4": "Розмір підмережі IPv4 для блокування (8-32)",
|
"netfilter_netban_ipv4": "Розмір підмережі IPv4 для блокування (8-32)",
|
||||||
"f2b_netban_ipv6": "Розмір підмережі IPv6 для блокування (8-128)",
|
"netfilter_netban_ipv6": "Розмір підмережі IPv6 для блокування (8-128)",
|
||||||
"f2b_parameters": "Налаштування Fail2ban",
|
"netfilter_parameters": "Налаштування Netfilter",
|
||||||
"f2b_regex_info": "Журнали, які приймаються до уваги: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"netfilter_regex_info": "Журнали, які приймаються до уваги: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Проміжок часу для наступного блокування (у секундах)",
|
"netfilter_retry_window": "Проміжок часу для наступного блокування (у секундах)",
|
||||||
"f2b_whitelist": "Білий список підмереж/хостів",
|
"netfilter_whitelist": "Білий список підмереж/хостів",
|
||||||
"filter_table": "Пошук",
|
"filter_table": "Пошук",
|
||||||
"forwarding_hosts": "Переадресація хостів",
|
"forwarding_hosts": "Переадресація хостів",
|
||||||
"from": "Від",
|
"from": "Від",
|
||||||
|
@ -303,8 +303,8 @@
|
||||||
"dkim_to_title": "Цільовий домен(и) (DKIM буде перезаписаний)",
|
"dkim_to_title": "Цільовий домен(и) (DKIM буде перезаписаний)",
|
||||||
"duplicate_dkim": "Копіювання DKIM запису",
|
"duplicate_dkim": "Копіювання DKIM запису",
|
||||||
"excludes": "Виключає цих отримувачів",
|
"excludes": "Виключає цих отримувачів",
|
||||||
"f2b_filter": "Правила фільтрування за допомогою регулярних виразів",
|
"netfilter_filter": "Правила фільтрування за допомогою регулярних виразів",
|
||||||
"f2b_list_info": "Хости або підмережі, занесені до чорного списку, завжди переважатимуть об'єкти з білого списку. <b>Оновлення списку займе декілька секунд.</b>",
|
"netfilter_list_info": "Хости або підмережі, занесені до чорного списку, завжди переважатимуть об'єкти з білого списку. <b>Оновлення списку займе декілька секунд.</b>",
|
||||||
"forwarding_hosts_add_hint": "Можна вказувати: IPv4/IPv6 підмережі в нотації CIDR, імена хостів (які будуть дозволятися в IP-адреси) або доменні імена (які будуть вирішуватися з IP-адресами шляхом запиту SPF записів або, у разі їх відсутності, запитом MX записів).",
|
"forwarding_hosts_add_hint": "Можна вказувати: IPv4/IPv6 підмережі в нотації CIDR, імена хостів (які будуть дозволятися в IP-адреси) або доменні імена (які будуть вирішуватися з IP-адресами шляхом запиту SPF записів або, у разі їх відсутності, запитом MX записів).",
|
||||||
"forwarding_hosts_hint": "Вхідні повідомлення приймаються від будь-яких хостів, перерахованих тут. Ці хости не проходять перевірку DNSBL і greylisting. Спам, отриманий від них, ніколи не відхиляється, але за бажання можна включити спам-фільтр і листи з поганим рейтингом потраплятимуть до спаму. Найбільш поширене використання – вказати поштові сервери, на яких ви встановили правило, яке перенаправляє вхідні електронні листи на ваш поштовий сервер mailcow.",
|
"forwarding_hosts_hint": "Вхідні повідомлення приймаються від будь-яких хостів, перерахованих тут. Ці хости не проходять перевірку DNSBL і greylisting. Спам, отриманий від них, ніколи не відхиляється, але за бажання можна включити спам-фільтр і листи з поганим рейтингом потраплятимуть до спаму. Найбільш поширене використання – вказати поштові сервери, на яких ви встановили правило, яке перенаправляє вхідні електронні листи на ваш поштовий сервер mailcow.",
|
||||||
"guid_and_license": "Ліцензія та GUID",
|
"guid_and_license": "Ліцензія та GUID",
|
||||||
|
@ -446,7 +446,7 @@
|
||||||
"private_key_error": "Помилка приватного ключа: %s",
|
"private_key_error": "Помилка приватного ключа: %s",
|
||||||
"pushover_token": "Токен Pushover вказано у неправильному форматі",
|
"pushover_token": "Токен Pushover вказано у неправильному форматі",
|
||||||
"relayhost_invalid": "Правило %s невірне",
|
"relayhost_invalid": "Правило %s невірне",
|
||||||
"reset_f2b_regex": "Скидання фільтрів не було виконано за відведений проміжок часу, будь ласка, повторіть спробу або зачекайте ще кілька секунд і перезавантажте веб-сторінку.",
|
"reset_netfilter_regex": "Скидання фільтрів не було виконано за відведений проміжок часу, будь ласка, повторіть спробу або зачекайте ще кілька секунд і перезавантажте веб-сторінку.",
|
||||||
"sender_acl_invalid": "Неприпустиме значення ACL для %s",
|
"sender_acl_invalid": "Неприпустиме значення ACL для %s",
|
||||||
"spam_learn_error": "Помилка при навчанні спам фільтра: %s",
|
"spam_learn_error": "Помилка при навчанні спам фільтра: %s",
|
||||||
"targetd_relay_domain": "Цільовий домен %s є доменом ретрансляції",
|
"targetd_relay_domain": "Цільовий домен %s є доменом ретрансляції",
|
||||||
|
@ -977,7 +977,7 @@
|
||||||
"deleted_syncjobs": "Завдання синхронізації видалені: %s",
|
"deleted_syncjobs": "Завдання синхронізації видалені: %s",
|
||||||
"domain_admin_added": "Адміністратора домену %s додано",
|
"domain_admin_added": "Адміністратора домену %s додано",
|
||||||
"domain_modified": "Зберегти зміни домену %s",
|
"domain_modified": "Зберегти зміни домену %s",
|
||||||
"f2b_modified": "Зміни параметрів Fail2ban збережено",
|
"netfilter_modified": "Зміни параметрів Netfilter збережено",
|
||||||
"global_filter_written": "Фільтр успішно записано у файл",
|
"global_filter_written": "Фільтр успішно записано у файл",
|
||||||
"items_deleted": "Елемент %s успішно видалено",
|
"items_deleted": "Елемент %s успішно видалено",
|
||||||
"license_modified": "Зміни у ліцензії збережені",
|
"license_modified": "Зміни у ліцензії збережені",
|
||||||
|
|
|
@ -176,17 +176,17 @@
|
||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"empty": "结果为空",
|
"empty": "结果为空",
|
||||||
"excludes": "除了",
|
"excludes": "除了",
|
||||||
"f2b_ban_time": "封禁时间 (秒)",
|
"netfilter_ban_time": "封禁时间 (秒)",
|
||||||
"f2b_blacklist": "网络/主机黑名单",
|
"netfilter_blacklist": "网络/主机黑名单",
|
||||||
"f2b_filter": "正则表达式过滤器",
|
"netfilter_filter": "正则表达式过滤器",
|
||||||
"f2b_list_info": "黑名单的优先级总是高于白名单。 <b>列表更新将会在几秒之后完成。</b>",
|
"netfilter_list_info": "黑名单的优先级总是高于白名单。 <b>列表更新将会在几秒之后完成。</b>",
|
||||||
"f2b_max_attempts": "最多尝试次数",
|
"netfilter_max_attempts": "最多尝试次数",
|
||||||
"f2b_netban_ipv4": "应用封禁的 IPv4 子网大小 (8-32)",
|
"netfilter_netban_ipv4": "应用封禁的 IPv4 子网大小 (8-32)",
|
||||||
"f2b_netban_ipv6": "应用封禁的 IPv6 子网大小 (8-128)",
|
"netfilter_netban_ipv6": "应用封禁的 IPv6 子网大小 (8-128)",
|
||||||
"f2b_parameters": "Fail2ban 参数",
|
"netfilter_parameters": "Netfilter 参数",
|
||||||
"f2b_regex_info": "将会过滤这些应用的日志: SOGo,Postfix,Dovecot 和 PHP-FPM。",
|
"netfilter_regex_info": "将会过滤这些应用的日志: SOGo,Postfix,Dovecot 和 PHP-FPM。",
|
||||||
"f2b_retry_window": "最多尝试次数重试窗口 (秒)",
|
"netfilter_retry_window": "最多尝试次数重试窗口 (秒)",
|
||||||
"f2b_whitelist": "网络/主机白名单",
|
"netfilter_whitelist": "网络/主机白名单",
|
||||||
"filter_table": "筛选表格",
|
"filter_table": "筛选表格",
|
||||||
"forwarding_hosts": "转发主机",
|
"forwarding_hosts": "转发主机",
|
||||||
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的网络、主机名 (解析为 IP 地址),或者邮箱域名 (查询 SPF 记录或 MX 记录并解析为 IP 地址)。",
|
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的网络、主机名 (解析为 IP 地址),或者邮箱域名 (查询 SPF 记录或 MX 记录并解析为 IP 地址)。",
|
||||||
|
@ -426,7 +426,7 @@
|
||||||
"redis_error": "Redis 错误: %s",
|
"redis_error": "Redis 错误: %s",
|
||||||
"relayhost_invalid": "中继主机条目 %s 已存在",
|
"relayhost_invalid": "中继主机条目 %s 已存在",
|
||||||
"release_send_failed": "消息不能被释放: %s",
|
"release_send_failed": "消息不能被释放: %s",
|
||||||
"reset_f2b_regex": "暂时不能重置正则表达式过滤器,请重试或在几秒后重载网页。",
|
"reset_netfilter_regex": "暂时不能重置正则表达式过滤器,请重试或在几秒后重载网页。",
|
||||||
"resource_invalid": "资源名称 %s 无效",
|
"resource_invalid": "资源名称 %s 无效",
|
||||||
"rl_timeframe": "频率限制时间设置错误",
|
"rl_timeframe": "频率限制时间设置错误",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI 密码至少为为6个字符",
|
"rspamd_ui_pw_length": "Rspamd UI 密码至少为为6个字符",
|
||||||
|
@ -947,7 +947,7 @@
|
||||||
"domain_removed": "已删除域名 %s",
|
"domain_removed": "已删除域名 %s",
|
||||||
"dovecot_restart_success": "Dovecot 重新启动成功",
|
"dovecot_restart_success": "Dovecot 重新启动成功",
|
||||||
"eas_reset": "已重置用户 %s 的 ActiveSync 设备",
|
"eas_reset": "已重置用户 %s 的 ActiveSync 设备",
|
||||||
"f2b_modified": "已保存 Fail2ban 参数的更改",
|
"netfilter_modified": "已保存 Netfilter 参数的更改",
|
||||||
"forwarding_host_added": "已添加转发主机 %s",
|
"forwarding_host_added": "已添加转发主机 %s",
|
||||||
"forwarding_host_removed": "已删除转发主机 %s",
|
"forwarding_host_removed": "已删除转发主机 %s",
|
||||||
"global_filter_written": "成功将过滤器写入到文件",
|
"global_filter_written": "成功将过滤器写入到文件",
|
||||||
|
|
|
@ -176,17 +176,17 @@
|
||||||
"edit": "編輯",
|
"edit": "編輯",
|
||||||
"empty": "沒有結果",
|
"empty": "沒有結果",
|
||||||
"excludes": "排除這些收件者",
|
"excludes": "排除這些收件者",
|
||||||
"f2b_ban_time": "封鎖時間 (秒)",
|
"netfilter_ban_time": "封鎖時間 (秒)",
|
||||||
"f2b_blacklist": "網路/主機黑名單",
|
"netfilter_blacklist": "網路/主機黑名單",
|
||||||
"f2b_filter": "正規表示式過濾器",
|
"netfilter_filter": "正規表示式過濾器",
|
||||||
"f2b_list_info": "黑名單優先於白名單。 <b>清單更新需要幾秒才能套用。</b>",
|
"netfilter_list_info": "黑名單優先於白名單。 <b>清單更新需要幾秒才能套用。</b>",
|
||||||
"f2b_max_attempts": "嘗試次數上限",
|
"netfilter_max_attempts": "嘗試次數上限",
|
||||||
"f2b_netban_ipv4": "封鎖的 IPv4 子網路大小 (8-32)",
|
"netfilter_netban_ipv4": "封鎖的 IPv4 子網路大小 (8-32)",
|
||||||
"f2b_netban_ipv6": "封鎖的 IPv6 子網路大小 (8-128)",
|
"netfilter_netban_ipv6": "封鎖的 IPv6 子網路大小 (8-128)",
|
||||||
"f2b_parameters": "Fail2ban 參數",
|
"netfilter_parameters": "Netfilter 參數",
|
||||||
"f2b_regex_info": "納入過濾參考的應用程式紀錄: SOGo、Postfix、Dovecot、PHP-FPM。",
|
"netfilter_regex_info": "納入過濾參考的應用程式紀錄: SOGo、Postfix、Dovecot、PHP-FPM。",
|
||||||
"f2b_retry_window": "重試次數的時間區間大小 (秒)",
|
"netfilter_retry_window": "重試次數的時間區間大小 (秒)",
|
||||||
"f2b_whitelist": "網路/主機白名單",
|
"netfilter_whitelist": "網路/主機白名單",
|
||||||
"filter_table": "篩選表格",
|
"filter_table": "篩選表格",
|
||||||
"forwarding_hosts": "轉發主機",
|
"forwarding_hosts": "轉發主機",
|
||||||
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的網路、主機名稱 (會被自動解析為 IP 地址),或者信箱域名 (會自動查詢 SPF 紀錄或 MX 紀錄並解析為 IP 地址)。",
|
"forwarding_hosts_add_hint": "你可以指定 IPv4/IPv6 地址、CIDR 表示的網路、主機名稱 (會被自動解析為 IP 地址),或者信箱域名 (會自動查詢 SPF 紀錄或 MX 紀錄並解析為 IP 地址)。",
|
||||||
|
@ -425,7 +425,7 @@
|
||||||
"redis_error": "Redis 錯誤: %s",
|
"redis_error": "Redis 錯誤: %s",
|
||||||
"relayhost_invalid": "無效的中繼主機規則 %s",
|
"relayhost_invalid": "無效的中繼主機規則 %s",
|
||||||
"release_send_failed": "郵件無法被釋放: %s",
|
"release_send_failed": "郵件無法被釋放: %s",
|
||||||
"reset_f2b_regex": "暫時無法重設正規表示式過濾器,請重試或在稍後重新載入網頁。",
|
"reset_netfilter_regex": "暫時無法重設正規表示式過濾器,請重試或在稍後重新載入網頁。",
|
||||||
"resource_invalid": "無效的資源名稱 %s",
|
"resource_invalid": "無效的資源名稱 %s",
|
||||||
"rl_timeframe": "速率限制間隔時間不正確",
|
"rl_timeframe": "速率限制間隔時間不正確",
|
||||||
"rspamd_ui_pw_length": "Rspamd UI 密碼至少要 6 個字元",
|
"rspamd_ui_pw_length": "Rspamd UI 密碼至少要 6 個字元",
|
||||||
|
@ -941,7 +941,7 @@
|
||||||
"domain_removed": "域名 %s 已刪除",
|
"domain_removed": "域名 %s 已刪除",
|
||||||
"dovecot_restart_success": "Dovecot 成功重新啟動",
|
"dovecot_restart_success": "Dovecot 成功重新啟動",
|
||||||
"eas_reset": "使用者 %s 的 ActiveSync 裝置已重設",
|
"eas_reset": "使用者 %s 的 ActiveSync 裝置已重設",
|
||||||
"f2b_modified": "Fail2ban 參數更改已儲存",
|
"netfilter_modified": "Netfilter 參數更改已儲存",
|
||||||
"forwarding_host_added": "轉發主機 %s 已新增",
|
"forwarding_host_added": "轉發主機 %s 已新增",
|
||||||
"forwarding_host_removed": "轉發主機 %s 已刪除",
|
"forwarding_host_removed": "轉發主機 %s 已刪除",
|
||||||
"global_filter_written": "過濾器已成功寫入到檔案",
|
"global_filter_written": "過濾器已成功寫入到檔案",
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<ul class="dropdown-menu">
|
<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-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-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-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-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>
|
<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-routing.twig' %}
|
||||||
{% include 'admin/tab-config-dkim.twig' %}
|
{% include 'admin/tab-config-dkim.twig' %}
|
||||||
{% include 'admin/tab-config-fwdhosts.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-quarantine.twig' %}
|
||||||
{% include 'admin/tab-config-quota.twig' %}
|
{% include 'admin/tab-config-quota.twig' %}
|
||||||
{% include 'admin/tab-config-rsettings.twig' %}
|
{% include 'admin/tab-config-rsettings.twig' %}
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div> <!-- /col-md-12 -->
|
</div> <!-- /col-md-12 -->
|
||||||
</div> <!-- /row -->
|
</div> <!-- /row -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% include 'modals/admin.twig' %}
|
{% 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">
|
<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 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-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>
|
</ul>
|
||||||
</li>
|
</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>
|
<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