Skip to content

Commit 86f438c

Browse files
krokychrister77
authored andcommitted
Merge pull request #1719 from IrAlfred/enh-password-update-to-preserve-settings
feat(other): preserve user settings during password update
2 parents c7903a3 + d4da34e commit 86f438c

File tree

9 files changed

+266
-27
lines changed

9 files changed

+266
-27
lines changed

language/en.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@
341341
'Move' => false,
342342
'Move to ...' => false,
343343
'Copy to ...' => false,
344+
'Restore' => false,
344345
'Removed non-IMAP messages from selection. They cannot be moved or copied' => false,
345346
'Messages moved' => false,
346347
'Messages copied' => false,

modules/core/message_list_functions.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,23 @@ function icon_callback($vals, $style, $output_mod) {
415415
if (!hm_exists('message_controls')) {
416416
function message_controls($output_mod) {
417417
$txt = '';
418-
$controls = ['read', 'unread', 'flag', 'unflag', 'delete', 'archive', 'junk'];
418+
$controls = ['read', 'unread', 'flag', 'unflag', 'delete', 'archive', 'junk', 'restore'];
419419
$controls = array_filter($controls, function($val) use ($output_mod) {
420420
if (in_array($val, [$output_mod->get('list_path', ''), strtolower($output_mod->get('core_msg_control_folder', ''))])) {
421421
return false;
422422
}
423423
if ($val == 'flag' && $output_mod->get('list_path', '') == 'flagged') {
424424
return false;
425425
}
426+
$is_trash_folder = $output_mod->get('is_trash_folder', false);
427+
428+
if ($val == 'restore' && !$is_trash_folder) {
429+
return false;
430+
}
431+
if ($val == 'archive' && $is_trash_folder) {
432+
return false;
433+
}
434+
426435
return true;
427436
});
428437

modules/imap/functions.php

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,15 +1653,33 @@ function save_sent_msg($handler, $imap_id, $mailbox, $imap_details, $msg, $msg_i
16531653
}}
16541654

16551655
if (!hm_exists('is_imap_archive_folder')) {
1656-
function is_imap_archive_folder($server_id, $user_config, $current_folder) {
1657-
$special_folders = $user_config->get('special_imap_folders', array());
1658-
1659-
if (isset($special_folders[$server_id]['archive'])) {
1660-
$archive_folder = $special_folders[$server_id]['archive'];
1661-
if (bin2hex($archive_folder) == $current_folder) {
1662-
return true;
1656+
function is_imap_archive_folder($server_id, $user_config, $current_folder) {
1657+
$special_folders = $user_config->get('special_imap_folders', array());
1658+
1659+
if (isset($special_folders[$server_id]['archive'])) {
1660+
$archive_folder = $special_folders[$server_id]['archive'];
1661+
if (bin2hex($archive_folder) == $current_folder) {
1662+
return true;
1663+
}
16631664
}
1665+
1666+
return false;
16641667
}
1665-
1666-
return false;
1667-
}}
1668+
}
1669+
1670+
/**
1671+
* Check if the current folder is the configured trash folder
1672+
* @param object $handler handler module object
1673+
* @param int $server_id IMAP server id
1674+
* @param string $folder current folder name
1675+
* @return bool true if current folder is trash folder
1676+
*/
1677+
if (!hm_exists('is_imap_trash_folder')) {
1678+
function is_imap_trash_folder($handler, $server_id, $folder) {
1679+
$specials = get_special_folders($handler, $server_id);
1680+
if (array_key_exists('trash', $specials) && $specials['trash']) {
1681+
return $specials['trash'] === $folder;
1682+
}
1683+
return false;
1684+
}
1685+
}

modules/imap/handler_modules.php

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,8 @@ public function process() {
555555
if (array_key_exists(strtolower($folder), $spcial_folders)) {
556556
$this->out('core_msg_control_folder', $spcial_folders[strtolower($folder)]);
557557
}
558+
559+
$this->out('is_trash_folder', is_imap_trash_folder($this, $parts[1], $folder));
558560
if (!empty($details)) {
559561
if (array_key_exists('folder_label', $this->request->get)) {
560562
$folder = $this->request->get['folder_label'];
@@ -1133,13 +1135,14 @@ class Hm_Handler_imap_message_action extends Hm_Handler_Module {
11331135
public function process() {
11341136
list($success, $form) = $this->process_form(array('action_type', 'message_ids'));
11351137
if ($success) {
1136-
if (in_array($form['action_type'], array('delete', 'read', 'unread', 'flag', 'unflag', 'archive', 'junk'))) {
1138+
if (in_array($form['action_type'], array('delete', 'read', 'unread', 'flag', 'unflag', 'archive', 'junk', 'restore'))) {
11371139
$ids = process_imap_message_ids($form['message_ids']);
11381140
$errs = 0;
11391141
$msgs = 0;
11401142
$moved = array();
11411143
$status = array();
11421144
foreach ($ids as $server => $folders) {
1145+
// die($server);
11431146
$specials = get_special_folders($this, $server);
11441147
$mailbox = Hm_IMAP_List::get_connected_mailbox($server, $this->cache);
11451148
if ($mailbox && $mailbox->authed()) {
@@ -1157,6 +1160,7 @@ public function process() {
11571160
}
11581161
}
11591162
}
1163+
// die(var_dump($errs));
11601164
if ($errs > 0) {
11611165
Hm_Msgs::add(sprintf('An error occurred trying to %s some messages!', $form['action_type'], $server), 'danger');
11621166
}
@@ -1191,6 +1195,11 @@ private function perform_action($mailbox, $action_type, $uids, $folder, $special
11911195
$moved = array();
11921196
$folder_name = hex2bin($folder);
11931197
$special_folder = $this->get_special_folder($action_type, $specials, $server_details);
1198+
if ($action_type == "restore" && !$special_folder) {
1199+
$special_folder = 'INBOX';
1200+
}
1201+
1202+
// die(var_dump($specials));
11941203

11951204
if ($special_folder && $special_folder != $folder_name) {
11961205
if ($this->user_config->get('original_folder_setting', false)) {
@@ -1207,20 +1216,26 @@ private function perform_action($mailbox, $action_type, $uids, $folder, $special
12071216
}
12081217
}
12091218
} else {
1210-
if (!$mailbox->message_action($folder_name, mb_strtoupper($action_type), $uids)['status']) {
1219+
1220+
$status = $mailbox->message_action($folder_name, mb_strtoupper($action_type), $uids)['status'];
1221+
// var_dump("xxxxxxxxxx", $status, "---------");
1222+
if (!$status) {
12111223
$error = true;
1224+
12121225
} else {
1226+
// var_dump("xxxx ok xxxxxx $action_type - $folder_name");
12131227
foreach ($uids as $uid) {
12141228
$moved[] = sprintf("imap_%s_%s_%s", $server_details['id'], $uid, $folder);
12151229
}
12161230
if ($action_type == 'delete') {
12171231
$mailbox->message_action($folder_name, 'EXPUNGE', $uids);
1218-
}
1232+
}
12191233
}
12201234
}
1235+
// die(var_dump($special_folder, $folder_name, $folder, $action_type, "xxxxxxx"));
12211236

12221237
$folderNotFoundError = false;
1223-
if (!$special_folder && $action_type != 'read' && $action_type != 'unread' && $action_type != 'flag' && $action_type != 'unflag') {
1238+
if (!$special_folder && $action_type != 'read' && $action_type != 'unread' && $action_type != 'flag' && $action_type != 'unflag' && $action_type != 'restore') {
12241239
Hm_Msgs::add(sprintf('No %s folder configured for %s. Please go to <a href="?page=folders&imap_server_id=%s">Folders seetting</a> and configure one', $action_type, $server_details['name'], $server_details['id']), empty($moved) ? 'danger' : 'warning');
12251240
$folderNotFoundError = true;
12261241
}
@@ -1249,6 +1264,8 @@ private function get_special_folder($action_type, $specials, $server_details) {
12491264
$folder = $specials['archive'];
12501265
} elseif ($action_type == 'junk' && array_key_exists('junk', $specials)) {
12511266
$folder = $specials['junk'];
1267+
} elseif ($action_type == 'restore') {
1268+
$folder = $specials['inbox'];
12521269
}
12531270
return $folder;
12541271
}
@@ -1983,6 +2000,8 @@ public function process() {
19832000
$this->session->set(sprintf('reply_details_imap_%s_%s_%s', $form['imap_server_id'], $form['folder'], $form['imap_msg_uid']),
19842001
array('ts' => time(), 'msg_struct' => $msg_struct_current, 'msg_text' => ($save_reply_text ? $msg_text : ''), 'msg_headers' => $msg_headers));
19852002
}
2003+
2004+
$this->out('is_trash_folder', is_imap_trash_folder($this, $form['imap_server_id'], hex2bin($form['folder'])));
19862005
}
19872006
}
19882007
}
@@ -2164,3 +2183,51 @@ function process_ceo_amount_limit_callback($val) { return $val; }
21642183
process_site_setting('ceo_rate_limit', $this, 'process_ceo_amount_limit_callback');
21652184
}
21662185
}
2186+
2187+
/**
2188+
* Restore a message from trash to inbox
2189+
* @subpackage imap/handler
2190+
*/
2191+
class Hm_Handler_imap_restore_message extends Hm_Handler_Module {
2192+
public function process() {
2193+
list($success, $form) = $this->process_form(array('imap_msg_uid', 'imap_server_id', 'folder'));
2194+
2195+
if (!$success) {
2196+
return;
2197+
}
2198+
2199+
$restore_result = false;
2200+
$inbox_folder = 'INBOX';
2201+
$form_folder = hex2bin($form['folder']);
2202+
$errors = 0;
2203+
$status = false;
2204+
$mailbox = Hm_IMAP_List::get_connected_mailbox($form['imap_server_id'], $this->cache);
2205+
if ($mailbox && $mailbox->authed()) {
2206+
$inbox_exists = count($mailbox->get_folder_status($inbox_folder));
2207+
if (!$inbox_exists) {
2208+
Hm_Msgs::add('INBOX folder does not exist', 'danger');
2209+
$errors++;
2210+
}
2211+
2212+
if (!$errors) {
2213+
$result = $mailbox->message_action($form_folder, 'MOVE', array($form['imap_msg_uid']), $inbox_folder);
2214+
$status = $result['status'] ?? false;
2215+
}
2216+
2217+
$this->out('folder_status', array('imap_'.$form['imap_server_id'].'_'.$form['folder'] => $mailbox->get_folder_state()));
2218+
} else {
2219+
Hm_Msgs::add('Unable to connect to IMAP server', 'danger');
2220+
$errors++;
2221+
}
2222+
2223+
if ($status) {
2224+
$restore_result = true;
2225+
Hm_Msgs::add('Message restored to inbox');
2226+
} else {
2227+
Hm_Msgs::add('An error occurred restoring the message', 'danger');
2228+
}
2229+
2230+
$this->save_hm_msgs();
2231+
$this->out('restore_result', $restore_result);
2232+
}
2233+
}

modules/imap/hm-imap.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,7 @@ public function create_mailbox($mailbox) {
18511851
* @param string $keyword optional custom keyword flag
18521852
*/
18531853
public function message_action($action, $uids, $mailbox=false, $keyword=false) {
1854+
// die(var_dump($action, $uids, $mailbox, $keyword));
18541855
$status = false;
18551856
$command = false;
18561857
$uid_strings = [];
@@ -1903,7 +1904,7 @@ public function message_action($action, $uids, $mailbox=false, $keyword=false) {
19031904
case 'DELETE':
19041905
$command = "UID STORE $uid_string +FLAGS (\Deleted)\r\n";
19051906
break;
1906-
case 'UNDELETE':
1907+
case 'UNDELETE' || 'RESTORE':
19071908
$command = "UID STORE $uid_string -FLAGS (\Deleted)\r\n";
19081909
break;
19091910
case 'CUSTOM':

modules/imap/output_modules.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,10 @@ protected function output() {
389389
$txt .= '<a class="archive_link hlink text-decoration-none btn btn-sm btn-outline-secondary" id="archive_message" href="#">'.$this->trans('Archive').'</a>';
390390
}
391391

392+
if ($this->get('is_trash_folder')) {
393+
$txt .= '<a class="restore_link hlink text-decoration-none btn btn-sm btn-outline-secondary" id="restore_message" href="#">'.$this->trans('Restore').'</a>';
394+
}
395+
392396
if($this->get('tags')){
393397
$txt .= tags_dropdown($this, $headers);
394398
}

modules/imap/setup.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,15 @@
219219
add_handler('ajax_imap_archive_message', 'close_session_early', true, 'core');
220220
add_handler('ajax_imap_archive_message', 'imap_archive_message', true);
221221

222+
/* restore message callback */
223+
setup_base_ajax_page('ajax_imap_restore_message', 'core');
224+
add_handler('ajax_imap_restore_message', 'message_list_type', true, 'core');
225+
add_handler('ajax_imap_restore_message', 'imap_message_list_type', true);
226+
add_handler('ajax_imap_restore_message', 'load_imap_servers_from_config', true);
227+
add_handler('ajax_imap_restore_message', 'imap_oauth2_token_check', true);
228+
add_handler('ajax_imap_restore_message', 'close_session_early', true, 'core');
229+
add_handler('ajax_imap_restore_message', 'imap_restore_message', true);
230+
222231

223232
/* ajax message action callback */
224233
add_handler('ajax_message_action', 'load_imap_servers_from_config', true, 'imap', 'load_user_data', 'after');
@@ -312,6 +321,7 @@
312321
'ajax_imap_junk',
313322
'message_source',
314323
'ajax_share_folders',
324+
'ajax_imap_restore_message',
315325
),
316326

317327
'allowed_output' => array(

modules/imap/site.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,7 @@ var imap_message_view_finished = function(msg_uid, detail, listParent, skip_link
806806
$('#move_message').on("click", function(e) { return imap_move_copy(e, 'move', 'message');});
807807
$('#copy_message').on("click", function(e) { return imap_move_copy(e, 'copy', 'message');});
808808
$('#archive_message').on("click", function(e) { return imap_archive_message();});
809+
$('#restore_message').on("click", function(e) { return imap_restore_message(e);});
809810
$('#unread_message').on("click", function() { return imap_unread_message(msg_uid, detail);});
810811
$('#block_sender').on("click", function(e) {
811812
e.preventDefault();
@@ -1331,6 +1332,41 @@ var imap_archive_message = function(state, supplied_uid, supplied_detail) {
13311332
return false;
13321333
};
13331334

1335+
var imap_restore_message = function(e, supplied_uid, supplied_detail) {
1336+
e.preventDefault();
1337+
var uid = getMessageUidParam();
1338+
var detail = Hm_Utils.parse_folder_path(getListPathParam(), 'imap');
1339+
if (supplied_uid) {
1340+
uid = supplied_uid;
1341+
}
1342+
if (supplied_detail) {
1343+
detail = supplied_detail;
1344+
}
1345+
if (detail && uid) {
1346+
Hm_Ajax.request(
1347+
[{'name': 'hm_ajax_hook', 'value': 'ajax_imap_restore_message'},
1348+
{'name': 'imap_msg_uid', 'value': uid},
1349+
{'name': 'imap_server_id', 'value': detail.server_id},
1350+
{'name': 'folder', 'value': detail.folder}],
1351+
function(res) {
1352+
if (res.restore_result) {
1353+
if (hm_list_parent() == 'message') {
1354+
if (hm_auto_advance_email_enabled()) {
1355+
Hm_Utils.redirect("?page=message_list&list_path="+getListPathParam());
1356+
} else if (hm_list_parent() == 'search') {
1357+
Hm_Utils.redirect("?page=search&list_path="+hm_list_parent());
1358+
} else {
1359+
Hm_Utils.redirect("?page=message_list&list_path="+hm_list_parent());
1360+
}
1361+
}
1362+
}
1363+
}
1364+
);
1365+
1366+
}
1367+
return false;
1368+
};
1369+
13341370
var imap_show_add_contact_popup = function() {
13351371
var popup = document.getElementById("contact_popup");
13361372
popup.classList.toggle("show");

0 commit comments

Comments
 (0)