We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Commit 747fe9d5 authored by mattl's avatar mattl

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;
......
<
......@@ -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('<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,
$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('<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;
}
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('<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',
$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('<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;
}
......@@ -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('<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)));
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('<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;
}
......@@ -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('<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)));
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('<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,