Skip to content

Commit

Permalink
add template feature for domains and mailboxes
Browse files Browse the repository at this point in the history
  • Loading branch information
FreddleSpl0it committed Nov 10, 2022
1 parent 3f40fad commit 79982e0
Show file tree
Hide file tree
Showing 39 changed files with 2,538 additions and 452 deletions.
44 changes: 22 additions & 22 deletions data/web/edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,7 @@
$template_data = ['admin' => $admin];
}
elseif (isset($_GET['domain'])) {
if ($_GET['domain'] == "defaults") {
// edit domain default settings
//$result = mailbox('get', 'domain_defaults');
//$rl = ratelimit('get', 'domain_defaults');
$result = true;
$template = 'edit/domain-defaults.twig';
$template_data = [
// 'rl' => $rl,
];
}
elseif (is_valid_domain_name($_GET["domain"]) &&
if (is_valid_domain_name($_GET["domain"]) &&
!empty($_GET["domain"])) {
// edit domain
$domain = $_GET["domain"];
Expand All @@ -69,6 +59,26 @@
];
}
}
elseif (isset($_GET["template"])){
$domain_template = mailbox('get', 'domain_templates', $_GET["template"]);
if ($domain_template){
$template_data = [
'template' => $domain_template
];
$template = 'edit/domain-templates.twig';
$result = true;
}
else {
$mailbox_template = mailbox('get', 'mailbox_templates', $_GET["template"]);
if ($mailbox_template){
$template_data = [
'template' => $mailbox_template
];
$template = 'edit/mailbox-templates.twig';
$result = true;
}
}
}
elseif (isset($_GET['oauth2client']) &&
is_numeric($_GET["oauth2client"]) &&
!empty($_GET["oauth2client"])) {
Expand All @@ -92,17 +102,7 @@
];
}
elseif (isset($_GET['mailbox'])){
if ($_GET['mailbox'] == "defaults"){
// edit mailbox default settings
// $result = mailbox('get', 'mailbox_defaults');
// $rl = ratelimit('get', 'mailbox_defaults');
$result = true;
$template = 'edit/mailbox-defaults.twig';
$template_data = [
// 'rl' => $rl,
];
}
elseif(filter_var(html_entity_decode(rawurldecode($_GET["mailbox"])), FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
if(filter_var(html_entity_decode(rawurldecode($_GET["mailbox"])), FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
// edit mailbox
$mailbox = html_entity_decode(rawurldecode($_GET["mailbox"]));
$result = mailbox('get', 'mailbox_details', $mailbox);
Expand Down
576 changes: 572 additions & 4 deletions data/web/inc/functions.mailbox.inc.php

Large diffs are not rendered by default.

101 changes: 100 additions & 1 deletion data/web/inc/init_db.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ function init_db_schema() {
try {
global $pdo;

$db_version = "25072022_2300";
$db_version = "10112022_1146";

$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
Expand Down Expand Up @@ -225,6 +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"
),
"domain" => array(
// Todo: Move some attributes to json
"cols" => array(
Expand Down Expand Up @@ -1292,6 +1308,89 @@ 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("INSERT INTO `templates` (`type`, `template`, `attributes`)
SELECT :type, :template, :attributes FROM `templates`
WHERE NOT EXISTS (
SELECT `template` FROM `templates` WHERE `template` = :template2 AND `type` = :type2
) LIMIT 1;");
$stmt->execute(array(
":type" => "domain",
":type2" => "domain",
":template" => $default_domain_template["template"],
":template2" => $default_mailbox_template["template"],
":attributes" => json_encode($default_domain_template["attributes"])
));
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
SELECT :type, :template, :attributes FROM `templates`
WHERE NOT EXISTS (
SELECT `template` FROM `templates` WHERE `template` = :template2 AND `type` = :type2
) LIMIT 1;");
$stmt->execute(array(
":type" => "mailbox",
":type2" => "mailbox",
":template" => $default_mailbox_template["template"],
":template2" => $default_mailbox_template["template"],
":attributes" => json_encode($default_mailbox_template["attributes"])
));

if (php_sapi_name() == "cli") {
echo "DB initialization completed" . PHP_EOL;
} else {
Expand Down
73 changes: 38 additions & 35 deletions data/web/js/build/014-mailcow.js
Original file line number Diff line number Diff line change
Expand Up @@ -289,37 +289,6 @@ $(document).ready(function() {
addTag(this);
}
});
function addTag(tagAddElem){
var tagboxElem = $(tagAddElem).parent();
var tagInputElem = $(tagboxElem).find(".tag-input")[0];
var tagValuesElem = $(tagboxElem).find(".tag-values")[0];

var tag = escapeHtml($(tagInputElem).val());
if (!tag) return;
var value_tags = [];
try {
value_tags = JSON.parse($(tagValuesElem).val());
} catch {}
if (!Array.isArray(value_tags)) value_tags = [];
if (value_tags.includes(tag)) return;

$('<span class="badge bg-primary tag-badge btn-badge"><i class="bi bi-tag-fill"></i> ' + tag + '</span>').insertBefore('.tag-input').click(function(){
var del_tag = unescapeHtml($(this).text());
var del_tags = [];
try {
del_tags = JSON.parse($(tagValuesElem).val());
} catch {}
if (Array.isArray(del_tags)){
del_tags.splice(del_tags.indexOf(del_tag), 1);
$(tagValuesElem).val(JSON.stringify(del_tags));
}
$(this).remove();
});

value_tags.push($(tagInputElem).val());
$(tagValuesElem).val(JSON.stringify(value_tags));
$(tagInputElem).val('');
}

// Dark Mode Loader
$('#dark-mode-toggle').click(toggleDarkMode);
Expand Down Expand Up @@ -367,13 +336,14 @@ $(document).ready(function() {
`);

localStorage.setItem("seenChangelog", Math.floor(Date.now() / 1000).toString());

new bootstrap.Modal(document.getElementById("showWhatsNewModal"), {
backdrop: 'static',
keyboard: false
}).show();
}
});

new bootstrap.Modal(document.getElementById("showWhatsNewModal"), {
backdrop: 'static',
keyboard: false
}).show();
}
}

Expand Down Expand Up @@ -408,3 +378,36 @@ $(document).ready(function() {
// https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
function escapeHtml(n){var entityMap={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;","`":"&#x60;","=":"&#x3D;"}; return String(n).replace(/[&<>"'`=\/]/g,function(n){return entityMap[n]})}
function unescapeHtml(t){var n={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#x2F;":"/","&#x60;":"`","&#x3D;":"="};return String(t).replace(/&amp;|&lt;|&gt;|&quot;|&#39;|&#x2F|&#x60|&#x3D;/g,function(t){return n[t]})}

function addTag(tagAddElem, tag = null){
var tagboxElem = $(tagAddElem).parent();
var tagInputElem = $(tagboxElem).find(".tag-input")[0];
var tagValuesElem = $(tagboxElem).find(".tag-values")[0];

if (!tag)
tag = $(tagInputElem).val();
if (!tag) return;
var value_tags = [];
try {
value_tags = JSON.parse($(tagValuesElem).val());
} catch {}
if (!Array.isArray(value_tags)) value_tags = [];
if (value_tags.includes(tag)) return;

$('<span class="badge bg-primary tag-badge btn-badge"><i class="bi bi-tag-fill"></i> ' + escapeHtml(tag) + '</span>').insertBefore('.tag-input').click(function(){
var del_tag = unescapeHtml($(this).text());
var del_tags = [];
try {
del_tags = JSON.parse($(tagValuesElem).val());
} catch {}
if (Array.isArray(del_tags)){
del_tags.splice(del_tags.indexOf(del_tag), 1);
$(tagValuesElem).val(JSON.stringify(del_tags));
}
$(this).remove();
});

value_tags.push(tag);
$(tagValuesElem).val(JSON.stringify(value_tags));
$(tagInputElem).val('');
}
11 changes: 11 additions & 0 deletions data/web/js/site/edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@ $(document).ready(function() {
$("#multiple_bookings_custom").bind("change keypress keyup blur", function() {
$('input[name=multiple_bookings]').val($("#multiple_bookings_custom").val());
});

// load tags
if ($('#tags').length){
var tagsEl = $('#tags').parent().find('.tag-values')[0];
console.log($(tagsEl).val())
var tags = JSON.parse($(tagsEl).val());
$(tagsEl).val("");

for (var i = 0; i < tags.length; i++)
addTag($('#tags'), tags[i]);
}
});

jQuery(function($){
Expand Down
Loading

0 comments on commit 79982e0

Please sign in to comment.