diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7bd5793 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +zarafa-6.30.14.tar.gz diff --git a/dead.package b/dead.package deleted file mode 100644 index 0f98991..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -Package is retired diff --git a/sources b/sources new file mode 100644 index 0000000..8af1e15 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +fa3183f71027b8025373b05f27aaf742 zarafa-6.30.14.tar.gz diff --git a/zarafa-6.30.10-chmod.patch b/zarafa-6.30.10-chmod.patch new file mode 100644 index 0000000..ef7a706 --- /dev/null +++ b/zarafa-6.30.10-chmod.patch @@ -0,0 +1,13 @@ +Patch by Robert Scheck for zarafa >= 6.30.10, which adds a missing include for +the later in the code used chmod() command. Without this include, building on Fedora 13 fails. + +--- zarafa-6.30.10/provider/server/ECSoapServerConnection.cpp 2010-01-26 17:34:51.000000000 +0100 ++++ zarafa-6.30.10/provider/server/ECSoapServerConnection.cpp.chmod 2010-02-06 12:36:22.000000000 +0100 +@@ -51,6 +51,7 @@ + + #include "ECLogger.h" + ++#include + #ifdef HAVE_SYS_UN_H + #include + #endif diff --git a/zarafa-6.30.10-undefined-symbol.patch b/zarafa-6.30.10-undefined-symbol.patch new file mode 100644 index 0000000..c4b2083 --- /dev/null +++ b/zarafa-6.30.10-undefined-symbol.patch @@ -0,0 +1,35 @@ +diff -ur zarafa-6.30.10.orig/mapi4linux/src/m4lguids.cpp zarafa-6.30.10/mapi4linux/src/m4lguids.cpp +--- zarafa-6.30.10.orig/mapi4linux/src/m4lguids.cpp 2010-01-26 17:34:48.000000000 +0100 ++++ zarafa-6.30.10/mapi4linux/src/m4lguids.cpp 2010-02-04 09:53:48.459239670 +0100 +@@ -48,6 +48,7 @@ + */ + + #include "platform.h" ++/*#ifndef WINCE + #define USES_IID_IUnknown + #define USES_IID_IStream + #define USES_IID_ISequentialStream +@@ -60,7 +61,8 @@ + #define USES_IID_IMAPIProp + #define USES_IID_IMAPIFolder + #define USES_IID_IMAPITable ++#endif + #include +- ++*/ + #include "mapiguid.h" + #include "m4l.mapiutil.h" +diff -ur zarafa-6.30.10.orig/mapi4linux/src/Makefile.am zarafa-6.30.10/mapi4linux/src/Makefile.am +--- zarafa-6.30.10.orig/mapi4linux/src/Makefile.am 2010-01-26 12:05:22.000000000 +0100 ++++ zarafa-6.30.10/mapi4linux/src/Makefile.am 2010-02-04 09:51:39.285239878 +0100 +@@ -3,7 +3,9 @@ + AM_CPPFLAGS = $(DEBUGFLAGS) -DLINUX -I$(top_srcdir)/mapi4linux/include -I$(top_srcdir)/provider/common -I${top_srcdir}/common -I${top_srcdir}/libfreebusy + AM_LDFLAGS = $(DL_LIBS) -export-symbols ${top_srcdir}/mapi4linux/src/mapi-exports.sym + +-libmapi_la_LIBADD = ${top_builddir}/common/libcommon_util.la ++libmapi_la_LIBADD = ${top_builddir}/common/libcommon_util.la \ ++ ${top_builddir}/common/libcommon_mapi.la \ ++ $(PROG_LIBS) + + # required because we're exporting extern "C" functions and want to filter with 'export-symbols' + CXXLD=--tag=none gcc diff --git a/zarafa-6.30.4-brodowski.patch b/zarafa-6.30.4-brodowski.patch new file mode 100644 index 0000000..9c97208 --- /dev/null +++ b/zarafa-6.30.4-brodowski.patch @@ -0,0 +1,774 @@ +diff -ruN /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.autoarchivesettings.php mapi/class.autoarchivesettings.php +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.autoarchivesettings.php Thu Jan 1 01:00:00 1970 ++++ mapi/class.autoarchivesettings.php Sat Aug 8 11:49:05 2009 +@@ -0,0 +1,218 @@ ++. ++ * ++ */ ++ ++?> ++ ++ */ ++ ++class AutoArchiveSettings { ++ ++ var $session; ++ var $store; ++ var $folder; ++ var $proptags; ++ ++ function agingproperties() { ++ $properties = array(); ++ $properties["entryid"] = PR_ENTRYID; ++ $properties["parent_entryid"] = PR_PARENT_ENTRYID; ++ $properties["message_class"] = PR_MESSAGE_CLASS; ++ $properties["icon_index"] = PR_ICON_INDEX; ++ $properties["display_to"] = PR_DISPLAY_TO; ++ $properties["display_cc"] = PR_DISPLAY_CC; ++ $properties["subject"] = PR_SUBJECT; ++ $properties["importance"] = PR_IMPORTANCE; ++ $properties["sent_representing_name"] = PR_SENT_REPRESENTING_NAME; ++ $properties["sent_representing_email_address"] = PR_SENT_REPRESENTING_EMAIL_ADDRESS; ++ $properties["sent_representing_addrtype"] = PR_SENT_REPRESENTING_ADDRTYPE; ++ $properties["sent_representing_entryid"] = PR_SENT_REPRESENTING_ENTRYID; ++ $properties["sender_email_address"] = PR_SENDER_EMAIL_ADDRESS; ++ $properties["sender_name"] = PR_SENDER_NAME; ++ $properties["received_by_name"] = PR_RECEIVED_BY_NAME; ++ $properties["received_by_email_address"] = PR_RECEIVED_BY_EMAIL_ADDRESS; ++ $properties["message_delivery_time"] = PR_MESSAGE_DELIVERY_TIME; ++ $properties["last_modification_time"] = PR_LAST_MODIFICATION_TIME; ++ $properties["last_verb_executed"] = PR_LAST_VERB_EXECUTED; ++ $properties["last_verb_execution_time"] = PR_LAST_VERB_EXECUTION_TIME; ++ $properties["hasattach"] = PR_HASATTACH; ++ $properties["message_size"] = PR_MESSAGE_SIZE; ++ $properties["message_flags"] = PR_MESSAGE_FLAGS; ++ $properties["flag_status"] = PR_FLAG_STATUS; ++ $properties["flag_complete_time"] = PR_FLAG_COMPLETE_TIME; ++ $properties["flag_icon"] = PR_FLAG_ICON; ++ $properties["reminder_time"] = "PT_SYSTIME:PSETID_Common:0x8502"; ++ $properties["reminder_set"] = "PT_BOOLEAN:PSETID_Common:0x8503"; ++ $properties["flag_request"] = "PT_STRING8:PSETID_Common:0x8530"; ++ $properties["flag_due_by"] = "PT_SYSTIME:PSETID_Common:0x8560"; ++ $properties["reply_requested"] = PR_REPLY_REQUESTED; ++ $properties["reply_time"] = PR_REPLY_TIME; ++ $properties["response_requested"] = PR_RESPONSE_REQUESTED; ++ $properties["client_submit_time"] = PR_CLIENT_SUBMIT_TIME; ++ $properties["sensitivity"] = PR_SENSITIVITY; ++ $properties["read_receipt_requested"] = PR_READ_RECEIPT_REQUESTED; ++ $properties["location"] = "PT_STRING8:PSETID_Appointment:0x8208"; ++ $properties["categories"] = "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords"; ++ $properties["transport_message_headers"] = PR_TRANSPORT_MESSAGE_HEADERS; ++ $properties["contacts"] = "PT_MV_STRING8:PSETID_Common:0x853A"; ++ $properties["contacts_string"] = "PT_STRING8:PSETID_Common:0x8586"; ++ ++ $properties["aging_period"] = PR_AGING_PERIOD; // max 3 digits ++ $properties["aging_granularity"] = PR_AGING_GRANULARITY; // 0=month, 1=weeks, 2=days ++ $properties["aging_filename"] = PR_AGING_FILENAME; ++ $properties["aging_age_folder"] = PR_AGING_AGE_FOLDER; ++ $properties["aging_deleted_items"] = PR_AGING_DELETE_ITEMS; ++ $properties["aging_dont_age_me"] = PR_AGING_DONT_AGE_ME; ++ $properties["aging_file_name_after9"] = PR_AGING_FILE_NAME_AFTER9; ++ $properties["aging_when_deleted_on_server"] = PR_AGING_WHEN_DELETED_ON_SERVER; ++ $properties["aging_wait_until_expired"] = PR_AGING_WAIT_UNTIL_EXPIRED; ++ $properties["aging_version"] = PR_AGING_VERSION; ++ $properties["aging_default"] = PR_AGING_DEFAULT; ++ ++ $properties["deleted_on"] = PR_DELETED_ON; ++ $properties["updatecounter"] = "PT_LONG:PSETID_Appointment:0x8201"; ++ $properties["hideattachments"] = "PT_BOOLEAN:PSETID_Common:0x8514"; ++ ++ return $properties; ++ } ++ ++ /** ++ * Constuctor ++ * ++ * @param mapi_session $session MAPI Session ++ * @param mapi_folder $folder Folder to use for AutoArchive Settings retrival ++ */ ++ ++ function retrieveSettings($session, $store, $folder, $properties = NULL) ++ { ++ if ($properties == NULL) { ++ $properties = $this->agingproperties(); ++ }; ++ ++ $this->proptags = getPropIdsFromStrings($store, $properties); ++ ++ $this->session = $session; ++ $this->store = $store; ++ $this->folder = $folder; ++ ++ $msg = $this->getMessage(); ++ ++ $props = mapi_getprops($msg,$this->proptags); ++ ++ $data = $props; ++ ++ return $data; ++ } ++ ++ function getMessage() { ++ $table = mapi_folder_getcontentstable($this->folder, MAPI_ASSOCIATED); ++ mapi_table_sort($table, array(PR_RECEIPT_TIME => TABLE_SORT_ASCEND)); ++ $restriction = array ( RES_PROPERTY, ++ array ( RELOP => RELOP_EQ, ++ ULPROPTAG => PR_MESSAGE_CLASS, ++ VALUE => array (PR_MESSAGE_CLASS => "IPC.MS.Outlook.AgingProperties") ++ ) ++ ); ++ $msgs = mapi_table_queryallrows($table,array(PR_ENTRYID),$restriction); ++ if (isset($msgs[0][PR_ENTRYID])) { ++ $msg = mapi_msgstore_openentry($this->store,$msgs[0][PR_ENTRYID]); ++ } else { ++ $this->createMessage(); ++ $msg = $this->getMessage(); ++ } ++ return $msg; ++ } ++ ++ function updateSettings($session, $store, $folder, $uprops) { ++ $properties = $this->agingproperties(); ++ ++ $this->session = $session; ++ $this->store = $store; ++ $this->folder = $folder; ++ ++ $msg = $this->getMessage(); ++ ++ $write_props = array(); ++ ++ if (isset($uprops["aging_period"])) $write_props[$properties["aging_period"]] = $uprops["aging_period"]; ++ if (isset($uprops["aging_granularity"])) $write_props[$properties["aging_granularity"]] = $uprops["aging_granularity"]; ++ if (isset($uprops["aging_age_folder"])) $write_props[$properties["aging_age_folder"]] = $uprops["aging_age_folder"]; ++ if (isset($uprops["aging_deleted_items"])) $write_props[$properties["aging_deleted_items"]] = $uprops["aging_deleted_items"]; ++ if (isset($uprops["aging_filename"])) $write_props[$properties["aging_filename"]] = $uprops["aging_filename"]; ++ if (isset($uprops["aging_file_name_after9"])) $write_props[$properties["aging_file_name_after9"]] = $uprops["aging_file_name_after9"]; ++ if (isset($uprops["aging_version"])) $write_props[$properties["aging_version"]] = $uprops["aging_version"]; ++ if (isset($uprops["aging_default"])) $write_props[$properties["aging_default"]] = $uprops["aging_default"]; ++ ++ mapi_setprops($msg,$write_props); ++ ++ mapi_savechanges($msg); ++ ++ } ++ ++ function createMessage() { ++ ++ $properties = $this->agingproperties(); ++ ++ $write_props = array( $properties["message_class"] => "IPC.MS.Outlook.AgingProperties", ++ $properties["display_to"] => NULL, ++ $properties["display_cc"] => NULL, ++ $properties["aging_period"] => "3", ++ $properties["aging_granularity"] => "0", ++ $properties["aging_age_folder"] => "0", ++ $properties["aging_deleted_items"] => "0", ++ $properties["aging_filename"] => "", ++ $properties["aging_file_name_after9"] => "", ++ $properties["aging_version"] => "2", ++ $properties["aging_default"] => "0" ++ ); ++ ++ $msg = mapi_folder_createmessage($this->folder,MAPI_ASSOCIATED); ++ ++ mapi_setprops($msg,$write_props); ++ ++ mapi_savechanges($msg); ++ ++ } ++ ++} ++?> +diff -ruN /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.linkedappointment.php mapi/class.linkedappointment.php +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.linkedappointment.php Thu Jan 1 01:00:00 1970 ++++ mapi/class.linkedappointment.php Fri Aug 14 11:16:18 2009 +@@ -0,0 +1,393 @@ ++. ++ * ++ */ ++?> ++ ++ */ ++ ++class linkedAppointment ++{ ++ ++ /** ++ * @var object Mapi Message Store (may be null if readonly) ++ */ ++ var $_store; ++ ++ var $_contactmapping = array ( ++ "fileas" => "PT_STRING8:{00062004-0000-0000-C000-000000000046}:0x8005", ++ "birthday_event_entryid" => "PT_BINARY:{00062004-0000-0000-C000-000000000046}:0x804d", ++ "anniversary_event_entryid" => "PT_BINARY:{00062004-0000-0000-C000-000000000046}:0x804e", ++ "birthday" => PR_BIRTHDAY, ++ "anniversary" => PR_WEDDING_ANNIVERSARY, ++ "entryid" => PR_ENTRYID, ++ "search_key" => PR_SEARCH_KEY ++ ); ++ ++ var $_appointmentmapping = array ( ++ "alldayevent" => "PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0x8215", ++ "body" => PR_BODY, ++ "busystatus" => "PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8205", ++ "categories" => "PT_MV_STRING8:{00020329-0000-0000-C000-000000000046}:Keywords", ++ "rtf" => PR_RTF_COMPRESSED, ++ "dtstamp" => PR_LAST_MODIFICATION_TIME, ++ "endtime" => "PT_SYSTIME:{00062002-0000-0000-C000-000000000046}:0x820e", ++ "location" => "PT_STRING8:{00062002-0000-0000-C000-000000000046}:0x8208", ++ "meetingstatus" => "PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8217", ++ "reminder" => "PT_LONG:{00062008-0000-0000-C000-000000000046}:0x8501", ++ "sensitivity" => PR_SENSITIVITY, ++ "subject" => PR_SUBJECT, ++ "starttime" => "PT_SYSTIME:{00062002-0000-0000-C000-000000000046}:0x820d", ++ "uid" => "PT_BINARY:{6ED8DA90-450B-101B-98DA-00AA003F1305}:0x3", ++ // Append the appointment attributes since we need them for appointment creation ++ "label" => "PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8214", ++ "recurring" => "PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0x8223", ++ "recurring_data" => "PT_BINARY:{00062002-0000-0000-C000-000000000046}:0x8216", ++ "recurring_pattern" => "PT_STRING8:{00062002-0000-0000-C000-000000000046}:0x8232", ++ "basedate" => "PT_SYSTIME:{00062002-0000-0000-C000-000000000046}:0x8228", ++ "icon_index" => PR_ICON_INDEX, ++ "entryid" => PR_ENTRYID, ++ "message_class" => PR_MESSAGE_CLASS, ++ "parententryid" => PR_PARENT_ENTRYID, ++ "message_flags" => PR_MESSAGE_FLAGS, ++ "importance" => PR_IMPORTANCE, ++ // Append the common attributes since we need them for appointment creation ++ "contacts" => "PT_MV_STRING8:{00062008-0000-0000-C000-000000000046}:0x853a", ++ "contacts_string" => "PT_STRING8:{00062008-0000-0000-C000-000000000046}:0x8586", ++ "commonstart" => "PT_SYSTIME:{00062008-0000-0000-C000-000000000046}:0x8516", ++ "commonend" => "PT_SYSTIME:{00062008-0000-0000-C000-000000000046}:0x8517", ++ "remindertime" => "PT_SYSTIME:{00062008-0000-0000-C000-000000000046}:0x8502", ++ "duration" => "PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8213", ++ "reminder_minutes" => "PT_LONG:{00062008-0000-0000-C000-000000000046}:0x8501", ++ "reminder" => "PT_BOOLEAN:{00062008-0000-0000-C000-000000000046}:0x8503", ++ "flagdueby" => "PT_SYSTIME:{00062008-0000-0000-C000-000000000046}:0x8560", ++ "lid_contact_link_search_key" => "PT_BINARY:{00062008-0000-0000-C000-000000000046}:0x8584", ++ "lid_contact_link_entryid" => "PT_BINARY:{00062008-0000-0000-C000-000000000046}:0x8585" ++ ); ++ ++ /** ++ * Constructor ++ * @param resource $store MAPI Message Store Object ++ * @param resource $message the MAPI Source message ++ */ ++ function linkedAppointment($_store) ++ { ++ $this->_store = $_store; ++ } ++ ++ function setLinkedContact($mapimessage) ++ { ++ // get the linked contact (if any) ++ // Set the appointment attributes ++ $aprops = $this->_appointmentmapping; ++ // Get the id's of the above... ++ foreach ($aprops as $key => $value) { ++ $aprops[$key] = $this->GetPropIDFromString($this->_store, $value); ++ } ++ $appointment = mapi_getprops($mapimessage, $aprops); ++ $recurrence = new Recurrence($this->_store, $mapimessage); ++ $recur = $recurrence->getRecurrence(); ++ if (isset($appointment[$aprops["lid_contact_link_entryid"]])) { ++ // we have a linked contact. so continue here, otherwise exit silently... ++ $entryid = $this->_unpackContactLinkEntryIDS(bin2hex($appointment[$aprops["lid_contact_link_entryid"]])); ++ // Set the contact attributes ++ $cprops = $this->_contactmapping; ++ // Get the id's of the above... ++ foreach ($cprops as $key => $value) { ++ $cprops[$key] = $this->GetPropIDFromString($this->_store, $value); ++ } ++ foreach ($entryid as $value) { ++ if (($contact_msg = mapi_msgstore_openentry($this->_store,$value))) { ++ $contact = mapi_getprops($contact_msg, $cprops); ++ switch ($appointment[$aprops["entryid"]]) { ++ case $contact[$cprops["birthday_event_entryid"]] : ++ if ($contact[$cprops["birthday"]] != $recur["start"]) { ++ mapi_setprops($contact_msg,array($cprops["birthday"] => $recur["start"])); ++ mapi_savechanges($contact_msg); ++ } ++ break; ++ case $contact[$cprops["anniversary_event_entryid"]] : ++ if ($contact[$cprops["anniversary"]] != $recur["start"]) { ++ mapi_setprops($contact_msg,array($cprops["anniversary"] => $recur["start"])); ++ mapi_savechanges($contact_msg); ++ } ++ break; ++ } ++ } ++ } ++ } ++ } ++ // $what 0x01 = birthday 0x02 = anniversary ++ function setLinkedAppointment($mapimessage,$what) ++ { ++ // We love MS for this... ++ $arrayMonth = array(0,44640,84960,129600,172800,217440,260640,305280,348480,393120,437760,480960); ++ ++ // Set the appointment attributes ++ $aprops = $this->_appointmentmapping; ++ // Get the id's of the above... ++ foreach ($aprops as $key => $value) { ++ $aprops[$key] = $this->GetPropIDFromString($this->_store, $value); ++ } ++ ++ // Set the contact attributes ++ $cprops = $this->_contactmapping; ++ // Get the id's of the above... ++ foreach ($cprops as $key => $value) { ++ $cprops[$key] = $this->GetPropIDFromString($this->_store, $value); ++ } ++ ++ // Get the contact properties ++ $contact = mapi_getprops($mapimessage,$cprops); ++ ++ // open root container, if not existing, leave this function... ++ $rootcontainer = mapi_msgstore_openentry($this->_store); ++ if ($rootcontainer) { ++ // find the appointment container, if this fails, leave this function since we cannot proceed... ++ if (($rootcontainerprops = mapi_getprops($rootcontainer, array(PR_IPM_APPOINTMENT_ENTRYID)))) { ++ $parententryid = $rootcontainerprops[PR_IPM_APPOINTMENT_ENTRYID]; ++ ++ $entryid = false; ++ switch ($what) { ++ case 0x01 : if (isset($contact[$cprops["birthday_event_entryid"]])) ++ $entryid = $contact[$cprops["birthday_event_entryid"]]; ++ $entrydate = $contact[$cprops["birthday"]]; ++ $entryprop = $cprops["birthday_event_entryid"]; ++ $entrylabel = 8; ++ $entrysubject = _("Birthday")." "._("of")." ".$contact[$cprops["fileas"]]; ++ break; ++ case 0x02 : if (isset($contact[$cprops["anniversary_event_entryid"]])) ++ $entryid = $contact[$cprops["anniversary_event_entryid"]]; ++ $entrydate = $contact[$cprops["anniversary"]]; ++ $entryprop = $cprops["anniversary_event_entryid"]; ++ $entrylabel = 9; ++ $entrysubject = _("Special Date")." "._("of")." ".$contact[$cprops["fileas"]]; ++ break; ++ } ++ ++ if ($entrydate) { ++ // open if there is a linked appointment and it can be opened (no one deleted it by accident...) ++ // otherwise create it. ++ if ($entryid && ++ ($appointment_msg = mapi_msgstore_openentry($this->_store,$entryid))) { ++ $appointment = mapi_getprops($appointment_msg); ++ } else { ++ // create with base settings ++ $folder = mapi_msgstore_openentry($this->_store,$parententryid); ++ $appointment_msg = mapi_folder_createmessage($folder); ++ $appointment = array($aprops["message_class"] => "IPM.Appointment", ++ $aprops["location"] => "", ++ $aprops["body"] => "", ++ $aprops["busystatus"] => 0 ++ ); ++ mapi_setprops($appointment_msg,$appointment); ++ } ++ // Have the starttime im GMT ++ $starttime = gmmktime(0,0,0, ++ date("m",$entrydate), ++ date("j",$entrydate), ++ date("Y",$entrydate)); ++ // Just update something in case changes occured to reduce amount ++ // of sync activities... ++ ++ if ($entrydate != $appointment[$aprops["starttime"]] || ++ $entrysubject != $appointment[$aprops["subject"]]) { ++ // Reset the subject in case the name has changed ++ $appointment[$aprops["subject"]] = $entrysubject; ++ // Set the label to 8 = birthday and 9 = anniversary ++ $appointment[$aprops["label"]] = $entrylabel; ++ // Instead of having rubbish inside... ++ $appointment[$aprops["recurring_pattern"]] = ""; ++ // Setting the reminder values ++ $appointment[$aprops["reminder"]] = true; ++ $appointment[$aprops["reminder_minutes"]] = 15; ++ $appointment[$aprops["remindertime"]] = $starttime-(15*60); ++ // Setting start & Endtime ++ $appointment[$aprops["starttime"]] = $starttime; ++ $appointment[$aprops["endtime"]] = $starttime + 86400; ++ // Set duration upon diff between start and endtime in minutes. ++ $appointment[$aprops["duration"]] = ($appointment[$aprops["endtime"]] - $appointment[$aprops["starttime"]]) / 60; ++ // Sure... birthdays and anniversaries occur on daily base :-) ++ $appointment[$aprops["recurring"]] = true; ++ $appointment[$aprops["alldayevent"]] = true; ++ // Update the id's and search keys ++ $appointment[$aprops["lid_contact_link_entryid"]] = hex2bin($this->_packContactLinkEntryIDS(array($contact[$cprops["entryid"]]))); ++ $appointment[$aprops["lid_contact_link_search_key"]] = hex2bin($this->_packContactLinkSearchKeys(array($contact[$cprops["search_key"]]))); ++ // Set the changed properties ++ mapi_setprops($appointment_msg,$appointment); ++ $recurrence = new Recurrence($this->_store, $appointment_msg); ++ $tz = array(); ++ $tz["timezone"] = (($entrydate-$starttime)/3600)*60; ++ $tz["timezonedst"] = 0; ++ $tz["dstendmonth"] = 0; ++ $tz["dstendweek"] = 0; ++ $tz["dstendhour"] = 0; ++ $tz["dststartmonth"] = 0; ++ $tz["dststartweek"] = 0; ++ $tz["dststarthour"] = 0; ++ // Set the iconindex to be recurring ++ $appointment[$aprops["icon_index"]] = 1025; ++ // Set the changed properties ++ $appointment = mapi_setprops($appointment_msg,$appointment); ++ // Recurring values ++ $recur["type"] = 13; ++ $recur["subtype"] = 2; ++ $recur["month"] = $arrayMonth[gmdate("m",$starttime)-1]; ++ $recur["everyn"] = 12; ++ $recur["regen"] = 1; ++ $recur["monthday"] = gmdate("j",$starttime); ++ $recur["term"] = 0x23; ++ $recur["numoccur"] = 0; ++ $recur["start"] = $starttime; ++ $recur["end"] = 79870662000; // no end ++ $recur["startocc"] = 0; ++ $recur["endocc"] = 1440; ++ // Let class.recurrence do its job. ++ $recurrence->setRecurrence($tz, $recur); ++ // Save the changes to message ++ mapi_savechanges($appointment_msg); ++ $appointment = mapi_getprops($appointment_msg); ++ mapi_setprops($mapimessage,array($entryprop => $appointment[$aprops['entryid']])); ++ mapi_savechanges($mapimessage); ++ } ++ } ++ } ++ } ++ } ++ /** ++ * unpacks the Contact Link Entry IDs ++ * ++ * @param string in hex with the value ++ * @return array with all binary Contact Link Entry IDS ++ * ++ */ ++ function _unpackContactLinkEntryIDS($value) ++ { ++ $contact_link_entry_ids = unpack("Vcount",hex2bin(substr($value,0,8))); ++ $contact_link_entry_ids["entry_ids"] = array(); ++ $length=8; ++ for ($j=0,$i=8;$j<$contact_link_entry_ids["count"];$j++,$i=$i+$length+8) { ++ $l = unpack("Vlength",hex2bin(substr($value,$i,8))); ++ $length=$l["length"]; ++ $temp = unpack ("VFlags/A16ProviderUID/VVersion/VType/VIndext/Vcbid/A*abeid",hex2bin(substr($value,$i+8,($length*2)))); ++ $temp["abeid"] = hex2bin(substr(bin2hex($temp["abeid"]),0,$temp["cbid"]*2)); ++ $contact_link_entry_ids["entry_ids"][]=$temp["abeid"]; ++ } ++ return $contact_link_entry_ids["entry_ids"]; ++ } ++ ++ /** ++ * packs the Contact Link Entry IDs ++ * ++ * @param array with all binary Contact Link Entry IDs ++ * @return string in hex with the value ++ * ++ */ ++ function _packContactLinkEntryIDS($values) { ++ $temp=""; ++ for ($i=0;$i +diff -ruN /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.recurrence.php mapi/class.recurrence.php +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/class.recurrence.php Fri Oct 16 21:05:22 2009 ++++ mapi/class.recurrence.php Tue Oct 20 19:29:54 2009 +@@ -363,9 +363,13 @@ + * @param array $exception_props the exception properties (same properties as normal recurring items) + * @param date $base_date the base date of the exception (actual GMT time of non-exception occurrence) + * @param boolean $delete true - delete occurrence, false - create new exception or modify existing ++ * @param boolean $islocal true - expect the base_date in local time (happens in case basedate is returned from WA! + */ +- function createException($exception_props, $base_date, $delete = false) ++ function createException($exception_props, $base_date, $delete = false, $islocal=false) + { ++ // CHANGED dw2412 to support local base_date as delivered from WebAccess ++ if ($islocal == true) $base_date = $this->toGMT($this->tz, $base_date); ++ + $baseday = $this->dayStartOf($this->fromGMT($this->tz, $base_date)); + $basetime = $baseday + $this->recur["startocc"] * 60; + +@@ -447,8 +451,10 @@ + * Modifies an existing exception, but only updates the given properties + * NOTE: You can't remove properites from an exception, only add new ones + */ +- function modifyException($exception_props, $base_date) ++ function modifyException($exception_props, $base_date, $islocal=false) + { ++ // ADDED dw2412 to support local base_date as delivered from WebAccess ++ if ($islocal == true) $base_date = $this->toGMT($this->tz, $base_date); + if(!$this->isValidExceptionDate($base_date, $exception_props[$this->proptags["startdate"]])) + return false; + +@@ -573,13 +579,17 @@ + + // Returns the start or end time of the occurrence on the given base date. + // This assumes that the basedate you supply is correct .. ! +- function getOccurrenceStart($basedate) { +- $daystart = $this->dayStartOf($this->fromGMT($this->tz, $basedate)); ++ function getOccurrenceStart($basedate, $islocal = false) { ++ // CHANGED dw2412 to support local base_date as delivered from WebAccess ++ if ($islocal == false) $daystart = $this->dayStartOf($this->fromGMT($this->tz, $basedate)); ++ else $daystart = $this->dayStartOf($basedate); + return $this->toGMT($this->tz, $daystart + $this->recur["startocc"] * 60); + } + +- function getOccurrenceEnd($basedate) { +- $daystart = $this->dayStartOf($this->fromGMT($this->tz, $basedate)); ++ function getOccurrenceEnd($basedate, $islocal = false) { ++ // CHANGED dw2412 to support local base_date as delivered from WebAccess ++ if ($islocal == false) $daystart = $this->dayStartOf($this->fromGMT($this->tz, $basedate)); ++ else $daystart = $this->dayStartOf($basedate); + return $this->toGMT($this->tz, $daystart + $this->recur["endocc"] * 60); + } + +@@ -1229,8 +1239,12 @@ + /** + * Returns the exception if there is a CHANGE exception on the given base date, or FALSE otherwise + */ +- function getChangeException($basedate) ++ function getChangeException($basedate, $islocal) + { ++ // CHANGED dw2412 to support local base_date as delivered from WebAccess ++ if ($islocal == true) $basedate = $this->toGMT($this->tz, $basedate); ++ ++ + // Check if the occurrence is modified on the specified date + foreach($this->recur["changed_occurences"] as $changed) + { +@@ -1263,7 +1277,6 @@ + function dayStartOf($date) + { + $time1 = $this->gmtime($date); +- + return gmmktime(0, 0, 0, $time1["tm_mon"] + 1, $time1["tm_mday"], $time1["tm_year"] + 1900); + } + +diff -ruN /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/mapiguid.php mapi/mapiguid.php +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/mapiguid.php Fri Oct 16 21:05:22 2009 ++++ mapi/mapiguid.php Tue Oct 20 19:29:54 2009 +@@ -67,4 +67,7 @@ + define('PS_MAPI', makeguid("{00020328-0000-0000-C000-000000000046}")); + define('PS_PUBLIC_STRINGS', makeguid("{00020329-0000-0000-C000-000000000046}")); + define('PS_INTERNET_HEADERS', makeguid("{00020386-0000-0000-c000-000000000046}")); ++ ++define('MAPIUID_LinkContactEntryID', makeguid("{0aaa42fe-c718-101a-e885-0b651c240000}")); // http://msdn.microsoft.com/en-us/library/bb820924.aspx misc2 in CONTAB structure in Internet This parameter is reserved for Outlook internal use and is not supported. ++ + ?> +diff -ruN /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/mapitags.php mapi/mapitags.php +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/include/mapi/mapitags.php Fri Oct 16 21:05:22 2009 ++++ mapi/mapitags.php Tue Oct 20 19:29:54 2009 +@@ -601,7 +601,25 @@ + define('PR_FINDER_ENTRYID' ,mapi_prop_tag(PT_BINARY, 0x35E7)); + define('PR_IPM_FAVORITES_ENTRYID' ,mapi_prop_tag(PT_BINARY, 0x6630)); + define('PR_IPM_PUBLIC_FOLDERS_ENTRYID' ,mapi_prop_tag(PT_BINARY, 0x6631)); ++//* start: Added dw2412 source www.cdolive.com/cdo10.htm ++define('PR_HAS_RULES' ,mapi_prop_tag(PT_BINARY, 0x663A)); + ++// Outlook AutoArchive Properties ++define('PR_AGING_PERIOD' ,mapi_prop_tag(PT_LONG, 0x36EC)); ++define('PR_AGING_GRANULARITY' ,mapi_prop_tag(PT_LONG, 0x36EE)); ++define('PR_AGING_FILENAME' ,mapi_prop_tag(PT_TSTRING, 0x6856)); ++define('PR_AGING_AGE_FOLDER' ,mapi_prop_tag(PT_BOOLEAN, 0x6857)); ++define('PR_AGING_DELETE_ITEMS' ,mapi_prop_tag(PT_BOOLEAN, 0x6855)); ++define('PR_AGING_FILE_NAME_AFTER9' ,mapi_prop_tag(PT_TSTRING, 0x6859)); ++define('PR_AGING_DONT_AGE_ME' ,mapi_prop_tag(PT_BOOLEAN, 0x6858)); ++define('PR_AGING_WHEN_DELETED_ON_SERVER' ,mapi_prop_tag(PT_BOOLEAN, 0x685B)); ++define('PR_AGING_WAIT_UNTIL_EXPIRED' ,mapi_prop_tag(PT_BOOLEAN, 0x685C)); ++define('PR_AGING_VERSION' ,mapi_prop_tag(PT_LONG, 0x685D)); ++define('PR_AGING_DEFAULT' ,mapi_prop_tag(PT_LONG, 0x685E)); ++ ++ ++ ++//* End : added dw2412 + + /* Proptags 0x35E8-0x35FF reserved for folders "guaranteed" by 'PR_VALID_FOLDER_MASK */ + +@@ -637,6 +655,19 @@ + define('PR_DEFAULT_VIEW_ENTRYID' ,mapi_prop_tag(PT_BINARY, 0x3616)); + define('PR_ASSOC_CONTENT_COUNT' ,mapi_prop_tag(PT_LONG, 0x3617)); + ++//* start: Added dw2412 source www.cdolive.com/cdo10.htm ++define('PR_DEF_FORM_ALLOWED' ,mapi_prop_tag(PT_LONG, 0x3FE2)); ++define('PR_PUBLISH_IN_ADDRESS_BOOK' ,mapi_prop_tag(PT_BOOLEAN, 0x3FE6)); ++define('PR_WEBPAGE' ,mapi_prop_tag(PT_TSTRING, 0x36DF)); ++define('PR_FOLDER_VIEWS_ONLY' ,mapi_prop_tag(PT_LONG, 0x36E1)); ++define('PR_DEF_MSG_CLASS' ,mapi_prop_tag(PT_TSTRING, 0x36E5)); ++define('PR_DEF_FORM_NAME' ,mapi_prop_tag(PT_TSTRING, 0x36E6)); ++define('PR_GENERATE_EXCHANGE_VIEWS' ,mapi_prop_tag(PT_BOOLEAN, 0x36E9)); ++define('PR_VIEW_NAME' ,mapi_prop_tag(PT_TSTRING, 0x7006)); ++define('PR_OFFLINE_FLAG' ,mapi_prop_tag(PT_LONG, 0x663D)); ++define('PR_REPLICA_VERSION' ,mapi_prop_tag(PT_LONG, 0x664B)); ++//* end : Added dw2412 ++ + define('PR_RIGHTS' ,mapi_prop_tag(PT_LONG, 0x6639)); + + /* Reserved 0x36C0-0x36FF */ +@@ -1231,6 +1262,9 @@ + + define('PR_PROCESSED', mapi_prop_tag(PT_BOOLEAN, 0x7D01)); + ++// ADDED dw2412 Contact Photo Attachment ++define('PR_ATTACHMENT_CONTACTPHOTO' ,mapi_prop_tag(PT_BOOLEAN, 0x7FFF)); ++ + // Delegates properties + define('PR_DELEGATES_SEE_PRIVATE', mapi_prop_tag(PT_MV_LONG, 0x686B)); + define('PR_SCHDINFO_DELEGATE_ENTRYIDS', mapi_prop_tag(PT_MV_BINARY, 0x6845)); +--- /usr/src/zarafa/zarafa-6.30.4.17264/php-ext/Makefile.am 2009-10-16 15:55:59.000000000 +0200 ++++ zarafa-6.30.4/php-ext/Makefile.am.brodowski 2009-10-24 23:48:37.000000000 +0200 +@@ -23,7 +23,7 @@ + # and be missing at runtime. + # therefore, we explicitly link mapi.so with -lpthread :( + +-dist_data_DATA = include/mapi/mapicode.php include/mapi/mapidefs.php include/mapi/mapitags.php include/mapi/mapi.util.php include/mapi/class.recurrence.php include/mapi/class.meetingrequest.php include/mapi/class.freebusypublish.php include/mapi/mapiguid.php ++dist_data_DATA = include/mapi/mapicode.php include/mapi/mapidefs.php include/mapi/mapitags.php include/mapi/mapi.util.php include/mapi/class.recurrence.php include/mapi/class.meetingrequest.php include/mapi/class.freebusypublish.php include/mapi/mapiguid.php include/mapi/class.autoarchivesettings.php include/mapi/class.linkedappointment.php + datadir = ${datarootdir}/php/mapi + + mapi_la_SOURCES = main.cpp Session.cpp SessionPool.cpp util.cpp \ diff --git a/zarafa-6.30.4-package.patch b/zarafa-6.30.4-package.patch new file mode 100644 index 0000000..3c42aa1 --- /dev/null +++ b/zarafa-6.30.4-package.patch @@ -0,0 +1,48 @@ +Patch by Robert Scheck for zarafa >= 6.30.4, which only +removes the paths from autoconf/automake related files, that don't exist in the OSS +version of Zarafa. Having these paths not removed causes autoreconf to fail, but a +re-run of autoreconf is needed in order to get the rpaths completely out of all the +libraries and binaries built during the make process. + +--- zarafa-6.30.4/configure.ac 2009-03-17 17:30:45.000000000 +0100 ++++ zarafa-6.30.4/configure.ac.fedora 2009-03-31 20:34:29.000000000 +0200 +@@ -591,17 +591,6 @@ + version + specialbuild + ]) +-dnl non-oss files +-if test -d `dirname $0`/licensed; then +-AC_CONFIG_FILES([ +- liblicense/Makefile +- licensed/Makefile +- ECtools/zarafa-backup/Makefile +- ECtools/zarafa-backup/helpers/Makefile +- ECtools/zarafa-report/Makefile +- debian/zarafa.install +-]) +-fi + + AC_OUTPUT + +--- zarafa-6.30.4/ECtools/Makefile.am 2009-04-23 22:10:44.000000000 +0200 ++++ zarafa-6.30.4/ECtools/Makefile.am.fedora 2009-04-25 21:20:43.000000000 +0200 +@@ -1,7 +1,3 @@ +-if ! OSS_ONLY +-PROSUBS = zarafa-backup zarafa-report +-endif +- + if WITH_TESTTOOLS + TESTSUBS = ECTestTools + endif +--- zarafa-6.30.4/Makefile.am 2009-04-23 22:10:44.000000000 +0200 ++++ zarafa-6.30.4/Makefile.am.fedora 2009-04-25 21:20:26.000000000 +0200 +@@ -1,9 +1,5 @@ + AUTOMAKE_OPTIONS = 1.8 foreign + +-if ! OSS_ONLY +-PROSUBS = liblicense licensed +-endif +- + SUBDIRS = common libfreebusy mapi4linux $(PROSUBS) provider libicalmapi inetmapi php-ext spooler gateway caldav ECtools installer po doc + + if WITH_PERL diff --git a/zarafa-6.30.4-perl.patch b/zarafa-6.30.4-perl.patch new file mode 100644 index 0000000..3c5bed5 --- /dev/null +++ b/zarafa-6.30.4-perl.patch @@ -0,0 +1,53 @@ +Patch by Robert Scheck for Zarafa >= 6.30.3, which +replaces the hardcoded perl directories by correct ones (in a dynamic way). Only +Debian and Ubuntu have ExtUtils in /usr/share, openSUSE, Fedora and RHEL/CentOS +use /usr/lib. So let us use the correct way to detect the directory. + +This patch should be an advantage to OSS users on non-Debian distributions when +using Perl API, as the correct directory will get picked up. + +--- zarafa-6.30.0/configure.ac 2009-07-20 18:41:07.000000000 +0200 ++++ zarafa-6.30.0/configure.ac.perl 2009-10-16 00:23:52.000000000 +0200 +@@ -127,6 +127,22 @@ + # build perl stuff + AC_ARG_ENABLE(perl, AC_HELP_STRING([--enable-perl], [enable building perl bindings]), [want_perl=${enableval}], [want_perl=no]) + AM_CONDITIONAL(WITH_PERL, test "$want_perl" = "yes") ++if test "x$want_perl" = "xyes"; then ++ AC_PATH_PROG([PERL], [perl], [no]) ++ if test "x$PERL" = "xno"; then ++ AC_MSG_ERROR([perl is required for building perl bindings]) ++ fi ++ ++ AC_MSG_CHECKING([for perl installarchlib]) ++ PERL_ARCHLIB=`$PERL -V:installarchlib | sed -e "s/^.*='//" -e "s/';$//"` ++ AC_MSG_RESULT([$PERL_ARCHLIB]) ++ AC_SUBST(PERL_ARCHLIB) ++ ++ AC_MSG_CHECKING([for perl privlib]) ++ PERL_PRIVLIB=`$PERL -V:privlib | sed -e "s/^.*='//" -e "s/';$//"` ++ AC_MSG_RESULT([$PERL_PRIVLIB]) ++ AC_SUBST(PERL_PRIVLIB) ++fi + + # testtools require ncurses + if test "$want_tests" = "yes"; then +--- zarafa-6.30.0/perl/Makefile.am 2009-07-20 18:41:06.000000000 +0200 ++++ zarafa-6.30.0/perl/Makefile.am.perl 2009-10-16 00:24:51.000000000 +0200 +@@ -1,7 +1,6 @@ + lib_LTLIBRARIES = libperlmapi.la + +-PVERSION=5.8.8 +-AM_CPPFLAGS = $(DEBUGFLAGS) -DLINUX -I$(top_srcdir)/mapi4linux/include -I$(top_srcdir)/provider/common -I${top_srcdir}/common -I/usr/lib/perl/$(PVERSION)/CORE ++AM_CPPFLAGS = $(DEBUGFLAGS) -DLINUX -I$(top_srcdir)/mapi4linux/include -I$(top_srcdir)/provider/common -I${top_srcdir}/common -I$(PERL_ARCHLIB)/CORE + + libperlmapi_la_LIBADD = ${top_builddir}/mapi4linux/src/libmapi.la \ + ${top_builddir}/common/libcommon_mapi.la \ +@@ -12,7 +11,7 @@ + CLEANFILES = MAPI.cpp + + .xs.cpp: typemap +- xsubpp -noprototypes -nolinenumbers -C++ -typemap /usr/share/perl/$(PVERSION)/ExtUtils/typemap $< > $@; \ ++ xsubpp -noprototypes -nolinenumbers -C++ -typemap $(PERL_PRIVLIB)/ExtUtils/typemap $< > $@; \ + if [ $$? -ne 0 ]; then rm $@; fi + + check-syntax: diff --git a/zarafa.ini b/zarafa.ini new file mode 100644 index 0000000..160434a --- /dev/null +++ b/zarafa.ini @@ -0,0 +1,2 @@ +; Enable Zarafa mapi extension module +extension=mapi.so diff --git a/zarafa.spec b/zarafa.spec new file mode 100644 index 0000000..ea52ca7 --- /dev/null +++ b/zarafa.spec @@ -0,0 +1,844 @@ +# +# Releasing with this .spec, for fun and profit; +# +# = Beta Release or Release Candidate = +# +# 1. Set beta_or_rc to 1 +# 2. Set actual_release to the actual_release value of the previous +# build attempt, +1 +# - The release tag in case of a beta_or_rc release is (statically) +# prefixed with "0.", so that the first final release ("1") is always +# newer (in rpm-compver). +# 3. Set the SVN revision to the current SVN revision; +# - This ensures a future SVN revision is always *more* recent in +# rpm-compver +# - Lacking a unique zarafa-.svn.tar.gz source +# tarball, setting the correct SVN revision in the .spec is +# critical in order to be able to determine exactly what was in +# the tarball at the time of this build. You may recover the exact +# SVN revision used from the resulting SRPM and RPMs because it ends +# up in the RPM release tag. +# 4. Update %%changelog, considering the following; +# - Possibly change only the release tag for the most recent changelog +# %%changelog entry, if appropriate +# - Add a message about the changes to either the product or the RPM +# packaging +# 5. Build locally +# 6. Build in mock for; +# a) fedora-rawhide-x86_64, +# b) fedora-12-x86_64, +# c) fedora-11-x86_64, +# d) epel-5-x86_64, +# e) epel-4-x86_64 +# +# or scratch build in koji; +# +# for tag in dist-f13 dist-f12-updates-candidate dist-f11-updates-candidate \ +# dist-5E-epel dist-4E-epel; do +# echo "- $tag: `koji build --scratch --nowait $tag $srpm 2>&1 | grep \"Task info\" | awk '{print $3}'`" +# done +# +# 7. Should builds fail, repeat the process. +# +# = Final Release = +# +# NOTE: A final release of a version, or multiple final releases of the +# same version, of Zarafa 6.30.10 requires one unique tarball, probably +# named similar to zarafa-6.30.10.tar.gz. +# +# Once this tarball is used for an RPM package that is actually released, +# the .tar.gz source should not change anymore. You may, though, include +# patches for the 6.30.10 RPM package in this .spec and bumping the release +# number. +# +# When you do so, however, you will need to take into account upgrade paths +# between distribution versions. E.g., when releasing 6.30.10-2 to F-11, you +# would also need to release 6.30.10-2 to F-12. +# +# An alternative is to release 6.30.10.1 with a zarafa-6.30.10.1.tar.gz (yet +# again ensuring there is an upgrade path to later distribution versions) +# +# The point behind this has to do with reproducibility, though admittedly, +# the Source RPM corresponding to the binary RPM (comparing the +# -.src.rpm vs. the installed +# -..rpm) does reveal the actual SVN revision number, +# and should thus also build the exact same thing running in production (euh, +# at customers, that is). +# +# 1. Set beta_or_rc to 0 +# 2. Set actual_release to 1, or the value of actual_release of +# the previous stable release, +1 in case have already released +# this SVN revision as a stable product. +# 3. Set the SVN revision to the current SVN revision; +# - Lacking a unique zarafa-.svn.tar.gz source +# tarball, setting the correct SVN revision in the .spec is +# critical in order to be able to determine exactly what was in +# the tarball at the time of this build. You may recover the exact +# SVN revision used from the resulting SRPM, as the .spec in that +# SRPM contains the SVN revision number (but not the resulting RPMs +# just for the sake of appearance). +# 4. Update %%changelog, considering the following; +# - Remove all %%changelog stamps that have a beta_or_rc type of versioning, +# again just for appearances sake, possibly preserving the important +# messages from each beta_or_rc type of changelog entries, e.g.: +# +# * Some Time Your Name - 6.30.10-0.1svn12345 +# - Improve packaging +# +# might, in a final release, become: +# +# * Some Time Zarafa Release Engineering - 6.30.10-1 +# - Release 6.30.10 +# - Improve packaging +# +# - Possibly change only the release tag for the most recent changelog +# %%changelog entry, if appropriate. This is assuming there is no +# important or significant changes between the beta_or_rc and the final +# product. +# - Add a message about the changes to either the product or the RPM +# packaging if appropriate. +# 5. Build locally +# 6. Build in mock for; +# a) fedora-rawhide-x86_64, +# b) fedora-12-x86_64, +# c) fedora-11-x86_64, +# d) epel-5-x86_64, +# e) epel-4-x86_64 +# +# or scratch build in koji; +# +# for tag in dist-f13 dist-f12-updates-candidate dist-f11-updates-candidate \ +# dist-5E-epel dist-4E-epel; do +# echo "- $tag: `koji build --scratch --nowait $tag $srpm 2>&1 | grep \"Task info\" | awk '{print $3}'`" +# done +# +# 7. When mock or koji scratch builds fail, repeat the process. +# + +%define beta_or_rc 0 +%define actual_release 1 +%define svnrevision 20002 +%define with_ldap 1 +%define with_xmlto 1 + +Summary: Zarafa Outlook Sharing and Open Source Collaboration +Name: zarafa +Version: 6.30.14 +%if %{beta_or_rc} +Release: 0.%{actual_release}.svn%{svnrevision}%{?dist} +%else +Release: %{actual_release}%{?dist} +%endif +# Red Hat Legal has been advised by email from Zarafa that no license is +# required in order to use the letter string "zarafa" (combined with other +# words) in the package naming, to refer to the software as "Zarafa" to +# indicate its intended purpose, and to modify packages with bug fixes and +# enhancements. +License: AGPLv3 with exceptions +Group: Applications/Productivity +URL: http://www.zarafa.com/ +# http://www.zarafa.com/download-community -> "Zarafa Source Package" +Source0: %{name}-%{version}.tar.gz +Source1: %{name}.ini + +Patch0: zarafa-6.30.4-package.patch +# Patch 1, 2 and 3 were sent to upstream +Patch1: zarafa-6.30.4-perl.patch +Patch2: zarafa-6.30.10-undefined-symbol.patch +Patch3: zarafa-6.30.10-chmod.patch +# http://www.brodowski.org/zarafa/php-mapi/6.30.10.18495/18495_patch.diff +Patch10: zarafa-6.30.4-brodowski.patch + +BuildRequires: bison +BuildRequires: gcc-c++ +BuildRequires: byacc +BuildRequires: flex +BuildRequires: gettext +BuildRequires: libical-devel >= 0.42 +BuildRequires: libvmime07-devel +BuildRequires: libxml2-devel +BuildRequires: mysql-devel >= 4.1 +BuildRequires: ncurses-devel +BuildRequires: pam-devel +BuildRequires: php-devel +BuildRequires: libtool, automake, autoconf + +%if 0%{?fedora} > 8 +BuildRequires: libcurl-devel +BuildRequires: perl-devel +%else +BuildRequires: curl-devel +BuildRequires: perl +%endif + +%if 0%{?fedora} >= 12 +BuildRequires: libuuid-devel +%endif + +%if %{with_ldap} +BuildRequires: openldap-devel +%endif + +%if %{with_xmlto} +BuildRequires: xmlto +%endif + +# The normal zarafa package pulls in all of zarafa +Requires: zarafa(ical) = %{version}-%{release} +Requires: zarafa(dagent) = %{version}-%{release} +Requires: zarafa(gateway) = %{version}-%{release} +Requires: zarafa(monitor) = %{version}-%{release} +Requires: zarafa(server) = %{version}-%{release} +Requires: zarafa(spooler) = %{version}-%{release} +Requires: zarafa(utils) = %{version}-%{release} +Requires: zarafa(config) = %{version}-%{release} + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +%description +Zarafa Outlook Sharing is a Microsoft Exchange replacement. The Open Source +Collaboration provides an integration with your existing Linux mail server, +native mobile phone support by ActiveSync compatibility and a webaccess with +'Look & Feel' similar to Outlook using Ajax. Including an IMAP4 and a POP3 +gateway as well as an iCal/CalDAV gateway, Zarafa can combine the usability +with the stability and flexibility of a Linux server. + +The proven Zarafa groupware solution is using MAPI objects, provides a MAPI +client library as well as programming interfaces for C++, PHP and Perl. The +other Zarafa related packages need to be installed to gain all the features +and benefits of Zarafa Outlook Sharing and Open Source Collaboration. + +## +## Zarafa Client +## +%package client +Summary: Zarafa Client Library +Group: System Environment/Libraries +Requires: zarafa(common) = %{version}-%{release} +Provides: zarafa(client) = %{version}-%{release} + +%description client +Zarafa client libraries for use with integrated MAPI clients. + +## +## Zarafa Common files +## +%package common +Summary: Zarafa common files +Group: System Environment/Daemons +Requires(pre): shadow-utils +Provides: zarafa(common) = %{version}-%{release} + +%description common +Common files and directories required by most Zarafa packages. + +## +## Zarafa Delivery Agent +## +%package dagent +Summary: Zarafa Delivery Agent +Group: System Environment/Daemons +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(dagent) = %{version}-%{release} +Provides: zarafa(config::dagent) = %{version}-%{release} + +%description dagent +The delivery agent delivers e-mails into the Zarafa server. +It can be used to trigger the local mailer or act as the LMTP +server. + +## +## Zarafa Development Headers +## +%package devel +Summary: Development files for several Zarafa libraries +Group: Development/Libraries +Requires: %{name} = %{version}-%{release}, pkgconfig +Requires: zarafa(common) = %{version}-%{release} +Provides: %{name}-static = %{version}-%{release} + +%description devel +The zarafa-devel package includes header files and libraries necessary for +developing programs which use features from the Zarafa Outlook Sharing and +Open Source Collaboration. The proven Zarafa groupware solution is using +MAPI objects, provides a MAPI client library and programming interfaces for +C++, PHP and Perl. + +## +## Zarafa Gateway +## +%package gateway +Summary: Zarafa Gateway server (POP3/IMAP access) +Group: System Environment/Daemons +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(gateway) = %{version}-%{release} +Provides: zarafa(config::gateway) = %{version}-%{release} + +%description gateway +The gateway enables other e-mail clients to connect through +POP3 or IMAP to the Zarafa server to read their e-mail. With +IMAP, it is also possible to view the contents of shared +folders and subfolders. The gateway can be configured to +listen for POP3, POP3S, IMAP and/or IMAPS. + +## +## Zarafa iCal/CalDAV server +## +%package ical +Summary: The Zarafa iCal/CalDAV gateway +Group: System Environment/Daemons +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(ical) = %{version}-%{release} +Provides: zarafa(caldav) = %{version}-%{release} +Provides: zarafa(config::ical) = %{version}-%{release} +Provides: zarafa(config::caldav) = %{version}-%{release} + +%description ical +The iCal/CalDAV gateway enables users to retrieve their +calendar using iCalendar compliant clients. The iCal/CalDAV +gateway can be configured to listen for HTTP and HTTPS +requests. + +## +## Zarafa CalDAV package, merely an alias for zarafa-ical +## +%package caldav +Summary: The Zarafa iCal/CalDAV gateway +Group: System Environment/Daemons +Requires: zarafa(ical) = %{version}-%{release} + +%description caldav +The iCal/CalDAV gateway enables users to retrieve their +calendar using iCalendar compliant clients. The iCal/CalDAV +gateway can be configured to listen for HTTP and HTTPS +requests. + +## +## Zarafa Monitor Service +## +%package monitor +Summary: Zarafa Monitoring service +Group: System Environment/Daemons +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(monitor) = %{version}-%{release} +Provides: zarafa(config::monitor) = %{version}-%{release} + +%description monitor +The monitor checks user mailbox sizes. When a quotum is reached +the monitor sends a quota notification email. + +## +## Zarafa Backend Server +## +%package server +Summary: Zarafa Backend Server +Group: System Environment/Daemons +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(server) = %{version}-%{release} +Provides: zarafa(config) = %{version}-%{release} +Provides: zarafa(config::server) = %{version}-%{release} + +%description server +The Zarafa groupware backend server + +## +## Zarafa Spooler Service +## +%package spooler +Summary: Zarafa Spooler Service +Group: System Environment/Daemons +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Provides: zarafa(spooler) = %{version}-%{release} +Provides: zarafa(config::spooler) = %{version}-%{release} + +%description spooler +The spooler sends all pending Zarafa e-mail to the recipients, +from the Outbox of a user/all users. + +## +## Zarafa Utilities +## +%package utils +Summary: Zarafa Utilities +Group: Applications/System +Requires: zarafa(client) = %{version}-%{release} +Requires: zarafa(common) = %{version}-%{release} +Provides: zarafa(utils) = %{version}-%{release} + +%description utils +Administration utilities for the Zarafa Groupware environment +including reporting and password management. + +## +## MAPI System Libraries +## +%package -n libmapi +Summary: Mapi libraries by Zarafa +Group: System Environment/Libraries +Requires: zarafa(client) = %{version}-%{release} +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description -n libmapi +MAPI libraries by Zarafa. + +## +## MAPI Perl extension +## +%package -n perl-libmapi +Summary: Perl Mapi extension libraries by Zarafa +Group: System Environment/Libraries +Requires: perl + +%description -n perl-libmapi +Perl MAPI extension libraries by Zarafa. + +## +## MAPI PHP Extension +## +%package -n php-mapi +Summary: A PHP Mapi client by Zarafa +Group: Applications/Communications +# Bug: Without mod_ssl, reloading httpd causes core dump +Requires: mod_ssl +Requires: php >= 4.3 +Provides: php(mapi) = %{version}-%{release} + +%description -n php-mapi +PHP MAPI extension by Zarafa to enable MAPI communication in PHP. + +%prep +%setup -q +%patch0 -p1 -b .package +%patch1 -p1 -b .perl +%patch2 -p1 -b .symbol +%patch3 -p1 -b .chmod +#%%patch10 -p5 -b .brodowski + +# Needed to get rid of rpath +libtoolize --force +autoreconf --force --install + +%build +CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -g -ggdb" +export CFLAGS +%configure \ + --with-userscript-prefix=%{_sysconfdir}/%{name}/userscripts \ + --with-quotatemplate-prefix=%{_sysconfdir}/%{name}/quotamail \ +%if 0%{?rhel} > 0 + --enable-release \ +%endif + --disable-static \ + --disable-testtools \ + --enable-perl +make %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +make \ +%if 0%{?rhel} > 0 + docdir=%{_datadir}/doc/%{name}/ \ + datarootdir=%{_datadir} \ +%endif + DESTDIR=$RPM_BUILD_ROOT \ + INSTALL='install -p' \ + install + +# Nuke all overlefts from licensed, managed or other proprietary items +rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/report-ca +rm -f $RPM_BUILD_ROOT%{_mandir}/man?/zarafa-{backup,restore,report,ldapms.cfg,licensed{,.cfg}}.* + +# Move all the initscripts to their appropriate place and +# ensure that all services are off by default at boot time +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/ +for service in server spooler dagent gateway monitor ical; do + if [ -f $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/%{name}-$service.init.fc ]; then + sed -e 's@345@-@' $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/%{name}-$service.init.fc > \ + $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/%{name}-$service + chmod 755 $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/%{name}-$service + touch -c -r $RPM_BUILD_ROOT{%{_datadir}/doc/%{name}/%{name}-$service.init.fc,%{_sysconfdir}/rc.d/init.d/%{name}-$service} + fi +done + +# Move the configuration files to their correct place and handle +# /usr/lib vs. /usr/lib64 for all architectures correct and set +# run_as_user, run_as_group and local_admin_users values correct +for config in $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/*.cfg; do + config=$(basename $config) + if [ -f $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/$config ]; then + sed -e 's@\(run_as_\(user\|group\)[[:space:]]*=\).*@\1 %{name}@' -e 's@/usr/lib/zarafa@%{_libdir}/%{name}@' \ + -e 's@\(local_admin_users[[:space:]]*=[[:space:]]*root.*\)@\1 %{name}@' \ + $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/$config > $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/$config + chmod 640 $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/$config + touch -c -r $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/$config $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/$config + fi +done + +# Move the logrotate configuration file to it's correct place +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/ +sed -e 's@\(}\)@ create 0644 %{name} %{name}\n\1@' -e '1,6d' \ + $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/%{name}.logrotate > $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name} +touch -c -r $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/%{name}.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name} + +# Install the PHP module configuration file appropriate +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/php.d/ +install -p -m 644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/php.d/%{name}.ini + +# Create missing userscript directories for packaging them +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/userscripts/{create,delete}{user,group,company}.d/ + +# Move the userscripts to their correct place and symlink them +mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/userscripts/ +for userscript in companies_common.sh groups_common.sh users_common.sh \ + createcompany creategroup createuser deletecompany deletegroup deleteuser; do + mv -f $RPM_BUILD_ROOT{%{_sysconfdir},%{_datadir}}/%{name}/userscripts/$userscript + ln -sf ../../..%{_datadir}/%{name}/userscripts/$userscript $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/userscripts/$userscript +done + +# Create the data directory and install some files into +mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/ +install -p -m 755 installer/linux/db-{calc-storesize,convert-attachments-to-files} $RPM_BUILD_ROOT%{_datadir}/%{name}/ +install -p -m 755 installer/linux/ssl-certificates.sh $RPM_BUILD_ROOT%{_datadir}/%{name}/ +install -p -m 644 installer/ldap/%{name}.schema $RPM_BUILD_ROOT%{_datadir}/%{name}/ + +# Create the default log and lib directory for packaging +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/{log,lib}/%{name}/ + +# Remove all libtool .la files to avoid packaging of them +rm -f $RPM_BUILD_ROOT%{_libdir}/{,php/modules,%{name}}/*.la + +# Remove files that are anyway in %doc or %{_datadir}/%{name}/ +rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name}/ + +%find_lang %{name} + +%clean +rm -rf $RPM_BUILD_ROOT + +%pre common +getent group %{name} > /dev/null || %{_sbindir}/groupadd -r %{name} +getent passwd %{name} > /dev/null || %{_sbindir}/useradd -r -g %{name} -d %{_localstatedir}/lib/%{name} -s /sbin/nologin -c "Zarafa Service Account" %{name} +exit 0 + +%post dagent +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-dagent +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/dagent.* > /dev/null 2>&1 || : + +%post ical +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-ical +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/ical.* > /dev/null 2>&1 || : + +%post gateway +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-gateway +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/gateway.* > /dev/null 2>&1 || : + +%post monitor +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-monitor +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/monitor.* > /dev/null 2>&1 || : + +%post server +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-server +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/server.* > /dev/null 2>&1 || : + +%post spooler +[ $1 -eq 1 ] && /sbin/chkconfig --add %{name}-spooler +# Ensure correct log file ownership after upgrade from official packages +chown %{name}:%{name} %{_localstatedir}/log/%{name}/spooler.* > /dev/null 2>&1 || : + +%post -n libmapi -p /sbin/ldconfig + +%preun dagent +if [ $1 -eq 0 ]; then + /sbin/service %{name}-dagent stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-dagent +fi + +%preun ical +if [ $1 -eq 0 ]; then + /sbin/service %{name}-ical stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-ical +fi + +%preun gateway +if [ $1 -eq 0 ]; then + /sbin/service %{name}-gateway stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-gateway +fi + +%preun monitor +if [ $1 -eq 0 ]; then + /sbin/service %{name}-monitor stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-monitor +fi + +%preun server +if [ $1 -eq 0 ]; then + /sbin/service %{name}-server stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-server +fi + +%preun spooler +if [ $1 -eq 0 ]; then + /sbin/service %{name}-spooler stop > /dev/null 2>&1 || : + /sbin/chkconfig --del %{name}-spooler +fi + +%postun dagent +if [ $1 -ne 0 ]; then + /sbin/service %{name}-dagent condrestart > /dev/null 2>&1 || : +fi + +%postun ical +if [ $1 -ne 0 ]; then + /sbin/service %{name}-ical condrestart > /dev/null 2>&1 || : +fi + +%postun gateway +if [ $1 -ne 0 ]; then + /sbin/service %{name}-gateway condrestart > /dev/null 2>&1 || : +fi + +%postun monitor +if [ $1 -ne 0 ]; then + /sbin/service %{name}-monitor condrestart > /dev/null 2>&1 || : +fi + +%postun server +if [ $1 -ne 0 ]; then + /sbin/service %{name}-server condrestart > /dev/null 2>&1 || : +fi + +%postun spooler +if [ $1 -ne 0 ]; then + /sbin/service %{name}-spooler condrestart > /dev/null 2>&1 || : +fi + +%postun -n libmapi -p /sbin/ldconfig + +%files +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 + +%files caldav +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 + +%files client +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_libdir}/libzarafaclient.so + +%files common +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 doc/performance-tuning.txt +%dir %{_sysconfdir}/%{name}/ +%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} +%dir %{_libdir}/%{name}/ +%{_mandir}/man1/%{name}.1* +%dir %{_datadir}/%{name}/ +%dir %attr(0755,%{name},%{name}) %{_localstatedir}/lib/%{name}/ +%dir %attr(0755,%{name},%{name}) %{_localstatedir}/log/%{name}/ + +%files dagent +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 installer/linux/createuser.dotforward +%{_bindir}/%{name}-autorespond +%{_bindir}/%{name}-dagent +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/dagent.cfg +%{_sysconfdir}/rc.d/init.d/%{name}-dagent +%{_mandir}/man1/%{name}-dagent.1* +%{_mandir}/man5/%{name}-dagent.cfg.5* + +%files devel +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_libdir}/libicalmapi.so +%{_libdir}/libinetmapi.so +%{_libdir}/libmapi.so +%{_libdir}/libperlmapi.so +%{_libdir}/libcommon_mapi.a +%{_libdir}/libcommon_ssl.a +%{_libdir}/libcommon_util.a +%{_libdir}/libfreebusy.a +%{_includedir}/icalmapi/ +%{_includedir}/inetmapi/ +%{_includedir}/mapi4linux/ +%{_includedir}/%{name}/ +%{_libdir}/pkgconfig/%{name}.pc + +%files gateway +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-gateway +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/gateway.cfg +%{_sysconfdir}/rc.d/init.d/%{name}-gateway +%{_mandir}/man1/%{name}-gateway.1* +%{_mandir}/man5/%{name}-gateway.cfg.5* + +%files ical +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-ical +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/ical.cfg +%{_sysconfdir}/rc.d/init.d/%{name}-ical +%{_mandir}/man1/%{name}-ical.1* +%{_mandir}/man5/%{name}-ical.cfg.5* + +%files monitor +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-monitor +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/monitor.cfg +%dir %{_sysconfdir}/%{name}/quotamail/ +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/companyhard.mail +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/companysoft.mail +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/companywarning.mail +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/userhard.mail +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/usersoft.mail +%config(noreplace) %{_sysconfdir}/%{name}/quotamail/userwarning.mail +%{_sysconfdir}/rc.d/init.d/%{name}-monitor +%{_mandir}/man1/%{name}-monitor.1* +%{_mandir}/man5/%{name}-monitor.cfg.5* + +%files server -f %{name}.lang +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-server +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/server.cfg +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/unix.cfg +%{_sysconfdir}/rc.d/init.d/%{name}-server +%dir %{_sysconfdir}/%{name}/userscripts/ +%{_sysconfdir}/%{name}/userscripts/createuser +%{_sysconfdir}/%{name}/userscripts/creategroup +%{_sysconfdir}/%{name}/userscripts/createcompany +%{_sysconfdir}/%{name}/userscripts/deleteuser +%{_sysconfdir}/%{name}/userscripts/deletegroup +%{_sysconfdir}/%{name}/userscripts/deletecompany +%{_sysconfdir}/%{name}/userscripts/*common.sh +%dir %{_sysconfdir}/%{name}/userscripts/createuser.d/ +%dir %{_sysconfdir}/%{name}/userscripts/creategroup.d/ +%dir %{_sysconfdir}/%{name}/userscripts/createcompany.d/ +%dir %{_sysconfdir}/%{name}/userscripts/deleteuser.d/ +%dir %{_sysconfdir}/%{name}/userscripts/deletegroup.d/ +%dir %{_sysconfdir}/%{name}/userscripts/deletecompany.d/ +%config(noreplace) %{_sysconfdir}/%{name}/userscripts/createcompany.d/00createpublic +%config(noreplace) %{_sysconfdir}/%{name}/userscripts/createuser.d/00createstore +%{_datadir}/%{name}/userscripts/ +%{_libdir}/%{name}/dbplugin.so +%{_libdir}/%{name}/unixplugin.so +%{_mandir}/man1/%{name}-server.1* +%{_mandir}/man5/%{name}-server.cfg.5* +%{_mandir}/man5/%{name}-unix.cfg.5* +%if %{with_ldap} +%{_datadir}/%{name}/%{name}.schema +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/ldap.active-directory.cfg +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/ldap.openldap.cfg +%{_libdir}/%{name}/ldapplugin.so +%{_mandir}/man5/%{name}-ldap.cfg.5* +%endif + +%files spooler +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-spooler +%config(noreplace) %attr(0640,%{name},%{name}) %{_sysconfdir}/%{name}/spooler.cfg +%{_sysconfdir}/rc.d/init.d/%{name}-spooler +%{_mandir}/man1/%{name}-spooler.1* +%{_mandir}/man5/%{name}-spooler.cfg.5* + +%files utils +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_bindir}/%{name}-admin +%{_bindir}/%{name}-fsck +%{_bindir}/%{name}-passwd +%{_bindir}/%{name}-stats +%{_datadir}/%{name}/db-calc-storesize +%{_datadir}/%{name}/db-convert-attachments-to-files +%{_datadir}/%{name}/ssl-certificates.sh +%{_mandir}/man1/%{name}-admin.1* +%{_mandir}/man1/%{name}-fsck.1* +%{_mandir}/man1/%{name}-passwd.1* +%{_mandir}/man1/%{name}-stats.1* + +%files -n libmapi +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_libdir}/libicalmapi.so.* +%{_libdir}/libinetmapi.so.* +%{_libdir}/libmapi.so.* + +%files -n perl-libmapi +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%{_libdir}/libperlmapi.so.* + +%files -n php-mapi +%defattr(-,root,root,-) +%doc installer/licenseagreement/AGPL-3 +%config(noreplace) %{_sysconfdir}/php.d/%{name}.ini +%{_datadir}/php/mapi/ +%if 0%{?rhel}%{?fedora} > 4 +%{_libdir}/php/modules/mapi.so +%else +%{_libdir}/php4/mapi.so +%endif + +%changelog +* Sat May 01 2010 Robert Scheck 6.30.14-1 +- Upgrade to 6.30.14 + +* Sun Apr 25 2010 Robert Scheck 6.30.13-1 +- Upgrade to 6.30.13 +- Moved zarafa.schema file from %%doc to %%{_datadir}/%%{name} + +* Sat Mar 20 2010 Robert Scheck 6.30.12-1 +- Upgrade to 6.30.12 + +* Fri Mar 19 2010 Robert Scheck 6.30.11-1 +- Upgrade to 6.30.11 + +* Tue Feb 23 2010 Robert Scheck 6.30.10-2 +- Backported a patch from trunk to avoid the crash of zarafa-server + when creating new user with db or unix plugin (#564282, #567262) +- Backported another patch from trunk to avoid the crash of httpd + caused by PHP mapi.so during the logon in the webaccess (#564129) + +* Sat Feb 06 2010 Robert Scheck 6.30.10-1 +- Upgrade to 6.30.10 (#498194) +- Initial spec file for Fedora and Red Hat Enterprise Linux (thanks + to Jeroen van Meeuwen, John van der Kamp and Steve Hardy)