summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/activity.php43
-rw-r--r--plugins/OStatus/classes/Ostatus_profile.php18
-rw-r--r--plugins/OStatus/lib/webfinger.php14
3 files changed, 70 insertions, 5 deletions
diff --git a/lib/activity.php b/lib/activity.php
index 161232c42..b20153213 100644
--- a/lib/activity.php
+++ b/lib/activity.php
@@ -360,6 +360,25 @@ class ActivityUtils
return null;
}
+ static function getLinks(DOMNode $element, $rel, $type=null)
+ {
+ $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK);
+ $out = array();
+
+ foreach ($links as $link) {
+
+ $linkRel = $link->getAttribute(self::REL);
+ $linkType = $link->getAttribute(self::TYPE);
+
+ if ($linkRel == $rel &&
+ (is_null($type) || $linkType == $type)) {
+ $out[] = $link;
+ }
+ }
+
+ return $out;
+ }
+
/**
* Gets the first child element with the given tag
*
@@ -472,6 +491,24 @@ class AvatarLink
public $type;
public $size;
public $width;
+ public $height;
+
+ function __construct($element=null)
+ {
+ if ($element) {
+ // @fixme use correct namespaces
+ $this->url = $element->getAttribute('href');
+ $this->type = $element->getAttribute('type');
+ $width = $element->getAttribute('media:width');
+ if ($width != null) {
+ $this->width = intval($width);
+ }
+ $height = $element->getAttribute('media:height');
+ if ($height != null) {
+ $this->height = intval($height);
+ }
+ }
+ }
static function fromAvatar($avatar)
{
@@ -640,8 +677,10 @@ class ActivityObject
if ($this->type == self::PERSON || $this->type == self::GROUP) {
$this->displayName = $this->title;
- // @fixme we may have multiple avatars with different resolutions specified
- $this->avatar = ActivityUtils::getLink($element, 'avatar');
+ $avatars = ActivityUtils::getLinks($element, 'avatar');
+ foreach ($avatars as $link) {
+ $this->avatarLinks[] = new AvatarLink($link);
+ }
$this->poco = new PoCo($element);
}
diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php
index c3ea042ff..e1c88bd2c 100644
--- a/plugins/OStatus/classes/Ostatus_profile.php
+++ b/plugins/OStatus/classes/Ostatus_profile.php
@@ -818,8 +818,20 @@ class Ostatus_profile extends Memcached_DataObject
protected static function getActivityObjectAvatar($object, $hints=array())
{
- if ($object->avatar) {
- return $object->avatar;
+ if ($object->avatarLinks) {
+ $best = false;
+ // Take the exact-size avatar, or the largest avatar, or the first avatar if all sizeless
+ foreach ($object->avatarLinks as $avatar) {
+ if ($avatar->width == AVATAR_PROFILE_SIZE && $avatar->height = AVATAR_PROFILE_SIZE) {
+ // Exact match!
+ $best = $avatar;
+ break;
+ }
+ if (!$best || $avatar->width > $best->width) {
+ $best = $avatar;
+ }
+ }
+ return $best->url;
} else if (array_key_exists('avatar', $hints)) {
return $hints['avatar'];
}
@@ -1313,6 +1325,7 @@ class Ostatus_profile extends Memcached_DataObject
if (isset($feedUrl)) {
try {
+ common_log(LOG_INFO, "Discovery on acct:$addr with feed URL $feedUrl");
$oprofile = self::ensureProfile($feedUrl, $hints);
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
return $oprofile;
@@ -1326,6 +1339,7 @@ class Ostatus_profile extends Memcached_DataObject
if (isset($profileUrl)) {
try {
+ common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
$oprofile = self::ensureProfile($profileUrl, $hints);
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
return $oprofile;
diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php
index 8d7040310..4b777c9a0 100644
--- a/plugins/OStatus/lib/webfinger.php
+++ b/plugins/OStatus/lib/webfinger.php
@@ -81,11 +81,14 @@ class Webfinger
function getServiceLinks($domain)
{
$url = 'http://'. $domain .'/.well-known/host-meta';
+
$content = $this->fetchURL($url);
+
if (empty($content)) {
common_log(LOG_DEBUG, 'Error fetching host-meta');
return false;
}
+
$result = XRD::parse($content);
// Ensure that the host == domain (spec may include signing later)
@@ -119,6 +122,11 @@ class Webfinger
function fetchURL($url)
{
try {
+ $c = Cache::instance();
+ $content = $c->get('webfinger:url:'.$url);
+ if ($content !== false) {
+ return $content;
+ }
$client = new HTTPClient();
$response = $client->get($url);
} catch (HTTP_Request2_Exception $e) {
@@ -129,7 +137,11 @@ class Webfinger
return false;
}
- return $response->getBody();
+ $body = $response->getBody();
+
+ $c->set('webfinger:url:'.$url, $body);
+
+ return $body;
}
function applyTemplate($template, $id)