From d352e5f5c4cb87be97cc7ec9d619037087dfb391 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 6 Apr 2010 23:32:04 +0000 Subject: [PATCH 1/2] Handle attempt to subscribe a local user via their remote webfinger reference more gracefully. The ensure* family of functions will now return an OStatusShadowException in this case, which gives us a pleasant error message instead of a giant exception backtrace when you do 'sub somebody@this.local.server'. Can be extended later to allow actually using the local profile, since we could figure it out. --- plugins/OStatus/classes/Ostatus_profile.php | 38 +++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 8ba2ce0c31..e3b3daa2c5 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -726,7 +726,8 @@ class Ostatus_profile extends Memcached_DataObject * * @param string $profile_url * @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()) @@ -813,7 +814,7 @@ class Ostatus_profile extends Memcached_DataObject * remote profiles. * * @return mixed Ostatus_profile or null - * @throws Exception for local profiles + * @throws OStatusShadowException for local profiles */ static function getFromProfileURL($profile_url) { @@ -836,7 +837,7 @@ class Ostatus_profile extends Memcached_DataObject $user = User::staticGet('id', $profile->id); 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 @@ -1538,6 +1539,7 @@ class Ostatus_profile extends Memcached_DataObject * @param string $addr webfinger address * @return Ostatus_profile * @throws Exception on error conditions + * @throws OStatusShadowException if this reference would obscure a local user/group */ public static function ensureWebfinger($addr) { @@ -1616,9 +1618,18 @@ class Ostatus_profile extends Memcached_DataObject $oprofile = self::ensureProfileURL($hints['profileurl'], $hints); self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); 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) { common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage()); // 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; } } + +/** + * 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); + } +} + From 82326a3b690552cccd8c82950b7653556f6522c1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 7 Apr 2010 10:43:14 -0400 Subject: [PATCH 2/2] show PEAR_Error message, not the object --- classes/Memcached_DataObject.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index bc4c3a000c..920966b16d 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -505,6 +505,9 @@ class Memcached_DataObject extends Safe_DataObject if ($this->id) { $id .= ':' . $this->id; } + if ($message instanceof PEAR_Error) { + $message = $message->getMessage(); + } throw new ServerException("[$id] DB_DataObject error [$type]: $message"); }