1: <?php
2:
3: /**
4: * @subpackage tags/handler
5: */
6: class Hm_Handler_mod_env extends Hm_Handler_Module {
7: public function process() {
8: $this->out('mod_support', array_filter(array(
9: $this->module_is_supported('imap') ? 'imap' : false,
10: $this->module_is_supported('feeds') ? 'feeds' : false,
11: $this->module_is_supported('github') ? 'github' : false,
12: $this->module_is_supported('wordpress') ? 'wordpress' : false
13: )));
14: }
15: }
16:
17: /**
18: * Add tag/label to message
19: * @subpackage imap/handler
20: */
21: class Hm_Handler_add_tag_to_message extends Hm_Handler_Module {
22: /**
23: * Use IMAP to tag the selected message uid
24: */
25: public function process() {
26: list($success, $form) = $this->process_form(array('tag_id', 'list_path'));
27: if (!$success) {
28: return;
29: }
30:
31: $taged_messages = 0;
32: $ids = explode(',', $form['list_path']);
33: foreach ($ids as $msg_part) {
34: list($imap_server_id, $msg_id, $folder) = explode('_', $msg_part);
35: $folder = hex2bin($folder);
36: $tagged = Hm_Tags::addMessage($form['tag_id'], $imap_server_id, $folder, $msg_id);
37: if ($tagged) {
38: $taged_messages++;
39: }
40: }
41: $this->out('taged_messages', $taged_messages);
42: $type = 'success';
43: if ($taged_messages == count($ids)) {
44: $msg = 'Tag added';
45: } elseif ($taged_messages > 0) {
46: $msg = 'Some messages have been taged';
47: $type = 'warning';
48: } else {
49: $msg = 'ERRFailed to tag selected messages';
50: $type = 'danger';
51: }
52: Hm_Msgs::add($msg, $type);
53: }
54: }
55:
56: /**
57: * @subpackage tags/handler
58: */
59: class Hm_Handler_tag_edit_data extends Hm_Handler_Module {
60: public function process() {
61: $id = false;
62: if (array_key_exists('tag_id', $this->request->get)) {
63: $id = $this->request->get['tag_id'];
64: }
65: $folders = $this->get('tags');
66: $folder = null;
67: foreach ($folders as $f) {
68: if ($f['id'] === $id) {
69: $folder = $f;
70: }
71: }
72: if ($id !== false) {
73: $this->out('edit_tag', $folder);
74: $this->out('edit_tag_id', $id);
75: }
76: else {
77: $this->out('new_tag_id', count($folders));
78: }
79: }
80: }
81: /**
82: * @subpackage tags/handler
83: */
84: class Hm_Handler_process_tag_update extends Hm_Handler_Module {
85: public function process() {
86: if (array_key_exists('tag_delete', $this->request->post)) {
87: return;
88: }
89: list($success, $form) = $this->process_form(array('tag_name','parent_tag','tag_id'));// 'tag_id', parent_tag
90: if (!$success) {
91: return;
92: }
93: $tag = array(
94: 'name' => html_entity_decode($form['tag_name'], ENT_QUOTES),
95: 'parent' => $form['parent_tag'] ?? null
96: );
97: if (!is_null($form['tag_id']) AND Hm_Tags::get($form['tag_id'])) {
98: $tag['id'] = $form['tag_id'];
99: Hm_Tags::edit($form['tag_id'], $tag);
100: Hm_Msgs::add('Tag Edited');
101: } else {
102: Hm_Tags::add($tag);
103: Hm_Msgs::add('Tag Created');
104: }
105: }
106: }
107:
108: /**
109: * @subpackage profile/handler
110: */
111: class Hm_Handler_process_tag_delete extends Hm_Handler_Module {
112: public function process() {
113: list($success, $form) = $this->process_form(array('tag_delete', 'tag_id'));
114: if (!$success) {
115: return;
116: }
117: if (($tag = Hm_Tags::get($form['tag_id']))) {
118: Hm_Tags::del($tag['id']);
119: Hm_Msgs::add('Tag Deleted');
120: } else {
121: Hm_Msgs::add('Tag ID not found', 'warning');
122: return;
123: }
124: }
125: }
126:
127: /**
128: * @subpackage tags/handler
129: */
130: class Hm_Handler_imap_tag_content extends Hm_Handler_Module {
131: public function process() {
132: $data_sources = imap_data_sources();
133: $ids = array_map(function($ds) { return $ds['id']; }, $data_sources);
134: $tag_id = $this->request->post['folder'];
135: if ($ids && $tag_id) {
136: try {
137: $msg_list = [];
138: foreach ($ids as $serverId) {
139: $folders = Hm_Tags::getFolders($tag_id, $serverId);
140: if (!empty($folders)) {
141: $mailbox = Hm_IMAP_List::get_connected_mailbox($serverId, $this->cache);
142: $server_details = Hm_IMAP_List::dump($serverId);
143: if ($mailbox && $mailbox->authed()) {
144: foreach ($folders as $folder => $messageIds) {
145: $messages = array_map(function($msg) use ($serverId, $folder, $server_details) {
146: $msg['server_id'] = $serverId;
147: $msg['folder'] = bin2hex($folder);
148: $msg['server_name'] = $server_details['name'];
149: return $msg;
150: }, $mailbox->get_message_list($folder, $messageIds));
151: $msg_list = array_merge($msg_list, $messages);
152: }
153: }
154: }
155: }
156: $limit = $this->user_config->get('tag_per_source_setting', DEFAULT_TAGS_PER_SOURCE);
157: $date = process_since_argument($this->user_config->get('tag_since_setting', DEFAULT_TAGS_SINCE));
158:
159: $msg_list = array_filter($msg_list, function($msg) use ($date) {
160: return strtotime($msg['internal_date']) >= strtotime($date);
161: });
162: $msg_list = array_slice($msg_list, 0, $limit);
163: usort($msg_list, function($a, $b) {
164: return strtotime($b['internal_date']) - strtotime($a['internal_date']);
165: });
166:
167: $this->out('imap_tag_data', $msg_list);
168: } catch (\Throwable $th) {
169: Hm_Msgs::add('Failed to load tag messages: '.$th->getMessage(), 'danger');
170: }
171: }
172: }
173: }
174:
175: /**
176: * Process "tag_per_source" setting for the tag page in the settings page
177: * @subpackage core/handler
178: */
179: class Hm_Handler_process_tag_source_max_setting extends Hm_Handler_Module {
180: /**
181: * Allowed values are greater than zero and less than MAX_PER_SOURCE
182: */
183: public function process() {
184: process_site_setting('tag_per_source', $this, 'max_source_setting_callback', DEFAULT_TAGS_PER_SOURCE);
185: }
186: }
187:
188: class Hm_Handler_tag_data extends Hm_Handler_Module {
189: public function process() {
190: Hm_Tags::init($this);
191: $this->out('tags', Hm_Tags::getAll());
192: }
193: }
194:
195: class Hm_Handler_move_message extends Hm_Handler_Module {
196: public function process()
197: {
198: $moveResponses = $this->get('move_responses', []);
199: foreach ($moveResponses as $response) {
200: Hm_Tags::moveMessageToADifferentFolder([
201: 'oldId' => $response['oldUid'],
202: 'newId' => $response['newUid'],
203: 'oldFolder' => $response['oldFolder'],
204: 'newFolder' => $response['newFolder'],
205: 'oldServer' => $response['oldServer'],
206: 'newServer' => $response['newServer'] ?? '',
207: ]);
208: }
209: }
210: }
211: