http.php
来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 796 行 · 第 1/2 页
PHP
796 行
<?php//// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2004 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 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. |// +----------------------------------------------------------------------+// | Authors: Martin Jansen <mj@php.net> |// | Rui Hirokawa <hirokawa@php.net> |// | David Costa <gurugeek@php.net> |// +----------------------------------------------------------------------+//// $Id: Auth_HTTP.php,v 1.27 2005/04/04 12:48:33 hirokawa Exp $ //require_once "Auth/Auth.php";define('AUTH_HTTP_NONCE_TIME_LEN', 16);define('AUTH_HTTP_NONCE_HASH_LEN', 32);// {{{ class Auth_HTTP/** * PEAR::Auth_HTTP * * The PEAR::Auth_HTTP class provides methods for creating an * HTTP authentication system based on RFC-2617 using PHP. * * Instead of generating an HTML driven form like PEAR::Auth * does, this class sends header commands to the clients which * cause them to present a login box like they are e.g. used * in Apache's .htaccess mechanism. * * This class requires the PEAR::Auth package. * * @notes The HTTP Digest Authentication part is based on * authentication class written by Tom Pike <tom.pike@xiven.com> * * @author Martin Jansen <mj@php.net> * @author Rui Hirokawa <hirokawa@php.net> * @author David Costa <gurugeek@php.net> * @package Auth_HTTP * @extends Auth * @version $Revision: 1.27 $ */class Auth_HTTP extends Auth{ // {{{ properties /** * Authorization method: 'basic' or 'digest' * * @access public * @var string */ var $authType = 'basic'; /** * Name of the realm for Basic Authentication * * @access public * @var string * @see drawLogin() */ var $realm = "protected area"; /** * Text to send if user hits cancel button * * @access public * @var string * @see drawLogin() */ var $CancelText = "Error 401 - Access denied"; /** * option array * * @access public * @var array */ var $options = array(); /** * flag to indicate the nonce was stale. * * @access public * @var bool */ var $stale = false; /** * opaque string for digest authentication * * @access public * @var string */ var $opaque = 'dummy'; /** * digest URI * * @access public * @var string */ var $uri = ''; /** * authorization info returned by the client * * @access public * @var array */ var $auth = array(); /** * next nonce value * * @access public * @var string */ var $nextNonce = ''; /** * nonce value * * @access public * @var string */ var $nonce = ''; /** * Holds a reference to the global server variable * @var array */ var $server; /** * Holds a reference to the global post variable * @var array */ var $post; /** * Holds a reference to the global cookie variable * @var array */ var $cookie; // }}} // {{{ Constructor /** * Constructor * * @param string Type of the storage driver * @param mixed Additional options for the storage driver * (example: if you are using DB as the storage * driver, you have to pass the dsn string here) * * @return void */ function Auth_HTTP($storageDriver, $options = '') { /* set default values for options */ $this->options = array('cryptType' => 'md5', 'algorithm' => 'MD5', 'qop' => 'auth-int,auth', 'opaquekey' => 'moo', 'noncekey' => 'moo', 'digestRealm' => 'protected area', 'forceDigestOnly' => false, 'nonceLife' => 300, 'sessionSharing' => true, ); if (!empty($options['authType'])) { $this->authType = strtolower($options['authType']); } if (is_array($options)) { foreach($options as $key => $value) { if (array_key_exists( $key, $this->options)) { $this->options[$key] = $value; } } if (!empty($this->options['opaquekey'])) { $this->opaque = md5($this->options['opaquekey']); } } $this->Auth($storageDriver, $options); } // }}} // {{{ assignData() /** * Assign values from $PHP_AUTH_USER and $PHP_AUTH_PW or 'Authorization' header * to internal variables and sets the session id based * on them * * @access public * @return void */ function assignData() { if (method_exists($this, '_importGlobalVariable')) { $this->server = &$this->_importGlobalVariable('server'); } if ($this->authType == 'basic') { if (!empty($this->server['PHP_AUTH_USER'])) { $this->username = $this->server['PHP_AUTH_USER']; } if (!empty($this->server['PHP_AUTH_PW'])) { $this->password = $this->server['PHP_AUTH_PW']; } /** * Try to get authentication information from IIS */ if (empty($this->username) && empty($this->password)) { if (!empty($this->server['HTTP_AUTHORIZATION'])) { list($this->username, $this->password) = explode(':', base64_decode(substr($this->server['HTTP_AUTHORIZATION'], 6))); } } } elseif ($this->authType == 'digest') { $this->username = ''; $this->password = ''; $this->digest_header = null; if (!empty($this->server['PHP_AUTH_DIGEST'])) { $this->digest_header = substr($this->server['PHP_AUTH_DIGEST'], strpos($this->server['PHP_AUTH_DIGEST'],' ')+1); } else { $headers = getallheaders(); if(isset($headers['Authorization']) && !empty($headers['Authorization'])) { $this->digest_header = substr($headers['Authorization'], strpos($headers['Authorization'],' ')+1); } } if($this->digest_header) { $authtemp = explode(',', $this->digest_header); $auth = array(); foreach($authtemp as $key => $value) { $value = trim($value); if(strpos($value,'=') !== false) { $lhs = substr($value,0,strpos($value,'=')); $rhs = substr($value,strpos($value,'=')+1); if(substr($rhs,0,1) == '"' && substr($rhs,-1,1) == '"') { $rhs = substr($rhs,1,-1); } $auth[$lhs] = $rhs; } } } if (!isset($auth['uri']) || !isset($auth['realm'])) { return; } if ($this->selfURI() == $auth['uri']) { $this->uri = $auth['uri']; if (substr($headers['Authorization'],0,7) == 'Digest ') { $this->authType = 'digest'; if (!isset($auth['nonce']) || !isset($auth['username']) || !isset($auth['response']) || !isset($auth['qop']) || !isset($auth['nc']) || !isset($auth['cnonce'])){ return; } if ($auth['qop'] != 'auth' && $auth['qop'] != 'auth-int') { return; } $this->stale = $this->_judgeStale($auth['nonce']); if ($this->nextNonce == false) { return; } $this->username = $auth['username']; $this->password = $auth['response']; $this->auth['nonce'] = $auth['nonce']; $this->auth['qop'] = $auth['qop']; $this->auth['nc'] = $auth['nc']; $this->auth['cnonce'] = $auth['cnonce']; if (isset($auth['opaque'])) { $this->auth['opaque'] = $auth['opaque']; } } elseif (substr($headers['Authorization'],0,6) == 'Basic ') { if ($this->options['forceDigestOnly']) { return; // Basic authentication is not allowed. } $this->authType = 'basic'; list($username, $password) = explode(':',base64_decode(substr($headers['Authorization'],6))); $this->username = $username; $this->password = $password; } } } else { return PEAR::raiseError('authType is invalid.'); } if ($this->options['sessionSharing'] && isset($this->username) && isset($this->password)) { session_id(md5('Auth_HTTP' . $this->username . $this->password)); } /** * set sessionName for AUTH, so that the sessionName is different * for distinct realms */ $this->_sessionName = "_authhttp".md5($this->realm); } // }}} // {{{ login() /** * Login function * * @access private * @return void */ function login() { $login_ok = false; if (method_exists($this, '_loadStorage')) { $this->_loadStorage(); } $this->storage->_auth_obj->_sessionName =& $this->_sessionName; /** * When the user has already entered a username, * we have to validate it. */ if (!empty($this->username) && !empty($this->password)) { if ($this->authType == 'basic' && !$this->options['forceDigestOnly']) { if (true === $this->storage->fetchData($this->username, $this->password)) { $login_ok = true; } } else { /* digest authentication */ if (!$this->getAuth() || $this->getAuthData('a1') == null) { /* * note: * - only PEAR::DB is supported as container. * - password should be stored in container as plain-text * (if $options['cryptType'] == 'none') or * A1 hashed form (md5('username:realm:password')) * (if $options['cryptType'] == 'md5') */ $dbs = $this->storage; if (!DB::isConnection($dbs->db)) { $dbs->_connect($dbs->options['dsn']); } $query = 'SELECT '.$dbs->options['passwordcol']." FROM ".$dbs->options['table']. ' WHERE '.$dbs->options['usernamecol']." = '". $dbs->db->quoteString($this->username)."' "; $pwd = $dbs->db->getOne($query); // password stored in container. if (DB::isError($pwd)) { return PEAR::raiseError($pwd->getMessage(), $pwd->getCode()); } if ($this->options['cryptType'] == 'none') { $a1 = md5($this->username.':'.$this->options['digestRealm'].':'.$pwd); } else { $a1 = $pwd; } $this->setAuthData('a1', $a1, true); } else {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?