function onEndWebFingerNoticeLinks(XML_XRD $xrd, Notice $target)
{
- $author = $target->getProfile();
- $profiletype = $this->profileTypeString($author);
- $salmon_url = common_local_url("{$profiletype}salmon", array('id' => $author->id));
- $xrd->links[] = new XML_XRD_Element_Link(Salmon::REL_SALMON, $salmon_url);
+ $salmon_url = null;
+ $actor = $target->getProfile();
+ if ($actor->isLocal()) {
+ $profiletype = $this->profileTypeString($actor);
+ $salmon_url = common_local_url("{$profiletype}salmon", array('id' => $actor->getID()));
+ } else {
+ try {
+ $oprofile = Ostatus_profile::fromProfile($actor);
+ $salmon_url = $oprofile->salmonuri;
+ } catch (Exception $e) {
+ // Even though it's not a local user, we couldn't get an Ostatus_profile?!
+ }
+ }
+ // Ostatus_profile salmon URL may be empty
+ if (!empty($salmon_url)) {
+ $xrd->links[] = new XML_XRD_Element_Link(Salmon::REL_SALMON, $salmon_url);
+ }
return true;
}
public function updateXRD(XML_XRD $xrd)
{
if (Event::handle('StartWebFingerNoticeLinks', array($xrd, $this->object))) {
- $xrd->links[] = new XML_XRD_Element_Link('alternate',
+ if ($this->object->isLocal()) {
+ $xrd->links[] = new XML_XRD_Element_Link('alternate',
common_local_url('ApiStatusesShow',
array('id'=>$this->object->id,
'format'=>'atom')),
'application/atom+xml');
- $xrd->links[] = new XML_XRD_Element_Link('alternate',
+ $xrd->links[] = new XML_XRD_Element_Link('alternate',
common_local_url('ApiStatusesShow',
array('id'=>$this->object->id,
'format'=>'json')),
'application/json');
+ } else {
+ try {
+ $xrd->links[] = new XML_XRD_Element_Link('alternate',
+ $this->object->getUrl(),
+ 'text/html');
+ } catch (InvalidUrlException $e) {
+ // don't do a fallback in webfinger
+ }
+ }
Event::handle('EndWebFingerNoticeLinks', array($xrd, $this->object));
}
}