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 2012-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 2012-2014 Horde LLC
 10:  * @license   http://www.horde.org/licenses/gpl GPL
 11:  * @package   IMP
 12:  */
 13: 
 14: /**
 15:  * Attach javascript used to process Itip actions into a page.
 16:  *
 17:  * @author    Michael Slusarz <slusarz@horde.org>
 18:  * @category  Horde
 19:  * @copyright 2012-2014 Horde LLC
 20:  * @license   http://www.horde.org/licenses/gpl GPL
 21:  * @package   IMP
 22:  */
 23: class IMP_Ajax_Imple_ItipRequest extends Horde_Core_Ajax_Imple
 24: {
 25:     /**
 26:      */
 27:     protected $_observe = 'submit';
 28: 
 29:     /**
 30:      * @param array $params  Configuration parameters:
 31:      *   - mime_id: (string) The MIME ID of the message part with the key.
 32:      *   - muid: (string) MUID of the message.
 33:      */
 34:     public function __construct(array $params = array())
 35:     {
 36:         parent::__construct($params);
 37:     }
 38: 
 39:     /**
 40:      */
 41:     protected function _attach($init)
 42:     {
 43:         return array(
 44:             'mime_id' => $this->_params['mime_id'],
 45:             'muid' => $this->_params['muid']
 46:         );
 47:     }
 48: 
 49:     /**
 50:      * Variables required in form input:
 51:      *   - identity (TODO: ? Code uses it, but it is never set anywhere)
 52:      *   - imple_submit: itip_action(s)
 53:      *   - mime_id
 54:      *   - muid
 55:      *
 56:      * @return boolean  True on success.
 57:      */
 58:     protected function _handle(Horde_Variables $vars)
 59:     {
 60:         global $conf, $injector, $notification, $registry;
 61: 
 62:         $actions = (array)$vars->imple_submit;
 63:         $result = false;
 64:         $vCal = new Horde_Icalendar();
 65: 
 66:         /* Retrieve the calendar data from the message. */
 67:         try {
 68:             $contents = $injector->getInstance('IMP_Factory_Contents')->create(new IMP_Indices_Mailbox($vars));
 69:             $mime_part = $contents->getMIMEPart($vars->mime_id);
 70:             if (empty($mime_part)) {
 71:                 throw new IMP_Exception(_("Cannot retrieve calendar data from message."));
 72:             } elseif (!$vCal->parsevCalendar($mime_part->getContents(), 'VCALENDAR', $mime_part->getCharset())) {
 73:                 throw new IMP_Exception(_("The calendar data is invalid"));
 74:             }
 75: 
 76:             $components = $vCal->getComponents();
 77:         } catch (Exception $e) {
 78:             $notification->push($e, 'horde.error');
 79:             $actions = array();
 80:         }
 81: 
 82:         foreach ($actions as $key => $action) {
 83:             $pos = strpos($key, '[');
 84:             $key = substr($key, $pos + 1, strlen($key) - $pos - 2);
 85: 
 86:             switch ($action) {
 87:             case 'delete':
 88:                 // vEvent cancellation.
 89:                 if ($registry->hasMethod('calendar/delete')) {
 90:                     $guid = $components[$key]->getAttribute('UID');
 91:                     $recurrenceId = null;
 92:                     try {
 93:                         // This is a cancellation of a recurring event instance.
 94:                         $recurrenceId = $components[$key]->getAttribute('RECURRENCE-ID');
 95:                         $atts = $components[$key]->getAttribute('RECURRENCE-ID', true);
 96:                         $range = null;
 97:                         foreach ($atts as $att) {
 98:                             if (array_key_exists('RANGE', $att)) {
 99:                                 $range = $att['RANGE'];
100:                             }
101:                         }
102:                     } catch (Horde_Icalendar_Exception $e) {}
103: 
104:                     try {
105:                         $registry->call('calendar/delete', array($guid, $recurrenceId, $range));
106:                         $notification->push(_("Event successfully deleted."), 'horde.success');
107:                         $result = true;
108:                     } catch (Horde_Exception $e) {
109:                         $notification->push(sprintf(_("There was an error deleting the event: %s"), $e->getMessage()), 'horde.error');
110:                     }
111:                 } else {
112:                     $notification->push(_("This action is not supported."), 'horde.warning');
113:                 }
114:                 break;
115: 
116:             case 'update':
117:                 // vEvent reply.
118:                 if ($registry->hasMethod('calendar/updateAttendee')) {
119:                     try {
120:                         $from = $contents->getHeader()->getOb('from');
121:                         $registry->call('calendar/updateAttendee', array(
122:                             $components[$key],
123:                             $from[0]->bare_address
124:                         ));
125:                         $notification->push(_("Respondent Status Updated."), 'horde.success');
126:                         $result = true;
127:                     } catch (Horde_Exception $e) {
128:                         $notification->push(sprintf(_("There was an error updating the event: %s"), $e->getMessage()), 'horde.error');
129:                     }
130:                 } else {
131:                     $notification->push(_("This action is not supported."), 'horde.warning');
132:                 }
133:                 break;
134: 
135:             case 'import':
136:             case 'accept-import':
137:                 // vFreebusy reply.
138:                 // vFreebusy publish.
139:                 // vEvent request.
140:                 // vEvent publish.
141:                 // vTodo publish.
142:                 // vJournal publish.
143:                 switch ($components[$key]->getType()) {
144:                 case 'vEvent':
145:                     $result = $this->_handlevEvent($key, $components, $mime_part);
146:                     // Must check for exceptions.
147:                     foreach ($components as $k => $component) {
148:                         try {
149:                             if ($component->getType() == 'vEvent' && $component->getAttribute('RECURRENCE-ID')) {
150:                                 $uid = $component->getAttribute('UID');
151:                                 if ($uid == $components[$key]->getAttribute('UID')) {
152:                                     $this->_handlevEvent($k, $components, $mime_part);
153:                                 }
154:                             }
155:                         } catch (Horde_Icalendar_Exception $e) {}
156:                     }
157: 
158:                     break;
159:                 case 'vFreebusy':
160:                     // Import into Kronolith.
161:                     if ($registry->hasMethod('calendar/import_vfreebusy')) {
162:                         try {
163:                             $registry->call('calendar/import_vfreebusy', array($components[$key]));
164:                             $notification->push(_("The user's free/busy information was sucessfully stored."), 'horde.success');
165:                             $result = true;
166:                         } catch (Horde_Exception $e) {
167:                             $notification->push(sprintf(_("There was an error importing user's free/busy information: %s"), $e->getMessage()), 'horde.error');
168:                         }
169:                     } else {
170:                         $notification->push(_("This action is not supported."), 'horde.warning');
171:                     }
172:                     break;
173: 
174:                 case 'vTodo':
175:                     // Import into Nag.
176:                     if ($registry->hasMethod('tasks/import')) {
177:                         try {
178:                             $guid = $registry->call('tasks/import', array(
179:                                 $components[$key],
180:                                 $mime_part->getType()
181:                             ));
182:                             $url = Horde::url($registry->link('tasks/show', array('uid' => $guid)));
183:                             $notification->push(
184:                                 _("The task has been added to your tasklist.") . '&nbsp;' .
185:                                     Horde::link($url, _("View task"), null, '_blank') .
186:                                     Horde_Themes_Image::tag('mime/icalendar.png', array('alt' => _("View task"))) .
187:                                     '</a>',
188:                                 'horde.success',
189:                                 array('content.raw')
190:                             );
191:                             $result = true;
192:                         } catch (Horde_Exception $e) {
193:                             $notification->push(sprintf(_("There was an error importing the task: %s"), $e->getMessage()), 'horde.error');
194:                         }
195:                     } else {
196:                         $notification->push(_("This action is not supported."), 'horde.warning');
197:                     }
198:                     break;
199: 
200:                 case 'vJournal':
201:                 default:
202:                     $notification->push(_("This action is not supported."), 'horde.warning');
203:                 }
204: 
205:                 if ($action == 'import') {
206:                     break;
207:                 }
208:                 // Fall-through for 'accept-import'
209: 
210:             case 'accept':
211:             case 'deny':
212:             case 'tentative':
213:                 // vEvent request.
214:                 if (isset($components[$key]) &&
215:                     ($components[$key]->getType() == 'vEvent')) {
216:                     $vEvent = $components[$key];
217: 
218:                     $resource = new Horde_Itip_Resource_Identity(
219:                         $injector->getInstance('IMP_Identity'),
220:                         $vEvent->getAttribute('ATTENDEE'),
221:                         $vars->identity
222:                     );
223: 
224:                     switch ($action) {
225:                     case 'accept':
226:                     case 'accept-import':
227:                         $type = new Horde_Itip_Response_Type_Accept($resource);
228:                         break;
229: 
230:                     case 'deny':
231:                         $type = new Horde_Itip_Response_Type_Decline($resource);
232:                         break;
233: 
234:                     case 'tentative':
235:                         $type = new Horde_Itip_Response_Type_Tentative($resource);
236:                         break;
237:                     }
238: 
239:                     try {
240:                         // Send the reply.
241:                         Horde_Itip::factory($vEvent, $resource)->sendMultiPartResponse(
242:                             $type,
243:                             new Horde_Itip_Response_Options_Horde(
244:                                 'UTF-8',
245:                                 array(
246:                                     'dns' => $injector->getInstance('Net_DNS2_Resolver'),
247:                                     'server' => $conf['server']['name']
248:                                 )
249:                             ),
250:                             $injector->getInstance('IMP_Mail')
251:                         );
252:                         $notification->push(_("Reply Sent."), 'horde.success');
253:                         $result = true;
254:                     } catch (Horde_Itip_Exception $e) {
255:                         $notification->push(sprintf(_("Error sending reply: %s."), $e->getMessage()), 'horde.error');
256:                     }
257:                 } else {
258:                     $notification->push(_("This action is not supported."), 'horde.warning');
259:                 }
260:                 break;
261: 
262:             case 'send':
263:             case 'reply':
264:             case 'reply2m':
265:                 // vfreebusy request.
266:                 if (isset($components[$key]) &&
267:                     ($components[$key]->getType() == 'vFreebusy')) {
268:                     $vFb = $components[$key];
269: 
270:                     // Get the organizer details.
271:                     try {
272:                         $organizer = parse_url($vFb->getAttribute('ORGANIZER'));
273:                     } catch (Horde_Icalendar_Exception $e) {
274:                         break;
275:                     }
276: 
277:                     $organizerEmail = $organizer['path'];
278: 
279:                     $organizer = $vFb->getAttribute('ORGANIZER', true);
280:                     $organizerFullEmail = new Horde_Mail_Rfc822_Address($organizerEmail);
281:                     if (isset($organizer['cn'])) {
282:                         $organizerFullEmail->personal = $organizer['cn'];
283:                     }
284: 
285:                     if ($action == 'reply2m') {
286:                         $startStamp = time();
287:                         $endStamp = $startStamp + (60 * 24 * 3600);
288:                     } else {
289:                         try {
290:                             $startStamp = $vFb->getAttribute('DTSTART');
291:                         } catch (Horde_Icalendar_Exception $e) {
292:                             $startStamp = time();
293:                         }
294: 
295:                         try {
296:                             $endStamp = $vFb->getAttribute('DTEND');
297:                         } catch (Horde_Icalendar_Exception $e) {}
298: 
299:                         if (!$endStamp) {
300:                             try {
301:                                 $duration = $vFb->getAttribute('DURATION');
302:                                 $endStamp = $startStamp + $duration;
303:                             } catch (Horde_Icalendar_Exception $e) {
304:                                 $endStamp = $startStamp + (60 * 24 * 3600);
305:                             }
306:                         }
307:                     }
308: 
309:                     $vfb_reply = $registry->call('calendar/getFreeBusy', array(
310:                         $startStamp,
311:                         $endStamp
312:                     ));
313: 
314:                     // Find out who we are and update status.
315:                     $identity = $injector->getInstance('IMP_Identity');
316:                     $email = $identity->getFromAddress();
317: 
318:                     // Build the reply.
319:                     $msg_headers = new Horde_Mime_Headers();
320: 
321:                     $vCal = new Horde_Icalendar();
322:                     $vCal->setAttribute('PRODID', '-//The Horde Project//' . $msg_headers->getUserAgent() . '//EN');
323:                     $vCal->setAttribute('METHOD', 'REPLY');
324:                     $vCal->addComponent($vfb_reply);
325: 
326:                     $message = _("Attached is a reply to a calendar request you sent.");
327:                     $body = new Horde_Mime_Part();
328:                     $body->setType('text/plain');
329:                     $body->setCharset('UTF-8');
330:                     $body->setContents(Horde_String::wrap($message, 76));
331: 
332:                     $ics = new Horde_Mime_Part();
333:                     $ics->setType('text/calendar');
334:                     $ics->setCharset('UTF-8');
335:                     $ics->setContents($vCal->exportvCalendar());
336:                     $ics->setName('icalendar.ics');
337:                     $ics->setContentTypeParameter('METHOD', 'REPLY');
338: 
339:                     $mime = new Horde_Mime_Part();
340:                     $mime->addPart($body);
341:                     $mime->addPart($ics);
342: 
343:                     // Build the reply headers.
344:                     $msg_headers->addReceivedHeader(array(
345:                         'dns' => $injector->getInstance('Net_DNS2_Resolver'),
346:                         'server' => $conf['server']['name']
347:                     ));
348:                     $msg_headers->addMessageIdHeader();
349:                     $msg_headers->addHeader('Date', date('r'));
350:                     $msg_headers->addHeader('From', $email);
351:                     $msg_headers->addHeader('To', $organizerFullEmail);
352: 
353:                     $identity->setDefault($vars->identity);
354:                     $replyto = $identity->getValue('replyto_addr');
355:                     if (!empty($replyto) && !$email->match($replyto)) {
356:                         $msg_headers->addHeader('Reply-To', $replyto);
357:                     }
358:                     $msg_headers->addHeader('Subject', _("Free/Busy Request Response"));
359: 
360:                     // Send the reply.
361:                     try {
362:                         $mime->send($organizerEmail, $msg_headers, $injector->getInstance('IMP_Mail'));
363:                         $notification->push(_("Reply Sent."), 'horde.success');
364:                         $result = true;
365:                     } catch (Exception $e) {
366:                         $notification->push(sprintf(_("Error sending reply: %s."), $e->getMessage()), 'horde.error');
367:                     }
368:                 } else {
369:                     $notification->push(_("Invalid Action selected for this component."), 'horde.warning');
370:                 }
371:                 break;
372: 
373:             case 'nosup':
374:                 // vFreebusy request.
375:             default:
376:                 $notification->push(_("This action is not supported."), 'horde.warning');
377:                 break;
378:             }
379:         }
380: 
381:         return $result;
382:     }
383: 
384:     protected function _handlevEvent($key, array $components, $mime_part)
385:     {
386:         global $notification, $registry;
387: 
388:         try {
389:             $guid = $components[$key]->getAttribute('UID');
390:         } catch (Horde_Icalendar_Exception $e) {
391:             /* If required UID parameter doesn't exist, make one
392:              * up so the user can at least add the event to the
393:              * calendar. */
394:             $guid = strval(new Horde_Support_Guid());
395:         }
396: 
397:         // Check if this is an update.
398:         try {
399:             $registry->call('calendar/export', array($guid, 'text/calendar'));
400:             $success = true;
401:         } catch (Horde_Exception $e) {
402:             $success = false;
403:         }
404: 
405:         // Try to update in calendar.
406:         if ($success && $registry->hasMethod('calendar/replace')) {
407:             try {
408:                 $registry->call('calendar/replace', array(
409:                     $guid,
410:                     $components[$key],
411:                     $mime_part->getType()
412:                 ));
413:                 $url = Horde::url($registry->link('calendar/show', array('uid' => $guid)));
414:                 $notification->push(
415:                     _("The event was updated in your calendar.") . '&nbsp;' .
416:                         Horde::link($url, _("View event"), null, '_blank') .
417:                         Horde_Themes_Image::tag('mime/icalendar.png', array('alt' => _("View event"))) .
418:                         '</a>',
419:                     'horde.success',
420:                     array('content.raw')
421:                 );
422:                 return true;
423:             } catch (Horde_Exception $e) {
424:                 // Could be a missing permission.
425:                 $notification->push(sprintf(_("There was an error updating the event: %s Trying to import the event instead."), $e->getMessage()), 'horde.warning');
426:             }
427:         }
428: 
429:         if ($registry->hasMethod('calendar/import')) {
430:             // Import into calendar.
431:             try {
432:                 $guid = $registry->call('calendar/import', array(
433:                     $components[$key],
434:                     $mime_part->getType()
435:                 ));
436:                 $url = Horde::url($registry->link('calendar/show', array('uid' => $guid)));
437:                 $notification->push(
438:                     _("The event was added to your calendar.") . '&nbsp;' .
439:                         Horde::link($url, _("View event"), null, '_blank') .
440:                         Horde_Themes_Image::tag('mime/icalendar.png', array('alt' => _("View event"))) .
441:                         '</a>',
442:                     'horde.success',
443:                     array('content.raw')
444:                 );
445:                 return true;
446: 
447:             } catch (Horde_Exception $e) {
448:                 $notification->push(sprintf(_("There was an error importing the event: %s"), $e->getMessage()), 'horde.error');
449:             }
450:         }
451: 
452:         $notification->push(_("This action is not supported."), 'horde.warning');
453: 
454:         return false;
455:     }
456: 
457: }
458: 
API documentation generated by ApiGen