Viewing file: Ident.php (10.47 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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; } }
?>
|