Merge branch 'testing' of gitorious.org:statusnet/mainline into testing
* 'testing' of gitorious.org:statusnet/mainline: OStatus: pull best-sized avatar image (96x96 if found, otherwise largest, otherwise if none labeled takes the first) info about discovery in Ostatus_profile::ensureWebfinger() cache Web responses in Webfinger library
This commit is contained in:
commit
cf61f36e6b
|
@ -360,6 +360,25 @@ class ActivityUtils
|
||||||
return null;
|
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
|
* Gets the first child element with the given tag
|
||||||
*
|
*
|
||||||
|
@ -472,6 +491,24 @@ class AvatarLink
|
||||||
public $type;
|
public $type;
|
||||||
public $size;
|
public $size;
|
||||||
public $width;
|
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)
|
static function fromAvatar($avatar)
|
||||||
{
|
{
|
||||||
|
@ -640,8 +677,10 @@ class ActivityObject
|
||||||
if ($this->type == self::PERSON || $this->type == self::GROUP) {
|
if ($this->type == self::PERSON || $this->type == self::GROUP) {
|
||||||
$this->displayName = $this->title;
|
$this->displayName = $this->title;
|
||||||
|
|
||||||
// @fixme we may have multiple avatars with different resolutions specified
|
$avatars = ActivityUtils::getLinks($element, 'avatar');
|
||||||
$this->avatar = ActivityUtils::getLink($element, 'avatar');
|
foreach ($avatars as $link) {
|
||||||
|
$this->avatarLinks[] = new AvatarLink($link);
|
||||||
|
}
|
||||||
|
|
||||||
$this->poco = new PoCo($element);
|
$this->poco = new PoCo($element);
|
||||||
}
|
}
|
||||||
|
|
|
@ -818,8 +818,20 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
protected static function getActivityObjectAvatar($object, $hints=array())
|
protected static function getActivityObjectAvatar($object, $hints=array())
|
||||||
{
|
{
|
||||||
if ($object->avatar) {
|
if ($object->avatarLinks) {
|
||||||
return $object->avatar;
|
$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)) {
|
} else if (array_key_exists('avatar', $hints)) {
|
||||||
return $hints['avatar'];
|
return $hints['avatar'];
|
||||||
}
|
}
|
||||||
|
@ -1313,6 +1325,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
if (isset($feedUrl)) {
|
if (isset($feedUrl)) {
|
||||||
try {
|
try {
|
||||||
|
common_log(LOG_INFO, "Discovery on acct:$addr with feed URL $feedUrl");
|
||||||
$oprofile = self::ensureProfile($feedUrl, $hints);
|
$oprofile = self::ensureProfile($feedUrl, $hints);
|
||||||
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
||||||
return $oprofile;
|
return $oprofile;
|
||||||
|
@ -1326,6 +1339,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
if (isset($profileUrl)) {
|
if (isset($profileUrl)) {
|
||||||
try {
|
try {
|
||||||
|
common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
|
||||||
$oprofile = self::ensureProfile($profileUrl, $hints);
|
$oprofile = self::ensureProfile($profileUrl, $hints);
|
||||||
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
||||||
return $oprofile;
|
return $oprofile;
|
||||||
|
|
|
@ -81,11 +81,14 @@ class Webfinger
|
||||||
function getServiceLinks($domain)
|
function getServiceLinks($domain)
|
||||||
{
|
{
|
||||||
$url = 'http://'. $domain .'/.well-known/host-meta';
|
$url = 'http://'. $domain .'/.well-known/host-meta';
|
||||||
|
|
||||||
$content = $this->fetchURL($url);
|
$content = $this->fetchURL($url);
|
||||||
|
|
||||||
if (empty($content)) {
|
if (empty($content)) {
|
||||||
common_log(LOG_DEBUG, 'Error fetching host-meta');
|
common_log(LOG_DEBUG, 'Error fetching host-meta');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = XRD::parse($content);
|
$result = XRD::parse($content);
|
||||||
|
|
||||||
// Ensure that the host == domain (spec may include signing later)
|
// Ensure that the host == domain (spec may include signing later)
|
||||||
|
@ -119,6 +122,11 @@ class Webfinger
|
||||||
function fetchURL($url)
|
function fetchURL($url)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
$c = Cache::instance();
|
||||||
|
$content = $c->get('webfinger:url:'.$url);
|
||||||
|
if ($content !== false) {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
$client = new HTTPClient();
|
$client = new HTTPClient();
|
||||||
$response = $client->get($url);
|
$response = $client->get($url);
|
||||||
} catch (HTTP_Request2_Exception $e) {
|
} catch (HTTP_Request2_Exception $e) {
|
||||||
|
@ -129,7 +137,11 @@ class Webfinger
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $response->getBody();
|
$body = $response->getBody();
|
||||||
|
|
||||||
|
$c->set('webfinger:url:'.$url, $body);
|
||||||
|
|
||||||
|
return $body;
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyTemplate($template, $id)
|
function applyTemplate($template, $id)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user