diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml index 54dbda34..57aac781 100644 --- a/.github/workflows/pr_to_nightly.yml +++ b/.github/workflows/pr_to_nightly.yml @@ -12,7 +12,7 @@ jobs: with: fetch-depth: 0 - name: Run the Action - uses: devops-infra/action-pull-request@v0.5.3 + uses: devops-infra/action-pull-request@v0.5.5 with: github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }} title: Automatic PR to nightly from ${{ github.event.repository.updated_at}} diff --git a/data/Dockerfiles/clamd/Dockerfile b/data/Dockerfiles/clamd/Dockerfile index 91716b84..f381e0ef 100644 --- a/data/Dockerfiles/clamd/Dockerfile +++ b/data/Dockerfiles/clamd/Dockerfile @@ -1,4 +1,4 @@ -FROM clamav/clamav:1.0_base +FROM clamav/clamav:1.0.1-1_base LABEL maintainer "André Peters " diff --git a/data/Dockerfiles/dovecot/Dockerfile b/data/Dockerfiles/dovecot/Dockerfile index 1d8e1e5b..ae7984e3 100644 --- a/data/Dockerfiles/dovecot/Dockerfile +++ b/data/Dockerfiles/dovecot/Dockerfile @@ -21,6 +21,7 @@ RUN groupadd -g 5000 vmail \ && touch /etc/default/locale \ && apt-get update \ && apt-get -y --no-install-recommends install \ + build-essential \ apt-transport-https \ ca-certificates \ cpanminus \ @@ -61,6 +62,7 @@ RUN groupadd -g 5000 vmail \ libproc-processtable-perl \ libreadonly-perl \ libregexp-common-perl \ + libssl-dev \ libsys-meminfo-perl \ libterm-readkey-perl \ libtest-deep-perl \ @@ -110,6 +112,8 @@ RUN groupadd -g 5000 vmail \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* \ && 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 clean_q_aged.sh /usr/local/bin/clean_q_aged.sh diff --git a/data/Dockerfiles/dovecot/imapsync b/data/Dockerfiles/dovecot/imapsync index 0d34504e..de63d658 100755 --- a/data/Dockerfiles/dovecot/imapsync +++ b/data/Dockerfiles/dovecot/imapsync @@ -8492,6 +8492,7 @@ sub xoauth2 require HTML::Entities ; require JSON ; require JSON::WebToken::Crypt::RSA ; + require Crypt::OpenSSL::PKCS12; require Crypt::OpenSSL::RSA ; require Encode::Byte ; require IO::Socket::SSL ; @@ -8532,8 +8533,9 @@ sub xoauth2 $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...) - $key = `openssl pkcs12 -in "$keyfile" -nodes -nocerts -passin pass:$keypass -nomacver`; + # Get private key from p12 file + my $pkcs12 = Crypt::OpenSSL::PKCS12->new_from_file($keyfile); + $key = $pkcs12->private_key($keypass); $sync->{ debug } and myprint( "Private key:\n$key\n"); } diff --git a/data/Dockerfiles/netfilter/server.py b/data/Dockerfiles/netfilter/server.py index e4713244..5689471d 100644 --- a/data/Dockerfiles/netfilter/server.py +++ b/data/Dockerfiles/netfilter/server.py @@ -876,22 +876,29 @@ def snat4(snat_target): chain = iptc.Chain(table, 'POSTROUTING') table.autocommit = False 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): - match = all(( - new_rule.get_src() == rule.get_src(), - new_rule.get_dst() == rule.get_dst(), - new_rule.target.parameters == rule.target.parameters, - new_rule.target.name == rule.target.name - )) - if position == 0: - if not match: - logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}') - chain.insert_rule(new_rule) - else: - if match: - 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) - table.commit() + match = all(( + new_rule.get_src() == rule.get_src(), + new_rule.get_dst() == rule.get_dst(), + new_rule.target.parameters == rule.target.parameters, + new_rule.target.name == rule.target.name + )) + if position == 0: + if not match: + logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}') + chain.insert_rule(new_rule) + else: + if match: + 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) + + table.commit() table.autocommit = True else: snat_rule("ip", snat_target) diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index 05081c6d..c8713e04 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -12,7 +12,7 @@ ARG MEMCACHED_PECL_VERSION=3.2.0 # renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced ARG REDIS_PECL_VERSION=5.3.7 # 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 \ aspell-dev \ diff --git a/data/conf/rspamd/local.d/composites.conf b/data/conf/rspamd/local.d/composites.conf index 337a2eb1..02ff955b 100644 --- a/data/conf/rspamd/local.d/composites.conf +++ b/data/conf/rspamd/local.d/composites.conf @@ -8,7 +8,7 @@ VIRUS_FOUND { } # Bad policy from free mail providers 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; } # Applies to freemail with undisclosed recipients diff --git a/data/conf/rspamd/local.d/multimap.conf b/data/conf/rspamd/local.d/multimap.conf index 3f554c5b..888bf363 100644 --- a/data/conf/rspamd/local.d/multimap.conf +++ b/data/conf/rspamd/local.d/multimap.conf @@ -159,8 +159,8 @@ BAZAAR_ABUSE_CH { } URLHAUS_ABUSE_CH { - type = "url"; - filter = "full"; + type = "selector"; + selector = "urls"; map = "https://urlhaus.abuse.ch/downloads/text_online/"; score = 10.0; } diff --git a/data/conf/sogo/sogo.conf b/data/conf/sogo/sogo.conf index 97a34e9e..2c042c30 100644 --- a/data/conf/sogo/sogo.conf +++ b/data/conf/sogo/sogo.conf @@ -62,7 +62,7 @@ SOGoFirstDayOfWeek = "1"; SOGoSieveFolderEncoding = "UTF-8"; - SOGoPasswordChangeEnabled = YES; + SOGoPasswordChangeEnabled = NO; SOGoSentFolderName = "Sent"; SOGoMailShowSubscribedFoldersOnly = NO; NGImap4ConnectionStringSeparator = "/"; diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 9fc9234e..e286ab55 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -3,7 +3,7 @@ function init_db_schema() { try { global $pdo; - $db_version = "06012023_1924"; + $db_version = "14022023_1000"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $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" ), - "templates" => array( - "cols" => array( - "id" => "INT NOT NULL AUTO_INCREMENT", - "template" => "VARCHAR(255) NOT NULL", - "type" => "VARCHAR(255) NOT NULL", - "attributes" => "JSON", - "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", - "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP" - ), - "keys" => array( - "primary" => array( - "" => array("id") - ) - ), - "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" - ), + "templates" => array( + "cols" => array( + "id" => "INT NOT NULL AUTO_INCREMENT", + "template" => "VARCHAR(255) NOT NULL", + "type" => "VARCHAR(255) NOT NULL", + "attributes" => "JSON", + "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", + "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP" + ), + "keys" => array( + "primary" => array( + "" => array("id") + ) + ), + "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" + ), "domain" => array( // Todo: Move some attributes to json "cols" => array( @@ -1076,7 +1076,7 @@ function init_db_schema() { } } - // Migrate tls_enforce_* options + // Migrate tls_enforce_* options if ($table == 'mailbox') { $stmt = $pdo->query("SHOW TABLES LIKE 'mailbox'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -1096,7 +1096,7 @@ function init_db_schema() { $stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); 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;"); $stmt->execute(array(':table' => $table)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); @@ -1322,95 +1322,95 @@ function init_db_schema() { // Fix domain_admins $pdo->query("DELETE FROM `domain_admins` WHERE `domain` = 'ALL';"); - // add default templates - $default_domain_template = array( - "template" => "Default", - "type" => "domain", - "attributes" => array( - "tags" => array(), - "max_num_aliases_for_domain" => 400, - "max_num_mboxes_for_domain" => 10, - "def_quota_for_mbox" => 3072 * 1048576, - "max_quota_for_mbox" => 10240 * 1048576, - "max_quota_for_domain" => 10240 * 1048576, - "rl_frame" => "s", - "rl_value" => "", - "active" => 1, - "gal" => 1, - "backupmx" => 0, - "relay_all_recipients" => 0, - "relay_unknown_only" => 0, - "dkim_selector" => "dkim", - "key_size" => 2048, - "max_quota_for_domain" => 10240 * 1048576, - ) - ); - $default_mailbox_template = array( - "template" => "Default", - "type" => "mailbox", - "attributes" => array( - "tags" => array(), - "quota" => 0, - "quarantine_notification" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_notification']), - "quarantine_category" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_category']), - "rl_frame" => "s", - "rl_value" => "", - "force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']), - "sogo_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_access']), - "active" => 1, - "tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']), - "tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']), - "imap_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['imap_access']), - "pop3_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['pop3_access']), - "smtp_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['smtp_access']), - "sieve_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sieve_access']), - "acl_spam_alias" => 1, - "acl_tls_policy" => 1, - "acl_spam_score" => 1, - "acl_spam_policy" => 1, - "acl_delimiter_action" => 1, - "acl_syncjobs" => 0, - "acl_eas_reset" => 1, - "acl_sogo_profile_reset" => 0, - "acl_pushover" => 1, - "acl_quarantine" => 1, - "acl_quarantine_attachments" => 1, - "acl_quarantine_notification" => 1, - "acl_quarantine_category" => 1, - "acl_app_passwds" => 1, - ) - ); - $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); - $stmt->execute(array( - ":type" => "domain", - ":template" => $default_domain_template["template"] - )); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - if (empty($row)){ - $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) - VALUES (:type, :template, :attributes)"); - $stmt->execute(array( - ":type" => "domain", - ":template" => $default_domain_template["template"], - ":attributes" => json_encode($default_domain_template["attributes"]) - )); - } - $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); - $stmt->execute(array( - ":type" => "mailbox", - ":template" => $default_mailbox_template["template"] - )); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - if (empty($row)){ - $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) - VALUES (:type, :template, :attributes)"); - $stmt->execute(array( - ":type" => "mailbox", - ":template" => $default_mailbox_template["template"], - ":attributes" => json_encode($default_mailbox_template["attributes"]) - )); - } - + // add default templates + $default_domain_template = array( + "template" => "Default", + "type" => "domain", + "attributes" => array( + "tags" => array(), + "max_num_aliases_for_domain" => 400, + "max_num_mboxes_for_domain" => 10, + "def_quota_for_mbox" => 3072 * 1048576, + "max_quota_for_mbox" => 10240 * 1048576, + "max_quota_for_domain" => 10240 * 1048576, + "rl_frame" => "s", + "rl_value" => "", + "active" => 1, + "gal" => 1, + "backupmx" => 0, + "relay_all_recipients" => 0, + "relay_unknown_only" => 0, + "dkim_selector" => "dkim", + "key_size" => 2048, + "max_quota_for_domain" => 10240 * 1048576, + ) + ); + $default_mailbox_template = array( + "template" => "Default", + "type" => "mailbox", + "attributes" => array( + "tags" => array(), + "quota" => 0, + "quarantine_notification" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_notification']), + "quarantine_category" => strval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['quarantine_category']), + "rl_frame" => "s", + "rl_value" => "", + "force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']), + "sogo_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_access']), + "active" => 1, + "tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']), + "tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']), + "imap_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['imap_access']), + "pop3_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['pop3_access']), + "smtp_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['smtp_access']), + "sieve_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sieve_access']), + "acl_spam_alias" => 1, + "acl_tls_policy" => 1, + "acl_spam_score" => 1, + "acl_spam_policy" => 1, + "acl_delimiter_action" => 1, + "acl_syncjobs" => 0, + "acl_eas_reset" => 1, + "acl_sogo_profile_reset" => 0, + "acl_pushover" => 1, + "acl_quarantine" => 1, + "acl_quarantine_attachments" => 1, + "acl_quarantine_notification" => 1, + "acl_quarantine_category" => 1, + "acl_app_passwds" => 1, + ) + ); + $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); + $stmt->execute(array( + ":type" => "domain", + ":template" => $default_domain_template["template"] + )); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if (empty($row)){ + $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) + VALUES (:type, :template, :attributes)"); + $stmt->execute(array( + ":type" => "domain", + ":template" => $default_domain_template["template"], + ":attributes" => json_encode($default_domain_template["attributes"]) + )); + } + $stmt = $pdo->prepare("SELECT id FROM `templates` WHERE `type` = :type AND `template` = :template"); + $stmt->execute(array( + ":type" => "mailbox", + ":template" => $default_mailbox_template["template"] + )); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if (empty($row)){ + $stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`) + VALUES (:type, :template, :attributes)"); + $stmt->execute(array( + ":type" => "mailbox", + ":template" => $default_mailbox_template["template"], + ":attributes" => json_encode($default_mailbox_template["attributes"]) + )); + } + if (php_sapi_name() == "cli") { echo "DB initialization completed" . PHP_EOL; } else { diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js index e0b9a5ab..55b6660b 100644 --- a/data/web/js/site/debug.js +++ b/data/web/js/site/debug.js @@ -1181,7 +1181,7 @@ jQuery(function($){ if (table = $('#' + log_table).DataTable()) { 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){ if (data.length === undefined) { mailcow_alert_box(lang.no_new_rows, "info"); return; } diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index 2ef84688..f4039268 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -926,9 +926,12 @@ jQuery(function($){ ' ' + lang.remove + '' + ''; } - item.in_use = '
' + + item.in_use = { + sortBy: item.percent_in_use, + value: '
' + '
' + item.percent_in_use + '%' + '
'; + 'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '
' + }; item.username = escapeHtml(item.username); if (Array.isArray(item.tags)){ @@ -994,10 +997,11 @@ jQuery(function($){ }, { title: lang.in_use, - data: 'in_use', + data: 'in_use.value', defaultContent: '', responsivePriority: 9, - className: 'dt-data-w100' + className: 'dt-data-w100', + orderData: 24 }, { title: lang.fname, @@ -1102,7 +1106,12 @@ jQuery(function($){ { title: "", data: 'quota.sortBy', - responsivePriority: 8, + defaultContent: '', + className: "d-none" + }, + { + title: "", + data: 'in_use.sortBy', defaultContent: '', className: "d-none" }, diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index d1f2bb07..5e119fbd 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -650,7 +650,7 @@ }, "login": { "delayed": "Přihlášení zpožděno o %s sekund.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Přihlásit", "mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.", "other_logins": "Přihlášení klíčem", diff --git a/data/web/lang/lang.da-dk.json b/data/web/lang/lang.da-dk.json index fa50ff59..61a553e6 100644 --- a/data/web/lang/lang.da-dk.json +++ b/data/web/lang/lang.da-dk.json @@ -4,15 +4,15 @@ "app_passwds": "Administrer app-adgangskoder", "bcc_maps": "BCC kort", "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", "filters": "Filtre", "login_as": "Login som mailboks bruger", - "prohibited": "Forbudt af ACL", - "protocol_access": "Ændre protokol adgang", + "prohibited": "Nægtet af ACL", + "protocol_access": "Skift protokol adgang", "pushover": "Pushover", - "quarantine": "Karantæneaktioner", - "quarantine_attachments": "Karantæne vedhæftede filer", + "quarantine": "Karantænehandlinger", + "quarantine_attachments": "Karantænevedhæftede filer", "quarantine_notification": "Skift karantænemeddelelser", "ratelimit": "Satsgrænse", "recipient_maps": "Modtagerkort", @@ -20,12 +20,15 @@ "sogo_access": "Tillad styring af SOGo-adgang", "sogo_profile_reset": "Nulstil SOGo-profil", "spam_alias": "Midlertidige aliasser", - "spam_policy": "Sortliste / hvidliste", + "spam_policy": "Sortliste/hvidliste", "spam_score": "Spam-score", "syncjobs": "Synkroniserings job", "tls_policy": "TLS politik", "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": { "activate_filter_warn": "Alle andre filtre deaktiveres, når aktiv er markeret.", @@ -59,7 +62,7 @@ "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! Genstart SOGo for at anvende ændringer. ", "generate": "generere", - "goto_ham": "Lær som ham", + "goto_ham": "Lær som ønsket", "goto_null": "Kassér e-mail i stilhed", "goto_spam": "Lær som spam", "hostname": "Vært", @@ -80,7 +83,7 @@ "private_comment": "Privat kommentar", "public_comment": "Offentlig kommentar", "quota_mb": "Kvota (Mb)", - "relay_all": "Send alle modtagere videre", + "relay_all": "Besvar alle modtager", "relay_all_info": "↪ Hvis du vælger ikke 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_transport_info": "
Info
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", "username": "Brugernavn", "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.
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": { "access": "Adgang", @@ -308,7 +314,10 @@ "username": "Brugernavn", "validate_license_now": "Valider GUID mod licensserver", "verify": "Verificere", - "yes": "✓" + "yes": "✓", + "ip_check_opt_in": "Opt-In for brug af tredjepartstjeneste ipv4.mailcow.email og ipv6.mailcow.email til at finde eksterne IP-adresser.", + "queue_unban": "unban", + "admins": "Administratorer" }, "danger": { "access_denied": "Adgang nægtet eller ugyldig formular data", @@ -425,7 +434,8 @@ "username_invalid": "Brugernavn %s kan ikke bruges", "validity_missing": "Tildel venligst en gyldighedsperiode", "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": { "chart_this_server": "Diagram (denne server)", @@ -442,7 +452,8 @@ "solr_status": "Solr-status", "started_on": "Startede den", "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": { "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", "unchanged_if_empty": "Lad være tomt, hvis uændret", "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 (.*google\\.dk 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": { "cancel": "Afbestille", @@ -571,7 +586,7 @@ "header": { "administration": "Konfiguration og detailer", "apps": "Apps", - "debug": "Systemoplysninger", + "debug": "Information", "email": "E-Mail", "mailcow_config": "Konfiguration", "quarantine": "Karantæne", @@ -586,7 +601,7 @@ }, "login": { "delayed": "Login blev forsinket med% s sekunder.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Login", "mobileconfig_info": "Log ind som postkassebruger for at downloade den anmodede Apple-forbindelsesprofil.", "other_logins": "Nøgle login", @@ -739,7 +754,10 @@ "username": "Brugernavn", "waiting": "Venter", "weekly": "Ugentlig", - "yes": "✓" + "yes": "✓", + "goto_ham": "Lær som ønsket", + "catch_all": "Fang-alt", + "open_logs": "Åben logfiler" }, "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.", "session_token": "Form nøgle ugyldig: Nøgle passer ikke", "session_ua": "Form nøgle ugyldig: Bruger-Agent gyldighedskontrols fejl" + }, + "datatables": { + "lengthMenu": "Vis _MENU_ poster", + "paginate": { + "first": "Først" + } } } diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 3d1e2d59..8ff1cf06 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -710,7 +710,7 @@ }, "login": { "delayed": "Login wurde zur Sicherheit um %s Sekunde/n verzögert.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Anmelden", "mobileconfig_info": "Bitte als Mailbox-Benutzer einloggen, um das Verbindungsprofil herunterzuladen.", "other_logins": "Key Login", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 02db0b0d..bfac011e 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -710,7 +710,7 @@ }, "login": { "delayed": "Login was delayed by %s seconds.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Login", "mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.", "other_logins": "Key login", diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index 8afc5738..ef19d186 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -321,7 +321,9 @@ "admins": "Administrateurs", "api_read_only": "Accès lecture-seule", "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
Système > Configuration > Options > Personnaliser" }, "danger": { "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é", "validity_missing": "Veuillez attribuer une période de validité", "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": { "chart_this_server": "Graphique (ce serveur)", @@ -612,7 +619,7 @@ }, "login": { "delayed": "La connexion a été retardée de %s secondes.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Connexion", "mobileconfig_info": "Veuillez vous connecter en tant qu’utilisateur de la boîte pour télécharger le profil de connexion Apple demandé.", "other_logins": "Clé d'authentification", diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index 8bfa9738..d8d6978c 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -674,7 +674,7 @@ }, "login": { "delayed": "L'accesso è stato ritardato di %s secondi.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Login", "mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.", "other_logins": "Key login", diff --git a/data/web/lang/lang.lv-lv.json b/data/web/lang/lang.lv-lv.json index b03848a4..962b9000 100644 --- a/data/web/lang/lang.lv-lv.json +++ b/data/web/lang/lang.lv-lv.json @@ -3,7 +3,8 @@ "bcc_maps": "BCC kartes", "filters": "Filtri", "recipient_maps": "Saņēmēja kartes", - "syncjobs": "Sinhronizācijas uzdevumi" + "syncjobs": "Sinhronizācijas uzdevumi", + "spam_score": "Mēstules novērtējums" }, "add": { "activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.", @@ -104,10 +105,10 @@ "host": "Hosts", "import": "Importēt", "import_private_key": "Importēt privātu atslēgu", - "in_use_by": "Tiek lietots ar", + "in_use_by": "Izmanto", "inactive": "Neaktīvs", "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", "main_name": "\"mailcow UI\" nosaukums", "merged_vars_hint": "Pelēkās rindas tika apvienotas vars.(local.)inc.php un nevar tikt modificētas.", @@ -144,7 +145,10 @@ "ui_texts": "UI etiķetes un teksti", "unchanged_if_empty": "Ja nav veiktas izmaiņas, atstājiet tukšu", "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": { "access_denied": "Piekļuve liegta, vai nepareizi dati", @@ -170,7 +174,7 @@ "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_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", "mailbox_invalid": "Pastkastes vārds ir nederīgs", "mailbox_quota_exceeded": "Kvota pārsniedz domēna limitu (max. %d MiB)", @@ -262,7 +266,8 @@ "title": "Labot priekšmetu", "unchanged_if_empty": "Ja neizmainīts atstājiet tukšu", "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": { "cancel": "Atcelt", @@ -314,21 +319,21 @@ "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.
\r\n   Vietējais galamērķis netiks informēts par piegādes neveiksmi. ", "bcc_local_dest": "Vietējais galamērķis", - "bcc_map_type": "BCC tips", + "bcc_map_type": "BCC veids", "bcc_maps": "BCC kartes", "bcc_rcpt_map": "saņēmēja karte", "bcc_sender_map": "Sūtītāja karte", "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_type": "BCC tips", - "deactivate": "Deaktivizēt", + "deactivate": "Deaktivēt", "description": "Apraksts", "dkim_key_length": "DKIM atslēgas garums (bits)", "domain": "Domēns", "domain_admins": "Domēna administratori", "domain_aliases": "Domēna aliases", "domain_quota": "Kvota", - "domain_quota_total": "Kopējā domēna kvota", + "domain_quota_total": "Kopējais domēna ierobežojums", "domains": "Domēns", "edit": "Labot", "empty": "Nav rezultātu", @@ -341,7 +346,7 @@ "inactive": "Neaktīvs", "kind": "Veids", "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", "mailboxes": "Pastkaste", "max_aliases": "Maks. iespejamās aliases", @@ -374,7 +379,13 @@ "tls_enforce_out": "Piespiest TLS izejošajiem", "toggle_all": "Pārslēgt visu", "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": { "action": "Darbības", @@ -547,5 +558,14 @@ "waiting": "Waiting", "week": "Nedēļa", "weeks": "Nedēļas" + }, + "datatables": { + "paginate": { + "first": "Pirmā", + "last": "Pēdējā" + } + }, + "debug": { + "last_modified": "Pēdējoreiz mainīts" } } diff --git a/data/web/lang/lang.nl-nl.json b/data/web/lang/lang.nl-nl.json index 547c7bb7..774627ca 100644 --- a/data/web/lang/lang.nl-nl.json +++ b/data/web/lang/lang.nl-nl.json @@ -598,7 +598,7 @@ }, "login": { "delayed": "Aanmelding vertraagd met %s seconden.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Aanmelden", "mobileconfig_info": "Log in als mailboxgebruiker om het Apple-verbindingsprofiel te downloaden.", "other_logins": "Meld aan met key", diff --git a/data/web/lang/lang.pl-pl.json b/data/web/lang/lang.pl-pl.json index b2862d8e..aa185d32 100644 --- a/data/web/lang/lang.pl-pl.json +++ b/data/web/lang/lang.pl-pl.json @@ -1,7 +1,8 @@ { "acl": { "sogo_profile_reset": "Usuń profil SOGo (webmail)", - "syncjobs": "Polecenie synchronizacji" + "syncjobs": "Polecenie synchronizacji", + "alias_domains": "Dodaj aliasy domen" }, "add": { "active": "Aktywny", diff --git a/data/web/lang/lang.ro-ro.json b/data/web/lang/lang.ro-ro.json index fe0d2064..8e6e1d45 100644 --- a/data/web/lang/lang.ro-ro.json +++ b/data/web/lang/lang.ro-ro.json @@ -656,7 +656,7 @@ }, "login": { "delayed": "Conectarea a fost întârziată cu %s secunde.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Autentificare", "mobileconfig_info": "Autentificați-vă cu adresa de email pentru a descărca profilul de conexiune Apple.", "other_logins": "Autentificare cu cheie", diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index 60aba927..65dd4bae 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -37,7 +37,7 @@ "add_domain_only": "Только добавить домен", "add_domain_restart": "Добавить домен и перезапустить SOGo", "alias_address": "Псевдоним/ы", - "alias_address_info": "Укажите почтовые адреса разделенные запятыми или, если хотите пересылать все сообщения для домена владельцам псевдонима то: @example.com. Только домены mailcow разрешены.", + "alias_address_info": "Адрес(а) электронной почты (через запятую) или @example.com (для перехвата всех писем для домена). только домены mailcow.", "alias_domain": "Псевдоним домена", "alias_domain_info": "Действительные имена доменов, раздёленные запятыми.", "app_name": "Название приложения", @@ -335,7 +335,8 @@ "username": "Имя пользователя", "validate_license_now": "Получить лицензию на основе GUID с сервера лицензий", "verify": "Проверить", - "yes": "✓" + "yes": "✓", + "queue_unban": "разблокировать" }, "danger": { "access_denied": "Доступ запрещён, или указаны неверные данные", @@ -654,7 +655,7 @@ }, "login": { "delayed": "Вход был отложен на %s секунд.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Войти", "mobileconfig_info": "Пожалуйста, войдите в систему как пользователь почтового аккаунта для загрузки профиля подключения Apple.", "other_logins": "Вход с помощью ключа", diff --git a/data/web/lang/lang.sk-sk.json b/data/web/lang/lang.sk-sk.json index f2f23681..2b93650f 100644 --- a/data/web/lang/lang.sk-sk.json +++ b/data/web/lang/lang.sk-sk.json @@ -657,7 +657,7 @@ }, "login": { "delayed": "Prihlásenie bolo oneskorené o %s sekúnd.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Prihlásenie", "mobileconfig_info": "Prosím, prihláste sa ako mailový používateľ pre stiahnutie požadovaného Apple profilu.", "other_logins": "Prihlásenie kľúčom", diff --git a/data/web/lang/lang.sv-se.json b/data/web/lang/lang.sv-se.json index 4cc84619..31bc0ab3 100644 --- a/data/web/lang/lang.sv-se.json +++ b/data/web/lang/lang.sv-se.json @@ -618,7 +618,7 @@ }, "login": { "delayed": "Av säkerhetsskäl har inloggning inaktiverats i %s sekunder.", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Logga in", "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", diff --git a/data/web/lang/lang.uk-ua.json b/data/web/lang/lang.uk-ua.json index e3acb8b5..0a5c71b8 100644 --- a/data/web/lang/lang.uk-ua.json +++ b/data/web/lang/lang.uk-ua.json @@ -656,7 +656,7 @@ "awaiting_tfa_confirmation": "В очікуванні підтвердження TFA" }, "login": { - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "Увійти", "other_logins": "Вхід за допомогою ключа", "password": "Пароль", diff --git a/data/web/lang/lang.zh-cn.json b/data/web/lang/lang.zh-cn.json index 5d05ef62..e57ea2a7 100644 --- a/data/web/lang/lang.zh-cn.json +++ b/data/web/lang/lang.zh-cn.json @@ -661,7 +661,7 @@ }, "login": { "delayed": "请在 %s 秒后重新登录。", - "fido2_webauthn": "使用 FIDO2/WebAuthn 登录", + "fido2_webauthn": "使用 FIDO2/WebAuthn Login 登录", "login": "登录", "mobileconfig_info": "请使用邮箱用户登录以下载 Apple 连接描述文件。", "other_logins": "Key 登录", diff --git a/data/web/lang/lang.zh-tw.json b/data/web/lang/lang.zh-tw.json index f9c81c66..916188db 100644 --- a/data/web/lang/lang.zh-tw.json +++ b/data/web/lang/lang.zh-tw.json @@ -655,7 +655,7 @@ }, "login": { "delayed": "請在 %s 秒後重新登入。", - "fido2_webauthn": "FIDO2/WebAuthn", + "fido2_webauthn": "FIDO2/WebAuthn Login", "login": "登入", "mobileconfig_info": "請使用信箱使用者登入以下載 Apple 連接描述檔案。", "other_logins": "金鑰登入", diff --git a/data/web/templates/debug.twig b/data/web/templates/debug.twig index 006703fb..d24d7ed6 100644 --- a/data/web/templates/debug.twig +++ b/data/web/templates/debug.twig @@ -612,7 +612,7 @@
  • {{ lang.datatables.expand_all }}
  • {{ lang.datatables.collapse_all }}
  • -

    {{ lang.admin.hash_remove_info }}

    +

    {{ lang.admin.hash_remove_info|raw }}

    diff --git a/data/web/templates/index.twig b/data/web/templates/index.twig index e90a720a..45054b5f 100644 --- a/data/web/templates/index.twig +++ b/data/web/templates/index.twig @@ -38,15 +38,8 @@
    -
    -
    - - - -
    -
    + + {% if not oauth2_request %}