GitHost.io will be shut down on June 1, 2019. At that point this instance will be unreachable and all data will be irrevocably deleted. More details at https://about.gitlab.com/gitlab-hosted/#githost-is-shutting-down-on-june-1st-2019

Commit 747fe9d5 authored by mmn's avatar mmn

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.
parent c5bf6cb0
......@@ -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
......
......@@ -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);
}
}
......
......@@ -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
......
......@@ -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)
......
......@@ -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.
......
......@@ -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
......
......@@ -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))));
}
......
......@@ -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();
......
......@@ -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) {
......
......@@ -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));
......
<?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.'));
}
}
......@@ -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;
......
This diff is collapsed.
......@@ -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) {
......
......@@ -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;
......
......@@ -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;
}
}
......
......@@ -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)) {
......
......@@ -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;
}
......
......@@ -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.
......
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment