]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Handle attempt to subscribe a local user via their remote webfinger reference more...
authorBrion Vibber <brion@pobox.com>
Tue, 6 Apr 2010 23:32:04 +0000 (23:32 +0000)
committerBrion Vibber <brion@pobox.com>
Tue, 6 Apr 2010 23:35:24 +0000 (16:35 -0700)
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

index 8ba2ce0c313fffe4f30d9b8a3c32160bdba1c4df..e3b3daa2c56e7d4fa8037119936a4991794a8ff5 100644 (file)
@@ -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);
+    }
+}
+