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