1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14:
15: if (!defined('IMP_BASE')) {
16: define('IMP_BASE', realpath(__DIR__ . '/..'));
17: }
18:
19: if (!defined('HORDE_BASE')) {
20: 21:
22: if (file_exists(IMP_BASE . '/config/horde.local.php')) {
23: include IMP_BASE . '/config/horde.local.php';
24: } else {
25: define('HORDE_BASE', realpath(IMP_BASE . '/..'));
26: }
27: }
28:
29: 30:
31: require_once HORDE_BASE . '/lib/core.php';
32:
33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
45: class IMP_Application extends Horde_Registry_Application
46: {
47:
48: 49:
50: public $auth = array(
51: 'add',
52: 'authenticate',
53: 'list',
54: 'remove',
55: 'transparent'
56: );
57:
58: 59:
60: public $features = array(
61: 'dynamicView' => true,
62: 'minimalView' => true,
63: 'notificationHandler' => true,
64: 'smartmobileView' => true
65: );
66:
67: 68:
69: public $version = 'H5 (6.3.0-git)';
70:
71: 72: 73: 74: 75:
76: protected $_oldserver = null;
77:
78: 79:
80: public function appInitFailure($e)
81: {
82: global $injector;
83:
84: switch ($e->getCode()) {
85: case Horde_Registry::AUTH_FAILURE:
86: $injector->getInstance('IMP_Factory_Compose')->create()->sessionExpireDraft($injector->getInstance('Horde_Variables'));
87: break;
88: }
89: }
90:
91: 92:
93: protected function _bootstrap()
94: {
95: global $injector;
96:
97:
98: $factories = array(
99: 'IMP_AuthImap' => 'IMP_Factory_AuthImap',
100: 'IMP_Contacts' => 'IMP_Factory_Contacts',
101: 'IMP_Crypt_Pgp' => 'IMP_Factory_Pgp',
102: 'IMP_Crypt_Smime' => 'IMP_Factory_Smime',
103: 'IMP_Flags' => 'IMP_Factory_Flags',
104: 'IMP_Identity' => 'IMP_Factory_Identity',
105: 'IMP_Ftree' => 'IMP_Factory_Ftree',
106: 'IMP_Mail' => 'IMP_Factory_Mail',
107: 'IMP_Mail_Autoconfig' => 'IMP_Factory_MailAutoconfig',
108: 'IMP_Mailbox_SessionCache' => 'IMP_Factory_MailboxCache',
109: 'IMP_Maillog' => 'IMP_Factory_Maillog',
110: 'IMP_Prefs_Sort' => 'IMP_Factory_PrefsSort',
111: 'IMP_Quota' => 'IMP_Factory_Quota',
112: 'IMP_Search' => 'IMP_Factory_Search',
113: 'IMP_Sentmail' => 'IMP_Factory_Sentmail'
114: );
115:
116: foreach ($factories as $key => $val) {
117: $injector->bindFactory($key, $val, 'create');
118: }
119:
120: 121:
122: if (empty($injector->getInstance('IMP_Factory_Imap')->create()->config->admin)) {
123: $this->auth = array_diff($this->auth, array('add', 'list', 'remove'));
124: }
125:
126: 127:
128: set_exception_handler(array($this, 'exceptionHandler'));
129: }
130:
131: 132:
133: protected function _authenticated()
134: {
135: IMP_Auth::authenticateCallback();
136: }
137:
138: 139:
140: protected function _init()
141: {
142: global $registry;
143:
144:
145: Horde_Mime::$decodeWindows1252 = true;
146:
147: if (($registry->initialApp == 'imp') &&
148: !empty($this->initParams['impmode']) &&
149: ($this->initParams['impmode'] != $registry->getView())) {
150: IMP::getInitialPage()->url->redirect();
151: }
152: }
153:
154: 155:
156: public function logout()
157: {
158: global $injector;
159:
160:
161: foreach ($injector->getInstance('IMP_Factory_Compose')->getAllObs() as $val) {
162: $val->destroy('cancel');
163: }
164:
165: 166:
167: $injector->getInstance('IMP_Factory_MailboxList')->expireAll();
168:
169: 170:
171: $this->_oldserver = $injector->getInstance('IMP_Factory_Imap')->create()->server_key;
172: }
173:
174: 175:
176: public function getInitialPage()
177: {
178: return strval(IMP::getInitialPage()->url->setRaw(true));
179: }
180:
181:
182:
183: 184:
185: public function perms()
186: {
187: return $GLOBALS['injector']->getInstance('IMP_Perms')->perms();
188: }
189:
190: 191:
192: public function hasPermission($permission, $allowed, $opts = array())
193: {
194: return $GLOBALS['injector']->getInstance('IMP_Perms')->hasPermission($permission, $allowed, $opts);
195: }
196:
197:
198:
199: 200:
201: public function ($menu)
202: {
203: global $injector, $prefs, $registry, $session;
204:
205: $imp_imap = $injector->getInstance('IMP_Factory_Imap')->create();
206:
207: if ($imp_imap->access(IMP_Imap::ACCESS_TRASH) &&
208: $prefs->getValue('use_trash') &&
209: $prefs->getValue('empty_trash_menu') &&
210: ($trash = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_TRASH)) &&
211: ($trash->vtrash || $trash->access_expunge)) {
212: $menu->addArray(array(
213: 'class' => '__noselection',
214: 'icon' => 'imp-empty-trash',
215: 'onclick' => 'return window.confirm(' . json_encode(_("Are you sure you wish to empty your trash mailbox?")) . ')',
216: 'text' => _("Empty _Trash"),
217: 'url' => $trash->url('mailbox')->add(array('actionID' => 'empty_mailbox', 'token' => $session->getToken()))
218: ));
219: }
220:
221: if ($imp_imap->access(IMP_Imap::ACCESS_FOLDERS) &&
222: $prefs->getValue('empty_spam_menu') &&
223: ($spam = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_SPAM)) &&
224: $spam->access_expunge) {
225: $menu->addArray(array(
226: 'class' => '__noselection',
227: 'icon' => 'imp-empty-spam',
228: 'onclick' => 'return window.confirm(' . json_encode(_("Are you sure you wish to empty your spam mailbox?")) . ')',
229: 'text' => _("Empty _Spam"),
230: 'url' => $spam->url('mailbox')->add(array('actionID' => 'empty_mailbox', 'token' => $session->getToken()))
231: ));
232: }
233:
234: if ($imp_imap->access(IMP_Imap::ACCESS_FOLDERS)) {
235: $menu->addArray(array(
236: 'icon' => 'imp-folder',
237: 'text' => _("_Folders"),
238: 'url' => IMP_Basic_Folders::url()
239: ));
240: }
241:
242: if ($imp_imap->access(IMP_Imap::ACCESS_SEARCH)) {
243: $menu->addArray(array(
244: 'icon' => 'imp-search',
245: 'text' =>_("_Search"),
246: 'url' => IMP_Basic_Search::url()
247: ));
248: }
249:
250: if ($prefs->getValue('filter_menuitem')) {
251: $menu->addArray(array(
252: 'icon' => 'imp-filters',
253: 'text' => _("Fi_lters"),
254: 'url' => $registry->getServiceLink('prefs', 'imp')->add('group', 'filters')
255: ));
256: }
257: }
258:
259: 260: 261: 262: 263:
264: public function ($sidebar)
265: {
266: global $injector;
267:
268: if (IMP_Compose::canCompose()) {
269: $clink = new IMP_Compose_Link();
270: $sidebar->addNewButton(_("_New Message"), $clink->link());
271: }
272:
273:
274: if ($injector->getInstance('IMP_Factory_Imap')->create()->access(IMP_Imap::ACCESS_FOLDERS)) {
275: try {
276: $tree = $injector->getInstance('Horde_Core_Factory_Tree')
277: ->create('imp_menu', 'Horde_Tree_Renderer_Sidebar', array('nosession' => true));
278:
279: $ftree = $injector->getInstance('IMP_Ftree');
280: $iterator = new IMP_Ftree_IteratorFilter($ftree);
281: $iterator->add(array(
282: $iterator::REMOTE,
283: $iterator::VFOLDER
284: ));
285:
286: $tree = $ftree->createTree($tree, array(
287: 'iterator' => $iterator,
288: 'open' => false,
289: 'poll_info' => true
290: ));
291: $sidebar->containers['imp-menu'] = array(
292: 'content' => $tree->getTree()
293: );
294: } catch (Exception $e) {}
295: }
296: }
297:
298:
299:
300:
301: 302: 303: 304: 305:
306: public function setupNotification(Horde_Notification_Handler $handler)
307: {
308: $handler->addDecorator(new IMP_Notification_Handler_Decorator_ImapAlerts());
309: $handler->addDecorator(new IMP_Notification_Handler_Decorator_NewmailNotify());
310: $handler->addType('status', 'imp.*', 'IMP_Notification_Event_Status');
311: }
312:
313:
314:
315: 316:
317: public function authLoginParams()
318: {
319: $params = array();
320:
321: if ($GLOBALS['conf']['server']['server_list'] == 'shown') {
322: $server_list = array();
323: $selected = is_null($this->_oldserver)
324: ? $GLOBALS['injector']->getInstance('Horde_Variables')->get('imp_server_key', IMP_Auth::getAutoLoginServer())
325: : $this->_oldserver;
326:
327: foreach (IMP_Imap::loadServerConfig() as $key => $val) {
328: $server_list[$key] = array(
329: 'name' => $val->name,
330: 'selected' => ($selected == $key)
331: );
332: }
333: $params['imp_server_key'] = array(
334: 'label' => _("Server"),
335: 'type' => 'select',
336: 'value' => $server_list
337: );
338: }
339:
340:
341: $js_code = array(
342: 'HordeLogin.server_key_error' => _("Please choose a mail server.")
343: );
344:
345: return array(
346: 'js_code' => $js_code,
347: 'js_files' => array(
348: array('login.js', 'imp')
349: ),
350: 'params' => $params
351: );
352: }
353:
354: 355: 356: 357:
358: public function authAuthenticate($userId, $credentials)
359: {
360: if (isset($credentials['server'])) {
361: $server = $credentials['server'];
362: } else {
363: $server = empty($credentials['imp_server_key'])
364: ? IMP_Auth::getAutoLoginServer()
365: : $credentials['imp_server_key'];
366: }
367:
368: IMP_Auth::authenticate(array(
369: 'password' => $credentials['password'],
370: 'server' => $server,
371: 'userId' => $userId
372: ));
373: }
374:
375: 376:
377: public function authTransparent($auth_ob)
378: {
379: return IMP_Auth::transparent($auth_ob);
380: }
381:
382: 383: 384: 385:
386: public function authAddUser($userId, $credentials)
387: {
388: try {
389: $GLOBALS['injector']->getInstance('IMP_AuthImap')->addUser($userId, $credentials);
390: } catch (Exception $e) {
391: throw new Horde_Auth_Exception($e);
392: }
393: }
394:
395: 396:
397: public function authRemoveUser($userId)
398: {
399: try {
400: $GLOBALS['injector']->getInstance('IMP_AuthImap')->removeUser($userId);
401: } catch (Exception $e) {
402: throw new Horde_Auth_Exception($e);
403: }
404: }
405:
406: 407:
408: public function authUserList()
409: {
410: try {
411: return $GLOBALS['injector']->getInstance('IMP_AuthImap')->listUsers();
412: } catch (Exception $e) {
413: throw new Horde_Auth_Exception($e);
414: }
415: }
416:
417:
418:
419: 420:
421: public function topbarCreate(Horde_Tree_Renderer_Base $tree,
422: $parent = null, array $params = array())
423: {
424: global $injector, $registry;
425:
426: if (IMP_Compose::canCompose()) {
427: $clink = new IMP_Compose_Link();
428: $tree->addNode(array(
429: 'id' => strval($parent) . 'compose',
430: 'parent' => $parent,
431: 'label' => _("New Message"),
432: 'expanded' => false,
433: 'params' => array(
434: 'icon' => Horde_Themes::img('compose.png'),
435: 'url' => $clink->link()->setRaw(true)
436: )
437: ));
438: }
439:
440: $imp_imap = $injector->getInstance('IMP_Factory_Imap')->create();
441: if ($imp_imap->access(IMP_Imap::ACCESS_SEARCH)) {
442: $onclick = null;
443: switch ($registry->getView()) {
444: case $registry::VIEW_DYNAMIC:
445: $url = Horde::url('dynamic.php', true)
446: ->add('page', 'mailbox')
447: ->setAnchor('search');
448: $onclick = 'if (window.DimpBase) { DimpBase.go(\'search\') }';
449: break;
450:
451: default:
452: $url = IMP_Basic_Search::url(array('full' => true));
453: break;
454: }
455:
456: $tree->addNode(array(
457: 'id' => strval($parent) . 'search',
458: 'parent' => $parent,
459: 'label' => _("Search"),
460: 'expanded' => false,
461: 'params' => array(
462: 'icon' => Horde_Themes::img('search.png'),
463: 'url' => $url,
464: 'onclick' => $onclick,
465: )
466: ));
467: }
468: }
469:
470:
471:
472: 473:
474: public function changeLanguage()
475: {
476: $GLOBALS['injector']->getInstance('IMP_Ftree')->init();
477: }
478:
479:
480:
481: 482:
483: public function nosqlDrivers()
484: {
485: global $injector;
486:
487: $backends = array(
488: 'Horde_Imap_Client_Cache_Backend_Mongo' => function() use ($injector) {
489: $backend = $injector
490: ->getInstance('IMP_Factory_Imap')
491: ->create()
492: ->config
493: ->cache_params['backend'];
494: if (isset($backend->backend)) {
495: return $backend->backend;
496: }
497: },
498: 'IMP_Sentmail_Mongo' => function() use ($injector) {
499: return $injector->getInstance('IMP_Sentmail');
500: },
501: );
502: $out = array();
503:
504: foreach ($backends as $key => $func) {
505: try {
506: $val = $func();
507: if ($val instanceof $key) {
508: $out[] = $val;
509: }
510: } catch (Horde_Exception $e) {}
511: }
512:
513: return $out;
514: }
515:
516:
517:
518: 519: 520: 521: 522: 523:
524: public function download(Horde_Variables $vars)
525: {
526: global $injector, $registry;
527:
528:
529: if (!$registry->isAuthenticated(array('app' => 'imp'))) {
530: $e = new IMP_Exception(_("User is not authenticated."));
531: $e->logged = true;
532: throw $e;
533: }
534:
535: switch ($vars->actionID) {
536: case 'download_all':
537: $view_ob = new IMP_Contents_View(new IMP_Indices_Mailbox($vars));
538: $view_ob->checkToken($vars);
539: return $view_ob->downloadAll();
540:
541: case 'download_attach':
542: $view_ob = new IMP_Contents_View(new IMP_Indices_Mailbox($vars));
543: $view_ob->checkToken($vars);
544: return $view_ob->downloadAttach($vars->id, $vars->zip);
545:
546: case 'download_mbox':
547: $mlist = IMP_Mailbox::formFrom($vars->mbox_list);
548: $mbox = $injector->getInstance('IMP_Mbox_Generate')->generate($mlist);
549: $name = is_array($mlist)
550: ? reset($mlist)
551: : $mlist;
552:
553: switch ($vars->type) {
554: case 'mbox':
555: return array(
556: 'data' => $mbox,
557: 'name' => $name . '.mbox',
558: 'type' => 'text/plain; charset=UTF-8'
559: );
560:
561: case 'mboxzip':
562: try {
563: $data = Horde_Compress::factory('Zip')->compress(array(
564: array(
565: 'data' => $mbox,
566: 'name' => $name . '.mbox'
567: )
568: ), array(
569: 'stream' => true
570: ));
571: fclose($mbox);
572: } catch (Horde_Exception $e) {
573: fclose($mbox);
574: throw $e;
575: }
576:
577: return array(
578: 'data' => $data,
579: 'name' => $name . '.zip',
580: 'type' => 'application/zip'
581: );
582: }
583: break;
584:
585: case 'download_render':
586: $view_ob = new IMP_Contents_View(new IMP_Indices_Mailbox($vars));
587: $view_ob->checkToken($vars);
588: return $view_ob->downloadRender($vars->id, $vars->mode, $vars->ctype);
589:
590: case 'save_message':
591: $view_ob = new IMP_Contents_View(new IMP_Indices_Mailbox($vars));
592: return $view_ob->saveMessage();
593: }
594:
595: return array();
596: }
597:
598:
599:
600: 601:
602: public function exceptionHandler(Exception $e)
603: {
604: if ($e instanceof Horde_Imap_Client_Exception) {
605: $e = new Horde_Exception_AuthenticationFailure(
606: $e->getMessage(),
607: Horde_Auth::REASON_MESSAGE
608: );
609: }
610:
611: Horde_ErrorHandler::fatal($e);
612: }
613:
614: }
615: