steffen: server/kolab-resource-handlers/kolab-resource-handlers/resmgr kolabmailtransport.php, NONE, 1.1 kolabfilter.php, 1.20, 1.21 kolabmailboxfilter.php, 1.1, 1.2 olhacks.php, 1.2, 1.3 lmtp.php, 1.1, NONE smtp.php, 1.5, NONE

cvs at intevation.de cvs at intevation.de
Thu Apr 7 02:09:18 CEST 2005


Author: steffen

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

Modified Files:
	kolabfilter.php kolabmailboxfilter.php olhacks.php 
Added Files:
	kolabmailtransport.php 
Removed Files:
	lmtp.php smtp.php 
Log Message:
Issue665 (Outlook iCal forwarding)

--- NEW FILE: kolabmailtransport.php ---
<?php
/*
 *  Copyright (c) 2005 Klaraelvdalens Datakonsult AB
 *
 *    Writen by Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
 *
 *  This  program is free  software; you can redistribute  it and/or
 *  modify it  under the terms of the GNU  General Public License as
 *  published by the  Free Software Foundation; either version 2, or
 *  (at your option) any later version.
 *
 *  This program is  distributed in the hope that it will be useful,
 *  but WITHOUT  ANY WARRANTY; without even the  implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You can view the  GNU General Public License, online, at the GNU
 *  Project's homepage; see <http://www.gnu.org/licenses/gpl.html>.
 */

class KolabMailTransport {
  function KolabMailTransport( $host = '127.0.0.1', $port = 2003 ) {
    $this->host = $host;
    $this->port = $port;
    $this->transport = false;
  }

  /*abstract*/ function createTransport() { 
    myLog("Abstract method KolabMailTransport::createTransport() called!", RM_LOG_ERROR);
  }

  function start($sender,$recips) {
    $this->createTransport();
    $myclass = get_class($this->transport);

    if (!$this->transport) {
      return new PEAR_Error('Failed to connect to $myclass: ' . $error->getMessage());
    }
    if (PEAR::isError($error = $this->transport->connect())) {
      return new PEAR_Error('Failed to connect to $myclass: ' . $error->getMessage());
    }

    if (PEAR::isError($error = $this->transport->mailFrom($sender))) {
      return new PEAR_Error('Failed to set sender: ' . $error->getMessage());
    }
    
    if( !is_array( $recips ) ) $recips = array($recips);

    foreach( $recips as $recip ) {
      if (PEAR::isError($error = $this->transport->rcptTo($recip))) {
	$msg = 'Failed to set recipient: ' . $error->getMessage();
	myLog($msg, RM_LOG_ERROR);
	return false;
      }
    }

    if (PEAR::isError($error = $this->transport->_put('DATA'))) {      
      return $error;
    }
    if (PEAR::isError($error = $this->transport->_parseResponse(354))) {
      return $error;
    }
    return true;
  }

  /* Modified implementation from Net_SMTP that supports
   * dotstuffing even when getting the mail line-by line */
  function quotedataline(&$data) {
    /*
     * Change Unix (\n) and Mac (\r) linefeeds into Internet-standard CRLF
     * (\r\n) linefeeds.
     */
    $data = preg_replace("/([^\r]{1})\n/", "\\1\r\n", $data);
    $data = preg_replace("/\n\n/", "\n\r\n", $data);
    
    /*
     * Because a single leading period (.) signifies an end to the data,
     * legitimate leading periods need to be "doubled" (e.g. '..').
     */
    if( $data[0] == '.' ) $data = '.'.$data;
    $data = str_replace("\n.", "\n..", $data);
  }

  function data( $data) {
    $this->quotedataline($data);
    if (PEAR::isError($this->transport->_send($data))) {
      return new PEAR_Error('write to socket failed');
    }
    return true;
  }

  function end() {
    if (PEAR::isError($this->transport->_send("\r\n.\r\n"))) {
      return new PEAR_Error('write to socket failed');
    }
    if (PEAR::isError($error = $this->transport->_parseResponse(250))) {
      return $error;
    }
    $this->transport->disconnect();
    $this->transport = false;
    return true;
  }

  var $host;
  var $port;
  var $transport;
};

class KolabLMTP extends KolabMailTransport {
  function KolabLMTP( $host = '127.0.0.1', $port = 2003 ) {
    $this->KolabMailTransport($host,$port);
  }

  function createTransport() {
    require_once 'Net/LMTP.php';
    $this->transport = &new Net_LMTP($this->host, $this->port);    
  }
};

class KolabSMTP extends KolabMailTransport {
  function KolabSMTP( $host = '127.0.0.1', $port = 25 ) {
    $this->KolabMailTransport($host,$port);
  }

  function createTransport() {
    require_once 'Net/SMTP.php';
    $this->transport = &new Net_SMTP($this->host, $this->port);    
  }
};

?>
Index: kolabfilter.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/kolabfilter.php,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- kolabfilter.php	3 Apr 2005 23:17:34 -0000	1.20
+++ kolabfilter.php	7 Apr 2005 00:09:16 -0000	1.21
@@ -26,7 +26,7 @@
 
 require_once 'PEAR.php';
 require_once 'kolabfilter/misc.php';
-require_once 'kolabfilter/smtp.php';
+require_once 'kolabfilter/kolabmailtransport.php';
 
 // Load our configuration file
 $params = array();
@@ -118,6 +118,7 @@
 $add_headers = array();
 $headers_done = false;
 $from = false;
+$subject = false;
 $senderok = true;
 while (!feof(STDIN)) {
   $buffer = fgets(STDIN, 8192);
@@ -126,16 +127,18 @@
     // Done with headers
     $headers_done = true;
     if( $from && $params['verify_from_header'] ) {
-      if( !verify_sender( $sender, $from, $client_address) ) {
+      if( !verify_sender( strtolower($sender), strtolower($from), $client_address) ) {
 	$senderok = false;
       }
     }
-  } else if( !$headers_done && $params['allow_sender_header'] && eregi( '^Sender:(.*)', $line, $regs ) ) {
-    $from = strtolower($regs[1]);
-  } else if( !$headers_done && !$from && eregi( '^From:(.*)', $line, $regs ) ) {
-    $from = strtolower($regs[1]);
-  } else if( eregi( '^Content-Type: text/calendar', $line ) ) {
-    myLog("Found iCal data in message", RM_LOG_DEBUG);    
+  } else if( !$headers_done && $params['allow_sender_header'] && eregi( '^Sender: (.*)', $line, $regs ) ) {
+    $from = $regs[1];
+  } else if( !$headers_done && !$from && eregi( '^From: (.*)', $line, $regs ) ) {
+    $from = $regs[1];
+  } else if( !$headers_done && eregi( '^Subject: (.*)', $line, $regs ) ) {
+    $subject = $regs[1];
+  } else if( !$headers_done && eregi( '^Content-Type: text/calendar', $line ) ) {
+    myLog("Found iCal data in message", RM_LOG_DEBUG);
     $ical = true;
   }
   if( fwrite($tmpf, $buffer) === false ) {
@@ -147,7 +150,7 @@
 if( !$senderok ) {
   if( $ical && $params['allow_outlook_ical_forward'] ) {
     require_once('kolabfilter/olhacks.php');
-    $rc = olhacks_embedical( $fqhostname, $sender, $recipients, $tmpfname );
+    $rc = olhacks_embedical( $fqhostname, $sender, $recipients, $from, $subject, $tmpfname );
     if( PEAR::isError( $rc ) ) {
       fwrite(STDOUT,"Filter failed: ".$rc->getMessage()."\n");
       exit(EX_TEMPFAIL);
@@ -190,4 +193,4 @@
 $smtp->end();
 myLog("Kolabfilter successfully completed", RM_LOG_DEBUG);
 exit(0);
-?>
\ No newline at end of file
+?>

Index: kolabmailboxfilter.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/kolabmailboxfilter.php,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- kolabmailboxfilter.php	3 Apr 2005 23:14:10 -0000	1.1
+++ kolabmailboxfilter.php	7 Apr 2005 00:09:16 -0000	1.2
@@ -26,7 +26,7 @@
 
 require_once 'PEAR.php';
 require_once 'kolabfilter/misc.php';
-require_once 'kolabfilter/lmtp.php';
+require_once 'kolabfilter/kolabmailtransport.php';
 
 // Load our configuration file
 $params = array();
@@ -70,7 +70,7 @@
   $recipients[$i] = strtolower($recipients[$i]);
 }
 
-myLog("Kolabfilter starting up, sender=$sender, recipients=".join(',', $recipients)
+myLog("Kolabmailboxfilter starting up, sender=$sender, recipients=".join(',', $recipients)
       .", client_address=$client_address", RM_LOG_DEBUG);
 
 $ical = false;
@@ -83,9 +83,9 @@
   if( $line == '' ) {
     // Done with headers
     $headers_done = true;
-  } else if( !$headers_done && $params['allow_sender_header'] && eregi( '^Sender:(.*)', $line, $regs ) ) {
+  } else if( !$headers_done && $params['allow_sender_header'] && eregi( '^Sender: (.*)', $line, $regs ) ) {
     $from = strtolower($regs[1]);
-  } else if( !$headers_done && !$from && eregi( '^From:(.*)', $line, $regs ) ) {
+  } else if( !$headers_done && !$from && eregi( '^From: (.*)', $line, $regs ) ) {
     $from = strtolower($regs[1]);
   } else if( eregi( '^Content-Type: text/calendar', $line ) ) {
     myLog("Found iCal data in message", RM_LOG_DEBUG);    
@@ -145,6 +145,6 @@
 }
 //myLog("Calling smtp->end()", RM_LOG_DEBUG);
 $lmtp->end();
-myLog("Kolabfilter successfully completed", RM_LOG_DEBUG);
+myLog("Kolabmailboxfilter successfully completed", RM_LOG_DEBUG);
 exit(0);
-?>
\ No newline at end of file
+?>

Index: olhacks.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/olhacks.php,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- olhacks.php	3 Apr 2005 23:17:34 -0000	1.2
+++ olhacks.php	7 Apr 2005 00:09:16 -0000	1.3
@@ -27,11 +27,14 @@
 require_once 'Horde/MIME/Structure.php';
 
 $forwardtext = "This is an invitation forwarded by outlook and\n".
-  "was rectified by the Kolab server.\n\n".
+  "was rectified by the Kolab server.\n".
+  "The invitation was originally sent by\n%s.\n\n".
   "Diese Einladung wurde von Outlook weitergeleitet\n".
-  "und vom Kolab-Server in gute Form gebracht.\n";
+  "und vom Kolab-Server in gute Form gebracht.\n".
+  "Die Einladung wurde urspünglich von\n%s geschikt.\n";
 
-function olhacks_embedical( $fqhostname, $sender, $recipients, $tmpfname ) {
+function olhacks_embedical( $fqhostname, $sender, $recipients, $origfrom, $subject, $tmpfname ) {
+  myLog("Encapsulating iCal message forwarded by $sender", RM_LOG_DEBUG);
   global $forwardtext;
   // Read in message text
   $requestText = '';
@@ -45,10 +48,21 @@
   }
   fclose($handle);
 
+  // Parse existing message
+  $mime = &MIME_Structure::parseTextMIMEMessage($requestText);
+  $parts = $mime->contentTypeMap();
+  if( count($parts) != 1 || $parts[1] != 'text/calendar' ) {
+    myLog("Message does not contain exactly one toplevel text/calendar part, passing through", 
+	  RM_LOG_DEBUG);
+    return false;
+  }
+  $basepart = $mime->getBasePart();
+
   // Construct new MIME message with original message attached
   $toppart = &new MIME_Message();
-  $textpart = &new MIME_Part('text/plain', $forwardtext, 'UTF-8' );
-  $msgpart = &new MIME_Part('message/rfc822', $requestText );
+  $textpart = &new MIME_Part('text/plain', sprintf($forwardtext,$origfrom,$origfrom), 'UTF-8' );
+  $msgpart = &new MIME_Part($basepart->getType(), $basepart->toString(), 
+			    $basepart->getCharset() );
   $toppart->addPart($textpart);
   $toppart->addPart($msgpart);
   
@@ -58,11 +72,10 @@
   $msg_headers->addMessageIdHeader();
   $msg_headers->addHeader('Date', date('r'));
   $msg_headers->addHeader('From', "$sender");
+  if( $subject !== false ) $msg_headers->addHeader('Subject', $subject );
   foreach( $recipients as $recip ) {
     $msg_headers->addHeader('To', $recip);
   }
-  // TODO(steffen): Use subject from original message
-  $msg_headers->addHeader('Subject', 'Kolab forwarded message' );
   $msg_headers->addMIMEHeaders($toppart);
 
   if (is_object($msg_headers)) {

--- lmtp.php DELETED ---

--- smtp.php DELETED ---





More information about the commits mailing list