summaryrefslogtreecommitdiff
path: root/extlib
diff options
context:
space:
mode:
authorEvan Prodromou <evan@status.net>2010-08-03 16:05:03 -0700
committerEvan Prodromou <evan@status.net>2010-08-03 16:05:03 -0700
commit9f0715a9935966f3ec483bccc476d5baf3324b3c (patch)
tree9874247927e5e24044c75a48a9c04e427b0ba477 /extlib
parent004e42e3e0606f0f9e5c8b6cd4512e5d870cd56e (diff)
parentb17fc0ca5b90d2cdc957ebc4870fbd2791b9e1b9 (diff)
Merge branch '0.9.x' into 1.0.x
Diffstat (limited to 'extlib')
-rw-r--r--extlib/Auth/OpenID.php63
-rw-r--r--extlib/Auth/OpenID/AX.php23
-rw-r--r--extlib/Auth/OpenID/Association.php60
-rw-r--r--extlib/Auth/OpenID/BigMath.php31
-rw-r--r--extlib/Auth/OpenID/Consumer.php66
-rw-r--r--extlib/Auth/OpenID/CryptUtil.php5
-rw-r--r--extlib/Auth/OpenID/DatabaseConnection.php1
-rw-r--r--extlib/Auth/OpenID/DiffieHellman.php6
-rw-r--r--extlib/Auth/OpenID/Discover.php94
-rw-r--r--extlib/Auth/OpenID/DumbStore.php1
-rw-r--r--extlib/Auth/OpenID/Extension.php3
-rw-r--r--extlib/Auth/OpenID/FileStore.php6
-rw-r--r--extlib/Auth/OpenID/HMAC.php1
-rw-r--r--extlib/Auth/OpenID/Interface.php1
-rw-r--r--extlib/Auth/OpenID/KVForm.php5
-rw-r--r--extlib/Auth/OpenID/MemcachedStore.php1
-rw-r--r--extlib/Auth/OpenID/Message.php10
-rw-r--r--extlib/Auth/OpenID/MySQLStore.php1
-rw-r--r--extlib/Auth/OpenID/Nonce.php1
-rw-r--r--extlib/Auth/OpenID/PAPE.php11
-rw-r--r--extlib/Auth/OpenID/Parse.php37
-rw-r--r--extlib/Auth/OpenID/PostgreSQLStore.php1
-rw-r--r--extlib/Auth/OpenID/SQLStore.php18
-rw-r--r--extlib/Auth/OpenID/SQLiteStore.php1
-rw-r--r--extlib/Auth/OpenID/SReg.php14
-rw-r--r--extlib/Auth/OpenID/Server.php95
-rw-r--r--extlib/Auth/OpenID/ServerRequest.php1
-rw-r--r--extlib/Auth/OpenID/TrustRoot.php21
-rw-r--r--extlib/Auth/OpenID/URINorm.php2
-rw-r--r--extlib/Auth/Yadis/HTTPFetcher.php33
-rw-r--r--extlib/Auth/Yadis/Manager.php20
-rw-r--r--extlib/Auth/Yadis/Misc.php1
-rw-r--r--extlib/Auth/Yadis/ParanoidHTTPFetcher.php29
-rw-r--r--extlib/Auth/Yadis/ParseHTML.php1
-rw-r--r--extlib/Auth/Yadis/PlainHTTPFetcher.php3
-rw-r--r--extlib/Auth/Yadis/XML.php56
-rw-r--r--extlib/Auth/Yadis/XRDS.php16
-rw-r--r--extlib/Auth/Yadis/XRI.php4
-rw-r--r--extlib/Auth/Yadis/XRIRes.php6
-rw-r--r--extlib/Auth/Yadis/Yadis.php20
-rw-r--r--extlib/OAuth.php18
-rwxr-xr-xextlib/libomb/base_url_xrds_mapper.php75
-rw-r--r--extlib/libomb/constants.php15
-rwxr-xr-xextlib/libomb/datastore.php330
-rw-r--r--extlib/libomb/helper.php145
-rwxr-xr-xextlib/libomb/invalidparameterexception.php44
-rwxr-xr-xextlib/libomb/invalidyadisexception.php26
-rwxr-xr-xextlib/libomb/notice.php472
-rwxr-xr-xextlib/libomb/omb_yadis_xrds.php349
-rwxr-xr-xextlib/libomb/plain_xrds_writer.php128
-rwxr-xr-xextlib/libomb/profile.php546
-rwxr-xr-xextlib/libomb/remoteserviceexception.php71
-rwxr-xr-xextlib/libomb/service_consumer.php815
-rwxr-xr-xextlib/libomb/service_provider.php798
-rwxr-xr-xextlib/libomb/unsupportedserviceexception.php25
-rwxr-xr-xextlib/libomb/xrds_mapper.php38
-rwxr-xr-xextlib/libomb/xrds_writer.php37
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);
}
?>