Skip to content

Commit f337d3c

Browse files
committed
fix(backend): clean up EWS class: use Exchange IDs directly without hex conversions
1 parent 6b87c7d commit f337d3c

File tree

4 files changed

+29
-135
lines changed

4 files changed

+29
-135
lines changed

modules/contacts/modules.php

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,25 +97,17 @@ public function process() {
9797
*/
9898
class Hm_Handler_find_message_contacts extends Hm_Handler_Module {
9999
public function process() {
100-
$contacts = array();
101100
$existing = $this->get('contact_store');
102101
$addr_headers = array('to', 'cc', 'bcc', 'sender', 'reply-to', 'from');
103102
$headers = $this->get('msg_headers', array());
104103
$addresses = array();
105104
foreach ($headers as $name => $value) {
106105
if (in_array(mb_strtolower($name), $addr_headers, true)) {
107-
if(is_array($value)) {
108-
foreach ($value as $val) {
109-
foreach (Hm_Address_Field::parse($val) as $v) {
110-
if (!$existing->search(array('email_address' => $v['email']))) {
111-
$addresses[] = $v;
112-
}
113-
}
114-
}
115-
}else {
116-
foreach (Hm_Address_Field::parse($value) as $vals) {
117-
if (!$existing->search(array('email_address' => $vals['email']))) {
118-
$addresses[] = $vals;
106+
$values = is_array($value) ? $value : array($value);
107+
foreach ($values as $val) {
108+
foreach (Hm_Address_Field::parse($val) as $v) {
109+
if (!$existing->search(array('email_address' => $v['email']))) {
110+
$addresses[] = $v;
119111
}
120112
}
121113
}

modules/imap/handler_modules.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2000,7 +2000,7 @@ public function process() {
20002000

20012001
$mailbox = Hm_IMAP_List::get_connected_mailbox($server_id, $this->cache);
20022002
if ($mailbox && $mailbox->authed()) {
2003-
$prefetch = true; // Set prefetch to true for this context
2003+
$prefetch = true;
20042004
$mailbox->set_read_only($prefetch);
20052005
$part = false;
20062006
list($msg_struct, $msg_struct_current, $msg_text, $part) = $mailbox->get_structured_message(hex2bin($folder), $uid, $part, $this->user_config->get('text_only_setting', false));

modules/imap/hm-ews.php

Lines changed: 20 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public function get_folders($folder = null, $only_subscribed = false, $unsubscri
8383
$folders = [$folders];
8484
}
8585
foreach($folders as $folder) {
86-
$id = bin2hex($folder->getFolderId()->getId());
87-
$parentId = bin2hex($folder->getParentFolderId()->getId());
86+
$id = $folder->getFolderId()->getId();
87+
$parentId = $folder->getParentFolderId()->getId();
8888
$name = $folder->getDisplayName();
8989
if ($only_subscribed && in_array($id, $unsubscribed_folders)) {
9090
continue;
@@ -119,15 +119,15 @@ public function get_special_use_folders($folder = false) {
119119
'flagged' => false,
120120
'all' => false,
121121
'junk' => Enumeration\DistinguishedFolderIdNameType::JUNKEMAIL,
122-
'archive' => Enumeration\DistinguishedFolderIdNameType::ARCHIVE,
122+
'archive' => false,
123123
'drafts' => Enumeration\DistinguishedFolderIdNameType::DRAFTS,
124124
];
125125
foreach ($special as $type => $folderId) {
126126
if ($folderId) {
127127
try {
128128
$distinguishedFolder = $this->api->getFolderByDistinguishedId($folderId);
129129
if ($distinguishedFolder) {
130-
$special[$type] = bin2hex($distinguishedFolder->getFolderId()->getId());
130+
$special[$type] = $distinguishedFolder->getFolderId()->getId();
131131
}
132132
} catch (\Exception $e) {
133133
Hm_Msgs::add($e->getMessage(), 'danger');
@@ -150,100 +150,17 @@ public function get_folder_name_quick($folder) {
150150
}
151151
}
152152

153-
/**
154-
* TODO: Remove this one, we needed it only while testing
155-
* Find a folder by its display name
156-
* @param string $folderName The display name to search for
157-
* @param string $parentFolder Parent folder ID (hex) or distinguished folder name
158-
* @return array|false Folder details or false if not found
159-
*/
160-
public function find_folder_by_name($folderName, $parentFolder = null) {
161-
if (!$parentFolder) {
162-
$parentFolder = new Type\DistinguishedFolderIdType(Enumeration\DistinguishedFolderIdNameType::MSGFOLDERROOT);
163-
} elseif ($this->is_distinguished_folder($parentFolder)) {
164-
$parentFolder = new Type\DistinguishedFolderIdType($parentFolder);
165-
} elseif (ctype_xdigit($parentFolder)) {
166-
$parentFolder = new Type\FolderIdType(hex2bin($parentFolder));
167-
} else {
168-
return false;
169-
}
170-
171-
$findFolderRequest = array(
172-
'Traversal' => 'Shallow',
173-
'FolderShape' => array(
174-
'BaseShape' => 'Default'
175-
),
176-
'ParentFolderIds' => $parentFolder->toArray(true),
177-
'Restriction' => array(
178-
'IsEqualTo' => array(
179-
'FieldURI' => array(
180-
'FieldURI' => 'folder:DisplayName'
181-
),
182-
'FieldURIOrConstant' => array(
183-
'Constant' => array(
184-
'Value' => $folderName
185-
)
186-
)
187-
)
188-
)
189-
);
190-
191-
try {
192-
$response = $this->ews->FindFolder($findFolderRequest);
193-
$folders = $response->getFolders()->getFolder();
194-
195-
if ($folders) {
196-
if ($folders instanceof Type\FolderType) {
197-
$folders = [$folders];
198-
}
199-
200-
foreach ($folders as $folder) {
201-
return [
202-
'id' => bin2hex($folder->getFolderId()->getId()),
203-
'name' => $folder->getDisplayName(),
204-
'parent' => !is_null($folder->getParentFolderId()) ? bin2hex($folder->getParentFolderId()->getId()) : null,
205-
'messages' => $folder->getTotalCount() ?? 0,
206-
'unseen' => $folder->getUnreadCount() ?? 0,
207-
];
208-
}
209-
}
210-
} catch (\Exception $e) {
211-
Hm_Msgs::add('Error finding folder: ' . $e->getMessage(), 'danger');
212-
}
213-
214-
return false;
215-
}
216-
217153
public function get_folder_status($folder, $report_error = true) {
218154
try {
219155
if ($this->is_distinguished_folder($folder)) {
220156
$folderObj = new Type\DistinguishedFolderIdType($folder);
221157
$result = $this->api->getFolder($folderObj->toArray(true));
222-
} elseif (ctype_xdigit($folder) || base64_encode(base64_decode($folder, true)) === $folder) {
223-
$folderObj = new Type\FolderIdType(hex2bin($folder));
224-
$result = $this->api->getFolder($folderObj->toArray(true));
225-
226158
} else {
227-
// TODO: To be removed, we needed it only while testing
228-
// Try to find by display name using our new function
229-
$folderData = $this->find_folder_by_name($folder);
230-
if ($folderData) {
231-
return [
232-
'id' => $folderData['id'],
233-
'name' => $folderData['name'],
234-
'messages' => $folderData['messages'],
235-
'uidvalidity' => false,
236-
'uidnext' => false,
237-
'recent' => false,
238-
'unseen' => $folderData['unseen'],
239-
];
240-
} else {
241-
return [];
242-
// ; throw new Exception('Folder not found: ' . $folder);
243-
}
159+
$folderObj = new Type\FolderIdType($folder);
160+
$result = $this->api->getFolder($folderObj->toArray(true));
244161
}
245162
return [
246-
'id' => bin2hex($result->getFolderId()->getId()),
163+
'id' => $result->getFolderId()->getId(),
247164
'name' => $result->getDisplayName(),
248165
'messages' => $result->getTotalCount(),
249166
'uidvalidity' => false,
@@ -266,7 +183,7 @@ public function create_folder($folder, $parent = null) {
266183
if (empty($parent)) {
267184
$parent = new Type\DistinguishedFolderIdType(Enumeration\DistinguishedFolderIdNameType::MESSAGE_ROOT);
268185
} else {
269-
$parent = new Type\FolderIdType(hex2bin($parent));
186+
$parent = new Type\FolderIdType($parent);
270187
}
271188
try {
272189
$request = [
@@ -276,7 +193,7 @@ public function create_folder($folder, $parent = null) {
276193
'ParentFolderId' => $parent->toArray(true),
277194
];
278195
$result = $this->ews->CreateFolder($request);
279-
return bin2hex($result->getId());
196+
return $result->getId();
280197
} catch(\Exception $e) {
281198
Hm_Msgs::add($e->getMessage(), 'danger');
282199
return false;
@@ -338,7 +255,6 @@ public function rename_folder($folder, $new_name, $parent = null) {
338255

339256
public function delete_folder($folder) {
340257
try {
341-
// Convert hex ID to binary for EWS
342258
return $this->api->deleteFolder(new Type\FolderIdType(hex2bin($folder)));
343259
} catch(\Exception $e) {
344260
Hm_Msgs::add($e->getMessage(), 'danger');
@@ -423,12 +339,10 @@ public function search($folder, $sort, $reverse, $flag_filter, $offset, $limit,
423339
$lower_folder = strtolower($folder);
424340
if ($this->is_distinguished_folder($lower_folder)) {
425341
$folderObj = new Type\DistinguishedFolderIdType($lower_folder);
342+
} elseif (ctype_xdigit($folder)) {
343+
$folderObj = new Type\FolderIdType(hex2bin($folder));
426344
} else {
427-
if(!hex2bin($folder)) {
428-
$folderObj = new Type\FolderIdType($folder);
429-
}else {
430-
$folderObj = new Type\FolderIdType(hex2bin($folder));
431-
}
345+
$folderObj = new Type\FolderIdType($folder);
432346
}
433347
$request = array(
434348
'Traversal' => 'Shallow',
@@ -1150,7 +1064,6 @@ protected function move_items_to_junk($itemIds) {
11501064
'DestinationFolderId' => $junkFolder->toArray(true),
11511065
'ItemIds' => [
11521066
'ItemId' => $itemIds = array_map(function($itemId) {
1153-
// Convert hex item ID to binary for EWS API
11541067
return (new Type\ItemIdType(hex2bin($itemId)))->toArray();
11551068
}, $itemIds),
11561069
]
@@ -1185,13 +1098,13 @@ protected function delete_items($itemIds, $hard = false) {
11851098
return false;
11861099
}
11871100
foreach ($folders as $folder => $itemIds) {
1188-
if ($trash && bin2hex($trash->getFolderId()->getId()) == $folder) {
1101+
if ($trash && $trash->getFolderId()->getId() == $folder) {
11891102
$options = ['DeleteType' => 'HardDelete'];
11901103
} else {
11911104
$options = [];
11921105
}
11931106
$binaryItemIds = array_map(function($itemId) {
1194-
return (new Type\ItemIdType(hex2bin($itemId)))->toArray();
1107+
return (new Type\ItemIdType($itemId))->toArray();
11951108
}, $itemIds);
11961109
$result = $result && $this->api->deleteItems($binaryItemIds, $options);
11971110
}
@@ -1207,8 +1120,7 @@ protected function copy_items($itemIds, $folder) {
12071120
if ($this->is_distinguished_folder($folder)) {
12081121
$folder = new Type\DistinguishedFolderIdType($folder);
12091122
} else {
1210-
// Convert hex folder ID to binary for EWS API
1211-
$folder = new Type\FolderIdType(hex2bin($folder));
1123+
$folder = new Type\FolderIdType($folder);
12121124
}
12131125
$request = [
12141126
'ToFolderId' => $folder->toArray(true),
@@ -1225,8 +1137,7 @@ protected function copy_items($itemIds, $folder) {
12251137
$result = [$result];
12261138
}
12271139
$result = array_map(function($itemId) {
1228-
// Convert binary result back to hex format
1229-
return bin2hex($itemId->getId());
1140+
return $itemId->getId();
12301141
}, $result);
12311142
} catch (\Exception $e) {
12321143
Hm_Msgs::add($e->getMessage(), 'danger');
@@ -1239,7 +1150,7 @@ protected function move_items($itemIds, $folder) {
12391150
if ($this->is_distinguished_folder($folder)) {
12401151
$folder = new Type\DistinguishedFolderIdType($folder);
12411152
} else {
1242-
$folder = new Type\FolderIdType(hex2bin($folder));
1153+
$folder = new Type\FolderIdType($folder);
12431154
}
12441155
$request = [
12451156
'ToFolderId' => $folder->toArray(true),
@@ -1257,7 +1168,7 @@ protected function move_items($itemIds, $folder) {
12571168
$result = [$result];
12581169
}
12591170
$result = array_map(function($itemId) {
1260-
return bin2hex($itemId->getId());
1171+
return $itemId->getId();
12611172
}, $result);
12621173
} catch (\Exception $e) {
12631174
Hm_Msgs::add($e->getMessage(), 'danger');
@@ -1288,11 +1199,11 @@ protected function get_parent_folders_of_items($itemIds) {
12881199
$result = [$result];
12891200
}
12901201
foreach ($result as $message) {
1291-
$folder = bin2hex($message->getParentFolderId()->getId());
1202+
$folder = $message->getParentFolderId()->getId();
12921203
if (! isset($folders[$folder])) {
12931204
$folders[$folder] = [];
12941205
}
1295-
$folders[$folder][] = bin2hex($message->getItemId()->getId());
1206+
$folders[$folder][] = $message->getItemId()->getId();
12961207
}
12971208
return $folders;
12981209
}

modules/smtp/modules.php

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -788,18 +788,9 @@ public function process() {
788788
delete_draft($form['draft_id'], $this->cache, $imap_server, $specials['draft']);
789789
}
790790

791-
/* Clean up uploaded files
792-
* Note: EWS server handles draft deletion differently than IMAP/SMTP.
793-
* For EWS, drafts are completely removed during delete_draft operation,
794-
* making uploaded file cleanup unnecessary as files are no longer accessible.
795-
* For IMAP/SMTP, drafts may remain flagged as deleted but still exist on server,
796-
* requiring explicit cleanup of associated uploaded files.
797-
*/
798-
if($mailbox->server_type() !== 'EWS') {
799-
delete_uploaded_files($this->session, $form['draft_id']);
800-
if ($form['draft_id'] > 0) {
801-
delete_uploaded_files($this->session, 0);
802-
}
791+
delete_uploaded_files($this->session, $form['draft_id']);
792+
if ($form['draft_id'] > 0) {
793+
delete_uploaded_files($this->session, 0);
803794
}
804795
}
805796
}

0 commit comments

Comments
 (0)