Overview

Packages

  • IMP

Classes

  • IMP
  • IMP_Ajax_Addresses
  • IMP_Ajax_Application
  • IMP_Ajax_Application_Compose
  • IMP_Ajax_Application_Handler_Common
  • IMP_Ajax_Application_Handler_ComposeAttach
  • IMP_Ajax_Application_Handler_Draft
  • IMP_Ajax_Application_Handler_Dynamic
  • IMP_Ajax_Application_Handler_ImageUnblock
  • IMP_Ajax_Application_Handler_Mboxtoggle
  • IMP_Ajax_Application_Handler_Passphrase
  • IMP_Ajax_Application_Handler_Remote
  • IMP_Ajax_Application_Handler_RemotePrefs
  • IMP_Ajax_Application_Handler_Search
  • IMP_Ajax_Application_Handler_Smartmobile
  • IMP_Ajax_Application_ListMessages
  • IMP_Ajax_Application_ShowMessage
  • IMP_Ajax_Application_Viewport
  • IMP_Ajax_Application_Viewport_Error
  • IMP_Ajax_Imple_ImportEncryptKey
  • IMP_Ajax_Imple_ItipRequest
  • IMP_Ajax_Imple_PassphraseDialog
  • IMP_Ajax_Imple_VcardImport
  • IMP_Ajax_Queue
  • IMP_Api
  • IMP_Application
  • IMP_Auth
  • IMP_Basic_Base
  • IMP_Basic_Compose
  • IMP_Basic_Contacts
  • IMP_Basic_Error
  • IMP_Basic_Folders
  • IMP_Basic_Listinfo
  • IMP_Basic_Mailbox
  • IMP_Basic_Message
  • IMP_Basic_Pgp
  • IMP_Basic_Saveimage
  • IMP_Basic_Search
  • IMP_Basic_Searchbasic
  • IMP_Basic_Smime
  • IMP_Basic_Thread
  • IMP_Block_Newmail
  • IMP_Block_Summary
  • IMP_Compose
  • IMP_Compose_Attachment
  • IMP_Compose_Attachment_Linked_Metadata
  • IMP_Compose_Attachment_Metadata
  • IMP_Compose_Attachment_Storage
  • IMP_Compose_Attachment_Storage_AutoDetermine
  • IMP_Compose_Attachment_Storage_Temp
  • IMP_Compose_Attachment_Storage_VfsLinked
  • IMP_Compose_Exception
  • IMP_Compose_Exception_Address
  • IMP_Compose_HtmlSignature
  • IMP_Compose_Link
  • IMP_Compose_LinkedAttachment
  • IMP_Compose_Ui
  • IMP_Compose_View
  • IMP_Contacts
  • IMP_Contacts_Avatar_Addressbook
  • IMP_Contacts_Avatar_Gravatar
  • IMP_Contacts_Avatar_Unknown
  • IMP_Contacts_Flag_Host
  • IMP_Contacts_Image
  • IMP_Contents
  • IMP_Contents_InlineOutput
  • IMP_Contents_View
  • IMP_Crypt_Pgp
  • IMP_Crypt_Smime
  • IMP_Dynamic_AddressList
  • IMP_Dynamic_Base
  • IMP_Dynamic_Compose
  • IMP_Dynamic_Compose_Common
  • IMP_Dynamic_Helper_Base
  • IMP_Dynamic_Mailbox
  • IMP_Dynamic_Message
  • IMP_Exception
  • IMP_Factory_AuthImap
  • IMP_Factory_Compose
  • IMP_Factory_ComposeAtc
  • IMP_Factory_Contacts
  • IMP_Factory_Contents
  • IMP_Factory_Flags
  • IMP_Factory_Ftree
  • IMP_Factory_Identity
  • IMP_Factory_Imap
  • IMP_Factory_Mail
  • IMP_Factory_MailAutoconfig
  • IMP_Factory_Mailbox
  • IMP_Factory_MailboxCache
  • IMP_Factory_MailboxList
  • IMP_Factory_Maillog
  • IMP_Factory_MimeViewer
  • IMP_Factory_Pgp
  • IMP_Factory_PrefsSort
  • IMP_Factory_Quota
  • IMP_Factory_Search
  • IMP_Factory_Sentmail
  • IMP_Factory_Smime
  • IMP_Factory_Spam
  • IMP_Filter
  • IMP_Flag_Base
  • IMP_Flag_Imap
  • IMP_Flag_Imap_Answered
  • IMP_Flag_Imap_Deleted
  • IMP_Flag_Imap_Draft
  • IMP_Flag_Imap_Flagged
  • IMP_Flag_Imap_Forwarded
  • IMP_Flag_Imap_Junk
  • IMP_Flag_Imap_NotJunk
  • IMP_Flag_Imap_Seen
  • IMP_Flag_System_Attachment
  • IMP_Flag_System_Encrypted
  • IMP_Flag_System_HighPriority
  • IMP_Flag_System_List
  • IMP_Flag_System_LowPriority
  • IMP_Flag_System_Match_Address
  • IMP_Flag_System_Match_Flag
  • IMP_Flag_System_Match_Header
  • IMP_Flag_System_Personal
  • IMP_Flag_System_Signed
  • IMP_Flag_System_Unseen
  • IMP_Flag_User
  • IMP_Flags
  • IMP_Ftree
  • IMP_Ftree_Account
  • IMP_Ftree_Account_Imap
  • IMP_Ftree_Account_Inboxonly
  • IMP_Ftree_Account_Remote
  • IMP_Ftree_Account_Vfolder
  • IMP_Ftree_Element
  • IMP_Ftree_Eltdiff
  • IMP_Ftree_Iterator
  • IMP_Ftree_Iterator_Ancestors
  • IMP_Ftree_IteratorFilter
  • IMP_Ftree_IteratorFilter_Children
  • IMP_Ftree_IteratorFilter_Containers
  • IMP_Ftree_IteratorFilter_Expanded
  • IMP_Ftree_IteratorFilter_Invisible
  • IMP_Ftree_IteratorFilter_Mailboxes
  • IMP_Ftree_IteratorFilter_Nonimap
  • IMP_Ftree_IteratorFilter_Polled
  • IMP_Ftree_IteratorFilter_Remote
  • IMP_Ftree_IteratorFilter_Special
  • IMP_Ftree_IteratorFilter_Subscribed
  • IMP_Ftree_IteratorFilter_Vfolder
  • IMP_Ftree_Prefs
  • IMP_Ftree_Prefs_Expanded
  • IMP_Ftree_Prefs_Poll
  • IMP_Ftree_Select
  • IMP_Images
  • IMP_Imap
  • IMP_Imap_Acl
  • IMP_Imap_Cache_Wrapper
  • IMP_Imap_Config
  • IMP_Imap_Exception
  • IMP_Imap_Password
  • IMP_Imap_PermanentFlags
  • IMP_Imap_Remote
  • IMP_Indices
  • IMP_Indices_Mailbox
  • IMP_LoginTasks_SystemTask_GarbageCollection
  • IMP_LoginTasks_SystemTask_Upgrade
  • IMP_LoginTasks_SystemTask_UpgradeAuth
  • IMP_LoginTasks_Task_Autocreate
  • IMP_LoginTasks_Task_DeleteAttachmentsMonthly
  • IMP_LoginTasks_Task_DeleteSentmailMonthly
  • IMP_LoginTasks_Task_FilterOnLogin
  • IMP_LoginTasks_Task_PurgeSentmail
  • IMP_LoginTasks_Task_PurgeSpam
  • IMP_LoginTasks_Task_PurgeTrash
  • IMP_LoginTasks_Task_RecoverDraft
  • IMP_LoginTasks_Task_RenameSentmailMonthly
  • IMP_Mailbox
  • IMP_Mailbox_List
  • IMP_Mailbox_List_Pop3
  • IMP_Mailbox_List_Thread
  • IMP_Mailbox_List_Virtual
  • IMP_Mailbox_SessionCache
  • IMP_Mailbox_Ui
  • IMP_Maillog
  • IMP_Maillog_Log_Base
  • IMP_Maillog_Log_Forward
  • IMP_Maillog_Log_Mdn
  • IMP_Maillog_Log_Redirect
  • IMP_Maillog_Log_Reply
  • IMP_Maillog_Log_Replyall
  • IMP_Maillog_Log_Replylist
  • IMP_Maillog_Message
  • IMP_Maillog_Storage_Base
  • IMP_Maillog_Storage_Composite
  • IMP_Maillog_Storage_History
  • IMP_Maillog_Storage_Mdnsent
  • IMP_Maillog_Storage_Null
  • IMP_Mbox_Generate
  • IMP_Mbox_Import
  • IMP_Mbox_Size
  • IMP_Message
  • IMP_Message_Date
  • IMP_Message_Ui
  • IMP_Mime_Headers
  • IMP_Mime_Status
  • IMP_Mime_Status_RenderIssue
  • IMP_Mime_Status_RenderIssue_Display
  • IMP_Mime_Viewer_Alternative
  • IMP_Mime_Viewer_Appledouble
  • IMP_Mime_Viewer_Audio
  • IMP_Mime_Viewer_Enriched
  • IMP_Mime_Viewer_Externalbody
  • IMP_Mime_Viewer_Html
  • IMP_Mime_Viewer_Images
  • IMP_Mime_Viewer_Itip
  • IMP_Mime_Viewer_Mdn
  • IMP_Mime_Viewer_Partial
  • IMP_Mime_Viewer_Pdf
  • IMP_Mime_Viewer_Pgp
  • IMP_Mime_Viewer_Plain
  • IMP_Mime_Viewer_Related
  • IMP_Mime_Viewer_Rfc822
  • IMP_Mime_Viewer_Smil
  • IMP_Mime_Viewer_Smime
  • IMP_Mime_Viewer_Status
  • IMP_Mime_Viewer_Vcard
  • IMP_Mime_Viewer_Video
  • IMP_Mime_Viewer_Zip
  • IMP_Minimal_Base
  • IMP_Minimal_Compose
  • IMP_Minimal_Error
  • IMP_Minimal_Folders
  • IMP_Minimal_Mailbox
  • IMP_Minimal_Message
  • IMP_Minimal_Messagepart
  • IMP_Minimal_Search
  • IMP_Notification_Event_Status
  • IMP_Notification_Handler_Decorator_ImapAlerts
  • IMP_Notification_Handler_Decorator_NewmailNotify
  • IMP_Perms
  • IMP_Prefs_AttribText
  • IMP_Prefs_Identity
  • IMP_Prefs_Sort
  • IMP_Prefs_Sort_FixedDate
  • IMP_Prefs_Sort_None
  • IMP_Prefs_Sort_Sortpref
  • IMP_Prefs_Sort_Sortpref_Locked
  • IMP_Prefs_Special_Acl
  • IMP_Prefs_Special_ComposeTemplates
  • IMP_Prefs_Special_Drafts
  • IMP_Prefs_Special_Encrypt
  • IMP_Prefs_Special_Flag
  • IMP_Prefs_Special_HtmlSignature
  • IMP_Prefs_Special_ImageReplacement
  • IMP_Prefs_Special_InitialPage
  • IMP_Prefs_Special_Mailto
  • IMP_Prefs_Special_NewmailSound
  • IMP_Prefs_Special_PgpPrivateKey
  • IMP_Prefs_Special_PgpPublicKey
  • IMP_Prefs_Special_Remote
  • IMP_Prefs_Special_Searches
  • IMP_Prefs_Special_Sentmail
  • IMP_Prefs_Special_SmimePrivateKey
  • IMP_Prefs_Special_SmimePublicKey
  • IMP_Prefs_Special_Sourceselect
  • IMP_Prefs_Special_Spam
  • IMP_Prefs_Special_SpecialMboxes
  • IMP_Prefs_Special_Trash
  • IMP_Quota
  • IMP_Quota_Hook
  • IMP_Quota_Imap
  • IMP_Quota_Null
  • IMP_Quota_Ui
  • IMP_Remote
  • IMP_Remote_Account
  • IMP_Script_Package_Autocomplete
  • IMP_Script_Package_ComposeBase
  • IMP_Script_Package_DynamicBase
  • IMP_Script_Package_Editor
  • IMP_Script_Package_Imp
  • IMP_Search
  • IMP_Search_Element
  • IMP_Search_Element_Attachment
  • IMP_Search_Element_Autogenerated
  • IMP_Search_Element_Bulk
  • IMP_Search_Element_Contacts
  • IMP_Search_Element_Daterange
  • IMP_Search_Element_Flag
  • IMP_Search_Element_Header
  • IMP_Search_Element_Mailinglist
  • IMP_Search_Element_Or
  • IMP_Search_Element_Personal
  • IMP_Search_Element_Recipient
  • IMP_Search_Element_Size
  • IMP_Search_Element_Text
  • IMP_Search_Element_Within
  • IMP_Search_Filter
  • IMP_Search_Filter_Attachment
  • IMP_Search_Filter_Autogenerated
  • IMP_Search_Filter_Builtin
  • IMP_Search_Filter_Bulk
  • IMP_Search_Filter_Contacts
  • IMP_Search_Filter_Mailinglist
  • IMP_Search_Filter_Personal
  • IMP_Search_IteratorFilter
  • IMP_Search_Query
  • IMP_Search_Ui
  • IMP_Search_Vfolder
  • IMP_Search_Vfolder_Builtin
  • IMP_Search_Vfolder_Vinbox
  • IMP_Search_Vfolder_Vtrash
  • IMP_Sentmail
  • IMP_Sentmail_Mongo
  • IMP_Sentmail_Null
  • IMP_Sentmail_Sql
  • IMP_Smartmobile
  • IMP_Spam
  • IMP_Spam_Email
  • IMP_Spam_Null
  • IMP_Spam_Program
  • IMP_Test
  • IMP_Tree_Flist
  • IMP_Tree_Jquerymobile
  • IMP_Tree_Simplehtml
  • IMP_View_Subinfo

Interfaces

  • IMP_Compose_Attachment_Linked
  • IMP_Contacts_Avatar_Backend
  • IMP_Contacts_Flag_Backend
  • IMP_Spam_Base
  • Overview
  • Package
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * Copyright 2010-2014 Horde LLC (http://www.horde.org/)
  4:  *
  5:  * See the enclosed file COPYING for license information (GPL). If you
  6:  * did not receive this file, see http://www.horde.org/licenses/gpl.
  7:  *
  8:  * @category  Horde
  9:  * @copyright 2010-2014 Horde LLC
 10:  * @license   http://www.horde.org/licenses/gpl GPL
 11:  * @package   IMP
 12:  */
 13: 
 14: /* Determine the base directories. */
 15: if (!defined('IMP_BASE')) {
 16:     define('IMP_BASE', realpath(__DIR__ . '/..'));
 17: }
 18: 
 19: if (!defined('HORDE_BASE')) {
 20:     /* If Horde does not live directly under the app directory, the HORDE_BASE
 21:      * constant should be defined in config/horde.local.php. */
 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: /* Load the Horde Framework core (needed to autoload
 30:  * Horde_Registry_Application::). */
 31: require_once HORDE_BASE . '/lib/core.php';
 32: 
 33: /**
 34:  * IMP application API.
 35:  *
 36:  * This file defines Horde's core API interface. Other core Horde libraries
 37:  * can interact with IMP through this API.
 38:  *
 39:  * @author    Michael Slusarz <slusarz@horde.org>
 40:  * @category  Horde
 41:  * @copyright 2010-2014 Horde LLC
 42:  * @license   http://www.horde.org/licenses/gpl GPL
 43:  * @package   IMP
 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:      * Server key used in logged out session.
 73:      *
 74:      * @var string
 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:         /* Add IMP-specific factories. */
 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:         /* Methods only available if admin config is set for this
121:          * server/login. */
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:         /* Set exception handler to handle uncaught
127:          * Horde_Imap_Client_Exceptions. */
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:         // Always use Windows-1252 in place of ISO-8859-1 for MIME decoding.
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:         /* Clean up dangling IMP_Compose objects. */
161:         foreach ($injector->getInstance('IMP_Factory_Compose')->getAllObs() as $val) {
162:             $val->destroy('cancel');
163:         }
164: 
165:         /* Destroy any IMP_Mailbox_List cached entries, since they will not
166:          * be used in the next session. */
167:         $injector->getInstance('IMP_Factory_MailboxList')->expireAll();
168: 
169:         /* Grab the current server from the session to correctly populate
170:          * login form. */
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:     /* Horde permissions. */
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:     /* Menu methods. */
198: 
199:     /**
200:      */
201:     public function menu($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:      * Add additional items to the sidebar.
261:      *
262:      * @param Horde_View_Sidebar $sidebar  The sidebar object.
263:      */
264:     public function sidebar($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:         /* Folders. */
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:     // Horde_Notification methods.
300: 
301:     /**
302:      * Modifies the global notification handler.
303:      *
304:      * @param Horde_Notification_Handler $handler  A notification handler.
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:     /* Horde_Core_Auth_Application methods. */
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:         /* Show selection of alternate views. */
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:      * @param array $credentials  Credentials of the user. Allowed keys:
356:      *                            'imp_server_key', 'password'.
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:      * @param array $credentials  An array of login credentials. For IMP,
384:      *                            this must contain a password entry.
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:     /* Topbar method. */
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:     /* Language change callback. */
471: 
472:     /**
473:      */
474:     public function changeLanguage()
475:     {
476:         $GLOBALS['injector']->getInstance('IMP_Ftree')->init();
477:     }
478: 
479:     /* NoSQL methods. */
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:     /* Download data. */
517: 
518:     /**
519:      * URL parameters:
520:      *   - actionID
521:      *
522:      * @throws IMP_Exception
523:      */
524:     public function download(Horde_Variables $vars)
525:     {
526:         global $injector, $registry;
527: 
528:         /* Check for an authenticated user. */
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:     /* Exception handler. */
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: 
API documentation generated by ApiGen