Merge remote-tracking branch 'upstream/staging'

This commit is contained in:
Vicente 2023-03-09 23:13:50 +01:00
commit 37a173eb65
34 changed files with 281 additions and 210 deletions

View File

@ -12,7 +12,7 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Run the Action - name: Run the Action
uses: devops-infra/action-pull-request@v0.5.3 uses: devops-infra/action-pull-request@v0.5.5
with: with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }} github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}} title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}

View File

@ -1,4 +1,4 @@
FROM clamav/clamav:1.0_base FROM clamav/clamav:1.0.1-1_base
LABEL maintainer "André Peters <andre.peters@servercow.de>" LABEL maintainer "André Peters <andre.peters@servercow.de>"

View File

@ -21,6 +21,7 @@ RUN groupadd -g 5000 vmail \
&& touch /etc/default/locale \ && touch /etc/default/locale \
&& apt-get update \ && apt-get update \
&& apt-get -y --no-install-recommends install \ && apt-get -y --no-install-recommends install \
build-essential \
apt-transport-https \ apt-transport-https \
ca-certificates \ ca-certificates \
cpanminus \ cpanminus \
@ -61,6 +62,7 @@ RUN groupadd -g 5000 vmail \
libproc-processtable-perl \ libproc-processtable-perl \
libreadonly-perl \ libreadonly-perl \
libregexp-common-perl \ libregexp-common-perl \
libssl-dev \
libsys-meminfo-perl \ libsys-meminfo-perl \
libterm-readkey-perl \ libterm-readkey-perl \
libtest-deep-perl \ libtest-deep-perl \
@ -110,6 +112,8 @@ RUN groupadd -g 5000 vmail \
&& apt-get autoclean \ && apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& rm -rf /tmp/* /var/tmp/* /root/.cache/ && rm -rf /tmp/* /var/tmp/* /root/.cache/
# imapsync dependencies
RUN cpan Crypt::OpenSSL::PKCS12
COPY trim_logs.sh /usr/local/bin/trim_logs.sh COPY trim_logs.sh /usr/local/bin/trim_logs.sh
COPY clean_q_aged.sh /usr/local/bin/clean_q_aged.sh COPY clean_q_aged.sh /usr/local/bin/clean_q_aged.sh

View File

@ -8492,6 +8492,7 @@ sub xoauth2
require HTML::Entities ; require HTML::Entities ;
require JSON ; require JSON ;
require JSON::WebToken::Crypt::RSA ; require JSON::WebToken::Crypt::RSA ;
require Crypt::OpenSSL::PKCS12;
require Crypt::OpenSSL::RSA ; require Crypt::OpenSSL::RSA ;
require Encode::Byte ; require Encode::Byte ;
require IO::Socket::SSL ; require IO::Socket::SSL ;
@ -8532,8 +8533,9 @@ sub xoauth2
$sync->{ debug } and myprint( "Service account: $iss\nKey file: $keyfile\nKey password: $keypass\n"); $sync->{ debug } and myprint( "Service account: $iss\nKey file: $keyfile\nKey password: $keypass\n");
# Get private key from p12 file (would be better in perl...) # Get private key from p12 file
$key = `openssl pkcs12 -in "$keyfile" -nodes -nocerts -passin pass:$keypass -nomacver`; my $pkcs12 = Crypt::OpenSSL::PKCS12->new_from_file($keyfile);
$key = $pkcs12->private_key($keypass);
$sync->{ debug } and myprint( "Private key:\n$key\n"); $sync->{ debug } and myprint( "Private key:\n$key\n");
} }

View File

@ -876,22 +876,29 @@ def snat4(snat_target):
chain = iptc.Chain(table, 'POSTROUTING') chain = iptc.Chain(table, 'POSTROUTING')
table.autocommit = False table.autocommit = False
new_rule = get_snat4_rule() new_rule = get_snat4_rule()
if not chain.rules:
# if there are no rules in the chain, insert the new rule directly
logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}')
chain.insert_rule(new_rule)
else:
for position, rule in enumerate(chain.rules): for position, rule in enumerate(chain.rules):
match = all(( match = all((
new_rule.get_src() == rule.get_src(), new_rule.get_src() == rule.get_src(),
new_rule.get_dst() == rule.get_dst(), new_rule.get_dst() == rule.get_dst(),
new_rule.target.parameters == rule.target.parameters, new_rule.target.parameters == rule.target.parameters,
new_rule.target.name == rule.target.name new_rule.target.name == rule.target.name
)) ))
if position == 0: if position == 0:
if not match: if not match:
logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}') logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}')
chain.insert_rule(new_rule) chain.insert_rule(new_rule)
else: else:
if match: if match:
logInfo(f'Remove rule for source network {new_rule.src} to SNAT target {snat_target} from POSTROUTING chain at position {position}') logInfo(f'Remove rule for source network {new_rule.src} to SNAT target {snat_target} from POSTROUTING chain at position {position}')
chain.delete_rule(rule) chain.delete_rule(rule)
table.commit()
table.commit()
table.autocommit = True table.autocommit = True
else: else:
snat_rule("ip", snat_target) snat_rule("ip", snat_target)

View File

@ -12,7 +12,7 @@ ARG MEMCACHED_PECL_VERSION=3.2.0
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced # renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced
ARG REDIS_PECL_VERSION=5.3.7 ARG REDIS_PECL_VERSION=5.3.7
# renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced # renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced
ARG COMPOSER_VERSION=2.5.1 ARG COMPOSER_VERSION=2.5.4
RUN apk add -U --no-cache autoconf \ RUN apk add -U --no-cache autoconf \
aspell-dev \ aspell-dev \

View File

@ -8,7 +8,7 @@ VIRUS_FOUND {
} }
# Bad policy from free mail providers # Bad policy from free mail providers
FREEMAIL_POLICY_FAILURE { FREEMAIL_POLICY_FAILURE {
expression = "-g+:policies & !DMARC_POLICY_ALLOW & !MAILLIST & ( FREEMAIL_ENVFROM | FREEMAIL_FROM ) & !WHITELISTED_FWD_HOST"; expression = "FREEMAIL_FROM & !DMARC_POLICY_ALLOW & !MAILLIST& !WHITELISTED_FWD_HOST & -g+:policies";
score = 16.0; score = 16.0;
} }
# Applies to freemail with undisclosed recipients # Applies to freemail with undisclosed recipients

View File

@ -159,8 +159,8 @@ BAZAAR_ABUSE_CH {
} }
URLHAUS_ABUSE_CH { URLHAUS_ABUSE_CH {
type = "url"; type = "selector";
filter = "full"; selector = "urls";
map = "https://urlhaus.abuse.ch/downloads/text_online/"; map = "https://urlhaus.abuse.ch/downloads/text_online/";
score = 10.0; score = 10.0;
} }

View File

@ -62,7 +62,7 @@
SOGoFirstDayOfWeek = "1"; SOGoFirstDayOfWeek = "1";
SOGoSieveFolderEncoding = "UTF-8"; SOGoSieveFolderEncoding = "UTF-8";
SOGoPasswordChangeEnabled = YES; SOGoPasswordChangeEnabled = NO;
SOGoSentFolderName = "Sent"; SOGoSentFolderName = "Sent";
SOGoMailShowSubscribedFoldersOnly = NO; SOGoMailShowSubscribedFoldersOnly = NO;
NGImap4ConnectionStringSeparator = "/"; NGImap4ConnectionStringSeparator = "/";

View File

@ -3,7 +3,7 @@ function init_db_schema() {
try { try {
global $pdo; global $pdo;
$db_version = "06012023_1924"; $db_version = "14022023_1000";
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@ -225,22 +225,22 @@ function init_db_schema() {
), ),
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
), ),
"templates" => array( "templates" => array(
"cols" => array( "cols" => array(
"id" => "INT NOT NULL AUTO_INCREMENT", "id" => "INT NOT NULL AUTO_INCREMENT",
"template" => "VARCHAR(255) NOT NULL", "template" => "VARCHAR(255) NOT NULL",
"type" => "VARCHAR(255) NOT NULL", "type" => "VARCHAR(255) NOT NULL",
"attributes" => "JSON", "attributes" => "JSON",
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
"modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP" "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP"
), ),
"keys" => array( "keys" => array(
"primary" => array( "primary" => array(
"" => array("id") "" => array("id")
) )
), ),
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
), ),
"domain" => array( "domain" => array(
// Todo: Move some attributes to json // Todo: Move some attributes to json
"cols" => array( "cols" => array(
@ -1076,7 +1076,7 @@ function init_db_schema() {
} }
} }
// Migrate tls_enforce_* options // Migrate tls_enforce_* options
if ($table == 'mailbox') { if ($table == 'mailbox') {
$stmt = $pdo->query("SHOW TABLES LIKE 'mailbox'"); $stmt = $pdo->query("SHOW TABLES LIKE 'mailbox'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@ -1096,7 +1096,7 @@ function init_db_schema() {
$stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'"); $stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results != 0) { if ($num_results != 0) {
$stmt = $pdo->prepare("SELECT CONCAT('ALTER TABLE ', `table_schema`, '.', `table_name`, ' DROP FOREIGN KEY ', `constraint_name`, ';') AS `FKEY_DROP` FROM `information_schema`.`table_constraints` $stmt = $pdo->prepare("SELECT CONCAT('ALTER TABLE `', `table_schema`, '`.', `table_name`, ' DROP FOREIGN KEY ', `constraint_name`, ';') AS `FKEY_DROP` FROM `information_schema`.`table_constraints`
WHERE `constraint_type` = 'FOREIGN KEY' AND `table_name` = :table;"); WHERE `constraint_type` = 'FOREIGN KEY' AND `table_name` = :table;");
$stmt->execute(array(':table' => $table)); $stmt->execute(array(':table' => $table));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
@ -1322,95 +1322,95 @@ function init_db_schema() {
// Fix domain_admins // Fix domain_admins
$pdo->query("DELETE FROM `domain_admins` WHERE `domain` = 'ALL';"); $pdo->query("DELETE FROM `domain_admins` WHERE `domain` = 'ALL';");
// add default templates // add default templates
$default_domain_template = array( $default_domain_template = array(
"template" => "Default", "template" => "Default",
"type" => "domain", "type" => "domain",
"attributes" => array( "attributes" => array(
"tags" => array(), "tags" => array(),
"max_num_aliases_for_domain" => 400, "max_num_aliases_for_domain" => 400,
"max_num_mboxes_for_domain" => 10, "max_num_mboxes_for_domain" => 10,
"def_quota_for_mbox" => 3072 * 1048576, "def_quota_for_mbox" => 3072 * 1048576,
"max_quota_for_mbox" => 10240 * 1048576, "max_quota_for_mbox" => 10240 * 1048576,
"max_quota_for_domain" => 10240 * 1048576, "max_quota_for_domain" => 10240 * 1048576,
"rl_frame" => "s", "rl_frame" => "s",
"rl_value" => "", "rl_value" => "",
"active" => 1, "active" => 1,
"gal" => 1, "gal" => 1,
"backupmx" => 0, "backupmx" => 0,
"relay_all_recipients" => 0, "relay_all_recipients" => 0,
"relay_unknown_only" => 0, "relay_unknown_only" => 0,
"dkim_selector" => "dkim", "dkim_selector" => "dkim",
"key_size" => 2048, "key_size" => 2048,
"max_quota_for_domain" => 10240 * 1048576, "max_quota_for_domain" => 10240 * 1048576,
) )
); );
$default_mailbox_template = array( $default_mailbox_template = array(
"template" => "Default", "template" => "Default",
"type" => "mailbox", "type" => "mailbox",
"attributes" => array( "attributes" => array(
"tags" => array(), "tags" => array(),
"quota" => 0, "quota" => 0,
"quarantine_notification" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_notification']), "quarantine_notification" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_notification']),
"quarantine_category" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_category']), "quarantine_category" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_category']),
"rl_frame" => "s", "rl_frame" => "s",
"rl_value" => "", "rl_value" => "",
"force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']), "force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']),
"sogo_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_access']), "sogo_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_access']),
"active" => 1, "active" => 1,
"tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']), "tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']),
"tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']), "tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']),
"imap_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['imap_access']), "imap_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['imap_access']),
"pop3_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['pop3_access']), "pop3_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['pop3_access']),
"smtp_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['smtp_access']), "smtp_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['smtp_access']),
"sieve_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sieve_access']), "sieve_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sieve_access']),
"acl_spam_alias" => 1, "acl_spam_alias" => 1,
"acl_tls_policy" => 1, "acl_tls_policy" => 1,
"acl_spam_score" => 1, "acl_spam_score" => 1,
"acl_spam_policy" => 1, "acl_spam_policy" => 1,
"acl_delimiter_action" => 1, "acl_delimiter_action" => 1,
"acl_syncjobs" => 0, "acl_syncjobs" => 0,
"acl_eas_reset" => 1, "acl_eas_reset" => 1,
"acl_sogo_profile_reset" => 0, "acl_sogo_profile_reset" => 0,
"acl_pushover" => 1, "acl_pushover" => 1,
"acl_quarantine" => 1, "acl_quarantine" => 1,
"acl_quarantine_attachments" => 1, "acl_quarantine_attachments" => 1,
"acl_quarantine_notification" => 1, "acl_quarantine_notification" => 1,
"acl_quarantine_category" => 1, "acl_quarantine_category" => 1,
"acl_app_passwds" => 1, "acl_app_passwds" => 1,
) )
); );
$stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template");
$stmt->execute(array( $stmt->execute(array(
":type" => "domain", ":type" => "domain",
":template" => $default_domain_template["template"] ":template" => $default_domain_template["template"]
)); ));
$row = $stmt->fetch(PDO::FETCH_ASSOC); $row = $stmt->fetch(PDO::FETCH_ASSOC);
if (empty($row)){ if (empty($row)){
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
VALUES (:type, :template, :attributes)"); VALUES (:type, :template, :attributes)");
$stmt->execute(array( $stmt->execute(array(
":type" => "domain", ":type" => "domain",
":template" => $default_domain_template["template"], ":template" => $default_domain_template["template"],
":attributes" => json_encode($default_domain_template["attributes"]) ":attributes" => json_encode($default_domain_template["attributes"])
)); ));
} }
$stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template");
$stmt->execute(array( $stmt->execute(array(
":type" => "mailbox", ":type" => "mailbox",
":template" => $default_mailbox_template["template"] ":template" => $default_mailbox_template["template"]
)); ));
$row = $stmt->fetch(PDO::FETCH_ASSOC); $row = $stmt->fetch(PDO::FETCH_ASSOC);
if (empty($row)){ if (empty($row)){
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
VALUES (:type, :template, :attributes)"); VALUES (:type, :template, :attributes)");
$stmt->execute(array( $stmt->execute(array(
":type" => "mailbox", ":type" => "mailbox",
":template" => $default_mailbox_template["template"], ":template" => $default_mailbox_template["template"],
":attributes" => json_encode($default_mailbox_template["attributes"]) ":attributes" => json_encode($default_mailbox_template["attributes"])
)); ));
} }
if (php_sapi_name() == "cli") { if (php_sapi_name() == "cli") {
echo "DB initialization completed" . PHP_EOL; echo "DB initialization completed" . PHP_EOL;
} else { } else {

View File

@ -1181,7 +1181,7 @@ jQuery(function($){
if (table = $('#' + log_table).DataTable()) { if (table = $('#' + log_table).DataTable()) {
var heading = $('#' + log_table).closest('.card').find('.card-header'); var heading = $('#' + log_table).closest('.card').find('.card-header');
var load_rows = (table.page.len() + 1) + '-' + (table.page.len() + new_nrows) var load_rows = (table.data().length + 1) + '-' + (table.data().length + new_nrows)
$.get('/api/v1/get/logs/' + log_url + '/' + load_rows).then(function(data){ $.get('/api/v1/get/logs/' + log_url + '/' + load_rows).then(function(data){
if (data.length === undefined) { mailcow_alert_box(lang.no_new_rows, "info"); return; } if (data.length === undefined) { mailcow_alert_box(lang.no_new_rows, "info"); return; }

View File

@ -926,9 +926,12 @@ jQuery(function($){
'<a href="#" data-action="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' + '<a href="#" data-action="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
'</div>'; '</div>';
} }
item.in_use = '<div class="progress">' + item.in_use = {
sortBy: item.percent_in_use,
value: '<div class="progress">' +
'<div class="progress-bar-mailbox progress-bar progress-bar-' + item.percent_class + '" role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' + '<div class="progress-bar-mailbox progress-bar progress-bar-' + item.percent_class + '" role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>'; 'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>'
};
item.username = escapeHtml(item.username); item.username = escapeHtml(item.username);
if (Array.isArray(item.tags)){ if (Array.isArray(item.tags)){
@ -994,10 +997,11 @@ jQuery(function($){
}, },
{ {
title: lang.in_use, title: lang.in_use,
data: 'in_use', data: 'in_use.value',
defaultContent: '', defaultContent: '',
responsivePriority: 9, responsivePriority: 9,
className: 'dt-data-w100' className: 'dt-data-w100',
orderData: 24
}, },
{ {
title: lang.fname, title: lang.fname,
@ -1102,7 +1106,12 @@ jQuery(function($){
{ {
title: "", title: "",
data: 'quota.sortBy', data: 'quota.sortBy',
responsivePriority: 8, defaultContent: '',
className: "d-none"
},
{
title: "",
data: 'in_use.sortBy',
defaultContent: '', defaultContent: '',
className: "d-none" className: "d-none"
}, },

View File

@ -650,7 +650,7 @@
}, },
"login": { "login": {
"delayed": "Přihlášení zpožděno o %s sekund.", "delayed": "Přihlášení zpožděno o %s sekund.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Přihlásit", "login": "Přihlásit",
"mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.", "mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.",
"other_logins": "Přihlášení klíčem", "other_logins": "Přihlášení klíčem",

View File

@ -4,15 +4,15 @@
"app_passwds": "Administrer app-adgangskoder", "app_passwds": "Administrer app-adgangskoder",
"bcc_maps": "BCC kort", "bcc_maps": "BCC kort",
"delimiter_action": "Afgrænsning handling", "delimiter_action": "Afgrænsning handling",
"eas_reset": "Nulstil EAS endheder", "eas_reset": "Nulstil EAS enheder",
"extend_sender_acl": "Tillad at udvide afsenderens ACL med eksterne adresser", "extend_sender_acl": "Tillad at udvide afsenderens ACL med eksterne adresser",
"filters": "Filtre", "filters": "Filtre",
"login_as": "Login som mailboks bruger", "login_as": "Login som mailboks bruger",
"prohibited": "Forbudt af ACL", "prohibited": "Nægtet af ACL",
"protocol_access": "Ændre protokol adgang", "protocol_access": "Skift protokol adgang",
"pushover": "Pushover", "pushover": "Pushover",
"quarantine": "Karantæneaktioner", "quarantine": "Karantænehandlinger",
"quarantine_attachments": "Karantæne vedhæftede filer", "quarantine_attachments": "Karantænevedhæftede filer",
"quarantine_notification": "Skift karantænemeddelelser", "quarantine_notification": "Skift karantænemeddelelser",
"ratelimit": "Satsgrænse", "ratelimit": "Satsgrænse",
"recipient_maps": "Modtagerkort", "recipient_maps": "Modtagerkort",
@ -20,12 +20,15 @@
"sogo_access": "Tillad styring af SOGo-adgang", "sogo_access": "Tillad styring af SOGo-adgang",
"sogo_profile_reset": "Nulstil SOGo-profil", "sogo_profile_reset": "Nulstil SOGo-profil",
"spam_alias": "Midlertidige aliasser", "spam_alias": "Midlertidige aliasser",
"spam_policy": "Sortliste / hvidliste", "spam_policy": "Sortliste/hvidliste",
"spam_score": "Spam-score", "spam_score": "Spam-score",
"syncjobs": "Synkroniserings job", "syncjobs": "Synkroniserings job",
"tls_policy": "TLS politik", "tls_policy": "TLS politik",
"unlimited_quota": "Ubegrænset plads for mailbokse", "unlimited_quota": "Ubegrænset plads for mailbokse",
"domain_desc": "Skift domæne beskrivelse" "domain_desc": "Skift domæne beskrivelse",
"domain_relayhost": "Skift relæ host for et domæne",
"mailbox_relayhost": "Skift relæ-host for en postkasse",
"quarantine_category": "Skift kategorien for karantænemeddelelse"
}, },
"add": { "add": {
"activate_filter_warn": "Alle andre filtre deaktiveres, når aktiv er markeret.", "activate_filter_warn": "Alle andre filtre deaktiveres, når aktiv er markeret.",
@ -59,7 +62,7 @@
"gal": "Global adresseliste", "gal": "Global adresseliste",
"gal_info": "GAL indeholder alle objekter i et domæne og kan ikke redigeres af nogen bruger. Information om ledig / optaget i SOGo mangler, hvis deaktiveret! <b> Genstart SOGo for at anvende ændringer. </b>", "gal_info": "GAL indeholder alle objekter i et domæne og kan ikke redigeres af nogen bruger. Information om ledig / optaget i SOGo mangler, hvis deaktiveret! <b> Genstart SOGo for at anvende ændringer. </b>",
"generate": "generere", "generate": "generere",
"goto_ham": "Lær som <span class=\"text-success\"><b>ham</b></span>", "goto_ham": "Lær som <span class=\"text-success\"><b>ønsket</b></span>",
"goto_null": "Kassér e-mail i stilhed", "goto_null": "Kassér e-mail i stilhed",
"goto_spam": "Lær som <span class=\"text-danger\"><b>spam</b></span>", "goto_spam": "Lær som <span class=\"text-danger\"><b>spam</b></span>",
"hostname": "Vært", "hostname": "Vært",
@ -80,7 +83,7 @@
"private_comment": "Privat kommentar", "private_comment": "Privat kommentar",
"public_comment": "Offentlig kommentar", "public_comment": "Offentlig kommentar",
"quota_mb": "Kvota (Mb)", "quota_mb": "Kvota (Mb)",
"relay_all": "Send alle modtagere videre", "relay_all": "Besvar alle modtager",
"relay_all_info": "↪ Hvis du vælger <b> ikke </b> at videresende alle modtagere, skal du tilføje et (\"blind\") postkasse til hver enkelt modtager, der skal videresendes.", "relay_all_info": "↪ Hvis du vælger <b> ikke </b> at videresende alle modtagere, skal du tilføje et (\"blind\") postkasse til hver enkelt modtager, der skal videresendes.",
"relay_domain": "Send dette domæne videre", "relay_domain": "Send dette domæne videre",
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Du kan definere transportkort til en tilpasset destination for dette domæne. Hvis ikke indstillet, foretages der et MX-opslag.", "relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Du kan definere transportkort til en tilpasset destination for dette domæne. Hvis ikke indstillet, foretages der et MX-opslag.",
@ -101,7 +104,10 @@
"timeout2": "Timeout for forbindelse til lokal vært", "timeout2": "Timeout for forbindelse til lokal vært",
"username": "Brugernavn", "username": "Brugernavn",
"validate": "Bekræft", "validate": "Bekræft",
"validation_success": "Valideret med succes" "validation_success": "Valideret med succes",
"bcc_dest_format": "BCC-destination skal være en enkelt gyldig e-mail-adresse.<br>Hvis du har brug for at sende en kopi til flere adresser, kan du oprette et alias og bruge det her.",
"app_passwd_protocols": "Tilladte protokoller for app adgangskode",
"tags": "Tag's"
}, },
"admin": { "admin": {
"access": "Adgang", "access": "Adgang",
@ -308,7 +314,10 @@
"username": "Brugernavn", "username": "Brugernavn",
"validate_license_now": "Valider GUID mod licensserver", "validate_license_now": "Valider GUID mod licensserver",
"verify": "Verificere", "verify": "Verificere",
"yes": "&#10003;" "yes": "&#10003;",
"ip_check_opt_in": "Opt-In for brug af tredjepartstjeneste <strong>ipv4.mailcow.email</strong> og <strong>ipv6.mailcow.email</strong> til at finde eksterne IP-adresser.",
"queue_unban": "unban",
"admins": "Administratorer"
}, },
"danger": { "danger": {
"access_denied": "Adgang nægtet eller ugyldig formular data", "access_denied": "Adgang nægtet eller ugyldig formular data",
@ -425,7 +434,8 @@
"username_invalid": "Brugernavn %s kan ikke bruges", "username_invalid": "Brugernavn %s kan ikke bruges",
"validity_missing": "Tildel venligst en gyldighedsperiode", "validity_missing": "Tildel venligst en gyldighedsperiode",
"value_missing": "Angiv alle værdier", "value_missing": "Angiv alle værdier",
"yotp_verification_failed": "Yubico OTP verifikationen mislykkedes: %s" "yotp_verification_failed": "Yubico OTP verifikationen mislykkedes: %s",
"webauthn_publickey_failed": "Der er ikke gemt nogen offentlig nøgle for den valgte autentifikator"
}, },
"debug": { "debug": {
"chart_this_server": "Diagram (denne server)", "chart_this_server": "Diagram (denne server)",
@ -442,7 +452,8 @@
"solr_status": "Solr-status", "solr_status": "Solr-status",
"started_on": "Startede den", "started_on": "Startede den",
"static_logs": "Statiske logfiler", "static_logs": "Statiske logfiler",
"system_containers": "System og Beholdere" "system_containers": "System og Beholdere",
"error_show_ip": "Kunne ikke finde de offentlige IP-adresser"
}, },
"diagnostics": { "diagnostics": {
"cname_from_a": "Værdi afledt af A / AAAA-post. Dette understøttes, så længe posten peger på den korrekte ressource.", "cname_from_a": "Værdi afledt af A / AAAA-post. Dette understøttes, så længe posten peger på den korrekte ressource.",
@ -553,7 +564,11 @@
"title": "Rediger objekt", "title": "Rediger objekt",
"unchanged_if_empty": "Lad være tomt, hvis uændret", "unchanged_if_empty": "Lad være tomt, hvis uændret",
"username": "Brugernavn", "username": "Brugernavn",
"validate_save": "Valider og gem" "validate_save": "Valider og gem",
"admin": "Rediger administrator",
"lookup_mx": "Destination er et regulært udtryk, der matcher MX-navnet (<code>.*google\\.dk</code> for at dirigere al e-mail, der er målrettet til en MX, der ender på google.dk, over dette hop)",
"mailbox_relayhost_info": "Anvendt på postkassen og kun direkte aliasser, og overskriver et domæne relæ-host.",
"quota_warning_bcc": "Kvoteadvarsel BCC"
}, },
"footer": { "footer": {
"cancel": "Afbestille", "cancel": "Afbestille",
@ -571,7 +586,7 @@
"header": { "header": {
"administration": "Konfiguration og detailer", "administration": "Konfiguration og detailer",
"apps": "Apps", "apps": "Apps",
"debug": "Systemoplysninger", "debug": "Information",
"email": "E-Mail", "email": "E-Mail",
"mailcow_config": "Konfiguration", "mailcow_config": "Konfiguration",
"quarantine": "Karantæne", "quarantine": "Karantæne",
@ -586,7 +601,7 @@
}, },
"login": { "login": {
"delayed": "Login blev forsinket med% s sekunder.", "delayed": "Login blev forsinket med% s sekunder.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Login", "login": "Login",
"mobileconfig_info": "Log ind som postkassebruger for at downloade den anmodede Apple-forbindelsesprofil.", "mobileconfig_info": "Log ind som postkassebruger for at downloade den anmodede Apple-forbindelsesprofil.",
"other_logins": "Nøgle login", "other_logins": "Nøgle login",
@ -739,7 +754,10 @@
"username": "Brugernavn", "username": "Brugernavn",
"waiting": "Venter", "waiting": "Venter",
"weekly": "Ugentlig", "weekly": "Ugentlig",
"yes": "&#10003;" "yes": "&#10003;",
"goto_ham": "Lær som <b>ønsket</b>",
"catch_all": "Fang-alt",
"open_logs": "Åben logfiler"
}, },
"oauth2": { "oauth2": {
"access_denied": "Log ind som mailboks ejer for at give adgang via OAuth2.", "access_denied": "Log ind som mailboks ejer for at give adgang via OAuth2.",
@ -1066,5 +1084,11 @@
"quota_exceeded_scope": "Domænekvote overskredet: Kun ubegrænsede postkasser kan oprettes i dette domæneomfang.", "quota_exceeded_scope": "Domænekvote overskredet: Kun ubegrænsede postkasser kan oprettes i dette domæneomfang.",
"session_token": "Form nøgle ugyldig: Nøgle passer ikke", "session_token": "Form nøgle ugyldig: Nøgle passer ikke",
"session_ua": "Form nøgle ugyldig: Bruger-Agent gyldighedskontrols fejl" "session_ua": "Form nøgle ugyldig: Bruger-Agent gyldighedskontrols fejl"
},
"datatables": {
"lengthMenu": "Vis _MENU_ poster",
"paginate": {
"first": "Først"
}
} }
} }

View File

@ -710,7 +710,7 @@
}, },
"login": { "login": {
"delayed": "Login wurde zur Sicherheit um %s Sekunde/n verzögert.", "delayed": "Login wurde zur Sicherheit um %s Sekunde/n verzögert.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Anmelden", "login": "Anmelden",
"mobileconfig_info": "Bitte als Mailbox-Benutzer einloggen, um das Verbindungsprofil herunterzuladen.", "mobileconfig_info": "Bitte als Mailbox-Benutzer einloggen, um das Verbindungsprofil herunterzuladen.",
"other_logins": "Key Login", "other_logins": "Key Login",

View File

@ -710,7 +710,7 @@
}, },
"login": { "login": {
"delayed": "Login was delayed by %s seconds.", "delayed": "Login was delayed by %s seconds.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Login", "login": "Login",
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.", "mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
"other_logins": "Key login", "other_logins": "Key login",

View File

@ -321,7 +321,9 @@
"admins": "Administrateurs", "admins": "Administrateurs",
"api_read_only": "Accès lecture-seule", "api_read_only": "Accès lecture-seule",
"password_policy_lowerupper": "Doit contenir des caractères minuscules et majuscules", "password_policy_lowerupper": "Doit contenir des caractères minuscules et majuscules",
"password_policy_numbers": "Doit contenir au moins un chiffre" "password_policy_numbers": "Doit contenir au moins un chiffre",
"ip_check": "Vérification IP",
"ip_check_disabled": "La vérification IP est désactivée. Vous pouvez l'activer sous<br> <strong>Système > Configuration > Options > Personnaliser</strong>"
}, },
"danger": { "danger": {
"access_denied": "Accès refusé ou données de formulaire non valides", "access_denied": "Accès refusé ou données de formulaire non valides",
@ -440,7 +442,12 @@
"username_invalid": "Le nom d'utilisateur %s ne peut pas être utilisé", "username_invalid": "Le nom d'utilisateur %s ne peut pas être utilisé",
"validity_missing": "Veuillez attribuer une période de validité", "validity_missing": "Veuillez attribuer une période de validité",
"value_missing": "Veuillez fournir toutes les valeurs", "value_missing": "Veuillez fournir toutes les valeurs",
"yotp_verification_failed": "La vérification Yubico OTP a échoué : %s" "yotp_verification_failed": "La vérification Yubico OTP a échoué : %s",
"webauthn_authenticator_failed": "L'authentificateur selectionné est introuvable",
"demo_mode_enabled": "Le mode de démonstration est activé",
"template_exists": "La template %s existe déja",
"template_id_invalid": "Le numéro de template %s est invalide",
"template_name_invalid": "Le nom de la template est invalide"
}, },
"debug": { "debug": {
"chart_this_server": "Graphique (ce serveur)", "chart_this_server": "Graphique (ce serveur)",
@ -612,7 +619,7 @@
}, },
"login": { "login": {
"delayed": "La connexion a été retardée de %s secondes.", "delayed": "La connexion a été retardée de %s secondes.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Connexion", "login": "Connexion",
"mobileconfig_info": "Veuillez vous connecter en tant quutilisateur de la boîte pour télécharger le profil de connexion Apple demandé.", "mobileconfig_info": "Veuillez vous connecter en tant quutilisateur de la boîte pour télécharger le profil de connexion Apple demandé.",
"other_logins": "Clé d'authentification", "other_logins": "Clé d'authentification",

View File

@ -674,7 +674,7 @@
}, },
"login": { "login": {
"delayed": "L'accesso è stato ritardato di %s secondi.", "delayed": "L'accesso è stato ritardato di %s secondi.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Login", "login": "Login",
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.", "mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
"other_logins": "Key login", "other_logins": "Key login",

View File

@ -3,7 +3,8 @@
"bcc_maps": "BCC kartes", "bcc_maps": "BCC kartes",
"filters": "Filtri", "filters": "Filtri",
"recipient_maps": "Saņēmēja kartes", "recipient_maps": "Saņēmēja kartes",
"syncjobs": "Sinhronizācijas uzdevumi" "syncjobs": "Sinhronizācijas uzdevumi",
"spam_score": "Mēstules novērtējums"
}, },
"add": { "add": {
"activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.", "activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.",
@ -104,10 +105,10 @@
"host": "Hosts", "host": "Hosts",
"import": "Importēt", "import": "Importēt",
"import_private_key": "Importēt privātu atslēgu", "import_private_key": "Importēt privātu atslēgu",
"in_use_by": "Tiek lietots ar", "in_use_by": "Izmanto",
"inactive": "Neaktīvs", "inactive": "Neaktīvs",
"link": "Saite", "link": "Saite",
"loading": "Lūdzu uzgaidiet...", "loading": "Lūgums uzgaidīt...",
"logo_info": "Jūsu attēls augšējā navigācijas joslā tiks palielināts līdz 40 pikseļiem un maks. sākumlapas platums par 250 pikseļi. Ir ļoti ieteicama pielāgojama grafikaYour image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. Ir ļoti ieteicama pielāgojamā grafika", "logo_info": "Jūsu attēls augšējā navigācijas joslā tiks palielināts līdz 40 pikseļiem un maks. sākumlapas platums par 250 pikseļi. Ir ļoti ieteicama pielāgojama grafikaYour image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. Ir ļoti ieteicama pielāgojamā grafika",
"main_name": "\"mailcow UI\" nosaukums", "main_name": "\"mailcow UI\" nosaukums",
"merged_vars_hint": "Pelēkās rindas tika apvienotas <code>vars.(local.)inc.php</code> un nevar tikt modificētas.", "merged_vars_hint": "Pelēkās rindas tika apvienotas <code>vars.(local.)inc.php</code> un nevar tikt modificētas.",
@ -144,7 +145,10 @@
"ui_texts": "UI etiķetes un teksti", "ui_texts": "UI etiķetes un teksti",
"unchanged_if_empty": "Ja nav veiktas izmaiņas, atstājiet tukšu", "unchanged_if_empty": "Ja nav veiktas izmaiņas, atstājiet tukšu",
"upload": "Augšupielādēt", "upload": "Augšupielādēt",
"username": "Lietotājvārds" "username": "Lietotājvārds",
"generate": "izveidot",
"message": "Ziņojums",
"last_applied": "Pēdējoreiz pielietots"
}, },
"danger": { "danger": {
"access_denied": "Piekļuve liegta, vai nepareizi dati", "access_denied": "Piekļuve liegta, vai nepareizi dati",
@ -170,7 +174,7 @@
"is_alias": "%s jau ir zināms alias", "is_alias": "%s jau ir zināms alias",
"is_alias_or_mailbox": "%s jau ir zināms alias, pastkastes vai alias addrese izvērsta no alias domēna.", "is_alias_or_mailbox": "%s jau ir zināms alias, pastkastes vai alias addrese izvērsta no alias domēna.",
"is_spam_alias": "%s ir jau zināms spam alias", "is_spam_alias": "%s ir jau zināms spam alias",
"last_key": "Pēdējā atslēga nevar būt dzēsta", "last_key": "Pēdējo atslēgu nevar izdzēst, tā vietā jāatspējo divpakāpju pārbaude.",
"login_failed": "Ielogošanās neveiksmīga", "login_failed": "Ielogošanās neveiksmīga",
"mailbox_invalid": "Pastkastes vārds ir nederīgs", "mailbox_invalid": "Pastkastes vārds ir nederīgs",
"mailbox_quota_exceeded": "Kvota pārsniedz domēna limitu (max. %d MiB)", "mailbox_quota_exceeded": "Kvota pārsniedz domēna limitu (max. %d MiB)",
@ -262,7 +266,8 @@
"title": "Labot priekšmetu", "title": "Labot priekšmetu",
"unchanged_if_empty": "Ja neizmainīts atstājiet tukšu", "unchanged_if_empty": "Ja neizmainīts atstājiet tukšu",
"username": "Lietotājvārds", "username": "Lietotājvārds",
"validate_save": "Apstiprināt un saglabāt" "validate_save": "Apstiprināt un saglabāt",
"last_modified": "Pēdējoreiz mainīts"
}, },
"footer": { "footer": {
"cancel": "Atcelt", "cancel": "Atcelt",
@ -314,21 +319,21 @@
"bcc_destinations": "BCC galamērķi/s", "bcc_destinations": "BCC galamērķi/s",
"bcc_info": "BCC kartes tiek izmantotas, lai klusu pārsūtītu visu ziņojumu kopijas uz citu adresi. Saņēmēja kartes tipa ieraksts tiek izmantots, kad vietējais galamērķis darbojas kā pasta adresāts. Sūtītāja kartes atbilst vienam un tam pašam principam. <br/>\r\n   Vietējais galamērķis netiks informēts par piegādes neveiksmi. ", "bcc_info": "BCC kartes tiek izmantotas, lai klusu pārsūtītu visu ziņojumu kopijas uz citu adresi. Saņēmēja kartes tipa ieraksts tiek izmantots, kad vietējais galamērķis darbojas kā pasta adresāts. Sūtītāja kartes atbilst vienam un tam pašam principam. <br/>\r\n   Vietējais galamērķis netiks informēts par piegādes neveiksmi. ",
"bcc_local_dest": "Vietējais galamērķis", "bcc_local_dest": "Vietējais galamērķis",
"bcc_map_type": "BCC tips", "bcc_map_type": "BCC veids",
"bcc_maps": "BCC kartes", "bcc_maps": "BCC kartes",
"bcc_rcpt_map": "saņēmēja karte", "bcc_rcpt_map": "saņēmēja karte",
"bcc_sender_map": "Sūtītāja karte", "bcc_sender_map": "Sūtītāja karte",
"bcc_to_rcpt": "Pārslēdzieties uz adresāta kartes tipu", "bcc_to_rcpt": "Pārslēdzieties uz adresāta kartes tipu",
"bcc_to_sender": "Pārslēgties uz sūtītāja kartes tipu", "bcc_to_sender": "Pārslēgties uz sūtītāja kartes tipu",
"bcc_type": "BCC tips", "bcc_type": "BCC tips",
"deactivate": "Deaktivizēt", "deactivate": "Deaktivēt",
"description": "Apraksts", "description": "Apraksts",
"dkim_key_length": "DKIM atslēgas garums (bits)", "dkim_key_length": "DKIM atslēgas garums (bits)",
"domain": "Domēns", "domain": "Domēns",
"domain_admins": "Domēna administratori", "domain_admins": "Domēna administratori",
"domain_aliases": "Domēna aliases", "domain_aliases": "Domēna aliases",
"domain_quota": "Kvota", "domain_quota": "Kvota",
"domain_quota_total": "Kopējā domēna kvota", "domain_quota_total": "Kopējais domēna ierobežojums",
"domains": "Domēns", "domains": "Domēns",
"edit": "Labot", "edit": "Labot",
"empty": "Nav rezultātu", "empty": "Nav rezultātu",
@ -341,7 +346,7 @@
"inactive": "Neaktīvs", "inactive": "Neaktīvs",
"kind": "Veids", "kind": "Veids",
"last_run": "Pēdējā norise", "last_run": "Pēdējā norise",
"last_run_reset": "Nākamais grafiks", "last_run_reset": "Ievietot sarakstā kā nākamo",
"mailbox_quota": "Maks. pastkastes izmērs", "mailbox_quota": "Maks. pastkastes izmērs",
"mailboxes": "Pastkaste", "mailboxes": "Pastkaste",
"max_aliases": "Maks. iespejamās aliases", "max_aliases": "Maks. iespejamās aliases",
@ -374,7 +379,13 @@
"tls_enforce_out": "Piespiest TLS izejošajiem", "tls_enforce_out": "Piespiest TLS izejošajiem",
"toggle_all": "Pārslēgt visu", "toggle_all": "Pārslēgt visu",
"username": "Lietotājvārds", "username": "Lietotājvārds",
"waiting": "Gaidīšana" "waiting": "Gaidīšana",
"last_modified": "Pēdējoreiz mainīts",
"booking_0_short": "Vienmēŗ bezmaksas",
"daily": "Ik dienu",
"hourly": "Ik stundu",
"last_mail_login": "Pēdējā pieteikšanās pastkastē",
"mailbox": "Pastkaste"
}, },
"quarantine": { "quarantine": {
"action": "Darbības", "action": "Darbības",
@ -547,5 +558,14 @@
"waiting": "Waiting", "waiting": "Waiting",
"week": "Nedēļa", "week": "Nedēļa",
"weeks": "Nedēļas" "weeks": "Nedēļas"
},
"datatables": {
"paginate": {
"first": "Pirmā",
"last": "Pēdējā"
}
},
"debug": {
"last_modified": "Pēdējoreiz mainīts"
} }
} }

View File

@ -598,7 +598,7 @@
}, },
"login": { "login": {
"delayed": "Aanmelding vertraagd met %s seconden.", "delayed": "Aanmelding vertraagd met %s seconden.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Aanmelden", "login": "Aanmelden",
"mobileconfig_info": "Log in als mailboxgebruiker om het Apple-verbindingsprofiel te downloaden.", "mobileconfig_info": "Log in als mailboxgebruiker om het Apple-verbindingsprofiel te downloaden.",
"other_logins": "Meld aan met key", "other_logins": "Meld aan met key",

View File

@ -1,7 +1,8 @@
{ {
"acl": { "acl": {
"sogo_profile_reset": "Usuń profil SOGo (webmail)", "sogo_profile_reset": "Usuń profil SOGo (webmail)",
"syncjobs": "Polecenie synchronizacji" "syncjobs": "Polecenie synchronizacji",
"alias_domains": "Dodaj aliasy domen"
}, },
"add": { "add": {
"active": "Aktywny", "active": "Aktywny",

View File

@ -656,7 +656,7 @@
}, },
"login": { "login": {
"delayed": "Conectarea a fost întârziată cu %s secunde.", "delayed": "Conectarea a fost întârziată cu %s secunde.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Autentificare", "login": "Autentificare",
"mobileconfig_info": "Autentificați-vă cu adresa de email pentru a descărca profilul de conexiune Apple.", "mobileconfig_info": "Autentificați-vă cu adresa de email pentru a descărca profilul de conexiune Apple.",
"other_logins": "Autentificare cu cheie", "other_logins": "Autentificare cu cheie",

View File

@ -37,7 +37,7 @@
"add_domain_only": "Только добавить домен", "add_domain_only": "Только добавить домен",
"add_domain_restart": "Добавить домен и перезапустить SOGo", "add_domain_restart": "Добавить домен и перезапустить SOGo",
"alias_address": "Псевдоним/ы", "alias_address": "Псевдоним/ы",
"alias_address_info": "<small>Укажите почтовые адреса разделенные запятыми или, если хотите пересылать все сообщения для домена владельцам псевдонима то: <code>@example.com</code>. <b>Только домены mailcow разрешены</b>.</small>", "alias_address_info": "<small>Адрес(а) электронной почты (через запятую) или @example.com (для перехвата всех писем для домена). <b>только домены mailcow</b>.</small>",
"alias_domain": "Псевдоним домена", "alias_domain": "Псевдоним домена",
"alias_domain_info": "<small>Действительные имена доменов, раздёленные запятыми.</small>", "alias_domain_info": "<small>Действительные имена доменов, раздёленные запятыми.</small>",
"app_name": "Название приложения", "app_name": "Название приложения",
@ -335,7 +335,8 @@
"username": "Имя пользователя", "username": "Имя пользователя",
"validate_license_now": "Получить лицензию на основе GUID с сервера лицензий", "validate_license_now": "Получить лицензию на основе GUID с сервера лицензий",
"verify": "Проверить", "verify": "Проверить",
"yes": "&#10003;" "yes": "&#10003;",
"queue_unban": "разблокировать"
}, },
"danger": { "danger": {
"access_denied": "Доступ запрещён, или указаны неверные данные", "access_denied": "Доступ запрещён, или указаны неверные данные",
@ -654,7 +655,7 @@
}, },
"login": { "login": {
"delayed": "Вход был отложен на %s секунд.", "delayed": "Вход был отложен на %s секунд.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Войти", "login": "Войти",
"mobileconfig_info": "Пожалуйста, войдите в систему как пользователь почтового аккаунта для загрузки профиля подключения Apple.", "mobileconfig_info": "Пожалуйста, войдите в систему как пользователь почтового аккаунта для загрузки профиля подключения Apple.",
"other_logins": "Вход с помощью ключа", "other_logins": "Вход с помощью ключа",

View File

@ -657,7 +657,7 @@
}, },
"login": { "login": {
"delayed": "Prihlásenie bolo oneskorené o %s sekúnd.", "delayed": "Prihlásenie bolo oneskorené o %s sekúnd.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Prihlásenie", "login": "Prihlásenie",
"mobileconfig_info": "Prosím, prihláste sa ako mailový používateľ pre stiahnutie požadovaného Apple profilu.", "mobileconfig_info": "Prosím, prihláste sa ako mailový používateľ pre stiahnutie požadovaného Apple profilu.",
"other_logins": "Prihlásenie kľúčom", "other_logins": "Prihlásenie kľúčom",

View File

@ -618,7 +618,7 @@
}, },
"login": { "login": {
"delayed": "Av säkerhetsskäl har inloggning inaktiverats i %s sekunder.", "delayed": "Av säkerhetsskäl har inloggning inaktiverats i %s sekunder.",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Logga in", "login": "Logga in",
"mobileconfig_info": "Logga in som en användare av brevlåda för att ladda ner den begärda Apple-anslutningsprofilen.", "mobileconfig_info": "Logga in som en användare av brevlåda för att ladda ner den begärda Apple-anslutningsprofilen.",
"other_logins": "Loggain med nyckel", "other_logins": "Loggain med nyckel",

View File

@ -656,7 +656,7 @@
"awaiting_tfa_confirmation": "В очікуванні підтвердження TFA" "awaiting_tfa_confirmation": "В очікуванні підтвердження TFA"
}, },
"login": { "login": {
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "Увійти", "login": "Увійти",
"other_logins": "Вхід за допомогою ключа", "other_logins": "Вхід за допомогою ключа",
"password": "Пароль", "password": "Пароль",

View File

@ -661,7 +661,7 @@
}, },
"login": { "login": {
"delayed": "请在 %s 秒后重新登录。", "delayed": "请在 %s 秒后重新登录。",
"fido2_webauthn": "使用 FIDO2/WebAuthn 登录", "fido2_webauthn": "使用 FIDO2/WebAuthn Login 登录",
"login": "登录", "login": "登录",
"mobileconfig_info": "请使用邮箱用户登录以下载 Apple 连接描述文件。", "mobileconfig_info": "请使用邮箱用户登录以下载 Apple 连接描述文件。",
"other_logins": "Key 登录", "other_logins": "Key 登录",

View File

@ -655,7 +655,7 @@
}, },
"login": { "login": {
"delayed": "請在 %s 秒後重新登入。", "delayed": "請在 %s 秒後重新登入。",
"fido2_webauthn": "FIDO2/WebAuthn", "fido2_webauthn": "FIDO2/WebAuthn Login",
"login": "登入", "login": "登入",
"mobileconfig_info": "請使用信箱使用者登入以下載 Apple 連接描述檔案。", "mobileconfig_info": "請使用信箱使用者登入以下載 Apple 連接描述檔案。",
"other_logins": "金鑰登入", "other_logins": "金鑰登入",

View File

@ -612,7 +612,7 @@
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li> <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li>
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li> <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul> </ul>
<p class="text-muted">{{ lang.admin.hash_remove_info }}</p> <p class="text-muted">{{ lang.admin.hash_remove_info|raw }}</p>
<table id="rl_log" class="table table-striped dt-responsive w-100"></table> <table id="rl_log" class="table table-striped dt-responsive w-100"></table>
</div> </div>
</div> </div>

View File

@ -38,15 +38,8 @@
</div> </div>
</div> </div>
<div class="d-flex mt-4" style="position: relative"> <div class="d-flex mt-4" style="position: relative">
<div class="btn-group"> <button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
<div class="btn-group"> <button type="button" class="btn btn-xs-lg btn-success ms-2" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</button>
<button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
<button type="button" class="btn btn-xs-lg btn-success dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</a></li>
</ul>
</div>
</div>
{% if not oauth2_request %} {% if not oauth2_request %}
<button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="flag-icon flag-icon-{{ mailcow_locale[-2:] }}"></span> <span class="flag-icon flag-icon-{{ mailcow_locale[-2:] }}"></span>

View File

@ -19,7 +19,7 @@
</li> </li>
<li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-resources" role="tab" data-bs-toggle="tab" data-bs-target="#tab-resources">{{ lang.mailbox.resources }}</button></li> <li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-resources" role="tab" data-bs-toggle="tab" data-bs-target="#tab-resources">{{ lang.mailbox.resources }}</button></li>
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" data-bs-target="#">{{ lang.mailbox.aliases }}</a> <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.aliases }}</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-mbox-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mbox-aliases">{{ lang.mailbox.aliases }}</button></li> <li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-mbox-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mbox-aliases">{{ lang.mailbox.aliases }}</button></li>
<li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-domain-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domain-aliases">{{ lang.mailbox.domain_aliases }}</button></li> <li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-domain-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domain-aliases">{{ lang.mailbox.domain_aliases }}</button></li>

View File

@ -58,7 +58,7 @@ services:
- redis - redis
clamd-mailcow: clamd-mailcow:
image: mailcow/clamd:1.60 image: mailcow/clamd:1.61
restart: always restart: always
depends_on: depends_on:
- unbound-mailcow - unbound-mailcow
@ -191,7 +191,7 @@ services:
volumes: volumes:
- ./data/hooks/sogo:/hooks:Z - ./data/hooks/sogo:/hooks:Z
- ./data/conf/sogo/:/etc/sogo/:z - ./data/conf/sogo/:/etc/sogo/:z
- ./data/web/inc/init_db.inc.php:/init_db.inc.php:Z - ./data/web/inc/init_db.inc.php:/init_db.inc.php:z
- ./data/conf/sogo/custom-favicon.ico:/usr/lib/GNUstep/SOGo/WebServerResources/img/sogo.ico:z - ./data/conf/sogo/custom-favicon.ico:/usr/lib/GNUstep/SOGo/WebServerResources/img/sogo.ico:z
- ./data/conf/sogo/custom-theme.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/theme.js:z - ./data/conf/sogo/custom-theme.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/theme.js:z
- ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z - ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z
@ -216,7 +216,7 @@ services:
- sogo - sogo
dovecot-mailcow: dovecot-mailcow:
image: mailcow/dovecot:1.22 image: mailcow/dovecot:1.23
depends_on: depends_on:
- mysql-mailcow - mysql-mailcow
dns: dns:
@ -425,7 +425,7 @@ services:
- acme - acme
netfilter-mailcow: netfilter-mailcow:
image: mailcow/netfilter:1.50 image: mailcow/netfilter:1.51
stop_grace_period: 30s stop_grace_period: 30s
depends_on: depends_on:
- dovecot-mailcow - dovecot-mailcow

15
helper-scripts/expiry-dates.sh Normal file → Executable file
View File

@ -3,10 +3,11 @@
[[ -f mailcow.conf ]] && source mailcow.conf [[ -f mailcow.conf ]] && source mailcow.conf
[[ -f ../mailcow.conf ]] && source ../mailcow.conf [[ -f ../mailcow.conf ]] && source ../mailcow.conf
POSTFIX=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:25 -starttls smtp 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2) POSTFIX=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:${SMTP_PORT} -starttls smtp 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2)
DOVECOT=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:143 -starttls imap 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2) DOVECOT=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:${IMAP_PORT} -starttls imap 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2)
NGINX=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2) NGINX=$(echo | openssl s_client -connect ${MAILCOW_HOSTNAME}:${HTTPS_PORT} 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2)
echo TLS expiry dates:
echo Postfix: ${POSTFIX} echo "TLS expiry dates:"
echo Dovecot: ${DOVECOT} echo "Postfix: ${POSTFIX}"
echo Nginx: ${NGINX} echo "Dovecot: ${DOVECOT}"
echo "Nginx: ${NGINX}"

View File

@ -1,10 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$ # renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$
NEXTCLOUD_VERSION=25.0.3 NEXTCLOUD_VERSION=25.0.4
for bin in curl dirmngr; do echo -ne "Checking prerequisites..."
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi sleep 1
for bin in curl dirmngr tar bzip2; do
if [[ -z $(which ${bin}) ]]; then echo -ne "\r\033[31mCannot find ${bin}, exiting...\033[0m\n"; exit 1; fi
done done
echo -ne "\r\033[32mFound all prerequisites! Continuing...\033[0m\n"
[[ -z ${1} ]] && NC_HELP=y [[ -z ${1} ]] && NC_HELP=y
@ -215,5 +218,4 @@ elif [[ ${NC_RESETPW} == "y" ]]; then
read -p "Enter the username: " NC_USER read -p "Enter the username: " NC_USER
done done
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ user:resetpassword ${NC_USER} docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ user:resetpassword ${NC_USER}
fi fi