Skip to content

Commit d1aad18

Browse files
committed
refactor: ensure that special folders data include folder id so hex2bin conversion stays unconditional
1 parent 3f56d28 commit d1aad18

File tree

3 files changed

+26
-21
lines changed

3 files changed

+26
-21
lines changed

modules/advanced_search/js_modules/route_handlers.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,10 @@ function applyAdvancedSearchPageHandlers() {
7575
const serverId = $(this).closest('li').data('serverId');
7676
const specialFolders = [];
7777
['archive', 'draft', 'junk', 'sent', 'trash'].forEach(folderType => {
78-
const folderName = hm_special_folders()[serverId][folderType];
79-
if (folderName) {
80-
specialFolders.push(folderName);
78+
const folders = hm_special_folders()?.[serverId];
79+
const folder = folders?.find(f => f.type === folderType);
80+
if (folder) {
81+
specialFolders.push(folder);
8182
}
8283
});
8384

@@ -92,13 +93,13 @@ function applyAdvancedSearchPageHandlers() {
9293
modal.setContent(`
9394
<div class="d-flex gap-3 flex-wrap">
9495
<div class="form-check form-switch">
95-
<input class="form-check-input" type="checkbox" id="all">
96-
<label class="form-check-label" for="all">All Folders</label>
96+
<input class="form-check-input" type="checkbox" id="all-special-folders">
97+
<label class="form-check-label" for="all-special-folders">All Folders</label>
9798
</div>
9899
${specialFolders.map(folder => `
99100
<div class="form-check form-switch">
100-
<input class="form-check-input special_folder_checkbox" type="checkbox" data-folder-id="${folder}" ${isFolderSelected(folder) ? 'checked' : ''}>
101-
<label class="form-check-label" for="${folder}">${folder}</label>
101+
<input class="form-check-input special_folder_checkbox" type="checkbox" id="${folder.id}" ${isFolderSelected(folder.label) ? 'checked' : ''}>
102+
<label class="form-check-label" for="${folder.id}">${folder.label}</label>
102103
</div>
103104
`).join('')}
104105
</div>
@@ -107,28 +108,28 @@ function applyAdvancedSearchPageHandlers() {
107108
modal.addFooterBtn('Pick', 'btn-primary', function() {
108109
const selectedFolders = [];
109110
$('.special_folder_checkbox:checked').each(function() {
110-
selectedFolders.push($(this).data('folder-id'));
111+
selectedFolders.push(specialFolders.find(folder => folder.id === $(this).attr('id')));
111112
});
112113
selectedFolders.forEach(folder => {
113-
add_source_to_list(accountId + folder, getFolderLabel(folder), true);
114+
add_source_to_list(accountId + folder.id, getFolderLabel(folder.label), true);
114115
});
115116
modal.hide();
116117
});
117118

118119
modal.open();
119120

120-
$('#all').on('change', function() {
121+
$('#all-special-folders').on('change', function() {
121122
const checked = $(this).is(':checked');
122123
$('.special_folder_checkbox').prop('checked', checked);
123124
});
124125

125126
$('.special_folder_checkbox').on('change', function() {
126127
const allChecked = $('.special_folder_checkbox').length === $('.special_folder_checkbox:checked').length;
127-
$('#all').prop('checked', allChecked);
128+
$('#all-special-folders').prop('checked', allChecked);
128129
});
129130

130-
if (specialFolders.every(folder => isFolderSelected(folder))) {
131-
$('#all').prop('checked', true);
131+
if (specialFolders.every(folder => isFolderSelected(folder.label))) {
132+
$('#all-special-folders').prop('checked', true);
132133
}
133134
});
134135

modules/advanced_search/modules.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ public function process() {
108108

109109
private function all_folders_search($mailbox, $flags, $params, $limit, $parent = '') {
110110
if ($parent) {
111-
$folders = $mailbox->get_subfolders($parent);
111+
$folders = [['name' => $parent]];
112+
$folders = array_merge($folders, $mailbox->get_subfolders($parent));
112113
} else {
113114
$folders = $mailbox->get_folders();
114115
}
@@ -160,12 +161,7 @@ private function validate_source($val) {
160161
$source_parts = explode('_', $val);
161162
$this->imap_id = $source_parts[1];
162163

163-
$folder = $source_parts[2];
164-
if (ctype_xdigit($folder)) {
165-
$this->folder = hex2bin($folder);
166-
} else {
167-
$this->folder = $folder;
168-
}
164+
$this->folder = hex2bin($source_parts[2]);
169165
return true;
170166
}
171167

modules/core/output_modules.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,14 @@ protected function output() {
616616
$settings = $this->get('user_settings', array());
617617
$enable_snooze = $settings['enable_snooze'] ?? DEFAULT_ENABLE_SNOOZE;
618618
$enable_collect_address_on_send = $settings['enable_collect_address_on_send_setting'] ?? DEFAULT_ENABLE_COLLECT_ADDRESS_ON_SEND;
619+
$specialFolders = $settings['special_imap_folders'];
620+
$formattedSpecialFolders = [];
621+
foreach ($specialFolders as $serverId => $folders) {
622+
$formattedSpecialFolders[$serverId] = [];
623+
foreach ($folders as $type => $folder) {
624+
$formattedSpecialFolders[$serverId][] = ['type' => $type, 'label' => $folder, 'id' => bin2hex($folder)];
625+
}
626+
}
619627
$res = '<script type="text/javascript" id="data-store">'.
620628
'var globals = {};'.
621629
'var hm_is_logged = function () { return '.($this->get('is_logged') ? '1' : '0').'; };'.
@@ -633,7 +641,7 @@ protected function output() {
633641
'var hm_web_root_path = function() { return "'.WEB_ROOT.'"; };'.
634642
'var hm_flag_image_src = function() { return "<i class=\"bi bi-star-half\"></i>"; };'.
635643
'var hm_check_dirty_flag = function() { return '.($this->get('warn_for_unsaved_changes', '') ? '1' : '0').'; };'.
636-
'var hm_special_folders = function() { return '.json_encode($settings['special_imap_folders']).'; };'.
644+
'var hm_special_folders = function() { return '.json_encode($formattedSpecialFolders).'; };'.
637645
format_data_sources($this->get('data_sources', array()), $this);
638646

639647
if (!$this->get('disable_delete_prompt', DEFAULT_DISABLE_DELETE_PROMPT)) {

0 commit comments

Comments
 (0)