diff options
Diffstat (limited to 'vendor/OAuth/Common/Http/Uri')
-rwxr-xr-x | vendor/OAuth/Common/Http/Uri/Uri.php | 408 | ||||
-rwxr-xr-x | vendor/OAuth/Common/Http/Uri/UriFactory.php | 168 | ||||
-rwxr-xr-x | vendor/OAuth/Common/Http/Uri/UriFactoryInterface.php | 42 | ||||
-rwxr-xr-x | vendor/OAuth/Common/Http/Uri/UriInterface.php | 133 |
4 files changed, 751 insertions, 0 deletions
diff --git a/vendor/OAuth/Common/Http/Uri/Uri.php b/vendor/OAuth/Common/Http/Uri/Uri.php new file mode 100755 index 00000000..c5114937 --- /dev/null +++ b/vendor/OAuth/Common/Http/Uri/Uri.php @@ -0,0 +1,408 @@ +<?php + +namespace OAuth\Common\Http\Uri; + +use InvalidArgumentException; + +/** + * Standards-compliant URI class. + */ +class Uri implements UriInterface +{ + /** + * @var string + */ + private $scheme = 'http'; + + /** + * @var string + */ + private $userInfo = ''; + + /** + * @var string + */ + private $rawUserInfo = ''; + + /** + * @var string + */ + private $host; + + /** + * @var int + */ + private $port = 80; + + /** + * @var string + */ + private $path = '/'; + + /** + * @var string + */ + private $query = ''; + + /** + * @var string + */ + private $fragment = ''; + + /** + * @var bool + */ + private $explicitPortSpecified = false; + + /** + * @var bool + */ + private $explicitTrailingHostSlash = false; + + /** + * @param string $uri + */ + public function __construct($uri = null) + { + if (null !== $uri) { + $this->parseUri($uri); + } + } + + /** + * @param string $uri + * + * @throws \InvalidArgumentException + */ + protected function parseUri($uri) + { + if (false === ($uriParts = parse_url($uri))) { + // congratulations if you've managed to get parse_url to fail, + // it seems to always return some semblance of a parsed url no matter what + throw new InvalidArgumentException("Invalid URI: $uri"); + } + + if (!isset($uriParts['scheme'])) { + throw new InvalidArgumentException('Invalid URI: http|https scheme required'); + } + + $this->scheme = $uriParts['scheme']; + $this->host = $uriParts['host']; + + if (isset($uriParts['port'])) { + $this->port = $uriParts['port']; + $this->explicitPortSpecified = true; + } else { + $this->port = strcmp('https', $uriParts['scheme']) ? 80 : 443; + $this->explicitPortSpecified = false; + } + + if (isset($uriParts['path'])) { + $this->path = $uriParts['path']; + if ('/' === $uriParts['path']) { + $this->explicitTrailingHostSlash = true; + } + } else { + $this->path = '/'; + } + + $this->query = isset($uriParts['query']) ? $uriParts['query'] : ''; + $this->fragment = isset($uriParts['fragment']) ? $uriParts['fragment'] : ''; + + $userInfo = ''; + if (!empty($uriParts['user'])) { + $userInfo .= $uriParts['user']; + } + if ($userInfo && !empty($uriParts['pass'])) { + $userInfo .= ':' . $uriParts['pass']; + } + + $this->setUserInfo($userInfo); + } + + /** + * @param string $rawUserInfo + * + * @return string + */ + protected function protectUserInfo($rawUserInfo) + { + $colonPos = strpos($rawUserInfo, ':'); + + // rfc3986-3.2.1 | http://tools.ietf.org/html/rfc3986#section-3.2 + // "Applications should not render as clear text any data + // after the first colon (":") character found within a userinfo + // subcomponent unless the data after the colon is the empty string + // (indicating no password)" + if ($colonPos !== false && strlen($rawUserInfo)-1 > $colonPos) { + return substr($rawUserInfo, 0, $colonPos) . ':********'; + } else { + return $rawUserInfo; + } + } + + /** + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * @return string + */ + public function getUserInfo() + { + return $this->userInfo; + } + + /** + * @return string + */ + public function getRawUserInfo() + { + return $this->rawUserInfo; + } + + /** + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * @return int + */ + public function getPort() + { + return $this->port; + } + + /** + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * @return string + */ + public function getQuery() + { + return $this->query; + } + + /** + * @return string + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * Uses protected user info by default as per rfc3986-3.2.1 + * Uri::getRawAuthority() is available if plain-text password information is desirable. + * + * @return string + */ + public function getAuthority() + { + $authority = $this->userInfo ? $this->userInfo.'@' : ''; + $authority .= $this->host; + + if ($this->explicitPortSpecified) { + $authority .= ":{$this->port}"; + } + + return $authority; + } + + /** + * @return string + */ + public function getRawAuthority() + { + $authority = $this->rawUserInfo ? $this->rawUserInfo.'@' : ''; + $authority .= $this->host; + + if ($this->explicitPortSpecified) { + $authority .= ":{$this->port}"; + } + + return $authority; + } + + /** + * @return string + */ + public function getAbsoluteUri() + { + $uri = $this->scheme . '://' . $this->getRawAuthority(); + + if ('/' === $this->path) { + $uri .= $this->explicitTrailingHostSlash ? '/' : ''; + } else { + $uri .= $this->path; + } + + if (!empty($this->query)) { + $uri .= "?{$this->query}"; + } + + if (!empty($this->fragment)) { + $uri .= "#{$this->fragment}"; + } + + return $uri; + } + + /** + * @return string + */ + public function getRelativeUri() + { + $uri = ''; + + if ('/' === $this->path) { + $uri .= $this->explicitTrailingHostSlash ? '/' : ''; + } else { + $uri .= $this->path; + } + + return $uri; + } + + /** + * Uses protected user info by default as per rfc3986-3.2.1 + * Uri::getAbsoluteUri() is available if plain-text password information is desirable. + * + * @return string + */ + public function __toString() + { + $uri = $this->scheme . '://' . $this->getAuthority(); + + if ('/' === $this->path) { + $uri .= $this->explicitTrailingHostSlash ? '/' : ''; + } else { + $uri .= $this->path; + } + + if (!empty($this->query)) { + $uri .= "?{$this->query}"; + } + + if (!empty($this->fragment)) { + $uri .= "#{$this->fragment}"; + } + + return $uri; + } + + /** + * @param $path + */ + public function setPath($path) + { + if (empty($path)) { + $this->path = '/'; + $this->explicitTrailingHostSlash = false; + } else { + $this->path = $path; + if ('/' === $this->path) { + $this->explicitTrailingHostSlash = true; + } + } + } + + /** + * @param string $query + */ + public function setQuery($query) + { + $this->query = $query; + } + + /** + * @param string $var + * @param string $val + */ + public function addToQuery($var, $val) + { + if (strlen($this->query) > 0) { + $this->query .= '&'; + } + $this->query .= http_build_query(array($var => $val), '', '&'); + } + + /** + * @param string $fragment + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + } + + /** + * @param string $scheme + */ + public function setScheme($scheme) + { + $this->scheme = $scheme; + } + + + /** + * @param string $userInfo + */ + public function setUserInfo($userInfo) + { + $this->userInfo = $userInfo ? $this->protectUserInfo($userInfo) : ''; + $this->rawUserInfo = $userInfo; + } + + + /** + * @param int $port + */ + public function setPort($port) + { + $this->port = intval($port); + + if (('https' === $this->scheme && $this->port === 443) || ('http' === $this->scheme && $this->port === 80)) { + $this->explicitPortSpecified = false; + } else { + $this->explicitPortSpecified = true; + } + } + + /** + * @param string $host + */ + public function setHost($host) + { + $this->host = $host; + } + + /** + * @return bool + */ + public function hasExplicitTrailingHostSlash() + { + return $this->explicitTrailingHostSlash; + } + + /** + * @return bool + */ + public function hasExplicitPortSpecified() + { + return $this->explicitPortSpecified; + } +} diff --git a/vendor/OAuth/Common/Http/Uri/UriFactory.php b/vendor/OAuth/Common/Http/Uri/UriFactory.php new file mode 100755 index 00000000..127aa203 --- /dev/null +++ b/vendor/OAuth/Common/Http/Uri/UriFactory.php @@ -0,0 +1,168 @@ +<?php + +namespace OAuth\Common\Http\Uri; + +use RuntimeException; + +/** + * Factory class for uniform resource indicators + */ +class UriFactory implements UriFactoryInterface +{ + /** + * Factory method to build a URI from a super-global $_SERVER array. + * + * @param array $_server + * + * @return UriInterface + */ + public function createFromSuperGlobalArray(array $_server) + { + if ($uri = $this->attemptProxyStyleParse($_server)) { + return $uri; + } + + $scheme = $this->detectScheme($_server); + $host = $this->detectHost($_server); + $port = $this->detectPort($_server); + $path = $this->detectPath($_server); + $query = $this->detectQuery($_server); + + return $this->createFromParts($scheme, '', $host, $port, $path, $query); + } + + /** + * @param string $absoluteUri + * + * @return UriInterface + */ + public function createFromAbsolute($absoluteUri) + { + return new Uri($absoluteUri); + } + + /** + * Factory method to build a URI from parts + * + * @param string $scheme + * @param string $userInfo + * @param string $host + * @param string $port + * @param string $path + * @param string $query + * @param string $fragment + * + * @return UriInterface + */ + public function createFromParts($scheme, $userInfo, $host, $port, $path = '', $query = '', $fragment = '') + { + $uri = new Uri(); + $uri->setScheme($scheme); + $uri->setUserInfo($userInfo); + $uri->setHost($host); + $uri->setPort($port); + $uri->setPath($path); + $uri->setQuery($query); + $uri->setFragment($fragment); + + return $uri; + } + + /** + * @param array $_server + * + * @return UriInterface|null + */ + private function attemptProxyStyleParse($_server) + { + // If the raw HTTP request message arrives with a proxy-style absolute URI in the + // initial request line, the absolute URI is stored in $_SERVER['REQUEST_URI'] and + // we only need to parse that. + if (isset($_server['REQUEST_URI']) && parse_url($_server['REQUEST_URI'], PHP_URL_SCHEME)) { + return new Uri($_server['REQUEST_URI']); + } + + return null; + } + + /** + * @param array $_server + * + * @return string + * + * @throws RuntimeException + */ + private function detectPath($_server) + { + if (isset($_server['REQUEST_URI'])) { + $uri = $_server['REQUEST_URI']; + } elseif (isset($_server['REDIRECT_URL'])) { + $uri = $_server['REDIRECT_URL']; + } else { + throw new RuntimeException('Could not detect URI path from superglobal'); + } + + $queryStr = strpos($uri, '?'); + if ($queryStr !== false) { + $uri = substr($uri, 0, $queryStr); + } + + return $uri; + } + + /** + * @param array $_server + * + * @return string + */ + private function detectHost(array $_server) + { + $host = isset($_server['HTTP_HOST']) ? $_server['HTTP_HOST'] : ''; + + if (strstr($host, ':')) { + $host = parse_url($host, PHP_URL_HOST); + } + + return $host; + } + + /** + * @param array $_server + * + * @return string + */ + private function detectPort(array $_server) + { + return isset($_server['SERVER_PORT']) ? $_server['SERVER_PORT'] : 80; + } + + /** + * @param array $_server + * + * @return string + */ + private function detectQuery(array $_server) + { + return isset($_server['QUERY_STRING']) ? $_server['QUERY_STRING'] : ''; + } + + /** + * Determine URI scheme component from superglobal array + * + * When using ISAPI with IIS, the value will be "off" if the request was + * not made through the HTTPS protocol. As a result, we filter the + * value to a bool. + * + * @param array $_server A super-global $_SERVER array + * + * @return string Returns http or https depending on the URI scheme + */ + private function detectScheme(array $_server) + { + if (isset($_server['HTTPS']) && filter_var($_server['HTTPS'], FILTER_VALIDATE_BOOLEAN)) { + return 'https'; + } else { + return 'http'; + } + } +} diff --git a/vendor/OAuth/Common/Http/Uri/UriFactoryInterface.php b/vendor/OAuth/Common/Http/Uri/UriFactoryInterface.php new file mode 100755 index 00000000..2b157d84 --- /dev/null +++ b/vendor/OAuth/Common/Http/Uri/UriFactoryInterface.php @@ -0,0 +1,42 @@ +<?php + +namespace OAuth\Common\Http\Uri; + +/** + * Factory interface for uniform resource indicators + */ +interface UriFactoryInterface +{ + /** + * Factory method to build a URI from a super-global $_SERVER array. + * + * @param array $_server + * + * @return UriInterface + */ + public function createFromSuperGlobalArray(array $_server); + + /** + * Creates a URI from an absolute URI + * + * @param string $absoluteUri + * + * @return UriInterface + */ + public function createFromAbsolute($absoluteUri); + + /** + * Factory method to build a URI from parts + * + * @param string $scheme + * @param string $userInfo + * @param string $host + * @param string $port + * @param string $path + * @param string $query + * @param string $fragment + * + * @return UriInterface + */ + public function createFromParts($scheme, $userInfo, $host, $port, $path = '', $query = '', $fragment = ''); +} diff --git a/vendor/OAuth/Common/Http/Uri/UriInterface.php b/vendor/OAuth/Common/Http/Uri/UriInterface.php new file mode 100755 index 00000000..008d4647 --- /dev/null +++ b/vendor/OAuth/Common/Http/Uri/UriInterface.php @@ -0,0 +1,133 @@ +<?php + +namespace OAuth\Common\Http\Uri; + +interface UriInterface +{ + /** + * @return string + */ + public function getScheme(); + + /** + * @param string $scheme + */ + public function setScheme($scheme); + + /** + * @return string + */ + public function getHost(); + + /** + * @param string $host + */ + public function setHost($host); + + /** + * @return int + */ + public function getPort(); + + /** + * @param int $port + */ + public function setPort($port); + + /** + * @return string + */ + public function getPath(); + + /** + * @param string $path + */ + public function setPath($path); + + /** + * @return string + */ + public function getQuery(); + + /** + * @param string $query + */ + public function setQuery($query); + + /** + * Adds a param to the query string. + * + * @param string $var + * @param string $val + */ + public function addToQuery($var, $val); + + /** + * @return string + */ + public function getFragment(); + + /** + * Should return URI user info, masking protected user info data according to rfc3986-3.2.1 + * + * @return string + */ + public function getUserInfo(); + + /** + * @param string $userInfo + */ + public function setUserInfo($userInfo); + + /** + * Should return the URI Authority, masking protected user info data according to rfc3986-3.2.1 + * + * @return string + */ + public function getAuthority(); + + /** + * Should return the URI string, masking protected user info data according to rfc3986-3.2.1 + * + * @return string the URI string with user protected info masked + */ + public function __toString(); + + /** + * Should return the URI Authority without masking protected user info data + * + * @return string + */ + public function getRawAuthority(); + + /** + * Should return the URI user info without masking protected user info data + * + * @return string + */ + public function getRawUserInfo(); + + /** + * Build the full URI based on all the properties + * + * @return string The full URI without masking user info + */ + public function getAbsoluteUri(); + + /** + * Build the relative URI based on all the properties + * + * @return string The relative URI + */ + public function getRelativeUri(); + + /** + * @return bool + */ + public function hasExplicitTrailingHostSlash(); + + /** + * @return bool + */ + public function hasExplicitPortSpecified(); +} |