forked from GNUsocial/gnu-social
Merge branch 'master' of git.gnu.io:gnu/gnu-social
This commit is contained in:
commit
19e7cf5f4a
@ -41,13 +41,9 @@ class AllAction extends ProfileAction
|
|||||||
{
|
{
|
||||||
var $notice;
|
var $notice;
|
||||||
|
|
||||||
protected function prepare(array $args=array())
|
protected function profileActionPreparation()
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
|
||||||
|
|
||||||
$user = common_current_user();
|
|
||||||
|
|
||||||
if (!empty($user) && $user->streamModeOnly()) {
|
|
||||||
$stream = new InboxNoticeStream($this->target, $this->scoped);
|
$stream = new InboxNoticeStream($this->target, $this->scoped);
|
||||||
} else {
|
} else {
|
||||||
$stream = new ThreadingInboxNoticeStream($this->target, $this->scoped);
|
$stream = new ThreadingInboxNoticeStream($this->target, $this->scoped);
|
||||||
@ -60,8 +56,6 @@ class AllAction extends ProfileAction
|
|||||||
// TRANS: Client error when page not found (404).
|
// TRANS: Client error when page not found (404).
|
||||||
$this->clientError(_('No such page.'), 404);
|
$this->clientError(_('No such page.'), 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function title()
|
function title()
|
||||||
|
@ -49,14 +49,12 @@ class ShowstreamAction extends ProfileAction
|
|||||||
{
|
{
|
||||||
var $notice;
|
var $notice;
|
||||||
|
|
||||||
protected function prepare(array $args=array())
|
protected function profileActionPreparation()
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
|
||||||
|
|
||||||
if (empty($this->tag)) {
|
if (empty($this->tag)) {
|
||||||
$stream = new ProfileNoticeStream($this->profile, $this->scoped);
|
$stream = new ProfileNoticeStream($this->target, $this->scoped);
|
||||||
} else {
|
} else {
|
||||||
$stream = new TaggedProfileNoticeStream($this->profile, $this->tag, $this->scoped);
|
$stream = new TaggedProfileNoticeStream($this->target, $this->tag, $this->scoped);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
|
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
|
||||||
@ -67,7 +65,7 @@ class ShowstreamAction extends ProfileAction
|
|||||||
|
|
||||||
function title()
|
function title()
|
||||||
{
|
{
|
||||||
$base = $this->profile->getFancyName();
|
$base = $this->target->getFancyName();
|
||||||
if (!empty($this->tag)) {
|
if (!empty($this->tag)) {
|
||||||
if ($this->page == 1) {
|
if ($this->page == 1) {
|
||||||
// TRANS: Page title showing tagged notices in one user's timeline.
|
// TRANS: Page title showing tagged notices in one user's timeline.
|
||||||
@ -98,7 +96,7 @@ class ShowstreamAction extends ProfileAction
|
|||||||
|
|
||||||
function showProfileBlock()
|
function showProfileBlock()
|
||||||
{
|
{
|
||||||
$block = new AccountProfileBlock($this, $this->profile);
|
$block = new AccountProfileBlock($this, $this->target);
|
||||||
$block->show();
|
$block->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,12 +110,12 @@ class ShowstreamAction extends ProfileAction
|
|||||||
if (!empty($this->tag)) {
|
if (!empty($this->tag)) {
|
||||||
return array(new Feed(Feed::RSS1,
|
return array(new Feed(Feed::RSS1,
|
||||||
common_local_url('userrss',
|
common_local_url('userrss',
|
||||||
array('nickname' => $this->target->nickname,
|
array('nickname' => $this->target->getNickname(),
|
||||||
'tag' => $this->tag)),
|
'tag' => $this->tag)),
|
||||||
// TRANS: Title for link to notice feed.
|
// TRANS: Title for link to notice feed.
|
||||||
// TRANS: %1$s is a user nickname, %2$s is a hashtag.
|
// TRANS: %1$s is a user nickname, %2$s is a hashtag.
|
||||||
sprintf(_('Notice feed for %1$s tagged %2$s (RSS 1.0)'),
|
sprintf(_('Notice feed for %1$s tagged %2$s (RSS 1.0)'),
|
||||||
$this->target->nickname, $this->tag)));
|
$this->target->getNickname(), $this->tag)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return array(new Feed(Feed::JSON,
|
return array(new Feed(Feed::JSON,
|
||||||
@ -128,14 +126,14 @@ class ShowstreamAction extends ProfileAction
|
|||||||
// TRANS: Title for link to notice feed.
|
// TRANS: Title for link to notice feed.
|
||||||
// TRANS: %s is a user nickname.
|
// TRANS: %s is a user nickname.
|
||||||
sprintf(_('Notice feed for %s (Activity Streams JSON)'),
|
sprintf(_('Notice feed for %s (Activity Streams JSON)'),
|
||||||
$this->target->nickname)),
|
$this->target->getNickname())),
|
||||||
new Feed(Feed::RSS1,
|
new Feed(Feed::RSS1,
|
||||||
common_local_url('userrss',
|
common_local_url('userrss',
|
||||||
array('nickname' => $this->target->nickname)),
|
array('nickname' => $this->target->getNickname())),
|
||||||
// TRANS: Title for link to notice feed.
|
// TRANS: Title for link to notice feed.
|
||||||
// TRANS: %s is a user nickname.
|
// TRANS: %s is a user nickname.
|
||||||
sprintf(_('Notice feed for %s (RSS 1.0)'),
|
sprintf(_('Notice feed for %s (RSS 1.0)'),
|
||||||
$this->target->nickname)),
|
$this->target->getNickname())),
|
||||||
new Feed(Feed::RSS2,
|
new Feed(Feed::RSS2,
|
||||||
common_local_url('ApiTimelineUser',
|
common_local_url('ApiTimelineUser',
|
||||||
array(
|
array(
|
||||||
@ -144,7 +142,7 @@ class ShowstreamAction extends ProfileAction
|
|||||||
// TRANS: Title for link to notice feed.
|
// TRANS: Title for link to notice feed.
|
||||||
// TRANS: %s is a user nickname.
|
// TRANS: %s is a user nickname.
|
||||||
sprintf(_('Notice feed for %s (RSS 2.0)'),
|
sprintf(_('Notice feed for %s (RSS 2.0)'),
|
||||||
$this->target->nickname)),
|
$this->target->getNickname())),
|
||||||
new Feed(Feed::ATOM,
|
new Feed(Feed::ATOM,
|
||||||
common_local_url('ApiTimelineUser',
|
common_local_url('ApiTimelineUser',
|
||||||
array(
|
array(
|
||||||
@ -153,24 +151,24 @@ class ShowstreamAction extends ProfileAction
|
|||||||
// TRANS: Title for link to notice feed.
|
// TRANS: Title for link to notice feed.
|
||||||
// TRANS: %s is a user nickname.
|
// TRANS: %s is a user nickname.
|
||||||
sprintf(_('Notice feed for %s (Atom)'),
|
sprintf(_('Notice feed for %s (Atom)'),
|
||||||
$this->target->nickname)),
|
$this->target->getNickname())),
|
||||||
new Feed(Feed::FOAF,
|
new Feed(Feed::FOAF,
|
||||||
common_local_url('foaf', array('nickname' =>
|
common_local_url('foaf', array('nickname' =>
|
||||||
$this->target->nickname)),
|
$this->target->getNickname())),
|
||||||
// TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend.
|
// TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend.
|
||||||
// TRANS: More information at http://www.foaf-project.org. %s is a user nickname.
|
// TRANS: More information at http://www.foaf-project.org. %s is a user nickname.
|
||||||
sprintf(_('FOAF for %s'), $this->target->nickname)));
|
sprintf(_('FOAF for %s'), $this->target->getNickname())));
|
||||||
}
|
}
|
||||||
|
|
||||||
function extraHead()
|
function extraHead()
|
||||||
{
|
{
|
||||||
if ($this->profile->bio) {
|
if ($this->target->bio) {
|
||||||
$this->element('meta', array('name' => 'description',
|
$this->element('meta', array('name' => 'description',
|
||||||
'content' => $this->profile->bio));
|
'content' => $this->target->getDescription()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->user->emailmicroid && $this->user->email && $this->profile->profileurl) {
|
if ($this->target->isLocal() && $this->target->getUser()->emailmicroid && $this->target->getUser()->email && $this->target->getUrl()) {
|
||||||
$id = new Microid('mailto:'.$this->user->email,
|
$id = new Microid('mailto:'.$this->target->getUser()->email,
|
||||||
$this->selfUrl());
|
$this->selfUrl());
|
||||||
$this->element('meta', array('name' => 'microid',
|
$this->element('meta', array('name' => 'microid',
|
||||||
'content' => $id->toString()));
|
'content' => $id->toString()));
|
||||||
@ -180,10 +178,10 @@ class ShowstreamAction extends ProfileAction
|
|||||||
|
|
||||||
$this->element('link', array('rel' => 'microsummary',
|
$this->element('link', array('rel' => 'microsummary',
|
||||||
'href' => common_local_url('microsummary',
|
'href' => common_local_url('microsummary',
|
||||||
array('nickname' => $this->profile->nickname))));
|
array('nickname' => $this->target->getNickname()))));
|
||||||
|
|
||||||
$rsd = common_local_url('rsd',
|
$rsd = common_local_url('rsd',
|
||||||
array('nickname' => $this->profile->nickname));
|
array('nickname' => $this->target->getNickname()));
|
||||||
|
|
||||||
// RSD, http://tales.phrasewise.com/rfc/rsd
|
// RSD, http://tales.phrasewise.com/rfc/rsd
|
||||||
$this->element('link', array('rel' => 'EditURI',
|
$this->element('link', array('rel' => 'EditURI',
|
||||||
@ -192,7 +190,7 @@ class ShowstreamAction extends ProfileAction
|
|||||||
|
|
||||||
if ($this->page != 1) {
|
if ($this->page != 1) {
|
||||||
$this->element('link', array('rel' => 'canonical',
|
$this->element('link', array('rel' => 'canonical',
|
||||||
'href' => $this->profile->profileurl));
|
'href' => $this->target->getUrl()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,10 +271,9 @@ class ShowstreamAction extends ProfileAction
|
|||||||
function noticeFormOptions()
|
function noticeFormOptions()
|
||||||
{
|
{
|
||||||
$options = parent::noticeFormOptions();
|
$options = parent::noticeFormOptions();
|
||||||
$cur = common_current_user();
|
|
||||||
|
|
||||||
if (empty($cur) || $cur->id != $this->profile->id) {
|
if (!$this->scoped instanceof Profile || $this->scoped->id != $this->target->id) {
|
||||||
$options['to_profile'] = $this->profile;
|
$options['to_profile'] = $this->target;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $options;
|
return $options;
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
if (!defined('GNUSOCIAL')) { exit(1); }
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
|
|
||||||
require_once INSTALLDIR . '/lib/peopletags.php';
|
|
||||||
|
|
||||||
class TagprofileAction extends FormAction
|
class TagprofileAction extends FormAction
|
||||||
{
|
{
|
||||||
var $error = null;
|
var $error = null;
|
||||||
|
@ -108,7 +108,13 @@ class Conversation extends Managed_DataObject
|
|||||||
|
|
||||||
static public function getUrlFromNotice(Notice $notice, $anchor=true)
|
static public function getUrlFromNotice(Notice $notice, $anchor=true)
|
||||||
{
|
{
|
||||||
$conv = self::getKV('id', $notice->conversation);
|
$conv = new Conversation();
|
||||||
|
$conv->id = $notice->conversation;
|
||||||
|
$conv->find(true);
|
||||||
|
if (!$conv instanceof Conversation) {
|
||||||
|
common_debug('Conversation does not exist for notice ID: '.$notice->id);
|
||||||
|
throw new NoResultException($conv);
|
||||||
|
}
|
||||||
return $conv->getUrl($anchor ? $notice->id : null);
|
return $conv->getUrl($anchor ? $notice->id : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,6 +569,14 @@ class File extends Managed_DataObject
|
|||||||
$thumbs->delete();
|
$thumbs->delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$f2p = new File_to_post();
|
||||||
|
$f2p->file_id = $this->id;
|
||||||
|
if ($f2p->find()) {
|
||||||
|
while ($f2p->fetch()) {
|
||||||
|
$f2p->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// And finally remove the entry from the database
|
// And finally remove the entry from the database
|
||||||
|
@ -322,6 +322,7 @@ class File_redirection extends Managed_DataObject
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'mailto':
|
case 'mailto':
|
||||||
|
case 'magnet':
|
||||||
case 'aim':
|
case 'aim':
|
||||||
case 'jabber':
|
case 'jabber':
|
||||||
case 'xmpp':
|
case 'xmpp':
|
||||||
|
@ -52,6 +52,7 @@ class File_to_post extends Managed_DataObject
|
|||||||
'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')),
|
'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')),
|
||||||
),
|
),
|
||||||
'indexes' => array(
|
'indexes' => array(
|
||||||
|
'file_id_idx' => array('file_id'),
|
||||||
'post_id_idx' => array('post_id'),
|
'post_id_idx' => array('post_id'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -87,7 +88,7 @@ class File_to_post extends Managed_DataObject
|
|||||||
function delete($useWhere=false)
|
function delete($useWhere=false)
|
||||||
{
|
{
|
||||||
$f = File::getKV('id', $this->file_id);
|
$f = File::getKV('id', $this->file_id);
|
||||||
if (!empty($f)) {
|
if ($f instanceof File) {
|
||||||
$f->blowCache();
|
$f->blowCache();
|
||||||
}
|
}
|
||||||
return parent::delete($useWhere);
|
return parent::delete($useWhere);
|
||||||
|
@ -40,16 +40,19 @@ class Local_group extends Managed_DataObject
|
|||||||
|
|
||||||
public function getProfile()
|
public function getProfile()
|
||||||
{
|
{
|
||||||
$group = $this->getGroup();
|
return $this->getGroup()->getProfile();
|
||||||
if (!$group instanceof User_group) {
|
|
||||||
return null; // TODO: Throw exception when other code is ready
|
|
||||||
}
|
|
||||||
return $group->getProfile();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getGroup()
|
public function getGroup()
|
||||||
{
|
{
|
||||||
return User_group::getKV('id', $this->group_id);
|
$group = new User_group();
|
||||||
|
$group->id = $this->group_id;
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
return $group;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setNickname($nickname)
|
function setNickname($nickname)
|
||||||
|
@ -1380,6 +1380,11 @@ class Profile extends Managed_DataObject
|
|||||||
return $this->nickname;
|
return $this->nickname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getFullname()
|
||||||
|
{
|
||||||
|
return $this->fullname;
|
||||||
|
}
|
||||||
|
|
||||||
public function getDescription()
|
public function getDescription()
|
||||||
{
|
{
|
||||||
return $this->bio;
|
return $this->bio;
|
||||||
|
@ -45,9 +45,11 @@
|
|||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
<FilesMatch "\.(ini)">
|
<FilesMatch "\.(ini)">
|
||||||
# For mod_access_compat in Apache <2.4
|
<IfVersion < 2.3>
|
||||||
#Order allow,deny
|
Order allow,deny
|
||||||
|
Deny from all
|
||||||
# Use this instead for Apache >2.4 (mod_authz_host)
|
</IfVersion>
|
||||||
# Require all denied
|
<IfVersion >= 2.3>
|
||||||
|
Require all denied
|
||||||
|
</IfVersion>
|
||||||
</FilesMatch>
|
</FilesMatch>
|
||||||
|
@ -28,13 +28,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
// This check helps protect against security problems;
|
|
||||||
// your code file can't be executed directly from the web.
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/peopletags.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Profile block to show for an account
|
* Profile block to show for an account
|
||||||
|
@ -932,7 +932,7 @@ class HelpCommand extends Command
|
|||||||
// Give plugins a chance to add or override...
|
// Give plugins a chance to add or override...
|
||||||
Event::handle('HelpCommandMessages', array($this, &$commands));
|
Event::handle('HelpCommandMessages', array($this, &$commands));
|
||||||
|
|
||||||
sort($commands);
|
ksort($commands);
|
||||||
foreach ($commands as $command => $help) {
|
foreach ($commands as $command => $help) {
|
||||||
$out[] = "$command - $help";
|
$out[] = "$command - $help";
|
||||||
}
|
}
|
||||||
|
@ -337,7 +337,6 @@ $default =
|
|||||||
'path' => null,
|
'path' => null,
|
||||||
'sslpath' => null,
|
'sslpath' => null,
|
||||||
),
|
),
|
||||||
'pluginlist' => array(),
|
|
||||||
'admin' =>
|
'admin' =>
|
||||||
array('panels' => array('site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')),
|
array('panels' => array('site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')),
|
||||||
'singleuser' =>
|
'singleuser' =>
|
||||||
|
@ -144,7 +144,7 @@ require_once INSTALLDIR.'/lib/action.php';
|
|||||||
require_once INSTALLDIR.'/lib/mail.php';
|
require_once INSTALLDIR.'/lib/mail.php';
|
||||||
|
|
||||||
//set PEAR error handling to use regular PHP exceptions
|
//set PEAR error handling to use regular PHP exceptions
|
||||||
function PEAR_ErrorToPEAR_Exception($err)
|
function PEAR_ErrorToPEAR_Exception(PEAR_Error $err)
|
||||||
{
|
{
|
||||||
//DB_DataObject throws error when an empty set would be returned
|
//DB_DataObject throws error when an empty set would be returned
|
||||||
//That behavior is weird, and not how the rest of StatusNet works.
|
//That behavior is weird, and not how the rest of StatusNet works.
|
||||||
|
@ -28,11 +28,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/xmloutputter.php';
|
|
||||||
|
|
||||||
// Can include XHTML options but these are too fragile in practice.
|
// Can include XHTML options but these are too fragile in practice.
|
||||||
define('PAGE_TYPE_PREFS', 'text/html');
|
define('PAGE_TYPE_PREFS', 'text/html');
|
||||||
@ -58,6 +54,9 @@ define('PAGE_TYPE_PREFS', 'text/html');
|
|||||||
|
|
||||||
class HTMLOutputter extends XMLOutputter
|
class HTMLOutputter extends XMLOutputter
|
||||||
{
|
{
|
||||||
|
protected $DTD = array('doctype' => 'html',
|
||||||
|
'spec' => '-//W3C//DTD XHTML 1.0 Strict//EN',
|
||||||
|
'uri' => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
@ -120,9 +119,8 @@ class HTMLOutputter extends XMLOutputter
|
|||||||
// Required for XML documents
|
// Required for XML documents
|
||||||
$this->startXML();
|
$this->startXML();
|
||||||
}
|
}
|
||||||
$this->xw->writeDTD('html',
|
|
||||||
'-//W3C//DTD XHTML 1.0 Strict//EN',
|
$this->writeDTD();
|
||||||
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
|
|
||||||
|
|
||||||
$language = $this->getLanguage();
|
$language = $this->getLanguage();
|
||||||
|
|
||||||
@ -138,6 +136,18 @@ class HTMLOutputter extends XMLOutputter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setDTD($doctype, $spec, $uri)
|
||||||
|
{
|
||||||
|
$this->DTD = array('doctype' => $doctype, 'spec' => $spec, 'uri' => $uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function writeDTD()
|
||||||
|
{
|
||||||
|
$this->xw->writeDTD($this->DTD['doctype'],
|
||||||
|
$this->DTD['spec'],
|
||||||
|
$this->DTD['uri']);
|
||||||
|
}
|
||||||
|
|
||||||
function getLanguage()
|
function getLanguage()
|
||||||
{
|
{
|
||||||
// FIXME: correct language for interface
|
// FIXME: correct language for interface
|
||||||
|
@ -35,7 +35,7 @@ class InlineAttachmentList extends AttachmentList
|
|||||||
{
|
{
|
||||||
function showListStart()
|
function showListStart()
|
||||||
{
|
{
|
||||||
$this->out->element('h3', null, _('Attachments'));
|
$this->out->element('h3', 'attachments-title', _('Attachments'));
|
||||||
parent::showListStart();
|
parent::showListStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,7 +424,11 @@ abstract class Installer
|
|||||||
// database
|
// database
|
||||||
"\$config['db']['database'] = {$vals['db_database']};\n\n".
|
"\$config['db']['database'] = {$vals['db_database']};\n\n".
|
||||||
($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
|
($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
|
||||||
"\$config['db']['type'] = {$vals['db_type']};\n\n";
|
"\$config['db']['type'] = {$vals['db_type']};\n\n".
|
||||||
|
|
||||||
|
"// Uncomment below for better performance. Just remember you must run\n".
|
||||||
|
"// php scripts/checkschema.php whenever your enabled plugins change!\n".
|
||||||
|
"//\$config['db']['schemacheck'] = 'script';\n\n";
|
||||||
|
|
||||||
// Normalize line endings for Windows servers
|
// Normalize line endings for Windows servers
|
||||||
$cfg = str_replace("\n", PHP_EOL, $cfg);
|
$cfg = str_replace("\n", PHP_EOL, $cfg);
|
||||||
|
@ -25,11 +25,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/widget.php';
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Show a bunch of peopletags
|
* Show a bunch of peopletags
|
||||||
@ -178,18 +174,3 @@ class PeopletagsWidget extends Widget
|
|||||||
return !empty($this->user) && $this->tagger->id == $this->user->id;
|
return !empty($this->user) && $this->tagger->id == $this->user->id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SelftagsWidget extends PeopletagsWidget
|
|
||||||
{
|
|
||||||
function url($tag)
|
|
||||||
{
|
|
||||||
// link to self tag page
|
|
||||||
return common_local_url('selftag', array('tag' => $tag));
|
|
||||||
}
|
|
||||||
|
|
||||||
function label()
|
|
||||||
{
|
|
||||||
// TRANS: Label in self tags widget.
|
|
||||||
return _m('LABEL','Tags');
|
|
||||||
}
|
|
||||||
}
|
|
@ -28,12 +28,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/profileminilist.php';
|
|
||||||
require_once INSTALLDIR.'/lib/groupminilist.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Profile action common superclass
|
* Profile action common superclass
|
||||||
@ -46,17 +41,15 @@ require_once INSTALLDIR.'/lib/groupminilist.php';
|
|||||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
class ProfileAction extends ManagedAction
|
abstract class ProfileAction extends ManagedAction
|
||||||
{
|
{
|
||||||
var $page = null;
|
var $page = null;
|
||||||
var $tag = null;
|
var $tag = null;
|
||||||
|
|
||||||
protected $target = null; // Profile that we're showing
|
protected $target = null; // Profile that we're showing
|
||||||
|
|
||||||
protected function prepare(array $args=array())
|
protected function doPreparation()
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$nickname_arg = $this->arg('nickname');
|
$nickname_arg = $this->arg('nickname');
|
||||||
$nickname = common_canonical_nickname($nickname_arg);
|
$nickname = common_canonical_nickname($nickname_arg);
|
||||||
@ -73,6 +66,10 @@ class ProfileAction extends ManagedAction
|
|||||||
$this->user = User::getKV('nickname', $nickname);
|
$this->user = User::getKV('nickname', $nickname);
|
||||||
|
|
||||||
if (!$this->user) {
|
if (!$this->user) {
|
||||||
|
$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.
|
// TRANS: Client error displayed when calling a profile action without specifying a user.
|
||||||
$this->clientError(_('No such user.'), 404);
|
$this->clientError(_('No such user.'), 404);
|
||||||
}
|
}
|
||||||
@ -106,7 +103,13 @@ class ProfileAction extends ManagedAction
|
|||||||
$this->tag = $this->trimmed('tag');
|
$this->tag = $this->trimmed('tag');
|
||||||
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
||||||
common_set_returnto($this->selfUrl());
|
common_set_returnto($this->selfUrl());
|
||||||
return true;
|
|
||||||
|
return $this->profileActionPreparation();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function profileActionPreparation()
|
||||||
|
{
|
||||||
|
// No-op by default.
|
||||||
}
|
}
|
||||||
|
|
||||||
function isReadOnly($args)
|
function isReadOnly($args)
|
||||||
|
@ -27,11 +27,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/peopletags.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Widget to show a list of profiles
|
* Widget to show a list of profiles
|
||||||
@ -107,215 +103,3 @@ class ProfileList extends Widget
|
|||||||
return PROFILES_PER_PAGE;
|
return PROFILES_PER_PAGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ProfileListItem extends Widget
|
|
||||||
{
|
|
||||||
/** Current profile. */
|
|
||||||
var $profile = null;
|
|
||||||
/** Action object using us. */
|
|
||||||
var $action = null;
|
|
||||||
|
|
||||||
function __construct($profile, $action)
|
|
||||||
{
|
|
||||||
parent::__construct($action);
|
|
||||||
|
|
||||||
$this->profile = $profile;
|
|
||||||
$this->action = $action;
|
|
||||||
}
|
|
||||||
|
|
||||||
function show()
|
|
||||||
{
|
|
||||||
if (Event::handle('StartProfileListItem', array($this))) {
|
|
||||||
$this->startItem();
|
|
||||||
if (Event::handle('StartProfileListItemProfile', array($this))) {
|
|
||||||
$this->showProfile();
|
|
||||||
Event::handle('EndProfileListItemProfile', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemActions', array($this))) {
|
|
||||||
$this->showActions();
|
|
||||||
Event::handle('EndProfileListItemActions', array($this));
|
|
||||||
}
|
|
||||||
$this->endItem();
|
|
||||||
Event::handle('EndProfileListItem', array($this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function startItem()
|
|
||||||
{
|
|
||||||
$this->out->elementStart('li', array('class' => 'profile',
|
|
||||||
'id' => 'profile-' . $this->profile->id));
|
|
||||||
}
|
|
||||||
|
|
||||||
function showProfile()
|
|
||||||
{
|
|
||||||
$this->startProfile();
|
|
||||||
if (Event::handle('StartProfileListItemProfileElements', array($this))) {
|
|
||||||
if (Event::handle('StartProfileListItemAvatar', array($this))) {
|
|
||||||
$aAttrs = $this->linkAttributes();
|
|
||||||
$this->out->elementStart('a', $aAttrs);
|
|
||||||
$this->showAvatar($this->profile);
|
|
||||||
$this->out->elementEnd('a');
|
|
||||||
Event::handle('EndProfileListItemAvatar', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemNickname', array($this))) {
|
|
||||||
$this->showNickname();
|
|
||||||
Event::handle('EndProfileListItemNickname', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemFullName', array($this))) {
|
|
||||||
$this->showFullName();
|
|
||||||
Event::handle('EndProfileListItemFullName', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemLocation', array($this))) {
|
|
||||||
$this->showLocation();
|
|
||||||
Event::handle('EndProfileListItemLocation', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemHomepage', array($this))) {
|
|
||||||
$this->showHomepage();
|
|
||||||
Event::handle('EndProfileListItemHomepage', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemBio', array($this))) {
|
|
||||||
$this->showBio();
|
|
||||||
Event::handle('EndProfileListItemBio', array($this));
|
|
||||||
}
|
|
||||||
if (Event::handle('StartProfileListItemTags', array($this))) {
|
|
||||||
$this->showTags();
|
|
||||||
Event::handle('EndProfileListItemTags', array($this));
|
|
||||||
}
|
|
||||||
Event::handle('EndProfileListItemProfileElements', array($this));
|
|
||||||
}
|
|
||||||
$this->endProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
function startProfile()
|
|
||||||
{
|
|
||||||
$this->out->elementStart('div', 'entity_profile h-card');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showNickname()
|
|
||||||
{
|
|
||||||
$this->out->element('a', array('href'=>$this->profile->getUrl(),
|
|
||||||
'class'=>'p-nickname'),
|
|
||||||
$this->profile->getNickname());
|
|
||||||
}
|
|
||||||
|
|
||||||
function showFullName()
|
|
||||||
{
|
|
||||||
if (!empty($this->profile->fullname)) {
|
|
||||||
$this->out->element('span', 'p-name', $this->profile->fullname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showLocation()
|
|
||||||
{
|
|
||||||
if (!empty($this->profile->location)) {
|
|
||||||
$this->out->element('span', 'label p-locality', $this->profile->location);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showHomepage()
|
|
||||||
{
|
|
||||||
if (!empty($this->profile->homepage)) {
|
|
||||||
$this->out->text(' ');
|
|
||||||
$aAttrs = $this->homepageAttributes();
|
|
||||||
$this->out->elementStart('a', $aAttrs);
|
|
||||||
$this->out->raw($this->highlight($this->profile->homepage));
|
|
||||||
$this->out->elementEnd('a');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showBio()
|
|
||||||
{
|
|
||||||
if (!empty($this->profile->bio)) {
|
|
||||||
$this->out->elementStart('p', 'note');
|
|
||||||
$this->out->raw($this->highlight($this->profile->bio));
|
|
||||||
$this->out->elementEnd('p');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showTags()
|
|
||||||
{
|
|
||||||
$user = common_current_user();
|
|
||||||
if (!empty($user)) {
|
|
||||||
if ($user->id == $this->profile->id) {
|
|
||||||
$tags = new SelftagsWidget($this->out, $user, $this->profile);
|
|
||||||
$tags->show();
|
|
||||||
} else if ($user->getProfile()->canTag($this->profile)) {
|
|
||||||
$tags = new PeopletagsWidget($this->out, $user, $this->profile);
|
|
||||||
$tags->show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function endProfile()
|
|
||||||
{
|
|
||||||
$this->out->elementEnd('div');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showActions()
|
|
||||||
{
|
|
||||||
$this->startActions();
|
|
||||||
if (Event::handle('StartProfileListItemActionElements', array($this))) {
|
|
||||||
$this->showSubscribeButton();
|
|
||||||
Event::handle('EndProfileListItemActionElements', array($this));
|
|
||||||
}
|
|
||||||
$this->endActions();
|
|
||||||
}
|
|
||||||
|
|
||||||
function startActions()
|
|
||||||
{
|
|
||||||
$this->out->elementStart('div', 'entity_actions');
|
|
||||||
$this->out->elementStart('ul');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showSubscribeButton()
|
|
||||||
{
|
|
||||||
// Is this a logged-in user, looking at someone else's
|
|
||||||
// profile?
|
|
||||||
|
|
||||||
$user = common_current_user();
|
|
||||||
|
|
||||||
if (!empty($user) && $this->profile->id != $user->id) {
|
|
||||||
$this->out->elementStart('li', 'entity_subscribe');
|
|
||||||
if ($user->isSubscribed($this->profile)) {
|
|
||||||
$usf = new UnsubscribeForm($this->out, $this->profile);
|
|
||||||
$usf->show();
|
|
||||||
} else {
|
|
||||||
if (Event::handle('StartShowProfileListSubscribeButton', array($this))) {
|
|
||||||
$sf = new SubscribeForm($this->out, $this->profile);
|
|
||||||
$sf->show();
|
|
||||||
Event::handle('EndShowProfileListSubscribeButton', array($this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->out->elementEnd('li');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function endActions()
|
|
||||||
{
|
|
||||||
$this->out->elementEnd('ul');
|
|
||||||
$this->out->elementEnd('div');
|
|
||||||
}
|
|
||||||
|
|
||||||
function endItem()
|
|
||||||
{
|
|
||||||
$this->out->elementEnd('li');
|
|
||||||
}
|
|
||||||
|
|
||||||
function highlight($text)
|
|
||||||
{
|
|
||||||
return htmlspecialchars($text);
|
|
||||||
}
|
|
||||||
|
|
||||||
function linkAttributes()
|
|
||||||
{
|
|
||||||
return array('href' => $this->profile->profileurl,
|
|
||||||
'class' => 'u-url',
|
|
||||||
'rel' => 'contact');
|
|
||||||
}
|
|
||||||
|
|
||||||
function homepageAttributes()
|
|
||||||
{
|
|
||||||
return array('href' => $this->profile->homepage,
|
|
||||||
'class' => 'u-url');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
242
lib/profilelistitem.php
Normal file
242
lib/profilelistitem.php
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Widget to show a list of profiles
|
||||||
|
*
|
||||||
|
* 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 Public
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @copyright 2008-2009 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 ProfileListItem extends Widget
|
||||||
|
{
|
||||||
|
/** Current profile. */
|
||||||
|
var $profile = null;
|
||||||
|
/** Action object using us. */
|
||||||
|
var $action = null;
|
||||||
|
|
||||||
|
function __construct($profile, $action)
|
||||||
|
{
|
||||||
|
parent::__construct($action);
|
||||||
|
|
||||||
|
$this->profile = $profile;
|
||||||
|
$this->action = $action;
|
||||||
|
}
|
||||||
|
|
||||||
|
function show()
|
||||||
|
{
|
||||||
|
if (Event::handle('StartProfileListItem', array($this))) {
|
||||||
|
$this->startItem();
|
||||||
|
if (Event::handle('StartProfileListItemProfile', array($this))) {
|
||||||
|
$this->showProfile();
|
||||||
|
Event::handle('EndProfileListItemProfile', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemActions', array($this))) {
|
||||||
|
$this->showActions();
|
||||||
|
Event::handle('EndProfileListItemActions', array($this));
|
||||||
|
}
|
||||||
|
$this->endItem();
|
||||||
|
Event::handle('EndProfileListItem', array($this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function startItem()
|
||||||
|
{
|
||||||
|
$this->out->elementStart('li', array('class' => 'profile',
|
||||||
|
'id' => 'profile-' . $this->profile->id));
|
||||||
|
}
|
||||||
|
|
||||||
|
function showProfile()
|
||||||
|
{
|
||||||
|
$this->startProfile();
|
||||||
|
if (Event::handle('StartProfileListItemProfileElements', array($this))) {
|
||||||
|
if (Event::handle('StartProfileListItemAvatar', array($this))) {
|
||||||
|
$aAttrs = $this->linkAttributes();
|
||||||
|
$this->out->elementStart('a', $aAttrs);
|
||||||
|
$this->showAvatar($this->profile);
|
||||||
|
$this->out->elementEnd('a');
|
||||||
|
Event::handle('EndProfileListItemAvatar', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemNickname', array($this))) {
|
||||||
|
$this->showNickname();
|
||||||
|
Event::handle('EndProfileListItemNickname', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemFullName', array($this))) {
|
||||||
|
$this->showFullName();
|
||||||
|
Event::handle('EndProfileListItemFullName', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemLocation', array($this))) {
|
||||||
|
$this->showLocation();
|
||||||
|
Event::handle('EndProfileListItemLocation', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemHomepage', array($this))) {
|
||||||
|
$this->showHomepage();
|
||||||
|
Event::handle('EndProfileListItemHomepage', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemBio', array($this))) {
|
||||||
|
$this->showBio();
|
||||||
|
Event::handle('EndProfileListItemBio', array($this));
|
||||||
|
}
|
||||||
|
if (Event::handle('StartProfileListItemTags', array($this))) {
|
||||||
|
$this->showTags();
|
||||||
|
Event::handle('EndProfileListItemTags', array($this));
|
||||||
|
}
|
||||||
|
Event::handle('EndProfileListItemProfileElements', array($this));
|
||||||
|
}
|
||||||
|
$this->endProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
function startProfile()
|
||||||
|
{
|
||||||
|
$this->out->elementStart('div', 'entity_profile h-card');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showNickname()
|
||||||
|
{
|
||||||
|
$this->out->element('a', array('href'=>$this->profile->getUrl(),
|
||||||
|
'class'=>'p-nickname'),
|
||||||
|
$this->profile->getNickname());
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFullName()
|
||||||
|
{
|
||||||
|
if (!empty($this->profile->fullname)) {
|
||||||
|
$this->out->element('span', 'p-name', $this->profile->fullname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showLocation()
|
||||||
|
{
|
||||||
|
if (!empty($this->profile->location)) {
|
||||||
|
$this->out->element('span', 'label p-locality', $this->profile->location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showHomepage()
|
||||||
|
{
|
||||||
|
if (!empty($this->profile->homepage)) {
|
||||||
|
$this->out->text(' ');
|
||||||
|
$aAttrs = $this->homepageAttributes();
|
||||||
|
$this->out->elementStart('a', $aAttrs);
|
||||||
|
$this->out->raw($this->highlight($this->profile->homepage));
|
||||||
|
$this->out->elementEnd('a');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showBio()
|
||||||
|
{
|
||||||
|
if (!empty($this->profile->bio)) {
|
||||||
|
$this->out->elementStart('p', 'note');
|
||||||
|
$this->out->raw($this->highlight($this->profile->bio));
|
||||||
|
$this->out->elementEnd('p');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showTags()
|
||||||
|
{
|
||||||
|
$user = common_current_user();
|
||||||
|
if (!empty($user)) {
|
||||||
|
if ($user->id == $this->profile->id) {
|
||||||
|
$tags = new SelftagsWidget($this->out, $user, $this->profile);
|
||||||
|
$tags->show();
|
||||||
|
} else if ($user->getProfile()->canTag($this->profile)) {
|
||||||
|
$tags = new PeopletagsWidget($this->out, $user, $this->profile);
|
||||||
|
$tags->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function endProfile()
|
||||||
|
{
|
||||||
|
$this->out->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showActions()
|
||||||
|
{
|
||||||
|
$this->startActions();
|
||||||
|
if (Event::handle('StartProfileListItemActionElements', array($this))) {
|
||||||
|
$this->showSubscribeButton();
|
||||||
|
Event::handle('EndProfileListItemActionElements', array($this));
|
||||||
|
}
|
||||||
|
$this->endActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
function startActions()
|
||||||
|
{
|
||||||
|
$this->out->elementStart('div', 'entity_actions');
|
||||||
|
$this->out->elementStart('ul');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSubscribeButton()
|
||||||
|
{
|
||||||
|
// Is this a logged-in user, looking at someone else's
|
||||||
|
// profile?
|
||||||
|
|
||||||
|
$user = common_current_user();
|
||||||
|
|
||||||
|
if (!empty($user) && $this->profile->id != $user->id) {
|
||||||
|
$this->out->elementStart('li', 'entity_subscribe');
|
||||||
|
if ($user->isSubscribed($this->profile)) {
|
||||||
|
$usf = new UnsubscribeForm($this->out, $this->profile);
|
||||||
|
$usf->show();
|
||||||
|
} else {
|
||||||
|
if (Event::handle('StartShowProfileListSubscribeButton', array($this))) {
|
||||||
|
$sf = new SubscribeForm($this->out, $this->profile);
|
||||||
|
$sf->show();
|
||||||
|
Event::handle('EndShowProfileListSubscribeButton', array($this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->out->elementEnd('li');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function endActions()
|
||||||
|
{
|
||||||
|
$this->out->elementEnd('ul');
|
||||||
|
$this->out->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
|
function endItem()
|
||||||
|
{
|
||||||
|
$this->out->elementEnd('li');
|
||||||
|
}
|
||||||
|
|
||||||
|
function highlight($text)
|
||||||
|
{
|
||||||
|
return htmlspecialchars($text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function linkAttributes()
|
||||||
|
{
|
||||||
|
return array('href' => $this->profile->profileurl,
|
||||||
|
'class' => 'u-url',
|
||||||
|
'rel' => 'contact');
|
||||||
|
}
|
||||||
|
|
||||||
|
function homepageAttributes()
|
||||||
|
{
|
||||||
|
return array('href' => $this->profile->homepage,
|
||||||
|
'class' => 'u-url');
|
||||||
|
}
|
||||||
|
}
|
@ -27,11 +27,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/lib/profilelist.php';
|
|
||||||
|
|
||||||
define('PROFILES_PER_MINILIST', 8);
|
define('PROFILES_PER_MINILIST', 8);
|
||||||
|
|
||||||
@ -69,39 +65,3 @@ class ProfileMiniList extends ProfileList
|
|||||||
return AVATAR_MINI_SIZE;
|
return AVATAR_MINI_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ProfileMiniListItem extends ProfileListItem
|
|
||||||
{
|
|
||||||
function show()
|
|
||||||
{
|
|
||||||
$this->out->elementStart('li', 'h-card');
|
|
||||||
if (Event::handle('StartProfileListItemProfileElements', array($this))) {
|
|
||||||
if (Event::handle('StartProfileListItemAvatar', array($this))) {
|
|
||||||
$aAttrs = $this->linkAttributes();
|
|
||||||
$this->out->elementStart('a', $aAttrs);
|
|
||||||
$avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE);
|
|
||||||
$this->out->element('img', array('src' => $avatarUrl,
|
|
||||||
'width' => AVATAR_MINI_SIZE,
|
|
||||||
'height' => AVATAR_MINI_SIZE,
|
|
||||||
'class' => 'avatar u-photo',
|
|
||||||
'alt' => $this->profile->getBestName()));
|
|
||||||
$this->out->elementEnd('a');
|
|
||||||
Event::handle('EndProfileListItemAvatar', array($this));
|
|
||||||
}
|
|
||||||
$this->out->elementEnd('li');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// default; overridden for nofollow lists
|
|
||||||
|
|
||||||
function linkAttributes()
|
|
||||||
{
|
|
||||||
$aAttrs = parent::linkAttributes();
|
|
||||||
|
|
||||||
$aAttrs['title'] = $this->profile->getBestName();
|
|
||||||
$aAttrs['rel'] = 'contact member'; // @todo: member? always?
|
|
||||||
$aAttrs['class'] = 'u-url p-name';
|
|
||||||
|
|
||||||
return $aAttrs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
76
lib/profileminilistitem.php
Normal file
76
lib/profileminilistitem.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Widget to show a list of profiles
|
||||||
|
*
|
||||||
|
* 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 Public
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @copyright 2008-2009 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); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Widget to show a list of profiles, good for sidebar
|
||||||
|
*
|
||||||
|
* @category Public
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
|
* @link http://status.net/
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ProfileMiniListItem extends ProfileListItem
|
||||||
|
{
|
||||||
|
function show()
|
||||||
|
{
|
||||||
|
$this->out->elementStart('li', 'h-card');
|
||||||
|
if (Event::handle('StartProfileListItemProfileElements', array($this))) {
|
||||||
|
if (Event::handle('StartProfileListItemAvatar', array($this))) {
|
||||||
|
$aAttrs = $this->linkAttributes();
|
||||||
|
$this->out->elementStart('a', $aAttrs);
|
||||||
|
$avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE);
|
||||||
|
$this->out->element('img', array('src' => $avatarUrl,
|
||||||
|
'width' => AVATAR_MINI_SIZE,
|
||||||
|
'height' => AVATAR_MINI_SIZE,
|
||||||
|
'class' => 'avatar u-photo',
|
||||||
|
'alt' => $this->profile->getBestName()));
|
||||||
|
$this->out->elementEnd('a');
|
||||||
|
Event::handle('EndProfileListItemAvatar', array($this));
|
||||||
|
}
|
||||||
|
$this->out->elementEnd('li');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default; overridden for nofollow lists
|
||||||
|
|
||||||
|
function linkAttributes()
|
||||||
|
{
|
||||||
|
$aAttrs = parent::linkAttributes();
|
||||||
|
|
||||||
|
$aAttrs['title'] = $this->profile->getBestName();
|
||||||
|
$aAttrs['rel'] = 'contact member'; // @todo: member? always?
|
||||||
|
$aAttrs['class'] = 'u-url p-name';
|
||||||
|
|
||||||
|
return $aAttrs;
|
||||||
|
}
|
||||||
|
}
|
@ -350,7 +350,7 @@ class Schema
|
|||||||
$res = $this->conn->query("DROP TABLE $name");
|
$res = $this->conn->query("DROP TABLE $name");
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -389,7 +389,7 @@ class Schema
|
|||||||
implode(",", $columnNames).")");
|
implode(",", $columnNames).")");
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -411,7 +411,7 @@ class Schema
|
|||||||
$res = $this->conn->query("ALTER TABLE $table DROP INDEX $name");
|
$res = $this->conn->query("ALTER TABLE $table DROP INDEX $name");
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -436,7 +436,7 @@ class Schema
|
|||||||
$res = $this->conn->query($sql);
|
$res = $this->conn->query($sql);
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -463,7 +463,7 @@ class Schema
|
|||||||
$res = $this->conn->query($sql);
|
$res = $this->conn->query($sql);
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -489,7 +489,7 @@ class Schema
|
|||||||
$res = $this->conn->query($sql);
|
$res = $this->conn->query($sql);
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -535,7 +535,7 @@ class Schema
|
|||||||
$res = $this->conn->query($sql);
|
$res = $this->conn->query($sql);
|
||||||
|
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $ok;
|
return $ok;
|
||||||
@ -1045,7 +1045,7 @@ class Schema
|
|||||||
|
|
||||||
$res = $this->conn->query($sql);
|
$res = $this->conn->query($sql);
|
||||||
if ($_PEAR->isError($res)) {
|
if ($_PEAR->isError($res)) {
|
||||||
throw new Exception($res->getMessage());
|
PEAR_ErrorToPEAR_Exception($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
$out = array();
|
$out = array();
|
||||||
|
@ -98,7 +98,6 @@ class SchemaUpdater
|
|||||||
{
|
{
|
||||||
$checksums = array();
|
$checksums = array();
|
||||||
|
|
||||||
PEAR::pushErrorHandling(PEAR_ERROR_EXCEPTION);
|
|
||||||
try {
|
try {
|
||||||
$sv = new Schema_version();
|
$sv = new Schema_version();
|
||||||
$sv->find();
|
$sv->find();
|
||||||
@ -111,7 +110,6 @@ class SchemaUpdater
|
|||||||
// no dice!
|
// no dice!
|
||||||
common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet.");
|
common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet.");
|
||||||
}
|
}
|
||||||
PEAR::popErrorHandling();
|
|
||||||
|
|
||||||
return $checksums;
|
return $checksums;
|
||||||
}
|
}
|
||||||
@ -124,7 +122,6 @@ class SchemaUpdater
|
|||||||
*/
|
*/
|
||||||
protected function saveChecksum($table, $checksum)
|
protected function saveChecksum($table, $checksum)
|
||||||
{
|
{
|
||||||
PEAR::pushErrorHandling(PEAR_ERROR_EXCEPTION);
|
|
||||||
try {
|
try {
|
||||||
$sv = new Schema_version();
|
$sv = new Schema_version();
|
||||||
$sv->table_name = $table;
|
$sv->table_name = $table;
|
||||||
@ -139,7 +136,6 @@ class SchemaUpdater
|
|||||||
// no dice!
|
// no dice!
|
||||||
common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet.");
|
common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet.");
|
||||||
}
|
}
|
||||||
PEAR::popErrorHandling();
|
|
||||||
$this->checksums[$table] = $checksum;
|
$this->checksums[$table] = $checksum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
43
lib/selftagswidget.php
Normal file
43
lib/selftagswidget.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Tags for a profile
|
||||||
|
*
|
||||||
|
* 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 Action
|
||||||
|
* @package StatusNet
|
||||||
|
* @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 SelftagsWidget extends PeopletagsWidget
|
||||||
|
{
|
||||||
|
function url($tag)
|
||||||
|
{
|
||||||
|
// link to self tag page
|
||||||
|
return common_local_url('selftag', array('tag' => $tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
function label()
|
||||||
|
{
|
||||||
|
// TRANS: Label in self tags widget.
|
||||||
|
return _m('LABEL','Tags');
|
||||||
|
}
|
||||||
|
}
|
@ -896,6 +896,7 @@ function common_replace_urls_callback($text, $callback, $arg = null) {
|
|||||||
')'.
|
')'.
|
||||||
')'.
|
')'.
|
||||||
')'.
|
')'.
|
||||||
|
'|(?:(?:magnet):)'. // URLs without domain name
|
||||||
'|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'. //IPv4
|
'|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'. //IPv4
|
||||||
'|(?:'. //IPv6
|
'|(?:'. //IPv6
|
||||||
'\[?(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:(?:[0-9A-Fa-f]{1,4})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(?::[0-9A-Fa-f]{1,4})))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?::[0-9A-Fa-f]{1,4}){0,1}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?::[0-9A-Fa-f]{1,4}){0,2}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?::[0-9A-Fa-f]{1,4}){0,3}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:)(?::[0-9A-Fa-f]{1,4}){0,4}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?::(?::[0-9A-Fa-f]{1,4}){0,5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))\]?(?<!:)'.
|
'\[?(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:(?:[0-9A-Fa-f]{1,4})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(?::[0-9A-Fa-f]{1,4})))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?::[0-9A-Fa-f]{1,4}){0,1}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?::[0-9A-Fa-f]{1,4}){0,2}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?::[0-9A-Fa-f]{1,4}){0,3}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:)(?::[0-9A-Fa-f]{1,4}){0,4}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?::(?::[0-9A-Fa-f]{1,4}){0,5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))\]?(?<!:)'.
|
||||||
|
@ -27,21 +27,13 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
class InfiniteScrollPlugin extends Plugin
|
class InfiniteScrollPlugin extends Plugin
|
||||||
{
|
{
|
||||||
|
|
||||||
public $on_next_only = false;
|
public $on_next_only = false;
|
||||||
|
|
||||||
function __construct()
|
function onEndShowScripts(Action $action)
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
function onEndShowScripts($action)
|
|
||||||
{
|
{
|
||||||
$action->inlineScript('var infinite_scroll_on_next_only = ' . ($this->on_next_only?'true':'false') . ';');
|
$action->inlineScript('var infinite_scroll_on_next_only = ' . ($this->on_next_only?'true':'false') . ';');
|
||||||
$action->inlineScript('var ajax_loader_url = "' . ($this->path('ajax-loader.gif')) . '";');
|
$action->inlineScript('var ajax_loader_url = "' . ($this->path('ajax-loader.gif')) . '";');
|
||||||
@ -49,7 +41,7 @@ class InfiniteScrollPlugin extends Plugin
|
|||||||
$action->script($this->path('infinitescroll.js'));
|
$action->script($this->path('infinitescroll.js'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onPluginVersion(&$versions)
|
function onPluginVersion(array &$versions)
|
||||||
{
|
{
|
||||||
$versions[] = array('name' => 'InfiniteScroll',
|
$versions[] = array('name' => 'InfiniteScroll',
|
||||||
'version' => GNUSOCIAL_VERSION,
|
'version' => GNUSOCIAL_VERSION,
|
||||||
|
@ -27,9 +27,7 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
define('PAGE_TYPE_PREFS_MOBILEPROFILE',
|
define('PAGE_TYPE_PREFS_MOBILEPROFILE',
|
||||||
'application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html;q=0.9');
|
'application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html;q=0.9');
|
||||||
@ -59,26 +57,34 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onStartShowHTML($action)
|
public function onStartShowHTML(Action $action)
|
||||||
{
|
{
|
||||||
// XXX: This should probably graduate to WAP20Plugin
|
// TODO: A lot of this should probably graduate to WAP20Plugin
|
||||||
|
|
||||||
|
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null;
|
||||||
|
|
||||||
|
$cp = common_accept_to_prefs($httpaccept);
|
||||||
|
$sp = common_accept_to_prefs(PAGE_TYPE_PREFS_MOBILEPROFILE);
|
||||||
|
|
||||||
|
$type = common_negotiate_type($cp, $sp);
|
||||||
|
|
||||||
|
if (!$type) {
|
||||||
|
// TRANS: Client exception thrown when requesting a not supported media type.
|
||||||
|
throw new ClientException(_m('This page is not available in a '.
|
||||||
|
'media type you accept.'), 406);
|
||||||
|
}
|
||||||
|
|
||||||
// If they are on the mobile site, serve them MP
|
// If they are on the mobile site, serve them MP
|
||||||
if ((common_config('site', 'mobileserver').'/'.
|
if ((common_config('site', 'mobileserver').'/'.common_config('site', 'path').'/'
|
||||||
common_config('site', 'path').'/' ==
|
== $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) {
|
||||||
$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) {
|
|
||||||
|
|
||||||
$this->serveMobile = true;
|
$this->serveMobile = true;
|
||||||
} else if (isset($_COOKIE['MobileOverride'])) {
|
} elseif (isset($_COOKIE['MobileOverride'])) {
|
||||||
// Cookie override is controlled by link at bottom.
|
// Cookie override is controlled by link at bottom.
|
||||||
$this->serveMobile = (bool)$_COOKIE['MobileOverride'];
|
$this->serveMobile = (bool)$_COOKIE['MobileOverride'];
|
||||||
} elseif (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
|
} elseif (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
|
||||||
// If they like the WAP 2.0 mimetype, serve them MP
|
// If they like the WAP 2.0 mimetype, serve them MP
|
||||||
// @fixme $type is undefined, making this if case useless and spewing errors.
|
$this->serveMobile = true;
|
||||||
// What's the intent?
|
} elseif (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
|
||||||
//if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
|
|
||||||
// $this->serveMobile = true;
|
|
||||||
//} else {
|
|
||||||
// If they are a mobile device that supports WAP 2.0,
|
// If they are a mobile device that supports WAP 2.0,
|
||||||
// serve them MP
|
// serve them MP
|
||||||
|
|
||||||
@ -166,68 +172,31 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
// If they are okay with MP, and the site has a mobile server,
|
|
||||||
// redirect there
|
|
||||||
if ($this->serveMobile &&
|
|
||||||
common_config('site', 'mobileserver') !== false &&
|
|
||||||
(common_config('site', 'mobileserver') !=
|
|
||||||
common_config('site', 'server'))) {
|
|
||||||
|
|
||||||
// FIXME: Redirect to equivalent page on mobile site instead
|
|
||||||
common_redirect($this->_common_path(''), 302);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->serveMobile) {
|
if (!$this->serveMobile) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @fixme $type is undefined, making this if case useless and spewing errors.
|
// If they are okay with MP, and the site has a mobile server,
|
||||||
// What's the intent?
|
// redirect there
|
||||||
//if (!$type) {
|
if (common_config('site', 'mobileserver') !== false &&
|
||||||
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ?
|
common_config('site', 'mobileserver') != common_config('site', 'server')) {
|
||||||
$_SERVER['HTTP_ACCEPT'] : null;
|
|
||||||
|
|
||||||
$cp = common_accept_to_prefs($httpaccept);
|
// FIXME: Redirect to equivalent page on mobile site instead
|
||||||
$sp = common_accept_to_prefs(PAGE_TYPE_PREFS_MOBILEPROFILE);
|
common_redirect($this->_common_path(''), 302);
|
||||||
|
|
||||||
$type = common_negotiate_type($cp, $sp);
|
|
||||||
|
|
||||||
if (!$type) {
|
|
||||||
// TRANS: Client exception thrown when requesting a not supported media type.
|
|
||||||
throw new ClientException(_m('This page is not available in a '.
|
|
||||||
'media type you accept.'), 406);
|
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
header('Content-Type: '.$type);
|
header('Content-Type: '.$type);
|
||||||
|
|
||||||
if ($this->reallyMobile) {
|
if ($this->reallyMobile) {
|
||||||
|
$action->setDTD('html', '-//WAPFORUM//DTD XHTML Mobile 1.0//EN', $this->DTD);
|
||||||
$action->extraHeaders();
|
|
||||||
if (preg_match("/.*\/.*xml/", $type)) {
|
|
||||||
// Required for XML documents
|
|
||||||
$action->startXML();
|
|
||||||
}
|
}
|
||||||
$action->xw->writeDTD('html',
|
|
||||||
'-//WAPFORUM//DTD XHTML Mobile 1.0//EN',
|
|
||||||
$this->DTD);
|
|
||||||
|
|
||||||
$language = $action->getLanguage();
|
// continue
|
||||||
|
|
||||||
$action->elementStart('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
|
|
||||||
'xml:lang' => $language));
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function setMobileFeatures($useragent)
|
function setMobileFeatures($useragent)
|
||||||
{
|
{
|
||||||
$mobiledeviceInputFileType = array(
|
$mobiledeviceInputFileType = array(
|
||||||
@ -268,7 +237,7 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onStartShowUAStyles($action) {
|
public function onStartShowUAStyles(Action $action) {
|
||||||
if (!$this->serveMobile) {
|
if (!$this->serveMobile) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -276,7 +245,7 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onStartShowHeader($action)
|
public function onStartShowHeader(Action $action)
|
||||||
{
|
{
|
||||||
if (!$this->serveMobile) {
|
if (!$this->serveMobile) {
|
||||||
return true;
|
return true;
|
||||||
@ -290,7 +259,7 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _showLogo($action)
|
protected function _showLogo(Action $action)
|
||||||
{
|
{
|
||||||
$action->elementStart('address');
|
$action->elementStart('address');
|
||||||
if (common_config('singleuser', 'enabled')) {
|
if (common_config('singleuser', 'enabled')) {
|
||||||
@ -316,23 +285,22 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
$action->elementEnd('address');
|
$action->elementEnd('address');
|
||||||
}
|
}
|
||||||
|
|
||||||
function onStartShowAside($action)
|
public function onStartShowAside(Action $action)
|
||||||
{
|
{
|
||||||
if ($this->serveMobile) {
|
if ($this->serveMobile) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onStartShowLocalNavBlock($action)
|
public function onStartShowLocalNavBlock(Action $action)
|
||||||
{
|
{
|
||||||
if ($this->serveMobile) {
|
if ($this->serveMobile) {
|
||||||
// @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n
|
// @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n
|
||||||
$action->element('a', array('href' => '#', 'id' => 'navtoggle'), 'Show Navigation');
|
$action->element('a', array('href' => '#', 'id' => 'navtoggle'), 'Show Navigation');
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onEndShowScripts($action)
|
public function onEndShowScripts(Action $action)
|
||||||
{
|
{
|
||||||
// @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n
|
// @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n
|
||||||
$action->inlineScript('
|
$action->inlineScript('
|
||||||
@ -357,18 +325,12 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
);
|
);
|
||||||
|
|
||||||
if ($this->serveMobile) {
|
if ($this->serveMobile) {
|
||||||
$action->inlineScript('
|
$action->inlineScript('$(function() { $(".checkbox-wrapper").unbind("click"); });');
|
||||||
$(function() {
|
}
|
||||||
$(".checkbox-wrapper").unbind("click");
|
|
||||||
});'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
public function onEndShowInsideFooter(Action $action)
|
||||||
|
|
||||||
|
|
||||||
function onEndShowInsideFooter($action)
|
|
||||||
{
|
{
|
||||||
if ($this->serveMobile) {
|
if ($this->serveMobile) {
|
||||||
// TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page.
|
// TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page.
|
||||||
|
@ -27,14 +27,13 @@
|
|||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
class StrictTransportSecurityPlugin extends Plugin
|
class StrictTransportSecurityPlugin extends Plugin
|
||||||
{
|
{
|
||||||
public $max_age = 15552000;
|
public $max_age = 15552000;
|
||||||
public $includeSubDomains = false;
|
public $includeSubDomains = false;
|
||||||
|
public $preloadToken = false;
|
||||||
|
|
||||||
function __construct()
|
function __construct()
|
||||||
{
|
{
|
||||||
@ -45,7 +44,9 @@ class StrictTransportSecurityPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
$path = common_config('site', 'path');
|
$path = common_config('site', 'path');
|
||||||
if(common_config('site', 'ssl') == 'always' && ($path == '/' || ! $path )) {
|
if(common_config('site', 'ssl') == 'always' && ($path == '/' || ! $path )) {
|
||||||
header('Strict-Transport-Security: max-age=' . $this->max_age . + ($this->includeSubDomains?'; includeSubDomains':''));
|
header('Strict-Transport-Security: max-age=' . $this->max_age
|
||||||
|
. ($this->includeSubDomains ? '; includeSubDomains' : '')
|
||||||
|
. ($this->preloadToken ? '; preload' : ''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,15 +20,16 @@
|
|||||||
|
|
||||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||||
|
|
||||||
$shortoptions = 'i::n::y';
|
$shortoptions = 'i::n::u::y';
|
||||||
$longoptions = array('id=', 'nickname=', 'yes');
|
$longoptions = array('id=', 'nickname=', 'uri=', 'yes');
|
||||||
|
|
||||||
$helptext = <<<END_OF_DELETEUSER_HELP
|
$helptext = <<<END_OF_DELETEUSER_HELP
|
||||||
deleteuser.php [options]
|
deleteprofile.php [options]
|
||||||
deletes a user from the database
|
deletes a profile from the database
|
||||||
|
|
||||||
-i --id ID of the user
|
-i --id ID of the profile
|
||||||
-n --nickname nickname of the user
|
-n --nickname nickname of a local user
|
||||||
|
-u --uri OStatus profile URI (only remote users, requires OStatus plugin)
|
||||||
-y --yes do not wait for confirmation
|
-y --yes do not wait for confirmation
|
||||||
|
|
||||||
END_OF_DELETEUSER_HELP;
|
END_OF_DELETEUSER_HELP;
|
||||||
@ -37,25 +38,34 @@ require_once INSTALLDIR.'/scripts/commandline.inc';
|
|||||||
|
|
||||||
if (have_option('i', 'id')) {
|
if (have_option('i', 'id')) {
|
||||||
$id = get_option_value('i', 'id');
|
$id = get_option_value('i', 'id');
|
||||||
$user = User::getKV('id', $id);
|
$profile = Profile::getKV('id', $id);
|
||||||
if (empty($user)) {
|
if (!$profile instanceof Profile) {
|
||||||
print "Can't find user with ID $id\n";
|
print "Can't find profile with ID $id\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
} else if (have_option('n', 'nickname')) {
|
} else if (have_option('n', 'nickname')) {
|
||||||
$nickname = get_option_value('n', 'nickname');
|
$nickname = get_option_value('n', 'nickname');
|
||||||
$user = User::getKV('nickname', $nickname);
|
$user = User::getKV('nickname', $nickname);
|
||||||
if (empty($user)) {
|
if (!$user instanceof User) {
|
||||||
print "Can't find user with nickname '$nickname'\n";
|
print "Can't find user with nickname '$nickname'\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
$profile = $user->getProfile();
|
||||||
|
} else if (have_option('u', 'uri')) {
|
||||||
|
$uri = get_option_value('u', 'uri');
|
||||||
|
$oprofile = Ostatus_profile::getKV('uri', $uri);
|
||||||
|
if (!$oprofile instanceof Ostatus_profile) {
|
||||||
|
print "Can't find profile with URI '$uri'\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$profile = $oprofile->localProfile();
|
||||||
} else {
|
} else {
|
||||||
print "You must provide either an ID or a nickname.\n";
|
print "You must provide either an ID, a URI or a nickname.\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!have_option('y', 'yes')) {
|
if (!have_option('y', 'yes')) {
|
||||||
print "About to PERMANENTLY delete user '{$user->nickname}' ({$user->id}). Are you sure? [y/N] ";
|
print "About to PERMANENTLY delete profile '".$profile->getNickname()."' ({$profile->id}). Are you sure? [y/N] ";
|
||||||
$response = fgets(STDIN);
|
$response = fgets(STDIN);
|
||||||
if (strtolower(trim($response)) != 'y') {
|
if (strtolower(trim($response)) != 'y') {
|
||||||
print "Aborting.\n";
|
print "Aborting.\n";
|
||||||
@ -64,5 +74,5 @@ if (!have_option('y', 'yes')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
print "Deleting...";
|
print "Deleting...";
|
||||||
$user->delete();
|
$profile->delete();
|
||||||
print "DONE.\n";
|
print "DONE.\n";
|
86
scripts/remove_duplicate_file_urls.php
Executable file
86
scripts/remove_duplicate_file_urls.php
Executable file
@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* StatusNet - a distributed open-source microblogging tool
|
||||||
|
* Copyright (C) 2008, 2009, StatusNet, Inc.
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||||
|
|
||||||
|
$shortoptions = 'y';
|
||||||
|
$longoptions = array('yes');
|
||||||
|
|
||||||
|
$helptext = <<<END_OF_HELP
|
||||||
|
remove_duplicate_file_urls.php [options]
|
||||||
|
Remove duplicate URL entries in the file and file_redirection tables because they for some reason were not unique.
|
||||||
|
|
||||||
|
-y --yes do not wait for confirmation
|
||||||
|
|
||||||
|
END_OF_HELP;
|
||||||
|
|
||||||
|
require_once INSTALLDIR.'/scripts/commandline.inc';
|
||||||
|
|
||||||
|
if (!have_option('y', 'yes')) {
|
||||||
|
print "About to remove duplicate URL entries in file and file_redirection tables. Are you sure? [y/N] ";
|
||||||
|
$response = fgets(STDIN);
|
||||||
|
if (strtolower(trim($response)) != 'y') {
|
||||||
|
print "Aborting.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = new File();
|
||||||
|
$file->query('SELECT id, url, COUNT(*) AS c FROM file GROUP BY url HAVING c > 1');
|
||||||
|
print "\nFound {$file->N} URLs with duplicate entries in file table";
|
||||||
|
while ($file->fetch()) {
|
||||||
|
// We've got a URL that is duplicated in the file table
|
||||||
|
$dupfile = new File();
|
||||||
|
$dupfile->url = $file->url;
|
||||||
|
if ($dupfile->find(true)) {
|
||||||
|
print "\nDeleting duplicate entries in file table for URL: {$file->url} [";
|
||||||
|
// Leave one of the URLs in the database by using ->find(true)
|
||||||
|
// and only deleting starting with this fetch.
|
||||||
|
while($dupfile->fetch()) {
|
||||||
|
print ".";
|
||||||
|
$dupfile->delete();
|
||||||
|
}
|
||||||
|
print "]\n";
|
||||||
|
} else {
|
||||||
|
print "\nWarning! URL suddenly disappeared from database: {$file->url}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = new File_redirection();
|
||||||
|
$file->query('SELECT file_id, url, COUNT(*) AS c FROM file_redirection GROUP BY url HAVING c > 1');
|
||||||
|
print "\nFound {$file->N} URLs with duplicate entries in file_redirection table";
|
||||||
|
while ($file->fetch()) {
|
||||||
|
// We've got a URL that is duplicated in the file_redirection table
|
||||||
|
$dupfile = new File_redirection();
|
||||||
|
$dupfile->url = $file->url;
|
||||||
|
if ($dupfile->find(true)) {
|
||||||
|
print "\nDeleting duplicate entries in file table for URL: {$file->url} [";
|
||||||
|
// Leave one of the URLs in the database by using ->find(true)
|
||||||
|
// and only deleting starting with this fetch.
|
||||||
|
while($dupfile->fetch()) {
|
||||||
|
print ".";
|
||||||
|
$dupfile->delete();
|
||||||
|
}
|
||||||
|
print "]\n";
|
||||||
|
} else {
|
||||||
|
print "\nWarning! URL suddenly disappeared from database: {$file->url}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\nDONE.\n";
|
@ -520,7 +520,7 @@ function setFilehashOnLocalFiles()
|
|||||||
$file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath());
|
$file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath());
|
||||||
$file->update($orig);
|
$file->update($orig);
|
||||||
} catch (FileNotFoundException $e) {
|
} catch (FileNotFoundException $e) {
|
||||||
echo "\n WARNING: file ID {$file->id} does not exist on path '{$e->path}'. Clean up the file table?";
|
echo "\n WARNING: file ID {$file->id} does not exist on path '{$e->path}'. If there is no file system error, run: php scripts/clean_file_table.php";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user