From d10ce6ac7cb2a65dc0411008f2cfc2710db107b8 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 25 Jun 2016 20:13:19 +0200 Subject: [PATCH] Give Webfinger response to group queries --- plugins/OStatus/OStatusPlugin.php | 6 ++ plugins/WebFinger/WebFingerPlugin.php | 14 ++++ .../lib/webfingerresource/profile.php | 72 +++++++++++-------- 3 files changed, 63 insertions(+), 29 deletions(-) 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,34 +58,45 @@ class WebFingerResource_Profile extends WebFingerResource { if (Event::handle('StartWebFingerProfileLinks', array($xrd, $this->object))) { - $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', - common_local_url('foaf', - array('nickname' => $this->object->nickname)), - 'application/rdf+xml'); - - $link = new XML_XRD_Element_Link('http://apinamespace.org/atom', - common_local_url('ApiAtomService', - array('id' => $this->object->nickname)), - '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); } - $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; + // 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'); + if ($this->object->isPerson()) { + // FOAF for user + $xrd->links[] = new XML_XRD_Element_Link('describedby', + common_local_url('foaf', + array('nickname' => $this->object->getNickname())), + 'application/rdf+xml'); + + // nickname discovery for apps etc. + $link = new XML_XRD_Element_Link('http://apinamespace.org/atom', + common_local_url('ApiAtomService', + array('id' => $this->object->getNickname())), + 'application/atomsvc+xml'); + // 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'); + } Event::handle('EndWebFingerProfileLinks', array($xrd, $this->object)); }