diff --git a/config.php.in b/config.php.in index bcabc37..3815632 100644 --- a/config.php.in +++ b/config.php.in @@ -160,6 +160,7 @@ $config['ENABLE_STATISTICS'] = 1; $config['ENABLE_HISTORY'] = 1; $config['ENABLE_DELETE'] = 0; +$config['AUTHORIZE_DELETE'] = 0; $config['ENABLE_REMOTE_IMAGES'] = '0'; $config['ENABLE_ON_THE_FLY_VERIFICATION'] = 0; $config['ENABLE_LDAP_IMPORT_FEATURE'] = 0; @@ -396,6 +397,7 @@ define('TABLE_LEGAL_HOLD', 'legal_hold'); define('TABLE_TIMESTAMP', 'timestamp'); define('TABLE_PRIVATE', 'private'); +define('TABLE_DELETED', 'deleted'); define('VIEW_MESSAGES', 'v_messages'); define('EOL', "\n"); @@ -467,6 +469,7 @@ define('ACTION_VIEW_JOURNAL', 17); define('ACTION_NOT_SPAM', 18); define('ACTION_MARK_AS_PRIVATE', 19); +define('ACTION_MARK_MESSAGE_FOR_REMOVAL, 20); $actions = array( 'unknown' => 1, diff --git a/util/db-mysql.sql b/util/db-mysql.sql index b017808..5f6dd73 100644 --- a/util/db-mysql.sql +++ b/util/db-mysql.sql @@ -470,3 +470,13 @@ primary key (`id`) ) Engine=InnoDB; + +create table if not exists `deleted` ( + `id` bigint unsigned not null auto_increment, + `email` varchar(128) not null, + `reason` varchar(128) not null, + `date1` int unsigned not null, + `date2` int unsigned not null, + `deleted` tinyint(1) default 0, + primary key (`id`) +) Engine=InnoDB; diff --git a/webui/controller/customer/list.php b/webui/controller/customer/list.php index bf900f0..ba33d16 100644 --- a/webui/controller/customer/list.php +++ b/webui/controller/customer/list.php @@ -131,5 +131,3 @@ } - -?> diff --git a/webui/controller/message/bulkremove.php b/webui/controller/message/bulkremove.php index cac2da1..3af7571 100644 --- a/webui/controller/message/bulkremove.php +++ b/webui/controller/message/bulkremove.php @@ -21,6 +21,7 @@ $this->document->title = $this->data['text_message']; if(!isset($this->request->post['idlist']) || $this->request->post['idlist'] == '') { die("no idlist parameter given"); } + if(!isset($this->request->post['reason']) || $this->request->post['reason'] == '') { die("no reason parameter given"); } $idlist = $this->model_search_search->check_your_permission_by_id_list(explode(",", $this->request->post['idlist'])); @@ -33,12 +34,16 @@ } foreach($idlist as $id) { + $db->query("INSERT INTO " . TABLE_DELETED . " (id, email, reason, date1) VALUES(?,?,?,?)", [$id, $this->data['username'], $this->request->post['reason'], NOW]); - AUDIT(ACTION_REMOVE_MESSAGE, '', '', $id, ''); - - $db->query("UPDATE " . TABLE_META . " SET retained=? WHERE id=?", array(NOW, $id)); - - syslog(LOG_INFO, $this->data['username'] . " removed message: $id"); + if(AUTHORIZE_DELETE) { + AUDIT(ACTION_MARK_MESSAGE_FOR_REMOVAL, '', '', $id, ''); + syslog(LOG_INFO, $this->data['username'] . " marked message for removal: $id"); + } else { + AUDIT(ACTION_REMOVE_MESSAGE, '', '', $id, ''); + $db->query("UPDATE " . TABLE_META . " SET retained=? WHERE id=?", [NOW, $id]); + syslog(LOG_INFO, $this->data['username'] . " removed message: $id"); + } $this->data['removed']++; } @@ -48,5 +53,3 @@ } - -?> diff --git a/webui/language/cz/messages.php b/webui/language/cz/messages.php index 521d7aa..7b162de 100644 --- a/webui/language/cz/messages.php +++ b/webui/language/cz/messages.php @@ -481,5 +481,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/de/messages.php b/webui/language/de/messages.php index be7bf50..e8f20a7 100644 --- a/webui/language/de/messages.php +++ b/webui/language/de/messages.php @@ -488,4 +488,4 @@ $_['text_folder_rules'] = "Verzeichnisregeln"; $_['text_private'] = "Privat"; -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/en/messages.php b/webui/language/en/messages.php index 1027b9c..f7ee37a 100644 --- a/webui/language/en/messages.php +++ b/webui/language/en/messages.php @@ -79,6 +79,7 @@ $_['text_deferred_queue_sender'] = "deferred queue vs. sender"; $_['text_delay'] = "Delay"; $_['text_delete_confirm_message'] = "Do you wish to delete"; +$_['text_delete_reason'] = "Delete reason"; $_['text_deleted_users'] = "deleted"; $_['text_deliver'] = "Deliver"; $_['text_delivered'] = "Delivered"; @@ -483,5 +484,3 @@ $_['text_with_selected'] = 'With Selected'; $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; - -?> diff --git a/webui/language/es/messages.php b/webui/language/es/messages.php index fc34f7a..fe6717f 100644 --- a/webui/language/es/messages.php +++ b/webui/language/es/messages.php @@ -486,5 +486,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/fr/messages.php b/webui/language/fr/messages.php index 31821ed..53a35f6 100644 --- a/webui/language/fr/messages.php +++ b/webui/language/fr/messages.php @@ -483,5 +483,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/hu/messages.iso-8859-2.php b/webui/language/hu/messages.iso-8859-2.php deleted file mode 100644 index 35fc8bd..0000000 --- a/webui/language/hu/messages.iso-8859-2.php +++ /dev/null @@ -1,489 +0,0 @@ - diff --git a/webui/language/hu/messages.php b/webui/language/hu/messages.php index 78b938d..4a33f47 100644 --- a/webui/language/hu/messages.php +++ b/webui/language/hu/messages.php @@ -79,6 +79,7 @@ $_['text_deferred_queue_sender'] = "későbbi kiküldésre váró üzenetsor (feladó szerint)"; $_['text_delay'] = "Késleltetés"; $_['text_delete_confirm_message'] = "Törölni akarja"; +$_['text_delete_reason'] = "Törlés oka"; $_['text_deleted_users'] = "törölt"; $_['text_deliver'] = "Kézbesítés"; $_['text_delivered'] = "Kézbesített"; @@ -485,5 +486,3 @@ $_['text_with_selected'] = 'Kiválasztott levelek'; $_['text_compliance_warning'] = 'A törlés funkció engedélyezett, ezért az archívum NEM teljesíti a megfelelőséget!'; - -?> diff --git a/webui/language/pl/messages.php b/webui/language/pl/messages.php index 150633a..d75ba6a 100644 --- a/webui/language/pl/messages.php +++ b/webui/language/pl/messages.php @@ -483,5 +483,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/pt/messages.php b/webui/language/pt/messages.php index c37a0e9..6c4db8f 100644 --- a/webui/language/pt/messages.php +++ b/webui/language/pt/messages.php @@ -476,5 +476,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/ru/messages.php b/webui/language/ru/messages.php index d0490a7..cb3dec6 100644 --- a/webui/language/ru/messages.php +++ b/webui/language/ru/messages.php @@ -484,3 +484,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/language/tr/messages.php b/webui/language/tr/messages.php index b931dbd..2e25c37 100644 --- a/webui/language/tr/messages.php +++ b/webui/language/tr/messages.php @@ -484,5 +484,4 @@ $_['text_compliance_warning'] = 'The delete feature is enabled, therefore the archive is NOT compliant!'; $_['text_folder_rules'] = "Folder rules"; $_['text_private'] = "Private"; - -?> +$_['text_delete_reason'] = "Delete reason"; diff --git a/webui/model/search/search.php b/webui/model/search/search.php index ec269fa..2796423 100644 --- a/webui/model/search/search.php +++ b/webui/model/search/search.php @@ -484,7 +484,8 @@ $rcpt = $srcpt = array(); $tag = array(); $note = array(); - $private = array(); + $private = []; + $deleted = []; $q = ''; global $SUPPRESS_RECIPIENTS; @@ -516,12 +517,20 @@ if(isset($query->rows)) { - $privates = $this->db->query("SELECT `id` FROM `" . TABLE_PRIVATE . "` WHERE id IN ($q)", $ids); + $s = $this->db->query("SELECT `id` FROM `" . TABLE_PRIVATE . "` WHERE id IN ($q)", $ids); - foreach ($privates->rows as $p) { + foreach ($s->rows as $p) { $private[$p['id']] = 1; } + if(ENABLE_DELETE) { + $s = $this->db->query("SELECT `id` FROM `" . TABLE_DELETED . "` WHERE id IN ($q)", $ids); + + foreach ($s->rows as $p) { + $deleted[$p['id']] = 1; + } + } + array_unshift($ids, (int)$session->get("uid")); $tags = $this->db->query("SELECT `id`, `tag` FROM `" . TABLE_TAG . "` WHERE `uid`=? AND `id` IN ($q)", $ids); @@ -540,7 +549,8 @@ foreach($query->rows as $m) { - if(ENABLE_DELETE == 1 && $m['retained'] < NOW) $m['deleted'] = 1; else $m['deleted'] = 0; + // We mark it as deleted even if it's only marked for removal + if(ENABLE_DELETE == 1 && ($m['retained'] < NOW || isset($deleted[$m['id']])) ) $m['deleted'] = 1; else $m['deleted'] = 0; $m['shortfrom'] = make_short_string($m['from'], MAX_CGI_FROM_SUBJ_LEN); $m['from'] = escape_gt_lt_quote_symbols($m['from']); diff --git a/webui/view/javascript/piler-in.js b/webui/view/javascript/piler-in.js index e7ba727..5b6d84b 100644 --- a/webui/view/javascript/piler-in.js +++ b/webui/view/javascript/piler-in.js @@ -17,6 +17,7 @@ extra_folders: '', bulkrestore_url: '/bulkrestore.php', bulkpdf_url: '/bulkpdf.php', + text_successfully_removed: '' /* * variables used at search listing @@ -357,7 +358,14 @@ }, - bulk_remove_messages:function(msg) + show_bulk_remove_modal:function() + { + Piler.log("[show_bulk_remove_modal]"); + + $('#deletebox-modal').modal('show'); + }, + + bulk_remove_messages:function(reason) { Piler.log("[bulk_remove_messages]"); @@ -368,13 +376,13 @@ if(!idlist) return; jQuery.ajax('/bulkremove.php', { - data: { idlist: idlist }, + data: { idlist: idlist, reason: reason }, type: "POST" }) .done( function( a ) {}) .fail(function( a, b ) { alert("Problem retrieving XML data:" + b) }); - Piler.show_message('messagebox1', msg, 0.8); + Piler.show_message('messagebox1', text_successfully_removed, 0.8); }, diff --git a/webui/view/theme/default/templates/common/layout-search.tpl b/webui/view/theme/default/templates/common/layout-search.tpl index 2417696..ba5c7e3 100644 --- a/webui/view/theme/default/templates/common/layout-search.tpl +++ b/webui/view/theme/default/templates/common/layout-search.tpl @@ -51,6 +51,22 @@ + + + + + + +
@@ -71,7 +86,7 @@ - style="background: #faafbe;" /> + diff --git a/webui/view/theme/mobile/templates/login/login.tpl b/webui/view/theme/mobile/templates/login/login.tpl index 4a764c8..74ff435 100644 --- a/webui/view/theme/mobile/templates/login/login.tpl +++ b/webui/view/theme/mobile/templates/login/login.tpl @@ -60,10 +60,6 @@

- -

- -

diff --git a/webui/view/theme/mobile/templates/search/helper.tpl b/webui/view/theme/mobile/templates/search/helper.tpl index 9a41ef7..ca8f73a 100644 --- a/webui/view/theme/mobile/templates/search/helper.tpl +++ b/webui/view/theme/mobile/templates/search/helper.tpl @@ -115,8 +115,6 @@ - -