Merge branch 'feature/bootstrap5' into nightly

This commit is contained in:
DerLinkman 2022-12-12 16:19:04 +01:00
commit 4227890ab5
11 changed files with 98 additions and 70 deletions

View File

@ -1,4 +1,4 @@
FROM alpine:3.16 FROM alpine:3.17
LABEL maintainer "Andre Peters <andre.peters@servercow.de>" LABEL maintainer "Andre Peters <andre.peters@servercow.de>"

View File

@ -1420,11 +1420,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
// check attributes // check attributes
$attr = array(); $attr = array();
$attr['tags'] = (isset($_data['tags'])) ? $_data['tags'] : array(); $attr['tags'] = (isset($_data['tags'])) ? $_data['tags'] : array();
$attr['max_num_aliases_for_domain'] = (isset($_data['max_num_aliases_for_domain'])) ? intval($_data['max_num_aliases_for_domain']) : 0; $attr['max_num_aliases_for_domain'] = (!empty($_data['max_num_aliases_for_domain'])) ? intval($_data['max_num_aliases_for_domain']) : 400;
$attr['max_num_mboxes_for_domain'] = (isset($_data['max_num_mboxes_for_domain'])) ? intval($_data['max_num_mboxes_for_domain']) : 0; $attr['max_num_mboxes_for_domain'] = (!empty($_data['max_num_mboxes_for_domain'])) ? intval($_data['max_num_mboxes_for_domain']) : 10;
$attr['def_quota_for_mbox'] = (isset($_data['def_quota_for_mbox'])) ? intval($_data['def_quota_for_mbox']) * 1048576 : 0; $attr['def_quota_for_mbox'] = (!empty($_data['def_quota_for_mbox'])) ? intval($_data['def_quota_for_mbox']) * 1048576 : 3072 * 1048576;
$attr['max_quota_for_mbox'] = (isset($_data['max_quota_for_mbox'])) ? intval($_data['max_quota_for_mbox']) * 1048576 : 0; $attr['max_quota_for_mbox'] = (!empty($_data['max_quota_for_mbox'])) ? intval($_data['max_quota_for_mbox']) * 1048576 : 10240 * 1048576;
$attr['max_quota_for_domain'] = (isset($_data['max_quota_for_domain'])) ? intval($_data['max_quota_for_domain']) * 1048576 : 0; $attr['max_quota_for_domain'] = (!empty($_data['max_quota_for_domain'])) ? intval($_data['max_quota_for_domain']) * 1048576 : 10240 * 1048576;
$attr['rl_frame'] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s"; $attr['rl_frame'] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s";
$attr['rl_value'] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : ""; $attr['rl_value'] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : "";
$attr['active'] = isset($_data['active']) ? intval($_data['active']) : 1; $attr['active'] = isset($_data['active']) ? intval($_data['active']) : 1;
@ -1435,7 +1435,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$attr['dkim_selector'] = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : "dkim"; $attr['dkim_selector'] = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : "dkim";
$attr['key_size'] = isset($_data['key_size']) ? intval($_data['key_size']) : 2048; $attr['key_size'] = isset($_data['key_size']) ? intval($_data['key_size']) : 2048;
// save template // save template
$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)");
@ -4756,15 +4755,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
":id" => $id, ":id" => $id,
":type" => "domain", ":type" => "domain",
":template" => "Default" ":template" => "Default"
)); ));
}
$_SESSION['return'][] = array( $_SESSION['return'][] = array(
'type' => 'success', 'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr), 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => 'template_removed' 'msg' => array('template_removed', htmlspecialchars($id))
); );
return true; return true;
}
break; break;
case 'alias': case 'alias':
if (!is_array($_data['id'])) { if (!is_array($_data['id'])) {

View File

@ -1,7 +1,7 @@
$(document).ready(function() { $(document).ready(function() {
// mailcow alert box generator // mailcow alert box generator
window.mailcow_alert_box = function(message, type) { window.mailcow_alert_box = function(message, type) {
msg = $('<span/>').text(message).text(); msg = $('<span/>').text(escapeHtml(message)).text();
if (type == 'danger' || type == 'info') { if (type == 'danger' || type == 'info') {
auto_hide = 0; auto_hide = 0;
$('#' + localStorage.getItem("add_modal")).modal('show'); $('#' + localStorage.getItem("add_modal")).modal('show');

View File

@ -441,6 +441,8 @@ jQuery(function($){
url: "/api/v1/get/domain/all", url: "/api/v1/get/domain/all",
dataSrc: function(json){ dataSrc: function(json){
$.each(json, function(i, item) { $.each(json, function(i, item) {
item.domain_name = escapeHtml(item.domain_name);
item.aliases = item.aliases_in_domain + " / " + item.max_num_aliases_for_domain; item.aliases = item.aliases_in_domain + " / " + item.max_num_aliases_for_domain;
item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain; item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain;
item.quota = item.quota_used_in_domain + "/" + item.max_quota_for_domain + "/" + item.bytes_total; item.quota = item.quota_used_in_domain + "/" + item.max_quota_for_domain + "/" + item.bytes_total;
@ -625,7 +627,6 @@ jQuery(function($){
type: "GET", type: "GET",
url: "/api/v1/get/domain/template/all", url: "/api/v1/get/domain/template/all",
dataSrc: function(json){ dataSrc: function(json){
console.log(json);
$.each(json, function (i, item) { $.each(json, function (i, item) {
item.chkbox = '<input type="checkbox" data-id="domain_template" name="multi_select" value="' + encodeURIComponent(item.id) + '" />'; item.chkbox = '<input type="checkbox" data-id="domain_template" name="multi_select" value="' + encodeURIComponent(item.id) + '" />';
@ -645,10 +646,18 @@ jQuery(function($){
} }
item.attributes.rl_value = escapeHtml(item.attributes.rl_value); item.attributes.rl_value = escapeHtml(item.attributes.rl_value);
item.action = '<div class="btn-group">' +
if (item.template.toLowerCase() == "default"){
item.action = '<div class="btn-group">' +
'<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'</div>';
}
else{
item.action = '<div class="btn-group">' +
'<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' + '<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-template" data-api-url="delete/domain/template" data-item="' + encodeURIComponent(item.id) + '" 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-template" data-api-url="delete/domain/template" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
'</div>'; '</div>';
}
if (Array.isArray(item.attributes.tags)){ if (Array.isArray(item.attributes.tags)){
var tags = ''; var tags = '';
@ -688,7 +697,7 @@ jQuery(function($){
defaultContent: '' defaultContent: ''
}, },
{ {
title: "Template", title: lang.template,
data: 'template', data: 'template',
responsivePriority: 3, responsivePriority: 3,
defaultContent: '' defaultContent: ''
@ -1115,11 +1124,17 @@ jQuery(function($){
} }
if (item.template.toLowerCase() == "default"){
item.action = '<div class="btn-group">' + item.action = '<div class="btn-group">' +
'<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' + '<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-template" data-api-url="delete/mailbox/template" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' + '</div>';
'</div>'; }
else {
item.action = '<div class="btn-group">' +
'<a href="/edit/template/' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-template" data-api-url="delete/mailbox/template" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
'</div>';
}
if (Array.isArray(item.attributes.tags)){ if (Array.isArray(item.attributes.tags)){
var tags = ''; var tags = '';
@ -1159,7 +1174,7 @@ jQuery(function($){
defaultContent: '' defaultContent: ''
}, },
{ {
title: "Template", title: lang.template,
data: 'template', data: 'template',
responsivePriority: 3, responsivePriority: 3,
defaultContent: '' defaultContent: ''
@ -1582,7 +1597,6 @@ jQuery(function($){
type: "GET", type: "GET",
url: "/api/v1/get/tls-policy-map/all", url: "/api/v1/get/tls-policy-map/all",
dataSrc: function(json){ dataSrc: function(json){
console.log(json);
if (role !== "admin") return null; if (role !== "admin") return null;
$.each(json, function (i, item) { $.each(json, function (i, item) {
@ -1817,6 +1831,8 @@ jQuery(function($){
url: "/api/v1/get/alias-domain/all", url: "/api/v1/get/alias-domain/all",
dataSrc: function(json){ dataSrc: function(json){
$.each(json, function (i, item) { $.each(json, function (i, item) {
item.alias_domain = escapeHtml(item.alias_domain);
item.action = '<div class="btn-group">' + item.action = '<div class="btn-group">' +
'<a href="/edit/aliasdomain/' + encodeURIComponent(item.alias_domain) + '" class="btn btn-sm btn-xs-third btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' + '<a href="/edit/aliasdomain/' + encodeURIComponent(item.alias_domain) + '" class="btn btn-sm btn-xs-third btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-alias-domain" data-api-url="delete/alias-domain" data-item="' + encodeURIComponent(item.alias_domain) + '" class="btn btn-sm btn-xs-third btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' + '<a href="#" data-action="delete_selected" data-id="single-alias-domain" data-api-url="delete/alias-domain" data-item="' + encodeURIComponent(item.alias_domain) + '" class="btn btn-sm btn-xs-third btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
@ -1904,7 +1920,7 @@ jQuery(function($){
} else { } else {
item.exclude = '<code>' + escapeHtml(item.exclude) + '</code>'; item.exclude = '<code>' + escapeHtml(item.exclude) + '</code>';
} }
item.server_w_port = escapeHtml(item.user1) + '@' + item.host1 + ':' + item.port1; item.server_w_port = escapeHtml(item.user1) + '@' + escapeHtml(item.host1) + ':' + escapeHtml(item.port1);
item.action = '<div class="btn-group">' + item.action = '<div class="btn-group">' +
'<a href="/edit/syncjob/' + item.id + '" class="btn btn-sm btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' + '<a href="/edit/syncjob/' + item.id + '" class="btn btn-sm btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + item.id + '" class="btn btn-sm btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' + '<a href="#" data-action="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + item.id + '" class="btn btn-sm btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
@ -2042,6 +2058,7 @@ jQuery(function($){
} else { } else {
item.active = '<span id="inactive-script" class="badge fs-6 bg-warning">' + lang.inactive + '</span>'; item.active = '<span id="inactive-script" class="badge fs-6 bg-warning">' + lang.inactive + '</span>';
} }
item.script_desc = escapeHtml(item.script_desc);
item.script_data = '<pre class="text-break" style="margin:0px">' + escapeHtml(item.script_data) + '</pre>' item.script_data = '<pre class="text-break" style="margin:0px">' + escapeHtml(item.script_data) + '</pre>'
item.filter_type = '<div class="badge fs-6 bg-secondary">' + item.filter_type.charAt(0).toUpperCase() + item.filter_type.slice(1).toLowerCase() + '</div>' item.filter_type = '<div class="badge fs-6 bg-secondary">' + item.filter_type.charAt(0).toUpperCase() + item.filter_type.slice(1).toLowerCase() + '</div>'
item.action = '<div class="btn-group">' + item.action = '<div class="btn-group">' +

View File

@ -228,6 +228,7 @@
"oauth2_renew_secret": "Neues Client Secret generieren", "oauth2_renew_secret": "Neues Client Secret generieren",
"oauth2_revoke_tokens": "Alle Client Tokens entfernen", "oauth2_revoke_tokens": "Alle Client Tokens entfernen",
"optional": "Optional", "optional": "Optional",
"options": "Einstellungen",
"password": "Passwort", "password": "Passwort",
"password_length": "Passwortlänge", "password_length": "Passwortlänge",
"password_policy": "Passwortrichtlinie", "password_policy": "Passwortrichtlinie",
@ -714,6 +715,7 @@
"add_filter": "Filter erstellen", "add_filter": "Filter erstellen",
"add_mailbox": "Mailbox hinzufügen", "add_mailbox": "Mailbox hinzufügen",
"add_recipient_map_entry": "Empfängerumschreibung hinzufügen", "add_recipient_map_entry": "Empfängerumschreibung hinzufügen",
"add_template": "Vorlage hinzufügen",
"add_resource": "Ressource hinzufügen", "add_resource": "Ressource hinzufügen",
"add_tls_policy_map": "TLS-Richtlinieneintrag hinzufügen", "add_tls_policy_map": "TLS-Richtlinieneintrag hinzufügen",
"address_rewriting": "Adressumschreibung", "address_rewriting": "Adressumschreibung",
@ -755,6 +757,7 @@
"domain": "Domain", "domain": "Domain",
"domain_admins": "Domain-Administratoren", "domain_admins": "Domain-Administratoren",
"domain_aliases": "Domain-Aliasse", "domain_aliases": "Domain-Aliasse",
"domain_templates": "Domainweite Vorlagen",
"domain_quota": "Gesamtspeicher", "domain_quota": "Gesamtspeicher",
"domain_quota_total": "Domain-Speicherplatz gesamt", "domain_quota_total": "Domain-Speicherplatz gesamt",
"domains": "Domains", "domains": "Domains",
@ -781,6 +784,7 @@
"mailbox_defaults": "Standardeinstellungen", "mailbox_defaults": "Standardeinstellungen",
"mailbox_defaults_info": "Steuert die Standardeinstellungen für neue Mailboxen.", "mailbox_defaults_info": "Steuert die Standardeinstellungen für neue Mailboxen.",
"mailbox_defquota": "Standard-Quota", "mailbox_defquota": "Standard-Quota",
"mailbox_templates": "Mailboxweite Vorlagen",
"mailbox_quota": "Max. Größe einer Mailbox", "mailbox_quota": "Max. Größe einer Mailbox",
"mailboxes": "Mailboxen", "mailboxes": "Mailboxen",
"max_aliases": "Max. mögliche Aliasse", "max_aliases": "Max. mögliche Aliasse",
@ -810,6 +814,7 @@
"recipient_map_old_info": "Der originale Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.", "recipient_map_old_info": "Der originale Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.",
"recipient_maps": "Empfängerumschreibungen", "recipient_maps": "Empfängerumschreibungen",
"relay_all": "Alle Empfänger-Adressen relayen", "relay_all": "Alle Empfänger-Adressen relayen",
"relay_unknown": "Unbekannte Mailboxen relayen",
"remove": "Entfernen", "remove": "Entfernen",
"resources": "Ressourcen", "resources": "Ressourcen",
"running": "In Ausführung", "running": "In Ausführung",
@ -836,6 +841,8 @@
"table_size_show_n": "Zeige %s Einträge", "table_size_show_n": "Zeige %s Einträge",
"target_address": "Ziel-Adresse", "target_address": "Ziel-Adresse",
"target_domain": "Ziel-Domain", "target_domain": "Ziel-Domain",
"templates": "Vorlagen",
"template": "Vorlage",
"tls_enforce_in": "TLS eingehend erzwingen", "tls_enforce_in": "TLS eingehend erzwingen",
"tls_enforce_out": "TLS ausgehend erzwingen", "tls_enforce_out": "TLS ausgehend erzwingen",
"tls_map_dest": "Ziel", "tls_map_dest": "Ziel",
@ -932,16 +939,20 @@
"type": "Typ" "type": "Typ"
}, },
"queue": { "queue": {
"delete_queue": "Queue löschen", "delete": "Queue löschen",
"flush_queue": "Queue flushen", "flush": "Queue flushen",
"queue_ays": "Soll die derzeitige Queue wirklich komplett bereinigt werden?", "info" : "In der Mailqueue befinden sich alle E-Mails, welche auf eine Zustellung warten. Sollte eine E-Mail eine längere Zeit innerhalb der Mailqueue stecken wird diese automatisch vom System gelöscht.<br>Die Fehlermeldung der jeweiligen Mail gibt aufschluss darüber, warum diese nicht zugestellt werden konnte",
"queue_command_success": "Queue-Aufgabe erfolgreich ausgeführt", "legend": "Funktionen der Mailqueue Aktionen:",
"queue_deliver_mail": "Ausliefern", "ays": "Soll die derzeitige Queue wirklich komplett bereinigt werden?",
"queue_hold_mail": "Zurückhalten", "deliver_mail": "Ausliefern",
"deliver_mail_legend": "Versucht eine erneute Zustellung der ausgwählten Mails.",
"hold_mail": "Zurückhalten",
"hold_mail_legend": "Hält die ausgewählten Mails zurück. (Verhindert weitere Zustellversuche)",
"queue_manager": "Queue Manager", "queue_manager": "Queue Manager",
"queue_show_message": "Nachricht anzeigen", "show_message": "Nachricht anzeigen",
"queue_unban": "queue unban", "unban": "queue unban",
"queue_unhold_mail": "Freigeben" "unhold_mail": "Freigeben",
"unhold_mail_legend": "Gibt ausgewählte Mails zur Auslieferung frei. (Erfordert vorheriges Zurückhalten)"
}, },
"start": { "start": {
"help": "Hilfe ein-/ausblenden", "help": "Hilfe ein-/ausblenden",
@ -1018,6 +1029,9 @@
"saved_settings": "Regel wurde gespeichert", "saved_settings": "Regel wurde gespeichert",
"settings_map_added": "Regel wurde gespeichert", "settings_map_added": "Regel wurde gespeichert",
"settings_map_removed": "Regeln wurden entfernt: %s", "settings_map_removed": "Regeln wurden entfernt: %s",
"template_added": "Template %s hinzugefügt",
"template_modified": "Änderungen am Template %s wurden gespeichert",
"template_removed": "Template ID %s wurde gelöscht",
"sogo_profile_reset": "ActiveSync-Gerät des Benutzers %s wurde zurückgesetzt", "sogo_profile_reset": "ActiveSync-Gerät des Benutzers %s wurde zurückgesetzt",
"tls_policy_map_entry_deleted": "TLS-Richtlinie mit der ID %s wurde gelöscht", "tls_policy_map_entry_deleted": "TLS-Richtlinie mit der ID %s wurde gelöscht",
"tls_policy_map_entry_saved": "TLS-Richtlinieneintrag \"%s\" wurde gespeichert", "tls_policy_map_entry_saved": "TLS-Richtlinieneintrag \"%s\" wurde gespeichert",

View File

@ -232,6 +232,7 @@
"oauth2_renew_secret": "Generate new client secret", "oauth2_renew_secret": "Generate new client secret",
"oauth2_revoke_tokens": "Revoke all client tokens", "oauth2_revoke_tokens": "Revoke all client tokens",
"optional": "optional", "optional": "optional",
"options": "Options",
"password": "Password", "password": "Password",
"password_length": "Password length", "password_length": "Password length",
"password_policy": "Password policy", "password_policy": "Password policy",
@ -943,16 +944,20 @@
"type": "Type" "type": "Type"
}, },
"queue": { "queue": {
"delete_queue": "Delete all", "delete": "Delete all",
"flush_queue": "Flush queue", "flush": "Flush queue",
"queue_ays": "Please confirm you want to delete all items from the current queue.", "info" : "The mail queue contains all e-mails that are waiting for delivery. If an email is stuck in the mail queue for a long time, it is automatically deleted by the system.<br>The error message of the respective mail gives information about why the mail could not be delivered.",
"queue_command_success": "Queue command completed successfully", "legend": "Mail queue actions functions:",
"queue_deliver_mail": "Deliver", "ays": "Please confirm you want to delete all items from the current queue.",
"queue_hold_mail": "Hold", "deliver_mail": "Deliver",
"deliver_mail_legend": "Attempts to redeliver selected mails.",
"hold_mail": "Hold",
"hold_mail_legend": "Holds the selected mails. (Prevents further delivery attempts)",
"queue_manager": "Queue Manager", "queue_manager": "Queue Manager",
"queue_show_message": "Show message", "show_message": "Show message",
"queue_unban": "queue unban", "unban": "queue unban",
"queue_unhold_mail": "Unhold" "unhold_mail": "Unhold",
"unhold_mail_legend": "Releases selected mails for delivery. (Requires prior hold)"
}, },
"ratelimit": { "ratelimit": {
"disabled": "Disabled", "disabled": "Disabled",
@ -1022,6 +1027,7 @@
"password_policy_saved": "Password policy was saved successfully", "password_policy_saved": "Password policy was saved successfully",
"pushover_settings_edited": "Pushover settings successfully set, please verify credentials.", "pushover_settings_edited": "Pushover settings successfully set, please verify credentials.",
"qlearn_spam": "Message ID %s was learned as spam and deleted", "qlearn_spam": "Message ID %s was learned as spam and deleted",
"queue_command_success": "Queue command completed successfully",
"recipient_map_entry_deleted": "Recipient map ID %s has been deleted", "recipient_map_entry_deleted": "Recipient map ID %s has been deleted",
"recipient_map_entry_saved": "Recipient map entry \"%s\" has been saved", "recipient_map_entry_saved": "Recipient map entry \"%s\" has been saved",
"relayhost_added": "Map entry %s has been added", "relayhost_added": "Map entry %s has been added",
@ -1038,6 +1044,7 @@
"sogo_profile_reset": "SOGo profile for user %s was reset", "sogo_profile_reset": "SOGo profile for user %s was reset",
"template_added": "Added template %s", "template_added": "Added template %s",
"template_modified": "Changes to template %s have been saved", "template_modified": "Changes to template %s have been saved",
"template_removed": "Template ID %s has been deleted",
"tls_policy_map_entry_deleted": "TLS policy map ID %s has been deleted", "tls_policy_map_entry_deleted": "TLS policy map ID %s has been deleted",
"tls_policy_map_entry_saved": "TLS policy map entry \"%s\" has been saved", "tls_policy_map_entry_saved": "TLS policy map entry \"%s\" has been saved",
"ui_texts": "Saved changes to UI texts", "ui_texts": "Saved changes to UI texts",

View File

@ -14,7 +14,7 @@
</li> </li>
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">{{ lang.admin.configuration }}</a> <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">{{ lang.admin.options }}</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><button class="dropdown-item" data-bs-target="#tab-config-dkim" aria-selected="false" aria-controls="tab-config-dkim" role="tab" data-bs-toggle="tab">{{ lang.admin.dkim_keys }}</button></li> <li><button class="dropdown-item" data-bs-target="#tab-config-dkim" aria-selected="false" aria-controls="tab-config-dkim" role="tab" data-bs-toggle="tab">{{ lang.admin.dkim_keys }}</button></li>
<li><button class="dropdown-item" data-bs-target="#tab-config-fwdhosts" aria-selected="false" aria-controls="tab-config-fwdhosts" role="tab" data-bs-toggle="tab">{{ lang.admin.forwarding_hosts }}</button></li> <li><button class="dropdown-item" data-bs-target="#tab-config-fwdhosts" aria-selected="false" aria-controls="tab-config-fwdhosts" role="tab" data-bs-toggle="tab">{{ lang.admin.forwarding_hosts }}</button></li>

View File

@ -10,8 +10,6 @@
<li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li> <li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li>
</ul> </ul>
</li> </li>
{# <li class="nav-item" role="presentation"><button class="nav-link active" aria-selected="false" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li> #}
{# <li class="nav-item" role="presentation"><button class="nav-link" aria-selected="false" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li> #}
<li class="nav-item dropdown" role="presentation"> <li class="nav-item dropdown" role="presentation">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a> <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
@ -37,7 +35,6 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="tab-content" style="padding-top:20px"> <div class="tab-content" style="padding-top:20px">
{% include 'mailbox/tab-domains.twig' %} {% include 'mailbox/tab-domains.twig' %}
{# {% include 'mailbox/tab-mailbox-defaults.twig' %} #}
{% include 'mailbox/tab-templates-domains.twig' %} {% include 'mailbox/tab-templates-domains.twig' %}
{% include 'mailbox/tab-mailboxes.twig' %} {% include 'mailbox/tab-mailboxes.twig' %}
{% include 'mailbox/tab-templates-mbox.twig' %} {% include 'mailbox/tab-templates-mbox.twig' %}

View File

@ -1,13 +0,0 @@
<div role="tabpanel" class="tab-pane fade" id="tab-mailbox-defaults" role="tabpanel" aria-labelledby="tab-mailbox-defaults">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-mailbox-defaults" data-bs-toggle="collapse" aria-controls="collapse-tab-mailbox-defaults">
{{ lang.mailbox.mailbox_defaults }} <span class="badge bg-info table-lines"></span>
</button>
<span class="d-none d-md-block">{{ lang.mailbox.mailbox_defaults }} <span class="badge bg-info table-lines"></span></span>
</div>
<div id="collapse-tab-mailbox-defaults" class="card-body collapse text-muted" data-bs-parent="#mail-content">
{{ lang.mailbox.mailbox_defaults_info }}
</div>
</div>
</div>

View File

@ -9,15 +9,22 @@
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<p class="text-muted">{{ lang.queue.info|raw }}</p>
<p class="text-muted"><b>{{ lang.queue.legend|raw }}</b></p>
<ul class="text-muted">
<li>{{ lang.queue.deliver_mail }} | {{ lang.queue.deliver_mail_legend }}</li>
<li>{{ lang.queue.unhold_mail }} | {{ lang.queue.unhold_mail_legend }}</li>
<li>{{ lang.queue.hold_mail }} | {{ lang.queue.hold_mail_legend }}</li>
</ul>
<table id="queuetable" class="table table-striped dt-responsive w-100"></table> <table id="queuetable" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-admin"> <div class="mass-actions-admin">
<div class="btn-group"> <div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="mailqitems" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a> <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="mailqitems" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a> <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu top33"> <ul class="dropdown-menu">
<li><a class="dropdown-item" data-bs-toggle="tooltip" title="postqueue -i" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"deliver"}' href="#">{{ lang.queue.queue_deliver_mail }}</a></li> <li><a class="dropdown-item" data-bs-toggle="tooltip" title="postqueue -i" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"deliver"}' href="#">{{ lang.queue.deliver_mail }}</a></li>
<li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -H" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"unhold"}' href="#">{{ lang.queue.queue_unhold_mail }}</a></li> <li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -H" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"unhold"}' href="#">{{ lang.queue.unhold_mail }}</a></li>
<li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -h" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"hold"}' href="#">{{ lang.queue.queue_hold_mail }}</a></li> <li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -h" data-action="edit_selected" data-id="mailqitems" data-api-url='edit/mailq' data-api-attr='{"action":"hold"}' href="#">{{ lang.queue.hold_mail }}</a></li>
<li><hr class="dropdown-divider"></li> <li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -d" data-action="delete_selected" data-id="mailqitems" data-api-url='delete/mailq' href="#">{{ lang.mailbox.remove }}</a></li> <li><a class="dropdown-item" data-bs-toggle="tooltip" title="postsuper -d" data-action="delete_selected" data-id="mailqitems" data-api-url='delete/mailq' href="#">{{ lang.mailbox.remove }}</a></li>
</ul> </ul>
@ -27,7 +34,7 @@
data-api-url='edit/mailq' data-api-url='edit/mailq'
data-api-attr='{"action":"flush"}' data-api-attr='{"action":"flush"}'
data-bs-toggle="tooltip" title="postqueue -f" data-bs-toggle="tooltip" title="postqueue -f"
href="#"><i class="bi bi-check-all"></i> {{ lang.queue.flush_queue }}</a> href="#"><i class="bi bi-check-all"></i> {{ lang.queue.flush }}</a>
<a class="btn btn-sm d-block d-sm-inline btn-danger" <a class="btn btn-sm d-block d-sm-inline btn-danger"
id="super_delete" id="super_delete"
data-action="edit_selected" data-action="edit_selected"
@ -35,7 +42,7 @@
data-api-url='edit/mailq' data-api-url='edit/mailq'
data-api-attr='{"action":"super_delete"}' data-api-attr='{"action":"super_delete"}'
data-bs-toggle="tooltip" title="postsuper -d ALL" data-bs-toggle="tooltip" title="postsuper -d ALL"
href="#"><i class="bi bi-trash"></i> {{ lang.queue.delete_queue }}</a> href="#"><i class="bi bi-trash"></i> {{ lang.queue.delete }}</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -76,7 +76,7 @@ services:
- clamd - clamd
rspamd-mailcow: rspamd-mailcow:
image: mailcow/rspamd:1.91 image: mailcow/rspamd:1.92
stop_grace_period: 30s stop_grace_period: 30s
depends_on: depends_on:
- dovecot-mailcow - dovecot-mailcow
@ -510,7 +510,7 @@ services:
- watchdog - watchdog
dockerapi-mailcow: dockerapi-mailcow:
image: mailcow/dockerapi:1.44 image: mailcow/dockerapi:2.0
security_opt: security_opt:
- label=disable - label=disable
restart: always restart: always