diff --git a/data/web/edit.php b/data/web/edit.php
index 4c60fadf..fbbda18d 100644
--- a/data/web/edit.php
+++ b/data/web/edit.php
@@ -31,7 +31,10 @@ if (isset($_SESSION['mailcow_cc_role'])) {
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 8c5804d8..1e674e44 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -324,6 +324,7 @@ function mailbox($_action, $_type, $_data = null) {
$addresses = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['address']));
$gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
$active = intval($_data['active']);
+ $goto_null = intval($_data['goto_null']);
if (empty($addresses[0])) {
$_SESSION['return'] = array(
'type' => 'danger',
@@ -331,42 +332,47 @@ function mailbox($_action, $_type, $_data = null) {
);
return false;
}
- if (empty($gotos[0])) {
+ if (empty($gotos[0]) && $goto_null == 0) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => sprintf($lang['danger']['goto_empty'])
);
return false;
}
- foreach ($gotos as &$goto) {
- if (empty($goto)) {
- continue;
- }
- $goto_domain = idn_to_ascii(substr(strstr($goto, '@'), 1));
- $goto_local_part = strstr($goto, '@', true);
- $goto = $goto_local_part.'@'.$goto_domain;
- $stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
- WHERE `kind` REGEXP 'location|thing|group'
- AND `username`= :goto");
- $stmt->execute(array(':goto' => $goto));
- $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
- if ($num_results != 0) {
- $_SESSION['return'] = array(
- 'type' => 'danger',
- 'msg' => sprintf($lang['danger']['goto_invalid'])
- );
- return false;
- }
- if (!filter_var($goto, FILTER_VALIDATE_EMAIL) === true) {
- $_SESSION['return'] = array(
- 'type' => 'danger',
- 'msg' => sprintf($lang['danger']['goto_invalid'])
- );
- return false;
- }
+ if ($goto_null == "1") {
+ $goto = "null@localhost";
+ }
+ else {
+ foreach ($gotos as &$goto) {
+ if (empty($goto)) {
+ continue;
+ }
+ $goto_domain = idn_to_ascii(substr(strstr($goto, '@'), 1));
+ $goto_local_part = strstr($goto, '@', true);
+ $goto = $goto_local_part.'@'.$goto_domain;
+ $stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
+ WHERE `kind` REGEXP 'location|thing|group'
+ AND `username`= :goto");
+ $stmt->execute(array(':goto' => $goto));
+ $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
+ if ($num_results != 0) {
+ $_SESSION['return'] = array(
+ 'type' => 'danger',
+ 'msg' => sprintf($lang['danger']['goto_invalid'])
+ );
+ return false;
+ }
+ if (!filter_var($goto, FILTER_VALIDATE_EMAIL) === true) {
+ $_SESSION['return'] = array(
+ 'type' => 'danger',
+ 'msg' => sprintf($lang['danger']['goto_invalid'])
+ );
+ return false;
+ }
+ }
+ $gotos = array_filter($gotos);
+ $goto = implode(",", $gotos);
}
- $gotos = array_filter($gotos);
- $goto = implode(",", $gotos);
foreach ($addresses as $address) {
if (empty($address)) {
continue;
@@ -1385,6 +1391,7 @@ function mailbox($_action, $_type, $_data = null) {
$is_now = mailbox('get', 'alias_details', $address);
if (!empty($is_now)) {
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
+ $goto_null = (isset($_data['goto_null'])) ? intval($_data['goto_null']) : $is_now['goto_null'];
$goto = (!empty($_data['goto'])) ? $_data['goto'] : $is_now['goto'];
}
else {
@@ -1394,30 +1401,33 @@ function mailbox($_action, $_type, $_data = null) {
);
return false;
}
-
- $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
- foreach ($gotos as &$goto) {
- if (empty($goto)) {
- continue;
- }
- if (!filter_var($goto, FILTER_VALIDATE_EMAIL)) {
- $_SESSION['return'] = array(
- 'type' => 'danger',
- 'msg' =>sprintf($lang['danger']['goto_invalid'])
- );
- return false;
- }
- if ($goto == $address) {
- $_SESSION['return'] = array(
- 'type' => 'danger',
- 'msg' => sprintf($lang['danger']['alias_goto_identical'])
- );
- return false;
- }
+ if ($goto_null == "1") {
+ $goto = "null@localhost";
+ }
+ else {
+ $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
+ foreach ($gotos as &$goto) {
+ if (empty($goto)) {
+ continue;
+ }
+ if (!filter_var($goto, FILTER_VALIDATE_EMAIL)) {
+ $_SESSION['return'] = array(
+ 'type' => 'danger',
+ 'msg' =>sprintf($lang['danger']['goto_invalid'])
+ );
+ return false;
+ }
+ if ($goto == $address) {
+ $_SESSION['return'] = array(
+ 'type' => 'danger',
+ 'msg' => sprintf($lang['danger']['alias_goto_identical'])
+ );
+ return false;
+ }
+ }
+ $gotos = array_filter($gotos);
+ $goto = implode(",", $gotos);
}
- $gotos = array_filter($gotos);
- $goto = implode(",", $gotos);
-
$domain = idn_to_ascii(substr(strstr($address, '@'), 1));
$local_part = strstr($address, '@', true);
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
diff --git a/data/web/js/api.js b/data/web/js/api.js
index 78d111c0..a64ce04f 100644
--- a/data/web/js/api.js
+++ b/data/web/js/api.js
@@ -67,7 +67,7 @@ $(document).ready(function() {
var req_empty = false;
$(this).closest("form").find('select, textarea, input').each(function() {
if ($(this).prop('required')) {
- if (!$(this).val()) {
+ if (!$(this).val() && $(this).prop('disabled') === false) {
req_empty = true;
$(this).addClass('inputMissingAttr');
} else {
@@ -126,7 +126,7 @@ $(document).ready(function() {
var req_empty = false;
$(this).closest("form").find('select, textarea, input').each(function() {
if ($(this).prop('required')) {
- if (!$(this).val()) {
+ if (!$(this).val() && $(this).prop('disabled') === false) {
req_empty = true;
$(this).addClass('inputMissingAttr');
} else {
diff --git a/data/web/js/edit.js b/data/web/js/edit.js
index 4b3654b2..057a9ecb 100644
--- a/data/web/js/edit.js
+++ b/data/web/js/edit.js
@@ -1,3 +1,17 @@
+$(document).ready(function() {
+ if ($("#goto_null").is(":checked")) {
+ $('#textarea_alias_goto').prop('disabled', true);
+ }
+ $("#goto_null").click(function( event ) {
+ if ($("#goto_null").is(":checked")) {
+ $('#textarea_alias_goto').prop('disabled', true);
+ }
+ else {
+ $("#textarea_alias_goto").removeAttr('disabled');
+ }
+ });
+});
+
jQuery(function($){
// http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
function validateEmail(email) {
diff --git a/data/web/js/mailbox.js b/data/web/js/mailbox.js
index 1347d8a6..c914f644 100644
--- a/data/web/js/mailbox.js
+++ b/data/web/js/mailbox.js
@@ -30,6 +30,15 @@ $(document).ready(function() {
$('#password2').val(random_passwd);
});
+ $("#goto_null").click(function( event ) {
+ if ($("#goto_null").is(":checked")) {
+ $('#textarea_alias_goto').prop('disabled', true);
+ }
+ else {
+ $("#textarea_alias_goto").removeAttr('disabled');
+ }
+ });
+
// Log modal
$('#logModal').on('show.bs.modal', function(e) {
var logText = $(e.relatedTarget).data('log-text');
@@ -283,6 +292,9 @@ jQuery(function($){
if (item.is_catch_all == 1) {
item.address = '
Catch-All
' + item.address;
}
+ if (item.goto == "null@localhost") {
+ item.goto = '⤷
';
+ }
if (item.in_primary_domain !== "") {
item.domain = "↳ " + item.domain + " (" + item.in_primary_domain + ")";
}
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index f857f3e5..a8851a82 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -331,6 +331,7 @@ $lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s u. Alias-Dom.
$lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
$lang['edit']['kind'] = 'Art';
$lang['edit']['resource'] = 'Ressource';
+$lang['edit']['goto_null'] = 'Nachrichten sofort verwerfen';
$lang['add']['syncjob'] = 'Sync-Job erstellen';
$lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!';
@@ -385,6 +386,7 @@ $lang['add']['password'] = 'Passwort';
$lang['add']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['add']['previous'] = 'Vorherige Seite';
$lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
+$lang['add']['goto_null'] = 'Nachrichten sofort verwerfen';
$lang['login']['title'] = 'Anmeldung';
$lang['login']['administration'] = 'Administration';
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 4487e48a..ddb82f23 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -336,6 +336,7 @@ $lang['edit']['dont_check_sender_acl'] = "Disable sender check for domain %s + a
$lang['edit']['multiple_bookings'] = 'Multiple bookings';
$lang['edit']['kind'] = 'Kind';
$lang['edit']['resource'] = 'Resource';
+$lang['edit']['goto_null'] = 'Silently discard mail';
$lang['add']['syncjob'] = 'Add sync job';
$lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!';
@@ -390,6 +391,7 @@ $lang['add']['password'] = 'Password';
$lang['add']['password_repeat'] = 'Confirmation password (repeat)';
$lang['add']['previous'] = 'Previous page';
$lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
+$lang['add']['goto_null'] = 'Silently discard mail';
$lang['login']['title'] = 'Login';
$lang['login']['administration'] = 'Administration';
diff --git a/data/web/modals/mailbox.php b/data/web/modals/mailbox.php
index c74e1dff..b726ca6e 100644
--- a/data/web/modals/mailbox.php
+++ b/data/web/modals/mailbox.php
@@ -234,7 +234,10 @@ if (!isset($_SESSION['mailcow_cc_role'])) {