summaryrefslogtreecommitdiffstats
path: root/Auth/OpenID/Util.php
diff options
context:
space:
mode:
authorJosh Hoyt <josh@janrain.com>2006-01-28 00:25:15 +0000
committerJosh Hoyt <josh@janrain.com>2006-01-28 00:25:15 +0000
commit82ada6dd9395d0a3ad44710e313eee63e1671c1c (patch)
treea620ecead8d250843faca4d9cf4ade782aa8d733 /Auth/OpenID/Util.php
parenta6e4a1af65b4343218b4e0d54c9d5f1a8831c41f (diff)
downloadphp-openid-82ada6dd9395d0a3ad44710e313eee63e1671c1c.zip
php-openid-82ada6dd9395d0a3ad44710e313eee63e1671c1c.tar.gz
php-openid-82ada6dd9395d0a3ad44710e313eee63e1671c1c.tar.bz2
[project @ OIDUtil -> Util]
Diffstat (limited to 'Auth/OpenID/Util.php')
-rw-r--r--Auth/OpenID/Util.php299
1 files changed, 299 insertions, 0 deletions
diff --git a/Auth/OpenID/Util.php b/Auth/OpenID/Util.php
new file mode 100644
index 0000000..8e93782
--- /dev/null
+++ b/Auth/OpenID/Util.php
@@ -0,0 +1,299 @@
+<?php
+
+/**
+ * Util: URL manipulation utility functions for the OpenID library.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: See the COPYING file included in this distribution.
+ *
+ * @package OpenID
+ * @author JanRain, Inc. <openid@janrain.com>
+ * @copyright 2005 Janrain, Inc.
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ */
+
+/**
+ * Some constants for string checking.
+ */
+$_Auth_OpenID_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+$_Auth_OpenID_digits = "0123456789";
+$_Auth_OpenID_punct = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+
+/**
+ * Create dir_name as a directory if it does not exist. If it exists,
+ * make sure that it is, in fact, a directory. Returns true if the
+ * operation succeeded; false if not.
+ */
+function ensureDir($dir_name)
+{
+ if (@mkdir($dir_name) || is_dir($dir_name)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Convenience function for getting array values.
+ */
+function Auth_OpenID_array_get($arr, $key, $fallback = null)
+{
+ if (is_array($arr)) {
+ if (array_key_exists($key, $arr)) {
+ return $arr[$key];
+ } else {
+ return $fallback;
+ }
+ } else {
+ trigger_error("Auth_OpenID_array_get expected " .
+ "array as first parameter", E_USER_WARNING);
+ return false;
+ }
+}
+
+
+/**
+ * Prints the specified message using trigger_error(E_USER_NOTICE).
+ */
+function Auth_OpenID_log($message, $unused_level = 0)
+{
+ trigger_error($message, E_USER_NOTICE);
+}
+
+/**
+ * Rename query arguments back to 'openid.' from 'openid_'
+ *
+ * @param array $args An associative array of URL query arguments
+ */
+function Auth_OpenID_fixArgs($args)
+{
+ foreach (array_keys($args) as $key) {
+ $fixed = preg_replace('/^openid_/', 'openid.', $key);
+ if ($fixed != $key) {
+ $val = $args[$key];
+ unset($args[$key]);
+ $args[$fixed] = $val;
+ }
+ }
+
+ return $args;
+}
+
+/**
+ * Implements the PHP 5 'http_build_query' functionality.
+ *
+ * @param array $data Either an array key/value pairs or an array of
+ * arrays, each of which holding two values: a key and a value,
+ * sequentially.
+ * @return string $result The result of url-encoding the key/value
+ * pairs from $data into a URL query string
+ * (e.g. "username=bob&id=56").
+ */
+function Auth_OpenID_http_build_query($data)
+{
+ $pairs = array();
+ foreach ($data as $key => $value) {
+ if (is_array($value)) {
+ $pairs[] = urlencode($value[0])."=".urlencode($value[1]);
+ } else {
+ $pairs[] = urlencode($key)."=".urlencode($value);
+ }
+ }
+ return implode("&", $pairs);
+}
+
+/**
+ * "Appends" query arguments onto a URL. The URL may or may not
+ * already have arguments (following a question mark).
+ *
+ * @param string $url A URL, which may or may not already have
+ * arguments.
+ * @param array $args Either an array key/value pairs or an array of
+ * arrays, each of which holding two values: a key and a value,
+ * sequentially. If $args is an ordinary key/value array, the
+ * parameters will be added to the URL in sorted alphabetical order;
+ * if $args is an array of arrays, their order will be preserved.
+ * @return string $url The original URL with the new parameters added.
+ *
+ */
+function Auth_OpenID_appendArgs($url, $args)
+{
+
+ if (count($args) == 0) {
+ return $url;
+ }
+
+ // Non-empty array; if it is an array of arrays, use multisort;
+ // otherwise use sort.
+ if (array_key_exists(0, $args) &&
+ is_array($args[0])) {
+ // Do nothing here.
+ } else {
+ $keys = array_keys($args);
+ sort($keys);
+ $new_args = array();
+ foreach ($keys as $key) {
+ $new_args[] = array($key, $args[$key]);
+ }
+ $args = $new_args;
+ }
+
+ $sep = '?';
+ if (strpos($url, '?') !== false) {
+ $sep = '&';
+ }
+
+ return $url . $sep . Auth_OpenID_http_build_query($args);
+}
+
+/**
+ * Turn a string into an ASCII string.
+ *
+ * Replace non-ascii characters with a %-encoded, UTF-8 encoding. This
+ * function will fail if the input is a string and there are
+ * non-7-bit-safe characters. It is assumed that the caller will have
+ * already translated the input into a Unicode character sequence,
+ * according to the encoding of the HTTP POST or GET.
+ *
+ * Do not escape anything that is already 7-bit safe, so we do the
+ * minimal transform on the identity URL
+ */
+function Auth_OpenID_quoteMinimal($s)
+{
+ $res = array();
+ for ($i = 0; $i < strlen($s); $i++) {
+ $c = $s[$i];
+ if ($c >= "\x80") {
+ for ($j = 0; $j < count(utf8_encode($c)); $j++) {
+ array_push($res, sprintf("%02X", ord($c[$j])));
+ }
+ } else {
+ array_push($res, $c);
+ }
+ }
+
+ return implode('', $res);
+}
+
+/**
+ * Implements python's urlunparse, which is not available in PHP.
+ * Given the specified components of a URL, this function rebuilds and
+ * returns the URL.
+ *
+ * @param string $scheme The scheme (e.g. 'http'). Defaults to 'http'.
+ * @param string $host The host. Required.
+ * @param string $port The port.
+ * @param string $path The path.
+ * @param string $query The query.
+ * @param string $fragment The fragment.
+ * @return string $url The URL resulting from assembling the specified
+ * components.
+ */
+function Auth_OpenID_urlunparse($scheme, $host, $port = null, $path = '/',
+ $query = '', $fragment = '')
+{
+
+ if (!$scheme) {
+ $scheme = 'http';
+ }
+
+ if (!$host) {
+ return false;
+ }
+
+ if (!$path) {
+ $path = '/';
+ }
+
+ $result = $scheme . "://" . $host;
+
+ if ($port) {
+ $result .= ":" . $port;
+ }
+
+ $result .= $path;
+
+ if ($query) {
+ $result .= "?" . $query;
+ }
+
+ if ($fragment) {
+ $result .= "#" . $fragment;
+ }
+
+ return $result;
+}
+
+/**
+ * Given a URL, this "normalizes" it by adding a trailing slash and /
+ * or a leading http:// scheme where necessary. Returns null if the
+ * original URL is malformed and cannot be normalized.
+ *
+ * @param string $url The URL to be normalized.
+ * @return mixed $new_url The URL after normalization, or null if $url
+ * was malformed.
+ */
+function Auth_OpenID_normalizeUrl($url)
+{
+ if ($url === null) {
+ return null;
+ }
+
+ assert(is_string($url));
+
+ $old_url = $url;
+ $url = trim($url);
+
+ if (strpos($url, "://") === false) {
+ $url = "http://" . $url;
+ }
+
+ $parsed = @parse_url($url);
+
+ if ($parsed === false) {
+ return null;
+ }
+
+ $defaults = array(
+ 'scheme' => '',
+ 'host' => '',
+ 'path' => '',
+ 'query' => '',
+ 'fragment' => '',
+ 'port' => ''
+ );
+
+ $parsed = array_merge($defaults, $parsed);
+
+ if (($parsed['scheme'] == '') ||
+ ($parsed['host'] == '')) {
+ if ($parsed['path'] == '' &&
+ $parsed['query'] == '' &&
+ $parsed['fragment'] == '') {
+ return null;
+ }
+
+ $url = 'http://' + $url;
+ $parsed = parse_url($url);
+
+ $parsed = array_merge($defaults, $parsed);
+ }
+
+ $tail = array_map('Auth_OpenID_quoteMinimal', array($parsed['path'],
+ $parsed['query'],
+ $parsed['fragment']));
+ if ($tail[0] == '') {
+ $tail[0] = '/';
+ }
+
+ $url = Auth_OpenID_urlunparse($parsed['scheme'], $parsed['host'],
+ $parsed['port'], $tail[0], $tail[1],
+ $tail[2]);
+
+ assert(is_string($url));
+
+ return $url;
+}
+
+?> \ No newline at end of file