Merge branch 'master' into 0.9.x

This commit is contained in:
Evan Prodromou 2010-04-07 10:46:23 -04:00
commit 76cce8a3c5
2 changed files with 38 additions and 3 deletions

View File

@ -573,6 +573,9 @@ class Memcached_DataObject extends Safe_DataObject
if ($this->id) { if ($this->id) {
$id .= ':' . $this->id; $id .= ':' . $this->id;
} }
if ($message instanceof PEAR_Error) {
$message = $message->getMessage();
}
throw new ServerException("[$id] DB_DataObject error [$type]: $message"); throw new ServerException("[$id] DB_DataObject error [$type]: $message");
} }

View File

@ -726,7 +726,8 @@ class Ostatus_profile extends Memcached_DataObject
* *
* @param string $profile_url * @param string $profile_url
* @return Ostatus_profile * @return Ostatus_profile
* @throws Exception * @throws Exception on various error conditions
* @throws OStatusShadowException if this reference would obscure a local user/group
*/ */
public static function ensureProfileURL($profile_url, $hints=array()) public static function ensureProfileURL($profile_url, $hints=array())
@ -813,7 +814,7 @@ class Ostatus_profile extends Memcached_DataObject
* remote profiles. * remote profiles.
* *
* @return mixed Ostatus_profile or null * @return mixed Ostatus_profile or null
* @throws Exception for local profiles * @throws OStatusShadowException for local profiles
*/ */
static function getFromProfileURL($profile_url) static function getFromProfileURL($profile_url)
{ {
@ -836,7 +837,7 @@ class Ostatus_profile extends Memcached_DataObject
$user = User::staticGet('id', $profile->id); $user = User::staticGet('id', $profile->id);
if (!empty($user)) { if (!empty($user)) {
throw new Exception("'$profile_url' is the profile for local user '{$user->nickname}'."); throw new OStatusShadowException($profile, "'$profile_url' is the profile for local user '{$user->nickname}'.");
} }
// Continue discovery; it's a remote profile // Continue discovery; it's a remote profile
@ -1538,6 +1539,7 @@ class Ostatus_profile extends Memcached_DataObject
* @param string $addr webfinger address * @param string $addr webfinger address
* @return Ostatus_profile * @return Ostatus_profile
* @throws Exception on error conditions * @throws Exception on error conditions
* @throws OStatusShadowException if this reference would obscure a local user/group
*/ */
public static function ensureWebfinger($addr) public static function ensureWebfinger($addr)
{ {
@ -1616,9 +1618,18 @@ class Ostatus_profile extends Memcached_DataObject
$oprofile = self::ensureProfileURL($hints['profileurl'], $hints); $oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
return $oprofile; return $oprofile;
} catch (OStatusShadowException $e) {
// We've ended up with a remote reference to a local user or group.
// @fixme ideally we should be able to say who it was so we can
// go back and refer to it the regular way
throw $e;
} catch (Exception $e) { } catch (Exception $e) {
common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage()); common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage());
// keep looking // keep looking
//
// @fixme this means an error discovering from profile page
// may give us a corrupt entry using the webfinger URI, which
// will obscure the correct page-keyed profile later on.
} }
} }
@ -1720,3 +1731,24 @@ class Ostatus_profile extends Memcached_DataObject
return $file; return $file;
} }
} }
/**
* Exception indicating we've got a remote reference to a local user,
* not a remote user!
*
* If we can ue a local profile after all, it's available as $e->profile.
*/
class OStatusShadowException extends Exception
{
public $profile;
/**
* @param Profile $profile
* @param string $message
*/
function __construct($profile, $message) {
$this->profile = $profile;
parent::__construct($message);
}
}