From: Mikael Nordfeldth Date: Sat, 25 Jun 2016 18:13:19 +0000 (+0200) Subject: Give Webfinger response to group queries X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=d10ce6ac7cb2a65dc0411008f2cfc2710db107b8;p=quix0rs-gnu-social.git Give Webfinger response to group queries --- diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index d455f1f478..3e9a0c58d6 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -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 diff --git a/plugins/WebFinger/WebFingerPlugin.php b/plugins/WebFinger/WebFingerPlugin.php index b41db564c3..03a8c140b7 100644 --- a/plugins/WebFinger/WebFingerPlugin.php +++ b/plugins/WebFinger/WebFingerPlugin.php @@ -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)); diff --git a/plugins/WebFinger/lib/webfingerresource/profile.php b/plugins/WebFinger/lib/webfingerresource/profile.php index 5bfbda0f29..273e08dc47 100644 --- a/plugins/WebFinger/lib/webfingerresource/profile.php +++ b/plugins/WebFinger/lib/webfingerresource/profile.php @@ -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)); } }