return $this->uri;
}
+ public function fromProfile(Profile $profile)
+ {
+ $oprofile = Ostatus_profile::getKV('profile_id', $profile->id);
+ if (!$oprofile instanceof Ostatus_profile) {
+ throw new Exception('No Ostatus_profile for Profile ID: '.$profile->id);
+ }
+ }
+
/**
* Fetch the locally stored profile for this feed
* @return Profile
*/
public function localProfile()
{
+ if ($this->isGroup()) {
+ return $this->localGroup()->getProfile();
+ }
+
$profile = Profile::getKV('id', $this->profile_id);
- if ($profile instanceof Profile) {
- return $profile;
+ if (!$profile instanceof Profile) {
+ throw new NoProfileException($this->profile_id);
}
- throw new NoProfileException($this->profile_id);
+ return $profile;
}
/**
} else if ($this->isPeopletag()) {
return ActivityObject::fromPeopletag($this->localPeopletag());
} else {
- return ActivityObject::fromProfile($this->localProfile());
+ return $this->localProfile()->asActivityObject();
}
}
$noun = ActivityObject::fromPeopletag($this->localPeopletag());
return $noun->asString('activity:' . $element);
} else {
- $noun = ActivityObject::fromProfile($this->localProfile());
+ $noun = $this->localProfile()->asActivityObject();
return $noun->asString('activity:' . $element);
}
}
// The "WithProfile" events were added later.
- if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this, &$notice)) &&
+ if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this->localProfile(), &$notice)) &&
Event::handle('StartHandleFeedEntry', array($activity))) {
switch ($activity->verb) {
{
$notice = null;
- $oprofile = $this->checkAuthorship($activity);
-
- if (!$oprofile instanceof Ostatus_profile) {
- common_log(LOG_INFO, "No author matched share activity");
+ try {
+ $profile = ActivityUtils::checkAuthorship($activity, $this->localProfile());
+ } catch (ServerException $e) {
return null;
}
// Get (safe!) HTML and text versions of the content
$rendered = $this->purify($sourceContent);
- $content = html_entity_decode(strip_tags($rendered), ENT_QUOTES, 'UTF-8');
+ $content = common_strip_html($rendered);
$shortened = common_shorten_links($content);
if (Notice::contentTooLong($shortened)) {
$attachment = $this->saveHTMLFile($activity->title, $rendered);
- $summary = html_entity_decode(strip_tags($activity->summary), ENT_QUOTES, 'UTF-8');
+ $summary = common_strip_html($activity->summary);
if (empty($summary)) {
$summary = $content;
}
if ($activity->context) {
// TODO: context->attention
list($options['groups'], $options['replies'])
- = self::filterAttention($oprofile->localProfile(), $activity->context->attention);
+ = self::filterAttention($profile, $activity->context->attention);
// Maintain direct reply associations
// @todo FIXME: What about conversation ID?
$options['urls'][] = $href;
}
- $notice = Notice::saveNew($oprofile->profile_id,
+ $notice = Notice::saveNew($profile->id,
$content,
'ostatus',
$options);
{
$notice = null;
- $oprofile = $this->checkAuthorship($activity);
-
- if (!$oprofile instanceof Ostatus_profile) {
- return null;
- }
+ $profile = ActivityUtils::checkAuthorship($activity, $this->localProfile());
// It's not always an ActivityObject::NOTE, but... let's just say it is.
// Get (safe!) HTML and text versions of the content
$rendered = $this->purify($sourceContent);
- $content = html_entity_decode(strip_tags($rendered), ENT_QUOTES, 'UTF-8');
+ $content = common_strip_html($rendered);
$shortened = common_shorten_links($content);
if (Notice::contentTooLong($shortened)) {
$attachment = $this->saveHTMLFile($note->title, $rendered);
- $summary = html_entity_decode(strip_tags($note->summary), ENT_QUOTES, 'UTF-8');
+ $summary = common_strip_html($note->summary);
if (empty($summary)) {
$summary = $content;
}
if ($activity->context) {
// TODO: context->attention
list($options['groups'], $options['replies'])
- = self::filterAttention($oprofile->localProfile(), $activity->context->attention);
+ = self::filterAttention($profile, $activity->context->attention);
// Maintain direct reply associations
// @todo FIXME: What about conversation ID?
$options['reply_to'] = $orig->id;
}
}
+ if (!empty($activity->context->conversation)) {
+ // we store the URI here, Notice class can look it up later
+ $options['conversation'] = $activity->context->conversation;
+ }
$location = $activity->context->location;
if ($location) {
}
try {
- $saved = Notice::saveNew($oprofile->profile_id,
+ $saved = Notice::saveNew($profile->id,
$content,
'ostatus',
$options);
* @throws Exception on various error conditions
* @throws OStatusShadowException if this reference would obscure a local user/group
*/
- public static function ensureProfileURL($profile_url, $hints=array())
+ public static function ensureProfileURL($profile_url, array $hints=array())
{
$oprofile = self::getFromProfileURL($profile_url);
return null;
}
- // Is it a known Ostatus profile?
- $oprofile = Ostatus_profile::getKV('profile_id', $profile->id);
- if ($oprofile instanceof Ostatus_profile) {
+ try {
+ $oprofile = self::getFromProfile($profile);
+ // We found the profile, return it!
return $oprofile;
- }
-
- // Is it a local user?
- $user = User::getKV('id', $profile->id);
- if ($user instanceof User) {
- // @todo i18n FIXME: use sprintf and add i18n (?)
- throw new OStatusShadowException($profile, "'$profile_url' is the profile for local user '{$user->nickname}'.");
+ } catch (NoResultException $e) {
+ // Could not find an OStatus profile, is it instead a local user?
+ $user = User::getKV('id', $profile->id);
+ if ($user instanceof User) {
+ // @todo i18n FIXME: use sprintf and add i18n (?)
+ throw new OStatusShadowException($profile, "'$profile_url' is the profile for local user '{$user->nickname}'.");
+ }
}
// Continue discovery; it's a remote profile
return null;
}
+ static function getFromProfile(Profile $profile)
+ {
+ $oprofile = new Ostatus_profile();
+ $oprofile->profile_id = $profile->id;
+ if (!$oprofile->find(true)) {
+ throw new NoResultException($oprofile);
+ }
+ return $oprofile;
+ }
+
/**
* Look up and if necessary create an Ostatus_profile for remote entity
* with the given update feed. This should never return null -- you will
* @return Ostatus_profile
* @throws Exception
*/
- public static function ensureFeedURL($feed_url, $hints=array())
+ public static function ensureFeedURL($feed_url, array $hints=array())
{
$discover = new FeedDiscovery();
?: $discover->getAtomLink(Salmon::NS_REPLIES);
$hints['salmon'] = $salmonuri;
- if (!$huburi && !common_config('feedsub', 'fallback_hub')) {
+ if (!$huburi && !common_config('feedsub', 'fallback_hub') && !common_config('feedsub', 'nohub')) {
// We can only deal with folks with a PuSH hub
+ // unless we have something similar available locally.
throw new FeedSubNoHubException();
}
* @return Ostatus_profile
* @throws Exception
*/
- public static function ensureAtomFeed($feedEl, $hints)
+ public static function ensureAtomFeed(DOMElement $feedEl, array $hints)
{
$author = ActivityUtils::getFeedAuthor($feedEl);
* @return Ostatus_profile
* @throws Exception
*/
- public static function ensureRssChannel($feedEl, $hints)
+ public static function ensureRssChannel(DOMElement $feedEl, array $hints)
{
// Special-case for Posterous. They have some nice metadata in their
// posterous:author elements. We should use them instead of the channel.
* @param array $hints
* @return mixed URL string or false
*/
- public static function getActivityObjectAvatar($object, $hints=array())
+ public static function getActivityObjectAvatar(ActivityObject $object, array $hints=array())
{
if ($object->avatarLinks) {
$best = false;
* @param DOMElement $feed
* @return string
*/
- protected static function getAvatar($actor, $feed)
+ protected static function getAvatar(ActivityObject $actor, DOMElement $feed)
{
$url = '';
$icon = '';
* @return Ostatus_profile
* @throws Exception
*/
- public static function ensureActorProfile($activity, $hints=array())
+ public static function ensureActorProfile(Activity $activity, array $hints=array())
{
return self::ensureActivityObjectProfile($activity->actor, $hints);
}
* @return Ostatus_profile
* @throws Exception
*/
- public static function ensureActivityObjectProfile($object, $hints=array())
+ public static function ensureActivityObjectProfile(ActivityObject $object, array $hints=array())
{
$profile = self::getActivityObjectProfile($object);
if ($profile instanceof Ostatus_profile) {
* @return mixed matching Ostatus_profile or false if none known
* @throws ServerException if feed info invalid
*/
- public static function getActorProfile($activity)
+ public static function getActorProfile(Activity $activity)
{
return self::getActivityObjectProfile($activity->actor);
}
* @return mixed matching Ostatus_profile or false if none known
* @throws ServerException if feed info invalid
*/
- protected static function getActivityObjectProfile($object)
+ protected static function getActivityObjectProfile(ActivityObject $object)
{
$uri = self::getActivityObjectProfileURI($object);
return Ostatus_profile::getKV('uri', $uri);
* @return string
* @throws ServerException if feed info invalid
*/
- protected static function getActivityObjectProfileURI($object)
+ protected static function getActivityObjectProfileURI(ActivityObject $object)
{
if ($object->id) {
if (ActivityUtils::validateUri($object->id)) {
*
* @return Ostatus_profile
*/
- protected static function createActivityObjectProfile($object, $hints=array())
+ protected static function createActivityObjectProfile(ActivityObject $object, array $hints=array())
{
$homeuri = $object->id;
$discover = false;
$huburi = $discover->getHubLink();
}
- if (!$huburi && !common_config('feedsub', 'fallback_hub')) {
+ if (!$huburi && !common_config('feedsub', 'fallback_hub') && !common_config('feedsub', 'nohub')) {
// We can only deal with folks with a PuSH hub
throw new FeedSubNoHubException();
}
* @param ActivityObject $object
* @param array $hints
*/
- public function updateFromActivityObject($object, $hints=array())
+ public function updateFromActivityObject(ActivityObject $object, array $hints=array())
{
if ($this->isGroup()) {
$group = $this->localGroup();
}
}
- public static function updateProfile($profile, $object, $hints=array())
+ public static function updateProfile(Profile $profile, ActivityObject $object, array $hints=array())
{
$orig = clone($profile);
}
}
- protected static function updateGroup(User_group $group, $object, $hints=array())
+ protected static function updateGroup(User_group $group, ActivityObject $object, array $hints=array())
{
$orig = clone($group);
}
}
- protected static function updatePeopletag($tag, $object, $hints=array()) {
+ protected static function updatePeopletag($tag, ActivityObject $object, array $hints=array()) {
$orig = clone($tag);
$tag->tag = $object->title;
}
}
- protected static function getActivityObjectHomepage($object, $hints=array())
+ protected static function getActivityObjectHomepage(ActivityObject $object, array $hints=array())
{
$homepage = null;
$poco = $object->poco;
return $homepage;
}
- protected static function getActivityObjectLocation($object, $hints=array())
+ protected static function getActivityObjectLocation(ActivityObject $object, array $hints=array())
{
$location = null;
return $location;
}
- protected static function getActivityObjectBio($object, $hints=array())
+ protected static function getActivityObjectBio(ActivityObject $object, array $hints=array())
{
$bio = null;
return $bio;
}
- public static function getActivityObjectNickname($object, $hints=array())
+ public static function getActivityObjectNickname(ActivityObject $object, array $hints=array())
{
if ($object->poco) {
if (!empty($object->poco->preferredUsername)) {
}
// Try looking it up
- $oprofile = Ostatus_profile::getKV('uri', 'acct:'.$addr);
+ $oprofile = Ostatus_profile::getKV('uri', Discovery::normalize($addr));
if ($oprofile instanceof Ostatus_profile) {
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->getUri());
}
// If we got a feed URL, try that
+ $feedUrl = null;
if (array_key_exists('feedurl', $hints)) {
+ $feedUrl = $hints['feedurl'];
try {
common_log(LOG_INFO, "Discovery on acct:$addr with feed URL " . $hints['feedurl']);
$oprofile = self::ensureFeedURL($hints['feedurl'], $hints);
}
// If we got a profile page, try that!
+ $profileUrl = null;
if (array_key_exists('profileurl', $hints)) {
+ $profileUrl = $hints['profileurl'];
try {
common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
$oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
$profile->nickname = self::nicknameFromUri($uri);
$profile->created = common_sql_now();
- if (isset($profileUrl)) {
+ if (!is_null($profileUrl)) {
$profile->profileurl = $profileUrl;
}
$oprofile->profile_id = $profile_id;
$oprofile->created = common_sql_now();
- if (isset($feedUrl)) {
- $profile->feeduri = $feedUrl;
+ if (!is_null($feedUrl)) {
+ $oprofile->feeduri = $feedUrl;
}
$result = $oprofile->insert();
if ($result === false) {
+ $profile->delete();
common_log_db_error($oprofile, 'INSERT', __FILE__);
// TRANS: Exception. %s is a webfinger address.
throw new Exception(sprintf(_m('Could not save OStatus profile for "%s".'),$addr));
return $oprofile;
}
- function checkAuthorship($activity)
+ public function checkAuthorship(Activity $activity)
{
if ($this->isGroup() || $this->isPeopletag()) {
// A group or propletag feed will contain posts from multiple authors.
common_log(LOG_WARNING,
"OStatus: skipping post with group listed ".
"as author: " . $oprofile->getUri() . " in feed from " . $this->getUri());
- return false;
+ throw new ServerException('Activity author is a non-actor');
}
} else {
$actor = $activity->actor;
$oprofile = $this;
}
- return $oprofile;
+ return $oprofile->localProfile();
}
}