From 2cd0b56b143b8a2741488ae1735bf6d74253247f Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Mon, 9 Aug 2021 08:28:22 +0200 Subject: [PATCH] [Web] Various PHP 8 fixes, partly fixes #4219 --- data/web/edit.php | 766 +++++++++++----------- data/web/inc/ajax/dns_diagnostics.php | 6 +- data/web/inc/functions.dkim.inc.php | 12 +- data/web/inc/functions.fail2ban.inc.php | 4 +- data/web/inc/functions.fwdhost.inc.php | 8 +- data/web/inc/functions.inc.php | 8 +- data/web/inc/functions.mailbox.inc.php | 42 +- data/web/inc/functions.oauth2.inc.php | 26 +- data/web/inc/functions.policy.inc.php | 12 +- data/web/inc/functions.pushover.inc.php | 4 +- data/web/inc/functions.transports.inc.php | 18 +- data/web/js/site/mailbox.js | 78 +-- data/web/lang/lang.de.json | 2 + data/web/lang/lang.en.json | 14 +- data/web/mailbox.php | 30 +- 15 files changed, 524 insertions(+), 506 deletions(-) diff --git a/data/web/edit.php b/data/web/edit.php index ba582292..30d584f3 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -2,19 +2,19 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php'; $AuthUsers = array("admin", "domainadmin", "user"); if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) { - header('Location: /'); - exit(); + header('Location: /'); + exit(); } require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/header.inc.php'; ?> <div class="container"> - <div class="row"> - <div class="col-md-12"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title"><?=$lang['edit']['title'];?></h3> - </div> - <div class="panel-body"> + <div class="row"> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title"><?=$lang['edit']['title'];?></h3> + </div> + <div class="panel-body"> <?php if (isset($_SESSION['mailcow_cc_role'])) { if ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin") { @@ -460,7 +460,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { <div class="form-group"> <label class="control-label col-sm-2" for="script_data"><?=$lang['edit']['target_address'];?>:</label> <div class="col-sm-10"> - <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="bcc_rcpt" name="bcc_rcpt"><?=implode(PHP_EOL, $quota_notification_bcc['bcc_rcpts']);?></textarea> + <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="bcc_rcpt" name="bcc_rcpt"><?=implode(PHP_EOL, (array)$quota_notification_bcc['bcc_rcpts']);?></textarea> </div> </div> <div class="form-group"> @@ -623,385 +623,399 @@ if (isset($_SESSION['mailcow_cc_role'])) { $rlyhosts = relayhost('get'); if (!empty($result)) { ?> - <h4><?=$lang['edit']['mailbox'];?></h4> - <form class="form-horizontal" data-id="editmailbox" role="form" method="post"> - <input type="hidden" value="default" name="sender_acl"> - <input type="hidden" value="0" name="force_pw_update"> - <input type="hidden" value="0" name="sogo_access"> - <input type="hidden" value="0" name="protocol_access"> - <div class="form-group"> - <label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?></label> - <div class="col-sm-10"> - <input type="text" class="form-control" name="name" value="<?=htmlspecialchars($result['name'], ENT_QUOTES, 'UTF-8');?>"> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="quota"><?=$lang['edit']['quota_mb'];?> - <br><span id="quotaBadge" class="badge">max. <?=intval($result['max_new_quota'] / 1048576)?> MiB</span> - </label> - <div class="col-sm-10"> - <input type="number" name="quota" style="width:100%" min="0" max="<?=intval($result['max_new_quota'] / 1048576);?>" value="<?=intval($result['quota']) / 1048576;?>" class="form-control"> - <small class="help-block">0 = ∞</small> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="sender_acl"><?=$lang['edit']['sender_acl'];?></label> - <div class="col-sm-10"> - <select data-live-search="true" data-width="100%" style="width:100%" id="editSelectSenderACL" name="sender_acl" size="10" multiple> - <?php - $sender_acl_handles = mailbox('get', 'sender_acl_handles', $mailbox); - - foreach ($sender_acl_handles['sender_acl_domains']['ro'] as $domain): - ?> - <option data-subtext="Admin" value="<?=htmlspecialchars($domain);?>" disabled selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['sender_acl_addresses']['ro'] as $alias): - ?> - <option data-subtext="Admin" disabled selected><?=htmlspecialchars($alias);?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['fixed_sender_aliases'] as $alias): - ?> - <option data-subtext="Alias" disabled selected><?=htmlspecialchars($alias);?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['sender_acl_domains']['rw'] as $domain): - ?> - <option value="<?=htmlspecialchars($domain);?>" selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['sender_acl_domains']['selectable'] as $domain): - ?> - <option value="<?=htmlspecialchars($domain);?>"><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['sender_acl_addresses']['rw'] as $address): - ?> - <option selected><?=htmlspecialchars($address);?></option> - <?php - endforeach; - - foreach ($sender_acl_handles['sender_acl_addresses']['selectable'] as $address): - ?> - <option><?=htmlspecialchars($address);?></option> - <?php - endforeach; - - // Generated here, but used in extended_sender_acl - if (!empty($sender_acl_handles['external_sender_aliases'])) { - $ext_sender_acl = implode(', ', $sender_acl_handles['external_sender_aliases']); - } - else { - $ext_sender_acl = ''; - } - - ?> - </select> - <div id="sender_acl_disabled"><i class="bi bi-shield-exclamation"></i> <?=$lang['edit']['sender_acl_disabled'];?></div> - <small class="help-block"><?=$lang['edit']['sender_acl_info'];?></small> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="relayhost"><?=$lang['edit']['relayhost'];?></label> - <div class="col-sm-10"> - <select data-acl="<?=$_SESSION['acl']['mailbox_relayhost'];?>" data-live-search="true" id="relayhost" name="relayhost" class="form-control space20"> - <?php - foreach ($rlyhosts as $rlyhost) { - ?> - <option style="<?=($rlyhost['active'] == 1) ? '' : 'background: #ff4136; color: #fff';?>" value="<?=$rlyhost['id'];?>" <?=($result['attributes']['relayhost'] == $rlyhost['id']) ? 'selected' : null;?>>ID <?=$rlyhost['id'];?>: <?=$rlyhost['hostname'];?> (<?=$rlyhost['username'];?>)</option> - <?php - } - ?> - <option value="" <?=($result['attributes']['relayhost'] == "0" || empty($result['attributes']['relayhost'])) ? 'selected' : null;?>><?=$lang['edit']['none_inherit'];?></option> - </select> - <p class="visible-xs" style="margin: 0;padding: 0"> </p> - <small class="help-block"><?=$lang['edit']['mailbox_relayhost_info'];?></small> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2"><?=$lang['user']['quarantine_notification'];?></label> - <div class="col-sm-10"> - <div class="btn-group" data-acl="<?=$_SESSION['acl']['quarantine_notification'];?>"> - <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "never") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_notification" - data-api-url='edit/quarantine_notification' - data-api-attr='{"quarantine_notification":"never"}'><?=$lang['user']['never'];?></button> - <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "hourly") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_notification" - data-api-url='edit/quarantine_notification' - data-api-attr='{"quarantine_notification":"hourly"}'><?=$lang['user']['hourly'];?></button> - <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "daily") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_notification" - data-api-url='edit/quarantine_notification' - data-api-attr='{"quarantine_notification":"daily"}'><?=$lang['user']['daily'];?></button> - <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "weekly") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_notification" - data-api-url='edit/quarantine_notification' - data-api-attr='{"quarantine_notification":"weekly"}'><?=$lang['user']['weekly'];?></button> - <div class="clearfix visible-xs"></div> - </div> - <p class="help-block"><small><?=$lang['user']['quarantine_notification_info'];?></small></p> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2"><?=$lang['user']['quarantine_category'];?></label> - <div class="col-sm-10"> - <div class="btn-group" data-acl="<?=$_SESSION['acl']['quarantine_category'];?>"> - <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "reject") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_category" - data-api-url='edit/quarantine_category' - data-api-attr='{"quarantine_category":"reject"}'><?=$lang['user']['q_reject'];?></button> - <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "add_header") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_category" - data-api-url='edit/quarantine_category' - data-api-attr='{"quarantine_category":"add_header"}'><?=$lang['user']['q_add_header'];?></button> - <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "all") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="quarantine_category" - data-api-url='edit/quarantine_category' - data-api-attr='{"quarantine_category":"all"}'><?=$lang['user']['q_all'];?></button> - <div class="clearfix visible-xs"></div> - </div> - <p class="help-block"><small><?=$lang['user']['quarantine_category_info'];?></small></p> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="sender_acl"><?=$lang['user']['tls_policy'];?></label> - <div class="col-sm-10"> - <div class="btn-group" data-acl="<?=$_SESSION['acl']['tls_policy'];?>"> - <button type="button" class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($get_tls_policy['tls_enforce_in'] == "1") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="tls_policy" - data-api-url='edit/tls_policy' - data-api-attr='{"tls_enforce_in":<?=($get_tls_policy['tls_enforce_in'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_in'];?></button> - <button type="button" class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($get_tls_policy['tls_enforce_out'] == "1") ? "active" : null;?>" - data-action="edit_selected" - data-item="<?= htmlentities($mailbox); ?>" - data-id="tls_policy" - data-api-url='edit/tls_policy' - data-api-attr='{"tls_enforce_out":<?=($get_tls_policy['tls_enforce_out'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_out'];?></button> - <div class="clearfix visible-xs"></div> - </div> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?> (<a href="#" class="generate_password"><?=$lang['edit']['generate'];?></a>)</label> - <div class="col-sm-10"> - <input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="password" placeholder="<?=$lang['edit']['unchanged_if_empty'];?>" autocomplete="new-password"> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label> - <div class="col-sm-10"> - <input type="password" data-pwgen-field="true" class="form-control" name="password2" autocomplete="new-password"> - </div> - </div> - <div data-acl="<?=$_SESSION['acl']['extend_sender_acl'];?>" class="form-group"> - <label class="control-label col-sm-2" for="extended_sender_acl"><?=$lang['edit']['extended_sender_acl'];?></label> - <div class="col-sm-10"> - <input type="text" class="form-control" name="extended_sender_acl" value="<?=empty($ext_sender_acl) ? '' : $ext_sender_acl; ?>" placeholder="user1@example.com, user2@example.org, @example.com, ..."> - <small class="help-block"><?=$lang['edit']['extended_sender_acl_info'];?></small> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="protocol_access"><?=$lang['edit']['allowed_protocols'];?></label> - <div class="col-sm-10"> - <select data-acl="<?=$_SESSION['acl']['protocol_access'];?>" name="protocol_access" multiple class="form-control"> - <option value="imap" <?=($result['attributes']['imap_access']=="1") ? 'selected' : null;?>>IMAP</option> - <option value="pop3" <?=($result['attributes']['pop3_access']=="1") ? 'selected' : null;?>>POP3</option> - <option value="smtp" <?=($result['attributes']['smtp_access']=="1") ? 'selected' : null;?>>SMTP</option> - </select> - </div> - </div> - <div hidden data-acl="<?=$_SESSION['acl']['smtp_ip_access'];?>" class="form-group"> - <label class="control-label col-sm-2" for="allow_from_smtp"><?=$lang['edit']['allow_from_smtp'];?></label> - <div class="col-sm-10"> - <input type="text" class="form-control" name="allow_from_smtp" value="<?=empty($allow_from_smtp) ? '' : $allow_from_smtp; ?>" placeholder="1.1.1.1, 10.2.0.0/24, ..."> - <small class="help-block"><?=$lang['edit']['allow_from_smtp_info'];?></small> - </div> - </div> - <hr> - <div class="form-group"> - <div class="col-sm-offset-2 col-sm-10"> - <select name="active" class="form-control"> - <option value="1" <?=($result['active']=="1") ? 'selected' : null;?>><?=$lang['edit']['active'];?></option> - <option value="2" <?=($result['active']=="2") ? 'selected' : null;?>><?=$lang['edit']['disable_login'];?></option> - <option value="0" <?=($result['active']=="0") ? 'selected' : null;?>><?=$lang['edit']['inactive'];?></option> - </select> - </div> - </div> - <div class="form-group"> - <div class="col-sm-offset-2 col-sm-10"> - <div class="checkbox"> - <label><input type="checkbox" value="1" name="force_pw_update" <?=($result['attributes']['force_pw_update']=="1") ? "checked" : null;?>> <?=$lang['edit']['force_pw_update'];?></label> - <small class="help-block"><?=sprintf($lang['edit']['force_pw_update_info'], $UI_TEXTS['main_name']);?></small> - </div> - </div> - </div> - <?php if (getenv('SKIP_SOGO') != "y") { ?> - <div data-acl="<?=$_SESSION['acl']['sogo_access'];?>" class="form-group"> - <div class="col-sm-offset-2 col-sm-10"> - <div class="checkbox"> - <label><input type="checkbox" value="1" name="sogo_access" <?=($result['attributes']['sogo_access']=="1") ? "checked" : null;?>> <?=$lang['edit']['sogo_access'];?></label> - <small class="help-block"><?=$lang['edit']['sogo_access_info'];?></small> - </div> - </div> - </div> - <?php } ?> - <div class="form-group"> - <div class="col-sm-offset-2 col-sm-10"> - <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-success" data-action="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> - </div> - </div> - </form> + <ul class="nav nav-tabs responsive-tabs" role="tablist"> + <li class="active"><a data-toggle="tab" href="#medit"><?=$lang['edit']['mailbox'];?></a></li> + <li><a data-toggle="tab" href="#mpushover"><?=$lang['edit']['pushover'];?></a></li> + <li><a data-toggle="tab" href="#macl"><?=$lang['edit']['acl'];?></a></li> + <li><a data-toggle="tab" href="#mrl"><?=$lang['edit']['ratelimit'];?></a></li> + </ul> <hr> - <form data-id="pushover" class="form well" method="post"> - <input type="hidden" value="0" name="evaluate_x_prio"> - <input type="hidden" value="0" name="only_x_prio"> - <input type="hidden" value="0" name="active"> - <div class="row"> - <div class="col-sm-1"> - <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p> - </div> - <div class="col-sm-10"> - <p class="help-block"><?=sprintf($lang['edit']['pushover_info'], $mailbox);?></p> - <p class="help-block"><?=$lang['edit']['pushover_vars'];?>: <code>{SUBJECT}</code>, <code>{SENDER}</code></p> + <div class="tab-content"> + <div id="medit" class="tab-pane in active"> + <form class="form-horizontal" data-id="editmailbox" role="form" method="post"> + <input type="hidden" value="default" name="sender_acl"> + <input type="hidden" value="0" name="force_pw_update"> + <input type="hidden" value="0" name="sogo_access"> + <input type="hidden" value="0" name="protocol_access"> <div class="form-group"> - <div class="row"> - <div class="col-sm-6"> - <div class="form-group"> - <label for="token">API Token/Key (Application)</label> - <input type="text" class="form-control" name="token" maxlength="30" value="<?=$pushover_data['token'];?>" required> - </div> + <label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?></label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="name" value="<?=htmlspecialchars($result['name'], ENT_QUOTES, 'UTF-8');?>"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="quota"><?=$lang['edit']['quota_mb'];?> + <br><span id="quotaBadge" class="badge">max. <?=intval($result['max_new_quota'] / 1048576)?> MiB</span> + </label> + <div class="col-sm-10"> + <input type="number" name="quota" style="width:100%" min="0" max="<?=intval($result['max_new_quota'] / 1048576);?>" value="<?=intval($result['quota']) / 1048576;?>" class="form-control"> + <small class="help-block">0 = ∞</small> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="sender_acl"><?=$lang['edit']['sender_acl'];?></label> + <div class="col-sm-10"> + <select data-live-search="true" data-width="100%" style="width:100%" id="editSelectSenderACL" name="sender_acl" size="10" multiple> + <?php + $sender_acl_handles = mailbox('get', 'sender_acl_handles', $mailbox); + + foreach ($sender_acl_handles['sender_acl_domains']['ro'] as $domain): + ?> + <option data-subtext="Admin" value="<?=htmlspecialchars($domain);?>" disabled selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['sender_acl_addresses']['ro'] as $alias): + ?> + <option data-subtext="Admin" disabled selected><?=htmlspecialchars($alias);?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['fixed_sender_aliases'] as $alias): + ?> + <option data-subtext="Alias" disabled selected><?=htmlspecialchars($alias);?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['sender_acl_domains']['rw'] as $domain): + ?> + <option value="<?=htmlspecialchars($domain);?>" selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['sender_acl_domains']['selectable'] as $domain): + ?> + <option value="<?=htmlspecialchars($domain);?>"><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['sender_acl_addresses']['rw'] as $address): + ?> + <option selected><?=htmlspecialchars($address);?></option> + <?php + endforeach; + + foreach ($sender_acl_handles['sender_acl_addresses']['selectable'] as $address): + ?> + <option><?=htmlspecialchars($address);?></option> + <?php + endforeach; + + // Generated here, but used in extended_sender_acl + if (!empty($sender_acl_handles['external_sender_aliases'])) { + $ext_sender_acl = implode(', ', $sender_acl_handles['external_sender_aliases']); + } + else { + $ext_sender_acl = ''; + } + + ?> + </select> + <div id="sender_acl_disabled"><i class="bi bi-shield-exclamation"></i> <?=$lang['edit']['sender_acl_disabled'];?></div> + <small class="help-block"><?=$lang['edit']['sender_acl_info'];?></small> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="relayhost"><?=$lang['edit']['relayhost'];?></label> + <div class="col-sm-10"> + <select data-acl="<?=$_SESSION['acl']['mailbox_relayhost'];?>" data-live-search="true" id="relayhost" name="relayhost" class="form-control space20"> + <?php + foreach ($rlyhosts as $rlyhost) { + ?> + <option style="<?=($rlyhost['active'] == 1) ? '' : 'background: #ff4136; color: #fff';?>" value="<?=$rlyhost['id'];?>" <?=($result['attributes']['relayhost'] == $rlyhost['id']) ? 'selected' : null;?>>ID <?=$rlyhost['id'];?>: <?=$rlyhost['hostname'];?> (<?=$rlyhost['username'];?>)</option> + <?php + } + ?> + <option value="" <?=($result['attributes']['relayhost'] == "0" || empty($result['attributes']['relayhost'])) ? 'selected' : null;?>><?=$lang['edit']['none_inherit'];?></option> + </select> + <p class="visible-xs" style="margin: 0;padding: 0"> </p> + <small class="help-block"><?=$lang['edit']['mailbox_relayhost_info'];?></small> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2"><?=$lang['user']['quarantine_notification'];?></label> + <div class="col-sm-10"> + <div class="btn-group" data-acl="<?=$_SESSION['acl']['quarantine_notification'];?>"> + <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "never") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_notification" + data-api-url='edit/quarantine_notification' + data-api-attr='{"quarantine_notification":"never"}'><?=$lang['user']['never'];?></button> + <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "hourly") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_notification" + data-api-url='edit/quarantine_notification' + data-api-attr='{"quarantine_notification":"hourly"}'><?=$lang['user']['hourly'];?></button> + <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "daily") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_notification" + data-api-url='edit/quarantine_notification' + data-api-attr='{"quarantine_notification":"daily"}'><?=$lang['user']['daily'];?></button> + <button type="button" class="btn btn-sm btn-xs-quart visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_notification == "weekly") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_notification" + data-api-url='edit/quarantine_notification' + data-api-attr='{"quarantine_notification":"weekly"}'><?=$lang['user']['weekly'];?></button> + <div class="clearfix visible-xs"></div> + </div> + <p class="help-block"><small><?=$lang['user']['quarantine_notification_info'];?></small></p> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2"><?=$lang['user']['quarantine_category'];?></label> + <div class="col-sm-10"> + <div class="btn-group" data-acl="<?=$_SESSION['acl']['quarantine_category'];?>"> + <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "reject") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_category" + data-api-url='edit/quarantine_category' + data-api-attr='{"quarantine_category":"reject"}'><?=$lang['user']['q_reject'];?></button> + <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "add_header") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_category" + data-api-url='edit/quarantine_category' + data-api-attr='{"quarantine_category":"add_header"}'><?=$lang['user']['q_add_header'];?></button> + <button type="button" class="btn btn-sm btn-xs-third visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($quarantine_category == "all") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="quarantine_category" + data-api-url='edit/quarantine_category' + data-api-attr='{"quarantine_category":"all"}'><?=$lang['user']['q_all'];?></button> + <div class="clearfix visible-xs"></div> + </div> + <p class="help-block"><small><?=$lang['user']['quarantine_category_info'];?></small></p> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="sender_acl"><?=$lang['user']['tls_policy'];?></label> + <div class="col-sm-10"> + <div class="btn-group" data-acl="<?=$_SESSION['acl']['tls_policy'];?>"> + <button type="button" class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($get_tls_policy['tls_enforce_in'] == "1") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="tls_policy" + data-api-url='edit/tls_policy' + data-api-attr='{"tls_enforce_in":<?=($get_tls_policy['tls_enforce_in'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_in'];?></button> + <button type="button" class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default <?=($get_tls_policy['tls_enforce_out'] == "1") ? "active" : null;?>" + data-action="edit_selected" + data-item="<?= htmlentities($mailbox); ?>" + data-id="tls_policy" + data-api-url='edit/tls_policy' + data-api-attr='{"tls_enforce_out":<?=($get_tls_policy['tls_enforce_out'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_out'];?></button> + <div class="clearfix visible-xs"></div> </div> - <div class="col-sm-6"> - <div class="form-group"> - <label for="key">User/Group Key</label> - <input type="text" class="form-control" name="key" maxlength="30" value="<?=$pushover_data['key'];?>" required> - </div> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?> (<a href="#" class="generate_password"><?=$lang['edit']['generate'];?></a>)</label> + <div class="col-sm-10"> + <input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="password" placeholder="<?=$lang['edit']['unchanged_if_empty'];?>" autocomplete="new-password"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label> + <div class="col-sm-10"> + <input type="password" data-pwgen-field="true" class="form-control" name="password2" autocomplete="new-password"> + </div> + </div> + <div data-acl="<?=$_SESSION['acl']['extend_sender_acl'];?>" class="form-group"> + <label class="control-label col-sm-2" for="extended_sender_acl"><?=$lang['edit']['extended_sender_acl'];?></label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="extended_sender_acl" value="<?=empty($ext_sender_acl) ? '' : $ext_sender_acl; ?>" placeholder="user1@example.com, user2@example.org, @example.com, ..."> + <small class="help-block"><?=$lang['edit']['extended_sender_acl_info'];?></small> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="protocol_access"><?=$lang['edit']['allowed_protocols'];?></label> + <div class="col-sm-10"> + <select data-acl="<?=$_SESSION['acl']['protocol_access'];?>" name="protocol_access" multiple class="form-control"> + <option value="imap" <?=($result['attributes']['imap_access']=="1") ? 'selected' : null;?>>IMAP</option> + <option value="pop3" <?=($result['attributes']['pop3_access']=="1") ? 'selected' : null;?>>POP3</option> + <option value="smtp" <?=($result['attributes']['smtp_access']=="1") ? 'selected' : null;?>>SMTP</option> + </select> + </div> + </div> + <div hidden data-acl="<?=$_SESSION['acl']['smtp_ip_access'];?>" class="form-group"> + <label class="control-label col-sm-2" for="allow_from_smtp"><?=$lang['edit']['allow_from_smtp'];?></label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="allow_from_smtp" value="<?=empty($allow_from_smtp) ? '' : $allow_from_smtp; ?>" placeholder="1.1.1.1, 10.2.0.0/24, ..."> + <small class="help-block"><?=$lang['edit']['allow_from_smtp_info'];?></small> + </div> + </div> + <hr> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <select name="active" class="form-control"> + <option value="1" <?=($result['active']=="1") ? 'selected' : null;?>><?=$lang['edit']['active'];?></option> + <option value="2" <?=($result['active']=="2") ? 'selected' : null;?>><?=$lang['edit']['disable_login'];?></option> + <option value="0" <?=($result['active']=="0") ? 'selected' : null;?>><?=$lang['edit']['inactive'];?></option> + </select> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <div class="checkbox"> + <label><input type="checkbox" value="1" name="force_pw_update" <?=($result['attributes']['force_pw_update']=="1") ? "checked" : null;?>> <?=$lang['edit']['force_pw_update'];?></label> + <small class="help-block"><?=sprintf($lang['edit']['force_pw_update_info'], $UI_TEXTS['main_name']);?></small> </div> - <div class="col-sm-6"> - <div class="form-group"> - <label for="title"><?=$lang['edit']['pushover_title'];?></label> - <input type="text" class="form-control" name="title" value="<?=$pushover_data['title'];?>" placeholder="Mail"> - </div> + </div> + </div> + <?php if (getenv('SKIP_SOGO') != "y") { ?> + <div data-acl="<?=$_SESSION['acl']['sogo_access'];?>" class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <div class="checkbox"> + <label><input type="checkbox" value="1" name="sogo_access" <?=($result['attributes']['sogo_access']=="1") ? "checked" : null;?>> <?=$lang['edit']['sogo_access'];?></label> + <small class="help-block"><?=$lang['edit']['sogo_access_info'];?></small> </div> - <div class="col-sm-6"> - <div class="form-group"> - <label for="text"><?=$lang['edit']['pushover_text'];?></label> - <input type="text" class="form-control" name="text" value="<?=$pushover_data['text'];?>" placeholder="You've got mail 📧"> - </div> - </div> - <div class="col-sm-12"> - <div class="form-group"> - <label for="text"><?=$lang['edit']['pushover_sender_array'];?></label> - <input type="text" class="form-control" name="senders" value="<?=$pushover_data['senders'];?>" placeholder="sender1@example.com, sender2@example.com"> - </div> - </div> - <div class="col-sm-12"> - <div class="checkbox"> - <label><input type="checkbox" value="1" name="active" <?=($pushover_data['active']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label> - </div> - </div> - <div class="col-sm-12"> - <legend style="cursor:pointer;margin-top:10px" data-target="#po_advanced" unselectable="on" data-toggle="collapse"> - <i class="bi bi-plus"></i> <?=$lang['edit']['advanced_settings'];?> - </legend> - </div> - <div class="col-sm-12"> - <div id="po_advanced" class="collapse"> - <div class="form-group"> - <label for="text"><?=$lang['edit']['pushover_sender_regex'];?></label> - <input type="text" class="form-control" name="senders_regex" value="<?=$pushover_data['senders_regex'];?>" placeholder="/(.*@example\.org$|^foo@example\.com$)/i" regex="true"> - <div class="checkbox"> - <label><input type="checkbox" value="1" name="evaluate_x_prio" <?=($pushover_data['attributes']['evaluate_x_prio']=="1") ? "checked" : null;?>> <?=$lang['edit']['pushover_evaluate_x_prio'];?></label> + </div> + </div> + <?php } ?> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-success" data-action="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> + </div> + </div> + </form> + </div> + <div id="mpushover" class="tab-pane"> + <form data-id="pushover" class="form well" method="post"> + <input type="hidden" value="0" name="evaluate_x_prio"> + <input type="hidden" value="0" name="only_x_prio"> + <input type="hidden" value="0" name="active"> + <div class="row"> + <div class="col-sm-1"> + <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p> + </div> + <div class="col-sm-10"> + <p class="help-block"><?=sprintf($lang['edit']['pushover_info'], $mailbox);?></p> + <p class="help-block"><?=$lang['edit']['pushover_vars'];?>: <code>{SUBJECT}</code>, <code>{SENDER}</code></p> + <div class="form-group"> + <div class="row"> + <div class="col-sm-6"> + <div class="form-group"> + <label for="token">API Token/Key (Application)</label> + <input type="text" class="form-control" name="token" maxlength="30" value="<?=$pushover_data['token'];?>" required> </div> + </div> + <div class="col-sm-6"> + <div class="form-group"> + <label for="key">User/Group Key</label> + <input type="text" class="form-control" name="key" maxlength="30" value="<?=$pushover_data['key'];?>" required> + </div> + </div> + <div class="col-sm-6"> + <div class="form-group"> + <label for="title"><?=$lang['edit']['pushover_title'];?></label> + <input type="text" class="form-control" name="title" value="<?=$pushover_data['title'];?>" placeholder="Mail"> + </div> + </div> + <div class="col-sm-6"> + <div class="form-group"> + <label for="text"><?=$lang['edit']['pushover_text'];?></label> + <input type="text" class="form-control" name="text" value="<?=$pushover_data['text'];?>" placeholder="You've got mail 📧"> + </div> + </div> + <div class="col-sm-12"> + <div class="form-group"> + <label for="text"><?=$lang['edit']['pushover_sender_array'];?></label> + <input type="text" class="form-control" name="senders" value="<?=$pushover_data['senders'];?>" placeholder="sender1@example.com, sender2@example.com"> + </div> + </div> + <div class="col-sm-12"> <div class="checkbox"> - <label><input type="checkbox" value="1" name="only_x_prio" <?=($pushover_data['attributes']['only_x_prio']=="1") ? "checked" : null;?>> <?=$lang['edit']['pushover_only_x_prio'];?></label> + <label><input type="checkbox" value="1" name="active" <?=($pushover_data['active']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label> + </div> + </div> + <div class="col-sm-12"> + <legend style="cursor:pointer;margin-top:10px" data-target="#po_advanced" unselectable="on" data-toggle="collapse"> + <i class="bi bi-plus"></i> <?=$lang['edit']['advanced_settings'];?> + </legend> + </div> + <div class="col-sm-12"> + <div id="po_advanced" class="collapse"> + <div class="form-group"> + <label for="text"><?=$lang['edit']['pushover_sender_regex'];?></label> + <input type="text" class="form-control" name="senders_regex" value="<?=$pushover_data['senders_regex'];?>" placeholder="/(.*@example\.org$|^foo@example\.com$)/i" regex="true"> + <div class="checkbox"> + <label><input type="checkbox" value="1" name="evaluate_x_prio" <?=($pushover_data['attributes']['evaluate_x_prio']=="1") ? "checked" : null;?>> <?=$lang['edit']['pushover_evaluate_x_prio'];?></label> + </div> + <div class="checkbox"> + <label><input type="checkbox" value="1" name="only_x_prio" <?=($pushover_data['attributes']['only_x_prio']=="1") ? "checked" : null;?>> <?=$lang['edit']['pushover_only_x_prio'];?></label> + </div> + </div> </div> </div> </div> </div> + <div class="btn-group" data-acl="<?=$_SESSION['acl']['pushover'];?>"> + <a class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="pushover" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></a> + <a class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="pushover-test" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover-test' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> <?=$lang['edit']['pushover_verify'];?></a> + <div class="clearfix visible-xs"></div> + <a id="pushover_delete" class="btn btn-sm visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-danger" data-action="edit_selected" data-id="pushover-delete" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover' data-api-attr='{"delete":"true"}' href="#"><i class="bi bi-trash"></i> <?=$lang['edit']['remove'];?></a> + </div> </div> </div> - <div class="btn-group" data-acl="<?=$_SESSION['acl']['pushover'];?>"> - <a class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="pushover" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></a> - <a class="btn btn-sm btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="pushover-test" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover-test' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> <?=$lang['edit']['pushover_verify'];?></a> - <div class="clearfix visible-xs"></div> - <a id="pushover_delete" class="btn btn-sm visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-danger" data-action="edit_selected" data-id="pushover-delete" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/pushover' data-api-attr='{"delete":"true"}' href="#"><i class="bi bi-trash"></i> <?=$lang['edit']['remove'];?></a> - </div> - </div> + </form> </div> - </form> - <hr> - <form data-id="mboxratelimit" class="form-inline well" method="post"> - <div class="row"> - <div class="col-sm-1"> - <p class="help-block"><?=$lang['acl']['ratelimit'];?></p> - </div> - <div class="col-sm-10"> - <div class="form-group"> - <input name="rl_value" type="number" autocomplete="off" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="<?=$lang['ratelimit']['disabled']?>"> + <div id="macl" class="tab-pane"> + <form data-id="useracl" class="form-inline well" method="post"> + <div class="row"> + <div class="col-sm-1"> + <p class="help-block">ACL</p> + </div> + <div class="col-sm-10"> + <div class="form-group"> + <select id="user_acl" name="user_acl" size="10" multiple> + <?php + $user_acls = acl('get', 'user', $mailbox); + foreach ($user_acls as $acl => $val): + ?> + <option value="<?=$acl;?>" <?=($val == 1) ? 'selected' : null;?>><?=$lang['acl'][$acl];?></option> + <?php + endforeach; + ?> + </select> + </div> + <div class="form-group"> + <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="useracl" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/user-acl' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> + </div> + </div> </div> - <div class="form-group"> - <select name="rl_frame" class="form-control"> - <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>><?=$lang['ratelimit']['second']?></option> - <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>><?=$lang['ratelimit']['minute']?></option> - <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>><?=$lang['ratelimit']['hour']?></option> - <option value="d" <?=(isset($rl['frame']) && $rl['frame'] == 'd') ? 'selected' : null;?>><?=$lang['ratelimit']['day']?></option> - </select> - </div> - <div class="form-group"> - <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="mboxratelimit" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/rl-mbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> - </div> - <p class="help-block"><?=$lang['edit']['mbox_rl_info'];?></p> - </div> + </form> </div> - </form> - <form data-id="useracl" class="form-inline well" method="post"> - <div class="row"> - <div class="col-sm-1"> - <p class="help-block">ACL</p> - </div> - <div class="col-sm-10"> - <div class="form-group"> - <select id="user_acl" name="user_acl" size="10" multiple> - <?php - $user_acls = acl('get', 'user', $mailbox); - foreach ($user_acls as $acl => $val): - ?> - <option value="<?=$acl;?>" <?=($val == 1) ? 'selected' : null;?>><?=$lang['acl'][$acl];?></option> - <?php - endforeach; - ?> - </select> + <div id="mrl" class="tab-pane"> + <form data-id="mboxratelimit" class="form-inline well" method="post"> + <div class="row"> + <div class="col-sm-1"> + <p class="help-block"><?=$lang['acl']['ratelimit'];?></p> + </div> + <div class="col-sm-10"> + <div class="form-group"> + <input name="rl_value" type="number" autocomplete="off" value="<?=(!empty($rl['value'])) ? $rl['value'] : null;?>" class="form-control" placeholder="<?=$lang['ratelimit']['disabled']?>"> + </div> + <div class="form-group"> + <select name="rl_frame" class="form-control"> + <option value="s" <?=(isset($rl['frame']) && $rl['frame'] == 's') ? 'selected' : null;?>><?=$lang['ratelimit']['second']?></option> + <option value="m" <?=(isset($rl['frame']) && $rl['frame'] == 'm') ? 'selected' : null;?>><?=$lang['ratelimit']['minute']?></option> + <option value="h" <?=(isset($rl['frame']) && $rl['frame'] == 'h') ? 'selected' : null;?>><?=$lang['ratelimit']['hour']?></option> + <option value="d" <?=(isset($rl['frame']) && $rl['frame'] == 'd') ? 'selected' : null;?>><?=$lang['ratelimit']['day']?></option> + </select> + </div> + <div class="form-group"> + <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="mboxratelimit" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/rl-mbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> + </div> + <p class="help-block"><?=$lang['edit']['mbox_rl_info'];?></p> + </div> </div> - <div class="form-group"> - <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" data-action="edit_selected" data-id="useracl" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/user-acl' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> - </div> - </div> + </form> </div> - </form> + </div> <?php } } @@ -1601,14 +1615,14 @@ if (isset($_SESSION['mailcow_cc_role'])) { } else { ?> - <div class="alert alert-danger" role="alert"><?=$lang['danger']['access_denied'];?></div> + <div class="alert alert-danger" role="alert"><?=$lang['danger']['access_denied'];?></div> <?php } ?> - </div> - </div> - </div> - </div> + </div> + </div> + </div> + </div> <a href="<?=$_SESSION['return_to'];?>">← <?=$lang['edit']['previous'];?></a> </div> <!-- /container --> <script type='text/javascript'> diff --git a/data/web/inc/ajax/dns_diagnostics.php b/data/web/inc/ajax/dns_diagnostics.php index 2d2eda7f..a315680c 100644 --- a/data/web/inc/ajax/dns_diagnostics.php +++ b/data/web/inc/ajax/dns_diagnostics.php @@ -268,9 +268,9 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm $currents = dns_get_record($record[0], 52, $_, $_, TRUE); foreach ($currents as &$current) { $current['type'] = 'TLSA'; - $current['cert_usage'] = hexdec(bin2hex($current['data']{0})); - $current['selector'] = hexdec(bin2hex($current['data']{1})); - $current['match_type'] = hexdec(bin2hex($current['data']{2})); + $current['cert_usage'] = hexdec(bin2hex($current['data'][0])); + $current['selector'] = hexdec(bin2hex($current['data'][1])); + $current['match_type'] = hexdec(bin2hex($current['data'][2])); $current['cert_data'] = bin2hex(substr($current['data'], 3)); $current['data'] = $current['cert_usage'] . ' ' . $current['selector'] . ' ' . $current['match_type'] . ' ' . $current['cert_data']; } diff --git a/data/web/inc/functions.dkim.inc.php b/data/web/inc/functions.dkim.inc.php index f6b2055a..7ca463a3 100644 --- a/data/web/inc/functions.dkim.inc.php +++ b/data/web/inc/functions.dkim.inc.php @@ -1,8 +1,8 @@ <?php function dkim($_action, $_data = null, $privkey = false) { - global $redis; - global $lang; + global $redis; + global $lang; switch ($_action) { case 'add': if ($_SESSION['mailcow_cc_role'] != "admin") { @@ -13,7 +13,7 @@ function dkim($_action, $_data = null, $privkey = false) { ); return false; } - $key_length = intval($_data['key_size']); + $key_length = intval($_data['key_size']); $dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim'; $domains = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['domains'])); $domains = array_filter($domains); @@ -167,9 +167,9 @@ function dkim($_action, $_data = null, $privkey = false) { array_shift($pem_public_key_array); array_pop($pem_public_key_array); // Implode as single string - $pem_public_key = implode('', $pem_public_key_array); + $pem_public_key = implode('', (array)$pem_public_key_array); $dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim'; - $domain = $_data['domain']; + $domain = $_data['domain']; if (!is_valid_domain_name($domain)) { $_SESSION['return'][] = array( 'type' => 'danger', @@ -251,7 +251,7 @@ function dkim($_action, $_data = null, $privkey = false) { } if ($GLOBALS['SPLIT_DKIM_255'] === true) { $dkim_txt_tmp = str_split('v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data, 255); - $dkimdata['dkim_txt'] = sprintf('"%s"', implode('" "', $dkim_txt_tmp ) ); + $dkimdata['dkim_txt'] = sprintf('"%s"', implode('" "', (array)$dkim_txt_tmp ) ); } else { $dkimdata['dkim_txt'] = 'v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data; diff --git a/data/web/inc/functions.fail2ban.inc.php b/data/web/inc/functions.fail2ban.inc.php index 1e94aadf..2a7f11e8 100644 --- a/data/web/inc/functions.fail2ban.inc.php +++ b/data/web/inc/functions.fail2ban.inc.php @@ -18,7 +18,7 @@ function fail2ban($_action, $_data = null) { } if (isset($tmp_wl_data)) { natsort($tmp_wl_data); - $f2b_options['whitelist'] = implode(PHP_EOL, $tmp_wl_data); + $f2b_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data); } else { $f2b_options['whitelist'] = ""; @@ -34,7 +34,7 @@ function fail2ban($_action, $_data = null) { } if (isset($tmp_bl_data)) { natsort($tmp_bl_data); - $f2b_options['blacklist'] = implode(PHP_EOL, $tmp_bl_data); + $f2b_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data); } else { $f2b_options['blacklist'] = ""; diff --git a/data/web/inc/functions.fwdhost.inc.php b/data/web/inc/functions.fwdhost.inc.php index 5c511f4f..d7ac2567 100644 --- a/data/web/inc/functions.fwdhost.inc.php +++ b/data/web/inc/functions.fwdhost.inc.php @@ -1,8 +1,8 @@ <?php function fwdhost($_action, $_data = null) { require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/spf.inc.php'; - global $redis; - global $lang; + global $redis; + global $lang; $_data_log = $_data; switch ($_action) { case 'add': @@ -57,7 +57,7 @@ function fwdhost($_action, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts))) + 'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', (array)$hosts))) ); break; case 'edit': @@ -180,4 +180,4 @@ function fwdhost($_action, $_data = null) { return $fwdhostdetails; break; } -} \ No newline at end of file +} diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index 65c7ab1d..c6642418 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -201,7 +201,7 @@ function password_complexity($_action, $_data = null) { $policy_text[] = sprintf($lang['admin']["password_policy_$name"], $value); } } - return '<p class="help-block small">- ' . implode('<br>- ', $policy_text) . '</p>'; + return '<p class="help-block small">- ' . implode('<br>- ', (array)$policy_text) . '</p>'; break; } } @@ -982,8 +982,8 @@ function edit_user_account($_data) { return false; } if (!empty($_data['user_new_pass']) && !empty($_data['user_new_pass2'])) { - $password_new = $_data['user_new_pass']; - $password_new2 = $_data['user_new_pass2']; + $password_new = $_data['user_new_pass']; + $password_new2 = $_data['user_new_pass2']; if (password_check($password_new, $password_new2) !== true) { return false; } @@ -1010,7 +1010,7 @@ function user_get_alias_details($username) { $data['direct_aliases'] = array(); $data['shared_aliases'] = array(); if ($_SESSION['mailcow_cc_role'] == "user") { - $username = $_SESSION['mailcow_cc_username']; + $username = $_SESSION['mailcow_cc_username']; } if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { return false; diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index c2654319..24e5dabf 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -448,17 +448,17 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); return false; } - $domain = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46); + $domain = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46); $description = $_data['description']; if (empty($description)) { $description = $domain; } - $aliases = (int)$_data['aliases']; + $aliases = (int)$_data['aliases']; $mailboxes = (int)$_data['mailboxes']; - $defquota = (int)$_data['defquota']; - $maxquota = (int)$_data['maxquota']; + $defquota = (int)$_data['defquota']; + $maxquota = (int)$_data['maxquota']; $restart_sogo = (int)$_data['restart_sogo']; - $quota = (int)$_data['quota']; + $quota = (int)$_data['quota']; if ($defquota > $maxquota) { $_SESSION['return'][] = array( 'type' => 'danger', @@ -683,7 +683,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $gotos = array_unique($gotos); $gotos = array_filter($gotos); if (empty($gotos)) { return false; } - $goto = implode(",", $gotos); + $goto = implode(",", (array)$gotos); } foreach ($addresses as $address) { if (empty($address)) { @@ -936,7 +936,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $password = $_data['password']; $password2 = $_data['password2']; $name = ltrim(rtrim($_data['name'], '>'), '<'); - $quota_m = intval($_data['quota']); + $quota_m = intval($_data['quota']); if ((!isset($_SESSION['acl']['unlimited_quota']) || $_SESSION['acl']['unlimited_quota'] != "1") && $quota_m === 0) { $_SESSION['return'][] = array( 'type' => 'danger', @@ -959,7 +959,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $relayhost = (isset($_data['relayhost'])) ? intval($_data['relayhost']) : 0; $quarantine_notification = (isset($_data['quarantine_notification'])) ? strval($_data['quarantine_notification']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']); $quarantine_category = (isset($_data['quarantine_category'])) ? strval($_data['quarantine_category']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_category']); - $quota_b = ($quota_m * 1048576); + $quota_b = ($quota_m * 1048576); $mailbox_attrs = json_encode( array( 'force_pw_update' => strval($force_pw_update), @@ -1494,8 +1494,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); continue; } - $lowspamlevel = explode(',', $_data['spam_score'])[0]; - $highspamlevel = explode(',', $_data['spam_score'])[1]; + $lowspamlevel = explode(',', $_data['spam_score'])[0]; + $highspamlevel = explode(',', $_data['spam_score'])[1]; if (!is_numeric($lowspamlevel) || !is_numeric($highspamlevel)) { $_SESSION['return'][] = array( 'type' => 'danger', @@ -1572,7 +1572,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr), - 'msg' => array('mailbox_modified', htmlspecialchars(implode(', ', $usernames))) + 'msg' => array('mailbox_modified', htmlspecialchars(implode(', ', (array)$usernames))) ); } break; @@ -2080,7 +2080,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { } $gotos = array_unique($gotos); $gotos = array_filter($gotos); - $goto = implode(",", $gotos); + $goto = implode(",", (array)$gotos); } if (!empty($goto)) { $stmt = $pdo->prepare("UPDATE `alias` SET @@ -3002,7 +3002,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { while($field = array_shift($fields)) { $shown_fields[] = $field['Field']; } - $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ", + $stmt = $pdo->prepare("SELECT " . implode(',', (array)$shown_fields) . ", `active` FROM `imapsync` WHERE id = :id"); } @@ -3017,7 +3017,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { while($field = array_shift($fields)) { $shown_fields[] = $field['Field']; } - $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ", + $stmt = $pdo->prepare("SELECT " . implode(',', (array)$shown_fields) . ", `active` FROM `imapsync` WHERE id = :id"); } @@ -3399,7 +3399,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt->execute(array(':domain' => $row['domain'])); $SumQuotaInUse = $stmt->fetch(PDO::FETCH_ASSOC); $rl = ratelimit('get', 'domain', $_data); - $domaindata['max_new_mailbox_quota'] = ($row['quota'] * 1048576) - $MailboxDataDomain['in_use']; + $domaindata['max_new_mailbox_quota'] = ($row['quota'] * 1048576) - $MailboxDataDomain['in_use']; if ($domaindata['max_new_mailbox_quota'] > ($row['maxquota'] * 1048576)) { $domaindata['max_new_mailbox_quota'] = ($row['maxquota'] * 1048576); } @@ -3421,7 +3421,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $domaindata['msgs_total'] = 0; } $domaindata['mboxes_in_domain'] = $MailboxDataDomain['count']; - $domaindata['mboxes_left'] = $row['mailboxes'] - $MailboxDataDomain['count']; + $domaindata['mboxes_left'] = $row['mailboxes'] - $MailboxDataDomain['count']; $domaindata['domain_name'] = $row['domain']; $domaindata['description'] = $row['description']; $domaindata['max_num_aliases_for_domain'] = $row['aliases']; @@ -3452,7 +3452,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { )); $AliasDataDomain = $stmt->fetch(PDO::FETCH_ASSOC); (isset($AliasDataDomain['alias_count'])) ? $domaindata['aliases_in_domain'] = $AliasDataDomain['alias_count'] : $domaindata['aliases_in_domain'] = "0"; - $domaindata['aliases_left'] = $row['aliases'] - $AliasDataDomain['alias_count']; + $domaindata['aliases_left'] = $row['aliases'] - $AliasDataDomain['alias_count']; if ($_SESSION['mailcow_cc_role'] == "admin") { $stmt = $pdo->prepare("SELECT GROUP_CONCAT(`username` SEPARATOR ', ') AS domain_admins FROM `domain_admins` WHERE `domain` = :domain"); @@ -3577,10 +3577,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $PushoverActive = $stmt->fetch(PDO::FETCH_ASSOC); $stmt = $pdo->prepare("SELECT COALESCE(SUM(`quota`), 0) as `in_use` FROM `mailbox` WHERE (`kind` = '' OR `kind` = NULL) AND `domain` = :domain AND `username` != :username"); $stmt->execute(array(':domain' => $row['domain'], ':username' => $_data)); - $MailboxUsage = $stmt->fetch(PDO::FETCH_ASSOC); + $MailboxUsage = $stmt->fetch(PDO::FETCH_ASSOC); $stmt = $pdo->prepare("SELECT IFNULL(COUNT(`address`), 0) AS `sa_count` FROM `spamalias` WHERE `goto` = :address AND `validity` >= :unixnow"); $stmt->execute(array(':address' => $_data, ':unixnow' => time())); - $SpamaliasUsage = $stmt->fetch(PDO::FETCH_ASSOC); + $SpamaliasUsage = $stmt->fetch(PDO::FETCH_ASSOC); $mailboxdata['max_new_quota'] = ($DomainQuota['quota'] * 1048576) - $MailboxUsage['in_use']; $mailboxdata['spam_aliases'] = $SpamaliasUsage['sa_count']; $mailboxdata['pushover_active'] = ($PushoverActive['pushover_active'] == 1) ? 1 : 0; @@ -3877,7 +3877,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); continue; } - $domain = idn_to_ascii(strtolower(trim($domain)), 0, INTL_IDNA_VARIANT_UTS46); + $domain = idn_to_ascii(strtolower(trim($domain)), 0, INTL_IDNA_VARIANT_UTS46); $stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `domain` = :domain"); $stmt->execute(array(':domain' => $domain)); @@ -4231,7 +4231,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { if (($key = array_search($username, $goto_exploded)) !== false) { unset($goto_exploded[$key]); } - $gotos_rebuild = implode(',', $goto_exploded); + $gotos_rebuild = implode(',', (array)$goto_exploded); $stmt = $pdo->prepare("UPDATE `alias` SET `goto` = :goto WHERE `address` = :address"); diff --git a/data/web/inc/functions.oauth2.inc.php b/data/web/inc/functions.oauth2.inc.php index 7bc7dea6..7dc56025 100644 --- a/data/web/inc/functions.oauth2.inc.php +++ b/data/web/inc/functions.oauth2.inc.php @@ -1,16 +1,16 @@ <?php function oauth2($_action, $_type, $_data = null) { - global $pdo; - global $redis; - global $lang; - if ($_SESSION['mailcow_cc_role'] != "admin") { - $_SESSION['return'][] = array( - 'type' => 'danger', + global $pdo; + global $redis; + global $lang; + if ($_SESSION['mailcow_cc_role'] != "admin") { + $_SESSION['return'][] = array( + 'type' => 'danger', 'log' => array(__FUNCTION__, $_action, $_type, $_data), - 'msg' => 'access_denied' - ); - return false; - } + 'msg' => 'access_denied' + ); + return false; + } switch ($_action) { case 'add': switch ($_type) { @@ -188,7 +188,7 @@ function oauth2($_action, $_type, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_type, $_data), - 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $access_tokens)) + 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', (array)$access_tokens)) ); break; case 'refresh_token': @@ -210,7 +210,7 @@ function oauth2($_action, $_type, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_type, $_data), - 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $refresh_tokens)) + 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', (array)$refresh_tokens)) ); break; } @@ -239,4 +239,4 @@ function oauth2($_action, $_type, $_data = null) { } break; } -} \ No newline at end of file +} diff --git a/data/web/inc/functions.policy.inc.php b/data/web/inc/functions.policy.inc.php index ad29bd24..498f991f 100644 --- a/data/web/inc/functions.policy.inc.php +++ b/data/web/inc/functions.policy.inc.php @@ -1,9 +1,9 @@ <?php function policy($_action, $_scope, $_data = null) { - global $pdo; - global $redis; - global $lang; - $_data_log = $_data; + global $pdo; + global $redis; + global $lang; + $_data_log = $_data; switch ($_action) { case 'add': if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) { @@ -261,7 +261,7 @@ function policy($_action, $_scope, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log), - 'msg' => array('items_deleted', implode(', ', $prefids)) + 'msg' => array('items_deleted', implode(', ', (array)$prefids)) ); } break; @@ -317,4 +317,4 @@ function policy($_action, $_scope, $_data = null) { } break; } -} \ No newline at end of file +} diff --git a/data/web/inc/functions.pushover.inc.php b/data/web/inc/functions.pushover.inc.php index e8d4670e..74e8bb1c 100644 --- a/data/web/inc/functions.pushover.inc.php +++ b/data/web/inc/functions.pushover.inc.php @@ -1,6 +1,6 @@ <?php function pushover($_action, $_data = null) { - global $pdo; + global $pdo; switch ($_action) { case 'edit': if (!isset($_SESSION['acl']['pushover']) || $_SESSION['acl']['pushover'] != "1" ) { @@ -81,7 +81,7 @@ function pushover($_action, $_data = null) { } $senders = array_filter($senders); if (empty($senders)) { $senders = ''; } - $senders = implode(",", $senders); + $senders = implode(",", (array)$senders); if (!ctype_alnum($key) || strlen($key) != 30) { $_SESSION['return'][] = array( 'type' => 'danger', diff --git a/data/web/inc/functions.transports.inc.php b/data/web/inc/functions.transports.inc.php index bbcce8cf..7b229175 100644 --- a/data/web/inc/functions.transports.inc.php +++ b/data/web/inc/functions.transports.inc.php @@ -1,7 +1,7 @@ <?php function relayhost($_action, $_data = null) { - global $pdo; - global $lang; + global $pdo; + global $lang; $_data_log = $_data; switch ($_action) { case 'add': @@ -45,7 +45,7 @@ function relayhost($_action, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts))) + 'msg' => array('relayhost_added', htmlspecialchars(implode(', ', (array)$hosts))) ); break; case 'edit': @@ -100,7 +100,7 @@ function relayhost($_action, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames))) + 'msg' => array('object_modified', htmlspecialchars(implode(', ', (array)$hostnames))) ); } break; @@ -177,8 +177,8 @@ function relayhost($_action, $_data = null) { } } function transport($_action, $_data = null) { - global $pdo; - global $lang; + global $pdo; + global $lang; $_data_log = $_data; switch ($_action) { case 'add': @@ -307,7 +307,7 @@ function transport($_action, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts))) + 'msg' => array('relayhost_added', htmlspecialchars(implode(', ', (array)$hosts))) ); break; case 'edit': @@ -442,7 +442,7 @@ function transport($_action, $_data = null) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames))) + 'msg' => array('object_modified', htmlspecialchars(implode(', ', (array)$hostnames))) ); } break; @@ -505,4 +505,4 @@ function transport($_action, $_data = null) { return $transportdata; break; } -} \ No newline at end of file +} diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index 91492b09..5cac48d5 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -94,9 +94,9 @@ $(document).ready(function() { } }); } - $('#addSelectDomain').on('change', function() { + $('#addSelectDomain').on('change', function() { auto_fill_quota($('#addSelectDomain').val()); - }); + }); auto_fill_quota($('#addSelectDomain').val()); $(".goto_checkbox").click(function( event ) { $("form[data-id='add_alias'] .goto_checkbox").not(this).prop('checked', false); @@ -152,10 +152,10 @@ $(document).ready(function() { $(e.currentTarget).find('#sieveDataText').html('<pre style="font-size:14px;line-height:1.1">' + sieveScript + '</pre>'); }); // Disable submit button on script change - $('.textarea-code').on('keyup', function() { + $('.textarea-code').on('keyup', function() { // Disable all "save" buttons, could be a "related button only" function, todo $('.add_sieve_script').attr({"disabled": true}); - }); + }); // Validate script data $(".validate_sieve").click(function( event ) { event.preventDefault(); @@ -258,11 +258,11 @@ jQuery(function($){ }}, {"name":"def_quota_for_mbox","title":lang.mailbox_defquota,"breakpoints":"xs sm md","style":{"width":"125px"}}, {"name":"max_quota_for_mbox","title":lang.mailbox_quota,"breakpoints":"xs sm","style":{"width":"125px"}}, - {"name":"rl","title":"RL","breakpoints":"xs sm md lg","style":{"maxWidth":"100px","width":"100px"}}, - {"name":"backupmx","filterable": false,"style":{"maxWidth":"120px","width":"120px"},"title":lang.backup_mx,"breakpoints":"xs sm md lg","formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"rl","title":"RL","breakpoints":"xs sm md lg","style":{"min-width":"100px","width":"100px"}}, + {"name":"backupmx","filterable": false,"style":{"min-width":"120px","width":"120px"},"title":lang.backup_mx,"breakpoints":"xs sm md lg","formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, {"name":"domain_admins","title":lang.domain_admins,"style":{"word-break":"break-all","min-width":"200px"},"breakpoints":"xs sm md lg","filterable":(role == "admin"),"visible":(role == "admin")}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"240px","width":"240px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"} + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"240px","width":"240px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"} ], "rows": $.ajax({ dataType: 'json', @@ -297,7 +297,7 @@ jQuery(function($){ item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-half btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' + '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-half btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>'; } - + if (item.backupmx == 1) { if (item.relay_unknown_only == 1) { item.domain_name = '<div class="label label-info">Relay Non-Local</div> ' + item.domain_name; @@ -374,7 +374,7 @@ jQuery(function($){ "formatter": function(value){ res = value.split("/"); return '<div class="label label-last-login">IMAP @ ' + unix_time_format(Number(res[0])) + '</div><br>' + - '<div class="label label-last-login">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' + + '<div class="label label-last-login">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' + '<div class="label label-last-login">SMTP @ ' + unix_time_format(Number(res[2])) + '</div>'; }}, {"name":"last_pw_change","filterable": false,"title":lang.last_pw_change,"breakpoints":"all"}, @@ -386,7 +386,7 @@ jQuery(function($){ }, {"name":"messages","filterable": false,"title":lang.msg_num,"breakpoints":"xs sm md"}, /* {"name":"rl","title":"RL","breakpoints":"all","style":{"width":"125px"}}, */ - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':(0==value?'<i class="bi bi-x-lg"></i>':2==value&&'—');}}, + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':(0==value?'<i class="bi bi-x-lg"></i>':2==value&&'—');}}, {"name":"action","filterable": false,"sortable": false,"style":{"min-width":"290px","text-align":"right"},"type":"html","title":lang.action,"breakpoints":"xs sm md"} ], "empty": lang.empty, @@ -443,9 +443,9 @@ jQuery(function($){ item.quarantine_category = lang.q_all; } if (acl_data.login_as === 1) { - var btnSize = 'btn-xs-third'; - if (ALLOW_ADMIN_EMAIL_LOGIN) btnSize = 'btn-xs-quart'; - + var btnSize = 'btn-xs-third'; + if (ALLOW_ADMIN_EMAIL_LOGIN) btnSize = 'btn-xs-quart'; + item.action = '<div class="btn-group footable-actions">' + '<a href="/edit/mailbox/' + encodeURIComponent(item.username) + '" class="btn btn-xs ' + btnSize + ' btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</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 ' + btnSize + ' btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' + @@ -512,9 +512,9 @@ jQuery(function($){ {"name":"name","title":lang.alias}, {"name":"kind","title":lang.kind}, {"name":"domain","title":lang.domain,"breakpoints":"xs sm"}, - {"name":"multiple_bookings","filterable": false,"style":{"maxWidth":"150px","width":"140px"},"title":lang.multiple_bookings,"breakpoints":"xs sm"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} + {"name":"multiple_bookings","filterable": false,"style":{"min-width":"150px","width":"140px"},"title":lang.multiple_bookings,"breakpoints":"xs sm"}, + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -650,11 +650,11 @@ jQuery(function($){ ft_recipient_map_table = FooTable.init('#recipient_map_table', { "columns": [ {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, - {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}}, + {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}}, {"name":"recipient_map_old","title":lang.recipient_map_old}, {"name":"recipient_map_new","title":lang.recipient_map_new}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -714,12 +714,12 @@ jQuery(function($){ ft_tls_policy_table = FooTable.init('#tls_policy_table', { "columns": [ {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, - {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}}, + {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}}, {"name":"dest","title":lang.tls_map_dest}, {"name":"policy","title":lang.tls_map_policy}, {"name":"parameters","title":lang.tls_map_parameters}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -784,15 +784,15 @@ jQuery(function($){ ft_alias_table = FooTable.init('#alias_table', { "columns": [ {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, - {"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}}, + {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}}, {"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}}, {"name":"goto","title":lang.target_address}, {"name":"domain","title":lang.domain,"breakpoints":"xs sm"}, {"name":"public_comment","title":lang.public_comment,"breakpoints":"all"}, {"name":"private_comment","title":lang.private_comment,"breakpoints":"all"}, {"name":"sogo_visible","title":lang.sogo_visible,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';},"breakpoints":"all"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -886,8 +886,8 @@ jQuery(function($){ {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, {"sorted": true,"name":"alias_domain","title":lang.alias,"style":{"width":"250px"}}, {"name":"target_domain","title":lang.target_domain,"type":"html"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} + {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -949,17 +949,17 @@ jQuery(function($){ function draw_sync_job_table() { ft_syncjob_table = FooTable.init('#sync_job_table', { "columns": [ - {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"}, - {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}}, + {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"}, + {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}}, {"name":"user2","title":lang.owner}, {"name":"server_w_port","title":"Server","breakpoints":"xs sm md","style":{"word-break":"break-all"}}, {"name":"exclude","title":lang.excludes,"breakpoints":"all"}, {"name":"mins_interval","title":lang.mins_interval,"breakpoints":"all"}, {"name":"last_run","title":lang.last_run,"breakpoints":"xs sm md"}, {"name":"log","title":"Log"}, - {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, - {"name":"is_running","filterable": false,"style":{"maxWidth":"120px","width":"100px"},"title":lang.status}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} + {"name":"active","filterable": false,"style":{"min-width":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}}, + {"name":"is_running","filterable": false,"style":{"min-width":"120px","width":"100px"},"title":lang.status}, + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ @@ -1031,14 +1031,14 @@ jQuery(function($){ function draw_filter_table() { ft_filter_table = FooTable.init('#filter_table', { "columns": [ - {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"}, - {"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}}, - {"name":"active","style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, - {"name":"filter_type","style":{"maxWidth":"80px","width":"80px"},"title":"Type"}, - {"sorted": true,"name":"username","title":lang.owner,"style":{"maxWidth":"550px","width":"350px"}}, + {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"}, + {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}}, + {"name":"active","style":{"min-width":"80px","width":"80px"},"title":lang.active}, + {"name":"filter_type","style":{"min-width":"80px","width":"80px"},"title":"Type"}, + {"sorted": true,"name":"username","title":lang.owner,"style":{"min-width":"550px","width":"350px"}}, {"name":"script_desc","title":lang.description,"breakpoints":"xs"}, {"name":"script_data","title":"Script","breakpoints":"all"}, - {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} + {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, "rows": $.ajax({ diff --git a/data/web/lang/lang.de.json b/data/web/lang/lang.de.json index fb8e9f38..4d2f27aa 100644 --- a/data/web/lang/lang.de.json +++ b/data/web/lang/lang.de.json @@ -514,6 +514,7 @@ "optional": "Dieser Eintrag ist optional." }, "edit": { + "acl": "ACL (Berechtigungen)", "active": "Aktiv", "admin": "Administrator bearbeiten", "advanced_settings": "Erweiterte Einstellungen", @@ -574,6 +575,7 @@ "previous": "Vorherige Seite", "private_comment": "Privater Kommentar", "public_comment": "Öffentlicher Kommentar", + "pushover": "Pushover", "pushover_evaluate_x_prio": "Hohe Priorität eskalieren [<code>X-Priority: 1</code>]", "pushover_info": "Push-Benachrichtigungen werden angewendet auf alle nicht-Spam Nachrichten zugestellt an <b>%s</b>, einschließlich Alias-Adressen (shared, non-shared, tagged).", "pushover_only_x_prio": "Nur Mail mit hoher Priorität berücksichtigen [<code>X-Priority: 1</code>]", diff --git a/data/web/lang/lang.en.json b/data/web/lang/lang.en.json index db9338fe..d5494e59 100644 --- a/data/web/lang/lang.en.json +++ b/data/web/lang/lang.en.json @@ -517,6 +517,7 @@ "optional": "This record is optional." }, "edit": { + "acl": "ACL (Permission)", "active": "Active", "admin": "Edit administrator", "advanced_settings": "Advanced settings", @@ -577,6 +578,7 @@ "previous": "Previous page", "private_comment": "Private comment", "public_comment": "Public comment", + "pushover": "Pushover", "pushover_evaluate_x_prio": "Escalate high priority mail [<code>X-Priority: 1</code>]", "pushover_info": "Push notification settings will apply to all clean (non-spam) mail delivered to <b>%s</b> including aliases (shared, non-shared, tagged).", "pushover_only_x_prio": "Only consider high priority mail [<code>X-Priority: 1</code>]", @@ -901,11 +903,11 @@ "type": "Type" }, "ratelimit": { - "disabled": "Disabled", - "second": "msgs / second", - "minute": "msgs / minute", - "hour": "msgs / hour", - "day": "msgs / day" + "disabled": "Disabled", + "second": "msgs / second", + "minute": "msgs / minute", + "hour": "msgs / hour", + "day": "msgs / day" }, "start": { "help": "Show/Hide help panel", @@ -1179,4 +1181,4 @@ "session_token": "Form token invalid: Token mismatch", "session_ua": "Form token invalid: User-Agent validation error" } -} \ No newline at end of file +} diff --git a/data/web/mailbox.php b/data/web/mailbox.php index 2ed8855e..6dfe3af5 100644 --- a/data/web/mailbox.php +++ b/data/web/mailbox.php @@ -33,8 +33,8 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <li role="presentation"<?=($_SESSION['mailcow_cc_role'] == "admin") ?: ' class="hidden"';?>><a href="#tab-tls-policy" aria-controls="tab-tls-policy" role="tab" data-toggle="tab"><?=$lang['mailbox']['tls_policy_maps'];?></a></li> </ul> - <div class="row"> - <div class="col-md-12"> + <div class="row"> + <div class="col-md-12"> <div class="tab-content" style="padding-top:20px"> <div role="tabpanel" class="tab-pane active" id="tab-domains"> <div class="panel panel-default"> @@ -43,7 +43,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <? if($_SESSION['mailcow_cc_role'] == "admin"): ?><button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addDomainModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_domain'];?></button><? endif; ?> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_domain_table" data-table="domain_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="domain_table" role="menu"> @@ -99,7 +99,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_mailbox'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_mailbox_table" data-table="mailbox_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="mailbox_table" role="menu"> @@ -226,7 +226,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addResourceModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_resource'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_resource_table" data-table="resource_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="resource_table" role="menu"> @@ -272,7 +272,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['alias_domains'];?>" data-toggle="modal" data-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_domain_alias'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_aliasdomain_table" data-table="aliasdomain_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="aliasdomain_table" role="menu"> @@ -313,7 +313,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addAliasModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_alias'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_alias_table" data-table="alias_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="alias_table" role="menu"> @@ -363,7 +363,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button data-acl="<?=$_SESSION['acl']['syncjobs'];?>" class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['user']['create_syncjob'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_sync_job_table" data-table="sync_job_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="sync_job_table" role="menu"> @@ -406,7 +406,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['filters'];?>" data-toggle="modal" data-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_filter'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_filter_table" data-table="filter_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="filter_table" role="menu"> @@ -498,7 +498,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['bcc_maps'];?>" data-toggle="modal" data-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_bcc_entry'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_bcc_table" data-table="bcc_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="bcc_table" role="menu"> @@ -540,7 +540,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_recipient_map_entry'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_recipient_map_table" data-table="recipient_map_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="recipient_map_table" role="menu"> @@ -582,7 +582,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <div class="btn-group pull-right hidden-xs"> <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_tls_policy_map'];?></button> <button class="btn btn-xs btn-default refresh_table" data-draw="draw_tls_policy_table" data-table="tls_policy_table"><?=$lang['admin']['refresh'];?></button> - <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> + <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> <span class="caret"></span> </button> <ul class="dropdown-menu" data-table-id="tls_policy_table" role="menu"> @@ -635,7 +635,7 @@ echo "var role = '". $role . "';\n"; echo "var is_dual = " . $is_dual . ";\n"; echo "var pagination_size = '". $PAGINATION_SIZE . "';\n"; $ALLOW_ADMIN_EMAIL_LOGIN = (preg_match( - "/^([yY][eE][sS]|[yY])+$/", + "/^([yY][eE][sS]|[yY])+$/", $_ENV["ALLOW_ADMIN_EMAIL_LOGIN"] )) ? "true" : "false"; echo "var ALLOW_ADMIN_EMAIL_LOGIN = " . $ALLOW_ADMIN_EMAIL_LOGIN . ";\n"; @@ -648,7 +648,7 @@ $js_minifier->add('/web/js/site/pwgen.js'); require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php'; } else { - header('Location: /'); - exit(); + header('Location: /'); + exit(); } ?>