2008-12-10 14:33:43 +01:00
|
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* AmavisdEngine class
|
|
|
|
|
* @author Samuel Tran
|
|
|
|
|
* @author Jeremy Fowler
|
|
|
|
|
* @version 03-22-07
|
|
|
|
|
* @package AmavisdEngine
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2005 - 2007 MailZu
|
|
|
|
|
* License: GPL, see LICENSE
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* Base directory of application
|
|
|
|
|
*/
|
|
|
|
|
@define('BASE_DIR', dirname(__FILE__) . '/..');
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CmnFns class
|
|
|
|
|
*/
|
|
|
|
|
include_once('CmnFns.class.php');
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* PEAR::Net_Socket Library
|
|
|
|
|
*/
|
|
|
|
|
if ($GLOBALS['conf']['app']['safeMode']) {
|
|
|
|
|
ini_set('include_path', ( dirname(__FILE__) . '/pear/' . PATH_SEPARATOR . ini_get('include_path') ));
|
|
|
|
|
include_once('pear/PEAR.php');
|
|
|
|
|
include_once('pear/Net/Socket.php');
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
include_once 'PEAR.php';
|
|
|
|
|
include_once 'Net/Socket.php';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Provide all access/communication to Amavisd AM.PDP
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class AmavisdEngine {
|
|
|
|
|
|
|
|
|
|
var $socket; // Reference to socket
|
|
|
|
|
var $port; // Amavisd spam release port
|
|
|
|
|
var $connected; // Connection status
|
|
|
|
|
var $last_error; // Last error message
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* AmavisdEngine object constructor
|
|
|
|
|
* $param none
|
|
|
|
|
* $return object Amavisd object
|
|
|
|
|
*/
|
|
|
|
|
function AmavisdEngine($host) {
|
|
|
|
|
|
|
|
|
|
$this->socket = new Net_Socket();
|
|
|
|
|
$this->port = $GLOBALS['conf']['amavisd']['spam_release_port'];
|
|
|
|
|
$this->connected = false;
|
|
|
|
|
$this->last_error = '';
|
|
|
|
|
|
|
|
|
|
// Connect to the Amavisd Port or wait 5 seconds and timeout
|
|
|
|
|
$result = $this->socket->connect($host, $this->port, true, 5);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($result)) {
|
|
|
|
|
$this->last_error = "Error connecting to $host:$this->port, " . $result->getMessage();
|
|
|
|
|
} else {
|
|
|
|
|
$this->connected = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Shutdown and close socket
|
|
|
|
|
* @param none
|
|
|
|
|
*/
|
|
|
|
|
function disconnect() {
|
|
|
|
|
$this->socket->disconnect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Release message from quarantine
|
|
|
|
|
* @param $mail_id
|
|
|
|
|
* @param $secret_id
|
|
|
|
|
* @param $recipient
|
|
|
|
|
* @result response
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function release_message($mail_id, $secret_id, $recipient, $quar_type, $quar_loc) {
|
|
|
|
|
|
|
|
|
|
if (! $this->connected) {
|
|
|
|
|
return $this->last_error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$in = "request=release\r\n";
|
|
|
|
|
$in .= "mail_id=$mail_id\r\n";
|
|
|
|
|
$in .= "secret_id=$secret_id\r\n";
|
|
|
|
|
$in .= "quar_type=$quar_type\r\n";
|
|
|
|
|
|
|
|
|
|
# If it is file-based quarantine, lets provide the filename on the host
|
2009-09-02 19:15:09 +02:00
|
|
|
|
if ( $quar_type == 'F' || quar_type == 'Z' ) {
|
2008-12-10 14:33:43 +01:00
|
|
|
|
$in .= "mail_file=$quar_loc\r\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$in .= "recipient=<$recipient>\r\n";
|
|
|
|
|
$in .= "\r\n";
|
|
|
|
|
|
|
|
|
|
// Sending request ...
|
|
|
|
|
$out = $this->socket->write($in);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($out)) {
|
|
|
|
|
$this->last_error = 'Error writing to socket: ' . $out->getMessage();
|
|
|
|
|
return $this->last_error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set timeout of 5 seconds
|
|
|
|
|
$this->socket->setTimeout(5);
|
|
|
|
|
|
|
|
|
|
// Reading response
|
|
|
|
|
$out = $this->socket->read(512);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($out)) {
|
|
|
|
|
$this->last_error = 'Error reading from socket: ' . $out->getMessage();
|
|
|
|
|
return $this->last_error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $out;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
?>
|