sieve.php
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 1,165 行 · 第 1/3 页
PHP
1,165 行
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003, Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@phpguru.org> |
// | Co-Author: Damian Fernandez Sosa <damlists@cnba.uba.ar> |
// +-----------------------------------------------------------------------+
require_once('Net/Socket.php');
/**
* TODO
*
* o supportsAuthMech()
*/
/**
* Disconnected state
* @const NET_SIEVE_STATE_DISCONNECTED
*/
define('NET_SIEVE_STATE_DISCONNECTED', 1, true);
/**
* Authorisation state
* @const NET_SIEVE_STATE_AUTHORISATION
*/
define('NET_SIEVE_STATE_AUTHORISATION', 2, true);
/**
* Transaction state
* @const NET_SIEVE_STATE_TRANSACTION
*/
define('NET_SIEVE_STATE_TRANSACTION', 3, true);
/**
* A class for talking to the timsieved server which
* comes with Cyrus IMAP. the HAVESPACE
* command which appears to be broken (Cyrus 2.0.16).
*
* @author Richard Heyes <richard@php.net>
* @author Damian Fernandez Sosa <damlists@cnba.uba.ar>
* @access public
* @version 0.9.1
* @package Net_Sieve
*/
class Net_Sieve
{
/**
* The socket object
* @var object
*/
var $_sock;
/**
* Info about the connect
* @var array
*/
var $_data;
/**
* Current state of the connection
* @var integer
*/
var $_state;
/**
* Constructor error is any
* @var object
*/
var $_error;
/**
* To allow class debuging
* @var boolean
*/
var $_debug = false;
/**
* The auth methods this class support
* @var array
*/
var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'PLAIN' , 'LOGIN');
//if you have problems using DIGEST-MD5 authentication please commente the line above and discomment the following line
//var $supportedAuthMethods=array( 'CRAM-MD5', 'PLAIN' , 'LOGIN');
//var $supportedAuthMethods=array( 'PLAIN' , 'LOGIN');
/**
* The auth methods this class support
* @var array
*/
var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5');
/**
* Handles posible referral loops
* @var array
*/
var $_maxReferralCount = 15;
/**
* Constructor
* Sets up the object, connects to the server and logs in. stores
* any generated error in $this->_error, which can be retrieved
* using the getError() method.
*
* @access public
* @param string $user Login username
* @param string $pass Login password
* @param string $host Hostname of server
* @param string $port Port of server
* @param string $logintype Type of login to perform
* @param string $euser Effective User (if $user=admin, login as $euser)
*/
function Net_Sieve($user = null , $pass = null , $host = 'localhost', $port = 2000, $logintype = '', $euser = '', $debug = false)
{
$this->_state = NET_SIEVE_STATE_DISCONNECTED;
$this->_data['user'] = $user;
$this->_data['pass'] = $pass;
$this->_data['host'] = $host;
$this->_data['port'] = $port;
$this->_data['logintype'] = $logintype;
$this->_data['euser'] = $euser;
$this->_sock = &new Net_Socket();
$this->_debug = $debug;
/*
* Include the Auth_SASL package. If the package is not available,
* we disable the authentication methods that depend upon it.
*/
if ((@include_once 'Auth/SASL.php') === false) {
if($this->_debug){
echo "AUTH_SASL NOT PRESENT!\n";
}
foreach($this->supportedSASLAuthMethods as $SASLMethod){
$pos = array_search( $SASLMethod, $this->supportedAuthMethods );
if($this->_debug){
echo "DISABLING METHOD $SASLMethod\n";
}
unset($this->supportedAuthMethods[$pos]);
}
}
if( ($user != null) && ($pass != null) ){
$this->_error = $this->_handleConnectAndLogin();
}
}
/**
* Handles the errors the class can find
* on the server
*
* @access private
* @return PEAR_Error
*/
function _raiseError($msg, $code)
{
include_once 'PEAR.php';
return PEAR::raiseError($msg, $code);
}
/**
* Handles connect and login.
* on the server
*
* @access private
* @return mixed Indexed array of scriptnames or PEAR_Error on failure
*/
function _handleConnectAndLogin(){
if (PEAR::isError($res = $this->connect($this->_data['host'] , $this->_data['port'] ))) {
return $res;
}
if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'] , $this->_data['euser'] ) ) ) {
return $res;
}
return true;
}
/**
* Returns an indexed array of scripts currently
* on the server
*
* @access public
* @return mixed Indexed array of scriptnames or PEAR_Error on failure
*/
function listScripts()
{
if (is_array($scripts = $this->_cmdListScripts())) {
$this->_active = $scripts[1];
return $scripts[0];
} else {
return $scripts;
}
}
/**
* Returns the active script
*
* @access public
* @return mixed The active scriptname or PEAR_Error on failure
*/
function getActive()
{
if (!empty($this->_active)) {
return $this->_active;
} elseif (is_array($scripts = $this->_cmdListScripts())) {
$this->_active = $scripts[1];
return $scripts[1];
}
}
/**
* Sets the active script
*
* @access public
* @param string $scriptname The name of the script to be set as active
* @return mixed true on success, PEAR_Error on failure
*/
function setActive($scriptname)
{
return $this->_cmdSetActive($scriptname);
}
/**
* Retrieves a script
*
* @access public
* @param string $scriptname The name of the script to be retrieved
* @return mixed The script on success, PEAR_Error on failure
*/
function getScript($scriptname)
{
return $this->_cmdGetScript($scriptname);
}
/**
* Adds a script to the server
*
* @access public
* @param string $scriptname Name of the script
* @param string $script The script
* @param bool $makeactive Whether to make this the active script
* @return mixed true on success, PEAR_Error on failure
*/
function installScript($scriptname, $script, $makeactive = false)
{
if (PEAR::isError($res = $this->_cmdPutScript($scriptname, $script))) {
return $res;
} elseif ($makeactive) {
return $this->_cmdSetActive($scriptname);
} else {
return true;
}
}
/**
* Removes a script from the server
*
* @access public
* @param string $scriptname Name of the script
* @return mixed True on success, PEAR_Error on failure
*/
function removeScript($scriptname)
{
return $this->_cmdDeleteScript($scriptname);
}
/**
* Returns any error that may have been generated in the
* constructor
*
* @access public
* @return mixed False if no error, PEAR_Error otherwise
*/
function getError()
{
return PEAR::isError($this->_error) ? $this->_error : false;
}
/**
* Handles connecting to the server and checking the
* response is valid.
*
* @access private
* @param string $host Hostname of server
* @param string $port Port of server
* @return mixed True on success, PEAR_Error otherwise
*/
function connect($host, $port)
{
if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) {
$msg='Not currently in DISCONNECTED state';
$code=1;
return $this->_raiseError($msg,$code);
}
if (PEAR::isError($res = $this->_sock->connect($host, $port, null, 5))) {
return $res;
}
$this->_state = NET_SIEVE_STATE_AUTHORISATION;
if (PEAR::isError($res = $this->_doCmd())) {
return $res;
}
/*
if(PEAR::isError($res = $this->_cmdCapability() )) {
$msg='Failed to connect, server said: ' . $res->getMessage();
$code=2;
return $this->_raiseError($msg,$code);
}
*/
// Get logon greeting/capability and parse
$this->_parseCapability($res);
return true;
}
/**
* Logs into server.
*
* @access public
* @param string $user Login username
* @param string $pass Login password
* @param string $logintype Type of login method to use
* @param string $euser Effective UID (perform on behalf of $euser)
* @param boolean $bypassAuth dont perform auth
* @return mixed True on success, PEAR_Error otherwise
*/
function login($user, $pass, $logintype = null , $euser = '', $bypassAuth=false)
{
if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) {
$msg='Not currently in AUTHORISATION state';
$code=1;
return $this->_raiseError($msg,$code);
}
if( $bypassAuth === false ){
if(PEAR::isError($res=$this->_cmdAuthenticate($user , $pass , $logintype, $euser ) ) ){
return $res;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?