1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: class IMP_Minimal_Message extends IMP_Minimal_Base
16: {
17: 18: 19: 20: 21: 22: 23:
24: protected function _init()
25: {
26: global $injector, $notification, $page_output, $prefs, $session;
27:
28: $imp_mailbox = $this->indices->mailbox->list_ob;
29: $imp_mailbox->setIndex($this->indices);
30:
31: $mailbox_url = IMP_Minimal_Mailbox::url(array(
32: 'mailbox' => $this->indices->mailbox
33: ));
34:
35:
36: if (!$imp_mailbox->isValidIndex()) {
37: $mailbox_url->add('a', 'm')->redirect();
38: }
39:
40: $imp_ui = $injector->getInstance('IMP_Message_Ui');
41:
42:
43: $msg_delete = false;
44: switch ($this->vars->a) {
45:
46: case 'd':
47: $old_index = $imp_mailbox->getIndex();
48: try {
49: $session->checkToken($this->vars->t);
50: $msg_delete = (bool)$injector->getInstance('IMP_Message')->delete(
51: $this->indices,
52: array('mailboxob' => $imp_mailbox)
53: );
54: } catch (Horde_Exception $e) {
55: $notification->push($e);
56: }
57: break;
58:
59:
60: case 'u':
61: $old_index = $imp_mailbox->getIndex();
62: $injector->getInstance('IMP_Message')->undelete($this->indices);
63: break;
64:
65:
66:
67: case 'rs':
68: case 'ri':
69: $old_index = $imp_mailbox->getIndex();
70: $msg_delete = ($injector->getInstance('IMP_Factory_Spam')->create($this->vars->a == 'rs' ? IMP_Spam::SPAM : IMP_Spam::INNOCENT)->report($this->indices, array('mailboxob' => $imp_mailbox)) === 1);
71: break;
72: }
73:
74: if ($msg_delete && $imp_ui->moveAfterAction($this->indices->mailbox)) {
75: $imp_mailbox->setIndex(1);
76: }
77:
78: 79:
80: if (!$imp_mailbox->isValidIndex() ||
81: ($msg_delete && $prefs->getValue('mailbox_return'))) {
82: $mailbox_url->add('s', $old_index)->redirect();
83: }
84:
85: 86:
87: $msg_index = $imp_mailbox[$imp_mailbox->getIndex()];
88: $mailbox = $msg_index['m'];
89: $uid = $msg_index['u'];
90: $buid = $imp_mailbox->getBuid($mailbox, $uid);
91:
92:
93: try {
94: $imp_imap = $mailbox->imp_imap;
95:
96: 97:
98: $query = new Horde_Imap_Client_Fetch_Query();
99: $query->flags();
100: $flags_ret = $imp_imap->fetch($mailbox, $query, array(
101: 'ids' => $imp_imap->getIdsOb($uid)
102: ));
103:
104: $query = new Horde_Imap_Client_Fetch_Query();
105: $query->envelope();
106: $fetch_ret = $imp_imap->fetch($mailbox, $query, array(
107: 'ids' => $imp_imap->getIdsOb($uid)
108: ));
109: } catch (IMP_Imap_Exception $e) {
110: $mailbox_url->add('a', 'm')->redirect();
111: }
112:
113: $envelope = $fetch_ret->first()->getEnvelope();
114: $flags = $flags_ret->first()->getFlags();
115:
116:
117: try {
118: $imp_contents = $injector->getInstance('IMP_Factory_Contents')->create(new IMP_Indices($imp_mailbox));
119: $mime_headers = $imp_contents->getHeaderAndMarkAsSeen();
120: } catch (IMP_Exception $e) {
121: $mailbox_url->add('a', 'm')->redirect();
122: }
123:
124: 125:
126: $msgindex = $imp_mailbox->getIndex();
127: $msgcount = count($imp_mailbox);
128:
129:
130: $mailbox_link = $mailbox_url->add('s', $msgindex);
131: $self_link = self::url(array(
132: 'buid' => $buid,
133: 'mailbox' => $this->indices->mailbox
134: ));
135:
136:
137: $user_identity = $injector->getInstance('IMP_Identity');
138:
139:
140: $basic_headers = $imp_ui->basicHeaders();
141: $display_headers = $msgAddresses = array();
142:
143: if (($subject = $mime_headers->getValue('subject'))) {
144:
145: $subject = Horde_String::truncate(IMP::filterText($subject), 50);
146: } else {
147: $subject = _("[No Subject]");
148: }
149: $display_headers['subject'] = $subject;
150:
151: $date_ob = new IMP_Message_Date($envelope->date);
152: if ($format_date = $date_ob->format($date_ob::DATE_LOCAL)) {
153: $display_headers['date'] = $format_date;
154: }
155:
156:
157: $display_headers['from'] = $imp_ui->buildAddressLinks($envelope->from, null, false);
158:
159:
160: foreach (array('to', 'cc', 'bcc') as $val) {
161: $msgAddresses[] = $mime_headers->getValue($val);
162: $addr_val = $imp_ui->buildAddressLinks($envelope->$val, null, false);
163: if (!empty($addr_val)) {
164: $display_headers[$val] = $addr_val;
165: }
166: }
167:
168:
169: $list_info = $imp_ui->getListInformation($mime_headers);
170:
171:
172: switch($priority = $injector->getInstance('IMP_Mime_Headers')->getPriority($mime_headers)) {
173: case 'high':
174: case 'low':
175: $basic_headers['priority'] = _("Priority");
176: $display_headers['priority'] = Horde_String::ucfirst($priority);
177: break;
178: }
179:
180:
181: $status = '';
182: $match_identity = $identity = null;
183:
184: if (!empty($msgAddresses)) {
185: $match_identity = $identity = $user_identity->getMatchingIdentity($msgAddresses);
186: if (is_null($identity)) {
187: $identity = $user_identity->getDefault();
188: }
189: }
190:
191: $flag_parse = $injector->getInstance('IMP_Flags')->parse(array(
192: 'flags' => $flags,
193: 'personal' => $match_identity
194: ));
195:
196: foreach ($flag_parse as $val) {
197: if ($abbrev = $val->abbreviation) {
198: $status .= $abbrev;
199: } elseif ($val instanceof IMP_Flag_User) {
200: $status .= ' *' . Horde_String::truncate($val->label, 8) . '*';
201: }
202: }
203:
204:
205: $inline_ob = new IMP_Contents_InlineOutput();
206: $inlineout = $inline_ob->getInlineOutput($imp_contents, array(
207: 'display_mask' => IMP_Contents::RENDER_INLINE,
208: 'no_inline_all' => true
209: ));
210:
211: $msg_text = $inlineout['msgtext'];
212:
213: $this->view->msg = nl2br($injector->getInstance('Horde_Core_Factory_TextFilter')->filter($msg_text, 'space2html'));
214:
215: $menu = array();
216: if ($this->indices->mailbox->access_deletemsgs) {
217: $menu[] = in_array(Horde_Imap_Client::FLAG_DELETED, $flags)
218: ? array(_("Undelete"), $self_link->copy()->add('a', 'u'))
219: : array(_("Delete"), $self_link->copy()->add(array('a' => 'd', 't' => $session->getToken())));
220: }
221:
222: 223:
224: if (IMP_Compose::canCompose()) {
225: $clink_ob = new IMP_Compose_Link();
226: $clink_ob->args['buid'] = $buid;
227: $clink_ob->args['mailbox'] = $this->indices->mailbox;
228: $clink = $clink_ob->link()->add(array('identity' => $identity));
229:
230: $menu[] = array(_("Reply"), $clink->copy()->add(array('a' => 'r')));
231:
232: if ($list_info['reply_list']) {
233: $menu[] = array(_("Reply to List"), $clink->copy()->add(array('a' => 'rl')));
234: }
235:
236: $addr_ob = clone($envelope->to);
237: $addr_ob->add($envelope->cc);
238: $addr_ob->setIteratorFilter(0, $user_identity->getAllFromAddresses());
239:
240: if (count($addr_ob)) {
241: $menu[] = array(_("Reply All"), $clink->copy()->add(array('a' => 'ra')));
242: }
243:
244: $menu[] = array(_("Forward"), $clink->copy()->add(array('a' => 'f')));
245: $menu[] = array(_("Redirect"), $clink->copy()->add(array('a' => 'rc')));
246: $menu[] = array(_("Edit as New"), $clink->copy()->add(array('a' => 'en')));
247: }
248:
249:
250: if ($prev_msg = $imp_mailbox[$imp_mailbox->getIndex() - 1]) {
251: $menu[] = array(_("Previous Message"), self::url(array(
252: 'buid' => $imp_mailbox->getBuid($prev_msg['m'], $prev_msg['u']),
253: 'mailbox' => $this->indices->mailbox
254: )));
255: }
256: if ($next_msg = $imp_mailbox[$imp_mailbox->getIndex() + 1]) {
257: $menu[] = array(_("Next Message"), self::url(array(
258: 'buid' => $imp_mailbox->getBuid($next_msg['m'], $next_msg['u']),
259: 'mailbox' => $this->indices->mailbox
260: )));
261: }
262:
263: $menu[] = array(sprintf(_("To %s"), $this->indices->mailbox->label), $mailbox_link);
264:
265: if ($mailbox->spam_show) {
266: $menu[] = array(_("Report as Spam"), $self_link->copy()->add(array('a' => 'rs', 't' => $session->getToken())));
267: }
268:
269: if ($mailbox->innocent_show) {
270: $menu[] = array(_("Report as Innocent"), $self_link->copy()->add(array('a' => 'ri', 't' => $session->getToken())));
271: }
272:
273: $this->view->menu = $this->getMenu('message', $menu);
274:
275: $hdrs = array();
276: foreach ($display_headers as $head => $val) {
277: $tmp = array(
278: 'label' => $basic_headers[$head]
279: );
280: if ((Horde_String::lower($head) == 'to') &&
281: !isset($this->vars->allto) &&
282: (($pos = strpos($val, ',')) !== false)) {
283: $val = Horde_String::substr($val, 0, $pos);
284: $tmp['all_to'] = $self_link->copy()->add('allto', 1);
285: }
286: $tmp['val'] = $val;
287: $hdrs[] = $tmp;
288: }
289: $this->view->hdrs = $hdrs;
290:
291: $atc = array();
292: foreach ($inlineout['atc_parts'] as $key) {
293: $summary = $imp_contents->getSummary($key, IMP_Contents::SUMMARY_BYTES | IMP_Contents::SUMMARY_SIZE | IMP_Contents::SUMMARY_DESCRIP | IMP_Contents::SUMMARY_DOWNLOAD);
294:
295: $tmp = array(
296: 'descrip' => $summary['description_raw'],
297: 'size' => $summary['size'],
298: 'type' => $summary['type']
299: );
300:
301: if (!empty($summary['download'])) {
302: 303:
304: $tmp['download'] = IMP_Minimal_Messagepart::url(array(
305: 'buid' => $buid,
306: 'mailbox' => $this->indices->mailbox
307: ))->add('atc', $key);
308: }
309:
310: if ($imp_contents->canDisplay($key, IMP_Contents::RENDER_INLINE)) {
311: $tmp['view'] = IMP_Minimal_Messagepart::url(array(
312: 'buid' => $buid,
313: 'mailbox' => $this->indices->mailbox
314: ))->add('id', $key);
315: }
316:
317: $atc[] = $tmp;
318: }
319: $this->view->atc = $atc;
320:
321: $this->title = $display_headers['subject'];
322: $this->view->title = ($status ? $status . ' ' : '') . sprintf(_("(Message %d of %d)"), $msgindex, $msgcount);
323:
324: $page_output->noDnsPrefetch();
325:
326: $this->_pages[] = 'message';
327: $this->_pages[] = 'menu';
328: }
329:
330: 331: 332: 333: 334:
335: public static function url(array $opts = array())
336: {
337: return IMP_Mailbox::get($opts['mailbox'])->url('minimal', $opts['buid'])->add('page', 'message');
338: }
339:
340: }
341: