diff options
Diffstat (limited to 'extlib')
57 files changed, 2548 insertions, 2153 deletions
diff --git a/extlib/Auth/OpenID.php b/extlib/Auth/OpenID.php index db6164256..c9d977962 100644 --- a/extlib/Auth/OpenID.php +++ b/extlib/Auth/OpenID.php @@ -20,7 +20,7 @@ /** * The library version string */ -define('Auth_OpenID_VERSION', '2.1.3'); +define('Auth_OpenID_VERSION', '2.2.2'); /** * Require the fetcher code. @@ -102,9 +102,7 @@ define('Auth_OpenID_digits', define('Auth_OpenID_punct', "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); -if (Auth_OpenID_getMathLib() === null) { - Auth_OpenID_setNoMathSupport(); -} +Auth_OpenID_include_init(); /** * The OpenID utility function class. @@ -120,7 +118,7 @@ class Auth_OpenID { * * @access private */ - function isFailure($thing) + static function isFailure($thing) { return is_a($thing, 'Auth_OpenID_FailureResponse'); } @@ -139,9 +137,12 @@ class Auth_OpenID { * Returns an empty array if neither GET nor POST was used, or if * POST was used but php://input cannot be opened. * + * See background: + * http://lists.openidenabled.com/pipermail/dev/2007-March/000395.html + * * @access private */ - function getQuery($query_str=null) + static function getQuery($query_str=null) { $data = array(); @@ -177,7 +178,7 @@ class Auth_OpenID { return $data; } - function params_from_string($str) + static function params_from_string($str) { $chunks = explode("&", $str); @@ -190,7 +191,7 @@ class Auth_OpenID { } list($k, $v) = $parts; - $data[$k] = urldecode($v); + $data[urldecode($k)] = urldecode($v); } return $data; @@ -203,7 +204,7 @@ class Auth_OpenID { * * @access private */ - function ensureDir($dir_name) + static function ensureDir($dir_name) { if (is_dir($dir_name) || @mkdir($dir_name)) { return true; @@ -225,7 +226,7 @@ class Auth_OpenID { * * @access private */ - function addPrefix($values, $prefix) + static function addPrefix($values, $prefix) { $new_values = array(); foreach ($values as $s) { @@ -241,7 +242,7 @@ class Auth_OpenID { * * @access private */ - function arrayGet($arr, $key, $fallback = null) + static function arrayGet($arr, $key, $fallback = null) { if (is_array($arr)) { if (array_key_exists($key, $arr)) { @@ -261,7 +262,7 @@ class Auth_OpenID { /** * Replacement for PHP's broken parse_str. */ - function parse_str($query) + static function parse_str($query) { if ($query === null) { return null; @@ -278,7 +279,7 @@ class Auth_OpenID { } list($key, $value) = $pair; - $new_parts[$key] = urldecode($value); + $new_parts[urldecode($key)] = urldecode($value); } return $new_parts; @@ -295,7 +296,7 @@ class Auth_OpenID { * pairs from $data into a URL query string * (e.g. "username=bob&id=56"). */ - function httpBuildQuery($data) + static function httpBuildQuery($data) { $pairs = array(); foreach ($data as $key => $value) { @@ -323,7 +324,7 @@ class Auth_OpenID { * @return string $url The original URL with the new parameters added. * */ - function appendArgs($url, $args) + static function appendArgs($url, $args) { if (count($args) == 0) { return $url; @@ -367,7 +368,7 @@ class Auth_OpenID { * @return string $url The URL resulting from assembling the * specified components. */ - function urlunparse($scheme, $host, $port = null, $path = '/', + static function urlunparse($scheme, $host, $port = null, $path = '/', $query = '', $fragment = '') { @@ -412,7 +413,7 @@ class Auth_OpenID { * @return mixed $new_url The URL after normalization, or null if * $url was malformed. */ - function normalizeUrl($url) + static function normalizeUrl($url) { @$parsed = parse_url($url); @@ -443,7 +444,7 @@ class Auth_OpenID { * * @access private */ - function intval($value) + static function intval($value) { $re = "/^\\d+$/"; @@ -461,7 +462,7 @@ class Auth_OpenID { * @param string $str The string of bytes to count. * @return int The number of bytes in $str. */ - function bytes($str) + static function bytes($str) { return strlen(bin2hex($str)) / 2; } @@ -470,7 +471,7 @@ class Auth_OpenID { * Get the bytes in a string independently of multibyte support * conditions. */ - function toBytes($str) + static function toBytes($str) { $hex = bin2hex($str); @@ -486,7 +487,7 @@ class Auth_OpenID { return $b; } - function urldefrag($url) + static function urldefrag($url) { $parts = explode("#", $url, 2); @@ -497,7 +498,7 @@ class Auth_OpenID { } } - function filter($callback, &$sequence) + static function filter($callback, &$sequence) { $result = array(); @@ -510,7 +511,7 @@ class Auth_OpenID { return $result; } - function update(&$dest, &$src) + static function update(&$dest, &$src) { foreach ($src as $k => $v) { $dest[$k] = $v; @@ -524,14 +525,14 @@ class Auth_OpenID { * * @param string $format_string The sprintf format for the message */ - function log($format_string) + static function log($format_string) { $args = func_get_args(); $message = call_user_func_array('sprintf', $args); error_log($message); } - function autoSubmitHTML($form, $title="OpenId transaction in progress") + static function autoSubmitHTML($form, $title="OpenId transaction in progress") { return("<html>". "<head><title>". @@ -549,4 +550,14 @@ class Auth_OpenID { "</html>"); } } -?> + +/* + * Function to run when this file is included. + * Abstracted to a function to make life easier + * for some PHP optimizers. + */ +function Auth_OpenID_include_init() { + if (Auth_OpenID_getMathLib() === null) { + Auth_OpenID_setNoMathSupport(); + } +} diff --git a/extlib/Auth/OpenID/AX.php b/extlib/Auth/OpenID/AX.php index 4a617ae30..7370715e3 100644 --- a/extlib/Auth/OpenID/AX.php +++ b/extlib/Auth/OpenID/AX.php @@ -38,7 +38,7 @@ class Auth_OpenID_AX { * @return bool true if $thing is an Auth_OpenID_AX_Error; false * if not. */ - function isError($thing) + static function isError($thing) { return is_a($thing, 'Auth_OpenID_AX_Error'); } @@ -191,7 +191,7 @@ class Auth_OpenID_AX_AttrInfo { * Construct an attribute information object. For parameter * details, see the constructor. */ - function make($type_uri, $count=1, $required=false, + static function make($type_uri, $count=1, $required=false, $alias=null) { if ($alias !== null) { @@ -235,7 +235,7 @@ class Auth_OpenID_AX_AttrInfo { * return null If an alias is present in the list of aliases but * is not present in the namespace map. */ -function Auth_OpenID_AX_toTypeURIs(&$namespace_map, $alias_list_s) +function Auth_OpenID_AX_toTypeURIs($namespace_map, $alias_list_s) { $uris = array(); @@ -386,7 +386,7 @@ class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { * Auth_OpenID_AX_FetchRequest extracted from the request message if * successful */ - function &fromOpenIDRequest($request) + static function fromOpenIDRequest($request) { $m = $request->message; $obj = new Auth_OpenID_AX_FetchRequest(); @@ -484,7 +484,7 @@ class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { Auth_OpenID::arrayGet($ax_args, 'required')); foreach ($required as $type_uri) { - $attrib =& $this->requested_attributes[$type_uri]; + $attrib = $this->requested_attributes[$type_uri]; $attrib->required = true; } @@ -587,7 +587,7 @@ class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { * * @access private */ - function _getExtensionKVArgs(&$aliases) + function _getExtensionKVArgs($aliases) { if ($aliases === null) { $aliases = new Auth_OpenID_NamespaceMap(); @@ -652,7 +652,7 @@ class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { foreach ($aliases->iteritems() as $pair) { list($type_uri, $alias) = $pair; - if (array_key_exists('count.' . $alias, $ax_args)) { + if (array_key_exists('count.' . $alias, $ax_args) && ($ax_args['count.' . $alias] !== Auth_OpenID_AX_UNLIMITED_VALUES)) { $count_key = 'count.' . $alias; $count_s = $ax_args[$count_key]; @@ -888,7 +888,7 @@ class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { $ax_args['update_url'] = $update_url; } - Auth_OpenID::update(&$ax_args, $kv_args); + Auth_OpenID::update($ax_args, $kv_args); return $ax_args; } @@ -922,7 +922,7 @@ class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { * @return $response A FetchResponse containing the data from the * OpenID message */ - function fromSuccessResponse($success_response, $signed=true) + static function fromSuccessResponse($success_response, $signed=true) { $obj = new Auth_OpenID_AX_FetchResponse(); if ($signed) { @@ -960,7 +960,7 @@ class Auth_OpenID_AX_StoreRequest extends Auth_OpenID_AX_KeyValueMessage { { $ax_args = $this->_newArgs(); $kv_args = $this->_getExtensionKVArgs($aliases); - Auth_OpenID::update(&$ax_args, $kv_args); + Auth_OpenID::update($ax_args, $kv_args); return $ax_args; } } @@ -980,7 +980,7 @@ class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { * Returns Auth_OpenID_AX_Error on error or an * Auth_OpenID_AX_StoreResponse object on success. */ - function &make($succeeded=true, $error_message=null) + function make($succeeded=true, $error_message=null) { if (($succeeded) && ($error_message !== null)) { return new Auth_OpenID_AX_Error('An error message may only be '. @@ -1020,4 +1020,3 @@ class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Association.php b/extlib/Auth/OpenID/Association.php index 37ce0cbf4..7fdf399a3 100644 --- a/extlib/Auth/OpenID/Association.php +++ b/extlib/Auth/OpenID/Association.php @@ -94,7 +94,7 @@ class Auth_OpenID_Association { * @return association An {@link Auth_OpenID_Association} * instance. */ - function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) + static function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) { $issued = time(); $lifetime = $expires_in; @@ -132,7 +132,7 @@ class Auth_OpenID_Association { $handle, $secret, $issued, $lifetime, $assoc_type) { if (!in_array($assoc_type, - Auth_OpenID_getSupportedAssociationTypes())) { + Auth_OpenID_getSupportedAssociationTypes(), true)) { $fmt = 'Unsupported association type (%s)'; trigger_error(sprintf($fmt, $assoc_type), E_USER_ERROR); } @@ -206,7 +206,7 @@ class Auth_OpenID_Association { * @param string $assoc_s Association as serialized by serialize() * @return Auth_OpenID_Association $result instance of this class */ - function deserialize($class_name, $assoc_s) + static function deserialize($class_name, $assoc_s) { $pairs = Auth_OpenID_KVForm::toArray($assoc_s, $strict = true); $keys = array(); @@ -327,7 +327,7 @@ class Auth_OpenID_Association { * * @access private */ - function _makePairs(&$message) + function _makePairs($message) { $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); if (!$signed || Auth_OpenID::isFailure($signed)) { @@ -352,7 +352,7 @@ class Auth_OpenID_Association { * * @access private */ - function getMessageSignature(&$message) + function getMessageSignature($message) { $pairs = $this->_makePairs($message); return base64_encode($this->sign($pairs)); @@ -364,7 +364,7 @@ class Auth_OpenID_Association { * * @access private */ - function checkMessageSignature(&$message) + function checkMessageSignature($message) { $sig = $message->getArg(Auth_OpenID_OPENID_NS, 'sig'); @@ -374,7 +374,42 @@ class Auth_OpenID_Association { } $calculated_sig = $this->getMessageSignature($message); - return $calculated_sig == $sig; + + return $this->constantTimeCompare($calculated_sig, $sig); + } + + /** + * String comparison function which will complete in a constant time + * for strings of any given matching length, to help prevent an attacker + * from distinguishing how much of a signature token they have guessed + * correctly. + * + * For this usage, it's assumed that the length of the string is known, + * so we may safely short-circuit on mismatched lengths which will be known + * to be invalid by the attacker. + * + * http://lists.openid.net/pipermail/openid-security/2010-July/001156.html + * http://rdist.root.org/2010/01/07/timing-independent-array-comparison/ + */ + private function constantTimeCompare($a, $b) + { + $len = strlen($a); + if (strlen($b) !== $len) { + // Short-circuit on length mismatch; attackers will already know + // the correct target length so this is safe. + return false; + } + if ($len == 0) { + // 0-length valid input shouldn't really happen. :) + return true; + } + $result = 0; + for ($i = 0; $i < strlen($a); $i++) { + // We use scary bitwise operations to avoid logical short-circuits + // in lower-level code. + $result |= ord($a{$i}) ^ ord($b{$i}); + } + return ($result == 0); } } @@ -469,18 +504,16 @@ function Auth_OpenID_getOnlyEncryptedOrder() return $result; } -function &Auth_OpenID_getDefaultNegotiator() +function Auth_OpenID_getDefaultNegotiator() { - $x = new Auth_OpenID_SessionNegotiator( + return new Auth_OpenID_SessionNegotiator( Auth_OpenID_getDefaultAssociationOrder()); - return $x; } -function &Auth_OpenID_getEncryptedNegotiator() +function Auth_OpenID_getEncryptedNegotiator() { - $x = new Auth_OpenID_SessionNegotiator( + return new Auth_OpenID_SessionNegotiator( Auth_OpenID_getOnlyEncryptedOrder()); - return $x; } /** @@ -610,4 +643,3 @@ class Auth_OpenID_SessionNegotiator { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/BigMath.php b/extlib/Auth/OpenID/BigMath.php index 45104947d..7fca2dc43 100644 --- a/extlib/Auth/OpenID/BigMath.php +++ b/extlib/Auth/OpenID/BigMath.php @@ -351,8 +351,7 @@ function Auth_OpenID_math_extensions() 'class' => 'Auth_OpenID_GmpMathWrapper'); } - $result[] = array( - 'modules' => array('bcmath', 'php_bcmath'), + $result[] = array('modules' => array('bcmath', 'php_bcmath'), 'extension' => 'bcmath', 'class' => 'Auth_OpenID_BcMathWrapper'); @@ -366,27 +365,9 @@ function Auth_OpenID_detectMathLibrary($exts) { $loaded = false; + $hasDl = function_exists('dl'); foreach ($exts as $extension) { - // See if the extension specified is already loaded. - if ($extension['extension'] && - extension_loaded($extension['extension'])) { - $loaded = true; - } - - // Try to load dynamic modules. - if (!$loaded) { - foreach ($extension['modules'] as $module) { - if (@dl($module . "." . PHP_SHLIB_SUFFIX)) { - $loaded = true; - break; - } - } - } - - // If the load succeeded, supply an instance of - // Auth_OpenID_MathWrapper which wraps the specified - // module's functionality. - if ($loaded) { + if (extension_loaded($extension['extension'])) { return $extension; } } @@ -405,7 +386,7 @@ function Auth_OpenID_detectMathLibrary($exts) * instance of a wrapper for that extension module. If no extension * module is found, an instance of {@link Auth_OpenID_MathWrapper} is * returned, which wraps the native PHP integer implementation. The - * proper calling convention for this method is $lib =& + * proper calling convention for this method is $lib = * Auth_OpenID_getMathLib(). * * This function checks for the existence of specific long number @@ -416,7 +397,7 @@ function Auth_OpenID_detectMathLibrary($exts) * * @package OpenID */ -function &Auth_OpenID_getMathLib() +function Auth_OpenID_getMathLib() { // The instance of Auth_OpenID_MathWrapper that we choose to // supply will be stored here, so that subseqent calls to this @@ -468,4 +449,4 @@ function Auth_OpenID_noMathSupport() return defined('Auth_OpenID_NO_MATH_SUPPORT'); } -?> + diff --git a/extlib/Auth/OpenID/Consumer.php b/extlib/Auth/OpenID/Consumer.php index 500890b65..021c03898 100644 --- a/extlib/Auth/OpenID/Consumer.php +++ b/extlib/Auth/OpenID/Consumer.php @@ -258,19 +258,19 @@ class Auth_OpenID_Consumer { * when creating the internal consumer object. This is used for * testing. */ - function Auth_OpenID_Consumer(&$store, $session = null, + function Auth_OpenID_Consumer($store, $session = null, $consumer_cls = null) { if ($session === null) { $session = new Auth_Yadis_PHPSession(); } - $this->session =& $session; + $this->session = $session; if ($consumer_cls !== null) { - $this->consumer =& new $consumer_cls($store); + $this->consumer = new $consumer_cls($store); } else { - $this->consumer =& new Auth_OpenID_GenericConsumer($store); + $this->consumer = new Auth_OpenID_GenericConsumer($store); } $this->_token_key = $this->session_key_prefix . $this->_token_suffix; @@ -281,7 +281,7 @@ class Auth_OpenID_Consumer { * * @access private */ - function getDiscoveryObject(&$session, $openid_url, + function getDiscoveryObject($session, $openid_url, $session_key_prefix) { return new Auth_Yadis_Discovery($session, $openid_url, @@ -339,7 +339,7 @@ class Auth_OpenID_Consumer { $this->consumer->fetcher); // Reset the 'stale' attribute of the manager. - $m =& $disco->getManager(); + $m = $disco->getManager(); if ($m) { $m->stale = false; $disco->session->set($disco->session_key, @@ -370,7 +370,7 @@ class Auth_OpenID_Consumer { * @return Auth_OpenID_AuthRequest $auth_request An OpenID * authentication request object. */ - function &beginWithoutDiscovery($endpoint, $anonymous=false) + function beginWithoutDiscovery($endpoint, $anonymous=false) { $loader = new Auth_OpenID_ServiceEndpointLoader(); $auth_req = $this->consumer->begin($endpoint); @@ -467,7 +467,7 @@ class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { function getRequest() { - $math =& Auth_OpenID_getMathLib(); + $math = Auth_OpenID_getMathLib(); $cpub = $math->longToBase64($this->dh->public); @@ -496,7 +496,7 @@ class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { return null; } - $math =& Auth_OpenID_getMathLib(); + $math = Auth_OpenID_getMathLib(); $spub = $math->base64ToLong($response->getArg(Auth_OpenID_OPENID_NS, 'dh_server_public')); @@ -611,11 +611,11 @@ class Auth_OpenID_GenericConsumer { * in the module description. The default value is False, which * disables immediate mode. */ - function Auth_OpenID_GenericConsumer(&$store) + function Auth_OpenID_GenericConsumer($store) { - $this->store =& $store; - $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); - $this->_use_assocs = ($this->store ? true : false); + $this->store = $store; + $this->negotiator = Auth_OpenID_getDefaultNegotiator(); + $this->_use_assocs = (is_null($this->store) ? false : true); $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); @@ -665,14 +665,14 @@ class Auth_OpenID_GenericConsumer { $method = Auth_OpenID::arrayGet($mode_methods, $mode, '_completeInvalid'); - return call_user_func_array(array(&$this, $method), - array($message, $endpoint, $return_to)); + return call_user_func_array(array($this, $method), + array($message, &$endpoint, $return_to)); } /** * @access private */ - function _completeInvalid($message, &$endpoint, $unused) + function _completeInvalid($message, $endpoint, $unused) { $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', '<No mode set>'); @@ -684,7 +684,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_cancel($message, &$endpoint, $unused) + function _complete_cancel($message, $endpoint, $unused) { return new Auth_OpenID_CancelResponse($endpoint); } @@ -692,7 +692,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_error($message, &$endpoint, $unused) + function _complete_error($message, $endpoint, $unused) { $error = $message->getArg(Auth_OpenID_OPENID_NS, 'error'); $contact = $message->getArg(Auth_OpenID_OPENID_NS, 'contact'); @@ -705,7 +705,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_setup_needed($message, &$endpoint, $unused) + function _complete_setup_needed($message, $endpoint, $unused) { if (!$message->isOpenID2()) { return $this->_completeInvalid($message, $endpoint); @@ -719,7 +719,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_id_res($message, &$endpoint, $return_to) + function _complete_id_res($message, $endpoint, $return_to) { $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, 'user_setup_url'); @@ -1181,7 +1181,7 @@ class Auth_OpenID_GenericConsumer { // oidutil.log('Performing discovery on %s' % (claimed_id,)) list($unused, $services) = call_user_func($this->discoverMethod, $claimed_id, - $this->fetcher); + &$this->fetcher); if (!$services) { return new Auth_OpenID_FailureResponse(null, @@ -1197,7 +1197,7 @@ class Auth_OpenID_GenericConsumer { * @access private */ function _verifyDiscoveryServices($claimed_id, - &$services, &$to_match_endpoints) + $services, $to_match_endpoints) { // Search the services resulting from discovery to find one // that matches the information from the assertion @@ -1216,8 +1216,8 @@ class Auth_OpenID_GenericConsumer { } return new Auth_OpenID_FailureResponse(null, - sprintf('No matching endpoint found after discovering %s', - $claimed_id)); + sprintf('No matching endpoint found after discovering %s: %s', + $claimed_id, $result->message)); } /** @@ -1397,7 +1397,7 @@ class Auth_OpenID_GenericConsumer { * * @access private */ - function _httpResponseToMessage($response, $server_url) + static function _httpResponseToMessage($response, $server_url) { // Should this function be named Message.fromHTTPResponse instead? $response_message = Auth_OpenID_Message::fromKVForm($response->body); @@ -1461,7 +1461,7 @@ class Auth_OpenID_GenericConsumer { * * @access private */ - function _extractSupportedAssociationType(&$server_error, &$endpoint, + function _extractSupportedAssociationType($server_error, $endpoint, $assoc_type) { // Any error message whose code is not 'unsupported-type' @@ -1566,7 +1566,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _extractAssociation(&$assoc_response, &$assoc_session) + function _extractAssociation($assoc_response, $assoc_session) { // Extract the common fields from the response, raising an // exception if they are not found @@ -1748,10 +1748,10 @@ class Auth_OpenID_AuthRequest { * class. Instances of this class are created by the library when * needed. */ - function Auth_OpenID_AuthRequest(&$endpoint, $assoc) + function Auth_OpenID_AuthRequest($endpoint, $assoc) { $this->assoc = $assoc; - $this->endpoint =& $endpoint; + $this->endpoint = $endpoint; $this->return_to_args = array(); $this->message = new Auth_OpenID_Message( $endpoint->preferredNamespace()); @@ -1764,7 +1764,7 @@ class Auth_OpenID_AuthRequest { * $extension_request: An object that implements the extension * request interface for adding arguments to an OpenID message. */ - function addExtension(&$extension_request) + function addExtension($extension_request) { $extension_request->toMessage($this->message); } @@ -2089,7 +2089,7 @@ class Auth_OpenID_SuccessResponse extends Auth_OpenID_ConsumerResponse { foreach ($msg_args as $key => $value) { if (!$this->isSigned($ns_uri, $key)) { - return null; + unset($msg_args[$key]); } } @@ -2167,7 +2167,7 @@ class Auth_OpenID_ServerErrorContainer { /** * @access private */ - function fromMessage($message) + static function fromMessage($message) { $error_text = $message->getArg( Auth_OpenID_OPENID_NS, 'error', '<no error message supplied>'); @@ -2227,4 +2227,4 @@ class Auth_OpenID_SetupNeededResponse extends Auth_OpenID_ConsumerResponse { } } -?> + diff --git a/extlib/Auth/OpenID/CryptUtil.php b/extlib/Auth/OpenID/CryptUtil.php index aacc3cd39..a92626777 100644 --- a/extlib/Auth/OpenID/CryptUtil.php +++ b/extlib/Auth/OpenID/CryptUtil.php @@ -37,7 +37,7 @@ class Auth_OpenID_CryptUtil { * @param int $num_bytes The length of the return value * @return string $bytes random bytes */ - function getBytes($num_bytes) + static function getBytes($num_bytes) { static $f = null; $bytes = ''; @@ -77,7 +77,7 @@ class Auth_OpenID_CryptUtil { * @return string $result A string of randomly-chosen characters * from $chrs */ - function randomString($length, $population = null) + static function randomString($length, $population = null) { if ($population === null) { return Auth_OpenID_CryptUtil::getBytes($length); @@ -106,4 +106,3 @@ class Auth_OpenID_CryptUtil { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/DatabaseConnection.php b/extlib/Auth/OpenID/DatabaseConnection.php index 9db6e0eb3..0c7d08f91 100644 --- a/extlib/Auth/OpenID/DatabaseConnection.php +++ b/extlib/Auth/OpenID/DatabaseConnection.php @@ -128,4 +128,3 @@ class Auth_OpenID_DatabaseConnection { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/DiffieHellman.php b/extlib/Auth/OpenID/DiffieHellman.php index f4ded7eba..3e25b7dbb 100644 --- a/extlib/Auth/OpenID/DiffieHellman.php +++ b/extlib/Auth/OpenID/DiffieHellman.php @@ -51,9 +51,9 @@ class Auth_OpenID_DiffieHellman { $private = null, $lib = null) { if ($lib === null) { - $this->lib =& Auth_OpenID_getMathLib(); + $this->lib = Auth_OpenID_getMathLib(); } else { - $this->lib =& $lib; + $this->lib = $lib; } if ($mod === null) { @@ -110,4 +110,4 @@ class Auth_OpenID_DiffieHellman { } } -?> + diff --git a/extlib/Auth/OpenID/Discover.php b/extlib/Auth/OpenID/Discover.php index 62aeb1d2b..7b0c640c5 100644 --- a/extlib/Auth/OpenID/Discover.php +++ b/extlib/Auth/OpenID/Discover.php @@ -28,8 +28,34 @@ function Auth_OpenID_getOpenIDTypeURIs() Auth_OpenID_TYPE_2_0, Auth_OpenID_TYPE_1_2, Auth_OpenID_TYPE_1_1, - Auth_OpenID_TYPE_1_0, - Auth_OpenID_RP_RETURN_TO_URL_TYPE); + Auth_OpenID_TYPE_1_0); +} + +function Auth_OpenID_getOpenIDConsumerTypeURIs() +{ + return array(Auth_OpenID_RP_RETURN_TO_URL_TYPE); +} + + +/* + * Provides a user-readable interpretation of a type uri. + * Useful for error messages. + */ +function Auth_OpenID_getOpenIDTypeName($type_uri) { + switch ($type_uri) { + case Auth_OpenID_TYPE_2_0_IDP: + return 'OpenID 2.0 IDP'; + case Auth_OpenID_TYPE_2_0: + return 'OpenID 2.0'; + case Auth_OpenID_TYPE_1_2: + return 'OpenID 1.2'; + case Auth_OpenID_TYPE_1_1: + return 'OpenID 1.1'; + case Auth_OpenID_TYPE_1_0: + return 'OpenID 1.0'; + case Auth_OpenID_RP_RETURN_TO_URL_TYPE: + return 'OpenID relying party'; + } } /** @@ -124,7 +150,7 @@ class Auth_OpenID_ServiceEndpoint { return in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris); } - function fromOPEndpointURL($op_endpoint_url) + static function fromOPEndpointURL($op_endpoint_url) { // Construct an OP-Identifier OpenIDServiceEndpoint object for // a given OP Endpoint URL @@ -172,17 +198,36 @@ class Auth_OpenID_ServiceEndpoint { } /* - * Parse the given document as XRDS looking for OpenID services. + * Parse the given document as XRDS looking for OpenID consumer services. * * @return array of Auth_OpenID_ServiceEndpoint or null if the * document cannot be parsed. */ - function fromXRDS($uri, $xrds_text) + function consumerFromXRDS($uri, $xrds_text) { $xrds =& Auth_Yadis_XRDS::parseXRDS($xrds_text); if ($xrds) { $yadis_services = + $xrds->services(array('filter_MatchesAnyOpenIDConsumerType')); + return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services); + } + + return null; + } + + /* + * Parse the given document as XRDS looking for OpenID services. + * + * @return array of Auth_OpenID_ServiceEndpoint or null if the + * document cannot be parsed. + */ + static function fromXRDS($uri, $xrds_text) + { + $xrds = Auth_Yadis_XRDS::parseXRDS($xrds_text); + + if ($xrds) { + $yadis_services = $xrds->services(array('filter_MatchesAnyOpenIDType')); return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services); } @@ -197,7 +242,7 @@ class Auth_OpenID_ServiceEndpoint { * @return array of Auth_OpenID_ServiceEndpoint or null if * endpoints cannot be created. */ - function fromDiscoveryResult($discoveryResult) + static function fromDiscoveryResult($discoveryResult) { if ($discoveryResult->isXRDS()) { return Auth_OpenID_ServiceEndpoint::fromXRDS( @@ -210,7 +255,7 @@ class Auth_OpenID_ServiceEndpoint { } } - function fromHTML($uri, $html) + static function fromHTML($uri, $html) { $discovery_types = array( array(Auth_OpenID_TYPE_2_0, @@ -273,7 +318,7 @@ function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) $service->parser->registerNamespace('xrd', Auth_Yadis_XMLNS_XRD_2_0); - $parser =& $service->parser; + $parser = $service->parser; $permitted_tags = array(); @@ -305,7 +350,7 @@ function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) return $local_id; } -function filter_MatchesAnyOpenIDType(&$service) +function filter_MatchesAnyOpenIDType($service) { $uris = $service->getTypes(); @@ -318,6 +363,19 @@ function filter_MatchesAnyOpenIDType(&$service) return false; } +function filter_MatchesAnyOpenIDConsumerType(&$service) +{ + $uris = $service->getTypes(); + + foreach ($uris as $uri) { + if (in_array($uri, Auth_OpenID_getOpenIDConsumerTypeURIs())) { + return true; + } + } + + return false; +} + function Auth_OpenID_bestMatchingService($service, $preferred_types) { // Return the index of the first matching type, or something @@ -415,7 +473,7 @@ function Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services) return $s; } -function Auth_OpenID_discoverWithYadis($uri, &$fetcher, +function Auth_OpenID_discoverWithYadis($uri, $fetcher, $endpoint_filter='Auth_OpenID_getOPOrUserServices', $discover_function=null) { @@ -433,12 +491,12 @@ function Auth_OpenID_discoverWithYadis($uri, &$fetcher, $openid_services = array(); $response = call_user_func_array($discover_function, - array($uri, &$fetcher)); + array($uri, $fetcher)); $yadis_url = $response->normalized_uri; $yadis_services = array(); - if ($response->isFailure()) { + if ($response->isFailure() && !$response->isXRDS()) { return array($uri, array()); } @@ -460,18 +518,18 @@ function Auth_OpenID_discoverWithYadis($uri, &$fetcher, } $openid_services = call_user_func_array($endpoint_filter, - array(&$openid_services)); + array($openid_services)); return array($yadis_url, $openid_services); } -function Auth_OpenID_discoverURI($uri, &$fetcher) +function Auth_OpenID_discoverURI($uri, $fetcher) { $uri = Auth_OpenID::normalizeUrl($uri); return Auth_OpenID_discoverWithYadis($uri, $fetcher); } -function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) +function Auth_OpenID_discoverWithoutYadis($uri, $fetcher) { $http_resp = @$fetcher->get($uri); @@ -490,7 +548,7 @@ function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) return array($identity_url, $openid_services); } -function Auth_OpenID_discoverXRI($iname, &$fetcher) +function Auth_OpenID_discoverXRI($iname, $fetcher) { $resolver = new Auth_Yadis_ProxyResolver($fetcher); list($canonicalID, $yadis_services) = @@ -513,7 +571,7 @@ function Auth_OpenID_discoverXRI($iname, &$fetcher) return array($iname, $openid_services); } -function Auth_OpenID_discover($uri, &$fetcher) +function Auth_OpenID_discover($uri, $fetcher) { // If the fetcher (i.e., PHP) doesn't support SSL, we can't do // discovery on an HTTPS URL. @@ -545,4 +603,4 @@ function Auth_OpenID_discover($uri, &$fetcher) return $result; } -?> + diff --git a/extlib/Auth/OpenID/DumbStore.php b/extlib/Auth/OpenID/DumbStore.php index 22fd2d366..e8f29ace5 100644 --- a/extlib/Auth/OpenID/DumbStore.php +++ b/extlib/Auth/OpenID/DumbStore.php @@ -97,4 +97,3 @@ class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Extension.php b/extlib/Auth/OpenID/Extension.php index f362a4b38..c4e38c038 100644 --- a/extlib/Auth/OpenID/Extension.php +++ b/extlib/Auth/OpenID/Extension.php @@ -39,7 +39,7 @@ class Auth_OpenID_Extension { * * Returns the message with the extension arguments added. */ - function toMessage(&$message) + function toMessage($message) { $implicit = $message->isOpenID1(); $added = $message->namespaces->addAlias($this->ns_uri, @@ -59,4 +59,3 @@ class Auth_OpenID_Extension { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/FileStore.php b/extlib/Auth/OpenID/FileStore.php index 29d8d20e7..074421a0b 100644 --- a/extlib/Auth/OpenID/FileStore.php +++ b/extlib/Auth/OpenID/FileStore.php @@ -367,7 +367,7 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { } if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { - return False; + return false; } if ($server_url) { @@ -519,7 +519,7 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { /** * @access private */ - function _mkdtemp($dir) + static function _mkdtemp($dir) { foreach (range(0, 4) as $i) { $name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) . @@ -615,4 +615,4 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { } } -?> + diff --git a/extlib/Auth/OpenID/HMAC.php b/extlib/Auth/OpenID/HMAC.php index ec42db8df..e9779bd4e 100644 --- a/extlib/Auth/OpenID/HMAC.php +++ b/extlib/Auth/OpenID/HMAC.php @@ -96,4 +96,3 @@ if (function_exists('hash_hmac') && define('Auth_OpenID_HMACSHA256_SUPPORTED', false); } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Interface.php b/extlib/Auth/OpenID/Interface.php index f4c6062f8..eca6b9c50 100644 --- a/extlib/Auth/OpenID/Interface.php +++ b/extlib/Auth/OpenID/Interface.php @@ -194,4 +194,3 @@ class Auth_OpenID_OpenIDStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/KVForm.php b/extlib/Auth/OpenID/KVForm.php index fb342a001..dd02661d8 100644 --- a/extlib/Auth/OpenID/KVForm.php +++ b/extlib/Auth/OpenID/KVForm.php @@ -26,7 +26,7 @@ class Auth_OpenID_KVForm { * @static * @access private */ - function toArray($kvs, $strict=false) + static function toArray($kvs, $strict=false) { $lines = explode("\n", $kvs); @@ -78,7 +78,7 @@ class Auth_OpenID_KVForm { * @static * @access private */ - function fromArray($values) + static function fromArray($values) { if ($values === null) { return null; @@ -109,4 +109,3 @@ class Auth_OpenID_KVForm { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/MemcachedStore.php b/extlib/Auth/OpenID/MemcachedStore.php index d357c6b11..fc10800b1 100644 --- a/extlib/Auth/OpenID/MemcachedStore.php +++ b/extlib/Auth/OpenID/MemcachedStore.php @@ -205,4 +205,3 @@ class Auth_OpenID_MemcachedStore extends Auth_OpenID_OpenIDStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Message.php b/extlib/Auth/OpenID/Message.php index 5ab115a86..9aa1fa468 100644 --- a/extlib/Auth/OpenID/Message.php +++ b/extlib/Auth/OpenID/Message.php @@ -143,7 +143,7 @@ class Auth_OpenID_Mapping { * Returns true if $thing is an Auth_OpenID_Mapping object; false * if not. */ - function isA($thing) + static function isA($thing) { return (is_object($thing) && strtolower(get_class($thing)) == 'auth_openid_mapping'); @@ -442,7 +442,7 @@ class Auth_OpenID_Message { return $this->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS; } - function fromPostArgs($args) + static function fromPostArgs($args) { // Construct a Message containing a set of POST arguments $obj = new Auth_OpenID_Message(); @@ -477,7 +477,7 @@ class Auth_OpenID_Message { } } - function fromOpenIDArgs($openid_args) + static function fromOpenIDArgs($openid_args) { // Takes an array. @@ -594,7 +594,7 @@ class Auth_OpenID_Message { return $this->_openid_ns_uri; } - function fromKVForm($kvform_string) + static function fromKVForm($kvform_string) { // Create a Message from a KVForm string return Auth_OpenID_Message::fromOpenIDArgs( @@ -917,4 +917,4 @@ class Auth_OpenID_Message { } } -?> + diff --git a/extlib/Auth/OpenID/MySQLStore.php b/extlib/Auth/OpenID/MySQLStore.php index eb08af016..810f059f1 100644 --- a/extlib/Auth/OpenID/MySQLStore.php +++ b/extlib/Auth/OpenID/MySQLStore.php @@ -75,4 +75,3 @@ class Auth_OpenID_MySQLStore extends Auth_OpenID_SQLStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Nonce.php b/extlib/Auth/OpenID/Nonce.php index effecac38..b83c5911f 100644 --- a/extlib/Auth/OpenID/Nonce.php +++ b/extlib/Auth/OpenID/Nonce.php @@ -106,4 +106,3 @@ function Auth_OpenID_mkNonce($when = null) return $time_str . $salt; } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/PAPE.php b/extlib/Auth/OpenID/PAPE.php index 62cba8a91..f08ca8bd0 100644 --- a/extlib/Auth/OpenID/PAPE.php +++ b/extlib/Auth/OpenID/PAPE.php @@ -21,7 +21,7 @@ define('PAPE_AUTH_PHISHING_RESISTANT', 'http://schemas.openid.net/pape/policies/2007/06/phishing-resistant'); define('PAPE_TIME_VALIDATOR', - '^[0-9]{4,4}-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]Z$'); + '/^[0-9]{4,4}-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]Z$/'); /** * A Provider Authentication Policy request, sent from a relying party * to a provider @@ -82,7 +82,7 @@ class Auth_OpenID_PAPE_Request extends Auth_OpenID_Extension { * Instantiate a Request object from the arguments in a checkid_* * OpenID message */ - function fromOpenIDRequest($request) + static function fromOpenIDRequest($request) { $obj = new Auth_OpenID_PAPE_Request(); $args = $request->message->getArgs(Auth_OpenID_PAPE_NS_URI); @@ -201,7 +201,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { * @returns: A provider authentication policy response from the * data that was supplied with the id_res response. */ - function fromSuccessResponse($success_response) + static function fromSuccessResponse($success_response) { $obj = new Auth_OpenID_PAPE_Response(); @@ -262,7 +262,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { $auth_time = Auth_OpenID::arrayGet($args, 'auth_time'); if ($auth_time !== null) { - if (ereg(PAPE_TIME_VALIDATOR, $auth_time)) { + if (preg_match(PAPE_TIME_VALIDATOR, $auth_time)) { $this->auth_time = $auth_time; } else if ($strict) { return false; @@ -287,7 +287,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { } if ($this->auth_time !== null) { - if (!ereg(PAPE_TIME_VALIDATOR, $this->auth_time)) { + if (!preg_match(PAPE_TIME_VALIDATOR, $this->auth_time)) { return false; } @@ -298,4 +298,3 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/Parse.php b/extlib/Auth/OpenID/Parse.php index 546f34f6b..6c2e72169 100644 --- a/extlib/Auth/OpenID/Parse.php +++ b/extlib/Auth/OpenID/Parse.php @@ -101,7 +101,7 @@ class Auth_OpenID_Parse { * Starts with the tag name at a word boundary, where the tag name * is not a namespace */ - var $_tag_expr = "<%s\b(?!:)([^>]*?)(?:\/>|>(.*?)(?:<\/?%s\s*>|\Z))"; + var $_tag_expr = "<%s\b(?!:)([^>]*?)(?:\/>|>(.*)(?:<\/?%s\s*>|\Z))"; var $_attr_find = '\b(\w+)=("[^"]*"|\'[^\']*\'|[^\'"\s\/<>]+)'; @@ -215,11 +215,31 @@ class Auth_OpenID_Parse { return $str; } } + + function match($regexp, $text, &$match) + { + if (!is_callable('mb_ereg_search_init')) { + return preg_match($regexp, $text, $match); + } + + $regexp = substr($regexp, 1, strlen($regexp) - 2 - strlen($this->_re_flags)); + mb_ereg_search_init($text); + if (!mb_ereg_search($regexp)) { + return false; + } + list($match) = mb_ereg_search_getregs(); + return true; + } /** * Find all link tags in a string representing a HTML document and * return a list of their attributes. * + * @todo This is quite ineffective and may fail with the default + * pcre.backtrack_limit of 100000 in PHP 5.2, if $html is big. + * It should rather use stripos (in PHP5) or strpos()+strtoupper() + * in PHP4 to manage this. + * * @param string $html The text to parse * @return array $list An array of arrays of attributes, one for each * link tag @@ -244,18 +264,23 @@ class Auth_OpenID_Parse { $stripped = substr($stripped, $html_begin, $html_end - $html_begin); + // Workaround to prevent PREG_BACKTRACK_LIMIT_ERROR: + $old_btlimit = ini_set( 'pcre.backtrack_limit', -1 ); + // Try to find the <HEAD> tag. $head_re = $this->headFind(); - $head_matches = array(); - if (!preg_match($head_re, $stripped, $head_matches)) { - return array(); + $head_match = ''; + if (!$this->match($head_re, $stripped, $head_match)) { + ini_set( 'pcre.backtrack_limit', $old_btlimit ); + return array(); } $link_data = array(); $link_matches = array(); - if (!preg_match_all($this->_link_find, $head_matches[0], + if (!preg_match_all($this->_link_find, $head_match, $link_matches)) { + ini_set( 'pcre.backtrack_limit', $old_btlimit ); return array(); } @@ -273,6 +298,7 @@ class Auth_OpenID_Parse { $link_data[] = $link_attrs; } + ini_set( 'pcre.backtrack_limit', $old_btlimit ); return $link_data; } @@ -349,4 +375,3 @@ function Auth_OpenID_legacy_discover($html_text, $server_rel, } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/PostgreSQLStore.php b/extlib/Auth/OpenID/PostgreSQLStore.php index 69d95e7b8..d90e43e00 100644 --- a/extlib/Auth/OpenID/PostgreSQLStore.php +++ b/extlib/Auth/OpenID/PostgreSQLStore.php @@ -110,4 +110,3 @@ class Auth_OpenID_PostgreSQLStore extends Auth_OpenID_SQLStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/SQLStore.php b/extlib/Auth/OpenID/SQLStore.php index da93c6aa2..c04059732 100644 --- a/extlib/Auth/OpenID/SQLStore.php +++ b/extlib/Auth/OpenID/SQLStore.php @@ -14,16 +14,6 @@ */ /** - * Require the PEAR DB module because we'll need it for the SQL-based - * stores implemented here. We silence any errors from the inclusion - * because it might not be present, and a user of the SQL stores may - * supply an Auth_OpenID_DatabaseConnection instance that implements - * its own storage. - */ -global $__Auth_OpenID_PEAR_AVAILABLE; -$__Auth_OpenID_PEAR_AVAILABLE = @include_once 'DB.php'; - -/** * @access private */ require_once 'Auth/OpenID/Interface.php'; @@ -89,8 +79,6 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { $associations_table = null, $nonces_table = null) { - global $__Auth_OpenID_PEAR_AVAILABLE; - $this->associations_table_name = "oid_associations"; $this->nonces_table_name = "oid_nonces"; @@ -113,7 +101,7 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { // constant, so only try to use it if PEAR is present. Note // that Auth_Openid_Databaseconnection instances need not // implement ::setFetchMode for this reason. - if ($__Auth_OpenID_PEAR_AVAILABLE) { + if (is_subclass_of($this->connection, 'db_common')) { $this->connection->setFetchMode(DB_FETCHMODE_ASSOC); } @@ -482,7 +470,7 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { global $Auth_OpenID_SKEW; if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { - return False; + return false; } return $this->_add_nonce($server_url, $timestamp, $salt); @@ -566,4 +554,4 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { } } -?> + diff --git a/extlib/Auth/OpenID/SQLiteStore.php b/extlib/Auth/OpenID/SQLiteStore.php index ec2bf58e4..4558fa1c3 100644 --- a/extlib/Auth/OpenID/SQLiteStore.php +++ b/extlib/Auth/OpenID/SQLiteStore.php @@ -68,4 +68,3 @@ class Auth_OpenID_SQLiteStore extends Auth_OpenID_SQLStore { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/SReg.php b/extlib/Auth/OpenID/SReg.php index 63280769f..5ece70724 100644 --- a/extlib/Auth/OpenID/SReg.php +++ b/extlib/Auth/OpenID/SReg.php @@ -94,7 +94,7 @@ Auth_OpenID_registerNamespaceAlias(Auth_OpenID_SREG_NS_URI_1_1, 'sreg'); * $endpoint: The endpoint object as returned by OpenID discovery. * returns whether an sreg type was advertised by the endpoint */ -function Auth_OpenID_supportsSReg(&$endpoint) +function Auth_OpenID_supportsSReg($endpoint) { return ($endpoint->usesExtension(Auth_OpenID_SREG_NS_URI_1_1) || $endpoint->usesExtension(Auth_OpenID_SREG_NS_URI_1_0)); @@ -122,7 +122,7 @@ class Auth_OpenID_SRegBase extends Auth_OpenID_Extension { * * @access private */ - function _getSRegNS(&$message) + static function _getSRegNS($message) { $alias = null; $found_ns_uri = null; @@ -173,7 +173,7 @@ class Auth_OpenID_SRegRequest extends Auth_OpenID_SRegBase { /** * Initialize an empty simple registration request. */ - function build($required=null, $optional=null, + static function build($required=null, $optional=null, $policy_url=null, $sreg_ns_uri=Auth_OpenID_SREG_NS_URI, $cls='Auth_OpenID_SRegRequest') @@ -213,7 +213,7 @@ class Auth_OpenID_SRegRequest extends Auth_OpenID_SRegBase { * * Returns the newly created simple registration request */ - function fromOpenIDRequest($request, $cls='Auth_OpenID_SRegRequest') + static function fromOpenIDRequest($request, $cls='Auth_OpenID_SRegRequest') { $obj = call_user_func_array(array($cls, 'build'), @@ -442,7 +442,7 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { * string (unicode) value. For instance, the nickname should be * stored under the key 'nickname'. */ - function extractResponse($request, $data) + static function extractResponse($request, $data) { $obj = new Auth_OpenID_SRegResponse(); $obj->ns_uri = $request->ns_uri; @@ -471,7 +471,7 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { * Returns a simple registration response containing the data that * was supplied with the C{id_res} response. */ - function fromSuccessResponse(&$success_response, $signed_only=true) + static function fromSuccessResponse($success_response, $signed_only=true) { global $Auth_OpenID_sreg_data_fields; @@ -518,4 +518,4 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { } } -?> + diff --git a/extlib/Auth/OpenID/Server.php b/extlib/Auth/OpenID/Server.php index f1db4d872..cc8ba961c 100644 --- a/extlib/Auth/OpenID/Server.php +++ b/extlib/Auth/OpenID/Server.php @@ -43,7 +43,7 @@ * consumers to add extensions to their requests. For example, with * sites using the Simple Registration * Extension - * (http://www.openidenabled.com/openid/simple-registration-extension/), + * (http://openid.net/specs/openid-simple-registration-extension-1_0.html), * a user can agree to have their nickname and e-mail address sent to * a site when they sign up. * @@ -365,7 +365,7 @@ class Auth_OpenID_CheckAuthRequest extends Auth_OpenID_Request { $this->message = null; } - function fromMessage($message, $server=null) + static function fromMessage($message, $server=null) { $required_keys = array('assoc_handle', 'sig', 'signed'); @@ -396,7 +396,7 @@ class Auth_OpenID_CheckAuthRequest extends Auth_OpenID_Request { return $result; } - function answer(&$signatory) + function answer($signatory) { $is_valid = $signatory->verify($this->assoc_handle, $this->signed); @@ -436,7 +436,7 @@ class Auth_OpenID_PlainTextServerSession { var $needs_math = false; var $allowed_assoc_types = array('HMAC-SHA1', 'HMAC-SHA256'); - function fromMessage($unused_request) + static function fromMessage($unused_request) { return new Auth_OpenID_PlainTextServerSession(); } @@ -469,7 +469,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { $this->consumer_pubkey = $consumer_pubkey; } - function getDH($message) + static function getDH($message) { $dh_modulus = $message->getArg(Auth_OpenID_OPENID_NS, 'dh_modulus'); $dh_gen = $message->getArg(Auth_OpenID_OPENID_NS, 'dh_gen'); @@ -489,7 +489,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { $missing); } - $lib =& Auth_OpenID_getMathLib(); + $lib = Auth_OpenID_getMathLib(); if ($dh_modulus || $dh_gen) { $dh_modulus = $lib->base64ToLong($dh_modulus); @@ -523,7 +523,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { return array($dh, $consumer_pubkey); } - function fromMessage($message) + static function fromMessage($message) { $result = Auth_OpenID_DiffieHellmanSHA1ServerSession::getDH($message); @@ -538,7 +538,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { function answer($secret) { - $lib =& Auth_OpenID_getMathLib(); + $lib = Auth_OpenID_getMathLib(); $mac_key = $this->dh->xorSecret($this->consumer_pubkey, $secret, $this->hash_func); return array( @@ -560,7 +560,7 @@ class Auth_OpenID_DiffieHellmanSHA256ServerSession var $hash_func = 'Auth_OpenID_SHA256'; var $allowed_assoc_types = array('HMAC-SHA256'); - function fromMessage($message) + static function fromMessage($message) { $result = Auth_OpenID_DiffieHellmanSHA1ServerSession::getDH($message); @@ -582,7 +582,7 @@ class Auth_OpenID_DiffieHellmanSHA256ServerSession class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { var $mode = "associate"; - function getSessionClasses() + static function getSessionClasses() { return array( 'no-encryption' => 'Auth_OpenID_PlainTextServerSession', @@ -590,14 +590,14 @@ class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { 'DH-SHA256' => 'Auth_OpenID_DiffieHellmanSHA256ServerSession'); } - function Auth_OpenID_AssociateRequest(&$session, $assoc_type) + function Auth_OpenID_AssociateRequest($session, $assoc_type) { - $this->session =& $session; + $this->session = $session; $this->namespace = Auth_OpenID_OPENID2_NS; $this->assoc_type = $assoc_type; } - function fromMessage($message, $server=null) + static function fromMessage($message, $server=null) { if ($message->isOpenID1()) { $session_type = $message->getArg(Auth_OpenID_OPENID_NS, @@ -696,7 +696,7 @@ class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { 'session_type', $preferred_session_type); } - + $response->code = AUTH_OPENID_HTTP_ERROR; return $response; } } @@ -734,7 +734,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ var $namespace; - function make(&$message, $identity, $return_to, $trust_root = null, + static function make($message, $identity, $return_to, $trust_root = null, $immediate = false, $assoc_handle = null, $server = null) { if ($server === null) { @@ -752,7 +752,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { $assoc_handle, $server); $r->namespace = $message->getOpenIDNamespace(); - $r->message =& $message; + $r->message = $message; if (!$r->trustRootValid()) { return new Auth_OpenID_UntrustedReturnURL($message, @@ -778,7 +778,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { } $this->return_to = $return_to; $this->trust_root = $trust_root; - $this->server =& $server; + $this->server = $server; if ($immediate) { $this->immediate = true; @@ -817,11 +817,12 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ function returnToVerified() { + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); return call_user_func_array($this->verifyReturnTo, - array($this->trust_root, $this->return_to)); + array($this->trust_root, $this->return_to, $fetcher)); } - - function fromMessage(&$message, $server) + + static function fromMessage($message, $server) { $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode'); $immediate = null; @@ -1097,7 +1098,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { in OpenID 1.x immediate mode.'); } - $setup_request =& new Auth_OpenID_CheckIDRequest( + $setup_request = new Auth_OpenID_CheckIDRequest( $this->identity, $this->return_to, $this->trust_root, @@ -1183,9 +1184,9 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ class Auth_OpenID_ServerResponse { - function Auth_OpenID_ServerResponse(&$request) + function Auth_OpenID_ServerResponse($request) { - $this->request =& $request; + $this->request = $request; $this->fields = new Auth_OpenID_Message($this->request->namespace); } @@ -1310,10 +1311,10 @@ class Auth_OpenID_Signatory { /** * Create a new signatory using a given store. */ - function Auth_OpenID_Signatory(&$store) + function Auth_OpenID_Signatory($store) { // assert store is not None - $this->store =& $store; + $this->store = $store; } /** @@ -1447,7 +1448,7 @@ class Auth_OpenID_Encoder { * Encode an {@link Auth_OpenID_ServerResponse} and return an * {@link Auth_OpenID_WebResponse}. */ - function encode(&$response) + function encode($response) { $cls = $this->responseFactory; @@ -1463,10 +1464,14 @@ class Auth_OpenID_Encoder { array('location' => $location)); } else if ($encode_as == Auth_OpenID_ENCODE_HTML_FORM) { $wr = new $cls(AUTH_OPENID_HTTP_OK, array(), - $response->toFormMarkup()); + $response->toHTML()); } else { return new Auth_OpenID_EncodingError($response); } + /* Allow the response to carry a custom error code (ex: for Association errors) */ + if(isset($response->code)) { + $wr->code = $response->code; + } return $wr; } } @@ -1478,16 +1483,16 @@ class Auth_OpenID_Encoder { */ class Auth_OpenID_SigningEncoder extends Auth_OpenID_Encoder { - function Auth_OpenID_SigningEncoder(&$signatory) + function Auth_OpenID_SigningEncoder($signatory) { - $this->signatory =& $signatory; + $this->signatory = $signatory; } /** * Sign an {@link Auth_OpenID_ServerResponse} and return an * {@link Auth_OpenID_WebResponse}. */ - function encode(&$response) + function encode($response) { // the isinstance is a bit of a kludge... it means there isn't // really an adapter to make the interfaces quite match. @@ -1516,9 +1521,9 @@ class Auth_OpenID_SigningEncoder extends Auth_OpenID_Encoder { */ class Auth_OpenID_Decoder { - function Auth_OpenID_Decoder(&$server) + function Auth_OpenID_Decoder($server) { - $this->server =& $server; + $this->server = $server; $this->handlers = array( 'checkid_setup' => 'Auth_OpenID_CheckIDRequest', @@ -1599,9 +1604,9 @@ class Auth_OpenID_Decoder { * @package OpenID */ class Auth_OpenID_EncodingError { - function Auth_OpenID_EncodingError(&$response) + function Auth_OpenID_EncodingError($response) { - $this->response =& $response; + $this->response = $response; } } @@ -1674,14 +1679,14 @@ class Auth_OpenID_UntrustedReturnURL extends Auth_OpenID_ServerError { * @package OpenID */ class Auth_OpenID_Server { - function Auth_OpenID_Server(&$store, $op_endpoint=null) + function Auth_OpenID_Server($store, $op_endpoint=null) { - $this->store =& $store; - $this->signatory =& new Auth_OpenID_Signatory($this->store); - $this->encoder =& new Auth_OpenID_SigningEncoder($this->signatory); - $this->decoder =& new Auth_OpenID_Decoder($this); + $this->store = $store; + $this->signatory = new Auth_OpenID_Signatory($this->store); + $this->encoder = new Auth_OpenID_SigningEncoder($this->signatory); + $this->decoder = new Auth_OpenID_Decoder($this); $this->op_endpoint = $op_endpoint; - $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); + $this->negotiator = Auth_OpenID_getDefaultNegotiator(); } /** @@ -1699,7 +1704,7 @@ class Auth_OpenID_Server { { if (method_exists($this, "openid_" . $request->mode)) { $handler = array($this, "openid_" . $request->mode); - return call_user_func($handler, $request); + return call_user_func($handler, &$request); } return null; } @@ -1707,7 +1712,7 @@ class Auth_OpenID_Server { /** * The callback for 'check_authentication' messages. */ - function openid_check_authentication(&$request) + function openid_check_authentication($request) { return $request->answer($this->signatory); } @@ -1715,7 +1720,7 @@ class Auth_OpenID_Server { /** * The callback for 'associate' messages. */ - function openid_associate(&$request) + function openid_associate($request) { $assoc_type = $request->assoc_type; $session_type = $request->session->session_type; @@ -1738,7 +1743,7 @@ class Auth_OpenID_Server { * Encodes as response in the appropriate format suitable for * sending to the user agent. */ - function encodeResponse(&$response) + function encodeResponse($response) { return $this->encoder->encode($response); } @@ -1757,4 +1762,4 @@ class Auth_OpenID_Server { } } -?> + diff --git a/extlib/Auth/OpenID/ServerRequest.php b/extlib/Auth/OpenID/ServerRequest.php index 33a8556ce..69222a5e0 100644 --- a/extlib/Auth/OpenID/ServerRequest.php +++ b/extlib/Auth/OpenID/ServerRequest.php @@ -34,4 +34,3 @@ class Auth_OpenID_ServerRequest { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/TrustRoot.php b/extlib/Auth/OpenID/TrustRoot.php index 4919a6065..000440b58 100644 --- a/extlib/Auth/OpenID/TrustRoot.php +++ b/extlib/Auth/OpenID/TrustRoot.php @@ -58,7 +58,7 @@ class Auth_OpenID_TrustRoot { * @return The URL upon which relying party discovery should be * run in order to verify the return_to URL */ - function buildDiscoveryURL($realm) + static function buildDiscoveryURL($realm) { $parsed = Auth_OpenID_TrustRoot::_parse($realm); @@ -93,7 +93,7 @@ class Auth_OpenID_TrustRoot { * @return mixed $parsed Either an associative array of trust root * parts or false if parsing failed. */ - function _parse($trust_root) + static function _parse($trust_root) { $trust_root = Auth_OpenID_urinorm($trust_root); if ($trust_root === null) { @@ -199,7 +199,7 @@ class Auth_OpenID_TrustRoot { * @param string $trust_root The trust root to check * @return bool $sanity Whether the trust root looks OK */ - function isSane($trust_root) + static function isSane($trust_root) { $parts = Auth_OpenID_TrustRoot::_parse($trust_root); if ($parts === false) { @@ -269,7 +269,7 @@ class Auth_OpenID_TrustRoot { * @return bool $matches Whether the URL matches against the * trust root */ - function match($trust_root, $url) + static function match($trust_root, $url) { $trust_root_parsed = Auth_OpenID_TrustRoot::_parse($trust_root); $url_parsed = Auth_OpenID_TrustRoot::_parse($url); @@ -341,7 +341,7 @@ class Auth_OpenID_TrustRoot { * @returns: The endpoint URL or None if the endpoint is not a * relying party endpoint. */ -function filter_extractReturnURL(&$endpoint) +function filter_extractReturnURL($endpoint) { if ($endpoint->matchTypes(array(Auth_OpenID_RP_RETURN_TO_URL_TYPE))) { return $endpoint; @@ -394,14 +394,14 @@ function Auth_OpenID_returnToMatches($allowed_return_to_urls, $return_to) * Given a relying party discovery URL return a list of return_to * URLs. */ -function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, +function Auth_OpenID_getAllowedReturnURLs($relying_party_url, $fetcher, $discover_function=null) { if ($discover_function === null) { $discover_function = array('Auth_Yadis_Yadis', 'discover'); } - $xrds_parse_cb = array('Auth_OpenID_ServiceEndpoint', 'fromXRDS'); + $xrds_parse_cb = array('Auth_OpenID_ServiceEndpoint', 'consumerFromXRDS'); list($rp_url_after_redirects, $endpoints) = Auth_Yadis_getServiceEndpoints($relying_party_url, $xrds_parse_cb, @@ -413,7 +413,7 @@ function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, } call_user_func_array($discover_function, - array($relying_party_url, $fetcher)); + array($relying_party_url, &$fetcher)); $return_to_urls = array(); $matching_endpoints = Auth_OpenID_extractReturnURL($endpoints); @@ -435,7 +435,7 @@ function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, * * @return true if the return_to URL is valid for the realm */ -function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, +function Auth_OpenID_verifyReturnTo($realm_str, $return_to, $fetcher, $_vrfy='Auth_OpenID_getAllowedReturnURLs') { $disco_url = Auth_OpenID_TrustRoot::buildDiscoveryURL($realm_str); @@ -445,7 +445,7 @@ function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, } $allowable_urls = call_user_func_array($_vrfy, - array($disco_url, &$fetcher)); + array($disco_url, $fetcher)); // The realm_str could not be parsed. if ($allowable_urls === false) { @@ -459,4 +459,3 @@ function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, } } -?>
\ No newline at end of file diff --git a/extlib/Auth/OpenID/URINorm.php b/extlib/Auth/OpenID/URINorm.php index f821d836a..c051b550a 100644 --- a/extlib/Auth/OpenID/URINorm.php +++ b/extlib/Auth/OpenID/URINorm.php @@ -246,4 +246,4 @@ function Auth_OpenID_urinorm($uri) return $scheme . '://' . $authority . $path . $query . $fragment; } -?> + diff --git a/extlib/Auth/Yadis/HTTPFetcher.php b/extlib/Auth/Yadis/HTTPFetcher.php index 963b9a49a..148cde1b2 100644 --- a/extlib/Auth/Yadis/HTTPFetcher.php +++ b/extlib/Auth/Yadis/HTTPFetcher.php @@ -115,12 +115,40 @@ class Auth_Yadis_HTTPFetcher { /** * @access private */ - function _findRedirect($headers) + function _findRedirect($headers, $url) { foreach ($headers as $line) { if (strpos(strtolower($line), "location: ") === 0) { $parts = explode(" ", $line, 2); - return $parts[1]; + $loc = $parts[1]; + $ppos = strpos($loc, "://"); + if ($ppos === false || $ppos > strpos($loc, "/")) { + /* no host; add it */ + $hpos = strpos($url, "://"); + $prt = substr($url, 0, $hpos+3); + $url = substr($url, $hpos+3); + if (substr($loc, 0, 1) == "/") { + /* absolute path */ + $fspos = strpos($url, "/"); + if ($fspos) $loc = $prt.substr($url, 0, $fspos).$loc; + else $loc = $prt.$url.$loc; + } else { + /* relative path */ + $pp = $prt; + while (1) { + $xpos = strpos($url, "/"); + if ($xpos === false) break; + $apos = strpos($url, "?"); + if ($apos !== false && $apos < $xpos) break; + $apos = strpos($url, "&"); + if ($apos !== false && $apos < $xpos) break; + $pp .= substr($url, 0, $xpos+1); + $url = substr($url, $xpos+1); + } + $loc = $pp.$loc; + } + } + return $loc; } } return null; @@ -144,4 +172,3 @@ class Auth_Yadis_HTTPFetcher { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/Manager.php b/extlib/Auth/Yadis/Manager.php index d50cf7ad6..ee6f68bcb 100644 --- a/extlib/Auth/Yadis/Manager.php +++ b/extlib/Auth/Yadis/Manager.php @@ -387,11 +387,11 @@ class Auth_Yadis_Discovery { * @param string $session_key_suffix The optional session key * suffix override. */ - function Auth_Yadis_Discovery(&$session, $url, + function Auth_Yadis_Discovery($session, $url, $session_key_suffix = null) { /// Initialize a discovery object - $this->session =& $session; + $this->session = $session; $this->url = $url; if ($session_key_suffix === null) { $session_key_suffix = $this->DEFAULT_SUFFIX; @@ -405,7 +405,7 @@ class Auth_Yadis_Discovery { * Return the next authentication service for the pair of * user_input and session. This function handles fallback. */ - function getNextService($discover_cb, &$fetcher) + function getNextService($discover_cb, $fetcher) { $manager = $this->getManager(); if (!$manager || (!$manager->services)) { @@ -413,7 +413,7 @@ class Auth_Yadis_Discovery { list($yadis_url, $services) = call_user_func($discover_cb, $this->url, - $fetcher); + &$fetcher); $manager = $this->createManager($services, $yadis_url); } @@ -466,7 +466,7 @@ class Auth_Yadis_Discovery { * @param $force True if the manager should be returned regardless * of whether it's a manager for $this->url. */ - function &getManager($force=false) + function getManager($force=false) { // Extract the YadisServiceManager for this object's URL and // suffix from the session. @@ -481,16 +481,13 @@ class Auth_Yadis_Discovery { if ($manager && ($manager->forURL($this->url) || $force)) { return $manager; - } else { - $unused = null; - return $unused; } } /** * @access private */ - function &createManager($services, $yadis_url = null) + function createManager($services, $yadis_url = null) { $key = $this->getSessionKey(); if ($this->getManager()) { @@ -504,10 +501,6 @@ class Auth_Yadis_Discovery { $this->session->set($this->session_key, serialize($loader->toSession($manager))); return $manager; - } else { - // Oh, PHP. - $unused = null; - return $unused; } } @@ -526,4 +519,3 @@ class Auth_Yadis_Discovery { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/Misc.php b/extlib/Auth/Yadis/Misc.php index 1134a4ff4..a5afa8e9a 100644 --- a/extlib/Auth/Yadis/Misc.php +++ b/extlib/Auth/Yadis/Misc.php @@ -56,4 +56,3 @@ function Auth_Yadis_startswith($s, $stuff) return strpos($s, $stuff) === 0; } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/ParanoidHTTPFetcher.php b/extlib/Auth/Yadis/ParanoidHTTPFetcher.php index 6a418260e..4da7c94c0 100644 --- a/extlib/Auth/Yadis/ParanoidHTTPFetcher.php +++ b/extlib/Auth/Yadis/ParanoidHTTPFetcher.php @@ -109,9 +109,9 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } curl_setopt($c, CURLOPT_WRITEFUNCTION, - array(&$this, "_writeData")); + array($this, "_writeData")); curl_setopt($c, CURLOPT_HEADERFUNCTION, - array(&$this, "_writeHeader")); + array($this, "_writeHeader")); if ($extra_headers) { curl_setopt($c, CURLOPT_HTTPHEADER, $extra_headers); @@ -128,6 +128,10 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { curl_setopt($c, CURLOPT_TIMEOUT, $off); curl_setopt($c, CURLOPT_URL, $url); + if (defined('Auth_OpenID_VERIFY_HOST')) { + curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2); + } curl_exec($c); $code = curl_getinfo($c, CURLINFO_HTTP_CODE); @@ -142,12 +146,17 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } if (in_array($code, array(301, 302, 303, 307))) { - $url = $this->_findRedirect($headers); + $url = $this->_findRedirect($headers, $url); $redir = true; } else { $redir = false; curl_close($c); + if (defined('Auth_OpenID_VERIFY_HOST') && + $this->isHTTPS($url)) { + Auth_OpenID::log('OpenID: Verified SSL host %s using '. + 'curl/get', $url); + } $new_headers = array(); foreach ($headers as $header) { @@ -190,7 +199,12 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { curl_setopt($c, CURLOPT_TIMEOUT, $this->timeout); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_WRITEFUNCTION, - array(&$this, "_writeData")); + array($this, "_writeData")); + + if (defined('Auth_OpenID_VERIFY_HOST')) { + curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2); + } curl_exec($c); @@ -198,9 +212,15 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { if (!$code) { Auth_OpenID::log("Got no response code when fetching %s", $url); + Auth_OpenID::log("CURL error (%s): %s", + curl_errno($c), curl_error($c)); return null; } + if (defined('Auth_OpenID_VERIFY_HOST') && $this->isHTTPS($url)) { + Auth_OpenID::log('OpenID: Verified SSL host %s using '. + 'curl/post', $url); + } $body = $this->data; curl_close($c); @@ -223,4 +243,3 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/ParseHTML.php b/extlib/Auth/Yadis/ParseHTML.php index 297ccbd2c..6f0f8b7e2 100644 --- a/extlib/Auth/Yadis/ParseHTML.php +++ b/extlib/Auth/Yadis/ParseHTML.php @@ -256,4 +256,3 @@ class Auth_Yadis_ParseHTML { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/PlainHTTPFetcher.php b/extlib/Auth/Yadis/PlainHTTPFetcher.php index 3e0ca2bb0..26890539a 100644 --- a/extlib/Auth/Yadis/PlainHTTPFetcher.php +++ b/extlib/Auth/Yadis/PlainHTTPFetcher.php @@ -122,7 +122,7 @@ class Auth_Yadis_PlainHTTPFetcher extends Auth_Yadis_HTTPFetcher { $code = $http_code[1]; if (in_array($code, array('301', '302'))) { - $url = $this->_findRedirect($headers); + $url = $this->_findRedirect($headers, $url); $redir = true; } else { $redir = false; @@ -246,4 +246,3 @@ class Auth_Yadis_PlainHTTPFetcher extends Auth_Yadis_HTTPFetcher { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/XML.php b/extlib/Auth/Yadis/XML.php index 81b2ce221..cf1f5c41b 100644 --- a/extlib/Auth/Yadis/XML.php +++ b/extlib/Auth/Yadis/XML.php @@ -310,20 +310,16 @@ $__Auth_Yadis_defaultParser = null; * @param Auth_Yadis_XMLParser $parser An instance of a * Auth_Yadis_XMLParser subclass. */ -function Auth_Yadis_setDefaultParser(&$parser) +function Auth_Yadis_setDefaultParser($parser) { global $__Auth_Yadis_defaultParser; - $__Auth_Yadis_defaultParser =& $parser; + $__Auth_Yadis_defaultParser = $parser; } function Auth_Yadis_getSupportedExtensions() { - return array( - 'dom' => array('classname' => 'Auth_Yadis_dom', - 'libname' => array('dom.so', 'dom.dll')), - 'domxml' => array('classname' => 'Auth_Yadis_domxml', - 'libname' => array('domxml.so', 'php_domxml.dll')), - ); + return array('dom' => 'Auth_Yadis_dom', + 'domxml' => 'Auth_Yadis_domxml'); } /** @@ -332,43 +328,25 @@ function Auth_Yadis_getSupportedExtensions() * Auth_Yadis_setDefaultParser has been called, the parser used in * that call will be returned instead. */ -function &Auth_Yadis_getXMLParser() +function Auth_Yadis_getXMLParser() { global $__Auth_Yadis_defaultParser; - + if (isset($__Auth_Yadis_defaultParser)) { return $__Auth_Yadis_defaultParser; } - - $p = null; - $classname = null; - - $extensions = Auth_Yadis_getSupportedExtensions(); - - // Return a wrapper for the resident implementation, if any. - foreach ($extensions as $name => $params) { - if (!extension_loaded($name)) { - foreach ($params['libname'] as $libname) { - if (@dl($libname)) { - $classname = $params['classname']; - } - } - } else { - $classname = $params['classname']; - } - if (isset($classname)) { - $p = new $classname(); - return $p; - } - } - - if (!isset($p)) { - trigger_error('No XML parser was found', E_USER_ERROR); - } else { + + foreach(Auth_Yadis_getSupportedExtensions() as $extension => $classname) + { + if (extension_loaded($extension)) + { + $p = new $classname(); Auth_Yadis_setDefaultParser($p); + return $p; + } } - - return $p; + + return false; } -?> + diff --git a/extlib/Auth/Yadis/XRDS.php b/extlib/Auth/Yadis/XRDS.php index f14a7948e..1f5af96fb 100644 --- a/extlib/Auth/Yadis/XRDS.php +++ b/extlib/Auth/Yadis/XRDS.php @@ -255,11 +255,11 @@ class Auth_Yadis_XRDS { * Instantiate a Auth_Yadis_XRDS object. Requires an XPath * instance which has been used to parse a valid XRDS document. */ - function Auth_Yadis_XRDS(&$xmlParser, &$xrdNodes) + function Auth_Yadis_XRDS($xmlParser, $xrdNodes) { - $this->parser =& $xmlParser; + $this->parser = $xmlParser; $this->xrdNode = $xrdNodes[count($xrdNodes) - 1]; - $this->allXrdNodes =& $xrdNodes; + $this->allXrdNodes = $xrdNodes; $this->serviceList = array(); $this->_parse(); } @@ -273,7 +273,7 @@ class Auth_Yadis_XRDS { * @return mixed $xrds An instance of Auth_Yadis_XRDS or null, * depending on the validity of $xml_string */ - function &parseXRDS($xml_string, $extra_ns_map = null) + static function parseXRDS($xml_string, $extra_ns_map = null) { $_null = null; @@ -352,9 +352,9 @@ class Auth_Yadis_XRDS { $services = $this->parser->evalXPath('xrd:Service', $this->xrdNode); foreach ($services as $node) { - $s =& new Auth_Yadis_Service(); + $s = new Auth_Yadis_Service(); $s->element = $node; - $s->parser =& $this->parser; + $s->parser = $this->parser; $priority = $s->getPriority(); @@ -428,7 +428,8 @@ class Auth_Yadis_XRDS { $matches = 0; foreach ($filters as $filter) { - if (call_user_func_array($filter, array($service))) { + + if (call_user_func_array($filter, array(&$service))) { $matches++; if ($filter_mode == SERVICES_YADIS_MATCH_ANY) { @@ -475,4 +476,3 @@ class Auth_Yadis_XRDS { } } -?>
\ No newline at end of file diff --git a/extlib/Auth/Yadis/XRI.php b/extlib/Auth/Yadis/XRI.php index 4e3462317..0143a692e 100644 --- a/extlib/Auth/Yadis/XRI.php +++ b/extlib/Auth/Yadis/XRI.php @@ -190,7 +190,7 @@ function Auth_Yadis_getCanonicalID($iname, $xrds) // Now nodes are in reverse order. $xrd_list = array_reverse($xrds->allXrdNodes); - $parser =& $xrds->parser; + $parser = $xrds->parser; $node = $xrd_list[0]; $canonicalID_nodes = $parser->evalXPath('xrd:CanonicalID', $node); @@ -231,4 +231,4 @@ function Auth_Yadis_getCanonicalID($iname, $xrds) return $canonicalID; } -?> + diff --git a/extlib/Auth/Yadis/XRIRes.php b/extlib/Auth/Yadis/XRIRes.php index 4e8e8d037..5e1158735 100644 --- a/extlib/Auth/Yadis/XRIRes.php +++ b/extlib/Auth/Yadis/XRIRes.php @@ -8,9 +8,9 @@ require_once 'Auth/Yadis/XRDS.php'; require_once 'Auth/Yadis/XRI.php'; class Auth_Yadis_ProxyResolver { - function Auth_Yadis_ProxyResolver(&$fetcher, $proxy_url = null) + function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null) { - $this->fetcher =& $fetcher; + $this->fetcher = $fetcher; $this->proxy_url = $proxy_url; if (!$this->proxy_url) { $this->proxy_url = Auth_Yadis_getDefaultProxy(); @@ -69,4 +69,4 @@ class Auth_Yadis_ProxyResolver { } } -?> + diff --git a/extlib/Auth/Yadis/Yadis.php b/extlib/Auth/Yadis/Yadis.php index d89f77c6d..9ea2db7f9 100644 --- a/extlib/Auth/Yadis/Yadis.php +++ b/extlib/Auth/Yadis/Yadis.php @@ -105,7 +105,7 @@ class Auth_Yadis_DiscoveryResult { function usedYadisLocation() { // Was the Yadis protocol's indirection used? - return $this->normalized_uri != $this->xrds_uri; + return ($this->xrds_uri && $this->normalized_uri != $this->xrds_uri); } function isXRDS() @@ -141,7 +141,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, } $yadis_result = call_user_func_array($discover_func, - array($input_url, $fetcher)); + array($input_url, &$fetcher)); if ($yadis_result === null) { return array($input_url, array()); @@ -196,7 +196,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, * The filter functions (whose names appear in the array passed to * services()) take the following form: * - * <pre> function myFilter(&$service) { + * <pre> function myFilter($service) { * // Query $service object here. Return true if the service * // matches your query; false if not. * }</pre> @@ -207,7 +207,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, * this contrived example): * * <pre> - * function URIMatcher(&$service) { + * function URIMatcher($service) { * foreach ($service->getElements('xrd:URI') as $uri) { * if (preg_match("/some_pattern/", * $service->parser->content($uri))) { @@ -250,7 +250,7 @@ class Auth_Yadis_Yadis { * If Auth_Yadis_CURL_OVERRIDE is defined, this method will always * return a {@link Auth_Yadis_PlainHTTPFetcher}. */ - function getHTTPFetcher($timeout = 20) + static function getHTTPFetcher($timeout = 20) { if (Auth_Yadis_Yadis::curlPresent() && (!defined('Auth_Yadis_CURL_OVERRIDE'))) { @@ -261,7 +261,7 @@ class Auth_Yadis_Yadis { return $fetcher; } - function curlPresent() + static function curlPresent() { return function_exists('curl_init'); } @@ -269,7 +269,7 @@ class Auth_Yadis_Yadis { /** * @access private */ - function _getHeader($header_list, $names) + static function _getHeader($header_list, $names) { foreach ($header_list as $name => $value) { foreach ($names as $n) { @@ -285,7 +285,7 @@ class Auth_Yadis_Yadis { /** * @access private */ - function _getContentType($content_type_header) + static function _getContentType($content_type_header) { if ($content_type_header) { $parts = explode(";", $content_type_header); @@ -317,7 +317,7 @@ class Auth_Yadis_Yadis { * Auth_Yadis_Yadis, depending on whether the discovery * succeeded. */ - function discover($uri, &$fetcher, + static function discover($uri, $fetcher, $extra_ns_map = null, $timeout = 20) { $result = new Auth_Yadis_DiscoveryResult($uri); @@ -379,4 +379,4 @@ class Auth_Yadis_Yadis { } } -?> + diff --git a/extlib/OAuth.php b/extlib/OAuth.php index 648627b57..04984d5fa 100644 --- a/extlib/OAuth.php +++ b/extlib/OAuth.php @@ -54,6 +54,24 @@ class OAuthSignatureMethod {/*{{{*/ public function check_signature(&$request, $consumer, $token, $signature) { $built = $this->build_signature($request, $consumer, $token); return $built == $signature; + + // Check for zero length, although unlikely here + if (strlen($built) == 0 || strlen($signature) == 0) { + return false; + } + + if (strlen($built) != strlen($signature)) { + return false; + } + + $result = 0; + + // Avoid a timing leak with a (hopefully) time insensitive compare + for ($i = 0; $i < strlen($signature); $i++) { + $result |= ord($built{$i}) ^ ord($signature{$i}); + } + + return $result == 0; } }/*}}}*/ diff --git a/extlib/libomb/base_url_xrds_mapper.php b/extlib/libomb/base_url_xrds_mapper.php index 645459583..d45d6d69f 100755 --- a/extlib/libomb/base_url_xrds_mapper.php +++ b/extlib/libomb/base_url_xrds_mapper.php @@ -1,14 +1,6 @@ <?php - -require_once 'xrds_mapper.php'; -require_once 'constants.php'; - /** - * Map XRDS actions to URLs using base URLs. - * - * This interface specifies classes which write the XRDS file announcing - * the OMB server. An instance of an implementing class should be passed to - * OMB_Service_Provider->writeXRDS. + * This file is part of libomb * * PHP version 5 * @@ -25,27 +17,56 @@ require_once 'constants.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ -class OMB_Base_URL_XRDS_Mapper implements OMB_XRDS_Mapper { +require_once 'xrds_mapper.php'; +require_once 'constants.php'; - protected $urls; +/** + * Map XRDS actions to URLs using base URLs + * + * This class realizes a simple mapping of action URIs to handler URLs. The + * target URLs are constructed using a base URL. + */ +class OMB_Base_URL_XRDS_Mapper implements OMB_XRDS_Mapper +{ + protected $urls; - public function __construct($oauth_base, $omb_base) { - $this->urls = array( - OAUTH_ENDPOINT_REQUEST => $oauth_base . 'requesttoken', - OAUTH_ENDPOINT_AUTHORIZE => $oauth_base . 'userauthorization', - OAUTH_ENDPOINT_ACCESS => $oauth_base . 'accesstoken', - OMB_ENDPOINT_POSTNOTICE => $omb_base . 'postnotice', - OMB_ENDPOINT_UPDATEPROFILE => $omb_base . 'updateprofile'); - } + /** + * Constructor + * + * Initialize the XRDS mapper with base URLs for OAuth and OMB endpoints. + * + * @param string $oauth_base The base URL for OAuth endpoints + * @param string $omb_base The base URL for OMB endpoints + */ + public function __construct($oauth_base, $omb_base) + { + $this->urls = array( + OAUTH_ENDPOINT_REQUEST => $oauth_base . 'requesttoken', + OAUTH_ENDPOINT_AUTHORIZE => $oauth_base . 'userauthorization', + OAUTH_ENDPOINT_ACCESS => $oauth_base . 'accesstoken', + OMB_ENDPOINT_POSTNOTICE => $omb_base . 'postnotice', + OMB_ENDPOINT_UPDATEPROFILE => $omb_base . 'updateprofile'); + } - public function getURL($action) { - return $this->urls[$action]; - } + /** + * Fetch an URL for a specified action + * + * Returns the action URL for an action specified by the endpoint URI. + * + * @param string $action The endpoint URI + * + * @return string The action URL + */ + public function getURL($action) + { + return $this->urls[$action]; + } } ?> diff --git a/extlib/libomb/constants.php b/extlib/libomb/constants.php index a097443ac..2f8c0e514 100644 --- a/extlib/libomb/constants.php +++ b/extlib/libomb/constants.php @@ -20,15 +20,16 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ /** * The OMB constants. - **/ + */ define('OMB_VERSION_01', 'http://openmicroblogging.org/protocol/0.1'); @@ -40,7 +41,7 @@ define('OMB_ENDPOINT_POSTNOTICE', OMB_VERSION . '/postNotice'); /** * The OAuth constants. - **/ + */ define('OAUTH_NAMESPACE', 'http://oauth.net/core/1.0/'); diff --git a/extlib/libomb/datastore.php b/extlib/libomb/datastore.php index ab52de547..d67aafcc5 100755 --- a/extlib/libomb/datastore.php +++ b/extlib/libomb/datastore.php @@ -1,4 +1,28 @@ <?php +/** + * This file is part of libomb + * + * PHP version 5 + * + * LICENSE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ require_once 'OAuth.php'; @@ -27,174 +51,162 @@ require_once 'OAuth.php'; * Most of the parameters passed to these methods are unescaped and unverified * user input. Therefore they should be handled with extra care to avoid * security problems like SQL injections. - * - * PHP version 5 - * - * LICENSE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Datastore extends OAuthDataStore { + */ +class OMB_Datastore extends OAuthDataStore +{ - /********* - * OAUTH * - *********/ + /********* + * OAUTH * + *********/ - /** - * Revoke specified OAuth token - * - * Revokes the authorization token specified by $token_key. - * Throws exceptions in case of error. - * - * @param string $token_key The key of the token to be revoked - * - * @access public - **/ - public function revoke_token($token_key) { - throw new Exception(); - } + /** + * Revoke specified OAuth token + * + * Revokes the authorization token specified by $token_key. + * Throws exceptions in case of error. + * + * @param string $token_key The key of the token to be revoked + * + * @access public + */ + public function revoke_token($token_key) + { + throw new Exception(); + } - /** - * Authorize specified OAuth token - * - * Authorizes the authorization token specified by $token_key. - * Throws exceptions in case of error. - * - * @param string $token_key The key of the token to be authorized - * - * @access public - **/ - public function authorize_token($token_key) { - throw new Exception(); - } + /** + * Authorize specified OAuth token + * + * Authorizes the authorization token specified by $token_key. + * Throws exceptions in case of error. + * + * @param string $token_key The key of the token to be authorized + * + * @access public + */ + public function authorize_token($token_key) + { + throw new Exception(); + } - /********* - * OMB * - *********/ + /********* + * OMB * + *********/ - /** - * Get profile by identifying URI - * - * Returns an OMB_Profile object representing the OMB profile identified by - * $identifier_uri. - * Returns null if there is no such OMB profile. - * Throws exceptions in case of other error. - * - * @param string $identifier_uri The OMB identifier URI specifying the - * requested profile - * - * @access public - * - * @return OMB_Profile The corresponding profile - **/ - public function getProfile($identifier_uri) { - throw new Exception(); - } + /** + * Get profile by identifying URI + * + * Returns an OMB_Profile object representing the OMB profile identified by + * $identifier_uri. + * Returns null if there is no such OMB profile. + * Throws exceptions in case of other error. + * + * @param string $identifier_uri The OMB identifier URI specifying the + * requested profile + * + * @access public + * + * @return OMB_Profile The corresponding profile + */ + public function getProfile($identifier_uri) + { + throw new Exception(); + } - /** - * Save passed profile - * - * Stores the OMB profile $profile. Overwrites an existing entry. - * Throws exceptions in case of error. - * - * @param OMB_Profile $profile The OMB profile which should be saved - * - * @access public - **/ - public function saveProfile($profile) { - throw new Exception(); - } + /** + * Save passed profile + * + * Stores the OMB profile $profile. Overwrites an existing entry. + * Throws exceptions in case of error. + * + * @param OMB_Profile $profile The OMB profile which should be saved + * + * @access public + */ + public function saveProfile($profile) + { + throw new Exception(); + } - /** - * Save passed notice - * - * Stores the OMB notice $notice. The datastore may change the passed notice. - * This might by neccessary for URIs depending on a database key. Note that - * it is the user’s duty to present a mechanism for his OMB_Datastore to - * appropriately change his OMB_Notice. TODO: Ugly. - * Throws exceptions in case of error. - * - * @param OMB_Notice $notice The OMB notice which should be saved - * - * @access public - **/ - public function saveNotice(&$notice) { - throw new Exception(); - } + /** + * Save passed notice + * + * Stores the OMB notice $notice. The datastore may change the passed + * notice. This might by necessary for URIs depending on a database key. + * Note that it is the user’s duty to present a mechanism for his + * OMB_Datastore to appropriately change his OMB_Notice. + * Throws exceptions in case of error. + * + * @param OMB_Notice &$notice The OMB notice which should be saved + * + * @access public + */ + public function saveNotice(&$notice) + { + throw new Exception(); + } - /** - * Get subscriptions of a given profile - * - * Returns an array containing subscription informations for the specified - * profile. Every array entry should in turn be an array with keys - * 'uri´: The identifier URI of the subscriber - * 'token´: The subscribe token - * 'secret´: The secret token - * Throws exceptions in case of error. - * - * @param string $subscribed_user_uri The OMB identifier URI specifying the - * subscribed profile - * - * @access public - * - * @return mixed An array containing the subscriptions or 0 if no - * subscription has been found. - **/ - public function getSubscriptions($subscribed_user_uri) { - throw new Exception(); - } + /** + * Get subscriptions of a given profile + * + * Returns an array containing subscription informations for the specified + * profile. Every array entry should in turn be an array with keys + * 'uri´: The identifier URI of the subscriber + * 'token´: The subscribe token + * 'secret´: The secret token + * Throws exceptions in case of error. + * + * @param string $subscribed_user_uri The OMB identifier URI specifying the + * subscribed profile + * + * @access public + * + * @return mixed An array containing the subscriptions or 0 if no + * subscription has been found. + */ + public function getSubscriptions($subscribed_user_uri) + { + throw new Exception(); + } - /** - * Delete a subscription - * - * Deletes the subscription from $subscriber_uri to $subscribed_user_uri. - * Throws exceptions in case of error. - * - * @param string $subscriber_uri The OMB identifier URI specifying the - * subscribing profile - * - * @param string $subscribed_user_uri The OMB identifier URI specifying the - * subscribed profile - * - * @access public - **/ - public function deleteSubscription($subscriber_uri, $subscribed_user_uri) { - throw new Exception(); - } + /** + * Delete a subscription + * + * Deletes the subscription from $subscriber_uri to $subscribed_user_uri. + * Throws exceptions in case of error. + * + * @param string $subscriber_uri The OMB identifier URI specifying the + * subscribing profile + * + * @param string $subscribed_user_uri The OMB identifier URI specifying the + * subscribed profile + * + * @access public + */ + public function deleteSubscription($subscriber_uri, $subscribed_user_uri) + { + throw new Exception(); + } - /** - * Save a subscription - * - * Saves the subscription from $subscriber_uri to $subscribed_user_uri. - * Throws exceptions in case of error. - * - * @param string $subscriber_uri The OMB identifier URI specifying - * the subscribing profile - * - * @param string $subscribed_user_uri The OMB identifier URI specifying - * the subscribed profile - * @param OAuthToken $token The access token - * - * @access public - **/ - public function saveSubscription($subscriber_uri, $subscribed_user_uri, - $token) { - throw new Exception(); - } + /** + * Save a subscription + * + * Saves the subscription from $subscriber_uri to $subscribed_user_uri. + * Throws exceptions in case of error. + * + * @param string $subscriber_uri The OMB identifier URI specifying + * the subscribing profile + * + * @param string $subscribed_user_uri The OMB identifier URI specifying + * the subscribed profile + * @param OAuthToken $token The access token + * + * @access public + */ + public function saveSubscription($subscriber_uri, $subscribed_user_uri, + $token) + { + throw new Exception(); + } } ?> diff --git a/extlib/libomb/helper.php b/extlib/libomb/helper.php index a1f21f268..08e6e7ab4 100644 --- a/extlib/libomb/helper.php +++ b/extlib/libomb/helper.php @@ -1,11 +1,6 @@ <?php - -require_once 'Validate.php'; - /** - * Helper functions for libomb - * - * This file contains helper functions for libomb. + * This file is part of libomb * * PHP version 5 * @@ -22,78 +17,88 @@ require_once 'Validate.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ -class OMB_Helper { +require_once 'Validate.php'; - /** - * Non-scalar constants - * - * The set of OMB and OAuth Services an OMB Server has to implement. - */ +/** + * Helper functions for libomb + * + * This class contains helper functions for libomb. + */ +class OMB_Helper +{ - public static $OMB_SERVICES = - array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE); - public static $OAUTH_SERVICES = - array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE, OAUTH_ENDPOINT_ACCESS); + /** + * Non-scalar constants + * + * The set of OMB and OAuth Services an OMB Server has to implement. + */ - /** - * Validate URL - * - * Basic URL validation. Currently http, https, ftp and gopher are supported - * schemes. - * - * @param string $url The URL which is to be validated. - * - * @return bool Whether URL is valid. - * - * @access public - */ - public static function validateURL($url) { - return Validate::uri($url, array('allowed_schemes' => array('http', 'https', - 'gopher', 'ftp'))); - } + public static $OMB_SERVICES = array(OMB_ENDPOINT_UPDATEPROFILE, + OMB_ENDPOINT_POSTNOTICE); + public static $OAUTH_SERVICES = array(OAUTH_ENDPOINT_REQUEST, + OAUTH_ENDPOINT_AUTHORIZE, + OAUTH_ENDPOINT_ACCESS); - /** - * Validate Media type - * - * Basic Media type validation. Checks for valid maintype and correct format. - * - * @param string $mediatype The Media type which is to be validated. - * - * @return bool Whether media type is valid. - * - * @access public - */ - public static function validateMediaType($mediatype) { - if (0 === preg_match('/^(\w+)\/([\w\d-+.]+)$/', $mediatype, $subtypes)) { - return false; + /** + * Validate URL + * + * Basic URL validation. Currently http, https, ftp and gopher are supported + * schemes. + * + * @param string $url The URL which is to be validated. + * + * @return bool Whether URL is valid. + * + * @access public + */ + public static function validateURL($url) + { + return Validate::uri($url, array('allowed_schemes' => array('http', + 'https', 'gopher', 'ftp'))); } - if (!in_array(strtolower($subtypes[1]), array('application', 'audio', 'image', - 'message', 'model', 'multipart', 'text', 'video'))) { - return false; + + /** + * Validate Media type + * + * Basic Media type validation. Checks for valid maintype and correct + * format. + * + * @param string $mediatype The Media type which is to be validated. + * + * @return bool Whether media type is valid. + * + * @access public + */ + public static function validateMediaType($mediatype) + { + return preg_match('/^(\w+)\/([\w\d-+.]+)$/', $mediatype, $subtypes) > 0 + && + in_array(strtolower($subtypes[1]), array('application', 'audio', + 'image', 'message', 'model', 'multipart', 'text', 'video')); } - return true; - } - /** - * Remove escaping from request parameters - * - * Neutralise the evil effects of magic_quotes_gpc in the current request. - * This is used before handing a request off to OAuthRequest::from_request. - * Many thanks to Ciaran Gultnieks for this fix. - * - * @access public - */ - public static function removeMagicQuotesFromRequest() { - if(get_magic_quotes_gpc() == 1) { - $_POST = array_map('stripslashes', $_POST); - $_GET = array_map('stripslashes', $_GET); + /** + * Remove escaping from request parameters + * + * Neutralise the evil effects of magic_quotes_gpc in the current request. + * This is used before handing a request off to OAuthRequest::from_request. + * Many thanks to Ciaran Gultnieks for this fix. + * + * @access public + */ + public static function removeMagicQuotesFromRequest() + { + if (get_magic_quotes_gpc() === 1) { + $_POST = array_map('stripslashes', $_POST); + $_GET = array_map('stripslashes', $_GET); + } } - } } ?> diff --git a/extlib/libomb/invalidparameterexception.php b/extlib/libomb/invalidparameterexception.php index 163e1dd4c..d95c7022c 100755 --- a/extlib/libomb/invalidparameterexception.php +++ b/extlib/libomb/invalidparameterexception.php @@ -1,8 +1,6 @@ <?php /** - * Exception stating that a passed parameter is invalid - * - * This exception is raised when a parameter does not obey the OMB standard. + * This file is part of libomb * * PHP version 5 * @@ -19,14 +17,36 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ -class OMB_InvalidParameterException extends Exception { - public function __construct($value, $type, $parameter) { - parent::__construct("Invalid value $value for parameter $parameter in $type"); - } + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +/** + * Exception stating that a passed parameter is invalid + * + * This exception is raised when a parameter does not obey the OMB standard. + */ +class OMB_InvalidParameterException extends Exception +{ + /** + * Constructor + * + * Creates a new exception based on a parameter name, value, and object + * type. + * + * @param string $value The wrong value passed + * @param string $type The object type the parameter belongs to; + * Currently OMB uses profiles and notices + * @param string $parameter The name of the parameter the wrong value has + * been passed for + */ + public function __construct($value, $type, $parameter) + { + parent::__construct("Invalid value ‘${value}’ for parameter " . + "‘${parameter}’ in $type"); + } } ?> diff --git a/extlib/libomb/invalidyadisexception.php b/extlib/libomb/invalidyadisexception.php index 797b7b95b..dc61a13ad 100755 --- a/extlib/libomb/invalidyadisexception.php +++ b/extlib/libomb/invalidyadisexception.php @@ -1,9 +1,6 @@ <?php /** - * Exception stating that a requested url does not resolve to a valid yadis - * - * This exception is raised when OMB_Service is not able to discover a valid - * yadis location with XRDS. + * This file is part of libomb * * PHP version 5 * @@ -20,12 +17,21 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ -class OMB_InvalidYadisException extends Exception { + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +/** + * Exception stating that a requested url does not resolve to a valid yadis + * + * This exception is raised when OMB_Service is not able to discover a valid + * yadis location with XRDS. + */ +class OMB_InvalidYadisException extends Exception +{ } ?> diff --git a/extlib/libomb/notice.php b/extlib/libomb/notice.php index 9ac36640a..4963597b2 100755 --- a/extlib/libomb/notice.php +++ b/extlib/libomb/notice.php @@ -1,15 +1,6 @@ <?php -require_once 'invalidparameterexception.php'; -require_once 'Validate.php'; -require_once 'helper.php'; - /** - * OMB Notice representation - * - * This class represents an OMB notice. - * - * Do not call the setters with null values. Instead, if you want to delete a - * field, pass an empty string. The getters will return null for empty fields. + * This file is part of libomb * * PHP version 5 * @@ -26,247 +17,278 @@ require_once 'helper.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Notice { - protected $author; - protected $uri; - protected $content; - protected $url; - protected $license_url; /* url is an own addition for clarification. */ - protected $seealso_url; /* url is an own addition for clarification. */ - protected $seealso_disposition; - protected $seealso_mediatype; - protected $seealso_license_url; /* url is an addition for clarification. */ - - /* The notice as OMB param array. Cached and rebuild on usage. - false while outdated. */ - protected $param_array; - - /** - * Constructor for OMB_Notice - * - * Initializes the OMB_Notice object with author, uri and content. - * These parameters are mandatory for postNotice. - * - * @param object $author An OMB_Profile object representing the author of the - * notice. - * @param string $uri The notice URI as defined by the OMB. A unique and - * unchanging identifier for a notice. - * @param string $content The content of the notice. 140 chars recommended, - * but there is no limit. - * - * @access public - */ - public function __construct($author, $uri, $content) { - $this->content = $content; - if (is_null($author)) { - throw new OMB_InvalidParameterException('', 'notice', 'omb_listenee'); - } - $this->author = $author; + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ - if (!Validate::uri($uri)) { - throw new OMB_InvalidParameterException($uri, 'notice', 'omb_notice'); - } - $this->uri = $uri; - - $this->param_array = false; - } - - /** - * Returns the notice as array - * - * The method returns an array which contains the whole notice as array. The - * array is cached and only rebuilt on changes of the notice. - * Empty optional values are not passed. - * - * @access public - * @returns array The notice as parameter array - */ - public function asParameters() { - if ($this->param_array !== false) { - return $this->param_array; +require_once 'invalidparameterexception.php'; +require_once 'Validate.php'; +require_once 'helper.php'; + +/** + * OMB Notice representation + * + * This class represents an OMB notice. + * + * Do not call the setters with null values. Instead, if you want to delete a + * field, pass an empty string. The getters will return null for empty fields. + */ +class OMB_Notice +{ + protected $author; + protected $uri; + protected $content; + protected $url; + protected $license_url; /* url is an own addition for clarification. */ + protected $seealso_url; /* url is an own addition for clarification. */ + protected $seealso_disposition; + protected $seealso_mediatype; + protected $seealso_license_url; /* url is an addition for clarification. */ + + /* The notice as OMB param array. Cached and rebuild on usage. + false while outdated. */ + protected $param_array; + + /** + * Constructor for OMB_Notice + * + * Initializes the OMB_Notice object with author, uri and content. + * These parameters are mandatory for postNotice. + * + * @param object $author An OMB_Profile object representing the author of + * the notice. + * @param string $uri The notice URI as defined by the OMB. A unique and + * never changing identifier for a notice. + * @param string $content The content of the notice. 140 chars recommended, + * but there is no limit. + * + * @access public + */ + public function __construct($author, $uri, $content) + { + $this->content = $content; + if (is_null($author)) { + throw new OMB_InvalidParameterException('', 'notice', 'omb_listenee'); + } + $this->author = $author; + + if (!Validate::uri($uri)) { + throw new OMB_InvalidParameterException($uri, 'notice', 'omb_notice'); + } + $this->uri = $uri; + + $this->param_array = false; } - $this->param_array = array( - 'omb_notice' => $this->uri, - 'omb_notice_content' => $this->content); + /** + * Return the notice as array + * + * Returns an array which contains the whole notice as array. The array is + * cached and only rebuilt on changes of the notice. + * Empty optional values are not passed. + * + * @access public + * @return array The notice as parameter array + */ + public function asParameters() + { + if ($this->param_array !== false) { + return $this->param_array; + } + + $this->param_array = array( + 'omb_notice' => $this->uri, + 'omb_notice_content' => $this->content); + + if (!is_null($this->url)) + $this->param_array['omb_notice_url'] = $this->url; + + if (!is_null($this->license_url)) + $this->param_array['omb_notice_license'] = $this->license_url; + + if (!is_null($this->seealso_url)) { + $this->param_array['omb_seealso'] = $this->seealso_url; + + /* This is actually a free interpretation of the OMB standard. We + assume that additional seealso parameters are not of any use if + seealso itself is not set. */ + if (!is_null($this->seealso_disposition)) + $this->param_array['omb_seealso_disposition'] = + $this->seealso_disposition; + + if (!is_null($this->seealso_mediatype)) + $this->param_array['omb_seealso_mediatype'] = + $this->seealso_mediatype; - if (!is_null($this->url)) - $this->param_array['omb_notice_url'] = $this->url; + if (!is_null($this->seealso_license_url)) + $this->param_array['omb_seealso_license'] = + $this->seealso_license_url; + } + return $this->param_array; + } - if (!is_null($this->license_url)) - $this->param_array['omb_notice_license'] = $this->license_url; + /** + * Build an OMB_Notice object from array + * + * Builds an OMB_Notice object from the passed parameters array. The array + * MUST provide a notice URI and content. The array fields HAVE TO be named + * according to the OMB standard, i. e. omb_notice_* and omb_seealso_*. + * Values are handled as not passed if the corresponding array fields are + * not set or the empty string. + * + * @param object $author An OMB_Profile object representing the author + * of the notice. + * @param string $parameters An array containing the notice parameters. + * + * @access public + * + * @returns OMB_Notice The built OMB_Notice. + */ + public static function fromParameters($author, $parameters) + { + $notice = new OMB_Notice($author, $parameters['omb_notice'], + $parameters['omb_notice_content']); + + if (isset($parameters['omb_notice_url'])) { + $notice->setURL($parameters['omb_notice_url']); + } + + if (isset($parameters['omb_notice_license'])) { + $notice->setLicenseURL($parameters['omb_notice_license']); + } + + if (isset($parameters['omb_seealso'])) { + $notice->setSeealsoURL($parameters['omb_seealso']); + } + + if (isset($parameters['omb_seealso_disposition'])) { + $notice->setSeealsoDisposition($parameters['omb_seealso_disposition']); + } + + if (isset($parameters['omb_seealso_mediatype'])) { + $notice->setSeealsoMediatype($parameters['omb_seealso_mediatype']); + } + + if (isset($parameters['omb_seealso_license'])) { + $notice->setSeealsoLicenseURL($parameters['omb_seealso_license']); + } + return $notice; + } - if (!is_null($this->seealso_url)) { - $this->param_array['omb_seealso'] = $this->seealso_url; + public function getAuthor() + { + return $this->author; + } - /* This is actually a free interpretation of the OMB standard. We assume - that additional seealso parameters are not of any use if seealso itself - is not set. */ - if (!is_null($this->seealso_disposition)) - $this->param_array['omb_seealso_disposition'] = - $this->seealso_disposition; + public function getIdentifierURI() + { + return $this->uri; + } - if (!is_null($this->seealso_mediatype)) - $this->param_array['omb_seealso_mediatype'] = $this->seealso_mediatype; + public function getContent() + { + return $this->content; + } - if (!is_null($this->seealso_license_url)) - $this->param_array['omb_seealso_license'] = $this->seealso_license_url; + public function getURL() + { + return $this->url; } - return $this->param_array; - } - - /** - * Builds an OMB_Notice object from array - * - * The method builds an OMB_Notice object from the passed parameters array. - * The array MUST provide a notice URI and content. The array fields HAVE TO - * be named according to the OMB standard, i. e. omb_notice_* and - * omb_seealso_*. Values are handled as not passed if the corresponding array - * fields are not set or the empty string. - * - * @param object $author An OMB_Profile object representing the author of - * the notice. - * @param string $parameters An array containing the notice parameters. - * - * @access public - * - * @returns OMB_Notice The built OMB_Notice. - */ - public static function fromParameters($author, $parameters) { - $notice = new OMB_Notice($author, $parameters['omb_notice'], - $parameters['omb_notice_content']); - - if (isset($parameters['omb_notice_url'])) { - $notice->setURL($parameters['omb_notice_url']); + + public function getLicenseURL() + { + return $this->license_url; } - if (isset($parameters['omb_notice_license'])) { - $notice->setLicenseURL($parameters['omb_notice_license']); + public function getSeealsoURL() + { + return $this->seealso_url; } - if (isset($parameters['omb_seealso'])) { - $notice->setSeealsoURL($parameters['omb_seealso']); + public function getSeealsoDisposition() + { + return $this->seealso_disposition; } - if (isset($parameters['omb_seealso_disposition'])) { - $notice->setSeealsoDisposition($parameters['omb_seealso_disposition']); + public function getSeealsoMediatype() + { + return $this->seealso_mediatype; } - if (isset($parameters['omb_seealso_mediatype'])) { - $notice->setSeealsoMediatype($parameters['omb_seealso_mediatype']); + public function getSeealsoLicenseURL() + { + return $this->seealso_license_url; } - if (isset($parameters['omb_seealso_license'])) { - $notice->setSeealsoLicenseURL($parameters['omb_seealso_license']); + public function setURL($url) + { + $this->setVal('notice_url', $url, 'OMB_Helper::validateURL', 'url'); } - return $notice; - } - - public function getAuthor() { - return $this->author; - } - - public function getIdentifierURI() { - return $this->uri; - } - - public function getContent() { - return $this->content; - } - - public function getURL() { - return $this->url; - } - - public function getLicenseURL() { - return $this->license_url; - } - - public function getSeealsoURL() { - return $this->seealso_url; - } - - public function getSeealsoDisposition() { - return $this->seealso_disposition; - } - - public function getSeealsoMediatype() { - return $this->seealso_mediatype; - } - - public function getSeealsoLicenseURL() { - return $this->seealso_license_url; - } - - public function setURL($url) { - if ($url === '') { - $url = null; - } elseif (!OMB_Helper::validateURL($url)) { - throw new OMB_InvalidParameterException($url, 'notice', 'omb_notice_url'); + + public function setLicenseURL($license_url) + { + $this->setVal('license', $license_url, 'OMB_Helper::validateURL', + 'license_url'); + } + + public function setSeealsoURL($seealso_url) + { + $this->setVal('seealso', $seealso_url, 'OMB_Helper::validateURL', + 'seealso_url'); } - $this->url = $url; - $this->param_array = false; - } - - public function setLicenseURL($license_url) { - if ($license_url === '') { - $license_url = null; - } elseif (!OMB_Helper::validateURL($license_url)) { - throw new OMB_InvalidParameterException($license_url, 'notice', - 'omb_notice_license'); + + public function setSeealsoDisposition($seealso_disposition) + { + $this->setVal('seealso_disposition', $seealso_disposition, + 'OMB_Notice::validateDisposition'); } - $this->license_url = $license_url; - $this->param_array = false; - } - - public function setSeealsoURL($seealso_url) { - if ($seealso_url === '') { - $seealso_url = null; - } elseif (!OMB_Helper::validateURL($seealso_url)) { - throw new OMB_InvalidParameterException($seealso_url, 'notice', - 'omb_seealso'); + + protected static function validateDisposition($str) + { + return in_array($str, array('link', 'inline')); } - $this->seealso_url = $seealso_url; - $this->param_array = false; - } - - public function setSeealsoDisposition($seealso_disposition) { - if ($seealso_disposition === '') { - $seealso_disposition = null; - } elseif ($seealso_disposition !== 'link' && $seealso_disposition !== 'inline') { - throw new OMB_InvalidParameterException($seealso_disposition, 'notice', - 'omb_seealso_disposition'); + + public function setSeealsoMediatype($seealso_mediatype) + { + $this->setVal('seealso_mediatype', $seealso_mediatype, + 'OMB_Helper::validateMediaType'); } - $this->seealso_disposition = $seealso_disposition; - $this->param_array = false; - } - - public function setSeealsoMediatype($seealso_mediatype) { - if ($seealso_mediatype === '') { - $seealso_mediatype = null; - } elseif (!OMB_Helper::validateMediaType($seealso_mediatype)) { - throw new OMB_InvalidParameterException($seealso_mediatype, 'notice', - 'omb_seealso_mediatype'); + + public function setSeealsoLicenseURL($seealso_license_url) + { + $this->setVal('seealso_license', $seealso_license_url, + 'OMB_Helper::validateURL', 'seealso_license_url'); } - $this->seealso_mediatype = $seealso_mediatype; - $this->param_array = false; - } - - public function setSeealsoLicenseURL($seealso_license_url) { - if ($seealso_license_url === '') { - $seealso_license_url = null; - } elseif (!OMB_Helper::validateURL($seealso_license_url)) { - throw new OMB_InvalidParameterException($seealso_license_url, 'notice', - 'omb_seealso_license'); + + /** + * Set a value + * + * Updates a value specified by a parameter name and the new value. + * + * @param string $param The parameter name according to OMB + * @param string $value The new value + * @param callback $validator A validator function for the parameter + * @param string $field The name of the field in OMB_Notice + * @param bool $force Whether null values should be checked as well + */ + protected function setVal($param, $value, $validator, $field = null, + $force = false) + { + if (is_null($field)) { + $field = $param; + } + if ($value === '' && !$force) { + $value = null; + } elseif (!call_user_func($validator, $value)) { + throw new OMB_InvalidParameterException($value, 'notice', $param); + } + if ($this->$field !== $value) { + $this->$field = $value; + $this->param_array = false; + } } - $this->seealso_license_url = $seealso_license_url; - $this->param_array = false; - } } ?> diff --git a/extlib/libomb/omb_yadis_xrds.php b/extlib/libomb/omb_yadis_xrds.php index 89921203b..a05477c10 100755 --- a/extlib/libomb/omb_yadis_xrds.php +++ b/extlib/libomb/omb_yadis_xrds.php @@ -1,14 +1,6 @@ <?php - -require_once 'Auth/Yadis/Yadis.php'; -require_once 'unsupportedserviceexception.php'; -require_once 'invalidyadisexception.php'; - /** - * OMB XRDS representation - * - * This class represents a Yadis XRDS file for OMB. It adds some useful methods to - * Auth_Yadis_XRDS. + * This file is part of libomb * * PHP version 5 * @@ -25,172 +17,193 @@ require_once 'invalidyadisexception.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Yadis_XRDS extends Auth_Yadis_XRDS { - - protected $fetcher; - - /** - * Create an instance from URL - * - * Constructs an OMB_Yadis_XRDS object from a given URL. A full Yadis - * discovery is performed on the URL and the XRDS is parsed. - * Throws an OMB_InvalidYadisException when no Yadis is discovered or the - * detected XRDS file is broken. - * - * @param string $url The URL on which Yadis discovery - * should be performed on - * @param Auth_Yadis_HTTPFetcher $fetcher A fetcher used to get HTTP - * resources - * - * @access public - * - * @return OMB_Yadis_XRDS The initialized object representing the given - * resource - **/ - public static function fromYadisURL($url, $fetcher) { - /* Perform a Yadis discovery. */ - $yadis = Auth_Yadis_Yadis::discover($url, $fetcher); - if ($yadis->failed) { - throw new OMB_InvalidYadisException($url); - } - - /* Parse the XRDS file. */ - $xrds = OMB_Yadis_XRDS::parseXRDS($yadis->response_text); - if ($xrds === null) { - throw new OMB_InvalidYadisException($url); - } - $xrds->fetcher = $fetcher; - return $xrds; - } - - /** - * Get a specific service - * - * Returns the Auth_Yadis_Service object corresponding to the given service - * URI. - * Throws an OMB_UnsupportedServiceException if the service is not available. - * - * @param string $service URI specifier of the requested service - * - * @access public - * - * @return Auth_Yadis_Service The object representing the requested service - **/ - public function getService($service) { - $match = $this->services(array( create_function('$s', - "return in_array('$service', \$s->getTypes());"))); - if ($match === array()) { - throw new OMB_UnsupportedServiceException($service); - } - return $match[0]; - } - - /** - * Get a specific XRD - * - * Returns the OMB_Yadis_XRDS object corresponding to the given URI. - * Throws an OMB_UnsupportedServiceException if the XRD is not available. - * Note that getXRD tries to resolve external XRD parts as well. - * - * @param string $uri URI specifier of the requested XRD - * - * @access public - * - * @return OMB_Yadis_XRDS The object representing the requested XRD - **/ - public function getXRD($uri) { - $nexthash = strpos($uri, '#'); - if ($nexthash !== 0) { - if ($nexthash !== false) { - $cururi = substr($uri, 0, $nexthash); - $nexturi = substr($uri, $nexthash); - } - return - OMB_Yadis_XRDS::fromYadisURL($cururi, $this->fetcher)->getXRD($nexturi); - } - - $id = substr($uri, 1); - foreach ($this->allXrdNodes as $node) { - $attrs = $this->parser->attributes($node); - if (array_key_exists('xml:id', $attrs) && $attrs['xml:id'] == $id) { - /* Trick the constructor into thinking this is the only node. */ - $bogus_nodes = array($node); - return new OMB_Yadis_XRDS($this->parser, $bogus_nodes); - } - } - throw new OMB_UnsupportedServiceException($uri); - } - - /** - * Parse an XML string containing a XRDS document - * - * Parse an XML string (XRDS document) and return either a - * Auth_Yadis_XRDS object or null, depending on whether the - * XRDS XML is valid. - * Copy and paste from parent to select correct constructor. - * - * @param string $xml_string An XRDS XML string. - * - * @access public - * - * @return mixed An instance of OMB_Yadis_XRDS or null, - * depending on the validity of $xml_string - **/ - - public function &parseXRDS($xml_string, $extra_ns_map = null) { - $_null = null; - - if (!$xml_string) { - return $_null; - } + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ - $parser = Auth_Yadis_getXMLParser(); - - $ns_map = Auth_Yadis_getNSMap(); - - if ($extra_ns_map && is_array($extra_ns_map)) { - $ns_map = array_merge($ns_map, $extra_ns_map); - } - - if (!($parser && $parser->init($xml_string, $ns_map))) { - return $_null; - } +require_once 'Auth/Yadis/Yadis.php'; +require_once 'unsupportedserviceexception.php'; +require_once 'invalidyadisexception.php'; - // Try to get root element. - $root = $parser->evalXPath('/xrds:XRDS[1]'); - if (!$root) { - return $_null; +/** + * OMB XRDS representation + * + * This class represents a Yadis XRDS file for OMB. It adds some useful methods to + * Auth_Yadis_XRDS. + */ +class OMB_Yadis_XRDS extends Auth_Yadis_XRDS +{ + + protected $fetcher; + + /** + * Create an instance from URL + * + * Constructs an OMB_Yadis_XRDS object from a given URL. A full Yadis + * discovery is performed on the URL and the XRDS is parsed. + * Throws an OMB_InvalidYadisException when no Yadis is discovered or the + * detected XRDS file is broken. + * + * @param string $url The URL on which Yadis discovery + * should be performed on + * @param Auth_Yadis_HTTPFetcher $fetcher A fetcher used to get HTTP + * resources + * + * @access public + * + * @return OMB_Yadis_XRDS The initialized object representing the given + * resource + */ + public static function fromYadisURL($url, $fetcher) + { + /* Perform a Yadis discovery. */ + $yadis = Auth_Yadis_Yadis::discover($url, $fetcher); + if ($yadis->failed) { + throw new OMB_InvalidYadisException($url); + } + + /* Parse the XRDS file. */ + $xrds = OMB_Yadis_XRDS::parseXRDS($yadis->response_text); + if ($xrds === null) { + throw new OMB_InvalidYadisException($url); + } + $xrds->fetcher = $fetcher; + return $xrds; } - if (is_array($root)) { - $root = $root[0]; + /** + * Get a specific service + * + * Returns the Auth_Yadis_Service object corresponding to the given service + * URI. + * Throws an OMB_UnsupportedServiceException if the service is not + * available. + * + * @param string $service URI specifier of the requested service + * + * @access public + * + * @return Auth_Yadis_Service The object representing the requested service + */ + public function getService($service) + { + $match = $this->services(array(create_function('$s', + "return in_array('$service', \$s->getTypes());"))); + if ($match === array()) { + throw new OMB_UnsupportedServiceException($service); + } + return $match[0]; } - $attrs = $parser->attributes($root); - - if (array_key_exists('xmlns:xrd', $attrs) && - $attrs['xmlns:xrd'] != Auth_Yadis_XMLNS_XRDS) { - return $_null; - } else if (array_key_exists('xmlns', $attrs) && - preg_match('/xri/', $attrs['xmlns']) && - $attrs['xmlns'] != Auth_Yadis_XMLNS_XRD_2_0) { - return $_null; + /** + * Get a specific XRD + * + * Returns the OMB_Yadis_XRDS object corresponding to the given URI. + * Throws an OMB_UnsupportedServiceException if the XRD is not available. + * Note that getXRD tries to resolve external XRD parts as well. + * + * @param string $uri URI specifier of the requested XRD + * + * @access public + * + * @return OMB_Yadis_XRDS The object representing the requested XRD + */ + public function getXRD($uri) + { + $nexthash = strpos($uri, '#'); + if ($nexthash === false) { + throw new OMB_InvalidYadisException("‘$uri’ does not specify a " . + 'valid XML node.'); + } + + if ($nexthash > 0) { + $cururi = substr($uri, 0, $nexthash); + $nexturi = substr($uri, $nexthash); + return OMB_Yadis_XRDS::fromYadisURL($cururi, $this->fetcher) + ->getXRD($nexturi); + } + + $id = substr($uri, 1); + foreach ($this->allXrdNodes as $node) { + $attrs = $this->parser->attributes($node); + if (array_key_exists('xml:id', $attrs) && $attrs['xml:id'] == $id) { + /* Trick the constructor into thinking this is the only node. */ + $bogus_nodes = array($node); + return new OMB_Yadis_XRDS($this->parser, $bogus_nodes); + } + } + throw new OMB_UnsupportedServiceException($uri); } - // Get the last XRD node. - $xrd_nodes = $parser->evalXPath('/xrds:XRDS[1]/xrd:XRD'); - - if (!$xrd_nodes) { - return $_null; + /** + * Parse an XML string containing a XRDS document + * + * Parses an XML string (XRDS document) and returns either an + * Auth_Yadis_XRDS object or null, depending on whether the XRDS XML is + * valid. + * This method is just copy and paste from the parent class to select the + * correct constructor. + * + * @param string $xml_string An XRDS XML string + * @param array $extra_ns_map Additional namespace declarations + * + * @access public + * + * @return mixed An instance of OMB_Yadis_XRDS or null, + * depending on the validity of $xml_string + */ + public static function parseXRDS($xml_string, $extra_ns_map = null) + { + $_null = null; + + if (!$xml_string) { + return $_null; + } + + $parser = Auth_Yadis_getXMLParser(); + + $ns_map = Auth_Yadis_getNSMap(); + + if ($extra_ns_map && is_array($extra_ns_map)) { + $ns_map = array_merge($ns_map, $extra_ns_map); + } + + if (!($parser && $parser->init($xml_string, $ns_map))) { + return $_null; + } + + // Try to get root element. + $root = $parser->evalXPath('/xrds:XRDS[1]'); + if (!$root) { + return $_null; + } + + if (is_array($root)) { + $root = $root[0]; + } + + $attrs = $parser->attributes($root); + + if (array_key_exists('xmlns:xrd', $attrs) && + $attrs['xmlns:xrd'] != Auth_Yadis_XMLNS_XRDS) { + return $_null; + } else if (array_key_exists('xmlns', $attrs) && + preg_match('/xri/', $attrs['xmlns']) && + $attrs['xmlns'] != Auth_Yadis_XMLNS_XRD_2_0) { + return $_null; + } + + // Get the last XRD node. + $xrd_nodes = $parser->evalXPath('/xrds:XRDS[1]/xrd:XRD'); + + if (!$xrd_nodes) { + return $_null; + } + + $xrds = new OMB_Yadis_XRDS($parser, $xrd_nodes); + return $xrds; } - - $xrds = new OMB_Yadis_XRDS($parser, $xrd_nodes); - return $xrds; - } } diff --git a/extlib/libomb/plain_xrds_writer.php b/extlib/libomb/plain_xrds_writer.php index b4a6e990b..ba1027b61 100755 --- a/extlib/libomb/plain_xrds_writer.php +++ b/extlib/libomb/plain_xrds_writer.php @@ -1,13 +1,6 @@ <?php - -require_once 'xrds_writer.php'; - /** - * Write OMB-specific XRDS using XMLWriter. - * - * This class writes the XRDS file announcing the OMB server. It uses - * OMB_XMLWriter, which is a subclass of XMLWriter. An instance of - * OMB_Plain_XRDS_Writer should be passed to OMB_Service_Provider->writeXRDS. + * This file is part of libomb * * PHP version 5 * @@ -24,25 +17,45 @@ require_once 'xrds_writer.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +require_once 'xrds_writer.php'; -class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer { - public function writeXRDS($user, $mapper) { - header('Content-Type: application/xrds+xml'); - $xw = new XMLWriter(); - $xw->openURI('php://output'); - $xw->setIndent(true); +/** + * Write OMB-specific XRDS using XMLWriter + * + * This class writes the XRDS file announcing the OMB server. It uses XMLWriter. + * An instance of OMB_Plain_XRDS_Writer should be passed to + * OMB_Service_Provider->writeXRDS. + */ +class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer +{ + /** + * Write XRDS using XMLWriter + * + * Outputs a XRDS document specifying an OMB service. + * + * @param OMB_profile $user The target user for the OMB service + * @param OMB_XRDS_Mapper $mapper An OMB_XRDS_Mapper providing endpoint URLs + */ + public function writeXRDS($user, $mapper) + { + header('Content-Type: application/xrds+xml'); + $xw = new XMLWriter(); + $xw->openURI('php://output'); + $xw->setIndent(true); - $xw->startDocument('1.0', 'UTF-8'); - $this->writeFullElement($xw, 'XRDS', array('xmlns' => 'xri://$xrds'), array( - array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', - 'xml:id' => 'oauth', - 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', - 'version' => '2.0'), array( + $xw->startDocument('1.0', 'UTF-8'); + $this->_writeFullElement($xw, 'XRDS', array('xmlns' => 'xri://$xrds'), array( + array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'xml:id' => 'oauth', + 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', + 'version' => '2.0'), array( array('Type', null, 'xri://$xrds*simple'), array('Service', null, array( array('Type', null, OAUTH_ENDPOINT_REQUEST), @@ -73,10 +86,10 @@ class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer { array('Type', null, OAUTH_HMAC_SHA1) )) )), - array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', - 'xml:id' => 'omb', - 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', - 'version' => '2.0'), array( + array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'xml:id' => 'omb', + 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', + 'version' => '2.0'), array( array('Type', null, 'xri://$xrds*simple'), array('Service', null, array( array('Type', null, OMB_ENDPOINT_POSTNOTICE), @@ -87,8 +100,8 @@ class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer { array('URI', null, $mapper->getURL(OMB_ENDPOINT_UPDATEPROFILE)) )) )), - array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', - 'version' => '2.0'), array( + array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'version' => '2.0'), array( array('Type', null, 'xri://$xrds*simple'), array('Service', null, array( array('Type', null, OAUTH_DISCOVERY), @@ -98,27 +111,40 @@ class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer { array('Type', null, OMB_VERSION), array('URI', null, '#omb') )) - )) - )); - $xw->endDocument(); - $xw->flush(); - } - - public static function writeFullElement($xw, $tag, $attributes, $content) { - $xw->startElement($tag); - if (!is_null($attributes)) { - foreach ($attributes as $name => $value) { - $xw->writeAttribute($name, $value); - } + )))); + $xw->endDocument(); + $xw->flush(); } - if (is_array($content)) { - foreach ($content as $values) { - OMB_Plain_XRDS_Writer::writeFullElement($xw, $values[0], $values[1], $values[2]); - } - } else { - $xw->text($content); + + /** + * Write a complex XML element + * + * Outputs a XML element with attributes and content. + * + * @param XMLWriter $xw The XMLWriter used to output the element + * @param string $tag The tag name + * @param array|null $attributes A map of XML attributes + * @param array|string $content The content of the element; either an + * array of child nodes each specified by a + * three entry-array ($tag, $attributes, + * $content) or a string + */ + private function _writeFullElement($xw, $tag, $attributes, $content) + { + $xw->startElement($tag); + if (!is_null($attributes)) { + foreach ($attributes as $name => $value) { + $xw->writeAttribute($name, $value); + } + } + if (is_array($content)) { + foreach ($content as $val) { + $this->_writeFullElement($xw, $val[0], $val[1], $val[2]); + } + } else { + $xw->text($content); + } + $xw->fullEndElement(); } - $xw->fullEndElement(); - } } ?> diff --git a/extlib/libomb/profile.php b/extlib/libomb/profile.php index 13314d3e8..d732e10d7 100755 --- a/extlib/libomb/profile.php +++ b/extlib/libomb/profile.php @@ -1,15 +1,6 @@ <?php -require_once 'invalidparameterexception.php'; -require_once 'Validate.php'; -require_once 'helper.php'; - /** - * OMB profile representation - * - * This class represents an OMB profile. - * - * Do not call the setters with null values. Instead, if you want to delete a - * field, pass an empty string. The getters will return null for empty fields. + * This file is part of libomb * * PHP version 5 * @@ -26,292 +17,329 @@ require_once 'helper.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Profile { - protected $identifier_uri; - protected $profile_url; - protected $nickname; - protected $license_url; - protected $fullname; - protected $homepage; - protected $bio; - protected $location; - protected $avatar_url; - - /* The profile as OMB param array. Cached and rebuild on usage. - false while outdated. */ - protected $param_array; - - /** - * Constructor for OMB_Profile - * - * Initializes the OMB_Profile object with an identifier uri. - * - * @param string $identifier_uri The profile URI as defined by the OMB. A unique - * and unchanging identifier for a profile. - * - * @access public - */ - public function __construct($identifier_uri) { - if (!Validate::uri($identifier_uri)) { - throw new OMB_InvalidParameterException($identifier_uri, 'profile', + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +require_once 'invalidparameterexception.php'; +require_once 'Validate.php'; +require_once 'helper.php'; + +/** + * OMB profile representation + * + * This class represents an OMB profile. + * + * Do not call the setters with null values. Instead, if you want to delete a + * field, pass an empty string. The getters will return null for empty fields. + */ +class OMB_Profile +{ + protected $identifier_uri; + protected $profile_url; + protected $nickname; + protected $license_url; + protected $fullname; + protected $homepage; + protected $bio; + protected $location; + protected $avatar_url; + + /* The profile as OMB param array. Cached and rebuild on usage. + false while outdated. */ + protected $param_array; + + /** + * Constructor for OMB_Profile + * + * Initializes the OMB_Profile object with an identifier uri. + * + * @param string $identifier_uri The profile URI as defined by the OMB; + * A unique and never changing identifier for + * a profile + * + * @access public + */ + public function __construct($identifier_uri) + { + if (!Validate::uri($identifier_uri)) { + throw new OMB_InvalidParameterException($identifier_uri, 'profile', 'omb_listenee or omb_listener'); + } + $this->identifier_uri = $identifier_uri; + $this->param_array = false; } - $this->identifier_uri = $identifier_uri; - $this->param_array = false; - } - - /** - * Returns the profile as array - * - * The method returns an array which contains the whole profile as array. The - * array is cached and only rebuilt on changes of the profile. - * - * @param bool $force_all Specifies whether empty fields should be added to - * the array as well. This is neccessary to clear - * fields via updateProfile. - * - * @param string $prefix The common prefix to the key for all parameters. - * - * @access public - * - * @return array The profile as parameter array - */ - public function asParameters($prefix, $force_all = false) { - if ($this->param_array === false) { - $this->param_array = array('' => $this->identifier_uri); - - if ($force_all || !is_null($this->profile_url)) { - $this->param_array['_profile'] = $this->profile_url; - } - - if ($force_all || !is_null($this->homepage)) { - $this->param_array['_homepage'] = $this->homepage; - } - - if ($force_all || !is_null($this->nickname)) { - $this->param_array['_nickname'] = $this->nickname; - } - - if ($force_all || !is_null($this->license_url)) { - $this->param_array['_license'] = $this->license_url; - } - - if ($force_all || !is_null($this->fullname)) { - $this->param_array['_fullname'] = $this->fullname; - } - - if ($force_all || !is_null($this->bio)) { - $this->param_array['_bio'] = $this->bio; - } - - if ($force_all || !is_null($this->location)) { - $this->param_array['_location'] = $this->location; - } - - if ($force_all || !is_null($this->avatar_url)) { - $this->param_array['_avatar'] = $this->avatar_url; - } - } - $ret = array(); - foreach ($this->param_array as $k => $v) { - $ret[$prefix . $k] = $v; - } - return $ret; - } - - /** - * Builds an OMB_Profile object from array - * - * The method builds an OMB_Profile object from the passed parameters array. The - * array MUST provide a profile URI. The array fields HAVE TO be named according - * to the OMB standard. The prefix (omb_listener or omb_listenee) is passed as a - * parameter. - * - * @param string $parameters An array containing the profile parameters. - * @param string $prefix The common prefix of the profile parameter keys. - * - * @access public - * - * @returns OMB_Profile The built OMB_Profile. - */ - public static function fromParameters($parameters, $prefix) { - if (!isset($parameters[$prefix])) { - throw new OMB_InvalidParameterException('', 'profile', $prefix); + /** + * Return the profile as array + * + * Returns an array which contains the whole profile as array. + * The array is cached and only rebuilt on changes of the profile. + * + * @param string $prefix The common prefix to the key for all parameters + * @param bool $force_all Specifies whether empty fields should be added + * to the array as well; This is necessary to + * clear fields via updateProfile + * + * @access public + * + * @return array The profile as parameter array + */ + public function asParameters($prefix, $force_all = false) + { + if ($this->param_array === false) { + $this->param_array = array('' => $this->identifier_uri); + + if ($force_all || !is_null($this->profile_url)) { + $this->param_array['_profile'] = $this->profile_url; + } + + if ($force_all || !is_null($this->homepage)) { + $this->param_array['_homepage'] = $this->homepage; + } + + if ($force_all || !is_null($this->nickname)) { + $this->param_array['_nickname'] = $this->nickname; + } + + if ($force_all || !is_null($this->license_url)) { + $this->param_array['_license'] = $this->license_url; + } + + if ($force_all || !is_null($this->fullname)) { + $this->param_array['_fullname'] = $this->fullname; + } + + if ($force_all || !is_null($this->bio)) { + $this->param_array['_bio'] = $this->bio; + } + + if ($force_all || !is_null($this->location)) { + $this->param_array['_location'] = $this->location; + } + + if ($force_all || !is_null($this->avatar_url)) { + $this->param_array['_avatar'] = $this->avatar_url; + } + + } + $ret = array(); + foreach ($this->param_array as $k => $v) { + $ret[$prefix . $k] = $v; + } + return $ret; } - $profile = new OMB_Profile($parameters[$prefix]); - $profile->updateFromParameters($parameters, $prefix); - return $profile; - } - - /** - * Update from array - * - * Updates from the passed parameters array. The array does not have to - * provide a profile URI. The array fields HAVE TO be named according to the - * OMB standard. The prefix (omb_listener or omb_listenee) is passed as a - * parameter. - * - * @param string $parameters An array containing the profile parameters. - * @param string $prefix The common prefix of the profile parameter keys. - * - * @access public - */ - public function updateFromParameters($parameters, $prefix) { - if (isset($parameters[$prefix.'_profile'])) { - $this->setProfileURL($parameters[$prefix.'_profile']); + /** + * Build an OMB_Profile object from array + * + * Builds an OMB_Profile object from the passed parameters array. The + * array MUST provide a profile URI. The array fields HAVE TO be named + * according to the OMB standard. The prefix (omb_listener or omb_listenee) + * is passed as a parameter. + * + * @param string $parameters An array containing the profile parameters + * @param string $prefix The common prefix of the profile parameter keys + * + * @access public + * + * @returns OMB_Profile The built OMB_Profile + */ + public static function fromParameters($parameters, $prefix) + { + if (!isset($parameters[$prefix])) { + throw new OMB_InvalidParameterException('', 'profile', $prefix); + } + + $profile = new OMB_Profile($parameters[$prefix]); + $profile->updateFromParameters($parameters, $prefix); + return $profile; } - if (isset($parameters[$prefix.'_license'])) { - $this->setLicenseURL($parameters[$prefix.'_license']); + /** + * Update from array + * + * Updates from the passed parameters array. The array does not have to + * provide a profile URI. The array fields HAVE TO be named according to the + * OMB standard. The prefix (omb_listener or omb_listenee) is passed as a + * parameter. + * + * @param string $parameters An array containing the profile parameters + * @param string $prefix The common prefix of the profile parameter keys + * + * @access public + */ + public function updateFromParameters($parameters, $prefix) + { + if (isset($parameters[$prefix.'_profile'])) { + $this->setProfileURL($parameters[$prefix.'_profile']); + } + + if (isset($parameters[$prefix.'_license'])) { + $this->setLicenseURL($parameters[$prefix.'_license']); + } + + if (isset($parameters[$prefix.'_nickname'])) { + $this->setNickname($parameters[$prefix.'_nickname']); + } + + if (isset($parameters[$prefix.'_fullname'])) { + $this->setFullname($parameters[$prefix.'_fullname']); + } + + if (isset($parameters[$prefix.'_homepage'])) { + $this->setHomepage($parameters[$prefix.'_homepage']); + } + + if (isset($parameters[$prefix.'_bio'])) { + $this->setBio($parameters[$prefix.'_bio']); + } + + if (isset($parameters[$prefix.'_location'])) { + $this->setLocation($parameters[$prefix.'_location']); + } + + if (isset($parameters[$prefix.'_avatar'])) { + $this->setAvatarURL($parameters[$prefix.'_avatar']); + } } - if (isset($parameters[$prefix.'_nickname'])) { - $this->setNickname($parameters[$prefix.'_nickname']); + public function getIdentifierURI() + { + return $this->identifier_uri; } - if (isset($parameters[$prefix.'_fullname'])) { - $this->setFullname($parameters[$prefix.'_fullname']); + public function getProfileURL() + { + return $this->profile_url; } - if (isset($parameters[$prefix.'_homepage'])) { - $this->setHomepage($parameters[$prefix.'_homepage']); + public function getHomepage() + { + return $this->homepage; } - if (isset($parameters[$prefix.'_bio'])) { - $this->setBio($parameters[$prefix.'_bio']); + public function getNickname() + { + return $this->nickname; } - if (isset($parameters[$prefix.'_location'])) { - $this->setLocation($parameters[$prefix.'_location']); + public function getLicenseURL() + { + return $this->license_url; } - if (isset($parameters[$prefix.'_avatar'])) { - $this->setAvatarURL($parameters[$prefix.'_avatar']); + public function getFullname() + { + return $this->fullname; } - } - - public function getIdentifierURI() { - return $this->identifier_uri; - } - public function getProfileURL() { - return $this->profile_url; - } - - public function getHomepage() { - return $this->homepage; - } - - public function getNickname() { - return $this->nickname; - } - - public function getLicenseURL() { - return $this->license_url; - } + public function getBio() + { + return $this->bio; + } - public function getFullname() { - return $this->fullname; - } + public function getLocation() + { + return $this->location; + } - public function getBio() { - return $this->bio; - } + public function getAvatarURL() + { + return $this->avatar_url; + } - public function getLocation() { - return $this->location; - } + public function setProfileURL($profile_url) + { + $this->setVal('profile', $profile_url, 'OMB_Helper::validateURL', + 'profile_url'); + } - public function getAvatarURL() { - return $this->avatar_url; - } + public function setNickname($nickname) + { + $this->setVal('nickname', $nickname, 'OMB_Profile::validateNickname', + 'nickname', true); + } - public function setProfileURL($profile_url) { - if (!OMB_Helper::validateURL($profile_url)) { - throw new OMB_InvalidParameterException($profile_url, 'profile', - 'omb_listenee_profile or omb_listener_profile'); + public function setLicenseURL($license_url) + { + $this->setVal('license', $license_url, 'OMB_Helper::validateURL', + 'license_url'); } - $this->profile_url = $profile_url; - $this->param_array = false; - } - - public function setNickname($nickname) { - if (!Validate::string($nickname, - array('min_length' => 1, - 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA))) { - throw new OMB_InvalidParameterException($nickname, 'profile', 'nickname'); + + public function setFullname($fullname) + { + $this->setVal('fullname', $fullname, 'OMB_Profile::validate255'); } - $this->nickname = $nickname; - $this->param_array = false; - } + public function setHomepage($homepage) + { + $this->setVal('homepage', $homepage, 'OMB_Helper::validateURL'); + } - public function setLicenseURL($license_url) { - if (!OMB_Helper::validateURL($license_url)) { - throw new OMB_InvalidParameterException($license_url, 'profile', - 'omb_listenee_license or omb_listener_license'); + public function setBio($bio) + { + $this->setVal('bio', $bio, 'OMB_Profile::validate140'); } - $this->license_url = $license_url; - $this->param_array = false; - } - - public function setFullname($fullname) { - if ($fullname === '') { - $fullname = null; - } elseif (!Validate::string($fullname, array('max_length' => 255))) { - throw new OMB_InvalidParameterException($fullname, 'profile', 'fullname'); + + public function setLocation($location) + { + $this->setVal('location', $location, 'OMB_Profile::validate255'); } - $this->fullname = $fullname; - $this->param_array = false; - } - public function setHomepage($homepage) { - if ($homepage === '') { - $homepage = null; + public function setAvatarURL($avatar_url) + { + $this->setVal('avatar', $avatar_url, 'OMB_Helper::validateURL', + 'avatar_url'); } - $this->homepage = $homepage; - $this->param_array = false; - } - - public function setBio($bio) { - if ($bio === '') { - $bio = null; - } elseif (!Validate::string($bio, array('max_length' => 140))) { - throw new OMB_InvalidParameterException($bio, 'profile', 'fullname'); + + protected static function validate255($str) + { + return Validate::string($str, array('max_length' => 255)); } - $this->bio = $bio; - $this->param_array = false; - } - - public function setLocation($location) { - if ($location === '') { - $location = null; - } elseif (!Validate::string($location, array('max_length' => 255))) { - throw new OMB_InvalidParameterException($location, 'profile', 'fullname'); + + protected static function validate140($str) + { + return Validate::string($str, array('max_length' => 140)); } - $this->location = $location; - $this->param_array = false; - } - - public function setAvatarURL($avatar_url) { - if ($avatar_url === '') { - $avatar_url = null; - } elseif (!OMB_Helper::validateURL($avatar_url)) { - throw new OMB_InvalidParameterException($avatar_url, 'profile', - 'omb_listenee_avatar or omb_listener_avatar'); + + protected static function validateNickname($str) + { + return Validate::string($str, + array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA)); } - $this->avatar_url = $avatar_url; - $this->param_array = false; - } + /** + * Set a value + * + * Updates a value specified by a parameter name and the new value. + * + * @param string $param The parameter name according to OMB + * @param string $value The new value + * @param callback $validator A validator function for the parameter + * @param string $field The name of the field in OMB_Profile + * @param bool $force Whether null values should be checked as well + */ + protected function setVal($param, $value, $validator, $field = null, + $force = false) + { + if (is_null($field)) { + $field = $param; + } + if ($value === '' && !$force) { + $value = null; + } elseif (!call_user_func($validator, $value)) { + throw new OMB_InvalidParameterException($value, 'profile', $param); + } + if ($this->$field !== $value) { + $this->$field = $value; + $this->param_array = false; + } + } } ?> diff --git a/extlib/libomb/remoteserviceexception.php b/extlib/libomb/remoteserviceexception.php index 374d15973..f8341e82b 100755 --- a/extlib/libomb/remoteserviceexception.php +++ b/extlib/libomb/remoteserviceexception.php @@ -1,9 +1,6 @@ <?php /** - * Exception stating that the remote service had a failure - * - * This exception is raised when a remote service failed to return a valid - * response to a request or send a valid request. + * This file is part of libomb * * PHP version 5 * @@ -20,23 +17,57 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ -class OMB_RemoteServiceException extends Exception { - public static function fromYadis($request_uri, $result) { - if ($result->status == 200) { - $err = 'Got wrong response ' . $result->body; - } else { - $err = 'Got error code ' . $result->status . ' with response ' . $result->body; + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +/** + * Exception stating that the remote service had a failure + * + * This exception is raised when a remote service failed to return a valid + * response to a request or send a valid request. + */ +class OMB_RemoteServiceException extends Exception +{ + /** + * Create exception from Yadis response + * + * Creates an exception from a passed yadis result. + * + * @param string $request_uri The target URI for the failed + * request + * @param Auth_Yadis_HTTPResponse $result The result of the failed + * request + * + * @return OMB_RemoteServiceException A new exception + */ + public static function fromYadis($request_uri, $result) + { + if ($result->status == 200) { + $err = 'Got wrong response ' . $result->body; + } else { + $err = 'Got error code ' . $result->status . ' with response ' . + $result->body; + } + return OMB_RemoteServiceException::forRequest($request_uri, $err); } - return new OMB_RemoteServiceException($request_uri . ': ' . $err); - } - public static function forRequest($action_uri, $failure) { - return new OMB_RemoteServiceException("Handler for $action_uri: " . $failure); - } + /** + * Create exception for a call to a resource + * + * Creates an exception for a given error message and target URI. + * + * @param string $action_uri The target URI for the failed request + * @param string $failure An error message + * + * @return OMB_RemoteServiceException A new exception + */ + public static function forRequest($action_uri, $failure) + { + return new OMB_RemoteServiceException("Handler for $action_uri: $failure"); + } } ?> diff --git a/extlib/libomb/service_consumer.php b/extlib/libomb/service_consumer.php index 273fd052e..33ebccc65 100755 --- a/extlib/libomb/service_consumer.php +++ b/extlib/libomb/service_consumer.php @@ -1,19 +1,6 @@ <?php - -require_once 'constants.php'; -require_once 'Validate.php'; -require_once 'Auth/Yadis/Yadis.php'; -require_once 'OAuth.php'; -require_once 'unsupportedserviceexception.php'; -require_once 'remoteserviceexception.php'; -require_once 'omb_yadis_xrds.php'; -require_once 'helper.php'; - /** - * OMB service representation - * - * This class represents a complete remote OMB service. It provides discovery - * and execution of the service’s methods. + * This file is part of libomb * * PHP version 5 * @@ -30,401 +17,445 @@ require_once 'helper.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Service_Consumer { - protected $url; /* The service URL */ - protected $services; /* An array of strings mapping service URI to - service URL */ - - protected $token; /* An OAuthToken */ - - protected $listener_uri; /* The URI identifying the listener, i. e. the - remote user. */ - - protected $listenee_uri; /* The URI identifying the listenee, i. e. the - local user during an auth request. */ - - /** - * According to OAuth Core 1.0, an user authorization request is no full-blown - * OAuth request. nonce, timestamp, consumer_key and signature are not needed - * in this step. See http://laconi.ca/trac/ticket/827 for more informations. - * - * Since Laconica up to version 0.7.2 performs a full OAuth request check, a - * correct request would fail. - **/ - public $performLegacyAuthRequest = true; - - /* Helper stuff we are going to need. */ - protected $fetcher; - protected $oauth_consumer; - protected $datastore; - - /** - * Constructor for OMB_Service_Consumer - * - * Initializes an OMB_Service_Consumer object representing the OMB service - * specified by $service_url. Performs a complete service discovery using - * Yadis. - * Throws OMB_UnsupportedServiceException if XRDS file does not specify a - * complete OMB service. - * - * @param string $service_url The URL of the service - * @param string $consumer_url An URL representing the consumer - * @param OMB_Datastore $datastore An instance of a class implementing - * OMB_Datastore - * - * @access public - **/ - public function __construct ($service_url, $consumer_url, $datastore) { - $this->url = $service_url; - $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); - $this->datastore = $datastore; - $this->oauth_consumer = new OAuthConsumer($consumer_url, ''); - - $xrds = OMB_Yadis_XRDS::fromYadisURL($service_url, $this->fetcher); - - /* Detect our services. This performs a validation as well, since - getService und getXRD throw exceptions on failure. */ - $this->services = array(); - - foreach (array(OAUTH_DISCOVERY => OMB_Helper::$OAUTH_SERVICES, - OMB_VERSION => OMB_Helper::$OMB_SERVICES) - as $service_root => $targetservices) { - $uris = $xrds->getService($service_root)->getURIs(); - $xrd = $xrds->getXRD($uris[0]); - foreach ($targetservices as $targetservice) { - $yadis_service = $xrd->getService($targetservice); - if ($targetservice == OAUTH_ENDPOINT_REQUEST) { - $localid = $yadis_service->getElements('xrd:LocalID'); - $this->listener_uri = $yadis_service->parser->content($localid[0]); + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +require_once 'Validate.php'; +require_once 'Auth/Yadis/Yadis.php'; +require_once 'OAuth.php'; +require_once 'constants.php'; +require_once 'helper.php'; +require_once 'omb_yadis_xrds.php'; +require_once 'profile.php'; +require_once 'remoteserviceexception.php'; +require_once 'unsupportedserviceexception.php'; + +/** + * OMB service representation + * + * This class represents a complete remote OMB service. It provides discovery + * and execution of the service’s methods. + */ +class OMB_Service_Consumer +{ + protected $url; /* The service URL */ + protected $services; /* An array of strings mapping service URI to + service URL */ + + protected $token; /* An OAuthToken */ + + protected $listener_uri; /* The URI identifying the listener, i. e. the + remote user. */ + + protected $listenee_uri; /* The URI identifying the listenee, i. e. the + local user during an auth request. */ + + /** + * According to OAuth Core 1.0, an user authorization request is no + * full-blown OAuth request. nonce, timestamp, consumer_key and signature + * are not needed in this step. See http://laconi.ca/trac/ticket/827 for + * more informations. + * + * Since Laconica up to version 0.7.2 performs a full OAuth request check, a + * correct request would fail. + */ + public $performLegacyAuthRequest = true; + + /* Helper stuff we are going to need. */ + protected $fetcher; + protected $oauth_consumer; + protected $datastore; + + /** + * Constructor for OMB_Service_Consumer + * + * Initializes an OMB_Service_Consumer object representing the OMB service + * specified by $service_url. Performs a complete service discovery using + * Yadis. + * Throws OMB_UnsupportedServiceException if XRDS file does not specify a + * complete OMB service. + * + * @param string $service_url The URL of the service + * @param string $consumer_url An URL representing the consumer + * @param OMB_Datastore $datastore An instance of a class implementing + * OMB_Datastore + * + * @access public + */ + public function __construct ($service_url, $consumer_url, $datastore) + { + $this->url = $service_url; + $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + $this->datastore = $datastore; + $this->oauth_consumer = new OAuthConsumer($consumer_url, ''); + + $xrds = OMB_Yadis_XRDS::fromYadisURL($service_url, $this->fetcher); + + /* Detect our services. This performs a validation as well, since + getService und getXRD throw exceptions on failure. */ + $this->services = array(); + + foreach (array(OAUTH_DISCOVERY => OMB_Helper::$OAUTH_SERVICES, + OMB_VERSION => OMB_Helper::$OMB_SERVICES) + as $service_root => $targetservices) { + $uris = $xrds->getService($service_root)->getURIs(); + $xrd = $xrds->getXRD($uris[0]); + foreach ($targetservices as $targetservice) { + $yadis_service = $xrd->getService($targetservice); + if ($targetservice == OAUTH_ENDPOINT_REQUEST) { + $localid = + $yadis_service->getElements('xrd:LocalID'); + $this->listener_uri = + $yadis_service->parser->content($localid[0]); + } + $uris = $yadis_service->getURIs(); + $this->services[$targetservice] = $uris[0]; + } } - $uris = $yadis_service->getURIs(); - $this->services[$targetservice] = $uris[0]; - } } - } - - /** - * Get the handler URI for a service - * - * Returns the URI the remote web service has specified for the given - * service. - * - * @param string $service The URI identifying the service - * - * @access public - * - * @return string The service handler URI - **/ - public function getServiceURI($service) { - return $this->services[$service]; - } - - /** - * Get the remote user’s URI - * - * Returns the URI of the remote user, i. e. the listener. - * - * @access public - * - * @return string The remote user’s URI - **/ - public function getRemoteUserURI() { - return $this->listener_uri; - } - - /** - * Get the listenee’s URI - * - * Returns the URI of the user being subscribed to, i. e. the local user. - * - * @access public - * - * @return string The local user’s URI - **/ - public function getListeneeURI() { - return $this->listenee_uri; - } - - /** - * Request a request token - * - * Performs a token request on the service. Returns an OAuthToken on success. - * Throws an exception if the request fails. - * - * @access public - * - * @return OAuthToken An unauthorized request token - **/ - public function requestToken() { - /* Set the token to null just in case the user called setToken. */ - $this->token = null; - - $result = $this->performAction(OAUTH_ENDPOINT_REQUEST, - array('omb_listener' => $this->listener_uri)); - if ($result->status != 200) { - throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST, - $result); + + /** + * Get the handler URI for a service + * + * Returns the URI the remote web service has specified for the given + * service. + * + * @param string $service The URI identifying the service + * + * @access public + * + * @return string The service handler URI + */ + public function getServiceURI($service) + { + return $this->services[$service]; } - parse_str($result->body, $return); - if (!isset($return['oauth_token']) || !isset($return['oauth_token_secret'])) { - throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST, - $result); + + /** + * Get the remote user’s URI + * + * Returns the URI of the remote user, i. e. the listener. + * + * @access public + * + * @return string The remote user’s URI + */ + public function getRemoteUserURI() + { + return $this->listener_uri; } - $this->setToken($return['oauth_token'], $return['oauth_token_secret']); - return $this->token; - } - - /** - * - * Request authorization - * - * Returns an URL which equals to an authorization request. The end user - * should be redirected to this location to perform authorization. - * The $finish_url should be a local resource which invokes - * OMB_Consumer::finishAuthorization on request. - * - * @param OMB_Profile $profile An OMB_Profile object representing the - * soon-to-be subscribed (i. e. local) user - * @param string $finish_url Target location after successful - * authorization - * - * @access public - * - * @return string An URL representing an authorization request - **/ - public function requestAuthorization($profile, $finish_url) { - if ($this->performLegacyAuthRequest) { - $params = $profile->asParameters('omb_listenee', false); - $params['omb_listener'] = $this->listener_uri; - $params['oauth_callback'] = $finish_url; - - $url = $this->prepareAction(OAUTH_ENDPOINT_AUTHORIZE, $params, 'GET')->to_url(); - } else { - - $params = array( - 'oauth_callback' => $finish_url, - 'oauth_token' => $this->token->key, - 'omb_version' => OMB_VERSION, - 'omb_listener' => $this->listener_uri); - - $params = array_merge($profile->asParameters('omb_listenee', false). $params); - - /* Build result URL. */ - $url = $this->services[OAUTH_ENDPOINT_AUTHORIZE]; - $url .= (strrpos($url, '?') === false ? '?' : '&'); - foreach ($params as $k => $v) { - $url .= OAuthUtil::urlencode_rfc3986($k) . '=' . OAuthUtil::urlencode_rfc3986($v) . '&'; - } + + /** + * Get the listenee’s URI + * + * Returns the URI of the user being subscribed to, i. e. the local user. + * + * @access public + * + * @return string The local user’s URI + */ + public function getListeneeURI() + { + return $this->listenee_uri; } - $this->listenee_uri = $profile->getIdentifierURI(); - - return $url; - } - - /** - * Finish authorization - * - * Finish the subscription process by converting the received and authorized - * request token into an access token. After that, the subscriber’s profile - * and the subscription are stored in the database. - * Expects an OAuthRequest in query parameters. - * Throws exceptions on failure. - * - * @access public - **/ - public function finishAuthorization() { - OMB_Helper::removeMagicQuotesFromRequest(); - $req = OAuthRequest::from_request(); - if ($req->get_parameter('oauth_token') != - $this->token->key) { - /* That’s not the token I wanted to get authorized. */ - throw new OAuthException('The authorized token does not equal the ' . - 'submitted token.'); + /** + * Request a request token + * + * Performs a token request on the service. Returns an OAuthToken on success. + * Throws an exception if the request fails. + * + * @access public + * + * @return OAuthToken An unauthorized request token + */ + public function requestToken() + { + /* Set the token to null just in case the user called setToken. */ + $this->token = null; + + $result = $this->performAction(OAUTH_ENDPOINT_REQUEST, + array('omb_listener' => $this->listener_uri)); + if ($result->status != 200) { + throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST, + $result); + } + parse_str($result->body, $return); + if (!isset($return['oauth_token']) || + !isset($return['oauth_token_secret'])) { + throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST, + $result); + } + $this->setToken($return['oauth_token'], $return['oauth_token_secret']); + return $this->token; } - if ($req->get_parameter('omb_version') != OMB_VERSION) { - throw new OMB_RemoteServiceException('The remote service uses an ' . - 'unsupported OMB version'); + /** + * Request authorization + * + * Returns an URL which equals to an authorization request. The end user + * should be redirected to this location to perform authorization. + * The $finish_url should be a local resource which invokes + * OMB_Consumer::finishAuthorization on request. + * + * @param OMB_Profile $profile An OMB_Profile object representing the + * soon-to-be subscribed (i. e. local) user + * @param string $finish_url Target location after successful + * authorization + * + * @access public + * + * @return string An URL representing an authorization request + */ + public function requestAuthorization($profile, $finish_url) + { + if ($this->performLegacyAuthRequest) { + $params = $profile->asParameters('omb_listenee', + false); + $params['omb_listener'] = $this->listener_uri; + $params['oauth_callback'] = $finish_url; + + $url = $this->prepareAction(OAUTH_ENDPOINT_AUTHORIZE, $params, + 'GET')->to_url(); + } else { + $params = array('oauth_callback' => $finish_url, + 'oauth_token' => $this->token->key, + 'omb_version' => OMB_VERSION, + 'omb_listener' => $this->listener_uri); + + $params = array_merge($profile->asParameters('omb_listenee', false), + $params); + + /* Build result URL. */ + $url = $this->services[OAUTH_ENDPOINT_AUTHORIZE] . + (strrpos($url, '?') === false ? '?' : '&'); + foreach ($params as $k => $v) { + $url .= OAuthUtil::urlencode_rfc3986($k) . '=' . + OAuthUtil::urlencode_rfc3986($v) . '&'; + } + } + + $this->listenee_uri = $profile->getIdentifierURI(); + + return $url; } - /* Construct the profile to validate it. */ + /** + * Finish authorization + * + * Finish the subscription process by converting the received and authorized + * request token into an access token. After that, the subscriber’s profile + * and the subscription are stored in the database. + * Expects an OAuthRequest in query parameters. + * Throws exceptions on failure. + * + * @access public + */ + public function finishAuthorization() + { + OMB_Helper::removeMagicQuotesFromRequest(); + $req = OAuthRequest::from_request(); + if ($req->get_parameter('oauth_token') != $this->token->key) { + /* That’s not the token I wanted to get authorized. */ + throw new OAuthException('The authorized token does not equal ' . + 'the submitted token.'); + } + + if ($req->get_parameter('omb_version') != OMB_VERSION) { + throw new OMB_RemoteServiceException('The remote service uses an ' . + 'unsupported OMB version'); + } + + /* Construct the profile to validate it. */ + + /* Fix OMB bug. Listener URI is not passed. */ + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $params = $_POST; + } else { + $params = $_GET; + } + $params['omb_listener'] = $this->listener_uri; + + $listener = OMB_Profile::fromParameters($params, 'omb_listener'); - /* Fix OMB bug. Listener URI is not passed. */ - if ($_SERVER['REQUEST_METHOD'] == 'POST') { - $params = $_POST; - } else { - $params = $_GET; + /* Ask the remote service to convert the authorized request token into + an access token. */ + + $result = $this->performAction(OAUTH_ENDPOINT_ACCESS, array()); + if ($result->status != 200) { + throw new OAuthException('Could not get access token'); + } + + parse_str($result->body, $return); + if (!isset($return['oauth_token']) || + !isset($return['oauth_token_secret'])) { + throw new OAuthException('Could not get access token'); + } + $this->setToken($return['oauth_token'], $return['oauth_token_secret']); + + /* Subscription is finished and valid. Now store the new subscriber and + the subscription in the database. */ + + $this->datastore->saveProfile($listener); + $this->datastore->saveSubscription($this->listener_uri, + $this->listenee_uri, + $this->token); + } + + /** + * Return the URI identifying the listener + * + * Returns the URI for the OMB user who tries to subscribe or already has + * subscribed our user. This method is a workaround for a serious OMB flaw: + * The Listener URI is not passed in the finishauthorization call. + * + * @access public + * + * @return string the listener’s URI + */ + public function getListenerURI() + { + return $this->listener_uri; } - $params['omb_listener'] = $this->listener_uri; - require_once 'profile.php'; - $listener = OMB_Profile::fromParameters($params, 'omb_listener'); + /** + * Inform the service about a profile update + * + * Sends an updated profile to the service. + * + * @param OMB_Profile $profile The profile that has changed + * + * @access public + */ + public function updateProfile($profile) + { + $params = $profile->asParameters('omb_listenee', true); + $this->performOMBAction(OMB_ENDPOINT_UPDATEPROFILE, $params, + $profile->getIdentifierURI()); + } - /* Ask the remote service to convert the authorized request token into an - access token. */ + /** + * Inform the service about a new notice + * + * Sends a notice to the service. + * + * @param OMB_Notice $notice The notice + * + * @access public + */ + public function postNotice($notice) + { + $params = $notice->asParameters(); + $params['omb_listenee'] = $notice->getAuthor()->getIdentifierURI(); + $this->performOMBAction(OMB_ENDPOINT_POSTNOTICE, $params, + $params['omb_listenee']); + } - $result = $this->performAction(OAUTH_ENDPOINT_ACCESS, array()); - if ($result->status != 200) { - throw new OAuthException('Could not get access token'); + /** + * Set the token member variable + * + * Initializes the token based on given token and secret token. + * + * @param string $token The token + * @param string $secret The secret token + * + * @access public + */ + public function setToken($token, $secret) + { + $this->token = new OAuthToken($token, $secret); } - parse_str($result->body, $return); - if (!isset($return['oauth_token']) || !isset($return['oauth_token_secret'])) { - throw new OAuthException('Could not get access token'); + /** + * Prepare an OAuthRequest object + * + * Creates an OAuthRequest object mapping the request specified by the + * parameters. + * + * @param string $action_uri The URI specifying the target service + * @param array $params Additional parameters for the service call + * @param string $method The HTTP method used to call the service + * ('POST' or 'GET', usually) + * + * @access protected + * + * @return OAuthRequest the prepared request + */ + protected function prepareAction($action_uri, $params, $method) + { + $url = $this->services[$action_uri]; + + $url_params = array(); + parse_str(parse_url($url, PHP_URL_QUERY), $url_params); + + /* Add OMB version. */ + $url_params['omb_version'] = OMB_VERSION; + + /* Add user-defined parameters. */ + $url_params = array_merge($url_params, $params); + + $req = OAuthRequest::from_consumer_and_token($this->oauth_consumer, + $this->token, $method, + $url, $url_params); + + /* Sign the request. */ + $req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), + $this->oauth_consumer, $this->token); + + return $req; } - $this->setToken($return['oauth_token'], $return['oauth_token_secret']); - - /* Subscription is finished and valid. Now store the new subscriber and the - subscription in the database. */ - - $this->datastore->saveProfile($listener); - $this->datastore->saveSubscription($this->listener_uri, - $this->listenee_uri, - $this->token); - } - - /** - * Return the URI identifying the listener - * - * Returns the URI for the OMB user who tries to subscribe or already has - * subscribed our user. This method is a workaround for a serious OMB flaw: - * The Listener URI is not passed in the finishauthorization call. - * - * @access public - * - * @return string the listener’s URI - **/ - public function getListenerURI() { - return $this->listener_uri; - } - - /** - * Inform the service about a profile update - * - * Sends an updated profile to the service. - * - * @param OMB_Profile $profile The profile that has changed - * - * @access public - **/ - public function updateProfile($profile) { - $params = $profile->asParameters('omb_listenee', true); - $this->performOMBAction(OMB_ENDPOINT_UPDATEPROFILE, $params, $profile->getIdentifierURI()); - } - - /** - * Inform the service about a new notice - * - * Sends a notice to the service. - * - * @param OMB_Notice $notice The notice - * - * @access public - **/ - public function postNotice($notice) { - $params = $notice->asParameters(); - $params['omb_listenee'] = $notice->getAuthor()->getIdentifierURI(); - $this->performOMBAction(OMB_ENDPOINT_POSTNOTICE, $params, $params['omb_listenee']); - } - - /** - * Set the token member variable - * - * Initializes the token based on given token and secret token. - * - * @param string $token The token - * @param string $secret The secret token - * - * @access public - **/ - public function setToken($token, $secret) { - $this->token = new OAuthToken($token, $secret); - } - - /** - * Prepare an OAuthRequest object - * - * Creates an OAuthRequest object mapping the request specified by the - * parameters. - * - * @param string $action_uri The URI specifying the target service - * @param array $params Additional parameters for the service call - * @param string $method The HTTP method used to call the service - * ('POST' or 'GET', usually) - * - * @access protected - * - * @return OAuthRequest the prepared request - **/ - protected function prepareAction($action_uri, $params, $method) { - $url = $this->services[$action_uri]; - - $url_params = array(); - parse_str(parse_url($url, PHP_URL_QUERY), $url_params); - - /* Add OMB version. */ - $url_params['omb_version'] = OMB_VERSION; - - /* Add user-defined parameters. */ - $url_params = array_merge($url_params, $params); - - $req = OAuthRequest::from_consumer_and_token($this->oauth_consumer, - $this->token, $method, $url, $url_params); - - /* Sign the request. */ - $req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), - $this->oauth_consumer, $this->token); - - return $req; - } - - /** - * Perform a service call - * - * Creates an OAuthRequest object and execute the mapped call as POST request. - * - * @param string $action_uri The URI specifying the target service - * @param array $params Additional parameters for the service call - * - * @access protected - * - * @return Auth_Yadis_HTTPResponse The POST request response - **/ - protected function performAction($action_uri, $params) { - $req = $this->prepareAction($action_uri, $params, 'POST'); - - /* Return result page. */ - return $this->fetcher->post($req->get_normalized_http_url(), $req->to_postdata(), array()); - } - - /** - * Perform an OMB action - * - * Executes an OMB action – to date, it’s one of updateProfile or postNotice. - * - * @param string $action_uri The URI specifying the target service - * @param array $params Additional parameters for the service call - * @param string $listenee_uri The URI identifying the local user for whom - * the action is performed - * - * @access protected - **/ - protected function performOMBAction($action_uri, $params, $listenee_uri) { - $result = $this->performAction($action_uri, $params); - if ($result->status == 403) { - /* The remote user unsubscribed us. */ - $this->datastore->deleteSubscription($this->listener_uri, $listenee_uri); - } else if ($result->status != 200 || - strpos($result->body, 'omb_version=' . OMB_VERSION) === false) { - /* The server signaled an error or sent an incorrect response. */ - throw OMB_RemoteServiceException::fromYadis($action_uri, $result); + + /** + * Perform a service call + * + * Creates an OAuthRequest object and execute the mapped call as POST + * request. + * + * @param string $action_uri The URI specifying the target service + * @param array $params Additional parameters for the service call + * + * @access protected + * + * @return Auth_Yadis_HTTPResponse The POST request response + */ + protected function performAction($action_uri, $params) + { + $req = $this->prepareAction($action_uri, $params, 'POST'); + + /* Return result page. */ + return $this->fetcher->post($req->get_normalized_http_url(), + $req->to_postdata(), array()); + } + + /** + * Perform an OMB action + * + * Executes an OMB action – as of OMB 0.1, it’s one of updateProfile and + * postNotice. + * + * @param string $action_uri The URI specifying the target service + * @param array $params Additional parameters for the service call + * @param string $listenee_uri The URI identifying the local user for whom + * the action is performed + * + * @access protected + */ + protected function performOMBAction($action_uri, $params, $listenee_uri) + { + $result = $this->performAction($action_uri, $params); + if ($result->status == 403) { + /* The remote user unsubscribed us. */ + $this->datastore->deleteSubscription($this->listener_uri, + $listenee_uri); + } else if ($result->status != 200 || + strpos($result->body, 'omb_version=' . OMB_VERSION) === false) { + /* The server signaled an error or sent an incorrect response. */ + throw OMB_RemoteServiceException::fromYadis($action_uri, $result); + } } - } } +?> diff --git a/extlib/libomb/service_provider.php b/extlib/libomb/service_provider.php index a1c69e86f..9a1a488a6 100755 --- a/extlib/libomb/service_provider.php +++ b/extlib/libomb/service_provider.php @@ -1,13 +1,6 @@ <?php - -require_once 'constants.php'; -require_once 'remoteserviceexception.php'; -require_once 'helper.php'; - /** - * OMB service realization - * - * This class realizes a complete, simple OMB service. + * This file is part of libomb * * PHP version 5 * @@ -24,406 +17,445 @@ require_once 'helper.php'; * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ - -class OMB_Service_Provider { - protected $user; /* An OMB_Profile representing the user */ - protected $datastore; /* AN OMB_Datastore */ - - protected $remote_user; /* An OMB_Profile representing the remote user during - the authorization process */ - - protected $oauth_server; /* An OAuthServer; should only be accessed via - getOAuthServer. */ - - /** - * Initialize an OMB_Service_Provider object - * - * Constructs an OMB_Service_Provider instance that provides OMB services - * referring to a particular user. - * - * @param OMB_Profile $user An OMB_Profile; mandatory for XRDS - * output, user auth handling and OMB - * action performing - * @param OMB_Datastore $datastore An OMB_Datastore; mandatory for - * everything but XRDS output - * @param OAuthServer $oauth_server An OAuthServer; used for token writing - * and OMB action handling; will use - * default value if not set - * - * @access public - **/ - public function __construct ($user = null, $datastore = null, $oauth_server = null) { - $this->user = $user; - $this->datastore = $datastore; - $this->oauth_server = $oauth_server; - } - - public function getRemoteUser() { - return $this->remote_user; - } - - /** - * Write a XRDS document - * - * Writes a XRDS document specifying the OMB service. Optionally uses a - * given object of a class implementing OMB_XRDS_Writer for output. Else - * OMB_Plain_XRDS_Writer is used. - * - * @param OMB_XRDS_Mapper $xrds_mapper An object mapping actions to URLs - * @param OMB_XRDS_Writer $xrds_writer Optional; The OMB_XRDS_Writer used to - * write the XRDS document - * - * @access public - * - * @return mixed Depends on the used OMB_XRDS_Writer; OMB_Plain_XRDS_Writer - * returns nothing. - **/ - public function writeXRDS($xrds_mapper, $xrds_writer = null) { - if ($xrds_writer == null) { - require_once 'plain_xrds_writer.php'; - $xrds_writer = new OMB_Plain_XRDS_Writer(); - } - return $xrds_writer->writeXRDS($this->user, $xrds_mapper); - } - - /** - * Echo a request token - * - * Outputs an unauthorized request token for the query found in $_GET or - * $_POST. - * - * @access public - **/ - public function writeRequestToken() { - OMB_Helper::removeMagicQuotesFromRequest(); - echo $this->getOAuthServer()->fetch_request_token(OAuthRequest::from_request()); - } - - /** - * Handle an user authorization request. - * - * Parses an authorization request. This includes OAuth and OMB verification. - * Throws exceptions on failures. Returns an OMB_Profile object representing - * the remote user. - * - * The OMB_Profile passed to the constructor of OMB_Service_Provider should - * not represent the user specified in the authorization request, but the one - * currently logged in to the service. This condition being satisfied, - * handleUserAuth will check whether the listener specified in the request is - * identical to the logged in user. - * - * @access public - * - * @return OMB_Profile The profile of the soon-to-be subscribed, i. e. remote - * user - **/ - public function handleUserAuth() { - OMB_Helper::removeMagicQuotesFromRequest(); - - /* Verify the request token. */ - - $this->token = $this->datastore->lookup_token(null, "request", $_GET['oauth_token']); - if (is_null($this->token)) { - throw new OAuthException('The given request token has not been issued ' . - 'by this service.'); + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ + +require_once 'constants.php'; +require_once 'helper.php'; +require_once 'notice.php'; +require_once 'remoteserviceexception.php'; + +/** + * OMB service realization + * + * This class realizes a complete, simple OMB service. + */ +class OMB_Service_Provider +{ + protected $user; /* An OMB_Profile representing the user */ + protected $datastore; /* AN OMB_Datastore */ + + protected $remote_user; /* An OMB_Profile representing the remote user + during the authorization process */ + + protected $oauth_server; /* An OAuthServer; should only be accessed via + getOAuthServer. */ + + /** + * Initialize an OMB_Service_Provider object + * + * Constructs an OMB_Service_Provider instance that provides OMB services + * referring to a particular user. + * + * @param OMB_Profile $user An OMB_Profile; mandatory for XRDS + * output, user auth handling and OMB + * action performing + * @param OMB_Datastore $datastore An OMB_Datastore; mandatory for + * everything but XRDS output + * @param OAuthServer $oauth_server An OAuthServer; used for token writing + * and OMB action handling; will use + * default value if not set + * + * @access public + */ + public function __construct ($user = null, $datastore = null, + $oauth_server = null) + { + $this->user = $user; + $this->datastore = $datastore; + $this->oauth_server = $oauth_server; } - /* Verify the OMB part. */ + /** + * Return the remote user during user authorization + * + * Returns an OMB_Profile representing the remote user during the user + * authorization request. + * + * @return OMB_Profile The remote user + */ + public function getRemoteUser() + { + return $this->remote_user; + } - if ($_GET['omb_version'] !== OMB_VERSION) { - throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, - 'Wrong OMB version ' . $_GET['omb_version']); + /** + * Write a XRDS document + * + * Writes a XRDS document specifying the OMB service. Optionally uses a + * given object of a class implementing OMB_XRDS_Writer for output. Else + * OMB_Plain_XRDS_Writer is used. + * + * @param OMB_XRDS_Mapper $xrds_mapper An object mapping actions to URLs + * @param OMB_XRDS_Writer $xrds_writer Optional; The OMB_XRDS_Writer used to + * write the XRDS document + * + * @access public + * + * @return mixed Depends on the used OMB_XRDS_Writer; OMB_Plain_XRDS_Writer + * returns nothing. + */ + public function writeXRDS($xrds_mapper, $xrds_writer = null) + { + if ($xrds_writer == null) { + require_once 'plain_xrds_writer.php'; + $xrds_writer = new OMB_Plain_XRDS_Writer(); + } + return $xrds_writer->writeXRDS($this->user, $xrds_mapper); } - if ($_GET['omb_listener'] !== $this->user->getIdentifierURI()) { - throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, - 'Wrong OMB listener ' . $_GET['omb_listener']); + /** + * Echo a request token + * + * Outputs an unauthorized request token for the query found in $_GET or + * $_POST. + * + * @access public + */ + public function writeRequestToken() + { + OMB_Helper::removeMagicQuotesFromRequest(); + echo $this->getOAuthServer()->fetch_request_token( + OAuthRequest::from_request()); } - foreach (array('omb_listenee', 'omb_listenee_profile', - 'omb_listenee_nickname', 'omb_listenee_license') as $param) { - if (!isset($_GET[$param]) || is_null($_GET[$param])) { - throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, + /** + * Handle an user authorization request. + * + * Parses an authorization request. This includes OAuth and OMB + * verification. + * Throws exceptions on failures. Returns an OMB_Profile object representing + * the remote user. + * + * The OMB_Profile passed to the constructor of OMB_Service_Provider should + * not represent the user specified in the authorization request, but the + * one currently logged in to the service. This condition being satisfied, + * handleUserAuth will check whether the listener specified in the request + * is identical to the logged in user. + * + * @access public + * + * @return OMB_Profile The profile of the soon-to-be subscribed, i. e. + * remote user + */ + public function handleUserAuth() + { + OMB_Helper::removeMagicQuotesFromRequest(); + + /* Verify the request token. */ + + $this->token = $this->datastore->lookup_token(null, "request", + $_GET['oauth_token']); + if (is_null($this->token)) { + throw new OAuthException('The given request token has not been ' . + 'issued by this service.'); + } + + /* Verify the OMB part. */ + + if ($_GET['omb_version'] !== OMB_VERSION) { + throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, + 'Wrong OMB version ' . + $_GET['omb_version']); + } + + if ($_GET['omb_listener'] !== $this->user->getIdentifierURI()) { + throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, + 'Wrong OMB listener ' . + $_GET['omb_listener']); + } + + foreach (array('omb_listenee', 'omb_listenee_profile', + 'omb_listenee_nickname', 'omb_listenee_license') as $param) { + if (!isset($_GET[$param]) || is_null($_GET[$param])) { + throw OMB_RemoteServiceException::forRequest( + OAUTH_ENDPOINT_AUTHORIZE, "Required parameter '$param' not found"); - } - } + } + } - /* Store given callback for later use. */ - if (isset($_GET['oauth_callback']) && $_GET['oauth_callback'] !== '') { - $this->callback = $_GET['oauth_callback']; - if (!OMB_Helper::validateURL($this->callback)) { - throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE, - 'Invalid callback URL specified'); - } + /* Store given callback for later use. */ + if (isset($_GET['oauth_callback']) && $_GET['oauth_callback'] !== '') { + $this->callback = $_GET['oauth_callback']; + if (!OMB_Helper::validateURL($this->callback)) { + throw OMB_RemoteServiceException::forRequest( + OAUTH_ENDPOINT_AUTHORIZE, + 'Invalid callback URL specified'); + } + } + $this->remote_user = OMB_Profile::fromParameters($_GET, 'omb_listenee'); + + return $this->remote_user; } - $this->remote_user = OMB_Profile::fromParameters($_GET, 'omb_listenee'); - - return $this->remote_user; - } - - /** - * Continue the OAuth dance after user authorization - * - * Performs the appropriate actions after user answered the authorization - * request. - * - * @param bool $accepted Whether the user granted authorization - * - * @access public - * - * @return array A two-component array with the values: - * - callback The callback URL or null if none given - * - token The authorized request token or null if not - * authorized. - **/ - public function continueUserAuth($accepted) { - $callback = $this->callback; - if (!$accepted) { - $this->datastore->revoke_token($this->token->key); - $this->token = null; - /* TODO: The handling is probably wrong in terms of OAuth 1.0 but the way - laconica works. Moreover I don’t know the right way either. */ - - } else { - $this->datastore->authorize_token($this->token->key); - $this->datastore->saveProfile($this->remote_user); - $this->datastore->saveSubscription($this->user->getIdentifierURI(), - $this->remote_user->getIdentifierURI(), $this->token); - - if (!is_null($this->callback)) { - /* Callback wants to get some informations as well. */ - $params = $this->user->asParameters('omb_listener', false); - - $params['oauth_token'] = $this->token->key; - $params['omb_version'] = OMB_VERSION; - - $callback .= (parse_url($this->callback, PHP_URL_QUERY) ? '&' : '?'); - foreach ($params as $k => $v) { - $callback .= OAuthUtil::urlencode_rfc3986($k) . '=' . - OAuthUtil::urlencode_rfc3986($v) . '&'; + + /** + * Continue the OAuth dance after user authorization + * + * Performs the appropriate actions after user answered the authorization + * request. + * + * @param bool $accepted Whether the user granted authorization + * + * @access public + * + * @return array A two-component array with the values: + * - callback The callback URL or null if none given + * - token The authorized request token or null if not + * authorized. + */ + public function continueUserAuth($accepted) + { + $callback = $this->callback; + if (!$accepted) { + $this->datastore->revoke_token($this->token->key); + $this->token = null; + + } else { + $this->datastore->authorize_token($this->token->key); + $this->datastore->saveProfile($this->remote_user); + $this->datastore->saveSubscription($this->user->getIdentifierURI(), + $this->remote_user->getIdentifierURI(), + $this->token); + + if (!is_null($this->callback)) { + /* Callback wants to get some informations as well. */ + $params = $this->user->asParameters('omb_listener', false); + + $params['oauth_token'] = $this->token->key; + $params['omb_version'] = OMB_VERSION; + + $callback .= (parse_url($this->callback, PHP_URL_QUERY) ? '&' : '?'); + foreach ($params as $k => $v) { + $callback .= OAuthUtil::urlencode_rfc3986($k) . '=' . + OAuthUtil::urlencode_rfc3986($v) . '&'; + } + } } - } + return array($callback, $this->token); } - return array($callback, $this->token); - } - - /** - * Echo an access token - * - * Outputs an access token for the query found in $_POST. OMB 0.1 specifies - * that the access token request has to be a POST even if OAuth allows GET as - * well. - * - * @access public - **/ - public function writeAccessToken() { - OMB_Helper::removeMagicQuotesFromRequest(); - echo $this->getOAuthServer()->fetch_access_token( + + /** + * Echo an access token + * + * Outputs an access token for the query found in $_POST. OMB 0.1 specifies + * that the access token request has to be a POST even if OAuth allows GET + * as well. + * + * @access public + */ + public function writeAccessToken() + { + OMB_Helper::removeMagicQuotesFromRequest(); + echo $this->getOAuthServer()->fetch_access_token( OAuthRequest::from_request('POST')); - } - - /** - * Handle an updateprofile request - * - * Handles an updateprofile request posted to this service. Updates the - * profile through the OMB_Datastore. - * - * @access public - * - * @return OMB_Profile The updated profile - **/ - public function handleUpdateProfile() { - list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_UPDATEPROFILE); - $profile->updateFromParameters($req->get_parameters(), 'omb_listenee'); - $this->datastore->saveProfile($profile); - $this->finishOMBRequest(); - return $profile; - } - - /** - * Handle a postnotice request - * - * Handles a postnotice request posted to this service. Saves the notice - * through the OMB_Datastore. - * - * @access public - * - * @return OMB_Notice The received notice - **/ - public function handlePostNotice() { - list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_POSTNOTICE); - require_once 'notice.php'; - $notice = OMB_Notice::fromParameters($profile, $req->get_parameters()); - $this->datastore->saveNotice($notice); - $this->finishOMBRequest(); - return $notice; - } - - /** - * Handle an OMB request - * - * Performs common OMB request handling. - * - * @param string $uri The URI defining the OMB endpoint being served - * - * @access protected - * - * @return array(OAuthRequest, OMB_Profile) - **/ - protected function handleOMBRequest($uri) { - - OMB_Helper::removeMagicQuotesFromRequest(); - $req = OAuthRequest::from_request('POST'); - $listenee = $req->get_parameter('omb_listenee'); - - try { - list($consumer, $token) = $this->getOAuthServer()->verify_request($req); - } catch (OAuthException $e) { - header('HTTP/1.1 403 Forbidden'); - // @debug hack - throw OMB_RemoteServiceException::forRequest($uri, - 'Revoked accesstoken for ' . $listenee . ': ' . $e->getMessage()); - // @end debug - throw OMB_RemoteServiceException::forRequest($uri, - 'Revoked accesstoken for ' . $listenee); } - $version = $req->get_parameter('omb_version'); - if ($version !== OMB_VERSION) { - header('HTTP/1.1 400 Bad Request'); - throw OMB_RemoteServiceException::forRequest($uri, - 'Wrong OMB version ' . $version); + /** + * Handle an updateprofile request + * + * Handles an updateprofile request posted to this service. Updates the + * profile through the OMB_Datastore. + * + * @access public + * + * @return OMB_Profile The updated profile + */ + public function handleUpdateProfile() + { + list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_UPDATEPROFILE); + $profile->updateFromParameters($req->get_parameters(), 'omb_listenee'); + $this->datastore->saveProfile($profile); + $this->finishOMBRequest(); + return $profile; } - $profile = $this->datastore->getProfile($listenee); - if (is_null($profile)) { - header('HTTP/1.1 400 Bad Request'); - throw OMB_RemoteServiceException::forRequest($uri, - 'Unknown remote profile ' . $listenee); + /** + * Handle a postnotice request + * + * Handles a postnotice request posted to this service. Saves the notice + * through the OMB_Datastore. + * + * @access public + * + * @return OMB_Notice The received notice + */ + public function handlePostNotice() + { + list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_POSTNOTICE); + + $notice = OMB_Notice::fromParameters($profile, $req->get_parameters()); + $this->datastore->saveNotice($notice); + $this->finishOMBRequest(); + + return $notice; } - $subscribers = $this->datastore->getSubscriptions($listenee); - if (count($subscribers) === 0) { - header('HTTP/1.1 403 Forbidden'); - throw OMB_RemoteServiceException::forRequest($uri, - 'No subscriber for ' . $listenee); - } + /** + * Handle an OMB request + * + * Performs common OMB request handling. + * + * @param string $uri The URI defining the OMB endpoint being served + * + * @access protected + * + * @return array(OAuthRequest, OMB_Profile) + */ + protected function handleOMBRequest($uri) + { + OMB_Helper::removeMagicQuotesFromRequest(); + $req = OAuthRequest::from_request('POST'); + $listenee = $req->get_parameter('omb_listenee'); + + try { + list($consumer, $token) = $this->getOAuthServer()->verify_request($req); + } catch (OAuthException $e) { + header('HTTP/1.1 403 Forbidden'); + throw OMB_RemoteServiceException::forRequest($uri, + 'Revoked accesstoken for ' . $listenee); + } - return array($req, $profile); - } - - /** - * Finishes an OMB request handling - * - * Performs common OMB request handling finishing. - * - * @access protected - **/ - protected function finishOMBRequest() { - header('HTTP/1.1 200 OK'); - header('Content-type: text/plain'); - /* There should be no clutter but the version. */ - echo "omb_version=" . OMB_VERSION; - } - - /** - * Return an OAuthServer - * - * Checks whether the OAuthServer is null. If so, initializes it with a - * default value. Returns the OAuth server. - * - * @access protected - **/ - protected function getOAuthServer() { - if (is_null($this->oauth_server)) { - $this->oauth_server = new OAuthServer($this->datastore); - $this->oauth_server->add_signature_method( - new OAuthSignatureMethod_HMAC_SHA1()); + $version = $req->get_parameter('omb_version'); + if ($version !== OMB_VERSION) { + header('HTTP/1.1 400 Bad Request'); + throw OMB_RemoteServiceException::forRequest($uri, + 'Wrong OMB version ' . $version); + } + + $profile = $this->datastore->getProfile($listenee); + if (is_null($profile)) { + header('HTTP/1.1 400 Bad Request'); + throw OMB_RemoteServiceException::forRequest($uri, + 'Unknown remote profile ' . $listenee); + } + + $subscribers = $this->datastore->getSubscriptions($listenee); + if (count($subscribers) === 0) { + header('HTTP/1.1 403 Forbidden'); + throw OMB_RemoteServiceException::forRequest($uri, + 'No subscriber for ' . $listenee); + } + + return array($req, $profile); } - return $this->oauth_server; - } - - /** - * Publish a notice - * - * Posts an OMB notice. This includes storing the notice and posting it to - * subscribed users. - * - * @param OMB_Notice $notice The new notice - * - * @access public - * - * @return array An array mapping subscriber URIs to the exception posting to - * them has raised; Empty array if no exception occured - **/ - public function postNotice($notice) { - $uri = $this->user->getIdentifierURI(); - - /* $notice is passed by reference and may change. */ - $this->datastore->saveNotice($notice); - $subscribers = $this->datastore->getSubscriptions($uri); - - /* No one to post to. */ - if (is_null($subscribers)) { - return array(); + + /** + * Finishes an OMB request handling + * + * Performs common OMB request handling finishing. + * + * @access protected + */ + protected function finishOMBRequest() + { + header('HTTP/1.1 200 OK'); + header('Content-type: text/plain'); + /* There should be no clutter but the version. */ + echo "omb_version=" . OMB_VERSION; } - require_once 'service_consumer.php'; - - $err = array(); - foreach($subscribers as $subscriber) { - try { - $service = new OMB_Service_Consumer($subscriber['uri'], $uri, $this->datastore); - $service->setToken($subscriber['token'], $subscriber['secret']); - $service->postNotice($notice); - } catch (Exception $e) { - $err[$subscriber['uri']] = $e; - continue; - } + /** + * Return an OAuthServer + * + * Checks whether the OAuthServer is null. If so, initializes it with a + * default value. Returns the OAuth server. + * + * @access protected + */ + protected function getOAuthServer() + { + if (is_null($this->oauth_server)) { + $this->oauth_server = new OAuthServer($this->datastore); + $this->oauth_server->add_signature_method( + new OAuthSignatureMethod_HMAC_SHA1()); + } + return $this->oauth_server; } - return $err; - } - - /** - * Publish a profile update - * - * Posts the current profile as an OMB profile update. This includes updating - * the stored profile and posting it to subscribed users. - * - * @access public - * - * @return array An array mapping subscriber URIs to the exception posting to - * them has raised; Empty array if no exception occured - **/ - public function updateProfile() { - $uri = $this->user->getIdentifierURI(); - - $this->datastore->saveProfile($this->user); - $subscribers = $this->datastore->getSubscriptions($uri); - - /* No one to post to. */ - if (is_null($subscribers)) { - return array(); + + /** + * Publish a notice + * + * Posts an OMB notice. This includes storing the notice and posting it to + * subscribed users. + * + * @param OMB_Notice $notice The new notice + * + * @access public + * + * @return array An array mapping subscriber URIs to the exception posting + * to them has raised; Empty array if no exception occured + */ + public function postNotice($notice) + { + $uri = $this->user->getIdentifierURI(); + + /* $notice is passed by reference and may change. */ + $this->datastore->saveNotice($notice); + $subscribers = $this->datastore->getSubscriptions($uri); + + /* No one to post to. */ + if (is_null($subscribers)) { + return array(); + } + + require_once 'service_consumer.php'; + + $err = array(); + foreach ($subscribers as $subscriber) { + try { + $service = new OMB_Service_Consumer($subscriber['uri'], $uri, + $this->datastore); + $service->setToken($subscriber['token'], $subscriber['secret']); + $service->postNotice($notice); + } catch (Exception $e) { + $err[$subscriber['uri']] = $e; + continue; + } + } + return $err; } - require_once 'service_consumer.php'; - - $err = array(); - foreach($subscribers as $subscriber) { - try { - $service = new OMB_Service_Consumer($subscriber['uri'], $uri, $this->datastore); - $service->setToken($subscriber['token'], $subscriber['secret']); - $service->updateProfile($this->user); - } catch (Exception $e) { - $err[$subscriber['uri']] = $e; - continue; - } + /** + * Publish a profile update + * + * Posts the current profile as an OMB profile update. This includes + * updating the stored profile and posting it to subscribed users. + * + * @access public + * + * @return array An array mapping subscriber URIs to the exception posting + * to them has raised; Empty array if no exception occured + */ + public function updateProfile() + { + $uri = $this->user->getIdentifierURI(); + + $this->datastore->saveProfile($this->user); + $subscribers = $this->datastore->getSubscriptions($uri); + + /* No one to post to. */ + if (is_null($subscribers)) { + return array(); + } + + require_once 'service_consumer.php'; + + $err = array(); + foreach ($subscribers as $subscriber) { + try { + $service = new OMB_Service_Consumer($subscriber['uri'], $uri, + $this->datastore); + $service->setToken($subscriber['token'], $subscriber['secret']); + $service->updateProfile($this->user); + } catch (Exception $e) { + $err[$subscriber['uri']] = $e; + continue; + } + } + return $err; } - return $err; - } } diff --git a/extlib/libomb/unsupportedserviceexception.php b/extlib/libomb/unsupportedserviceexception.php index 4dab63ebe..be30a1f69 100755 --- a/extlib/libomb/unsupportedserviceexception.php +++ b/extlib/libomb/unsupportedserviceexception.php @@ -1,9 +1,6 @@ <?php /** - * Exception stating that a requested service is not available - * - * This exception is raised when OMB_Service is asked to call a service the remote - * server does not provide. + * This file is part of libomb * * PHP version 5 * @@ -20,12 +17,20 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ -class OMB_UnsupportedServiceException extends Exception { + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ +/** + * Exception stating that a requested service is not available + * + * This exception is raised when OMB_Service is asked to call a service the + * remote server does not provide. + */ +class OMB_UnsupportedServiceException extends Exception +{ } ?> diff --git a/extlib/libomb/xrds_mapper.php b/extlib/libomb/xrds_mapper.php index 7552154e5..8fbe65249 100755 --- a/extlib/libomb/xrds_mapper.php +++ b/extlib/libomb/xrds_mapper.php @@ -1,10 +1,6 @@ <?php /** - * Map XRDS actions to URLs - * - * This interface specifies classes which write the XRDS file announcing - * the OMB server. An instance of an implementing class should be passed to - * OMB_Service_Provider->writeXRDS. + * This file is part of libomb * * PHP version 5 * @@ -21,13 +17,31 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ -interface OMB_XRDS_Mapper { - public function getURL($action); +/** + * Map XRDS actions to URLs + * + * This interface specifies classes which write the XRDS file announcing + * the OMB server. An instance of an implementing class should be passed to + * OMB_Service_Provider->writeXRDS. + */ +interface OMB_XRDS_Mapper +{ + /** + * Fetch an URL for a specified action + * + * Returns the action URL for an action specified by the endpoint URI. + * + * @param string $action The endpoint URI + * + * @return string The action URL + */ + public function getURL($action); } ?> diff --git a/extlib/libomb/xrds_writer.php b/extlib/libomb/xrds_writer.php index 31b451b9c..c7939d60a 100755 --- a/extlib/libomb/xrds_writer.php +++ b/extlib/libomb/xrds_writer.php @@ -1,10 +1,6 @@ <?php /** - * Write OMB-specific XRDS - * - * This interface specifies classes which write the XRDS file announcing - * the OMB server. An instance of an implementing class should be passed to - * OMB_Service_Provider->writeXRDS. + * This file is part of libomb * * PHP version 5 * @@ -21,13 +17,30 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package OMB - * @author Adrian Lang <mail@adrianlang.de> - * @copyright 2009 Adrian Lang - * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 - **/ + * @package OMB + * @author Adrian Lang <mail@adrianlang.de> + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0 + * @version 0.1a-20090828 + * @link http://adrianlang.de/libomb + */ -interface OMB_XRDS_Writer { - public function writeXRDS($user, $mapper); +/** + * Write OMB-specific XRDS + * + * This interface specifies classes which write the XRDS file announcing + * the OMB server. An instance of an implementing class should be passed to + * OMB_Service_Provider->writeXRDS. + */ +interface OMB_XRDS_Writer +{ + /** + * Write XRDS + * + * Outputs a XRDS document specifying an OMB service. + * + * @param OMB_profile $user The target user for the OMB service + * @param OMB_XRDS_Mapper $mapper An OMB_XRDS_Mapper providing endpoint URLs + */ + public function writeXRDS($user, $mapper); } ?> |