steffen: server/kolab-resource-handlers/kolab-resource-handlers/resmgr kolabfilter.php, NONE, 1.1 misc.php, NONE, 1.1 smtp.php, NONE, 1.1 resmgr.php, 1.47, 1.48

cvs at intevation.de cvs at intevation.de
Thu Nov 4 13:31:09 CET 2004


Author: steffen

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

Modified Files:
	resmgr.php 
Added Files:
	kolabfilter.php misc.php smtp.php 
Log Message:
new filter script!

--- NEW FILE: kolabfilter.php ---
#!@l_prefix@/bin/php
<?php
require_once 'PEAR.php';
require_once 'kolabfilter/misc.php';
require_once 'kolabfilter/smtp.php';

// Load our configuration file
$params = array();
require_once '@l_prefix@/etc/resmgr/resmgr.conf';
init();

define( 'TMPDIR', '@l_prefix@/var/resmgr/filter' );
define( 'EX_TEMPFAIL', 75 );
define( 'EX_UNAVAILABLE', 69 );

$tmpfname = tempnam( TMPDIR, 'IN.' );
$tmpf = fopen($tmpfname, "w");

function cleanup() {
  global $tmpfname;
  file_exists($tmpfname) && unlink($tmpfname);
}

register_shutdown_function( 'cleanup' );

$options = getopt("s:r:");

if (!array_key_exists('r', $options) || !array_key_exists('s', $options)) {
    fwrite(STDOUT, "Usage is $argv[0] -s sender at domain -r recip at domain\n");
    exit(EX_TEMPFAIL);
}

$sender = strtolower($options['s']);
$recipient = strtolower($options['r']);

myLog("Kolabfilter starting up, sender=$sender, recipient=$recipient", RM_LOG_DEBUG);


$ical = false;
$add_headers = array();
while (!feof(STDIN)) {
  $buffer = fgets(STDIN, 8192);
  $line = rtrim( $buffer, "\r\n");
  if( $line == '' ) {
    // Done with headers
  } else if( eregi( '^From:(.*)', $line, $regs ) ) {
    $adrs = imap_rfc822_parse_adrlist($regs[1], $params['email_domain']);
    foreach( $adrs as $adr ) {
      $from = $adr->mailbox.'@'.$adr->host;
      if( $from != $sender ) {
	fwrite(STDOUT,"Invalid From: header. $from does not match envelope $sender\n");
	exit(EX_UNAVAILABLE);
      }
    }
  } else if( eregi( '^Content-Type: text/calendar', $line ) ) {
    $ical = true;
  }
  if( fwrite($tmpf, $buffer) === false ) {
    exit(EX_TEMPFAIL);
  }
}
fclose($tmpf);
if( $ical ) {
  require_once 'kolabfilter/resmgr.php';
  myLog("Calling resmgr_filter( $sender, $recipient, $tmpfname )", RM_LOG_DEBUG);
  resmgr_filter( $sender, $recipient, $tmpfname );
  $add_headers[] = "X-Kolab-Scheduling-Message: TRUE";
}

$tmpf = fopen($tmpfname,"r");
$smtp = new KolabSMTP( 'localhost', 10026 );
if( PEAR::isError( $smtp ) ) {
  fwrite(STDOUT, $smtp->getMessage()."\n"); exit(EX_TEMPFAIL);
}
//myLog("Calling smtp->start( $sender, $recipient, $tmpfname )", RM_LOG_DEBUG);
if( PEAR::isError( $error = $smtp->start($sender,$recipient) ) ) {
  fwrite(STDOUT, $error->getMessage()."\n"); exit(EX_TEMPFAIL);  
}

$headers_done = false;
while (!feof($tmpf)) {
  $buffer = fgets($tmpf, 8192);
  if( !$headers_done && rtrim( $buffer, "\r\n" ) == '' ) {
    $headers_done = true;
    foreach( $add_headers as $h ) {
      if( PEAR::isError($error = $smtp->data( "$h\r\n" )) ) {
	fwrite(STDOUT, $error->getMessage()."\n"); exit(EX_TEMPFAIL);
      }
    }
  }
  //myLog("Calling smtp->data( ".rtrim($buffer)." )", RM_LOG_DEBUG);
  if( PEAR::isError($error = $smtp->data( $buffer )) ) {
    fwrite(STDOUT, $error->getMessage()."\n"); exit(EX_TEMPFAIL);
  }
}
//myLog("Calling smtp->end()", RM_LOG_DEBUG);
$smtp->end();
myLog("Kolabfilter successfully completed", RM_LOG_DEBUG);
exit(0);
?>
--- NEW FILE: misc.php ---
<?php
// What myLog levels we can use
define('RM_LOG_SUPER',         -1);
define('RM_LOG_SILENT',         0);
define('RM_LOG_ERROR',          1);
define('RM_LOG_WARN',           2);
define('RM_LOG_INFO',           3);
define('RM_LOG_DEBUG',          4);

$logLevelPrefixes = array(
    RM_LOG_SUPER            => '',
    RM_LOG_SILENT           => '',
    RM_LOG_ERROR            => 'Error',
    RM_LOG_WARN             => 'Warning',
    RM_LOG_INFO             => '',
    RM_LOG_DEBUG            => 'Debug',
);

// What logging mechanisms are available for use
define('RM_LOG_SYSLOG',      1);
define('RM_LOG_FILE',        2);

$logType = 0;
$logPrefix = '';
$logDestination = NULL;

function logInit($name = '')
{
    global $params, $argv, $logType, $logPrefix, $logDestination;

    if (empty($name)) {
        $name = basename($argv[0]);
    }

    if (!array_key_exists('log', $params) || empty($params['log'])) {
        return;
    }

    $matches = array();
    if (preg_match('/(\w+):(.*)?/', $params['log'], $matches)) {
        switch ($matches[1]) {
        case 'syslog':
            $logType = RM_LOG_SYSLOG;
            $txtopts = preg_split('/[\s,]+/', $matches[2], -1, PREG_SPLIT_NO_EMPTY);
            $options = 0;
            foreach ($txtopts as $txtopt) {
                switch ($txtopt) {
                case 'cons': $options |= LOG_CONS; break;
                case 'ndelay': $options |= LOG_NDELAY; break;
                case 'odelay': $options |= LOG_ODELAY; break;
                case 'perror': $options |= LOG_PERROR; break;
                case 'pid': $options |= LOG_PID; break;
                }
            }
            openlog($name, $options, LOG_USER);
            break;

        case 'file':
            $logType = RM_LOG_FILE;
            $logPrefix = $name;
            $logDestination = fopen($matches[2], 'a');
            break;
        }
    }
}

function logClose()
{
    global $logType, $logDestination;

    switch ($logType) {
    case RM_LOG_SYSLOG:
        closelog();
        break;

    case RM_LOG_FILE:
        fclose($logDestination);
        $logDestination = NULL;
        break;
    }
}

function myLog($text, $priority = RM_LOG_INFO)
{
    global $params, $logLevelPrefixes, $logPrefix, $logType, $logDestination;

    if ($params['log_level'] >= $priority) {
        if (!empty($logLevelPrefixes[$priority])) {
            $text = $logLevelPrefixes[$priority] . ": $text";
        }

        switch ($logType) {
        case RM_LOG_SYSLOG:
            syslog(RM_LOG_INFO, $text);
            break;

        case RM_LOG_FILE:
            fwrite($logDestination, strftime('%B %d %T') . " ${logPrefix}[" . getmypid() . "]: $text\n");
            fflush($logDestination);
            break;
        }
    }
}

function init()
{
    global $params;

    define_syslog_variables();

    logInit();

    myLog('Starting up in ' . ($params['group'] ? 'group' : 'resource') . ' mode', RM_LOG_SUPER);

    $url_fopen = ini_get('allow_url_fopen');
    if (!$url_fopen) {
        myLog('\'allow_url_fopen\' is disabled in php.ini, enabling...', RM_LOG_WARN);
        ini_set('allow_url_fopen', '1');
    }

    // This is used as the default domain for unqualified adresses
    global $_SERVER;
    if (!array_key_exists('SERVER_NAME', $_SERVER)) {
        $_SERVER['SERVER_NAME'] = $params['email_domain'];
    }

    if (!array_key_exists('REMOTE_ADDR', $_SERVER)) {
        $_SERVER['REMOTE_ADDR'] = $params['server'];
    }

    if (!array_key_exists('REMOTE_HOST', $_SERVER)) {
        $_SERVER['REMOTE_HOST'] = $params['server'];
    }
}
?>
--- NEW FILE: smtp.php ---
<?php

class KolabSMTP {
  function KolabSMTP( $host, $port ) {
    $this->host = $host;
    $this->port = $port;
    $this->smtp = false;
  }

  function start($sender,$recip) {
    require_once 'Net/SMTP.php';
	
    $this->smtp = &new Net_SMTP($this->host, $this->port);
    if (!$this->smtp) {
      return new PEAR_Error('Failed to connect to SMTP: ' . $error->getMessage());
    }
    if (PEAR::isError($error = $this->smtp->connect())) {
      return new PEAR_Error('Failed to connect to SMTP: ' . $error->getMessage());
    }

    if (PEAR::isError($error = $this->smtp->mailFrom($sender))) {
      return new PEAR_Error('Failed to set sender: ' . $error->getMessage());
    }
    
    if (PEAR::isError($error = $this->smtp->rcptTo($recip))) {
      $msg = 'Failed to set recipient: ' . $error->getMessage();
      myLog($msg, RM_LOG_ERROR);
      return false;
    }

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

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

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

  var $host;
  var $port;
  var $smtp;
};
?>
Index: resmgr.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/resmgr.php,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -d -r1.47 -r1.48
--- resmgr.php	2 Nov 2004 11:47:40 -0000	1.47
+++ resmgr.php	4 Nov 2004 12:31:07 -0000	1.48
@@ -1,30 +1,6 @@
 #!@l_prefix@/bin/php
 <?php
-
-// What myLog levels we can use
-define('RM_LOG_SUPER',         -1);
-define('RM_LOG_SILENT',         0);
-define('RM_LOG_ERROR',          1);
-define('RM_LOG_WARN',           2);
-define('RM_LOG_INFO',           3);
-define('RM_LOG_DEBUG',          4);
-
[...1013 lines suppressed...]
+    }
+    shutdown(0);
 
-// Pass the message through to the group's mailbox
-myLog("Passing through $method method to $resource");
-sendSMTP($sender, $resource, $requestText);
-shutdown(0, "", false);
+  default:
+    // We either don't currently handle these iTip methods, or they do not
+    // apply to what we're trying to accomplish here
+    if (!$params['group']) {
+      myLog("Ignoring $method method");
+      shutdown(0);
+    }
+  }
 
+  // Pass the message through to the group's mailbox
+  myLog("Passing through $method method to $resource");
+}
 ?>





More information about the commits mailing list