diff options
-rw-r--r-- | README | 13 | ||||
-rw-r--r-- | actions/disfavor.php | 2 | ||||
-rw-r--r-- | actions/favor.php | 2 | ||||
-rw-r--r-- | actions/newnotice.php | 2 | ||||
-rw-r--r-- | actions/nudge.php | 2 | ||||
-rw-r--r-- | actions/showgroup.php | 46 | ||||
-rw-r--r-- | actions/subscribe.php | 2 | ||||
-rw-r--r-- | actions/tagother.php | 2 | ||||
-rw-r--r-- | actions/unsubscribe.php | 2 | ||||
-rwxr-xr-x | classes/User_group.php | 13 | ||||
-rw-r--r-- | lib/action.php | 8 | ||||
-rw-r--r-- | lib/clienterroraction.php | 2 | ||||
-rw-r--r-- | lib/common.php | 32 | ||||
-rw-r--r-- | lib/error.php | 1 | ||||
-rw-r--r-- | lib/profileminilist.php | 4 | ||||
-rw-r--r-- | lib/servererroraction.php | 2 | ||||
-rw-r--r-- | lib/util.php | 10 | ||||
-rwxr-xr-x | scripts/update_facebook.php | 6 |
18 files changed, 116 insertions, 35 deletions
@@ -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); |