OStatus: moving parts of profile processing to Activity from feedmunger. Pausing before refactoring DB schema a bit to clean up feed vs person vs group info
This commit is contained in:
parent
4a139d1cc8
commit
454d0b5738
|
@ -218,10 +218,6 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
$profile->query('BEGIN');
|
$profile->query('BEGIN');
|
||||||
|
|
||||||
// Awful hack! Awful hack!
|
|
||||||
$profile->verify = common_good_rand(16);
|
|
||||||
$profile->secret = common_good_rand(32);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$local = $munger->profile();
|
$local = $munger->profile();
|
||||||
|
|
||||||
|
@ -423,7 +419,10 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
protected function doSubscribe($mode)
|
protected function doSubscribe($mode)
|
||||||
{
|
{
|
||||||
$orig = clone($this);
|
$orig = clone($this);
|
||||||
$this->verify_token = md5(mt_rand() . ':' . $this->feeduri);
|
$this->verify_token = common_good_rand(16);
|
||||||
|
if ($mode == 'subscribe') {
|
||||||
|
$this->secret = common_good_rand(32);
|
||||||
|
}
|
||||||
$this->sub_state = $mode;
|
$this->sub_state = $mode;
|
||||||
$this->update($orig);
|
$this->update($orig);
|
||||||
unset($orig);
|
unset($orig);
|
||||||
|
@ -701,18 +700,19 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
*/
|
*/
|
||||||
protected function processPost($activity)
|
protected function processPost($activity)
|
||||||
{
|
{
|
||||||
// @fixme pull profile reference from actor for group feeds
|
if ($this->isGroup()) {
|
||||||
$actor = $this;
|
// @fixme validate these profiles in some way!
|
||||||
$localProfile = $actor->localProfile();
|
$oprofile = $this->ensureActorProfile($activity);
|
||||||
if (empty($localProfile)) {
|
} else {
|
||||||
common_log(LOG_INFO, "OStatus: ignoring post with invalid author");
|
$actorUri = $this->getActorProfileURI($activity);
|
||||||
return;
|
if ($actorUri == $this->homeuri) {
|
||||||
|
// @fixme check if profile info has changed and update it
|
||||||
|
} else {
|
||||||
|
// @fixme drop or reject the messages once we've got the canonical profile URI recorded sanely
|
||||||
|
common_log(LOG_INFO, "OStatus: Warning: non-group post with unexpected author: $actorUri expected $this->homeuri");
|
||||||
|
//return;
|
||||||
}
|
}
|
||||||
|
$oprofile = $this;
|
||||||
if (empty($activity->object)) {
|
|
||||||
// This shouldn't happen!
|
|
||||||
common_log(LOG_INFO, "OStatus: ignoring post with missing post object.");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($activity->object->link) {
|
if ($activity->object->link) {
|
||||||
|
@ -749,7 +749,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
// @fixme save detailed ostatus source info
|
// @fixme save detailed ostatus source info
|
||||||
// @fixme ensure that groups get handled correctly
|
// @fixme ensure that groups get handled correctly
|
||||||
|
|
||||||
$saved = Notice::saveNew($localProfile->id,
|
$saved = Notice::saveNew($oprofile->localProfile()->id,
|
||||||
$content,
|
$content,
|
||||||
'ostatus',
|
'ostatus',
|
||||||
$params);
|
$params);
|
||||||
|
@ -784,4 +784,153 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an appropriate avatar image source URL, if available.
|
||||||
|
*
|
||||||
|
* @param ActivityObject $actor
|
||||||
|
* @param DOMElement $feed
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function getAvatar($actor, $feed)
|
||||||
|
{
|
||||||
|
$url = '';
|
||||||
|
$icon = '';
|
||||||
|
if ($actor->avatar) {
|
||||||
|
$url = trim($actor->avatar);
|
||||||
|
}
|
||||||
|
if (!$url) {
|
||||||
|
// Check <atom:logo> and <atom:icon> on the feed
|
||||||
|
$els = $feed->childNodes();
|
||||||
|
if ($els && $els->length) {
|
||||||
|
for ($i = 0; $i < $els->length; $i++) {
|
||||||
|
$el = $els->item($i);
|
||||||
|
if ($el->namespaceURI == Activity::ATOM) {
|
||||||
|
if (empty($url) && $el->localName == 'logo') {
|
||||||
|
$url = trim($el->textContent);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (empty($icon) && $el->localName == 'icon') {
|
||||||
|
// Use as a fallback
|
||||||
|
$icon = trim($el->textContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($icon && !$url) {
|
||||||
|
$url = $icon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($url) {
|
||||||
|
$opts = array('allowed_schemes' => array('http', 'https'));
|
||||||
|
if (Validate::uri($url, $opts)) {
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return common_path('plugins/OStatus/images/96px-Feed-icon.svg.png');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fixme move off of ostatus_profile or static?
|
||||||
|
*/
|
||||||
|
function ensureActorProfile($activity)
|
||||||
|
{
|
||||||
|
$profile = $this->getActorProfile($activity);
|
||||||
|
if (!$profile) {
|
||||||
|
$profile = $this->createActorProfile($activity);
|
||||||
|
}
|
||||||
|
return $profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Activity $activity
|
||||||
|
* @return mixed matching Ostatus_profile or false if none known
|
||||||
|
*/
|
||||||
|
function getActorProfile($activity)
|
||||||
|
{
|
||||||
|
$homeuri = $this->getActorProfileURI($activity);
|
||||||
|
return Ostatus_profile::staticGet('homeuri', $homeuri);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Activity $activity
|
||||||
|
* @return string
|
||||||
|
* @throws ServerException
|
||||||
|
*/
|
||||||
|
function getActorProfileURI($activity)
|
||||||
|
{
|
||||||
|
$opts = array('allowed_schemes' => array('http', 'https'));
|
||||||
|
$actor = $activity->actor;
|
||||||
|
if ($actor->id && Validate::uri($actor->id, $opts)) {
|
||||||
|
return $actor->id;
|
||||||
|
}
|
||||||
|
if ($actor->link && Validate::uri($actor->link, $opts)) {
|
||||||
|
return $actor->link;
|
||||||
|
}
|
||||||
|
throw new ServerException("No author ID URI found");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function createActorProfile($activity)
|
||||||
|
{
|
||||||
|
$actor = $activity->actor();
|
||||||
|
$homeuri = $this->getActivityProfileURI($activity);
|
||||||
|
$nickname = $this->getAuthorNick($activity);
|
||||||
|
$avatar = $this->getAvatar($actor, $feed);
|
||||||
|
|
||||||
|
$profile = new Profile();
|
||||||
|
$profile->nickname = $nickname;
|
||||||
|
$profile->fullname = $actor->displayName;
|
||||||
|
$profile->homepage = $actor->link; // @fixme
|
||||||
|
$profile->profileurl = $homeuri;
|
||||||
|
// @fixme bio
|
||||||
|
// @fixme tags/categories
|
||||||
|
// @fixme location?
|
||||||
|
// @todo tags from categories
|
||||||
|
// @todo lat/lon/location?
|
||||||
|
|
||||||
|
$ok = $profile->insert();
|
||||||
|
if ($ok) {
|
||||||
|
$this->updateAvatar($profile, $avatar);
|
||||||
|
} else {
|
||||||
|
throw new ServerException("Can't save local profile");
|
||||||
|
}
|
||||||
|
|
||||||
|
// @fixme either need to do feed discovery here
|
||||||
|
// or need to split out some of the feed stuff
|
||||||
|
// so we can leave it empty until later.
|
||||||
|
$oprofile = new Ostatus_profile();
|
||||||
|
$oprofile->homeuri = $homeuri;
|
||||||
|
$oprofile->profile_id = $profile->id;
|
||||||
|
|
||||||
|
$ok = $oprofile->insert();
|
||||||
|
if ($ok) {
|
||||||
|
return $oprofile;
|
||||||
|
} else {
|
||||||
|
throw new ServerException("Can't save OStatus profile");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fixme move this into Activity?
|
||||||
|
* @param Activity $activity
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function getAuthorNick($activity)
|
||||||
|
{
|
||||||
|
// @fixme not technically part of the actor?
|
||||||
|
foreach (array($activity->entry, $activity->feed) as $source) {
|
||||||
|
$author = ActivityUtil::child($source, 'author', Activity::ATOM);
|
||||||
|
if ($author) {
|
||||||
|
$name = ActivityUtil::child($author, 'name', Activity::ATOM);
|
||||||
|
if ($name) {
|
||||||
|
return trim($name->textContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,6 +247,14 @@ class ActivityObject
|
||||||
|
|
||||||
// XXX: grab PoCo stuff
|
// XXX: grab PoCo stuff
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Some per-type attributes...
|
||||||
|
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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function _childContent($element, $tag, $namespace=ActivityUtils::ATOM)
|
private function _childContent($element, $tag, $namespace=ActivityUtils::ATOM)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user