From 747fe9d59bc03413be3d02d9ba1fadf460ba4758 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Mon, 9 Sep 2013 21:35:16 +0200 Subject: [PATCH] Tidying up getUser calls to profiles and some events getUser calls are much more strict, and one place where this was found was in the (un)subscribe start/end event handlers, which resulted in making the Subscription class a bit stricter, regarding ::start and ::cancel at least. Several minor fixes in many files were made due to this. This does NOT touch the Foreign_link function, which should also have a more strict getUser call. That is a future project. --- EVENTS.txt | 16 +- actions/foaf.php | 6 +- classes/Notice.php | 13 +- classes/Profile.php | 17 +- classes/Subscription.php | 12 +- classes/User.php | 12 +- lib/activityobject.php | 2 +- lib/apiaction.php | 6 +- lib/apiauth.php | 7 + lib/command.php | 6 +- lib/nosuchuserexception.php | 69 +++++ lib/subs.php | 6 + plugins/Activity/ActivityPlugin.php | 288 +++++++++--------- plugins/Blacklist/BlacklistPlugin.php | 2 +- plugins/Blog/classes/Blog_entry.php | 7 +- plugins/Gravatar/GravatarPlugin.php | 18 +- plugins/OMB/OMBPlugin.php | 12 +- plugins/OStatus/OStatusPlugin.php | 30 +- plugins/OStatus/actions/ostatussub.php | 2 +- .../SubscriptionThrottlePlugin.php | 22 +- 20 files changed, 317 insertions(+), 236 deletions(-) create mode 100644 lib/nosuchuserexception.php diff --git a/EVENTS.txt b/EVENTS.txt index 49940e467f..a3fd43bd6a 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -725,20 +725,20 @@ EndUnblockProfile: when an unblock has succeeded - $profile: the person unblocked, can be remote StartSubscribe: when a subscription is starting -- $user: the person subscribing -- $other: the person being subscribed to +- $profile: Profile that is subscribing +- $other: Profile that is being subscribed to EndSubscribe: when a subscription is finished -- $user: the person subscribing -- $other: the person being subscribed to +- $profile: Profile that is subscribing +- $other: Profile that is being subscribed to StartUnsubscribe: when an unsubscribe is starting -- $user: the person unsubscribing -- $other: the person being unsubscribed from +- $profile: Profile that is unsubscribing +- $other: Profile that is being unsubscribed from EndUnsubscribe: when an unsubscribe is done -- $user: the person unsubscribing -- $other: the person being unsubscribed to +- $profile: Profile that is unsubscribing +- $other: Profile that is being unsubscribed from StartJoinGroup: when a user is joining a group - $group: the group being joined diff --git a/actions/foaf.php b/actions/foaf.php index de03c33788..77e27796db 100644 --- a/actions/foaf.php +++ b/actions/foaf.php @@ -175,7 +175,6 @@ class FoafAction extends Action common_debug('Got a bad subscription: '.print_r($sub,true)); continue; } - $user = $profile->getUser(); $other_uri = $profile->getUri(); if (array_key_exists($other_uri, $person)) { $person[$other_uri][0] = BOTH; @@ -183,7 +182,7 @@ class FoafAction extends Action $person[$other_uri] = array(LISTENER, $profile->id, $profile->nickname, - $user ? 'local' : 'remote'); + $profile->isLocal() ? 'local' : 'remote'); } unset($profile); } @@ -289,13 +288,12 @@ class FoafAction extends Action common_debug('Got a bad subscription: '.print_r($sub,true)); continue; } - $user = $profile->getUser(); $other_uri = $profile->getUri(); $this->element('sioc:follows', array('rdf:resource' => $other_uri.'#acct')); $person[$other_uri] = array(LISTENEE, $profile->id, $profile->nickname, - $user ? 'local' : 'remote'); + $profile->isLocal() ? 'local' : 'remote'); unset($profile); } } diff --git a/classes/Notice.php b/classes/Notice.php index 7b87e394ce..1aba98b7bc 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -522,14 +522,16 @@ class Notice extends Managed_DataObject // For private streams - $user = $profile->getUser(); + try { + $user = $profile->getUser(); - if (!empty($user)) { if ($user->private_stream && ($notice->scope == Notice::PUBLIC_SCOPE || $notice->scope == Notice::SITE_SCOPE)) { $notice->scope |= Notice::FOLLOWER_SCOPE; } + } catch (NoSuchUserException $e) { + // Cannot handle private streams for remote profiles } // Force the scope for private groups @@ -2420,11 +2422,8 @@ class Notice extends Managed_DataObject // Only for users on this site - if ($scope & Notice::SITE_SCOPE) { - $user = $profile->getUser(); - if (empty($user)) { - return false; - } + if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) { + return false; } // Only for users mentioned in the notice diff --git a/classes/Profile.php b/classes/Profile.php index 6f502c9c18..fe8e116419 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -84,15 +84,28 @@ class Profile extends Managed_DataObject protected $_user = -1; // Uninitialized value distinct from null - function getUser() + public function getUser() { - if (is_int($this->_user) && $this->_user == -1) { + if ($this->_user === -1) { $this->_user = User::getKV('id', $this->id); } + if (!is_a($this->_user, 'User')) { + throw new NoSuchUserException(array('id'=>$this->id)); + } return $this->_user; } + public function isLocal() + { + try { + $this->getUser(); + } catch (NoSuchUserException $e) { + return false; + } + return true; + } + protected $_avatars; function getAvatar($width, $height=null) diff --git a/classes/Subscription.php b/classes/Subscription.php index 1a4a714455..0c0c6489de 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -79,16 +79,8 @@ class Subscription extends Managed_DataObject * @return mixed Subscription or Subscription_queue: new subscription info */ - static function start($subscriber, $other, $force=false) + static function start(Profile $subscriber, Profile $other, $force=false) { - // @fixme should we enforce this as profiles in callers instead? - if ($subscriber instanceof User) { - $subscriber = $subscriber->getProfile(); - } - if ($other instanceof User) { - $other = $other->getProfile(); - } - if (!$subscriber->hasRight(Right::SUBSCRIBE)) { // TRANS: Exception thrown when trying to subscribe while being banned from subscribing. throw new Exception(_('You have been banned from subscribing.')); @@ -193,7 +185,7 @@ class Subscription extends Managed_DataObject * Cancel a subscription * */ - function cancel($subscriber, $other) + function cancel(Profile $subscriber, Profile $other) { if (!self::exists($subscriber, $other)) { // TRANS: Exception thrown when trying to unsibscribe without a subscription. diff --git a/classes/User.php b/classes/User.php index 55057574db..e8e06a2d40 100644 --- a/classes/User.php +++ b/classes/User.php @@ -225,14 +225,6 @@ class User extends Managed_DataObject return Sms_carrier::getKV('id', $this->carrier); } - /** - * @deprecated use Subscription::start($sub, $other); - */ - function subscribeTo($other) - { - return Subscription::start($this->getProfile(), $other); - } - function hasBlocked($other) { $profile = $this->getProfile(); @@ -437,7 +429,7 @@ class User extends Managed_DataObject common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick), __FILE__); } else { - Subscription::start($user, $defuser); + Subscription::start($profile, $defuser->getProfile()); } } @@ -594,7 +586,7 @@ class User extends Managed_DataObject return Profile_tag::setTags($this->id, $this->id, $newtags, $privacy); } - function block($other) + function block(Profile $other) { // Add a new block record diff --git a/lib/activityobject.php b/lib/activityobject.php index ee69e1c762..741aefdd6b 100644 --- a/lib/activityobject.php +++ b/lib/activityobject.php @@ -506,7 +506,7 @@ class ActivityObject $object->poco = PoCo::fromProfile($profile); - if ($profile->getUser()) { + if ($profile->isLocal()) { $object->extra[] = array('followers', array('url' => common_local_url('subscribers', array('nickname' => $profile->nickname)))); } diff --git a/lib/apiaction.php b/lib/apiaction.php index edd184934f..54c0822448 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -202,7 +202,11 @@ class ApiAction extends Action { $twitter_user = array(); - $user = $profile->getUser(); + try { + $user = $profile->getUser(); + } catch (NoSuchUserException $e) { + $user = null; + } $twitter_user['id'] = intval($profile->id); $twitter_user['name'] = $profile->getBestName(); diff --git a/lib/apiauth.php b/lib/apiauth.php index ecb206bab1..499c502480 100644 --- a/lib/apiauth.php +++ b/lib/apiauth.php @@ -103,6 +103,13 @@ class ApiAuthAction extends ApiAction $this->checkOAuthRequest($oauthReq); } + // NOTE: Make sure we're scoped properly based on the auths! + if (isset($this->auth_user) && !empty($this->auth_user)) { + $this->scoped = $this->auth_user->getProfile(); + } else { + $this->scoped = null; + } + // Reject API calls with the wrong access level if ($this->isReadOnly($args) == false) { diff --git a/lib/command.php b/lib/command.php index e93b7fbfee..57708deaf8 100644 --- a/lib/command.php +++ b/lib/command.php @@ -777,8 +777,7 @@ class SubCommand extends Command } try { - Subscription::start($this->user->getProfile(), - $target); + Subscription::start($this->user->getProfile(), $target); // TRANS: Text shown after having subscribed to another user successfully. // TRANS: %s is the name of the user the subscription was requested for. $channel->output($this->user, sprintf(_('Subscribed to %s.'), $this->other)); @@ -809,8 +808,7 @@ class UnsubCommand extends Command $target = $this->getProfile($this->other); try { - Subscription::cancel($this->user->getProfile(), - $target); + Subscription::cancel($this->user->getProfile(), $target); // TRANS: Text shown after having unsubscribed from another user successfully. // TRANS: %s is the name of the user the unsubscription was requested for. $channel->output($this->user, sprintf(_('Unsubscribed from %s.'), $this->other)); diff --git a/lib/nosuchuserexception.php b/lib/nosuchuserexception.php new file mode 100644 index 0000000000..0fa1c8d3db --- /dev/null +++ b/lib/nosuchuserexception.php @@ -0,0 +1,69 @@ +. + * + * @category Exception + * @package StatusNet + * @author Evan Prodromou + * @author Mikael Nordfeldth + * @copyright 2013 Free Software Foundation, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Class for an exception when a local user is not found by certain criteria + * + * @category Exception + * @package StatusNet + * @author Evan Prodromou + * @author Mikael Nordfeldth + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class NoSuchUserException extends ServerException +{ + public $data = array(); + + /** + * constructor + * + * @param array $data user search criteria + */ + + public function __construct(array $data) + { + // filter on unique keys for local users + foreach(array('id', 'email', 'nickname') as $key) { + if (isset($data[$key]) && !empty($data[$key])) { + $this->data[$key] = $data[$key]; + } + } + + // Here we could log the failed lookup + + parent::__construct(_('No such user found.')); + } +} diff --git a/lib/subs.php b/lib/subs.php index 165bbaa8ff..6ac448b954 100644 --- a/lib/subs.php +++ b/lib/subs.php @@ -26,6 +26,9 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } function subs_subscribe_to($user, $other) { + if (is_a($other, 'User')) { + $other = $other->getProfile(); + } try { Subscription::start($user->getProfile(), $other); return true; @@ -36,6 +39,9 @@ function subs_subscribe_to($user, $other) function subs_unsubscribe_to($user, $other) { + if (is_a($other, 'User')) { + $other = $other->getProfile(); + } try { Subscription::cancel($user->getProfile(), $other); return true; diff --git a/plugins/Activity/ActivityPlugin.php b/plugins/Activity/ActivityPlugin.php index bffd7a3a10..ec8d6d6911 100644 --- a/plugins/Activity/ActivityPlugin.php +++ b/plugins/Activity/ActivityPlugin.php @@ -57,82 +57,88 @@ class ActivityPlugin extends Plugin public $StartLike = false; public $StopLike = false; - function onEndSubscribe($subscriber, $other) + function onEndSubscribe(Profile $profile, Profile $other) { // Only do this if config is enabled if(!$this->StartFollowUser) return true; - $user = $subscriber->getUser(); - if (!empty($user)) { - $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, - 'subscribed' => $other->id)); - // TRANS: Text for "started following" item in activity plugin. - // TRANS: %1$s is a profile URL, %2$s is a profile name, - // TRANS: %3$s is a profile URL, %4$s is a profile name. - $rendered = sprintf(_m('%2$s started following %4$s.'), - $subscriber->profileurl, - $subscriber->getBestName(), - $other->profileurl, - $other->getBestName()); - // TRANS: Text for "started following" item in activity plugin. - // TRANS: %1$s is a profile name, %2$s is a profile URL, - // TRANS: %3$s is a profile name, %4$s is a profile URL. - $content = sprintf(_m('%1$s (%2$s) started following %3$s (%4$s).'), - $subscriber->getBestName(), - $subscriber->profileurl, - $other->getBestName(), - $other->profileurl); - $notice = Notice::saveNew($user->id, - $content, - ActivityPlugin::SOURCE, - array('rendered' => $rendered, - 'urls' => array(), - 'replies' => array($other->getUri()), - 'verb' => ActivityVerb::FOLLOW, - 'object_type' => ActivityObject::PERSON, - 'uri' => $sub->uri)); + if (!$profile->isLocal()) { + // can't do anything with remote user anyway + return true; } + + $sub = Subscription::pkeyGet(array('subscriber' => $profile->id, + 'subscribed' => $other->id)); + // TRANS: Text for "started following" item in activity plugin. + // TRANS: %1$s is a profile URL, %2$s is a profile name, + // TRANS: %3$s is a profile URL, %4$s is a profile name. + $rendered = sprintf(_m('%2$s started following %4$s.'), + $profile->profileurl, + $profile->getBestName(), + $other->profileurl, + $other->getBestName()); + // TRANS: Text for "started following" item in activity plugin. + // TRANS: %1$s is a profile name, %2$s is a profile URL, + // TRANS: %3$s is a profile name, %4$s is a profile URL. + $content = sprintf(_m('%1$s (%2$s) started following %3$s (%4$s).'), + $profile->getBestName(), + $profile->profileurl, + $other->getBestName(), + $other->profileurl); + + $notice = Notice::saveNew($profile->id, + $content, + ActivityPlugin::SOURCE, + array('rendered' => $rendered, + 'urls' => array(), + 'replies' => array($other->getUri()), + 'verb' => ActivityVerb::FOLLOW, + 'object_type' => ActivityObject::PERSON, + 'uri' => $sub->uri)); return true; } - function onEndUnsubscribe($subscriber, $other) + function onEndUnsubscribe(Profile $profile, Profile $other) { // Only do this if config is enabled if(!$this->StopFollowUser) return true; - $user = $subscriber->getUser(); - if (!empty($user)) { - // TRANS: Text for "stopped following" item in activity plugin. - // TRANS: %1$s is a profile URL, %2$s is a profile name, - // TRANS: %3$s is a profile URL, %4$s is a profile name. - $rendered = sprintf(_m('%2$s stopped following %4$s.'), - $subscriber->profileurl, - $subscriber->getBestName(), - $other->profileurl, - $other->getBestName()); - // TRANS: Text for "stopped following" item in activity plugin. - // TRANS: %1$s is a profile name, %2$s is a profile URL, - // TRANS: %3$s is a profile name, %4$s is a profile URL. - $content = sprintf(_m('%1$s (%2$s) stopped following %3$s (%4$s).'), - $subscriber->getBestName(), - $subscriber->profileurl, - $other->getBestName(), - $other->profileurl); - $uri = TagURI::mint('stop-following:%d:%d:%s', - $subscriber->id, - $other->id, - common_date_iso8601(common_sql_now())); - - $notice = Notice::saveNew($user->id, - $content, - ActivityPlugin::SOURCE, - array('rendered' => $rendered, - 'urls' => array(), - 'replies' => array($other->getUri()), - 'uri' => $uri, - 'verb' => ActivityVerb::UNFOLLOW, - 'object_type' => ActivityObject::PERSON)); + if (!$profile->isLocal()) { + return true; } + + // TRANS: Text for "stopped following" item in activity plugin. + // TRANS: %1$s is a profile URL, %2$s is a profile name, + // TRANS: %3$s is a profile URL, %4$s is a profile name. + $rendered = sprintf(_m('%2$s stopped following %4$s.'), + $profile->profileurl, + $profile->getBestName(), + $other->profileurl, + $other->getBestName()); + // TRANS: Text for "stopped following" item in activity plugin. + // TRANS: %1$s is a profile name, %2$s is a profile URL, + // TRANS: %3$s is a profile name, %4$s is a profile URL. + $content = sprintf(_m('%1$s (%2$s) stopped following %3$s (%4$s).'), + $profile->getBestName(), + $profile->profileurl, + $other->getBestName(), + $other->profileurl); + + $uri = TagURI::mint('stop-following:%d:%d:%s', + $profile->id, + $other->id, + common_date_iso8601(common_sql_now())); + + $notice = Notice::saveNew($profile->id, + $content, + ActivityPlugin::SOURCE, + array('rendered' => $rendered, + 'urls' => array(), + 'replies' => array($other->getUri()), + 'uri' => $uri, + 'verb' => ActivityVerb::UNFOLLOW, + 'object_type' => ActivityObject::PERSON)); + return true; } @@ -141,42 +147,42 @@ class ActivityPlugin extends Plugin // Only do this if config is enabled if(!$this->StartLike) return true; - $user = $profile->getUser(); - - if (!empty($user)) { - - $author = $notice->getProfile(); - $fave = Fave::pkeyGet(array('user_id' => $user->id, - 'notice_id' => $notice->id)); - - // TRANS: Text for "liked" item in activity plugin. - // TRANS: %1$s is a profile URL, %2$s is a profile name, - // TRANS: %3$s is a notice URL, %4$s is an author name. - $rendered = sprintf(_m('%2$s liked %4$s\'s update.'), - $profile->profileurl, - $profile->getBestName(), - $notice->bestUrl(), - $author->getBestName()); - // TRANS: Text for "liked" item in activity plugin. - // TRANS: %1$s is a profile name, %2$s is a profile URL, - // TRANS: %3$s is an author name, %4$s is a notice URL. - $content = sprintf(_m('%1$s (%2$s) liked %3$s\'s status (%4$s).'), - $profile->getBestName(), - $profile->profileurl, - $author->getBestName(), - $notice->bestUrl()); - - $notice = Notice::saveNew($user->id, - $content, - ActivityPlugin::SOURCE, - array('rendered' => $rendered, - 'urls' => array(), - 'replies' => array($author->getUri()), - 'uri' => $fave->getURI(), - 'verb' => ActivityVerb::FAVORITE, - 'object_type' => (($notice->verb == ActivityVerb::POST) ? - $notice->object_type : ActivityObject::ACTIVITY))); + if (!$profile->isLocal()) { + return true; } + + $author = $notice->getProfile(); + $fave = Fave::pkeyGet(array('user_id' => $profile->id, + 'notice_id' => $notice->id)); + + // TRANS: Text for "liked" item in activity plugin. + // TRANS: %1$s is a profile URL, %2$s is a profile name, + // TRANS: %3$s is a notice URL, %4$s is an author name. + $rendered = sprintf(_m('%2$s liked %4$s\'s update.'), + $profile->profileurl, + $profile->getBestName(), + $notice->bestUrl(), + $author->getBestName()); + // TRANS: Text for "liked" item in activity plugin. + // TRANS: %1$s is a profile name, %2$s is a profile URL, + // TRANS: %3$s is an author name, %4$s is a notice URL. + $content = sprintf(_m('%1$s (%2$s) liked %3$s\'s status (%4$s).'), + $profile->getBestName(), + $profile->profileurl, + $author->getBestName(), + $notice->bestUrl()); + + $notice = Notice::saveNew($profile->id, + $content, + ActivityPlugin::SOURCE, + array('rendered' => $rendered, + 'urls' => array(), + 'replies' => array($author->getUri()), + 'uri' => $fave->getURI(), + 'verb' => ActivityVerb::FAVORITE, + 'object_type' => (($notice->verb == ActivityVerb::POST) ? + $notice->object_type : ActivityObject::ACTIVITY))); + return true; } @@ -184,43 +190,45 @@ class ActivityPlugin extends Plugin { // Only do this if config is enabled if(!$this->StopLike) return true; - $user = User::getKV('id', $profile->id); - if (!empty($user)) { - $author = Profile::getKV('id', $notice->profile_id); - // TRANS: Text for "stopped liking" item in activity plugin. - // TRANS: %1$s is a profile URL, %2$s is a profile name, - // TRANS: %3$s is a notice URL, %4$s is an author name. - $rendered = sprintf(_m('%2$s stopped liking %4$s\'s update.'), - $profile->profileurl, - $profile->getBestName(), - $notice->bestUrl(), - $author->getBestName()); - // TRANS: Text for "stopped liking" item in activity plugin. - // TRANS: %1$s is a profile name, %2$s is a profile URL, - // TRANS: %3$s is an author name, %4$s is a notice URL. - $content = sprintf(_m('%1$s (%2$s) stopped liking %3$s\'s status (%4$s).'), - $profile->getBestName(), - $profile->profileurl, - $author->getBestName(), - $notice->bestUrl()); - - $uri = TagURI::mint('unlike:%d:%d:%s', - $profile->id, - $notice->id, - common_date_iso8601(common_sql_now())); - - $notice = Notice::saveNew($user->id, - $content, - ActivityPlugin::SOURCE, - array('rendered' => $rendered, - 'urls' => array(), - 'replies' => array($author->getUri()), - 'uri' => $uri, - 'verb' => ActivityVerb::UNFAVORITE, - 'object_type' => (($notice->verb == ActivityVerb::POST) ? - $notice->object_type : ActivityObject::ACTIVITY))); + if (!$profile->isLocal()) { + return true; } + + $author = Profile::getKV('id', $notice->profile_id); + // TRANS: Text for "stopped liking" item in activity plugin. + // TRANS: %1$s is a profile URL, %2$s is a profile name, + // TRANS: %3$s is a notice URL, %4$s is an author name. + $rendered = sprintf(_m('%2$s stopped liking %4$s\'s update.'), + $profile->profileurl, + $profile->getBestName(), + $notice->bestUrl(), + $author->getBestName()); + // TRANS: Text for "stopped liking" item in activity plugin. + // TRANS: %1$s is a profile name, %2$s is a profile URL, + // TRANS: %3$s is an author name, %4$s is a notice URL. + $content = sprintf(_m('%1$s (%2$s) stopped liking %3$s\'s status (%4$s).'), + $profile->getBestName(), + $profile->profileurl, + $author->getBestName(), + $notice->bestUrl()); + + $uri = TagURI::mint('unlike:%d:%d:%s', + $profile->id, + $notice->id, + common_date_iso8601(common_sql_now())); + + $notice = Notice::saveNew($profile->id, + $content, + ActivityPlugin::SOURCE, + array('rendered' => $rendered, + 'urls' => array(), + 'replies' => array($author->getUri()), + 'uri' => $uri, + 'verb' => ActivityVerb::UNFAVORITE, + 'object_type' => (($notice->verb == ActivityVerb::POST) ? + $notice->object_type : ActivityObject::ACTIVITY))); + return true; } @@ -229,9 +237,7 @@ class ActivityPlugin extends Plugin // Only do this if config is enabled if(!$this->JoinGroup) return true; - $user = $profile->getUser(); - - if (empty($user)) { + if (!$profile->isLocal()) { return true; } @@ -255,7 +261,7 @@ class ActivityPlugin extends Plugin $mem = Group_member::pkeyGet(array('group_id' => $group->id, 'profile_id' => $profile->id)); - $notice = Notice::saveNew($user->id, + $notice = Notice::saveNew($profile->id, $content, ActivityPlugin::SOURCE, array('rendered' => $rendered, @@ -272,9 +278,7 @@ class ActivityPlugin extends Plugin // Only do this if config is enabled if(!$this->LeaveGroup) return true; - $user = $profile->getUser(); - - if (empty($user)) { + if (!$profile->isLocal()) { return true; } @@ -296,11 +300,11 @@ class ActivityPlugin extends Plugin $group->homeUrl()); $uri = TagURI::mint('leave:%d:%d:%s', - $user->id, + $profile->id, $group->id, common_date_iso8601(common_sql_now())); - $notice = Notice::saveNew($user->id, + $notice = Notice::saveNew($profile->id, $content, ActivityPlugin::SOURCE, array('rendered' => $rendered, diff --git a/plugins/Blacklist/BlacklistPlugin.php b/plugins/Blacklist/BlacklistPlugin.php index 2a99e65f11..142ec2d056 100644 --- a/plugins/Blacklist/BlacklistPlugin.php +++ b/plugins/Blacklist/BlacklistPlugin.php @@ -481,7 +481,7 @@ class BlacklistPlugin extends Plugin /** * Check URLs and homepages for blacklisted users. */ - function onStartSubscribe($subscriber, $other) + function onStartSubscribe(Profile $subscriber, Profile $other) { foreach (array($other->profileurl, $other->homepage) as $url) { diff --git a/plugins/Blog/classes/Blog_entry.php b/plugins/Blog/classes/Blog_entry.php index b7de821d92..5e0effcc74 100644 --- a/plugins/Blog/classes/Blog_entry.php +++ b/plugins/Blog/classes/Blog_entry.php @@ -158,9 +158,10 @@ class Blog_entry extends Managed_DataObject // Use user's preferences for short URLs, if possible try { - $user = $profile->getUser(); - $shortUrl = File_redirection::makeShort($url, - empty($user) ? null : $user); + $user = $profile->isLocal() + ? $profile->getUser() + : null; + $shortUrl = File_redirection::makeShort($url, $user); } catch (Exception $e) { // Don't let this stop us. $shortUrl = $url; diff --git a/plugins/Gravatar/GravatarPlugin.php b/plugins/Gravatar/GravatarPlugin.php index bdb73f3433..2cb6bd8cac 100644 --- a/plugins/Gravatar/GravatarPlugin.php +++ b/plugins/Gravatar/GravatarPlugin.php @@ -33,13 +33,17 @@ class GravatarPlugin extends Plugin function onEndProfileGetAvatar($profile, $size, &$avatar) { if (empty($avatar)) { - $user = $profile->getUser(); - if (!empty($user) && !empty($user->email)) { - // Fake one! - $avatar = new Avatar(); - $avatar->width = $avatar->height = $size; - $avatar->url = $this->gravatar_url($user->email, $size); - return false; + try { + $user = $profile->getUser(); + if (!empty($user->email)) { + // Fake one! + $avatar = new Avatar(); + $avatar->width = $avatar->height = $size; + $avatar->url = $this->gravatar_url($user->email, $size); + return false; + } + } catch (NoSuchUserException $e) { + return true; } } diff --git a/plugins/OMB/OMBPlugin.php b/plugins/OMB/OMBPlugin.php index e2552e8e08..cd319d24c2 100644 --- a/plugins/OMB/OMBPlugin.php +++ b/plugins/OMB/OMBPlugin.php @@ -182,16 +182,16 @@ class OMBPlugin extends Plugin /** * Check for illegal subscription attempts * - * @param User $user subscriber + * @param Profile $profile subscriber * @param Profile $other subscribee * @return hook return value */ - function onStartSubscribe($profile, $other) + function onStartSubscribe(Profile $profile, Profile $other) { // OMB 0.1 doesn't have a mechanism for local-server- // originated subscription. - $omb01 = Remote_profile::getKV('id', $other_id); + $omb01 = Remote_profile::getKV('id', $other->id); if (!empty($omb01)) { throw new ClientException( @@ -257,14 +257,14 @@ class OMBPlugin extends Plugin /** * Remove old OMB subscription tokens * - * @param User $user subscriber + * @param Profile $profile subscriber * @param Profile $other subscribee * @return hook return value */ - function onEndUnsubscribe($profile, $other) + function onEndUnsubscribe(Profile $profile, Profile $other) { $sub = Subscription::pkeyGet( - array('subscriber' => $subscriber->id, 'subscribed' => $other->id) + array('subscriber' => $profile->id, 'subscribed' => $other->id) ); if (!empty($sub->token)) { diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index bcb8a3098c..d34535bdcb 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -601,18 +601,16 @@ class OStatusPlugin extends Plugin * @fixme If something else aborts later, we could end up with a stray * PuSH subscription. This is relatively harmless, though. * - * @param Profile $subscriber - * @param Profile $other + * @param Profile $profile subscriber + * @param Profile $other subscribee * * @return hook return code * * @throws Exception */ - function onStartSubscribe($subscriber, $other) + function onStartSubscribe(Profile $profile, Profile $other) { - $user = User::getKV('id', $subscriber->id); - - if (empty($user)) { + if (!$profile->isLocal()) { return true; } @@ -632,18 +630,16 @@ class OStatusPlugin extends Plugin * Having established a remote subscription, send a notification to the * remote OStatus profile's endpoint. * - * @param Profile $subscriber - * @param Profile $other + * @param Profile $profile subscriber + * @param Profile $other subscribee * * @return hook return code * * @throws Exception */ - function onEndSubscribe($subscriber, $other) + function onEndSubscribe(Profile $profile, Profile $other) { - $user = User::getKV('id', $subscriber->id); - - if (empty($user)) { + if (!$profile->isLocal()) { return true; } @@ -653,12 +649,12 @@ class OStatusPlugin extends Plugin return true; } - $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, + $sub = Subscription::pkeyGet(array('subscriber' => $profile->id, 'subscribed' => $other->id)); $act = $sub->asActivity(); - $oprofile->notifyActivity($act, $subscriber); + $oprofile->notifyActivity($act, $profile); return true; } @@ -671,11 +667,9 @@ class OStatusPlugin extends Plugin * @param Profile $other * @return hook return value */ - function onEndUnsubscribe($profile, $other) + function onEndUnsubscribe(Profile $profile, Profile $other) { - $user = User::getKV('id', $profile->id); - - if (empty($user)) { + if (!$profile->isLocal()) { return true; } diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 2c2bce0fe6..59bd6761ca 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -298,7 +298,7 @@ class OStatusSubAction extends Action if ($user->isSubscribed($local)) { // TRANS: OStatus remote subscription dialog error. $this->showForm(_m('Already subscribed!')); - } elseif (Subscription::start($user, $local)) { + } elseif (Subscription::start($user->getProfile(), $local)) { $this->success(); } else { // TRANS: OStatus remote subscription dialog error. diff --git a/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php b/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php index 9e6fc9cab7..2bc6d0fa62 100644 --- a/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php +++ b/plugins/SubscriptionThrottle/SubscriptionThrottlePlugin.php @@ -55,15 +55,15 @@ class SubscriptionThrottlePlugin extends Plugin /** * Filter subscriptions to see if they're coming too fast. * - * @param User $user The user subscribing - * @param User $other The user being subscribed to + * @param Profile $profile The profile subscribing + * @param Profile $other The profile being subscribed to * * @return boolean hook value */ - function onStartSubscribe($user, $other) + function onStartSubscribe(Profile $profile, $other) { foreach ($this->subLimits as $seconds => $limit) { - $sub = $this->_getNthSub($user, $limit); + $sub = $this->_getNthSub($profile, $limit); if (!empty($sub)) { $subtime = strtotime($sub->created); @@ -105,18 +105,18 @@ class SubscriptionThrottlePlugin extends Plugin } /** - * Get the Nth most recent subscription for this user + * Get the Nth most recent subscription for this profile * - * @param User $user The user to get subscriptions for - * @param integer $n How far to count back + * @param Profile $profile profile to get subscriptions for + * @param integer $n How far to count back * * @return Subscription a subscription or null */ - private function _getNthSub($user, $n) + private function _getNthSub(Profile $profile, $n) { $sub = new Subscription(); - $sub->subscriber = $user->id; + $sub->subscriber = $profile->id; $sub->orderBy('created DESC'); $sub->limit($n - 1, 1); @@ -128,14 +128,14 @@ class SubscriptionThrottlePlugin extends Plugin } /** - * Get the Nth most recent group membership for this user + * Get the Nth most recent group membership for this profile * * @param Profile $profile The user to get memberships for * @param integer $n How far to count back * * @return Group_member a membership or null */ - private function _getNthMem($profile, $n) + private function _getNthMem(Profile $profile, $n) { $mem = new Group_member();