stuart: server/kolab-resource-handlers/kolab-resource-handlers/resmgr resmgr.php, 1.5, 1.6

cvs at intevation.de cvs at intevation.de
Fri Jul 16 01:06:04 CEST 2004


Author: stuart

Update of /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr
In directory doto:/tmp/cvs-serv19038

Modified Files:
	resmgr.php 
Log Message:
Updated the resource manager to use the new XML data object
Some style fixups as well

*** !!!THIS NEEDS TO BE TESTED W/ KONTACT!!! ***


Index: resmgr.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/resmgr.php,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- resmgr.php	13 Jul 2004 07:31:44 -0000	1.5
+++ resmgr.php	15 Jul 2004 23:06:01 -0000	1.6
@@ -151,7 +151,7 @@
     $errors = imap_alerts();
     if ($errors !== false) {
         while ($error = array_pop($errors)) {
-            myLog("(IMAP) $error", LOG_WARNING);
+            myLog("(IMAP) $error", RM_LOG_WARN);
         }
     }
 
@@ -208,42 +208,47 @@
  */
 function getImapPassword()
 {
-  global $resource;
-  global $params;
+    global $resource, $params;
 
-  // Connect to LDAP server end get the password
-  $ldap = ldap_connect( $params['ldap_uri'] );
-  if( !ldap_bind( $ldap, $params['bind_dn'], $params['bind_pw'] ) ) {
-    myLog("Could not contact LDAP server: ".$ldap_error($ldap));
-    return false;
-  }
-  $result = ldap_search( $ldap, $params['base_dn'], "(mail=$resource)", array("encryptedPassword"));
-  if( !$result ) {
-    myLog("Could not perform seearch: ".$ldap_error($ldap));
-    return false;    
-  }
-  $entries = ldap_get_entries( $ldap, $result );
-  if( $entries['count'] != 1 ) {
-    myLog("More than one object returned for $resource");
-    return false;    
-  }
-  $encpw = base64_decode($entries[0]['encryptedpassword'][0]);
-  ldap_close($ldap);
-  
-  // Now get private key and decrypt pw:
-  $pkd=file_get_contents("@l_prefix@/etc/kolab/res_priv.pem" );
-  $pkey = openssl_pkey_get_private( $pkd );
-  if( $pkey === false ) {
-    while( $msg = openssl_error_string() )
-      myLog( "Error reading private key: $msg" );
-  }
-  if( !openssl_private_decrypt( $encpw, $cleartext, $pkey ) ) {
-    while( $msg = openssl_error_string() )
-      myLog( "Error decrypting: $msg" );
-    return false;
-  }
-  openssl_free_key($pkey);
-  return $cleartext;
+    // Connect to the LDAP server and retrieve the users' password
+    $ldap = ldap_connect($params['ldap_uri']);
+    if (!ldap_bind($ldap, $params['bind_dn'], $params['bind_pw'])) {
+        myLog('Unable to contact LDAP server: ' . $ldap_error($ldap));
+        return false;
+    }
+
+    $result = ldap_search($ldap, $params['base_dn'], "(mail=$resource)", array("encryptedPassword"));
+    if (!$result) {
+        myLog('Unable to perform LDAP search: ' . $ldap_error($ldap));
+        return false;
+    }
+
+    $entries = ldap_get_entries($ldap, $result);
+    if ($entries['count'] != 1) {
+        myLog("More than one object returned for $resource");
+        return false;
+    }
+
+    $encpw = base64_decode($entries[0]['encryptedpassword'][0]);
+    ldap_close($ldap);
+
+    // Now get private key and decrypt the password
+    $pkd = file_get_contents('/kolab/etc/kolab/res_priv.pem');
+    $pkey = openssl_pkey_get_private($pkd);
+    if ($pkey === false) {
+        while ($msg = openssl_error_string())
+            myLog("Error reading private key: $msg");
+    }
+
+    if (!openssl_private_decrypt($encpw, $cleartext, $pkey)) {
+        while ($msg = openssl_error_string())
+            myLog("Error decrypting password: $msg");
+        return false;
+    }
+
+    openssl_free_key($pkey);
+
+    return $cleartext;
 }
 
 function getRequest()
@@ -287,18 +292,32 @@
 }
 
 /** Helper function */
-function glue_url($parsed) 
-{ 
-  if (! is_array($parsed)) return false; 
-  $uri = $parsed['scheme'] ? $parsed['scheme'].':'.((strtolower($parsed['scheme']) == 'mailto') ? '':'//'): ''; 
-  $uri .= $parsed['user'] ? urlencode($parsed['user']).($parsed['pass']? ':'.urlencode($parsed['pass']):'').'@':''; 
-  $uri .= $parsed['host'] ? $parsed['host'] : ''; 
-  $uri .= $parsed['port'] ? ':'.$parsed['port'] : ''; 
-  $uri .= $parsed['path'] ? $parsed['path'] : ''; 
-  $uri .= $parsed['query'] ? '?'.$parsed['query'] : ''; 
-  $uri .= $parsed['fragment'] ? '#'.$parsed['fragment'] : ''; 
-  return $uri; 
-} 
+function assembleUri($parsed)
+{
+    if (!is_array($parsed)) return false;
+
+    $uri = empty($parsed['scheme']) ? '' :
+        $parsed['scheme'] . ':' . ((strtolower($parsed['scheme']) == 'mailto') ? '' : '//');
+
+    $uri .= empty($parsed['user']) ? '' :
+        urlencode($parsed['user']) .
+        (empty($parsed['pass']) ? '' : urlencode($parsed['pass']))
+        . '@';
+
+    $uri .= empty($parsed['host']) ? '' :
+        $parsed['host'];
+    $uri .= empty($parsed['port']) ? '' :
+        ':' . $parsed['port'];
+
+    $uri .= empty($parsed['path']) ? '' :
+        $parsed['path'];
+    $uri .= empty($parsed['query']) ? '' :
+        '?' . $parsed['query'];
+    $uri .= empty($parsed['anchor']) ? '' :
+        '#' . $parsed['anchor'];
+
+    return $uri;
+}
 
 function &getFreeBusy()
 {
@@ -310,7 +329,7 @@
     $parsed = parse_url($url);
     $parsed['user'] = $params['calendar_user'];
     $parsed['pass'] = $params['calendar_pass'];
-    $url = glue_url($parsed);
+    $url = assembleUri($parsed);
 
     myLog("Using f/b URL $url", RM_LOG_DEBUG);
 
@@ -470,31 +489,30 @@
     } else {
         $mailbox = "user/$prefix/" . $params['calendar_store'] . "$suffix";
     }
-    #$mailbox = "INBOX/Calendar";
+    //$mailbox = "INBOX/Calendar";
     $fullmbox = $server . $mailbox;
 
-    myLog("Opening connection to $server for ".$params['calendar_user'], RM_LOG_DEBUG);
+    myLog("Opening connection to $server for " . $params['calendar_user'], RM_LOG_DEBUG);
     // Open an IMAP connection to the requested users' calendar
     $imap = @imap_open($fullmbox, $params['calendar_user'], $params['calendar_pass'], OP_HALFOPEN);
     testIMAPError();
-    @imap_reopen( $imap, $fullmbox, CL_EXPUNGE );
+
+    @imap_reopen($imap, $fullmbox, CL_EXPUNGE);
     $errors = imap_errors();
-    if( $errors ) myLog( "IMAP Errors from reopen: ".join(", ", $errors ) );
-    if( !empty($errors) ) {
-      // slurp up errors
-      // Create Calendar folder
-      @imap_createmailbox( $imap, $fullmbox );
-      myLog( "IMAP Errors from createmailbox: ".join(", ", imap_errors() ) );
+    if (count($errors)) {
+        myLog('IMAP Errors from reopen: ' . join(', ', $errors));
 
-      $status = @imap_status($imap, $fullmbox, SA_ALL);
-      myLog( "Info about new folder: ".print_r($status,true));
+        // Try create the Calendar folder
+        @imap_createmailbox($imap, $fullmbox);
+        myLog('IMAP Errors from createmailbox: ' . join(', ', imap_errors()));
 
-      @imap_reopen( $imap, $fullmbox, CL_EXPUNGE );
-      if( imap_last_error() ) {
-	myLog( "IMAP Error from imap_reopen on new mailbox $fullmbox: ".imap_last_error());
-      }
+        $status = @imap_status($imap, $fullmbox, SA_ALL);
+        myLog('New folder status: ' . print_r($status, true));
+
+        myLog('Trying to reopen calendar box...');
+        @imap_reopen($imap, $fullmbox, CL_EXPUNGE);
+        testIMAPError();
     }
-    testIMAPError();
 
     $connected = true;
 }
@@ -525,6 +543,49 @@
     testIMAPError();
 }
 
+function iCalDate2Kolab($ical_date)
+{
+    // $ical_date should be a timestamp
+    return strftime('%Y-%m-%dT%H:%M:%SZ', $ical_date);
+}
+
+function &buildKolabEvent()
+{
+    global $organiser, $itip, $resource, $uid;
+
+    $kolab_xml = domxml_new_doc('1.0');
+    $kolab_event = $kolab_xml->append_child($kolab_xml->create_element('event'));
+    $kolab_event->set_attribute('version', '1.0');
+
+    // We're not interested in too much information about the event; the only
+    // critical things are the UID and the time spans. We include the
+    // summary and body for display purposes (e.g. in the free/busy viewer).
+    $kolab_node = $kolab_event->append_child($kolab_xml->create_element('uid'));
+    $kolab_node->append_child($kolab_xml->create_text_node($uid));
+
+    $kolab_node = $kolab_event->append_child($kolab_xml->create_element('summary'));
+    $kolab_node->append_child($kolab_xml->create_text_node(
+        $itip->getAttributeDefault('SUMMARY', '')
+    ));
+
+    $kolab_node = $kolab_event->append_child($kolab_xml->create_element('body'));
+    $kolab_node->append_child($kolab_xml->create_text_node(
+        $itip->getAttributeDefault('DESCRIPTION', '')
+    ));
+
+    $kolab_node = $kolab_event->append_child($kolab_xml->create_element('start-date'));
+    $kolab_node->append_child($kolab_xml->create_text_node(
+        iCalDate2Kolab($itip->getAttributeDefault('DTSTART', 0))
+    ));
+
+    $kolab_node = $kolab_event->append_child($kolab_xml->create_element('end-date'));
+    $kolab_node->append_child($kolab_xml->create_text_node(
+        iCalDate2Kolab($itip->getAttributeDefault('DTSTART', 0))
+    ));
+
+    return $kolab_xml;
+}
+
 
 
 
@@ -686,8 +747,41 @@
 
         myLog("Adding event $uid");
 
-        $iCalendar = &new Horde_iCalendar();
-        // Update our status within the vEvent
+        $kolab_xml = &buildKolabEvent();
+
+        $message = &new MIME_Message();
+
+        $kolabinfo = 'This is a Kolab Groupware object. To view this object you will need a client that understands the Kolab Groupware format. For a list of such clients please visit http:://www.kolab.org/kolab-clients.html';
+
+        $body = &new MIME_Part('text/plain', Text::wrap($kolabinfo, 76, "\n"));
+
+        $part = &new MIME_Part('application/x-vnd.kolab.event', $kolab_xml->dump_mem(true));
+        $part->setName('kolab.event');
+        $part->setDisposition('attachment');
+
+        $message->addPart($body);
+        $message->addPart($part);
+
+        $headers = &new MIME_Headers();
+        $headers->addHeader("From", $resource);
+        $headers->addHeader("To", $resource);
+        $headers->addHeader("Subject", $uid);
+        $headers->addHeader("User-Agent", "proko2/resmgr");
+        $headers->addHeader("Reply-To", "");
+        $headers->addHeader("Date", date("r"));
+        $headers->addMIMEHeaders($message);
+
+        $message = preg_replace("/\r\n|\n|\r/s", "\r\n",
+            $headers->toString() .
+            $body->toString(false) .
+            $part->toString(false)
+        );
+
+        myLog("Appending message to $fullmbox", RM_LOG_DEBUG);
+        @imap_append($imap, $fullmbox, $message);
+        testIMAPError();
+
+        // Update our status within the iTip request and send the reply
         $itip->setAttribute('STATUS', 'CONFIRMED', array(), false);
         $attendees = $itip->getAttribute('ATTENDEE');
         if (!is_array($attendees)) {
@@ -714,30 +808,6 @@
             $itip->setAttribute('ATTENDEE', $attendee, $attparams[$i]);
         }
 
-        $iCalendar->addComponent($itip);
-
-        $message = &new MIME_Message();
-        $part = &new MIME_Part('text/calendar', $iCalendar->exportvCalendar());
-        $part->setName('kolab-calendar-entry.ics');
-        $part->setDisposition('attachment');
-        $message->addPart($part);
-
-        $headers = &new MIME_Headers();
-        $headers->addHeader("From", $resource);
-        $headers->addHeader("To", $resource);
-        $headers->addHeader("Subject", $uid);
-        $headers->addHeader("User-Agent", "proko2/resmgr");
-        $headers->addHeader("Reply-To", "");
-        $headers->addHeader("Date", date("r"));
-        $headers->addMIMEHeaders($message);
-
-        $message =  preg_replace("/\r\n|\n|\r/s", "\r\n",
-            $headers->toString() . $part->toString(false));
-
-        myLog("Appending message to $fullmbox", RM_LOG_DEBUG);
-        @imap_append($imap, $fullmbox, $message);
-        testIMAPError();
-
         sendITipReply(RM_ITIP_ACCEPT);
 
         shutdown(0);
@@ -748,7 +818,7 @@
         imapConnect();
 
         // Delete the event
-        $messages = @imap_sort($imap, SORTDATE, 0, SE_UID, 'BODY "UID" BODY "' . $uid . '"');
+        $messages = @imap_sort($imap, SORTDATE, 0, SE_UID, 'BODY "<uid>" BODY "' . $uid . '" BODY "</uid>"');
         testIMAPError();
 
         if (!is_array($messages)) {





More information about the commits mailing list