ident.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 332 行

PHP
332
字号
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2005 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.0 of the PHP license,       |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Author:          Ondrej Jombik <nepto@platon.sk>                     |// | Original author: Gavin Brown <gavin.brown@uk.com>                    |// +----------------------------------------------------------------------+//// $Id: Ident.php,v 1.7 2005/03/07 11:23:26 nepto Exp $//// Identification Protocol implementation//require_once 'PEAR.php';/** * Net_Ident default values * @const   NET_IDENT_DEFAULT_TIMEOUT   Default ident query network timeout * @const   NET_IDENT_DEFAULT_PORT      Default ident protocol port */define('NET_IDENT_DEFAULT_TIMEOUT',      30);define('NET_IDENT_DEFAULT_PORT',        113);/** * Net_Ident object states * @const   NET_IDENT_STATUS_UNDEF      Undefined Net_Ident object state * @const   NET_IDENT_STATUS_OK         Net_Ident object did successful query * @const   NET_IDENT_STATUS_ERROR      Net_Ident object query failed */define('NET_IDENT_STATUS_UNDEF',          0);define('NET_IDENT_STATUS_OK',             1);define('NET_IDENT_STATUS_ERROR',          2);/** * Net_Ident - Identification Protocol implementation according to RFC 1413 * * The Identification Protocol (a.k.a., "ident", a.k.a., "the Ident Protocol") * provides a means to determine the identity of a user of a particular TCP * connection.  Given a TCP port number pair, it returns a character string * which identifies the owner of that connection on the server's system. * * You can find out more about the Ident protocol at * *      http://www.ietf.org/rfc/rfc1413.txt * * Usage: *   <?php *       require_once 'Net/Ident.php'; *       $ident   = new Net_Ident; *       $user    = $ident->getUser(); *       $os_type = $ident->getOsType(); *       echo "user: $user, operating system: $os_type\n"; *   ?> * * @author      Ondrej Jombik <nepto@platon.sk> * @package     Net_Ident * @version     1.1.0 * @access      public */class Net_Ident{    /**     * Current object state (undef, ok, error)     *     * @var     enum     * @access  private     */    var $_status;    /**     * Error message string;     *   if $_status is "error", $_error contains system error message;     *   if $_status is "ok", $_error contains ident error message     * or it is empty     *     * @var     string     * @access  private     */    var $_error;    /**     * Properties array (contains remote host, remote port, ident port, etc.)     *     * @var     array     * @access  private     */    var $_props;    /**     * Data array (contains ident username, ident operating system type, and     * raw line returned from ident server)     *     * @var     array     * @access  private     */    var $_data;    /**     * Net_Ident object constructor     *     * Initializes class properties. Use empty string '' for any string     * parameter and value of 0 for any int parameter to set default value.     *     * @param   string  $remote_addr    Remote host address (IP or hostname)     * @param   int     $remote_port    Remote port (default $REMOTE_PORT)     * @param   int     $local_port     Local port  (default $SERVER_PORT)     * @param   int     $ident_port     Ident port  (default 113)     * @param   int     $timeout        Socket timeout (default 30 seconds)     * @return  none     * @access  public     */    function Net_Ident(            $remote_addr = '',            $remote_port = 0,            $local_port  = 0,            $ident_port  = 0,            $timeout     = 0)    {        $this->_status = NET_IDENT_STATUS_UNDEF;        $this->setRemoteAddr($remote_addr);        $this->setRemotePort($remote_port);        $this->setLocalPort($local_port);        $this->setIdentPort($ident_port);        $this->setTimeout($timeout);    }    /**     * Sets remote host address (IP or hostname)     *     * @param   string  $remote_addr    Remote host address (IP or hostname)     * @return  none     * @access  public     */    function setRemoteAddr($remote_addr)    {        strlen($remote_addr) <= 0 && $remote_addr = $_SERVER['REMOTE_ADDR'];        $this->_props['remote_addr'] = $remote_addr;    }    /**     * Sets remote port     *     * @param   int     $remote_port    Remote port (default $REMOTE_PORT)     * @return  none     * @access  public     */    function setRemotePort($remote_port)    {        $remote_port = intval($remote_port);        $remote_port <= 0 && $remote_port = $_SERVER['REMOTE_PORT'];        $this->_props['remote_port'] = $remote_port;    }    /**     * Sets local port     *     * @param   int     $local_port     Local port  (default $SERVER_PORT)     * @return  none     * @access  public     */    function setLocalPort($local_port)    {        $local_port = intval($local_port);        $local_port <= 0 && $local_port = $_SERVER['SERVER_PORT'];        $this->_props['local_port'] = $local_port;    }    /**     * Sets ident port     *     * @param   int     $ident_port     Ident port  (default 113)     * @return  none     * @access  public     */    function setIdentPort($ident_port)    {        $ident_port = intval($ident_port);        $ident_port <= 0 && $ident_port = NET_IDENT_DEFAULT_PORT;        $this->_props['ident_port'] = $ident_port;    }    /**     * Sets socket timeout     *     * @param   int     $timeout        Socket timeout (default 30 seconds)     * @return  none     * @access  public     */    function setTimeout($timeout)    {        $timeout = intval($timeout);        $timeout <= 0 && $timeout = NET_IDENT_DEFAULT_TIMEOUT;        $this->_props['timeout'] = $timeout;    }    /**     * Performs network socket ident query     *     * @return  mixed   PEAR_Error on connection error     *                  rawdata read from socket on success     * @access  public     */    function query()    {        // query forced, clean current result        if ($this->_status == NET_IDENT_STATUS_OK) {            unset($this->_data['username']);            unset($this->_data['os_type']);            $this->_status = NET_IDENT_STATUS_UNDEF;        }        while (1) {            if ($this->_status == NET_IDENT_STATUS_ERROR) {                return new PEAR_Error($this->_error);            }            if ($socket = @fsockopen(                        $this->_props['remote_addr'],                        $this->_props['ident_port'],                        $errno, $errstr,                        $this->_props['timeout'])) {                break;            }            $this->_status = NET_IDENT_STATUS_ERROR;            $this->_error  = 'Error connecting to ident server ('                    .$this->_props['remote_addr'].':'                    .$this->_props['ident_port']."): $errstr ($errno)"; // )        }        $line = $this->_props['remote_port'].','            .$this->_props['local_port']."\r\n";        @fwrite($socket, $line);        $line = @fgets($socket, 1000); // 1000 octets according to RFC 1413        fclose($socket);        $this->_status = NET_IDENT_STATUS_OK;        $this->_data['rawdata'] = $line;        $this->_parseIdentResponse($line);        return $line;    }    /**     * Returns ident username     *     * @return  mixed   PEAR_Error on connection error     *                  false boolean on ident protocol error     *                  username string on success     * @access  public     */    function getUser()    {        $this->_status == NET_IDENT_STATUS_UNDEF && $this->query();        if ($this->_status == NET_IDENT_STATUS_ERROR) {            return new PEAR_Error($this->_error);        }        return $this->_data['username'];    }    /**     * Returns ident operating system type     *     * @return  mixed   PEAR_Error on connection error     *                  false boolean on ident protocol error     *                  operating system type string on success     * @access  public     */    function getOsType()    {        $this->_status == NET_IDENT_STATUS_UNDEF && $this->query();        if ($this->_status == NET_IDENT_STATUS_ERROR) {            return new PEAR_Error($this->_error);        }        return $this->_data['os_type'];    }    /**     * Returns ident protocol error     *     * @return  mixed   error string if ident protocol error had occured     *                  false otherwise     * @access  public     */    function identError()    {        if ($this->_status == NET_IDENT_STATUS_OK                && isset($this->_error)) {            return $this->_error;        }        return false;    }    /**     * Parses response from indent server and sets internal data structures     * with ident username and ident operating system type     *     * @param   string  $string     ident server response     * @return  boolean true if no ident protocol error had occured     *                  false otherwise     * @access  private     */    function _parseIdentResponse($string)    {        $this->_data['username'] = false;        $this->_data['os_type']  = false;        $array = explode(':', $string, 4);        if (count($array) > 1 && ! strcasecmp(trim($array[1]), 'USERID')) {            isset($array[2]) && $this->_data['os_type']  = trim($array[2]);            isset($array[3]) && $this->_data['username'] = trim($array[3]);            return true;        } elseif (count($array) > 1 && ! strcasecmp(trim($array[1]), 'ERROR')) {            isset($array[2]) && $this->_error = trim($array[2]);        } else {            $this->_error = 'Invalid ident server response';        }        return false;    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?