Give Webfinger response to group queries

This commit is contained in:
Mikael Nordfeldth 2016-06-25 20:13:19 +02:00
parent 3d6e25ee5f
commit d10ce6ac7c
3 changed files with 63 additions and 29 deletions

View File

@ -1315,6 +1315,12 @@ class OStatusPlugin extends Plugin
{ {
if ($target->getObjectType() === ActivityObject::PERSON) { if ($target->getObjectType() === ActivityObject::PERSON) {
$this->addWebFingerPersonLinks($xrd, $target); $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 // Salmon

View File

@ -140,6 +140,20 @@ class WebFingerPlugin extends Plugin
throw $e; 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 // User URI did not match, so let's try our alt_urls as Profile URL values
if (!$profile instanceof Profile) { if (!$profile instanceof Profile) {
common_debug(__METHOD__.': Finding Profile URLs for WebFinger lookup on resource=='._ve($resource)); common_debug(__METHOD__.': Finding Profile URLs for WebFinger lookup on resource=='._ve($resource));

View File

@ -23,11 +23,14 @@ class WebFingerResource_Profile extends WebFingerResource
{ {
$aliases = array(); $aliases = array();
try { // only persons ("accounts" or "agents" actually) have acct: URIs
// Try to create an acct: URI if we're dealing with a profile if ($this->object->isPerson()) {
$aliases[] = $this->reconstructAcct(); try {
} catch (WebFingerReconstructionException $e) { // Try to create an acct: URI if we're dealing with a profile
common_debug("WebFinger reconstruction for Profile failed (id={$this->object->id})"); $aliases[] = $this->reconstructAcct();
} catch (WebFingerReconstructionException $e) {
common_debug("WebFinger reconstruction for Profile failed (id={$this->object->getID()})");
}
} }
return array_merge($aliases, parent::getAliases()); return array_merge($aliases, parent::getAliases());
@ -40,10 +43,10 @@ class WebFingerResource_Profile extends WebFingerResource
if (Event::handle('StartWebFingerReconstruction', array($this->object, &$acct))) { if (Event::handle('StartWebFingerReconstruction', array($this->object, &$acct))) {
// TODO: getUri may not always give us the correct host on remote users? // TODO: getUri may not always give us the correct host on remote users?
$host = parse_url($this->object->getUri(), PHP_URL_HOST); $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); 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)); Event::handle('EndWebFingerReconstruction', array($this->object, &$acct));
} }
@ -55,34 +58,45 @@ class WebFingerResource_Profile extends WebFingerResource
{ {
if (Event::handle('StartWebFingerProfileLinks', array($xrd, $this->object))) { 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')) { if (common_config('site', 'fancy')) {
$apiRoot = common_path('api/', true); $apiRoot = common_path('api/', true);
} else { } else {
$apiRoot = common_path('index.php/api/', true); $apiRoot = common_path('index.php/api/', true);
} }
$link = new XML_XRD_Element_Link('http://apinamespace.org/twitter', $apiRoot); // Profile page, can give more metadata from Link header or HTML parsing
// XML_XRD must implement changing properties first $link['http://apinamespace.org/twitter/username'] = $this->object->nickname; $xrd->links[] = new XML_XRD_Element_Link(self::PROFILEPAGE,
$xrd->links[] = clone $link; $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)); Event::handle('EndWebFingerProfileLinks', array($xrd, $this->object));
} }