summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README13
-rw-r--r--actions/disfavor.php2
-rw-r--r--actions/favor.php2
-rw-r--r--actions/newnotice.php2
-rw-r--r--actions/nudge.php2
-rw-r--r--actions/showgroup.php46
-rw-r--r--actions/subscribe.php2
-rw-r--r--actions/tagother.php2
-rw-r--r--actions/unsubscribe.php2
-rwxr-xr-xclasses/User_group.php13
-rw-r--r--lib/action.php8
-rw-r--r--lib/clienterroraction.php2
-rw-r--r--lib/common.php32
-rw-r--r--lib/error.php1
-rw-r--r--lib/profileminilist.php4
-rw-r--r--lib/servererroraction.php2
-rw-r--r--lib/util.php10
-rwxr-xr-xscripts/update_facebook.php6
18 files changed, 116 insertions, 35 deletions
diff --git a/README b/README
index 334e95b89..a60017063 100644
--- a/README
+++ b/README
@@ -35,7 +35,7 @@ Identi.ca (http://identi.ca/). It is shared with you in hope that you
too make an Open Software Service available to your users. To learn
more, please see the Open Software Service Definition 1.0:
- http://www.openknowledge.org/ossd
+ http://www.opendefinition.org/ossd
License
=======
@@ -618,7 +618,7 @@ subdirectory to add a new language to your system. You'll need to
compile the ".po" files into ".mo" files, however.
Contributions of translation information to Laconica are very easy:
-you can use the Web interface at http://laconi.ca/entrans/ to add one
+you can use the Web interface at http://laconi.ca/pootle/ to add one
or a few or lots of new translations -- or even new languages. You can
also download more up-to-date .po files there, if you so desire.
@@ -745,6 +745,15 @@ edit any other file in the directory, like lib/common.php (where most
of the defaults are defined), you will lose your configuration options
in any upgrade, and you will wish that you had been more careful.
+Starting with version 0.7.1, you can put config files in the
+/etc/laconica/ directory on your server, if it exists. Config files
+will be included in this order:
+
+* /etc/laconica/laconica.php - server-wide config
+* /etc/laconica/<servername>.php - for a virtual host
+* /etc/laconica/<servername>_<pathname>.php - for a path
+* INSTALLDIR/config.php - for a particular implementation
+
Almost all configuration options are made through a two-dimensional
associative array, cleverly named $config. A typical configuration
line will be:
diff --git a/actions/disfavor.php b/actions/disfavor.php
index 09b3bf18d..90bab3cca 100644
--- a/actions/disfavor.php
+++ b/actions/disfavor.php
@@ -89,7 +89,7 @@ class DisfavorAction extends Action
}
$user->blowFavesCache();
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Add to favorites'));
$this->elementEnd('head');
diff --git a/actions/favor.php b/actions/favor.php
index 8ecde4b11..3940df688 100644
--- a/actions/favor.php
+++ b/actions/favor.php
@@ -89,7 +89,7 @@ class FavorAction extends Action
$this->notify($notice, $user);
$user->blowFavesCache();
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Disfavor favorite'));
$this->elementEnd('head');
diff --git a/actions/newnotice.php b/actions/newnotice.php
index 572adbb23..5142cb5ff 100644
--- a/actions/newnotice.php
+++ b/actions/newnotice.php
@@ -161,7 +161,7 @@ class NewnoticeAction extends Action
common_broadcast_notice($notice);
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Notice posted'));
$this->elementEnd('head');
diff --git a/actions/nudge.php b/actions/nudge.php
index ca7947f5a..bc3d48478 100644
--- a/actions/nudge.php
+++ b/actions/nudge.php
@@ -89,7 +89,7 @@ class NudgeAction extends Action
$this->notify($user, $other);
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Nudge sent'));
$this->elementEnd('head');
diff --git a/actions/showgroup.php b/actions/showgroup.php
index c29b7d426..468990e7b 100644
--- a/actions/showgroup.php
+++ b/actions/showgroup.php
@@ -333,6 +333,7 @@ class ShowgroupAction extends Action
function showSections()
{
$this->showMembers();
+ $this->showStatistics();
$cloud = new GroupTagCloudSection($this, $this->group);
$cloud->show();
}
@@ -356,12 +357,10 @@ class ShowgroupAction extends Action
$this->element('h2', null, _('Members'));
- if ($member) {
- $pml = new ProfileMiniList($member, null, $this);
- $cnt = $pml->show();
- if ($cnt == 0) {
- $this->element('p', null, _('(None)'));
- }
+ $pml = new ProfileMiniList($member, null, $this);
+ $cnt = $pml->show();
+ if ($cnt == 0) {
+ $this->element('p', null, _('(None)'));
}
if ($cnt == MEMBERS_PER_SECTION) {
@@ -373,6 +372,41 @@ class ShowgroupAction extends Action
$this->elementEnd('div');
}
+ /**
+ * Show some statistics
+ *
+ * @return void
+ */
+
+ function showStatistics()
+ {
+ // XXX: WORM cache this
+ $members = $this->group->getMembers();
+ $members_count = 0;
+ /** $member->count() doesn't work. */
+ while ($members->fetch()) {
+ $members_count++;
+ }
+
+ $this->elementStart('div', array('id' => 'entity_statistics',
+ 'class' => 'section'));
+
+ $this->element('h2', null, _('Statistics'));
+
+ $this->elementStart('dl', 'entity_created');
+ $this->element('dt', null, _('Created'));
+ $this->element('dd', null, date('j M Y',
+ strtotime($this->group->created)));
+ $this->elementEnd('dl');
+
+ $this->elementStart('dl', 'entity_members');
+ $this->element('dt', null, _('Members'));
+ $this->element('dd', null, (is_int($members_count)) ? $members_count : '0');
+ $this->elementEnd('dl');
+
+ $this->elementEnd('div');
+ }
+
function showAnonymousMessage()
{
$m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
diff --git a/actions/subscribe.php b/actions/subscribe.php
index 171332734..f761992de 100644
--- a/actions/subscribe.php
+++ b/actions/subscribe.php
@@ -64,7 +64,7 @@ class SubscribeAction extends Action
}
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Subscribed'));
$this->elementEnd('head');
diff --git a/actions/tagother.php b/actions/tagother.php
index 9b06cb43e..cbace5b6b 100644
--- a/actions/tagother.php
+++ b/actions/tagother.php
@@ -203,7 +203,7 @@ class TagotherAction extends Action
$action = $user->isSubscribed($this->profile) ? 'subscriptions' : 'subscribers';
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml');
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Tags'));
$this->elementEnd('head');
diff --git a/actions/unsubscribe.php b/actions/unsubscribe.php
index f9dd6f821..b1e2b6425 100644
--- a/actions/unsubscribe.php
+++ b/actions/unsubscribe.php
@@ -66,7 +66,7 @@ class UnsubscribeAction extends Action
}
if ($this->boolean('ajax')) {
- $this->startHTML('text/xml;charset=utf-8', true);
+ $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Unsubscribed'));
$this->elementEnd('head');
diff --git a/classes/User_group.php b/classes/User_group.php
index 5b5b102c7..522dd8143 100755
--- a/classes/User_group.php
+++ b/classes/User_group.php
@@ -74,16 +74,17 @@ class User_group extends Memcached_DataObject
'WHERE group_member.group_id = %d ' .
'ORDER BY group_member.created DESC ';
- if (common_config('db','type') == 'pgsql') {
- $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
- } else {
- $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ if ($limit != null) {
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
}
$members = new Profile();
- $cnt = $members->query(sprintf($qry, $this->id));
-
+ $members->query(sprintf($qry, $this->id));
return $members;
}
diff --git a/lib/action.php b/lib/action.php
index 15a44ad1b..f9b068878 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -328,8 +328,14 @@ class Action extends HTMLOutputter // lawsuit
if ($user) {
$this->menuItem(common_local_url('profilesettings'),
_('Account'), _('Change your email, avatar, password, profile'), false, 'nav_account');
- $this->menuItem(common_local_url('imsettings'),
+
+ if (common_config('xmpp', 'enabled')) {
+ $this->menuItem(common_local_url('imsettings'),
_('Connect'), _('Connect to IM, SMS, Twitter'), false, 'nav_connect');
+ } else {
+ $this->menuItem(common_local_url('smssettings'),
+ _('Connect'), _('Connect to SMS, Twitter'), false, 'nav_connect');
+ }
$this->menuItem(common_local_url('logout'),
_('Logout'), _('Logout from the site'), false, 'nav_logout');
} else {
diff --git a/lib/clienterroraction.php b/lib/clienterroraction.php
index ef6fd51df..5019dc06d 100644
--- a/lib/clienterroraction.php
+++ b/lib/clienterroraction.php
@@ -70,7 +70,7 @@ class ClientErrorAction extends ErrorAction
417 => 'Expectation Failed');
$this->default = 400;
}
-
+
// XXX: Should these error actions even be invokable via URI?
function handle($args)
diff --git a/lib/common.php b/lib/common.php
index a2f9b9bfe..825ba0ff7 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -50,14 +50,23 @@ require_once('DB/DataObject/Cast.php'); # for dates
require_once(INSTALLDIR.'/lib/language.php');
+// try to figure out where we are
+
+$_server = array_key_exists('SERVER_NAME', $_SERVER) ?
+ strtolower($_SERVER['SERVER_NAME']) :
+ null;
+$_path = array_key_exists('SCRIPT_NAME', $_SERVER) ?
+ substr($_SERVER['SCRIPT_NAME'], 1, strrpos($_SERVER['SCRIPT_NAME'], '/') - 1) :
+ null;
+
// default configuration, overwritten in config.php
$config =
array('site' =>
array('name' => 'Just another Laconica microblog',
- 'server' => 'localhost',
+ 'server' => $_server,
'theme' => 'default',
- 'path' => '/',
+ 'path' => $_path,
'logfile' => null,
'fancy' => false,
'locale_path' => INSTALLDIR.'/locale',
@@ -150,7 +159,24 @@ if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('UTC');
}
-require_once(INSTALLDIR.'/config.php');
+// From most general to most specific:
+// server-wide, then vhost-wide, then for a path,
+// finally for a dir (usually only need one of the last two).
+
+$_config_files = array('/etc/laconica/laconica.php',
+ '/etc/laconica/'.$_server.'.php');
+
+if (strlen($_path) > 0) {
+ $_config_files[] = '/etc/laconica/'.$_server.'_'.$_path.'.php';
+}
+
+$_config_files[] = INSTALLDIR.'/config.php';
+
+foreach ($_config_files as $_config_file) {
+ if (file_exists($_config_file)) {
+ include_once($_config_file);
+ }
+}
require_once('Validate.php');
require_once('markdown.php');
diff --git a/lib/error.php b/lib/error.php
index 9842053d8..03065bc70 100644
--- a/lib/error.php
+++ b/lib/error.php
@@ -130,6 +130,7 @@ class ErrorAction extends Action
{
$this->elementStart('div', array('id' => 'header'));
$this->showLogo();
+ $this->showPrimaryNav();
$this->elementEnd('div');
}
diff --git a/lib/profileminilist.php b/lib/profileminilist.php
index 56b768419..81cd7aed5 100644
--- a/lib/profileminilist.php
+++ b/lib/profileminilist.php
@@ -69,9 +69,7 @@ class ProfileMiniList extends ProfileList
function showProfile()
{
$this->out->elementStart('li', 'vcard');
- $this->out->elementStart('a', array('title' => ($this->profile->fullname) ?
- $this->profile->fullname :
- $this->profile->nickname,
+ $this->out->elementStart('a', array('title' => $this->profile->getBestName(),
'href' => $this->profile->profileurl,
'rel' => 'contact member',
'class' => 'url'));
diff --git a/lib/servererroraction.php b/lib/servererroraction.php
index a39886591..80a3fdd7b 100644
--- a/lib/servererroraction.php
+++ b/lib/servererroraction.php
@@ -67,7 +67,7 @@ class ServerErrorAction extends ErrorAction
$this->default = 500;
}
-
+
// XXX: Should these error actions even be invokable via URI?
function handle($args)
diff --git a/lib/util.php b/lib/util.php
index 3690f0ad5..07e124811 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -370,8 +370,6 @@ function common_canonical_email($email)
return $email;
}
-define('URL_REGEX', '^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))');
-
function common_render_content($text, $notice)
{
$r = common_render_text($text);
@@ -388,7 +386,8 @@ function common_render_text($text)
$r = htmlspecialchars($text);
$r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
- $r = preg_replace_callback('@https?://[^\]>\s]+@', 'common_render_uri_thingy', $r);
+ $r = preg_replace_callback('@(ftp|http|https|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|xmpp|irc)://[^\]>\s]+@', 'common_render_uri_thingy', $r);
+ $r = preg_replace_callback('@(mailto|aim|tel):[^\]>\s]+@', 'common_render_uri_thingy', $r); // Pseudo-protocols don't require '//' after ':'.
$r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
// XXX: machine tags
return $r;
@@ -1391,7 +1390,7 @@ function common_negotiate_type($cprefs, $sprefs)
}
$bestq = 0;
- $besttype = "text/html";
+ $besttype = 'text/html';
foreach(array_keys($combine) as $type) {
if($combine[$type] > $bestq) {
@@ -1400,6 +1399,9 @@ function common_negotiate_type($cprefs, $sprefs)
}
}
+ if ('text/html' === $besttype) {
+ return "text/html; charset=utf-8";
+ }
return $besttype;
}
diff --git a/scripts/update_facebook.php b/scripts/update_facebook.php
index 485b2a342..141bcfe0c 100755
--- a/scripts/update_facebook.php
+++ b/scripts/update_facebook.php
@@ -86,9 +86,13 @@ if ($cnt > 0) {
": Found $cnt new notices to send to Facebook since last run at " .
date('Y-m-d H:i:s', $since) . "\n";
- updateLastUpdated($current_time);
}
+#Save the last updated time. It needs to do this even if there were no
+#changes made, otherwise it will never create it and thus never send
+#any updates at all.
+updateLastUpdated($current_time);
+
exit(0);