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.
This commit is contained in:
Mikael Nordfeldth 2013-09-09 21:35:16 +02:00
parent c5bf6cb05e
commit 747fe9d59b
20 changed files with 317 additions and 236 deletions

View File

@ -725,20 +725,20 @@ EndUnblockProfile: when an unblock has succeeded
- $profile: the person unblocked, can be remote - $profile: the person unblocked, can be remote
StartSubscribe: when a subscription is starting StartSubscribe: when a subscription is starting
- $user: the person subscribing - $profile: Profile that is subscribing
- $other: the person being subscribed to - $other: Profile that is being subscribed to
EndSubscribe: when a subscription is finished EndSubscribe: when a subscription is finished
- $user: the person subscribing - $profile: Profile that is subscribing
- $other: the person being subscribed to - $other: Profile that is being subscribed to
StartUnsubscribe: when an unsubscribe is starting StartUnsubscribe: when an unsubscribe is starting
- $user: the person unsubscribing - $profile: Profile that is unsubscribing
- $other: the person being unsubscribed from - $other: Profile that is being unsubscribed from
EndUnsubscribe: when an unsubscribe is done EndUnsubscribe: when an unsubscribe is done
- $user: the person unsubscribing - $profile: Profile that is unsubscribing
- $other: the person being unsubscribed to - $other: Profile that is being unsubscribed from
StartJoinGroup: when a user is joining a group StartJoinGroup: when a user is joining a group
- $group: the group being joined - $group: the group being joined

View File

@ -175,7 +175,6 @@ class FoafAction extends Action
common_debug('Got a bad subscription: '.print_r($sub,true)); common_debug('Got a bad subscription: '.print_r($sub,true));
continue; continue;
} }
$user = $profile->getUser();
$other_uri = $profile->getUri(); $other_uri = $profile->getUri();
if (array_key_exists($other_uri, $person)) { if (array_key_exists($other_uri, $person)) {
$person[$other_uri][0] = BOTH; $person[$other_uri][0] = BOTH;
@ -183,7 +182,7 @@ class FoafAction extends Action
$person[$other_uri] = array(LISTENER, $person[$other_uri] = array(LISTENER,
$profile->id, $profile->id,
$profile->nickname, $profile->nickname,
$user ? 'local' : 'remote'); $profile->isLocal() ? 'local' : 'remote');
} }
unset($profile); unset($profile);
} }
@ -289,13 +288,12 @@ class FoafAction extends Action
common_debug('Got a bad subscription: '.print_r($sub,true)); common_debug('Got a bad subscription: '.print_r($sub,true));
continue; continue;
} }
$user = $profile->getUser();
$other_uri = $profile->getUri(); $other_uri = $profile->getUri();
$this->element('sioc:follows', array('rdf:resource' => $other_uri.'#acct')); $this->element('sioc:follows', array('rdf:resource' => $other_uri.'#acct'));
$person[$other_uri] = array(LISTENEE, $person[$other_uri] = array(LISTENEE,
$profile->id, $profile->id,
$profile->nickname, $profile->nickname,
$user ? 'local' : 'remote'); $profile->isLocal() ? 'local' : 'remote');
unset($profile); unset($profile);
} }
} }

View File

@ -522,14 +522,16 @@ class Notice extends Managed_DataObject
// For private streams // For private streams
$user = $profile->getUser(); try {
$user = $profile->getUser();
if (!empty($user)) {
if ($user->private_stream && if ($user->private_stream &&
($notice->scope == Notice::PUBLIC_SCOPE || ($notice->scope == Notice::PUBLIC_SCOPE ||
$notice->scope == Notice::SITE_SCOPE)) { $notice->scope == Notice::SITE_SCOPE)) {
$notice->scope |= Notice::FOLLOWER_SCOPE; $notice->scope |= Notice::FOLLOWER_SCOPE;
} }
} catch (NoSuchUserException $e) {
// Cannot handle private streams for remote profiles
} }
// Force the scope for private groups // Force the scope for private groups
@ -2420,11 +2422,8 @@ class Notice extends Managed_DataObject
// Only for users on this site // Only for users on this site
if ($scope & Notice::SITE_SCOPE) { if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) {
$user = $profile->getUser(); return false;
if (empty($user)) {
return false;
}
} }
// Only for users mentioned in the notice // Only for users mentioned in the notice

View File

@ -84,15 +84,28 @@ class Profile extends Managed_DataObject
protected $_user = -1; // Uninitialized value distinct from null 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); $this->_user = User::getKV('id', $this->id);
} }
if (!is_a($this->_user, 'User')) {
throw new NoSuchUserException(array('id'=>$this->id));
}
return $this->_user; return $this->_user;
} }
public function isLocal()
{
try {
$this->getUser();
} catch (NoSuchUserException $e) {
return false;
}
return true;
}
protected $_avatars; protected $_avatars;
function getAvatar($width, $height=null) function getAvatar($width, $height=null)

View File

@ -79,16 +79,8 @@ class Subscription extends Managed_DataObject
* @return mixed Subscription or Subscription_queue: new subscription info * @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)) { if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
// TRANS: Exception thrown when trying to subscribe while being banned from subscribing. // TRANS: Exception thrown when trying to subscribe while being banned from subscribing.
throw new Exception(_('You have been banned from subscribing.')); throw new Exception(_('You have been banned from subscribing.'));
@ -193,7 +185,7 @@ class Subscription extends Managed_DataObject
* Cancel a subscription * Cancel a subscription
* *
*/ */
function cancel($subscriber, $other) function cancel(Profile $subscriber, Profile $other)
{ {
if (!self::exists($subscriber, $other)) { if (!self::exists($subscriber, $other)) {
// TRANS: Exception thrown when trying to unsibscribe without a subscription. // TRANS: Exception thrown when trying to unsibscribe without a subscription.

View File

@ -225,14 +225,6 @@ class User extends Managed_DataObject
return Sms_carrier::getKV('id', $this->carrier); 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) function hasBlocked($other)
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
@ -437,7 +429,7 @@ class User extends Managed_DataObject
common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick), common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick),
__FILE__); __FILE__);
} else { } 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); return Profile_tag::setTags($this->id, $this->id, $newtags, $privacy);
} }
function block($other) function block(Profile $other)
{ {
// Add a new block record // Add a new block record

View File

@ -506,7 +506,7 @@ class ActivityObject
$object->poco = PoCo::fromProfile($profile); $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)))); $object->extra[] = array('followers', array('url' => common_local_url('subscribers', array('nickname' => $profile->nickname))));
} }

View File

@ -202,7 +202,11 @@ class ApiAction extends Action
{ {
$twitter_user = array(); $twitter_user = array();
$user = $profile->getUser(); try {
$user = $profile->getUser();
} catch (NoSuchUserException $e) {
$user = null;
}
$twitter_user['id'] = intval($profile->id); $twitter_user['id'] = intval($profile->id);
$twitter_user['name'] = $profile->getBestName(); $twitter_user['name'] = $profile->getBestName();

View File

@ -103,6 +103,13 @@ class ApiAuthAction extends ApiAction
$this->checkOAuthRequest($oauthReq); $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 // Reject API calls with the wrong access level
if ($this->isReadOnly($args) == false) { if ($this->isReadOnly($args) == false) {

View File

@ -777,8 +777,7 @@ class SubCommand extends Command
} }
try { try {
Subscription::start($this->user->getProfile(), Subscription::start($this->user->getProfile(), $target);
$target);
// TRANS: Text shown after having subscribed to another user successfully. // TRANS: Text shown after having subscribed to another user successfully.
// TRANS: %s is the name of the user the subscription was requested for. // TRANS: %s is the name of the user the subscription was requested for.
$channel->output($this->user, sprintf(_('Subscribed to %s.'), $this->other)); $channel->output($this->user, sprintf(_('Subscribed to %s.'), $this->other));
@ -809,8 +808,7 @@ class UnsubCommand extends Command
$target = $this->getProfile($this->other); $target = $this->getProfile($this->other);
try { try {
Subscription::cancel($this->user->getProfile(), Subscription::cancel($this->user->getProfile(), $target);
$target);
// TRANS: Text shown after having unsubscribed from another user successfully. // TRANS: Text shown after having unsubscribed from another user successfully.
// TRANS: %s is the name of the user the unsubscription was requested for. // TRANS: %s is the name of the user the unsubscription was requested for.
$channel->output($this->user, sprintf(_('Unsubscribed from %s.'), $this->other)); $channel->output($this->user, sprintf(_('Unsubscribed from %s.'), $this->other));

View File

@ -0,0 +1,69 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* class for an exception when a local user is not found by certain criteria
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Exception
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @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 <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @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.'));
}
}

View File

@ -26,6 +26,9 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
function subs_subscribe_to($user, $other) function subs_subscribe_to($user, $other)
{ {
if (is_a($other, 'User')) {
$other = $other->getProfile();
}
try { try {
Subscription::start($user->getProfile(), $other); Subscription::start($user->getProfile(), $other);
return true; return true;
@ -36,6 +39,9 @@ function subs_subscribe_to($user, $other)
function subs_unsubscribe_to($user, $other) function subs_unsubscribe_to($user, $other)
{ {
if (is_a($other, 'User')) {
$other = $other->getProfile();
}
try { try {
Subscription::cancel($user->getProfile(), $other); Subscription::cancel($user->getProfile(), $other);
return true; return true;

View File

@ -57,82 +57,88 @@ class ActivityPlugin extends Plugin
public $StartLike = false; public $StartLike = false;
public $StopLike = false; public $StopLike = false;
function onEndSubscribe($subscriber, $other) function onEndSubscribe(Profile $profile, Profile $other)
{ {
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->StartFollowUser) return true; 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('<a href="%1$s">%2$s</a> started following <a href="%3$s">%4$s</a>.'),
$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, if (!$profile->isLocal()) {
$content, // can't do anything with remote user anyway
ActivityPlugin::SOURCE, return true;
array('rendered' => $rendered,
'urls' => array(),
'replies' => array($other->getUri()),
'verb' => ActivityVerb::FOLLOW,
'object_type' => ActivityObject::PERSON,
'uri' => $sub->uri));
} }
$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('<a href="%1$s">%2$s</a> started following <a href="%3$s">%4$s</a>.'),
$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; return true;
} }
function onEndUnsubscribe($subscriber, $other) function onEndUnsubscribe(Profile $profile, Profile $other)
{ {
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->StopFollowUser) return true; 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('<a href="%1$s">%2$s</a> stopped following <a href="%3$s">%4$s</a>.'),
$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', if (!$profile->isLocal()) {
$subscriber->id, return true;
$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));
} }
// 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('<a href="%1$s">%2$s</a> stopped following <a href="%3$s">%4$s</a>.'),
$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; return true;
} }
@ -141,42 +147,42 @@ class ActivityPlugin extends Plugin
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->StartLike) return true; if(!$this->StartLike) return true;
$user = $profile->getUser(); if (!$profile->isLocal()) {
return true;
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('<a href="%1$s">%2$s</a> liked <a href="%3$s">%4$s\'s update</a>.'),
$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)));
} }
$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('<a href="%1$s">%2$s</a> liked <a href="%3$s">%4$s\'s update</a>.'),
$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; return true;
} }
@ -184,43 +190,45 @@ class ActivityPlugin extends Plugin
{ {
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->StopLike) return true; if(!$this->StopLike) return true;
$user = User::getKV('id', $profile->id);
if (!empty($user)) { if (!$profile->isLocal()) {
$author = Profile::getKV('id', $notice->profile_id); return true;
// 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('<a href="%1$s">%2$s</a> stopped liking <a href="%3$s">%4$s\'s update</a>.'),
$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)));
} }
$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('<a href="%1$s">%2$s</a> stopped liking <a href="%3$s">%4$s\'s update</a>.'),
$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; return true;
} }
@ -229,9 +237,7 @@ class ActivityPlugin extends Plugin
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->JoinGroup) return true; if(!$this->JoinGroup) return true;
$user = $profile->getUser(); if (!$profile->isLocal()) {
if (empty($user)) {
return true; return true;
} }
@ -255,7 +261,7 @@ class ActivityPlugin extends Plugin
$mem = Group_member::pkeyGet(array('group_id' => $group->id, $mem = Group_member::pkeyGet(array('group_id' => $group->id,
'profile_id' => $profile->id)); 'profile_id' => $profile->id));
$notice = Notice::saveNew($user->id, $notice = Notice::saveNew($profile->id,
$content, $content,
ActivityPlugin::SOURCE, ActivityPlugin::SOURCE,
array('rendered' => $rendered, array('rendered' => $rendered,
@ -272,9 +278,7 @@ class ActivityPlugin extends Plugin
// Only do this if config is enabled // Only do this if config is enabled
if(!$this->LeaveGroup) return true; if(!$this->LeaveGroup) return true;
$user = $profile->getUser(); if (!$profile->isLocal()) {
if (empty($user)) {
return true; return true;
} }
@ -296,11 +300,11 @@ class ActivityPlugin extends Plugin
$group->homeUrl()); $group->homeUrl());
$uri = TagURI::mint('leave:%d:%d:%s', $uri = TagURI::mint('leave:%d:%d:%s',
$user->id, $profile->id,
$group->id, $group->id,
common_date_iso8601(common_sql_now())); common_date_iso8601(common_sql_now()));
$notice = Notice::saveNew($user->id, $notice = Notice::saveNew($profile->id,
$content, $content,
ActivityPlugin::SOURCE, ActivityPlugin::SOURCE,
array('rendered' => $rendered, array('rendered' => $rendered,

View File

@ -481,7 +481,7 @@ class BlacklistPlugin extends Plugin
/** /**
* Check URLs and homepages for blacklisted users. * 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) { foreach (array($other->profileurl, $other->homepage) as $url) {

View File

@ -158,9 +158,10 @@ class Blog_entry extends Managed_DataObject
// Use user's preferences for short URLs, if possible // Use user's preferences for short URLs, if possible
try { try {
$user = $profile->getUser(); $user = $profile->isLocal()
$shortUrl = File_redirection::makeShort($url, ? $profile->getUser()
empty($user) ? null : $user); : null;
$shortUrl = File_redirection::makeShort($url, $user);
} catch (Exception $e) { } catch (Exception $e) {
// Don't let this stop us. // Don't let this stop us.
$shortUrl = $url; $shortUrl = $url;

View File

@ -33,13 +33,17 @@ class GravatarPlugin extends Plugin
function onEndProfileGetAvatar($profile, $size, &$avatar) function onEndProfileGetAvatar($profile, $size, &$avatar)
{ {
if (empty($avatar)) { if (empty($avatar)) {
$user = $profile->getUser(); try {
if (!empty($user) && !empty($user->email)) { $user = $profile->getUser();
// Fake one! if (!empty($user->email)) {
$avatar = new Avatar(); // Fake one!
$avatar->width = $avatar->height = $size; $avatar = new Avatar();
$avatar->url = $this->gravatar_url($user->email, $size); $avatar->width = $avatar->height = $size;
return false; $avatar->url = $this->gravatar_url($user->email, $size);
return false;
}
} catch (NoSuchUserException $e) {
return true;
} }
} }

View File

@ -182,16 +182,16 @@ class OMBPlugin extends Plugin
/** /**
* Check for illegal subscription attempts * Check for illegal subscription attempts
* *
* @param User $user subscriber * @param Profile $profile subscriber
* @param Profile $other subscribee * @param Profile $other subscribee
* @return hook return value * @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- // OMB 0.1 doesn't have a mechanism for local-server-
// originated subscription. // originated subscription.
$omb01 = Remote_profile::getKV('id', $other_id); $omb01 = Remote_profile::getKV('id', $other->id);
if (!empty($omb01)) { if (!empty($omb01)) {
throw new ClientException( throw new ClientException(
@ -257,14 +257,14 @@ class OMBPlugin extends Plugin
/** /**
* Remove old OMB subscription tokens * Remove old OMB subscription tokens
* *
* @param User $user subscriber * @param Profile $profile subscriber
* @param Profile $other subscribee * @param Profile $other subscribee
* @return hook return value * @return hook return value
*/ */
function onEndUnsubscribe($profile, $other) function onEndUnsubscribe(Profile $profile, Profile $other)
{ {
$sub = Subscription::pkeyGet( $sub = Subscription::pkeyGet(
array('subscriber' => $subscriber->id, 'subscribed' => $other->id) array('subscriber' => $profile->id, 'subscribed' => $other->id)
); );
if (!empty($sub->token)) { if (!empty($sub->token)) {

View File

@ -601,18 +601,16 @@ class OStatusPlugin extends Plugin
* @fixme If something else aborts later, we could end up with a stray * @fixme If something else aborts later, we could end up with a stray
* PuSH subscription. This is relatively harmless, though. * PuSH subscription. This is relatively harmless, though.
* *
* @param Profile $subscriber * @param Profile $profile subscriber
* @param Profile $other * @param Profile $other subscribee
* *
* @return hook return code * @return hook return code
* *
* @throws Exception * @throws Exception
*/ */
function onStartSubscribe($subscriber, $other) function onStartSubscribe(Profile $profile, Profile $other)
{ {
$user = User::getKV('id', $subscriber->id); if (!$profile->isLocal()) {
if (empty($user)) {
return true; return true;
} }
@ -632,18 +630,16 @@ class OStatusPlugin extends Plugin
* Having established a remote subscription, send a notification to the * Having established a remote subscription, send a notification to the
* remote OStatus profile's endpoint. * remote OStatus profile's endpoint.
* *
* @param Profile $subscriber * @param Profile $profile subscriber
* @param Profile $other * @param Profile $other subscribee
* *
* @return hook return code * @return hook return code
* *
* @throws Exception * @throws Exception
*/ */
function onEndSubscribe($subscriber, $other) function onEndSubscribe(Profile $profile, Profile $other)
{ {
$user = User::getKV('id', $subscriber->id); if (!$profile->isLocal()) {
if (empty($user)) {
return true; return true;
} }
@ -653,12 +649,12 @@ class OStatusPlugin extends Plugin
return true; return true;
} }
$sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, $sub = Subscription::pkeyGet(array('subscriber' => $profile->id,
'subscribed' => $other->id)); 'subscribed' => $other->id));
$act = $sub->asActivity(); $act = $sub->asActivity();
$oprofile->notifyActivity($act, $subscriber); $oprofile->notifyActivity($act, $profile);
return true; return true;
} }
@ -671,11 +667,9 @@ class OStatusPlugin extends Plugin
* @param Profile $other * @param Profile $other
* @return hook return value * @return hook return value
*/ */
function onEndUnsubscribe($profile, $other) function onEndUnsubscribe(Profile $profile, Profile $other)
{ {
$user = User::getKV('id', $profile->id); if (!$profile->isLocal()) {
if (empty($user)) {
return true; return true;
} }

View File

@ -298,7 +298,7 @@ class OStatusSubAction extends Action
if ($user->isSubscribed($local)) { if ($user->isSubscribed($local)) {
// TRANS: OStatus remote subscription dialog error. // TRANS: OStatus remote subscription dialog error.
$this->showForm(_m('Already subscribed!')); $this->showForm(_m('Already subscribed!'));
} elseif (Subscription::start($user, $local)) { } elseif (Subscription::start($user->getProfile(), $local)) {
$this->success(); $this->success();
} else { } else {
// TRANS: OStatus remote subscription dialog error. // TRANS: OStatus remote subscription dialog error.

View File

@ -55,15 +55,15 @@ class SubscriptionThrottlePlugin extends Plugin
/** /**
* Filter subscriptions to see if they're coming too fast. * Filter subscriptions to see if they're coming too fast.
* *
* @param User $user The user subscribing * @param Profile $profile The profile subscribing
* @param User $other The user being subscribed to * @param Profile $other The profile being subscribed to
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onStartSubscribe($user, $other) function onStartSubscribe(Profile $profile, $other)
{ {
foreach ($this->subLimits as $seconds => $limit) { foreach ($this->subLimits as $seconds => $limit) {
$sub = $this->_getNthSub($user, $limit); $sub = $this->_getNthSub($profile, $limit);
if (!empty($sub)) { if (!empty($sub)) {
$subtime = strtotime($sub->created); $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 Profile $profile profile to get subscriptions for
* @param integer $n How far to count back * @param integer $n How far to count back
* *
* @return Subscription a subscription or null * @return Subscription a subscription or null
*/ */
private function _getNthSub($user, $n) private function _getNthSub(Profile $profile, $n)
{ {
$sub = new Subscription(); $sub = new Subscription();
$sub->subscriber = $user->id; $sub->subscriber = $profile->id;
$sub->orderBy('created DESC'); $sub->orderBy('created DESC');
$sub->limit($n - 1, 1); $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 Profile $profile The user to get memberships for
* @param integer $n How far to count back * @param integer $n How far to count back
* *
* @return Group_member a membership or null * @return Group_member a membership or null
*/ */
private function _getNthMem($profile, $n) private function _getNthMem(Profile $profile, $n)
{ {
$mem = new Group_member(); $mem = new Group_member();