sieve.php
来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· 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 + -
显示快捷键?