Rev 42 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** URI normalization routines.** @package OpenID* @author JanRain, Inc. <openid@janrain.com>* @copyright 2005 Janrain, Inc.* @license http://www.gnu.org/copyleft/lesser.html LGPL*/require_once 'Services/Yadis/Misc.php';// from appendix B of rfc 3986 (http://www.ietf.org/rfc/rfc3986.txt)function Auth_OpenID_getURIPattern(){return '&^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?&';}function Auth_OpenID_getAuthorityPattern(){return '/^([^@]*@)?([^:]*)(:.*)?/';}function Auth_OpenID_getEncodedPattern(){return '/%([0-9A-Fa-f]{2})/';}function Auth_OpenID_getUnreserved(){$_unreserved = array();for ($i = 0; $i < 256; $i++) {$_unreserved[$i] = false;}for ($i = ord('A'); $i <= ord('Z'); $i++) {$_unreserved[$i] = true;}for ($i = ord('0'); $i <= ord('9'); $i++) {$_unreserved[$i] = true;}for ($i = ord('a'); $i <= ord('z'); $i++) {$_unreserved[$i] = true;}$_unreserved[ord('-')] = true;$_unreserved[ord('.')] = true;$_unreserved[ord('_')] = true;$_unreserved[ord('~')] = true;return $_unreserved;}function Auth_OpenID_getEscapeRE(){$parts = array();foreach (array_merge(Services_Yadis_getUCSChars(),Services_Yadis_getIPrivateChars()) as $pair) {list($m, $n) = $pair;$parts[] = sprintf("%s-%s", chr($m), chr($n));}return sprintf('[%s]', implode('', $parts));}function Auth_OpenID_pct_encoded_replace_unreserved($mo){$_unreserved = Auth_OpenID_getUnreserved();$i = intval($mo[1], 16);if ($_unreserved[$i]) {return chr($i);} else {return strtoupper($mo[0]);}return $mo[0];}function Auth_OpenID_pct_encoded_replace($mo){return chr(intval($mo[1], 16));}function Auth_OpenID_remove_dot_segments($path){$result_segments = array();while ($path) {if (Services_Yadis_startswith($path, '../')) {$path = substr($path, 3);} else if (Services_Yadis_startswith($path, './')) {$path = substr($path, 2);} else if (Services_Yadis_startswith($path, '/./')) {$path = substr($path, 2);} else if ($path == '/.') {$path = '/';} else if (Services_Yadis_startswith($path, '/../')) {$path = substr($path, 3);if ($result_segments) {array_pop($result_segments);}} else if ($path == '/..') {$path = '/';if ($result_segments) {array_pop($result_segments);}} else if (($path == '..') ||($path == '.')) {$path = '';} else {$i = 0;if ($path[0] == '/') {$i = 1;}$i = strpos($path, '/', $i);if ($i === false) {$i = strlen($path);}$result_segments[] = substr($path, 0, $i);$path = substr($path, $i);}}return implode('', $result_segments);}function Auth_OpenID_urinorm($uri){$uri_matches = array();preg_match(Auth_OpenID_getURIPattern(), $uri, $uri_matches);if (count($uri_matches) < 9) {for ($i = count($uri_matches); $i <= 9; $i++) {$uri_matches[] = '';}}$scheme = $uri_matches[2];if ($scheme) {$scheme = strtolower($scheme);}$scheme = $uri_matches[2];if ($scheme === '') {// No scheme specifiedreturn null;}$scheme = strtolower($scheme);if (!in_array($scheme, array('http', 'https'))) {// Not an absolute HTTP or HTTPS URIreturn null;}$authority = $uri_matches[4];if ($authority === '') {// Not an absolute URIreturn null;}$authority_matches = array();preg_match(Auth_OpenID_getAuthorityPattern(),$authority, $authority_matches);if (count($authority_matches) === 0) {// URI does not have a valid authorityreturn null;}if (count($authority_matches) < 4) {for ($i = count($authority_matches); $i <= 4; $i++) {$authority_matches[] = '';}}list($_whole, $userinfo, $host, $port) = $authority_matches;if ($userinfo === null) {$userinfo = '';}if (strpos($host, '%') !== -1) {$host = strtolower($host);$host = preg_replace_callback(Auth_OpenID_getEncodedPattern(),'Auth_OpenID_pct_encoded_replace', $host);// NO IDNA.// $host = unicode($host, 'utf-8').encode('idna');} else {$host = strtolower($host);}if ($port) {if (($port == ':') ||($scheme == 'http' && $port == ':80') ||($scheme == 'https' && $port == ':443')) {$port = '';}} else {$port = '';}$authority = $userinfo . $host . $port;$path = $uri_matches[5];$path = preg_replace_callback(Auth_OpenID_getEncodedPattern(),'Auth_OpenID_pct_encoded_replace_unreserved', $path);$path = Auth_OpenID_remove_dot_segments($path);if (!$path) {$path = '/';}$query = $uri_matches[6];if ($query === null) {$query = '';}$fragment = $uri_matches[8];if ($fragment === null) {$fragment = '';}return $scheme . '://' . $authority . $path . $query . $fragment;}?>