Merge branch 'nightly' of git.gnu.io:gnu/gnu-social into nightly

This commit is contained in:
abjectio 2015-07-12 10:40:24 +02:00
commit c10a4cf6d2
224 changed files with 1485 additions and 3157 deletions

View File

@ -1,7 +1,7 @@
Plugins
=======
Beginning with the 0.7.x branch, StatusNet has supported a simple but
GNU social supports a simple but
powerful plugin architecture. Important events in the code are named,
like 'StartNoticeSave', and other software can register interest
in those events. When the events happen, the other software is called
@ -37,7 +37,7 @@ can enable a plugin with the following line in config.php:
This will look for and load files named 'ExamplePlugin.php' or
'Example/ExamplePlugin.php' either in the plugins/ directory (for
plugins that ship with StatusNet) or in the local/ directory (for
plugins that ship with GNU social) or in the local/ directory (for
plugins you write yourself or that you get from somewhere else) or
local/plugins/.

View File

@ -39,9 +39,7 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class AllAction extends ShowstreamAction
{
var $notice;
protected function getStream()
public function getStream()
{
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
$stream = new InboxNoticeStream($this->target, $this->scoped);
@ -54,7 +52,7 @@ class AllAction extends ShowstreamAction
function title()
{
if (!empty($this->scoped) && $this->scoped->id == $this->target->id) {
if (!empty($this->scoped) && $this->scoped->sameAs($this->target)) {
// TRANS: Title of a user's own start page.
return _('Home timeline');
} else {
@ -71,44 +69,44 @@ class AllAction extends ShowstreamAction
common_local_url(
'ApiTimelineFriends', array(
'format' => 'as',
'id' => $this->target->nickname
'id' => $this->target->getNickname()
)
),
// TRANS: %s is user nickname.
sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->nickname)),
sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->getNickname())),
new Feed(Feed::RSS1,
common_local_url(
'allrss', array(
'nickname' =>
$this->target->nickname)
$this->target->getNickname())
),
// TRANS: %s is user nickname.
sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->target->nickname)),
sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->target->getNickname())),
new Feed(Feed::RSS2,
common_local_url(
'ApiTimelineFriends', array(
'format' => 'rss',
'id' => $this->target->nickname
'id' => $this->target->getNickname()
)
),
// TRANS: %s is user nickname.
sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->nickname)),
sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->getNickname())),
new Feed(Feed::ATOM,
common_local_url(
'ApiTimelineFriends', array(
'format' => 'atom',
'id' => $this->target->nickname
'id' => $this->target->getNickname()
)
),
// TRANS: %s is user nickname.
sprintf(_('Feed for friends of %s (Atom)'), $this->target->nickname))
sprintf(_('Feed for friends of %s (Atom)'), $this->target->getNickname()))
);
}
function showEmptyListMessage()
{
// TRANS: Empty list message. %s is a user nickname.
$message = sprintf(_('This is the timeline for %s and friends but no one has posted anything yet.'), $this->target->nickname) . ' ';
$message = sprintf(_('This is the timeline for %s and friends but no one has posted anything yet.'), $this->target->getNickname()) . ' ';
if (common_logged_in()) {
if ($this->target->id === $this->scoped->id) {
@ -118,12 +116,12 @@ class AllAction extends ShowstreamAction
} else {
// TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@".
// TRANS: This message contains Markdown links. Keep "](" together.
$message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from their profile or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->target->nickname, $this->target->nickname, '@' . $this->target->nickname);
$message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from their profile or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->target->getNickname(), $this->target->getNickname(), '@' . $this->target->getNickname());
}
} else {
// TRANS: Encouragement displayed on empty timeline user pages for anonymous users.
// TRANS: %s is a user nickname. This message contains Markdown links. Keep "](" together.
$message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->target->nickname);
$message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->target->getNickname());
}
$this->elementStart('div', 'guide');
@ -134,19 +132,10 @@ class AllAction extends ShowstreamAction
function showContent()
{
if (Event::handle('StartShowAllContent', array($this))) {
$profile = null;
$current_user = common_current_user();
if (!empty($current_user)) {
$profile = $current_user->getProfile();
}
if (!empty($current_user) && $current_user->streamModeOnly()) {
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
$nl = new PrimaryNoticeList($this->notice, $this, array('show_n'=>NOTICES_PER_PAGE));
} else {
$nl = new ThreadedNoticeList($this->notice, $this, $profile);
$nl = new ThreadedNoticeList($this->notice, $this, $this->scoped);
}
$cnt = $nl->show();
@ -157,7 +146,7 @@ class AllAction extends ShowstreamAction
$this->pagination(
$this->page > 1, $cnt > NOTICES_PER_PAGE,
$this->page, 'all', array('nickname' => $this->target->nickname)
$this->page, 'all', array('nickname' => $this->target->getNickname())
);
Event::handle('EndShowAllContent', array($this));

View File

@ -28,11 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* RSS feed for user and friends timeline.
@ -46,52 +42,12 @@ require_once INSTALLDIR.'/lib/rssaction.php';
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class AllrssAction extends Rss10Action
class AllrssAction extends TargetedRss10Action
{
var $user = null;
/**
* Initialization.
*
* @param array $args Web and URL arguments
*
* @return boolean false if user doesn't exist
*
*/
function prepare($args)
protected function getNotices()
{
parent::prepare($args);
$nickname = $this->trimmed('nickname');
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error when user not found for an rss related action.
$this->clientError(_('No such user.'));
} else {
$this->notices = $this->getNotices($this->limit);
return true;
}
}
/**
* Get notices
*
* @param integer $limit max number of notices to return
*
* @return array notices
*/
function getNotices($limit=0)
{
$stream = new InboxNoticeStream($this->user->getProfile());
$notice = $stream->getNotices(0, $limit, null, null);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = new InboxNoticeStream($this->target);
return $stream->getNotices(0, $this->limit)->fetchAll();
}
/**
@ -101,33 +57,17 @@ class AllrssAction extends Rss10Action
*/
function getChannel()
{
$user = $this->user;
$c = array('url' => common_local_url('allrss',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: Message is used as link title. %s is a user nickname.
'title' => sprintf(_('%s and friends'), $user->nickname),
'title' => sprintf(_('%s and friends'), $this->target->getNickname()),
'link' => common_local_url('all',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: Message is used as link description. %1$s is a username, %2$s is a site name.
'description' => sprintf(_('Updates from %1$s and friends on %2$s!'),
$user->nickname, common_config('site', 'name')));
$this->target->getNickname(), common_config('site', 'name')));
return $c;
}
/**
* Get image.
*
* @return string user avatar URL or null
*/
function getImage()
{
$user = $this->user;
$profile = $user->getProfile();
if (!$profile) {
return null;
}
return $profile->avatarUrl(AVATAR_PROFILE_SIZE);
}
}

View File

@ -51,19 +51,10 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
{
var $notices = null;
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
function prepare($args)
protected function prepare(array $args=array())
{
parent::prepare($args);
common_debug("apitimelinetag prepare()");
$this->tag = $this->arg('tag');
$this->notices = $this->getNotices();
@ -79,9 +70,9 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
*
* @return void
*/
function handle($args)
protected function handle()
{
parent::handle($args);
parent::handle();
$this->showTimeline();
}
@ -172,21 +163,12 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
*/
function getNotices()
{
$notices = array();
$notice = Notice_tag::getStream($this->tag)->getNotices(($this->page - 1) * $this->count,
$this->count + 1,
$this->since_id,
$this->max_id);
$notice = Notice_tag::getStream(
$this->tag,
($this->page - 1) * $this->count,
$this->count + 1,
$this->since_id,
$this->max_id
);
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
return $notice->fetchAll();
}
/**

View File

@ -28,80 +28,24 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
// @todo FIXME: documentation needed.
class DeletenoticeAction extends Action
class DeletenoticeAction extends FormAction
{
var $error = null;
var $user = null;
var $notice = null;
var $profile = null;
var $user_profile = null;
protected $notice = null;
function prepare($args)
protected function doPreparation()
{
parent::prepare($args);
$this->notice = Notice::getByID($this->trimmed('notice'));
$this->user = common_current_user();
if (!$this->user) {
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
common_user_error(_('Not logged in.'));
exit;
}
$notice_id = $this->trimmed('notice');
$this->notice = Notice::getKV($notice_id);
if (!$this->notice) {
// TRANS: Error message displayed trying to delete a non-existing notice.
common_user_error(_('No such notice.'));
exit;
}
$this->profile = $this->notice->getProfile();
$this->user_profile = $this->user->getProfile();
return true;
}
function handle($args)
{
parent::handle($args);
if ($this->notice->profile_id != $this->user_profile->id &&
!$this->user->hasRight(Right::DELETEOTHERSNOTICE)) {
if (!$this->scoped->sameAs($this->notice->getProfile()) &&
!$this->scoped->hasRight(Right::DELETEOTHERSNOTICE)) {
// TRANS: Error message displayed trying to delete a notice that was not made by the current user.
common_user_error(_('Cannot delete this notice.'));
exit;
$this->clientError(_('Cannot delete this notice.'));
}
// XXX: Ajax!
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->deleteNotice();
} else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
$this->showForm();
}
}
/**
* Show the page notice
*
* Shows instructions for the page
*
* @return void
*/
function showPageNotice()
{
$instr = $this->getInstructions();
$output = common_markup_to_html($instr);
$this->elementStart('div', 'instructions');
$this->raw($output);
$this->elementEnd('div');
$this->formOpts['notice'] = $this->notice;
}
function getInstructions()
@ -117,84 +61,17 @@ class DeletenoticeAction extends Action
return _('Delete notice');
}
/**
* Wrapper for showing a page
*
* Stores an error and shows the page
*
* @param string $error Error, if any
*
* @return void
*/
function showForm($error = null)
protected function doPost()
{
$this->error = $error;
$this->showPage();
}
/**
* Insert delete notice form into the content
*
* @return void
*/
function showContent()
{
$this->elementStart('form', array('id' => 'form_notice_delete',
'class' => 'form_settings',
'method' => 'post',
'action' => common_local_url('deletenotice')));
$this->elementStart('fieldset');
// TRANS: Fieldset legend for the delete notice form.
$this->element('legend', null, _('Delete notice'));
$this->hidden('token', common_session_token());
$this->hidden('notice', $this->trimmed('notice'));
// TRANS: Message for the delete notice form.
$this->element('p', null, _('Are you sure you want to delete this notice?'));
$this->submit('form_action-no',
// TRANS: Button label on the delete notice form.
_m('BUTTON','No'),
'submit form_action-primary',
'no',
// TRANS: Submit button title for 'No' when deleting a notice.
_('Do not delete this notice.'));
$this->submit('form_action-yes',
// TRANS: Button label on the delete notice form.
_m('BUTTON','Yes'),
'submit form_action-secondary',
'yes',
// TRANS: Submit button title for 'Yes' when deleting a notice.
_('Delete this notice.'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
function deleteNotice()
{
// CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
// TRANS: Client error displayed when the session token does not match or is not given.
$this->showForm(_('There was a problem with your session token. ' .
'Try again, please.'));
return;
}
if ($this->arg('yes')) {
if (Event::handle('StartDeleteOwnNotice', array($this->user, $this->notice))) {
if (Event::handle('StartDeleteOwnNotice', array($this->scoped->getUser(), $this->notice))) {
$this->notice->delete();
Event::handle('EndDeleteOwnNotice', array($this->user, $this->notice));
Event::handle('EndDeleteOwnNotice', array($this->scoped->getUser(), $this->notice));
}
}
$url = common_get_returnto();
if ($url) {
common_set_returnto(null);
} else {
$url = common_local_url('public');
common_redirect(common_get_returnto(), 303);
}
common_redirect($url, 303);
common_redirect(common_local_url('top'), 303);
}
}

View File

@ -17,24 +17,22 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
if (!defined('GNUSOCIAL')) { exit(1); }
define('LISTENER', 1);
define('LISTENEE', -1);
define('BOTH', 0);
// @todo XXX: Documentation missing.
class FoafAction extends Action
class FoafAction extends ManagedAction
{
function isReadOnly($args)
{
return true;
}
function prepare($args)
protected function doPreparation()
{
parent::prepare($args);
$nickname_arg = $this->arg('nickname');
if (empty($nickname_arg)) {
@ -69,10 +67,8 @@ class FoafAction extends Action
return true;
}
function handle($args)
public function showPage()
{
parent::handle($args);
header('Content-Type: application/rdf+xml');
$this->startXML();

View File

@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
define('MEMBERS_PER_SECTION', 27);
@ -45,10 +41,10 @@ define('MEMBERS_PER_SECTION', 27);
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class groupRssAction extends Rss10Action
class GroupRssAction extends TargetedRss10Action
{
/** group we're viewing. */
var $group = null;
protected $group = null;
/**
* Is this page read-only?
@ -60,18 +56,8 @@ class groupRssAction extends Rss10Action
return true;
}
/**
* Prepare the action
*
* Reads and validates arguments and instantiates the attributes.
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
function prepare($args)
protected function doStreamPreparation()
{
parent::prepare($args);
$nickname_arg = $this->arg('nickname');
$nickname = common_canonical_nickname($nickname_arg);
@ -90,52 +76,32 @@ class groupRssAction extends Rss10Action
$local = Local_group::getKV('nickname', $nickname);
if (!$local) {
if (!$local instanceof Local_group) {
// TRANS: Client error displayed when requesting a group RSS feed for group that does not exist.
$this->clientError(_('No such group.'), 404);
}
$this->group = User_group::getKV('id', $local->group_id);
if (!$this->group) {
// TRANS: Client error displayed when requesting a group RSS feed for an object that is not a group.
$this->clientError(_('No such group.'), 404);
}
$this->notices = $this->getNotices($this->limit);
return true;
$this->group = $local->getGroup();
$this->target = $this->group->getProfile();
}
function getNotices($limit=0)
protected function getNotices()
{
$group = $this->group;
if (is_null($group)) {
return null;
}
$notices = array();
$notice = $group->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = $this->group->getNotices(0, $this->limit);
return $stream->fetchAll();
}
function getChannel()
{
$group = $this->group;
$c = array('url' => common_local_url('grouprss',
array('nickname' =>
$group->nickname)),
$this->target->getNickname())),
// TRANS: Message is used as link title. %s is a user nickname.
'title' => sprintf(_('%s timeline'), $group->nickname),
'link' => common_local_url('showgroup', array('nickname' => $group->nickname)),
'title' => sprintf(_('%s timeline'), $this->target->getNickname()),
'link' => common_local_url('showgroup', array('nickname' => $this->target->getNickname())),
// TRANS: Message is used as link description. %1$s is a group name, %2$s is a site name.
'description' => sprintf(_('Updates from members of %1$s on %2$s!'),
$group->nickname, common_config('site', 'name')));
$this->target->getNickname(), common_config('site', 'name')));
return $c;
}

View File

@ -63,7 +63,7 @@ class LogoutAction extends ManagedAction
}
Event::handle('EndLogout', array($this));
common_redirect(common_local_url('startpage'));
common_redirect(common_local_url('top'));
}
// Accessed through the action on events

View File

@ -28,11 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* RSS feed for notice search action class.
@ -48,19 +44,7 @@ require_once INSTALLDIR.'/lib/rssaction.php';
*/
class NoticesearchrssAction extends Rss10Action
{
function init()
{
return true;
}
function prepare($args)
{
parent::prepare($args);
$this->notices = $this->getNotices();
return true;
}
function getNotices($limit=0)
protected function getNotices()
{
$q = $this->trimmed('q');
$notices = array();
@ -70,8 +54,7 @@ class NoticesearchrssAction extends Rss10Action
$search_engine = $notice->getSearchEngine('notice');
$search_engine->set_sort_mode('chron');
if (!$limit) $limit = 20;
$search_engine->limit(0, $limit, true);
$search_engine->limit(0, $this->limit, true);
if (false === $search_engine->query($q)) {
$cnt = 0;
} else {

View File

@ -62,7 +62,7 @@ class PluginsadminpanelAction extends AdminPanelAction
{
// TRANS: Instructions at top of plugin admin page.
return _('Additional plugins can be enabled and configured manually. ' .
'See the <a href="http://status.net/wiki/Plugins">online plugin ' .
'See the <a href="https://git.gnu.io/gnu/gnu-social/blob/master/plugins/README.md">online plugin ' .
'documentation</a> for more details.');
}

View File

@ -28,11 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* RSS feed for public timeline.
@ -48,29 +44,6 @@ require_once INSTALLDIR.'/lib/rssaction.php';
*/
class PublicrssAction extends Rss10Action
{
/**
* Read arguments and initialize members
*
* @param array $args Arguments from $_REQUEST
* @return boolean success
*/
function prepare($args)
{
parent::prepare($args);
$this->notices = $this->getNotices($this->limit);
return true;
}
/**
* Initialization.
*
* @return boolean true
*/
function init()
{
return true;
}
/**
* Get notices
*
@ -78,15 +51,10 @@ class PublicrssAction extends Rss10Action
*
* @return array notices
*/
function getNotices($limit=0)
protected function getNotices()
{
$notices = array();
$notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = Notice::publicStream(0, $this->limit);
return $stream->fetchAll();
}
/**

View File

@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Redirect to a given URL
@ -47,75 +43,27 @@ if (!defined('STATUSNET')) {
* @link http://status.net/
*/
class RedirecturlAction extends Action
class RedirecturlAction extends ManagedAction
{
protected $id = null;
protected $file = null;
/**
* For initializing members of the class.
*
* @param array $argarray misc. arguments
*
* @return boolean true
*/
function prepare($argarray)
protected function doPreparation()
{
parent::prepare($argarray);
$this->id = $this->trimmed('id');
if (empty($this->id)) {
// TRANS: Client exception thrown when no ID parameter was provided.
throw new ClientException(_('No id parameter.'));
}
$this->file = File::getKV('id', $this->id);
if (empty($this->file)) {
// TRANS: Client exception thrown when an invalid ID parameter was provided for a file.
// TRANS: %d is the provided ID for which the file is not present (number).
throw new ClientException(sprintf(_('No such file "%d".'),
$this->id),
404);
}
$this->file = File::getByID($this->int('id'));
return true;
}
/**
* Handler method
*
* @param array $argarray is ignored since it's now passed in in prepare()
*
* @return void
*/
function handle($argarray=null)
public function showPage()
{
common_redirect($this->file->url, 307);
}
/**
* Return true if read only.
*
* MAY override
*
* @param array $args other arguments
*
* @return boolean is read only action?
*/
function isReadOnly($args)
{
return true;
}
/**
* Return last modified, if applicable.
*
* MAY override
*
* @return string last modified http header
*/
function lastModified()
{
// For comparison with If-Last-Modified
@ -133,9 +81,9 @@ class RedirecturlAction extends Action
*/
function etag()
{
return 'W/"' . implode(':', array($this->arg('action'),
return 'W/"' . implode(':', array($this->getActionName(),
common_user_cache_hash(),
common_language(),
$this->file->id)) . '"';
$this->file->getID())) . '"';
}
}

View File

@ -40,10 +40,7 @@ if (!defined('GNUSOCIAL')) { exit(1); }
*/
class RepliesAction extends ShowstreamAction
{
var $page = null;
var $notice;
protected function getStream()
public function getStream()
{
return new ReplyNoticeStream($this->target->getID(), $this->scoped);
}
@ -85,7 +82,7 @@ class RepliesAction extends ShowstreamAction
// TRANS: Link for feed with replies for a user.
// TRANS: %s is a user nickname.
sprintf(_('Replies feed for %s (Activity Streams JSON)'),
$this->user->nickname)),
$this->target->getNickname())),
new Feed(Feed::RSS1,
common_local_url('repliesrss',
array('nickname' => $this->target->getNickname())),

View File

@ -17,70 +17,34 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/lib/rssaction.php');
if (!defined('GNUSOCIAL')) { exit(1); }
// Formatting of RSS handled by Rss10Action
class RepliesrssAction extends Rss10Action
class RepliesrssAction extends TargetedRss10Action
{
var $user = null;
function prepare($args)
protected function getNotices()
{
parent::prepare($args);
$nickname = $this->trimmed('nickname');
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed when providing a non-existing nickname in a RSS 1.0 action.
$this->clientError(_('No such user.'));
} else {
$this->notices = $this->getNotices($this->limit);
return true;
}
}
function getNotices($limit=0)
{
$user = $this->user;
$notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = $this->target->getReplies(0, $this->limit);
return $stream->fetchAll();
}
function getChannel()
{
$user = $this->user;
$c = array('url' => common_local_url('repliesrss',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: RSS reply feed title. %s is a user nickname.
'title' => sprintf(_("Replies to %s"), $user->nickname),
'title' => sprintf(_("Replies to %s"), $this->target->getNickname()),
'link' => common_local_url('replies',
array('nickname' =>
$user->nickname)),
array('nickname' => $this->target->getNickname())),
// TRANS: RSS reply feed description.
// TRANS: %1$s is a user nickname, %2$s is the StatusNet site name.
'description' => sprintf(_('Replies to %1$s on %2$s.'),
$user->nickname, common_config('site', 'name')));
$this->target->getNickname(), common_config('site', 'name')));
return $c;
}
function getImage()
{
$profile = $this->user->getProfile();
return $profile->avatarUrl(AVATAR_PROFILE_SIZE);
}
function isReadOnly($args)
{
return true;

View File

@ -27,9 +27,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Prints out a static robots.txt
@ -40,19 +38,9 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class RobotstxtAction extends Action
class RobotstxtAction extends ManagedAction
{
/**
* Handles requests
*
* Since this is a relatively static document, we
* don't do a prepare()
*
* @param array $args GET, POST, and URL params; unused.
*
* @return void
*/
function handle($args)
public function showPage()
{
if (Event::handle('StartRobotsTxt', array($this))) {

View File

@ -45,18 +45,17 @@ if (!defined('GNUSOCIAL')) { exit(1); }
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class ShowstreamAction extends ProfileAction
class ShowstreamAction extends NoticestreamAction
{
var $notice;
protected $target = null;
protected function doPreparation()
{
// showstream requires a nickname
$nickname_arg = $this->arg('nickname');
$nickname_arg = $this->trimmed('nickname');
$nickname = common_canonical_nickname($nickname_arg);
// Permanent redirect on non-canonical nickname
if ($nickname_arg != $nickname) {
$args = array('nickname' => $nickname);
if ($this->arg('page') && $this->arg('page') != 1) {
@ -64,32 +63,23 @@ class ShowstreamAction extends ProfileAction
}
common_redirect(common_local_url($this->getActionName(), $args), 301);
}
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
try {
$user = User::getByNickname($nickname);
} catch (NoSuchUserException $e) {
$group = Local_group::getKV('nickname', $nickname);
if ($group instanceof Local_group) {
common_redirect($group->getProfile()->getUrl());
}
// TRANS: Client error displayed when calling a profile action without specifying a user.
$this->clientError(_('No such user.'), 404);
// No user nor group found, throw the NoSuchUserException again
throw $e;
}
$this->target = $this->user->getProfile();
$this->target = $user->getProfile();
}
protected function profileActionPreparation()
{
$stream = $this->getStream();
$this->notice = $stream->getNotices(($this->page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
if ($this->page > 1 && $this->notice->N == 0) {
// TRANS: Client error when page not found (404).
$this->clientError(_('No such page.'), 404);
}
}
protected function getStream()
public function getStream()
{
if (empty($this->tag)) {
$stream = new ProfileNoticeStream($this->target, $this->scoped);
@ -300,7 +290,7 @@ class ShowstreamAction extends ProfileAction
{
parent::showSections();
if (!common_config('performance', 'high')) {
$cloud = new PersonalTagCloudSection($this, $this->user);
$cloud = new PersonalTagCloudSection($this->target, $this);
$cloud->show();
}
}
@ -309,7 +299,7 @@ class ShowstreamAction extends ProfileAction
{
$options = parent::noticeFormOptions();
if (!$this->scoped instanceof Profile || $this->scoped->id != $this->target->id) {
if (!$this->scoped instanceof Profile || !$this->scoped->sameAs($this->target)) {
$options['to_profile'] = $this->target;
}

View File

@ -1,26 +0,0 @@
<?php
/**
* Startpage action. Decides what to show on the first page.
*/
if (!defined('GNUSOCIAL')) { exit(1); }
class StartpageAction extends ManagedAction
{
function isReadOnly($args)
{
return true;
}
function showPage()
{
if (common_config('singleuser', 'enabled')) {
$user = User::singleUser();
common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)), 303);
} elseif (common_config('public', 'localonly')) {
common_redirect(common_local_url('public'), 303);
} else {
common_redirect(common_local_url('networkpublic'), 303);
}
}
}

View File

@ -28,9 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* A list of the user's subscriptions
@ -60,7 +58,7 @@ class SubscriptionsAction extends GalleryAction
function showPageNotice()
{
if ($this->scoped instanceof Profile && $this->scoped->id === $this->target->id) {
if ($this->scoped instanceof Profile && $this->scoped->sameAs($this->getTarget())) {
$this->element('p', null,
// TRANS: Page notice for page with an overview of all subscriptions
// TRANS: of the logged in user's own profile.

View File

@ -46,7 +46,8 @@ class TagAction extends ManagedAction
common_set_returnto($this->selfUrl());
$this->notice = Notice_tag::getStream($this->tag, (($this->page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
$this->notice = Notice_tag::getStream($this->tag)->getNotices(($this->page-1)*NOTICES_PER_PAGE,
NOTICES_PER_PAGE + 1);
if($this->page > 1 && $this->notice->N == 0){
// TRANS: Client error when page not found (404).

View File

@ -17,42 +17,28 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/lib/rssaction.php');
if (!defined('GNUSOCIAL')) { exit(1); }
// Formatting of RSS handled by Rss10Action
class TagrssAction extends Rss10Action
{
var $tag;
protected $tag;
function prepare($args) {
parent::prepare($args);
protected function doStreamPreparation()
{
$tag = common_canonical_tag($this->trimmed('tag'));
$this->tag = Notice_tag::getKV('tag', $tag);
if (!$this->tag) {
if (!$this->tag instanceof Notice_tag) {
// TRANS: Client error when requesting a tag feed for a non-existing tag.
$this->clientError(_('No such tag.'));
} else {
$this->notices = $this->getNotices($this->limit);
return true;
}
}
function getNotices($limit=0)
protected function getNotices()
{
$tag = $this->tag;
if (is_null($tag)) {
return null;
}
$notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = Notice_tag::getStream($this->tag->tag)->getNotices(0, $this->limit);
return $stream->fetchAll();
}
function getChannel()

View File

@ -20,67 +20,29 @@
* 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 Top
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
/**
* An action to redirect to the top of the site
*
* @category Action
* @package StatusNet
* @package GNUsocial
* @author Evan Prodromou <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
* @copyright 2015 Free Software Foundation, Inc.
* @license https://www.gnu.org/licenses/agpl-3.0.html AGPL 3.0
* @link https://gnu.io/social
*/
class TopAction extends Action
if (!defined('GNUSOCIAL')) { exit(1); }
class TopAction extends ManagedAction
{
/**
* For initializing members of the class.
*
* @param array $argarray misc. arguments
*
* @return boolean true
*/
function prepare($argarray)
{
parent::prepare($argarray);
return true;
}
/**
* Handler method
*
* @param array $argarray is ignored since it's now passed in in prepare()
*
* @return void
*/
function handle($argarray=null)
public function showPage()
{
if (common_config('singleuser', 'enabled')) {
$url = common_local_url('showstream', array('nickname' => User::singleUserNickname()));
$user = User::singleUser();
common_redirect(common_local_url('showstream', array('nickname' => $user->getNickname())), 303);
} elseif (common_config('public', 'localonly')) {
common_redirect(common_local_url('public'), 303);
} else {
$url = common_local_url('public');
common_redirect(common_local_url('networkpublic'), 303);
}
// XXX: Permanent? I think so.
common_redirect($url, 301);
return;
}
}

View File

@ -52,12 +52,12 @@ class UsergroupsAction extends GalleryAction
if ($this->page == 1) {
// TRANS: Page title for first page of groups for a user.
// TRANS: %s is a nickname.
return sprintf(_('%s groups'), $this->user->nickname);
return sprintf(_('%s groups'), $this->getTarget()->getNickname());
} else {
// TRANS: Page title for all but the first page of groups for a user.
// TRANS: %1$s is a nickname, %2$d is a page number.
return sprintf(_('%1$s groups, page %2$d'),
$this->user->nickname,
$this->getTarget()->getNickname(),
$this->page);
}
}
@ -82,14 +82,14 @@ class UsergroupsAction extends GalleryAction
$offset = ($this->page-1) * GROUPS_PER_PAGE;
$limit = GROUPS_PER_PAGE + 1;
$groups = $this->user->getGroups($offset, $limit);
$groups = $this->getTarget()->getGroups($offset, $limit);
if ($groups instanceof User_group) {
$gl = new GroupList($groups, $this->user, $this);
$gl = new GroupList($groups, $this->getTarget(), $this);
$cnt = $gl->show();
$this->pagination($this->page > 1, $cnt > GROUPS_PER_PAGE,
$this->page, 'usergroups',
array('nickname' => $this->user->nickname));
array('nickname' => $this->getTarget()->getNickname()));
} else {
$this->showEmptyListMessage();
}
@ -102,11 +102,11 @@ class UsergroupsAction extends GalleryAction
{
// TRANS: Text on group page for a user that is not a member of any group.
// TRANS: %s is a user nickname.
$message = sprintf(_('%s is not a member of any group.'), $this->user->nickname) . ' ';
$message = sprintf(_('%s is not a member of any group.'), $this->getTarget()->getNickname()) . ' ';
if (common_logged_in()) {
$current_user = common_current_user();
if ($this->user->id === $current_user->id) {
if ($this->scoped->sameAs($this->getTarget())) {
// TRANS: Text on group page for a user that is not a member of any group. This message contains
// TRANS: a Markdown link in the form [link text](link) and a variable that should not be changed.
$message .= _('Try [searching for groups](%%action.groupsearch%%) and joining them.');
@ -119,7 +119,7 @@ class UsergroupsAction extends GalleryAction
function showProfileBlock()
{
$block = new AccountProfileBlock($this, $this->profile);
$block = new AccountProfileBlock($this, $this->getTarget());
$block->show();
}
}

View File

@ -17,100 +17,52 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/lib/rssaction.php');
if (!defined('GNUSOCIAL')) { exit(1); }
// Formatting of RSS handled by Rss10Action
class UserrssAction extends Rss10Action
class UserrssAction extends TargetedRss10Action
{
var $tag = null;
protected $tag = null;
function prepare($args)
protected function doStreamPreparation()
{
parent::prepare($args);
$nickname = $this->trimmed('nickname');
$this->user = User::getKV('nickname', $nickname);
$this->tag = $this->trimmed('tag');
}
if (!$this->user) {
// TRANS: Client error displayed when user not found for an action.
$this->clientError(_('No such user.'));
}
protected function getNotices()
{
if (!empty($this->tag)) {
$this->notices = $this->getTaggedNotices();
} else {
$this->notices = $this->getNotices();
$stream = $this->target->getTaggedNotices($this->tag, 0, $this->limit);
return $stream->fetchAll();
}
// otherwise we fetch a normal user stream
return true;
}
function getTaggedNotices()
{
$notice = $this->user->getTaggedNotices(
$this->tag,
0,
($this->limit == 0) ? NOTICES_PER_PAGE : $this->limit,
0,
0
);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
}
function getNotices()
{
$notice = $this->user->getNotices(
0,
($this->limit == 0) ? NOTICES_PER_PAGE : $this->limit
);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = $this->target->getNotices(0, $this->limit);
return $stream->fetchAll();
}
function getChannel()
{
$user = $this->user;
$profile = $user->getProfile();
$c = array('url' => common_local_url('userrss',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: Message is used as link title. %s is a user nickname.
'title' => sprintf(_('%s timeline'), $user->nickname),
'link' => $profile->profileurl,
'title' => sprintf(_('%s timeline'), $this->target->getNickname()),
'link' => $this->target->getUrl(),
// TRANS: Message is used as link description. %1$s is a username, %2$s is a site name.
'description' => sprintf(_('Updates from %1$s on %2$s!'),
$user->nickname, common_config('site', 'name')));
$this->target->getNickname(), common_config('site', 'name')));
return $c;
}
function getImage()
{
$profile = $this->user->getProfile();
return $profile->avatarUrl(AVATAR_PROFILE_SIZE);
}
// override parent to add X-SUP-ID URL
function initRss($limit=0)
function initRss()
{
$url = common_local_url('sup', null, null, $this->user->id);
$url = common_local_url('sup', null, null, $this->target->getID());
header('X-SUP-ID: '.$url);
parent::initRss($limit);
parent::initRss();
}
function isReadOnly($args)

View File

@ -166,7 +166,7 @@ class File_redirection extends Managed_DataObject
* size (optional): byte size from Content-Length header
* time (optional): timestamp from Last-Modified header
*/
public function where($in_url, $discover=true) {
static function where($in_url, $discover=true) {
// let's see if we know this...
try {
$a = File::getByUrl($in_url);
@ -176,7 +176,7 @@ class File_redirection extends Managed_DataObject
try {
$b = File_redirection::getByUrl($in_url);
// this is a redirect to $b->file_id
$a = File::getKV('id', $b->file_id);
$a = File::getByID($b->file_id);
return $a->url;
} catch (NoResultException $e) {
// Oh well, let's keep going
@ -186,10 +186,10 @@ class File_redirection extends Managed_DataObject
if ($discover) {
$ret = File_redirection::lookupWhere($in_url);
return $ret;
} else {
// No manual dereferencing; leave the unknown URL as is.
return $in_url;
}
// No manual dereferencing; leave the unknown URL as is.
return $in_url;
}
/**
@ -206,7 +206,7 @@ class File_redirection extends Managed_DataObject
* @param User $user whose shortening options to use; defaults to the current web session user
* @return string
*/
function makeShort($long_url, $user=null)
static function makeShort($long_url, $user=null)
{
$canon = File_redirection::_canonUrl($long_url);
@ -214,11 +214,7 @@ class File_redirection extends Managed_DataObject
// Did we get one? Is it shorter?
if (!empty($short_url)) {
return $short_url;
} else {
return $long_url;
}
return !empty($short_url) ? $short_url : $long_url;
}
/**
@ -235,18 +231,14 @@ class File_redirection extends Managed_DataObject
* @return string
*/
function forceShort($long_url, $user)
static function forceShort($long_url, $user)
{
$canon = File_redirection::_canonUrl($long_url);
$short_url = File_redirection::_userMakeShort($canon, $user, true);
// Did we get one? Is it shorter?
if (!empty($short_url)) {
return $short_url;
} else {
return $long_url;
}
return !empty($short_url) ? $short_url : $long_url;
}
static function _userMakeShort($long_url, User $user=null, $force = false) {

View File

@ -50,7 +50,7 @@ class Local_group extends Managed_DataObject
$group->find(true);
if (!$group instanceof User_group) {
common_log(LOG_ERR, 'User_group does not exist for Local_group: '.$this->group_id);
throw new NoResultException($group);
throw new NoSuchGroupException(array('id' => $this->group_id));
}
return $group;
}

View File

@ -1203,17 +1203,15 @@ class Notice extends Managed_DataObject
$this->_attachments[$this->id] = $attachments;
}
function publicStream($offset=0, $limit=20, $since_id=0, $max_id=0)
static function publicStream($offset=0, $limit=20, $since_id=null, $max_id=null)
{
$stream = new PublicNoticeStream();
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
function conversationStream($id, $offset=0, $limit=20, $since_id=0, $max_id=0)
static function conversationStream($id, $offset=0, $limit=20, $since_id=null, $max_id=null)
{
$stream = new ConversationNoticeStream($id);
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
@ -1225,18 +1223,17 @@ class Notice extends Managed_DataObject
*/
function hasConversation()
{
if (!empty($this->conversation)) {
$conversation = Notice::conversationStream(
$this->conversation,
1,
1
);
if ($conversation->N > 0) {
return true;
}
if (empty($this->conversation)) {
// this notice is not part of a conversation apparently
// FIXME: all notices should have a conversation value, right?
return false;
}
return false;
$stream = new ConversationNoticeStream($this->conversation);
$notice = $stream->getNotices(/*offset*/ 1, /*limit*/ 1);
// if our "offset 1, limit 1" query got a result, return true else false
return $notice->N > 0;
}
/**
@ -1271,8 +1268,7 @@ class Notice extends Managed_DataObject
$root = new Notice;
$root->conversation = $this->conversation;
$root->orderBy('notice.created ASC');
$root->find();
$root->fetch();
$root->find(true); // true means "fetch first result"
$root->free();
return $root;
}
@ -2193,7 +2189,7 @@ class Notice extends Managed_DataObject
return $notice->fetchAll('id');
}
function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null)
static function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null)
{
$options = array();

View File

@ -56,8 +56,7 @@ class Notice_tag extends Managed_DataObject
static function getStream($tag, $offset=0, $limit=20, $sinceId=0, $maxId=0)
{
$stream = new TagNoticeStream($tag);
return $stream->getNotices($offset, $limit, $sinceId, $maxId);
return $stream;
}
function blowCache($blowLast=false)

View File

@ -242,6 +242,11 @@ class Profile extends Managed_DataObject
return null;
}
function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
{
return Reply::stream($this->getID(), $offset, $limit, $since_id, $before_id);
}
function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
{
$stream = new TaggedProfileNoticeStream($this, $tag);
@ -1566,6 +1571,11 @@ class Profile extends Managed_DataObject
return $this;
}
public function sameAs(Profile $other)
{
return $this->getID() === $other->getID();
}
/**
* This will perform shortenLinks with the connected User object.
*

View File

@ -55,10 +55,9 @@ class Reply extends Managed_DataObject
return $result;
}
function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
static function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
{
$stream = new ReplyNoticeStream($user_id);
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
}

View File

@ -47,10 +47,10 @@ class Subscription_queue extends Managed_DataObject
return $rq;
}
public function exists(Profile $subscriber, Profile $other)
static function exists(Profile $subscriber, Profile $other)
{
$sub = Subscription_queue::pkeyGet(array('subscriber' => $subscriber->id,
'subscribed' => $other->id));
$sub = Subscription_queue::pkeyGet(array('subscriber' => $subscriber->getID(),
'subscribed' => $other->getID()));
return ($sub instanceof Subscription_queue);
}

View File

@ -132,6 +132,11 @@ class User extends Managed_DataObject
return $this->_profile[$this->id];
}
public function sameAs(Profile $other)
{
return $this->getProfile()->sameAs($other);
}
public function getUri()
{
return $this->uri;
@ -142,6 +147,16 @@ class User extends Managed_DataObject
return $this->getProfile()->getNickname();
}
static function getByNickname($nickname)
{
$user = User::getKV('nickname', $nickname);
if (!$user instanceof User) {
throw new NoSuchUserException(array('nickname' => $nickname));
}
return $user;
}
function isSubscribed(Profile $other)
{
return $this->getProfile()->isSubscribed($other);
@ -439,7 +454,7 @@ class User extends Managed_DataObject
function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
{
return Reply::stream($this->id, $offset, $limit, $since_id, $before_id);
return $this->getProfile()->getReplies($offset, $limit, $since_id, $before_id);
}
function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {

View File

@ -29,7 +29,7 @@
* identity check.
*
* LIBRARY DESIGN
*
*
* This consumer library is designed with that flow in mind. The goal
* is to make it as easy as possible to perform the above steps
* securely.
@ -427,7 +427,7 @@ class Auth_OpenID_Consumer {
$loader->fromSession($endpoint_data);
$message = Auth_OpenID_Message::fromPostArgs($query);
$response = $this->consumer->complete($message, $endpoint,
$response = $this->consumer->complete($message, $endpoint,
$current_url);
$this->session->del($this->_token_key);
@ -616,6 +616,9 @@ class Auth_OpenID_GenericConsumer {
$this->store = $store;
$this->negotiator = Auth_OpenID_getDefaultNegotiator();
$this->_use_assocs = (is_null($this->store) ? false : true);
if (get_class($this->store) == "Auth_OpenID_DumbStore") {
$this->_use_assocs = false;
}
$this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
@ -666,7 +669,7 @@ class Auth_OpenID_GenericConsumer {
'_completeInvalid');
return call_user_func_array(array($this, $method),
array($message, &$endpoint, $return_to));
array($message, $endpoint, $return_to));
}
/**
@ -1186,7 +1189,7 @@ class Auth_OpenID_GenericConsumer {
list($unused, $services) = call_user_func_array($this->discoverMethod,
array(
$claimed_id,
&$this->fetcher,
$this->fetcher,
));
if (!$services) {
@ -1202,7 +1205,7 @@ class Auth_OpenID_GenericConsumer {
/**
* @access private
*/
function _verifyDiscoveryServices($claimed_id,
function _verifyDiscoveryServices($claimed_id,
$services, $to_match_endpoints)
{
// Search the services resulting from discovery to find one
@ -1210,7 +1213,7 @@ class Auth_OpenID_GenericConsumer {
foreach ($services as $endpoint) {
foreach ($to_match_endpoints as $to_match_endpoint) {
$result = $this->_verifyDiscoverySingle($endpoint,
$result = $this->_verifyDiscoverySingle($endpoint,
$to_match_endpoint);
if (!Auth_OpenID::isFailure($result)) {
@ -1368,7 +1371,7 @@ class Auth_OpenID_GenericConsumer {
}
}
$ca_message = $message->copy();
$ca_message->setArg(Auth_OpenID_OPENID_NS, 'mode',
$ca_message->setArg(Auth_OpenID_OPENID_NS, 'mode',
'check_authentication');
return $ca_message;
}
@ -1606,7 +1609,7 @@ class Auth_OpenID_GenericConsumer {
$expires_in = Auth_OpenID::intval($expires_in_str);
if ($expires_in === false) {
$err = sprintf("Could not parse expires_in from association ".
"response %s", print_r($assoc_response, true));
return new Auth_OpenID_FailureResponse(null, $err);
@ -1953,7 +1956,7 @@ class Auth_OpenID_AuthRequest {
function htmlMarkup($realm, $return_to=null, $immediate=false,
$form_tag_attrs=null)
{
$form = $this->formMarkup($realm, $return_to, $immediate,
$form = $this->formMarkup($realm, $return_to, $immediate,
$form_tag_attrs);
if (Auth_OpenID::isFailure($form)) {

View File

@ -482,7 +482,7 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore {
}
if ($handle = opendir($dir)) {
while ($item = readdir($handle)) {
while (false !== ($item = readdir($handle))) {
if (!in_array($item, array('.', '..'))) {
if (is_dir($dir . $item)) {

View File

@ -104,8 +104,11 @@ class Auth_OpenID_PredisStore extends Auth_OpenID_OpenIDStore {
// no handle given, receiving the latest issued
$serverKey = $this->associationServerKey($server_url);
$lastKey = $this->redis->lpop($serverKey);
if (!$lastKey) { return null; }
$lastKey = $this->redis->lindex($serverKey, -1);
if (!$lastKey) {
// no previous association with this server
return null;
}
// get association, return null if failed
return $this->getAssociationFromServer($lastKey);
@ -156,10 +159,10 @@ class Auth_OpenID_PredisStore extends Auth_OpenID_OpenIDStore {
// SETNX will set the value only of the key doesn't exist yet.
$nonceKey = $this->nonceKey($server_url, $salt);
$added = $this->predis->setnx($nonceKey);
$added = $this->redis->setnx($nonceKey, "1");
if ($added) {
// Will set expiration
$this->predis->expire($nonceKey, $Auth_OpenID_SKEW);
$this->redis->expire($nonceKey, $Auth_OpenID_SKEW);
return true;
} else {
return false;

View File

@ -210,7 +210,7 @@ class Auth_OpenID_TrustRoot {
if ($parts['host'] == 'localhost') {
return true;
}
$host_parts = explode('.', $parts['host']);
if ($parts['wildcard']) {
// Remove the empty string from the beginning of the array
@ -413,7 +413,7 @@ function Auth_OpenID_getAllowedReturnURLs($relying_party_url, $fetcher,
}
call_user_func_array($discover_function,
array($relying_party_url, &$fetcher));
array($relying_party_url, $fetcher));
$return_to_urls = array();
$matching_endpoints = Auth_OpenID_extractReturnURL($endpoints);

View File

@ -414,7 +414,7 @@ class Auth_Yadis_Discovery {
list($yadis_url, $services) = call_user_func_array($discover_cb,
array(
$this->url,
&$fetcher,
$fetcher,
));
$manager = $this->createManager($services, $yadis_url);

View File

@ -90,6 +90,15 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher {
$this->reset();
$c = curl_init();
if (defined('Auth_OpenID_DISABLE_SSL_VERIFYPEER')
&& Auth_OpenID_DISABLE_SSL_VERIFYPEER === true) {
trigger_error(
'You have disabled SSL verifcation, this is a TERRIBLE ' .
'idea in almost all cases. Set Auth_OpenID_DISABLE_SSL_' .
'VERIFYPEER to false if you want to be safe again',
E_USER_WARNING);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
}
if ($c === false) {
Auth_OpenID::log(

View File

@ -65,29 +65,6 @@ class Auth_Yadis_ParseHTML {
$this->_entity_replacements));
}
/**
* Replace HTML entities (amp, lt, gt, and quot) as well as
* numeric entities (e.g. #x9f;) with their actual values and
* return the new string.
*
* @access private
* @param string $str The string in which to look for entities
* @return string $new_str The new string entities decoded
*/
function replaceEntities($str)
{
foreach ($this->_entity_replacements as $old => $new) {
$str = preg_replace(sprintf("/&%s;/", $old), $new, $str);
}
// Replace numeric entities because html_entity_decode doesn't
// do it for us.
$str = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $str);
$str = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $str);
return $str;
}
/**
* Strip single and double quotes off of a string, if they are
* present.
@ -216,7 +193,7 @@ class Auth_Yadis_ParseHTML {
$link_attrs = array();
foreach ($attr_matches[0] as $index => $full_match) {
$name = $attr_matches[1][$index];
$value = $this->replaceEntities(
$value = html_entity_decode(
$this->removeQuotes($attr_matches[2][$index]));
$link_attrs[strtolower($name)] = $value;

View File

@ -250,6 +250,10 @@ class Auth_Yadis_dom extends Auth_Yadis_XMLParser {
return false;
}
if (isset($this->doc->doctype)) {
return false;
}
$this->xpath = new DOMXPath($this->doc);
if ($this->xpath) {
@ -343,11 +347,11 @@ function Auth_Yadis_getSupportedExtensions()
function Auth_Yadis_getXMLParser()
{
global $__Auth_Yadis_defaultParser;
if (isset($__Auth_Yadis_defaultParser)) {
return $__Auth_Yadis_defaultParser;
}
foreach(Auth_Yadis_getSupportedExtensions() as $extension => $classname)
{
if (extension_loaded($extension))
@ -357,7 +361,7 @@ function Auth_Yadis_getXMLParser()
return $p;
}
}
return false;
}

View File

@ -429,7 +429,7 @@ class Auth_Yadis_XRDS {
foreach ($filters as $filter) {
if (call_user_func_array($filter, array(&$service))) {
if (call_user_func_array($filter, array($service))) {
$matches++;
if ($filter_mode == SERVICES_YADIS_MATCH_ANY) {

View File

@ -141,7 +141,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func,
}
$yadis_result = call_user_func_array($discover_func,
array($input_url, &$fetcher));
array($input_url, $fetcher));
if ($yadis_result === null) {
return array($input_url, array());

0
extlib/DB/DataObject.php Executable file → Normal file
View File

0
extlib/DB/DataObject/Cast.php Executable file → Normal file
View File

0
extlib/DB/DataObject/Error.php Executable file → Normal file
View File

0
extlib/DB/DataObject/Generator.php Executable file → Normal file
View File

0
extlib/Mail.php Executable file → Normal file
View File

0
extlib/Mail/RFC822.php Executable file → Normal file
View File

0
extlib/Mail/mail.php Executable file → Normal file
View File

View File

@ -52,7 +52,7 @@
* @author Sean Coates <sean@php.net>
* @copyright 2003-2006 PEAR <pear-group@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version CVS: $Id: mimeDecode.php,v 1.48 2006/12/03 13:43:33 cipri Exp $
* @version CVS: $Id: mimeDecode.php 305875 2010-12-01 07:17:10Z alan_k $
* @link http://pear.php.net/package/Mail_mime
*/
@ -147,6 +147,15 @@ class Mail_mimeDecode extends PEAR
*/
var $_decode_headers;
/**
* Flag to determine whether to include attached messages
* as body in the returned object. Depends on $_include_bodies
*
* @var boolean
* @access private
*/
var $_rfc822_bodies;
/**
* Constructor.
*
@ -165,6 +174,7 @@ class Mail_mimeDecode extends PEAR
$this->_body = $body;
$this->_decode_bodies = false;
$this->_include_bodies = true;
$this->_rfc822_bodies = false;
}
/**
@ -187,7 +197,7 @@ class Mail_mimeDecode extends PEAR
function decode($params = null)
{
// determine if this method has been called statically
$isStatic = !(isset($this) && get_class($this) == __CLASS__);
$isStatic = empty($this) || !is_a($this, __CLASS__);
// Have we been called statically?
// If so, create an object and pass details to that.
@ -208,6 +218,8 @@ class Mail_mimeDecode extends PEAR
$params['decode_bodies'] : false;
$this->_decode_headers = isset($params['decode_headers']) ?
$params['decode_headers'] : false;
$this->_rfc822_bodies = isset($params['rfc_822bodies']) ?
$params['rfc_822bodies'] : false;
$structure = $this->_decode($this->_header, $this->_body);
if ($structure === false) {
@ -235,6 +247,7 @@ class Mail_mimeDecode extends PEAR
$headers = $this->_parseHeaders($headers);
foreach ($headers as $value) {
$value['value'] = $this->_decode_headers ? $this->_decodeHeader($value['value']) : $value['value'];
if (isset($return->headers[strtolower($value['name'])]) AND !is_array($return->headers[strtolower($value['name'])])) {
$return->headers[strtolower($value['name'])] = array($return->headers[strtolower($value['name'])]);
$return->headers[strtolower($value['name'])][] = $value['value'];
@ -247,8 +260,8 @@ class Mail_mimeDecode extends PEAR
}
}
reset($headers);
while (list($key, $value) = each($headers)) {
foreach ($headers as $key => $value) {
$headers[$key]['name'] = strtolower($headers[$key]['name']);
switch ($headers[$key]['name']) {
@ -261,7 +274,7 @@ class Mail_mimeDecode extends PEAR
}
if (isset($content_type['other'])) {
while (list($p_name, $p_value) = each($content_type['other'])) {
foreach($content_type['other'] as $p_name => $p_value) {
$return->ctype_parameters[$p_name] = $p_value;
}
}
@ -271,7 +284,7 @@ class Mail_mimeDecode extends PEAR
$content_disposition = $this->_parseHeaderValue($headers[$key]['value']);
$return->disposition = $content_disposition['value'];
if (isset($content_disposition['other'])) {
while (list($p_name, $p_value) = each($content_disposition['other'])) {
foreach($content_disposition['other'] as $p_name => $p_value) {
$return->d_parameters[$p_name] = $p_value;
}
}
@ -303,6 +316,7 @@ class Mail_mimeDecode extends PEAR
case 'multipart/alternative':
case 'multipart/related':
case 'multipart/mixed':
case 'application/vnd.wap.multipart.related':
if(!isset($content_type['other']['boundary'])){
$this->_error = 'No boundary found for ' . $content_type['value'] . ' part';
return false;
@ -321,7 +335,11 @@ class Mail_mimeDecode extends PEAR
break;
case 'message/rfc822':
$obj = &new Mail_mimeDecode($body);
if ($this->_rfc822_bodies) {
$encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
$return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body);
}
$obj = new Mail_mimeDecode($body);
$return->parts[] = $obj->decode(array('include_bodies' => $this->_include_bodies,
'decode_bodies' => $this->_decode_bodies,
'decode_headers' => $this->_decode_headers));
@ -401,6 +419,11 @@ class Mail_mimeDecode extends PEAR
if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) {
return array($match[1], $match[2]);
}
// bug #17325 - empty bodies are allowed. - we just check that at least one line
// of headers exist..
if (count(explode("\n",$input))) {
return array($input, '');
}
$this->_error = 'Could not split header and body';
return false;
}
@ -419,7 +442,12 @@ class Mail_mimeDecode extends PEAR
if ($input !== '') {
// Unfold the input
$input = preg_replace("/\r?\n/", "\r\n", $input);
//#7065 - wrapping.. with encoded stuff.. - probably not needed,
// wrapping space should only get removed if the trailing item on previous line is a
// encoded character
$input = preg_replace("/=\r\n(\t| )+/", '=', $input);
$input = preg_replace("/\r\n(\t| )+/", ' ', $input);
$headers = explode("\r\n", trim($input));
foreach ($headers as $value) {
@ -430,7 +458,7 @@ class Mail_mimeDecode extends PEAR
$return[] = array(
'name' => $hdr_name,
'value' => $this->_decode_headers ? $this->_decodeHeader($hdr_value) : $hdr_value
'value' => $hdr_value
);
}
} else {
@ -454,41 +482,161 @@ class Mail_mimeDecode extends PEAR
function _parseHeaderValue($input)
{
if (($pos = strpos($input, ';')) !== false) {
$return['value'] = trim(substr($input, 0, $pos));
$input = trim(substr($input, $pos+1));
if (strlen($input) > 0) {
// This splits on a semi-colon, if there's no preceeding backslash
// Now works with quoted values; had to glue the \; breaks in PHP
// the regex is already bordering on incomprehensible
$splitRegex = '/([^;\'"]*[\'"]([^\'"]*([^\'"]*)*)[\'"][^;\'"]*|([^;]+))(;|$)/';
preg_match_all($splitRegex, $input, $matches);
$parameters = array();
for ($i=0; $i<count($matches[0]); $i++) {
$param = $matches[0][$i];
while (substr($param, -2) == '\;') {
$param .= $matches[0][++$i];
}
$parameters[] = $param;
}
for ($i = 0; $i < count($parameters); $i++) {
$param_name = trim(substr($parameters[$i], 0, $pos = strpos($parameters[$i], '=')), "'\";\t\\ ");
$param_value = trim(str_replace('\;', ';', substr($parameters[$i], $pos + 1)), "'\";\t\\ ");
if ($param_value[0] == '"') {
$param_value = substr($param_value, 1, -1);
}
$return['other'][$param_name] = $param_value;
$return['other'][strtolower($param_name)] = $param_value;
}
}
} else {
if (($pos = strpos($input, ';')) === false) {
$input = $this->_decode_headers ? $this->_decodeHeader($input) : $input;
$return['value'] = trim($input);
return $return;
}
$value = substr($input, 0, $pos);
$value = $this->_decode_headers ? $this->_decodeHeader($value) : $value;
$return['value'] = trim($value);
$input = trim(substr($input, $pos+1));
if (!strlen($input) > 0) {
return $return;
}
// at this point input contains xxxx=".....";zzzz="...."
// since we are dealing with quoted strings, we need to handle this properly..
$i = 0;
$l = strlen($input);
$key = '';
$val = false; // our string - including quotes..
$q = false; // in quote..
$lq = ''; // last quote..
while ($i < $l) {
$c = $input[$i];
//var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val));
$escaped = false;
if ($c == '\\') {
$i++;
if ($i == $l-1) { // end of string.
break;
}
$escaped = true;
$c = $input[$i];
}
// state - in key..
if ($val === false) {
if (!$escaped && $c == '=') {
$val = '';
$key = trim($key);
$i++;
continue;
}
if (!$escaped && $c == ';') {
if ($key) { // a key without a value..
$key= trim($key);
$return['other'][$key] = '';
$return['other'][strtolower($key)] = '';
}
$key = '';
}
$key .= $c;
$i++;
continue;
}
// state - in value.. (as $val is set..)
if ($q === false) {
// not in quote yet.
if ((!strlen($val) || $lq !== false) && $c == ' ' || $c == "\t") {
$i++;
continue; // skip leading spaces after '=' or after '"'
}
if (!$escaped && ($c == '"' || $c == "'")) {
// start quoted area..
$q = $c;
// in theory should not happen raw text in value part..
// but we will handle it as a merged part of the string..
$val = !strlen(trim($val)) ? '' : trim($val);
$i++;
continue;
}
// got end....
if (!$escaped && $c == ';') {
$val = trim($val);
$added = false;
if (preg_match('/\*[0-9]+$/', $key)) {
// this is the extended aaa*0=...;aaa*1=.... code
// it assumes the pieces arrive in order, and are valid...
$key = preg_replace('/\*[0-9]+$/', '', $key);
if (isset($return['other'][$key])) {
$return['other'][$key] .= $val;
if (strtolower($key) != $key) {
$return['other'][strtolower($key)] .= $val;
}
$added = true;
}
// continue and use standard setters..
}
if (!$added) {
$return['other'][$key] = $val;
$return['other'][strtolower($key)] = $val;
}
$val = false;
$key = '';
$lq = false;
$i++;
continue;
}
$val .= $c;
$i++;
continue;
}
// state - in quote..
if (!$escaped && $c == $q) { // potential exit state..
// end of quoted string..
$lq = $q;
$q = false;
$i++;
continue;
}
// normal char inside of quoted string..
$val.= $c;
$i++;
}
// do we have anything left..
if (strlen(trim($key)) || $val !== false) {
$val = trim($val);
$added = false;
if ($val !== false && preg_match('/\*[0-9]+$/', $key)) {
// no dupes due to our crazy regexp.
$key = preg_replace('/\*[0-9]+$/', '', $key);
if (isset($return['other'][$key])) {
$return['other'][$key] .= $val;
if (strtolower($key) != $key) {
$return['other'][strtolower($key)] .= $val;
}
$added = true;
}
// continue and use standard setters..
}
if (!$added) {
$return['other'][$key] = $val;
$return['other'][strtolower($key)] = $val;
}
}
// decode values.
foreach($return['other'] as $key =>$val) {
$return['other'][$key] = $this->_decode_headers ? $this->_decodeHeader($val) : $val;
}
//print_r($return);
return $return;
}
@ -510,13 +658,19 @@ class Mail_mimeDecode extends PEAR
if ($boundary == $bs_check) {
$boundary = $bs_possible;
}
$tmp = preg_split("/--".preg_quote($boundary, '/')."((?=\s)|--)/", $input);
$tmp = explode('--' . $boundary, $input);
for ($i = 1; $i < count($tmp) - 1; $i++) {
$parts[] = $tmp[$i];
$len = count($tmp) -1;
for ($i = 1; $i < $len; $i++) {
if (strlen(trim($tmp[$i]))) {
$parts[] = $tmp[$i];
}
}
// add the last part on if it does not end with the 'closing indicator'
if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') {
$parts[] = $tmp[$len];
}
return $parts;
}
@ -719,7 +873,7 @@ class Mail_mimeDecode extends PEAR
case "to":
case "cc":
case "bcc":
$to = ",".$item['value'];
$to .= ",".$item['value'];
default:
break;
}

0
extlib/Mail/mock.php Executable file → Normal file
View File

0
extlib/Mail/null.php Executable file → Normal file
View File

0
extlib/Mail/sendmail.php Executable file → Normal file
View File

0
extlib/Mail/smtp.php Executable file → Normal file
View File

0
extlib/Mail/smtpmx.php Executable file → Normal file
View File

0
extlib/Net/URL2.php Executable file → Normal file
View File

View File

@ -2,19 +2,19 @@
/**
* Validation class
*
* Copyright (c) 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox, Amir Saied
* Copyright (c) 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox, Amir Saied
*
* This source file is subject to the New BSD license, That is bundled
* with this package in the file LICENSE, and is available through
* the world-wide-web at
* http://www.opensource.org/licenses/bsd-license.php
* If you did not receive a copy of the new BSDlicense and are unable
* to obtain it through the world-wide-web, please send a note to
* pajoye@php.net so we can mail you a copy immediately.
* This source file is subject to the New BSD license, That is bundled
* with this package in the file LICENSE, and is available through
* the world-wide-web at
* http://www.opensource.org/licenses/bsd-license.php
* If you did not receive a copy of the new BSDlicense and are unable
* to obtain it through the world-wide-web, please send a note to
* pajoye@php.net so we can mail you a copy immediately.
*
* Author: Tomas V.V.Cox <cox@idecnet.com>
* Pierre-Alain Joye <pajoye@php.net>
* Amir Mohammad Saied <amir@php.net>
* Author: Tomas V.V.Cox <cox@idecnet.com>
* Pierre-Alain Joye <pajoye@php.net>
* Amir Mohammad Saied <amir@php.net>
*
*
* Package to validate various datas. It includes :
@ -32,10 +32,11 @@
* @author Amir Mohammad Saied <amir@php.net>
* @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Validate.php,v 1.134 2009/01/28 12:27:33 davidc Exp $
* @version CVS: $Id$
* @link http://pear.php.net/package/Validate
*/
// {{{ Constants
/**
* Methods for common data validations
*/
@ -44,17 +45,18 @@ define('VALIDATE_SPACE', '\s');
define('VALIDATE_ALPHA_LOWER', 'a-z');
define('VALIDATE_ALPHA_UPPER', 'A-Z');
define('VALIDATE_ALPHA', VALIDATE_ALPHA_LOWER . VALIDATE_ALPHA_UPPER);
define('VALIDATE_EALPHA_LOWER', VALIDATE_ALPHA_LOWER . 'áéíóúýàèìòùäëïöüÿâêîôûãñõ¨åæç½ðøþß');
define('VALIDATE_EALPHA_UPPER', VALIDATE_ALPHA_UPPER . 'ÁÉÍÓÚÝÀÈÌÒÙÄËÏÖܾÂÊÎÔÛÃÑÕ¦ÅÆǼÐØÞ');
define('VALIDATE_EALPHA_LOWER', VALIDATE_ALPHA_LOWER . 'áéíóúýàèìòùäëïöüÿâêîôûãñõ¨åæç½ðøþß');
define('VALIDATE_EALPHA_UPPER', VALIDATE_ALPHA_UPPER . 'ÁÉÍÓÚÝÀÈÌÒÙÄËÏÖܾÂÊÎÔÛÃÑÕ¦ÅÆǼÐØÞ');
define('VALIDATE_EALPHA', VALIDATE_EALPHA_LOWER . VALIDATE_EALPHA_UPPER);
define('VALIDATE_PUNCTUATION', VALIDATE_SPACE . '\.,;\:&"\'\?\!\(\)');
define('VALIDATE_NAME', VALIDATE_EALPHA . VALIDATE_SPACE . "'" . "-");
define('VALIDATE_STREET', VALIDATE_NUM . VALIDATE_NAME . "/\\ºª\.");
define('VALIDATE_NAME', VALIDATE_EALPHA . VALIDATE_SPACE . "'" . '\-');
define('VALIDATE_STREET', VALIDATE_NUM . VALIDATE_NAME . "/\\ºª\.");
define('VALIDATE_ITLD_EMAILS', 1);
define('VALIDATE_GTLD_EMAILS', 2);
define('VALIDATE_CCTLD_EMAILS', 4);
define('VALIDATE_ALL_EMAILS', 8);
// }}}
/**
* Validation class
@ -79,6 +81,7 @@ define('VALIDATE_ALL_EMAILS', 8);
*/
class Validate
{
// {{{ International, Generic and Country code TLDs
/**
* International Top-Level Domain
*
@ -202,6 +205,7 @@ class Validate
'ye','yt','yu','za',
'zm','zw',
);
// }}}
/**
* Validate a tag URI (RFC4151)
@ -445,6 +449,10 @@ class Validate
if(!empty($options["VALIDATE_GTLD_EMAILS"])) array_push($validate, 'gtld');
if(!empty($options["VALIDATE_CCTLD_EMAILS"])) array_push($validate, 'cctld');
if (count($validate) === 0) {
array_push($validate, 'itld', 'gtld', 'cctld');
}
$self = new Validate;
$toValidate = array();
@ -459,7 +467,7 @@ class Validate
return $e;
}
/**
* Execute the validation
*
@ -501,7 +509,7 @@ class Validate
* 'use_rfc822' => 'true',
* 'VALIDATE_GTLD_EMAILS' => 'true',
* 'VALIDATE_CCTLD_EMAILS' => 'true',
* 'VALIDATE_ITLD_EMAILS' => 'true',
* 'VALIDATE_ITLD_EMAILS' => 'true',
* );
*
* @return boolean true if valid email, false if not
@ -524,15 +532,17 @@ class Validate
*/
$hasIDNA = false;
if (@include_once('Net/IDNA.php')) {
if (Validate::_includePathFileExists('Net/IDNA.php')) {
include_once('Net/IDNA.php');
$hasIDNA = true;
}
if ($hasIDNA === true) {
if (strpos($email, '@') !== false) {
list($name, $domain) = explode('@', $email, 2);
$tmpEmail = explode('@', $email);
$domain = array_pop($tmpEmail);
// Check if the domain contains characters > 127 which means
// Check if the domain contains characters > 127 which means
// it's an idn domain name.
$chars = count_chars($domain, 1);
if (!empty($chars) && max(array_keys($chars)) > 127) {
@ -540,10 +550,11 @@ class Validate
$domain = $idna->encode($domain);
}
$email = "$name@$domain";
array_push($tmpEmail, $domain);
$email = implode('@', $tmpEmail);
}
}
/**
* @todo Fix bug here.. even if it passes this, it won't be passing
* The regular expression below
@ -565,14 +576,14 @@ class Validate
(?:(?:(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.){3}
(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))))(?(5)\])|
((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z0-9](?:[-a-z0-9]*[a-z0-9])?) #6 domain as hostname
\.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD
\.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD
$&xi';
//checks if exists the domain (MX or A)
if ($use_rfc822? Validate::__emailRFC822($email, $options) :
preg_match($regex, $email)) {
if ($check_domain && function_exists('checkdnsrr')) {
list ($account, $domain) = explode('@', $email);
$domain = preg_replace('/[^-a-z.0-9]/i', '', array_pop(explode('@', $email)));
if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) {
return true;
}
@ -913,7 +924,7 @@ class Validate
*
* @param string &$date Date
* @param string $num Length
* @param string $opt Unknown
* @param string $opt Unknown
*
* @access private
* @return string
@ -1086,8 +1097,10 @@ class Validate
$class = implode('_', $validateType);
$classPath = str_replace('_', DIRECTORY_SEPARATOR, $class);
$class = 'Validate_' . $class;
if (!@include_once "Validate/$classPath.php") {
trigger_error("$class isn't installed or you may have some permissoin issues", E_USER_ERROR);
if (Validate::_includePathFileExists("Validate/$classPath.php")) {
include_once "Validate/$classPath.php";
} else {
trigger_error("$class isn't installed or you may have some permission issues", E_USER_ERROR);
}
$ce = substr(phpversion(), 0, 1) > 4 ?
@ -1112,5 +1125,25 @@ class Validate
}
return $valid;
}
/**
* Determine whether specified file exists along the include path.
*
* @param string $filename file to search for
*
* @access private
*
* @return bool true if file exists
*/
function _includePathFileExists($filename)
{
$paths = explode(":", ini_get("include_path"));
$result = false;
while ((!($result)) && (list($key,$val) = each($paths))) {
$result = file_exists($val . "/" . $filename);
}
return $result;
}
}

View File

@ -60,6 +60,13 @@ var SN = { // StatusNet
V: { // Variables
},
/**
* list of callbacks, categorized into _callbacks['event_name'] = [ callback_function_1, callback_function_2 ]
*
* @access private
*/
_callbacks: {},
/**
* Map of localized message strings exported to script from the PHP
* side via Action::getScriptMessages().
@ -343,21 +350,6 @@ var SN = { // StatusNet
// Make sure we don't have a mixed HTTP/HTTPS submission...
form.attr('action', SN.U.RewriteAjaxAction(form.attr('action')));
/**
* Show a response feedback bit under the new-notice dialog.
*
* @param {String} cls: CSS class name to use ('error' or 'success')
* @param {String} text
* @access private
*/
var showFeedback = function (cls, text) {
form.append(
$('<p class="form_response"></p>')
.addClass(cls)
.text(text)
);
};
/**
* Hide the previous response feedback, if any.
*/
@ -392,7 +384,7 @@ var SN = { // StatusNet
removeFeedback();
if (textStatus == 'timeout') {
// @fixme i18n
showFeedback('error', 'Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.');
SN.U.showFeedback(form, 'error', 'Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.');
} else {
var response = SN.U.GetResponseXML(xhr);
if ($('.' + SN.C.S.Error, response).length > 0) {
@ -405,7 +397,7 @@ var SN = { // StatusNet
SN.U.FormNoticeEnhancements(form);
} else {
// @fixme i18n
showFeedback('error', '(Sorry! We had trouble sending your notice (' + xhr.status + ' ' + xhr.statusText + '). Please report the problem to the site administrator if this happens again.');
SN.U.showFeedback(form, 'error', '(Sorry! We had trouble sending your notice (' + xhr.status + ' ' + xhr.statusText + '). Please report the problem to the site administrator if this happens again.');
}
}
}
@ -414,59 +406,9 @@ var SN = { // StatusNet
removeFeedback();
var errorResult = $('#' + SN.C.S.Error, data);
if (errorResult.length > 0) {
showFeedback('error', errorResult.text());
SN.U.showFeedback(form, 'error', errorResult.text());
} else {
var commandResult = $('#' + SN.C.S.CommandResult, data);
if (commandResult.length > 0) {
showFeedback('success', commandResult.text());
} else {
// New notice post was successful. If on our timeline, show it!
var notice = document._importNode($('li', data)[0], true);
var notices = $('#notices_primary .notices:first');
var replyItem = form.closest('li.notice-reply');
if (replyItem.length > 0) {
// If this is an inline reply, remove the form...
var list = form.closest('.threaded-replies');
var id = $(notice).attr('id');
if ($('#' + id).length == 0) {
$(notice).insertBefore(replyItem);
} // else Realtime came through before us...
replyItem.remove();
} else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
// Not a reply. If on our timeline, show it at the top!
if ($('#' + notice.id).length === 0) {
var notice_irt_value = form.find('[name=inreplyto]').val();
var notice_irt = '#notices_primary #notice-' + notice_irt_value;
if ($('body')[0].id == 'conversation') {
if (notice_irt_value.length > 0 && $(notice_irt + ' .notices').length < 1) {
$(notice_irt).append('<ul class="notices"></ul>');
}
$($(notice_irt + ' .notices')[0]).append(notice);
} else {
notices.prepend(notice);
}
$('#' + notice.id)
.css({display: 'none'})
.fadeIn(2500);
SN.U.NoticeWithAttachment($('#' + notice.id));
SN.U.switchInputFormTab(null);
}
} else {
// Not on a timeline that this belongs on?
// Just show a success message.
// @fixme inline
showFeedback('success', $('title', data).text());
}
}
form.resetForm();
form.find('[name=inreplyto]').val('');
form.find('.attach-status').remove();
SN.U.FormNoticeEnhancements(form);
SN.E.ajaxNoticePosted(form, data, textStatus);
}
},
complete: function (xhr, textStatus) {
@ -1139,12 +1081,12 @@ var SN = { // StatusNet
label.attr('title', label.text());
check.change(function () {
if (check.prop('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) {
if (check.prop('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === undefined) {
label
.attr('title', NoticeDataGeo_text.ShareDisable)
.addClass('checked');
if ($.cookie(SN.C.S.NoticeDataGeoCookie) === null || $.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') {
if ($.cookie(SN.C.S.NoticeDataGeoCookie) === undefined || $.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') {
if (navigator.geolocation) {
SN.U.NoticeGeoStatus(form, 'Requesting location from browser...');
navigator.geolocation.getCurrentPosition(
@ -1355,7 +1297,7 @@ var SN = { // StatusNet
* @fixme what is this?
*/
Delete: function () {
$.cookie(SN.C.S.StatusNetInstance, null);
$.removeCookie(SN.C.S.StatusNetInstance);
}
},
@ -1442,9 +1384,106 @@ var SN = { // StatusNet
var extended = $(selector);
extended.removeClass('extended_menu');
return void(0);
},
/**
* Show a response feedback bit under a form.
*
* @param {Element} form: the new-notice form usually
* @param {String} cls: CSS class name to use ('error' or 'success')
* @param {String} text
* @access public
*/
showFeedback: function (form, cls, text) {
form.append(
$('<p class="form_response"></p>')
.addClass(cls)
.text(text)
);
},
addCallback: function (ename, callback) {
// initialize to array if it's undefined
if (typeof SN._callbacks[ename] === 'undefined') {
SN._callbacks[ename] = [];
}
SN._callbacks[ename].push(callback);
},
runCallbacks: function (ename, data) {
if (typeof SN._callbacks[ename] === 'undefined') {
return;
}
for (cbname in SN._callbacks[ename]) {
SN._callbacks[ename][cbname](data);
}
}
},
E: { /* Events */
/* SN.E.ajaxNoticePosted, called when a notice has been posted successfully via an AJAX form
@param form the originating form element
@param data data from success() callback
@param textStatus textStatus from success() callback
*/
ajaxNoticePosted: function (form, data, textStatus) {
var commandResult = $('#' + SN.C.S.CommandResult, data);
if (commandResult.length > 0) {
SN.U.showFeedback(form, 'success', commandResult.text());
} else {
// New notice post was successful. If on our timeline, show it!
var notice = document._importNode($('li', data)[0], true);
var notices = $('#notices_primary .notices:first');
var replyItem = form.closest('li.notice-reply');
if (replyItem.length > 0) {
// If this is an inline reply, remove the form...
var list = form.closest('.threaded-replies');
var id = $(notice).attr('id');
if ($('#' + id).length == 0) {
$(notice).insertBefore(replyItem);
} // else Realtime came through before us...
replyItem.remove();
} else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
// Not a reply. If on our timeline, show it at the top!
if ($('#' + notice.id).length === 0) {
var notice_irt_value = form.find('[name=inreplyto]').val();
var notice_irt = '#notices_primary #notice-' + notice_irt_value;
if ($('body')[0].id == 'conversation') {
if (notice_irt_value.length > 0 && $(notice_irt + ' .notices').length < 1) {
$(notice_irt).append('<ul class="notices"></ul>');
}
$($(notice_irt + ' .notices')[0]).append(notice);
} else {
notices.prepend(notice);
}
$('#' + notice.id)
.css({display: 'none'})
.fadeIn(2500);
SN.U.NoticeWithAttachment($('#' + notice.id));
SN.U.switchInputFormTab(null);
}
} else {
// Not on a timeline that this belongs on?
// Just show a success message.
// @fixme inline
SN.U.showFeedback(form, 'success', $('title', data).text());
}
}
form.resetForm();
form.find('[name=inreplyto]').val('');
form.find('.attach-status').remove();
SN.U.FormNoticeEnhancements(form);
SN.U.runCallbacks('notice_posted', {"notice": notice});
},
},
Init: {
/**
* If user is logged in, run setup code for the new notice form:

View File

@ -205,7 +205,7 @@ class Action extends HTMLOutputter // lawsuit
*
* @return nothing
*/
function showPage()
public function showPage()
{
if (GNUsocial::isAjax()) {
self::showAjax();
@ -534,15 +534,11 @@ class Action extends HTMLOutputter // lawsuit
*/
function showFeeds()
{
$feeds = $this->getFeeds();
if ($feeds) {
foreach ($feeds as $feed) {
$this->element('link', array('rel' => $feed->rel(),
'href' => $feed->url,
'type' => $feed->mimeType(),
'title' => $feed->title));
}
foreach ($this->getFeeds() as $feed) {
$this->element('link', array('rel' => $feed->rel(),
'href' => $feed->url,
'type' => $feed->mimeType(),
'title' => $feed->title));
}
}
@ -1035,9 +1031,9 @@ class Action extends HTMLOutputter // lawsuit
function showExportData()
{
$feeds = $this->getFeeds();
if ($feeds) {
$fl = new FeedList($this);
$fl->show($feeds);
if (!empty($feeds)) {
$fl = new FeedList($this, $feeds);
$fl->show();
}
}
@ -1658,7 +1654,7 @@ class Action extends HTMLOutputter // lawsuit
*/
function getFeeds()
{
return null;
return array();
}
/**

View File

@ -281,19 +281,20 @@ class ActivityUtils
static function validateUri($uri)
{
// Check mailto: URIs first
$validate = new Validate();
if (preg_match('/^mailto:(.*)$/', $uri, $match)) {
return Validate::email($match[1], common_config('email', 'check_domain'));
return $validate->email($match[1], common_config('email', 'check_domain'));
}
if (Validate::uri($uri)) {
if ($validate->uri($uri)) {
return true;
}
// Possibly an upstream bug; tag: URIs aren't validated properly
// unless you explicitly ask for them. All other schemes are accepted
// for basic URI validation without asking.
if (Validate::uri($uri, array('allowed_scheme' => array('tag')))) {
if ($validate->uri($uri, array('allowed_scheme' => array('tag')))) {
return true;
}

10
lib/apiaction.php Executable file → Normal file
View File

@ -248,7 +248,7 @@ class ApiAction extends Action
$twitter_user['friends_count'] = $profile->subscriptionCount();
$twitter_user['created_at'] = $this->dateTwitter($profile->created);
$twitter_user['created_at'] = self::dateTwitter($profile->created);
$timezone = 'UTC';
@ -322,7 +322,7 @@ class ApiAction extends Action
$twitter_status = array();
$twitter_status['text'] = $notice->content;
$twitter_status['truncated'] = false; # Not possible on StatusNet
$twitter_status['created_at'] = $this->dateTwitter($notice->created);
$twitter_status['created_at'] = self::dateTwitter($notice->created);
try {
// We could just do $notice->reply_to but maybe the future holds a
// different story for parenting.
@ -440,8 +440,8 @@ class ApiAction extends Action
$twitter_group['homepage'] = $group->homepage;
$twitter_group['description'] = $group->description;
$twitter_group['location'] = $group->location;
$twitter_group['created'] = $this->dateTwitter($group->created);
$twitter_group['modified'] = $this->dateTwitter($group->modified);
$twitter_group['created'] = self::dateTwitter($group->created);
$twitter_group['modified'] = self::dateTwitter($group->modified);
return $twitter_group;
}
@ -1196,7 +1196,7 @@ class ApiAction extends Action
$this->endDocument('xml');
}
function dateTwitter($dt)
static function dateTwitter($dt)
{
$dateStr = date('d F Y H:i:s', strtotime($dt));
$d = new DateTime($dateStr, new DateTimeZone('UTC'));

View File

@ -113,10 +113,12 @@ class AtomNoticeFeed extends Atom10Feed
foreach ($notices as $notice) {
$this->addEntryFromNotice($notice);
}
} else {
} elseif ($notices instanceof Notice) {
while ($notices->fetch()) {
$this->addEntryFromNotice($notices);
}
} else {
throw new ServerException('addEntryFromNotices got neither an array nor a Notice object');
}
}
@ -125,7 +127,7 @@ class AtomNoticeFeed extends Atom10Feed
*
* @param Notice $notice a Notice to add
*/
function addEntryFromNotice($notice)
function addEntryFromNotice(Notice $notice)
{
try {
$source = $this->showSource();

View File

@ -85,7 +85,8 @@ class AvatarLink
// yuck!
static function mediatype($filename) {
$ext = strtolower(end(explode('.', $filename)));
$parts = explode('.', $filename);
$ext = strtolower(end($parts));
if ($ext == 'jpeg') {
$ext = 'jpg';
}

View File

@ -327,7 +327,6 @@ $default =
'OpportunisticQM' => array(),
'OStatus' => array(),
'Poll' => array(),
'QnA' => array(),
'SearchSub' => array(),
'TagSub' => array(),
'WebFinger' => array(),

67
lib/deletenoticeform.php Normal file
View File

@ -0,0 +1,67 @@
<?php
if (!defined('GNUSOCIAL')) { exit(1); }
class DeletenoticeForm extends Form
{
protected $notice = null;
function __construct(HTMLOutputter $out=null, array $formOpts=array())
{
if (!array_key_exists('notice', $formOpts) || !$formOpts['notice'] instanceof Notice) {
throw new ServerException('No notice provided to DeletenoticeForm');
}
parent::__construct($out);
$this->notice = $formOpts['notice'];
}
function id()
{
return 'form_notice_delete-' . $this->notice->getID();
}
function formClass()
{
return 'form_settings';
}
function action()
{
return common_local_url('deletenotice', array('notice' => $this->notice->getID()));
}
function formLegend()
{
$this->out->element('legend', null, _('Delete notice'));
}
function formData()
{
$this->out->element('p', null, _('Are you sure you want to delete this notice?'));
}
/**
* Action elements
*
* @return void
*/
function formActions()
{
$this->out->submit('form_action-no',
// TRANS: Button label on the delete notice form.
_m('BUTTON','No'),
'submit form_action-primary',
'no',
// TRANS: Submit button title for 'No' when deleting a notice.
_('Do not delete this notice.'));
$this->out->submit('form_action-yes',
// TRANS: Button label on the delete notice form.
_m('BUTTON','Yes'),
'submit form_action-secondary',
'yes',
// TRANS: Submit button title for 'Yes' when deleting a notice.
_('Delete this notice.'));
}
}

View File

@ -28,9 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Widget for showing a list of feeds
@ -50,30 +48,33 @@ class FeedList extends Widget
{
var $action = null;
function __construct($action=null)
protected $feeds = null;
public function __construct(Action $action=null, array $feeds=array())
{
parent::__construct($action);
$this->action = $action;
parent::__construct($action);
$this->action = $action;
$this->feeds = $feeds;
}
function show($feeds)
public function show()
{
if (Event::handle('StartShowFeedLinkList', array($this->action, &$feeds))) {
if (!empty($feeds)) {
if (Event::handle('StartShowFeedLinkList', array($this->action, &$this->feeds))) {
if (!empty($this->feeds)) {
$this->out->elementStart('div', array('id' => 'export_data',
'class' => 'section'));
// TRANS: Header for feed links (h2).
$this->out->element('h2', null, _('Feeds'));
$this->out->elementStart('ul', array('class' => 'xoxo'));
foreach ($feeds as $feed) {
foreach ($this->feeds as $feed) {
$this->feedItem($feed);
}
$this->out->elementEnd('ul');
$this->out->elementEnd('div');
}
Event::handle('EndShowFeedLinkList', array($this->action, &$feeds));
Event::handle('EndShowFeedLinkList', array($this->action, &$this->feeds));
}
}

View File

@ -50,7 +50,7 @@ class FormAction extends ManagedAction
protected function prepare(array $args=array()) {
parent::prepare($args);
$this->form = $this->form ?: $this->action;
$this->form = $this->form ?: ucfirst($this->action);
$this->args['form'] = $this->form;
$this->type = !is_null($this->type) ? $this->type : $this->trimmed('type');

View File

@ -23,7 +23,7 @@ define('GNUSOCIAL_ENGINE', 'GNU social');
define('GNUSOCIAL_ENGINE_URL', 'https://www.gnu.org/software/social/');
define('GNUSOCIAL_BASE_VERSION', '1.2.0');
define('GNUSOCIAL_LIFECYCLE', 'alpha1'); // 'dev', 'alpha[0-9]+', 'beta[0-9]+', 'rc[0-9]+', 'release'
define('GNUSOCIAL_LIFECYCLE', 'alpha2'); // 'dev', 'alpha[0-9]+', 'beta[0-9]+', 'rc[0-9]+', 'release'
define('GNUSOCIAL_VERSION', GNUSOCIAL_BASE_VERSION . '-' . GNUSOCIAL_LIFECYCLE);

View File

@ -91,7 +91,7 @@ class GroupsNav extends MoreMenu
_('See all groups you belong to.'));
}
function item($actionName, $args, $label, $description, $id=null, $cls=null)
function item($actionName, array $args, $label, $description, $id=null, $cls=null)
{
if ($actionName != 'placeholder') {
return parent::item($actionName, $args, $label, $description, $id, $cls);

View File

@ -563,14 +563,12 @@ abstract class ImPlugin extends Plugin
return true;
}
function onEndShowHeadElements($action)
function onEndShowHeadElements(Action $action)
{
$aname = $action->trimmed('action');
if ($aname == 'shownotice') {
if ($action instanceof ShownoticeAction) {
$user_im_prefs = new User_im_prefs();
$user_im_prefs->user_id = $action->profile->id;
$user_im_prefs->user_id = $action->notice->getProfile()->getID();
$user_im_prefs->transport = $this->transport;
if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->notice->uri) {
@ -580,13 +578,13 @@ abstract class ImPlugin extends Plugin
'content' => $id->toString()));
}
} else if ($aname == 'showstream') {
} elseif ($action instanceof ShowstreamAction) {
$user_im_prefs = new User_im_prefs();
$user_im_prefs->user_id = $action->user->id;
$user_im_prefs->user_id = $action->getTarget()->getID();
$user_im_prefs->transport = $this->transport;
if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->profile->profileurl) {
if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->getTarget()->getUrl()) {
$id = new Microid($this->microiduri($user_im_prefs->screenname),
$action->selfUrl());
$action->element('meta', array('name' => 'microid',

View File

@ -53,7 +53,7 @@ class InviteButtonSection extends Section
$this->out = $out;
if (empty($buttonText)) {
// TRANS: Default button text for inviting more users to the StatusNet instance.
$this->buttonText = _m('BUTTON', 'Invite more colleagues');
$this->buttonText = _m('BUTTON', 'Invite more people');
} else {
$this->buttonText = $buttonText;
}

View File

@ -47,11 +47,13 @@ require_once 'Mail.php';
function mail_backend()
{
static $backend = null;
global $_PEAR;
if (!$backend) {
$backend = Mail::factory(common_config('mail', 'backend'),
$mail = new Mail();
$backend = $mail->factory(common_config('mail', 'backend'),
common_config('mail', 'params') ?: array());
if (PEAR::isError($backend)) {
if ($_PEAR->isError($backend)) {
common_server_error($backend->getMessage(), 500);
}
}

View File

@ -0,0 +1,26 @@
<?php
if (!defined('GNUSOCIAL')) { exit(1); }
abstract class NoticestreamAction extends ProfileAction
{
protected $notice = null; // holds the stream result
protected function prepare(array $args=array()) {
parent::prepare($args);
// fetch the actual stream stuff
$stream = $this->getStream();
$this->notice = $stream->getNotices(($this->page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
if ($this->page > 1 && $this->notice->N == 0) {
// TRANS: Client error when page not found (404).
$this->clientError(_('No such page.'), 404);
}
return true;
}
// this fetches the NoticeStream
abstract public function getStream();
}

View File

@ -103,8 +103,8 @@ class PeopletagsWidget extends Widget
$this->out->elementStart('li', 'hashptag mode-' . $mode);
// Avoid space by using raw output.
$pt = '<span class="mark_hash">#</span><a rel="tag" href="' .
$this->url($this->tag->tag) .
'">' . $this->tag->tag . '</a>';
htmlspecialchars($this->url()) .
'">' . htmlspecialchars($this->tag->tag) . '</a>';
$this->out->raw($pt);
$this->out->elementEnd('li');
}

View File

@ -27,9 +27,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Personal tag cloud section
@ -42,12 +40,12 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
*/
class PersonalTagCloudSection extends TagCloudSection
{
var $user = null;
protected $profile = null;
function __construct($out=null, $user=null)
function __construct(Profile $profile, HTMLOutputter $out=null)
{
parent::__construct($out);
$this->user = $user;
$this->profile = $profile;
}
function title()
@ -80,7 +78,7 @@ class PersonalTagCloudSection extends TagCloudSection
$tag = Memcached_DataObject::cachedQuery('Notice_tag',
sprintf($qry,
$this->user->id),
$this->profile->getID()),
3600);
return $tag;
}

View File

@ -50,7 +50,7 @@ abstract class ProfileAction extends ManagedAction
protected function prepare(array $args=array())
{
// this will call ->doPreparation() which lower classes can use
// this will call ->doPreparation() which child classes use to set $this->target
parent::prepare($args);
if ($this->target->hasRole(Profile_role::SILENCED)
@ -58,16 +58,10 @@ abstract class ProfileAction extends ManagedAction
throw new ClientException(_('This profile has been silenced by site moderators'), 403);
}
// backwards compatibility until all actions are fixed to use $this->target
$this->profile = $this->target;
$this->tag = $this->trimmed('tag');
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
common_set_returnto($this->selfUrl());
// fetch the actual stream stuff
$this->profileActionPreparation();
return true;
}
@ -78,6 +72,9 @@ abstract class ProfileAction extends ManagedAction
public function getTarget()
{
if (!$this->target instanceof Profile) {
throw new ServerException('No target profile in ProfileAction class');
}
return $this->target;
}

View File

@ -32,18 +32,26 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class ProfileListItem extends Widget
{
/** Current profile. */
protected $target = null;
var $profile = null;
/** Action object using us. */
var $action = null;
function __construct($profile, $action)
// FIXME: Directory plugin sends a User_group here, but should send a Profile and handle User_group specifics itself
function __construct($target, HTMLOutputter $action)
{
parent::__construct($action);
$this->profile = $profile;
$this->target = $target;
$this->profile = $this->target;
$this->action = $action;
}
function getTarget()
{
return $this->target;
}
function show()
{
if (Event::handle('StartProfileListItem', array($this))) {

View File

@ -50,7 +50,7 @@ class PublicTagCloudSection extends TagCloudSection
function title()
{
// TRANS: Title for inbox tag cloud section.
return _m('TITLE', 'Trending topics');
return _m('TITLE', 'Trends');
}
function getTags()

View File

@ -108,6 +108,11 @@ class Router
if (Event::handle('StartInitializeRouter', array(&$m))) {
// top of the menu hierarchy, sometimes "Home"
$m->connect('', array('action' => 'top'));
// public endpoints
$m->connect('robots.txt', array('action' => 'robotstxt'));
$m->connect('opensearch/people', array('action' => 'opensearch',
@ -156,13 +161,13 @@ class Router
'deleteaccount',
'restoreaccount',
'top',
'public',
);
foreach ($main as $a) {
$m->connect('main/'.$a, array('action' => $a));
}
$m->connect('main/public', array('action' => 'public'));
$m->connect('main/all', array('action' => 'networkpublic'));
$m->connect('main/tagprofile/:id', array('action' => 'tagprofile'),
@ -239,12 +244,10 @@ class Router
array('action' => 'shownotice'),
array('notice' => '[0-9]+'));
$m->connect('notice/delete/:notice',
$m->connect('notice/:notice/delete',
array('action' => 'deletenotice'),
array('notice' => '[0-9]+'));
$m->connect('notice/delete', array('action' => 'deletenotice'));
// conversation
$m->connect('conversation/:id',
@ -875,9 +878,6 @@ class Router
array('action' => 'rsd',
'nickname' => $nickname));
$m->connect('',
array('action' => 'startpage'));
// peopletags
$m->connect('peopletags',
@ -930,9 +930,6 @@ class Router
}
}
$m->connect('', array('action' => 'startpage'));
$m->connect('main/public', array('action' => 'public'));
$m->connect('main/all', array('action' => 'networkpublic'));
$m->connect('rss', array('action' => 'publicrss'));
$m->connect('featuredrss', array('action' => 'featuredrss'));
$m->connect('featured/', array('action' => 'featured'));
@ -950,6 +947,13 @@ class Router
array('action' => 'subqueue'),
array('nickname' => Nickname::DISPLAY_FMT));
// some targeted RSS 1.0 actions (extends TargetedRss10Action)
foreach (array('all', 'replies') as $a) {
$m->connect(':nickname/'.$a.'/rss',
array('action' => $a.'rss'),
array('nickname' => Nickname::DISPLAY_FMT));
}
// people tags
$m->connect(':nickname/peopletags',
@ -1017,12 +1021,6 @@ class Router
array('nickname' => Nickname::DISPLAY_FMT));
}
foreach (array('all', 'replies') as $a) {
$m->connect(':nickname/'.$a.'/rss',
array('action' => $a.'rss'),
array('nickname' => Nickname::DISPLAY_FMT));
}
$m->connect(':nickname/avatar',
array('action' => 'avatarbynickname'),
array('nickname' => Nickname::DISPLAY_FMT));

View File

@ -28,11 +28,11 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
if (!defined('GNUSOCIAL')) { exit(1); }
define('DEFAULT_RSS_LIMIT', 48);
class Rss10Action extends Action
class Rss10Action extends ManagedAction
{
// This will contain the details of each feed item's author and be used to generate SIOC data.
@ -41,47 +41,16 @@ class Rss10Action extends Action
var $notices = null;
var $tags_already_output = array();
/**
* Constructor
*
* Just wraps the Action constructor.
*
* @param string $output URI to output to, default = stdout
* @param boolean $indent Whether to indent output, default true
*
* @see Action::__construct
*/
function __construct($output='php://output', $indent=null)
{
parent::__construct($output, $indent);
}
/**
* Do we need to write to the database?
*
* @return boolean true
*/
function isReadonly()
public function isReadOnly($args)
{
return true;
}
/**
* Read arguments and initialize members
*
* @param array $args Arguments from $_REQUEST
* @return boolean success
*/
function prepare($args)
protected function doPreparation()
{
parent::prepare($args);
$this->limit = $this->int('limit');
$this->limit = (int) $this->trimmed('limit');
if ($this->limit == 0) {
if (empty($this->limit)) {
$this->limit = DEFAULT_RSS_LIMIT;
}
@ -93,7 +62,7 @@ class Rss10Action extends Action
// If the user hits cancel -- bam!
$this->show_basic_auth_error();
return;
// the above calls 'exit'
} else {
$nickname = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
@ -104,27 +73,19 @@ class Rss10Action extends Action
common_log(LOG_WARNING, "Failed RSS auth attempt, nickname = $nickname, proxy = $proxy, ip = $ip.");
$this->show_basic_auth_error();
return;
// the above calls 'exit'
}
}
}
return true;
$this->doStreamPreparation();
$this->notices = $this->getNotices($this->limit);
}
/**
* Handle a request
*
* @param array $args Arguments from $_REQUEST
*
* @return void
*/
function handle($args)
protected function doStreamPreparation()
{
// Parent handling, including cache check
parent::handle($args);
$this->showRss();
// for example if we need to set $this->target or something
}
function show_basic_auth_error()
@ -137,6 +98,7 @@ class Rss10Action extends Action
$this->element('request', null, $_SERVER['REQUEST_URI']);
$this->elementEnd('hash');
$this->endXML();
exit;
}
/**
@ -145,7 +107,7 @@ class Rss10Action extends Action
* @return array an array of Notice objects sorted in reverse chron
*/
function getNotices()
protected function getNotices()
{
return array();
}
@ -170,7 +132,7 @@ class Rss10Action extends Action
return null;
}
function showRss()
function showPage()
{
$this->initRss();
$this->showChannel();

View File

@ -29,10 +29,10 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class SelftagsWidget extends PeopletagsWidget
{
function url($tag)
public function url()
{
// link to self tag page
return common_local_url('selftag', array('tag' => $tag));
return common_local_url('selftag', array('tag' => $this->tag->tag));
}
function label()

View File

@ -115,11 +115,10 @@ class TagCloudSection extends Section
function tagUrl($tag)
{
if ('showstream' === $this->out->trimmed('action')) {
return common_local_url('showstream', array('nickname' => $this->out->profile->nickname, 'tag' => $tag));
} else {
return common_local_url('tag', array('tag' => $tag));
if ($this->out instanceof ShowstreamAction) {
return common_local_url('showstream', array('nickname' => $this->out->getTarget()->getNickname(), 'tag' => $tag));
}
return common_local_url('tag', array('tag' => $tag));
}
function divId()

View File

@ -0,0 +1,46 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Base class for RSS 1.0 feed actions
*
* 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 Mail
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @author Earle Martin <earle@downlode.org>
* @copyright 2008-9 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('GNUSOCIAL')) { exit(1); }
class TargetedRss10Action extends Rss10Action
{
protected $target = null;
protected function doStreamPreparation()
{
$this->target = User::getByNickname($this->trimmed('nickname'))->getProfile();
}
function getImage()
{
return $this->target->avatarUrl(AVATAR_PROFILE_SIZE);
}
}

View File

@ -87,10 +87,9 @@ class ToSelector extends Widget
$choices['public:everyone'] = _m('SENDTO','Everyone');
$default = 'public:everyone';
}
// XXX: better name...?
// TRANS: Option in drop-down of potential addressees.
// TRANS: %s is a StatusNet sitename.
$choices['public:site'] = sprintf(_('My colleagues at %s'), common_config('site', 'name'));
$choices['public:site'] = sprintf(_('Everyone at %s'), common_config('site', 'name'));
$groups = $this->user->getGroups();

0
plugins/AntiBrute/AntiBrutePlugin.php Executable file → Normal file
View File

View File

@ -28,11 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* RSS feed for user bookmarks action class.
@ -48,54 +44,12 @@ require_once INSTALLDIR.'/lib/rssaction.php';
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class BookmarksrssAction extends Rss10Action
class BookmarksrssAction extends TargetedRss10Action
{
/** The user whose bookmarks to display */
var $user = null;
/**
* Find the user to display by supplied nickname
*
* @param array $args Arguments from $_REQUEST
*
* @return boolean success
*/
function prepare($args)
{
parent::prepare($args);
$nickname = $this->trimmed('nickname');
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed when trying to get the RSS feed with bookmarks of a user that does not exist.
$this->clientError(_('No such user.'));
} else {
$this->notices = $this->getNotices($this->limit);
return true;
}
}
/**
* Get notices
*
* @param integer $limit max number of notices to return
*
* @return array notices
*/
function getNotices($limit=0)
protected function getNotices()
{
$user = $this->user;
$notice = new BookmarksNoticeStream($this->user->id, true);
$notice = $notice->getNotices(0, NOTICES_PER_PAGE);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = new BookmarksNoticeStream($this->target->getID(), true);
return $stream->getNotices(0, $this->limit)->fetchAll();
}
/**
@ -105,31 +59,19 @@ class BookmarksrssAction extends Rss10Action
*/
function getChannel()
{
$user = $this->user;
$c = array('url' => common_local_url('bookmarksrss',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: Title of RSS feed with bookmarks of a user.
// TRANS: %s is a user's nickname.
'title' => sprintf(_("%s's bookmarks"), $user->nickname),
'title' => sprintf(_("%s's bookmarks"), $this->target->getNickname()),
'link' => common_local_url('bookmarks',
array('nickname' =>
$user->nickname)),
$this->target->getNickname())),
// TRANS: Desciption of RSS feed with bookmarks of a user.
// TRANS: %1$s is a user's nickname, %2$s is the name of the StatusNet site.
'description' => sprintf(_('Bookmarks posted by %1$s on %2$s!'),
$user->nickname, common_config('site', 'name')));
$this->target->getNickname(), common_config('site', 'name')));
return $c;
}
/**
* Get image.
*
* @return void
*/
function getImage()
{
return null;
}
}

View File

@ -30,9 +30,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Show a list of direct messages from or to the authenticating user
@ -62,13 +60,11 @@ class ApiDirectMessageAction extends ApiAuthAction
*
* @return boolean success flag
*/
function prepare($args)
protected function prepare(array $args=array())
{
parent::prepare($args);
$this->user = $this->auth_user;
if (empty($this->user)) {
if (!$this->scoped instanceof Profile) {
// TRANS: Client error given when a user was not found (404).
$this->clientError(_('No such user.'), 404);
}
@ -83,30 +79,30 @@ class ApiDirectMessageAction extends ApiAuthAction
$this->title = sprintf(
// TRANS: Title. %s is a user nickname.
_("Direct messages from %s"),
$this->user->nickname
$this->scoped->getNickname()
);
$this->subtitle = sprintf(
// TRANS: Subtitle. %s is a user nickname.
_("All the direct messages sent from %s"),
$this->user->nickname
$this->scoped->getNickname()
);
$this->link = $server . $this->user->nickname . '/outbox';
$this->link = $server . $this->scoped->getNickname() . '/outbox';
$this->selfuri_base = common_root_url() . 'api/direct_messages/sent';
$this->id = "tag:$taguribase:SentDirectMessages:" . $this->user->id;
$this->id = "tag:$taguribase:SentDirectMessages:" . $this->scoped->getID();
} else {
$this->title = sprintf(
// TRANS: Title. %s is a user nickname.
_("Direct messages to %s"),
$this->user->nickname
$this->scoped->getNickname()
);
$this->subtitle = sprintf(
// TRANS: Subtitle. %s is a user nickname.
_("All the direct messages sent to %s"),
$this->user->nickname
$this->scoped->getNickname()
);
$this->link = $server . $this->user->nickname . '/inbox';
$this->link = $server . $this->scoped->getNickname() . '/inbox';
$this->selfuri_base = common_root_url() . 'api/direct_messages';
$this->id = "tag:$taguribase:DirectMessages:" . $this->user->id;
$this->id = "tag:$taguribase:DirectMessages:" . $this->scoped->getID();
}
$this->messages = $this->getMessages();
@ -114,18 +110,9 @@ class ApiDirectMessageAction extends ApiAuthAction
return true;
}
/**
* Handle the request
*
* Show the messages
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
function handle($args)
protected function handle()
{
parent::handle($args);
parent::handle();
$this->showMessages();
}
@ -166,9 +153,9 @@ class ApiDirectMessageAction extends ApiAuthAction
$message = new Message();
if ($this->arg('sent')) {
$message->from_profile = $this->user->id;
$message->from_profile = $this->scoped->getID();
} else {
$message->to_profile = $this->user->id;
$message->to_profile = $this->scoped->getID();
}
if (!empty($this->max_id)) {

View File

@ -30,9 +30,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Creates a new direct message from the authenticating user to
@ -65,7 +63,7 @@ class ApiDirectMessageNewAction extends ApiAuthAction
{
parent::prepare($args);
if (empty($this->user)) {
if (!$this->scoped instanceof Profile) {
// TRANS: Client error when user not found for an API direct message action.
$this->clientError(_('No such user.'), 404);
}
@ -111,10 +109,10 @@ class ApiDirectMessageNewAction extends ApiAuthAction
if (!$this->other instanceof Profile) {
// TRANS: Client error displayed if a recipient user could not be found (403).
$this->clientError(_('Recipient user not found.'), 403);
} else if (!$this->user->mutuallySubscribed($this->other)) {
} else if (!$this->scoped->mutuallySubscribed($this->other)) {
// TRANS: Client error displayed trying to direct message another user who's not a friend (403).
$this->clientError(_('Cannot send direct messages to users who aren\'t your friend.'), 403);
} else if ($this->user->id == $this->other->id) {
} else if ($this->scoped->getID() === $this->other->getID()) {
// Note: sending msgs to yourself is allowed by Twitter
@ -123,8 +121,8 @@ class ApiDirectMessageNewAction extends ApiAuthAction
}
$message = Message::saveNew(
$this->user->id,
$this->other->id,
$this->scoped->getID(),
$this->other->getID(),
html_entity_decode($this->content, ENT_NOQUOTES, 'UTF-8'),
$this->source
);

View File

@ -238,9 +238,9 @@ class DirectoryPlugin extends Plugin
$nav->out->menuItem(
common_local_url('userdirectory'),
// TRANS: Menu item text for user directory.
_m('MENU','Directory'),
_m('MENU','People'),
// TRANS: Menu item title for user directory.
_m('User Directory.'),
_m('People.'),
$actionName == 'userdirectory',
'nav_directory'
);

View File

@ -41,10 +41,6 @@ table.profile_list tr {
float: none;
}
table.profile_list tr.alt {
background-color: #def; /* zebra stripe */
}
table.profie_list td {
width: 100%;
padding: 0;
@ -61,4 +57,4 @@ th.current.reverse {
background-image: url(../images/control_arrow_up.gif);
background-repeat: no-repeat;
background-position: 60% 2px;
}
}

View File

@ -27,11 +27,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/subscriptionlist.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Widget to show a sortable list of subscriptions
@ -44,16 +40,6 @@ require_once INSTALLDIR . '/lib/subscriptionlist.php';
*/
class SortableGroupList extends SortableSubscriptionList
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner=null, $action=null)
{
parent::__construct($profile, $owner, $action);
$this->owner = $owner;
}
function startList()
{
$this->out->elementStart('table', array('class' => 'profile_list xoxo'));
@ -119,25 +105,14 @@ class SortableGroupList extends SortableSubscriptionList
$this->out->elementStart('tbody');
}
function newListItem($profile, $odd)
function newListItem($profile)
{
return new SortableGroupListItem($profile, $this->owner, $this->action, $odd);
return new SortableGroupListItem($profile, $this->owner, $this->action);
}
}
class SortableGroupListItem extends SortableSubscriptionListItem
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner, $action, $alt)
{
parent::__construct($profile, $owner, $action, $alt);
$this->alt = $alt; // is this row alternate?
$this->owner = $owner;
}
function showHomepage()
{
if (!empty($this->profile->homepage)) {

View File

@ -27,11 +27,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/subscriptionlist.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Widget to show a sortable list of subscriptions
@ -44,16 +40,6 @@ require_once INSTALLDIR . '/lib/subscriptionlist.php';
*/
class SortableSubscriptionList extends SubscriptionList
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner=null, $action=null)
{
parent::__construct($profile, $owner, $action);
$this->owner = $owner;
}
function startList()
{
$this->out->elementStart('table', array('class' => 'profile_list xoxo'));
@ -128,48 +114,14 @@ class SortableSubscriptionList extends SubscriptionList
$this->out->elementEnd('table');
}
function showProfiles()
function newListItem($profile)
{
// Note: we don't use fetchAll() because it's borked with query()
$profiles = array();
while ($this->profile->fetch()) {
$profiles[] = clone($this->profile);
}
$cnt = count($profiles);
$max = min($cnt, $this->maxProfiles());
for ($i = 0; $i < $max; $i++) {
$odd = ($i % 2 == 0); // for zebra striping
$pli = $this->newListItem($profiles[$i], $odd);
$pli->show();
}
return $cnt;
}
function newListItem($profile, $odd)
{
return new SortableSubscriptionListItem($profile, $this->owner, $this->action, $odd);
return new SortableSubscriptionListItem($profile, $this->owner, $this->action);
}
}
class SortableSubscriptionListItem extends SubscriptionListItem
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner, $action, $alt)
{
parent::__construct($profile, $owner, $action);
$this->alt = $alt; // is this row alternate?
$this->owner = $owner;
}
function startItem()
{
$attr = array(
@ -177,10 +129,6 @@ class SortableSubscriptionListItem extends SubscriptionListItem
'id' => 'profile-' . $this->profile->id
);
if ($this->alt) {
$attr['class'] .= ' alt';
}
$this->out->elementStart('tr', $attr);
}

View File

0
plugins/DomainStatusNetwork/scripts/proposesite.php Normal file → Executable file
View File

0
plugins/DomainStatusNetwork/scripts/sitefordomain.php Normal file → Executable file
View File

View File

View File

0
plugins/EmailReminder/scripts/sendemailreminder.php Normal file → Executable file
View File

View File

@ -17,13 +17,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
class ProfileDetailAction extends ShowstreamAction
{
function isReadOnly($args)
{
return true;
@ -31,7 +28,7 @@ class ProfileDetailAction extends ShowstreamAction
function title()
{
return $this->profile->getFancyName();
return $this->target->getFancyName();
}
function showStylesheets() {
@ -43,7 +40,7 @@ class ProfileDetailAction extends ShowstreamAction
function showContent()
{
$cur = common_current_user();
if ($cur && $cur->id == $this->profile->id) { // your own page
if ($this->scoped instanceof Profile && $this->scoped->sameAs($this->target)) {
$this->elementStart('div', 'entity_actions');
$this->elementStart('ul');
$this->elementStart('li', 'entity_edit');
@ -57,7 +54,7 @@ class ProfileDetailAction extends ShowstreamAction
$this->elementEnd('div');
}
$widget = new ExtendedProfileWidget($this, $this->profile);
$widget = new ExtendedProfileWidget($this, $this->target);
$widget->show();
}
}

View File

@ -28,11 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/rssaction.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* RSS feed for user favorites action class.
@ -47,50 +43,15 @@ require_once INSTALLDIR.'/lib/rssaction.php';
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class FavoritesrssAction extends Rss10Action
class FavoritesrssAction extends TargetedRss10Action
{
/** The user whose favorites to display */
var $user = null;
/**
* Find the user to display by supplied nickname
*
* @param array $args Arguments from $_REQUEST
*
* @return boolean success
*/
function prepare($args)
protected function getNotices()
{
parent::prepare($args);
// is this our own stream?
$own = $this->scoped instanceof Profile ? $this->target->getID() === $this->scoped->getID() : false;
$nickname = $this->trimmed('nickname');
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed when trying to get the RSS feed with favorites of a user that does not exist.
$this->clientError(_('No such user.'));
} else {
$this->notices = $this->getNotices($this->limit);
return true;
}
}
/**
* Get notices
*
* @param integer $limit max number of notices to return
*
* @return array notices
*/
function getNotices($limit=0)
{
$notice = Fave::stream($this->user->id, 0, $limit, $false);
$notices = array();
while ($notice->fetch()) {
$notices[] = clone($notice);
}
return $notices;
$stream = Fave::stream($this->target->getID(), 0, $this->limit, $own);
return $stream->fetchAll();
}
/**
@ -116,15 +77,4 @@ class FavoritesrssAction extends Rss10Action
$user->nickname, common_config('site', 'name')));
return $c;
}
/**
* Get image.
*
* @return void
*/
function getImage()
{
return null;
}
}

View File

@ -27,13 +27,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/personalgroupnav.php';
require_once INSTALLDIR.'/lib/noticelist.php';
require_once INSTALLDIR.'/lib/feedlist.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* List of replies
@ -44,119 +38,29 @@ require_once INSTALLDIR.'/lib/feedlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class ShowfavoritesAction extends Action
class ShowfavoritesAction extends ShowstreamAction
{
/** User we're getting the faves of */
var $user = null;
/** Page of the faves we're on */
var $page = null;
/**
* Is this a read-only page?
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
}
/**
* Title of the page
*
* Includes name of user and page number.
*
* @return string title of page
*/
function title()
{
if ($this->page == 1) {
// TRANS: Title for first page of favourite notices of a user.
// TRANS: %s is the user for whom the favourite notices are displayed.
return sprintf(_('%s\'s favorite notices'), $this->user->nickname);
return sprintf(_('%s\'s favorite notices'), $this->getTarget()->getNickname());
} else {
// TRANS: Title for all but the first page of favourite notices of a user.
// TRANS: %1$s is the user for whom the favourite notices are displayed, %2$d is the page number.
return sprintf(_('%1$s\'s favorite notices, page %2$d'),
$this->user->nickname,
$this->getTarget()->getNickname(),
$this->page);
}
}
/**
* Prepare the object
*
* Check the input values and initialize the object.
* Shows an error page on bad input.
*
* @param array $args $_REQUEST data
*
* @return boolean success flag
*/
function prepare($args)
public function getStream()
{
parent::prepare($args);
$nickname = common_canonical_nickname($this->arg('nickname'));
$this->user = User::getKV('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed when trying to display favourite notices for a non-existing user.
$this->clientError(_('No such user.'));
}
$this->page = $this->trimmed('page');
if (!$this->page) {
$this->page = 1;
}
common_set_returnto($this->selfUrl());
$cur = common_current_user();
// Show imported/gateway notices as well as local if
// the user is looking at their own favorites, otherwise not.
$this->notice = Fave::stream($this->user->id,
($this->page-1)*NOTICES_PER_PAGE, // offset
NOTICES_PER_PAGE + 1, // limit
(!empty($cur) && $cur->id == $this->user->id) // own feed?
);
if (empty($this->notice)) {
// TRANS: Server error displayed when favourite notices could not be retrieved from the database.
$this->serverError(_('Could not retrieve favorite notices.'));
}
if($this->page > 1 && $this->notice->N == 0){
// TRANS: Client error when page not found (404)
$this->clientError(_('No such page.'), 404);
}
return true;
$own = $this->scoped instanceof Profile ? $this->scoped->sameAs($this->getTarget()) : false;
return new FaveNoticeStream($this->getTarget()->getID(), $own);
}
/**
* Handle a request
*
* Just show the page. All args already handled.
*
* @param array $args $_REQUEST data
*
* @return void
*/
function handle($args)
{
parent::handle($args);
$this->showPage();
}
/**
* Feeds for the <head> section
*
* @return array Feed objects to show
*/
function getFeeds()
{
return array(new Feed(Feed::JSON,
@ -223,7 +127,7 @@ class ShowfavoritesAction extends Action
*
* @return void
*/
function showContent()
function showNotices()
{
$nl = new FavoritesNoticeList($this->notice, $this);
@ -234,7 +138,7 @@ class ShowfavoritesAction extends Action
$this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE,
$this->page, 'showfavorites',
array('nickname' => $this->user->nickname));
array('nickname' => $this->getTarget()->getNickname()));
}
function showPageNotice() {

Some files were not shown because too many files have changed in this diff Show More