* an acceptable response from the remote site.
*
* @param mixed $entry XML string, Notice, or Activity
+ * @param Profile $actor
* @return boolean success
*/
public function notifyActivity($entry, $actor)
{
$activity = new Activity($entry, $feed);
- if (Event::handle('StartHandleFeedEntry', array($activity))) {
+ if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this)) &&
+ Event::handle('StartHandleFeedEntry', array($activity))) {
// @todo process all activity objects
switch ($activity->objects[0]->type) {
}
Event::handle('EndHandleFeedEntry', array($activity));
+ Event::handle('EndHandleFeedEntryWithProfile', array($activity, $this));
}
}
*/
public function processPost($activity, $method)
{
- if ($this->isGroup()) {
- // A group feed will contain posts from multiple authors.
- // @fixme validate these profiles in some way!
- $oprofile = self::ensureActorProfile($activity);
- if ($oprofile->isGroup()) {
- // Groups can't post notices in StatusNet.
- common_log(LOG_WARNING, "OStatus: skipping post with group listed as author: $oprofile->uri in feed from $this->uri");
- return false;
- }
- } else {
- $actor = $activity->actor;
-
- if (empty($actor)) {
- // OK here! assume the default
- } else if ($actor->id == $this->uri || $actor->link == $this->uri) {
- $this->updateFromActivityObject($actor);
- } else if ($actor->id) {
- // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner.
- // This isn't what we expect from mainline OStatus person feeds!
- // Group feeds go down another path, with different validation...
- // Most likely this is a plain ol' blog feed of some kind which
- // doesn't match our expectations. We'll take the entry, but ignore
- // the <author> info.
- common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
- } else {
- // Plain <author> without ActivityStreams actor info.
- // We'll just ignore this info for now and save the update under the feed's identity.
- }
+ $oprofile = $this->checkAuthorship($activity);
- $oprofile = $this;
+ if (empty($oprofile)) {
+ return false;
}
// It's not always an ActivityObject::NOTE, but... let's just say it is.
* @return Ostatus_profile
* @throws Exception
*/
+
public static function ensureAtomFeed($feedEl, $hints)
{
- // Try to get a profile from the feed activity:subject
-
- $subject = ActivityUtils::child($feedEl, Activity::SUBJECT, Activity::SPEC);
+ $author = ActivityUtils::getFeedAuthor($feedEl);
- if (!empty($subject)) {
- $subjObject = new ActivityObject($subject);
- return self::ensureActivityObjectProfile($subjObject, $hints);
+ if (empty($author)) {
+ // XXX: make some educated guesses here
+ // TRANS: Feed sub exception.
+ throw new FeedSubException(_m('Can\'t find enough profile '.
+ 'information to make a feed.'));
}
- // Otherwise, try the feed author
-
- $author = ActivityUtils::child($feedEl, Activity::AUTHOR, Activity::ATOM);
-
- if (!empty($author)) {
- $authorObject = new ActivityObject($author);
- return self::ensureActivityObjectProfile($authorObject, $hints);
- }
-
- // Sheesh. Not a very nice feed! Let's try fingerpoken in the
- // entries.
-
- $entries = $feedEl->getElementsByTagNameNS(Activity::ATOM, 'entry');
-
- if (!empty($entries) && $entries->length > 0) {
-
- $entry = $entries->item(0);
-
- $actor = ActivityUtils::child($entry, Activity::ACTOR, Activity::SPEC);
-
- if (!empty($actor)) {
- $actorObject = new ActivityObject($actor);
- return self::ensureActivityObjectProfile($actorObject, $hints);
-
- }
-
- $author = ActivityUtils::child($entry, Activity::AUTHOR, Activity::ATOM);
-
- if (!empty($author)) {
- $authorObject = new ActivityObject($author);
- return self::ensureActivityObjectProfile($authorObject, $hints);
- }
- }
-
- // XXX: make some educated guesses here
- // TRANS: Feed sub exception.
- throw new FeedSubException(_m('Can\'t find enough profile information to make a feed.'));
+ return self::ensureActivityObjectProfile($author, $hints);
}
/**
}
// Try the profile url (like foo.example.com or example.com/user/foo)
-
- $profileUrl = ($object->link) ? $object->link : $hints['profileurl'];
+ if (!empty($object->link)) {
+ $profileUrl = $object->link;
+ } else if (!empty($hints['profileurl'])) {
+ $profileUrl = $hints['profileurl'];
+ }
if (!empty($profileUrl)) {
$nickname = self::nicknameFromURI($profileUrl);
protected static function nicknameFromURI($uri)
{
- preg_match('/(\w+):/', $uri, $matches);
-
- $protocol = $matches[1];
+ if (preg_match('/(\w+):/', $uri, $matches)) {
+ $protocol = $matches[1];
+ } else {
+ return null;
+ }
switch ($protocol) {
case 'acct':
case 'mailto':
$rest = $match[2];
$oprofile = Ostatus_profile::ensureWebfinger($rest);
+ break;
default:
- common_log("Unrecognized URI protocol for profile: $protocol ($uri)");
+ common_log(LOG_WARNING,
+ "Unrecognized URI protocol for profile: $protocol ($uri)");
break;
}
}
}
return $oprofile;
}
+
+ function checkAuthorship($activity)
+ {
+ if ($this->isGroup()) {
+ // A group feed will contain posts from multiple authors.
+ // @fixme validate these profiles in some way!
+ $oprofile = self::ensureActorProfile($activity);
+ if ($oprofile->isGroup()) {
+ // Groups can't post notices in StatusNet.
+ common_log(LOG_WARNING,
+ "OStatus: skipping post with group listed as author: ".
+ "$oprofile->uri in feed from $this->uri");
+ return false;
+ }
+ } else {
+ $actor = $activity->actor;
+
+ if (empty($actor)) {
+ // OK here! assume the default
+ } else if ($actor->id == $this->uri || $actor->link == $this->uri) {
+ $this->updateFromActivityObject($actor);
+ } else if ($actor->id) {
+ // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner.
+ // This isn't what we expect from mainline OStatus person feeds!
+ // Group feeds go down another path, with different validation...
+ // Most likely this is a plain ol' blog feed of some kind which
+ // doesn't match our expectations. We'll take the entry, but ignore
+ // the <author> info.
+ common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
+ } else {
+ // Plain <author> without ActivityStreams actor info.
+ // We'll just ignore this info for now and save the update under the feed's identity.
+ }
+
+ $oprofile = $this;
+ }
+
+ return $oprofile;
+ }
}
/**