]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Give Webfinger response to group queries
authorMikael Nordfeldth <mmn@hethane.se>
Sat, 25 Jun 2016 18:13:19 +0000 (20:13 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Sat, 25 Jun 2016 18:13:19 +0000 (20:13 +0200)
plugins/OStatus/OStatusPlugin.php
plugins/WebFinger/WebFingerPlugin.php
plugins/WebFinger/lib/webfingerresource/profile.php

index d455f1f47876549b213f2632987f19c613cf7f58..3e9a0c58d6cd539ddcff4fd24b34b72350b65200 100644 (file)
@@ -1315,6 +1315,12 @@ class OStatusPlugin extends Plugin
     {
         if ($target->getObjectType() === ActivityObject::PERSON) {
             $this->addWebFingerPersonLinks($xrd, $target);
+        } elseif ($target->getObjectType() === ActivityObject::GROUP) {
+            $xrd->links[] = new XML_XRD_Element_Link(Discovery::UPDATESFROM,
+                            common_local_url('ApiTimelineGroup',
+                                array('id' => $target->getGroup()->getID(), 'format' => 'atom')),
+                            'application/atom+xml');
+
         }
 
         // Salmon
index b41db564c3dca6aca5d43acc8afb95ab559195de..03a8c140b74073b07de2832c0fe1b70c0728d630 100644 (file)
@@ -140,6 +140,20 @@ class WebFingerPlugin extends Plugin
                 throw $e;
             }
 
+            try {
+                common_debug(__METHOD__.': Finding User_group URI for WebFinger lookup on resource=='._ve($resource));
+                $group = new User_group();
+                $group->whereAddIn('uri', array_keys($alt_urls), $group->columnType('uri'));
+                $group->limit(1);
+                if ($group->find(true)) {
+                    $profile = $group->getProfile();
+                }
+                unset($group);
+            } catch (Exception $e) {
+                common_log(LOG_ERR, get_class($e).': '._ve($e->getMessage()));
+                throw $e;
+            }
+
             // User URI did not match, so let's try our alt_urls as Profile URL values
             if (!$profile instanceof Profile) {
                 common_debug(__METHOD__.': Finding Profile URLs for WebFinger lookup on resource=='._ve($resource));
index 5bfbda0f2961a2005cba2cbb9d1b7b79bc0c1dea..273e08dc4741b0349b8f96b67736263958f0f6a3 100644 (file)
@@ -23,11 +23,14 @@ class WebFingerResource_Profile extends WebFingerResource
     {
         $aliases = array();
 
-        try {
-            // Try to create an acct: URI if we're dealing with a profile
-            $aliases[] = $this->reconstructAcct();
-        } catch (WebFingerReconstructionException $e) {
-            common_debug("WebFinger reconstruction for Profile failed (id={$this->object->id})");
+        // only persons ("accounts" or "agents" actually) have acct: URIs
+        if ($this->object->isPerson()) {
+            try {
+                // Try to create an acct: URI if we're dealing with a profile
+                $aliases[] = $this->reconstructAcct();
+            } catch (WebFingerReconstructionException $e) {
+                common_debug("WebFinger reconstruction for Profile failed (id={$this->object->getID()})");
+            }
         }
 
         return array_merge($aliases, parent::getAliases());
@@ -40,10 +43,10 @@ class WebFingerResource_Profile extends WebFingerResource
         if (Event::handle('StartWebFingerReconstruction', array($this->object, &$acct))) {
             // TODO: getUri may not always give us the correct host on remote users?
             $host = parse_url($this->object->getUri(), PHP_URL_HOST);
-            if (empty($this->object->nickname) || empty($host)) {
+            if (empty($this->object->getNickname()) || empty($host)) {
                 throw new WebFingerReconstructionException($this->object);
             }
-            $acct = mb_strtolower(sprintf('acct:%s@%s', $this->object->nickname, $host));
+            $acct = mb_strtolower(sprintf('acct:%s@%s', $this->object->getNickname(), $host));
 
             Event::handle('EndWebFingerReconstruction', array($this->object, &$acct));
         }
@@ -55,35 +58,46 @@ class WebFingerResource_Profile extends WebFingerResource
     {
         if (Event::handle('StartWebFingerProfileLinks', array($xrd, $this->object))) {
 
+            if (common_config('site', 'fancy')) {
+                $apiRoot = common_path('api/', true);
+            } else {
+                $apiRoot = common_path('index.php/api/', true);
+            }
+
+            // Profile page, can give more metadata from Link header or HTML parsing
             $xrd->links[] = new XML_XRD_Element_Link(self::PROFILEPAGE,
                                         $this->object->getUrl(), 'text/html');
 
             // XFN
             $xrd->links[] = new XML_XRD_Element_Link('http://gmpg.org/xfn/11',
                                         $this->object->getUrl(), 'text/html');
-            // FOAF
-            $xrd->links[] = new XML_XRD_Element_Link('describedby',
+            if ($this->object->isPerson()) {
+                // FOAF for user
+                $xrd->links[] = new XML_XRD_Element_Link('describedby',
                                         common_local_url('foaf',
-                                                        array('nickname' => $this->object->nickname)),
+                                                        array('nickname' => $this->object->getNickname())),
                                                                 'application/rdf+xml');
 
-            $link = new XML_XRD_Element_Link('http://apinamespace.org/atom',
+                // nickname discovery for apps etc.
+                $link = new XML_XRD_Element_Link('http://apinamespace.org/atom',
                                         common_local_url('ApiAtomService',
-                                                        array('id' => $this->object->nickname)),
+                                                        array('id' => $this->object->getNickname())),
                                                                 'application/atomsvc+xml');
-// XML_XRD must implement changing properties first           $link['http://apinamespace.org/atom/username'] = $this->object->nickname;
-            $xrd->links[] = clone $link;
-
-            if (common_config('site', 'fancy')) {
-                $apiRoot = common_path('api/', true);
-            } else {
-                $apiRoot = common_path('index.php/api/', true);
+                // XML_XRD must implement changing properties first           $link['http://apinamespace.org/atom/username'] = $this->object->getNickname();
+                $xrd->links[] = clone $link;
+
+                $link = new XML_XRD_Element_Link('http://apinamespace.org/twitter', $apiRoot);
+                // XML_XRD must implement changing properties first            $link['http://apinamespace.org/twitter/username'] = $this->object->getNickname();
+                $xrd->links[] = clone $link;
+
+            } elseif ($this->object->isGroup()) {
+                // FOAF for group
+                $xrd->links[] = new XML_XRD_Element_Link('describedby',
+                                        common_local_url('foafgroup',
+                                                        array('nickname' => $this->object->getNickname())),
+                                                                'application/rdf+xml');
             }
 
-            $link = new XML_XRD_Element_Link('http://apinamespace.org/twitter', $apiRoot);
-// XML_XRD must implement changing properties first            $link['http://apinamespace.org/twitter/username'] = $this->object->nickname;
-            $xrd->links[] = clone $link;
-
             Event::handle('EndWebFingerProfileLinks', array($xrd, $this->object));
         }
     }