summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/action.php1
-rw-r--r--lib/cache.php182
-rw-r--r--lib/columndef.php1
-rw-r--r--lib/common.php12
-rw-r--r--lib/default.php10
-rw-r--r--lib/language.php16
-rw-r--r--lib/mail.php4
-rw-r--r--lib/noticeform.php20
-rw-r--r--lib/repeatform.php4
-rw-r--r--lib/router.php3
-rw-r--r--lib/schema.php4
-rw-r--r--lib/util.php32
12 files changed, 247 insertions, 42 deletions
diff --git a/lib/action.php b/lib/action.php
index dac0e2583..35df03566 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -252,6 +252,7 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartShowJQueryScripts', array($this))) {
$this->script('js/jquery.min.js');
$this->script('js/jquery.form.js');
+ $this->script('js/jquery.cookie.js');
$this->script('js/jquery.joverlay.min.js');
Event::handle('EndShowJQueryScripts', array($this));
}
diff --git a/lib/cache.php b/lib/cache.php
new file mode 100644
index 000000000..bac3499e5
--- /dev/null
+++ b/lib/cache.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Cache interface plus default in-memory cache implementation
+ *
+ * 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 Cache
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 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/
+ */
+
+/**
+ * Interface for caching
+ *
+ * An abstract interface for caching. Because we originally used the
+ * Memcache plugin directly, the interface uses a small subset of the
+ * Memcache interface.
+ *
+ * @category Cache
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class Cache
+{
+ var $_items = array();
+ static $_inst = null;
+
+ /**
+ * Singleton constructor
+ *
+ * Use this to get the singleton instance of Cache.
+ *
+ * @return Cache cache object
+ */
+
+ static function instance()
+ {
+ if (is_null(self::$_inst)) {
+ self::$_inst = new Cache();
+ }
+
+ return self::$_inst;
+ }
+
+ /**
+ * Create a cache key from input text
+ *
+ * Builds a cache key from input text. Helps to namespace
+ * the cache area (if shared with other applications or sites)
+ * and prevent conflicts.
+ *
+ * @param string $extra the real part of the key
+ *
+ * @return string full key
+ */
+
+ static function key($extra)
+ {
+ $base_key = common_config('cache', 'base');
+
+ if (empty($base_key)) {
+ $base_key = common_keyize(common_config('site', 'name'));
+ }
+
+ return 'statusnet:' . $base_key . ':' . $extra;
+ }
+
+ /**
+ * Make a string suitable for use as a key
+ *
+ * Useful for turning primary keys of tables into cache keys.
+ *
+ * @param string $str string to turn into a key
+ *
+ * @return string keyized string
+ */
+
+ static function keyize($str)
+ {
+ $str = strtolower($str);
+ $str = preg_replace('/\s/', '_', $str);
+ return $str;
+ }
+
+ /**
+ * Get a value associated with a key
+ *
+ * The value should have been set previously.
+ *
+ * @param string $key Lookup key
+ *
+ * @return string retrieved value or null if unfound
+ */
+
+ function get($key)
+ {
+ $value = false;
+
+ if (Event::handle('StartCacheGet', array(&$key, &$value))) {
+ if (array_key_exists($key, $this->_items)) {
+ $value = $this->_items[$key];
+ }
+ Event::handle('EndCacheGet', array($key, &$value));
+ }
+
+ return $value;
+ }
+
+ /**
+ * Set the value associated with a key
+ *
+ * @param string $key The key to use for lookups
+ * @param string $value The value to store
+ * @param integer $flag Flags to use, mostly ignored
+ * @param integer $expiry Expiry value, mostly ignored
+ *
+ * @return boolean success flag
+ */
+
+ function set($key, $value, $flag=null, $expiry=null)
+ {
+ $success = false;
+
+ if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag,
+ &$expiry, &$success))) {
+
+ $this->_items[$key] = $value;
+
+ $success = true;
+
+ Event::handle('EndCacheSet', array($key, $value, $flag,
+ $expiry));
+ }
+
+ return $success;
+ }
+
+ /**
+ * Delete the value associated with a key
+ *
+ * @param string $key Key to delete
+ *
+ * @return boolean success flag
+ */
+
+ function delete($key)
+ {
+ $success = false;
+
+ if (Event::handle('StartCacheDelete', array(&$key, &$success))) {
+ if (array_key_exists($key, $this->_items[$key])) {
+ unset($this->_items[$key]);
+ }
+ $success = true;
+ Event::handle('EndCacheDelete', array($key));
+ }
+
+ return $success;
+ }
+}
diff --git a/lib/columndef.php b/lib/columndef.php
index 1bae6b33b..ac2fcd23e 100644
--- a/lib/columndef.php
+++ b/lib/columndef.php
@@ -74,6 +74,7 @@ class ColumnDef
* @param string $key type of key
* @param value $default default value
* @param value $extra unused
+ * @param boolean $auto_increment
*/
function __construct($name=null, $type=null, $size=null,
diff --git a/lib/common.php b/lib/common.php
index 7fa1910af..b0e5c4390 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -210,6 +210,18 @@ if ($_db_name != 'statusnet' && !array_key_exists('ini_'.$_db_name, $config['db'
$config['db']['ini_'.$_db_name] = INSTALLDIR.'/classes/statusnet.ini';
}
+// Backwards compatibility
+
+if (array_key_exists('memcached', $config)) {
+ if ($config['memcached']['enabled']) {
+ addPlugin('Memcache', array('servers' => $config['memcached']['server']));
+ }
+
+ if (!empty($config['memcached']['base'])) {
+ $config['cache']['base'] = $config['memcached']['base'];
+ }
+}
+
function __autoload($cls)
{
if (file_exists(INSTALLDIR.'/classes/' . $cls . '.php')) {
diff --git a/lib/default.php b/lib/default.php
index 42d4623b1..eea11eb2b 100644
--- a/lib/default.php
+++ b/lib/default.php
@@ -147,11 +147,8 @@ $default =
array('enabled' => true,
'consumer_key' => null,
'consumer_secret' => null),
- 'memcached' =>
- array('enabled' => false,
- 'server' => 'localhost',
- 'base' => null,
- 'port' => 11211),
+ 'cache' =>
+ array('base' => null),
'ping' =>
array('notify' => array()),
'inboxes' =>
@@ -226,7 +223,8 @@ $default =
'message' =>
array('contentlimit' => null),
'location' =>
- array('namespace' => 1), // 1 = geonames, 2 = Yahoo Where on Earth
+ array('share' => 'user', // whether to share location; 'always', 'user', 'never'
+ 'sharedefault' => true),
'omb' =>
array('timeout' => 5), // HTTP request timeout in seconds when contacting remote hosts for OMB updates
'logincommand' =>
diff --git a/lib/language.php b/lib/language.php
index d8f529201..f5ee7fac5 100644
--- a/lib/language.php
+++ b/lib/language.php
@@ -32,6 +32,21 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
+// Locale category constants are usually predefined, but may not be
+// on some systems such as Win32.
+$LC_CATEGORIES = array('LC_CTYPE',
+ 'LC_NUMERIC',
+ 'LC_TIME',
+ 'LC_COLLATE',
+ 'LC_MONETARY',
+ 'LC_MESSAGES',
+ 'LC_ALL');
+foreach ($LC_CATEGORIES as $key => $name) {
+ if (!defined($name)) {
+ define($name, $key);
+ }
+}
+
if (!function_exists('gettext')) {
require_once("php-gettext/gettext.inc");
}
@@ -283,6 +298,7 @@ function get_all_languages() {
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
'es' => array('q' => 1, 'lang' => 'es', 'name' => 'Spanish', 'direction' => 'ltr'),
'fi' => array('q' => 1, 'lang' => 'fi', 'name' => 'Finnish', 'direction' => 'ltr'),
+ 'fa' => array('q' => 1, 'lang' => 'fa', 'name' => 'Persian', 'direction' => 'rtl'),
'fr-fr' => array('q' => 1, 'lang' => 'fr', 'name' => 'French', 'direction' => 'ltr'),
'ga' => array('q' => 0.5, 'lang' => 'ga', 'name' => 'Galician', 'direction' => 'ltr'),
'he' => array('q' => 0.5, 'lang' => 'he', 'name' => 'Hebrew', 'direction' => 'rtl'),
diff --git a/lib/mail.php b/lib/mail.php
index dffac3262..472a88e06 100644
--- a/lib/mail.php
+++ b/lib/mail.php
@@ -599,6 +599,10 @@ function mail_notify_attn($user, $notice)
$sender = $notice->getProfile();
+ if ($sender->id == $user->id) {
+ return;
+ }
+
if (!$sender->hasRight(Right::EMAILONREPLY)) {
return;
}
diff --git a/lib/noticeform.php b/lib/noticeform.php
index 593a1e932..99865645a 100644
--- a/lib/noticeform.php
+++ b/lib/noticeform.php
@@ -110,6 +110,8 @@ class NoticeForm extends Form
$this->user = common_current_user();
}
+ $this->profile = $this->user->getProfile();
+
if (common_config('attachments', 'uploads')) {
$this->enctype = 'multipart/form-data';
}
@@ -198,12 +200,20 @@ class NoticeForm extends Form
$this->out->hidden('notice_return-to', $this->action, 'returnto');
}
$this->out->hidden('notice_in-reply-to', $this->inreplyto, 'inreplyto');
- $this->out->hidden('notice_data-lat', empty($this->lat) ? null : $this->lat, 'lat');
- $this->out->hidden('notice_data-lon', empty($this->lon) ? null : $this->lon, 'lon');
- $this->out->hidden('notice_data-location_id', empty($this->location_id) ? null : $this->location_id, 'location_id');
- $this->out->hidden('notice_data-location_ns', empty($this->location_ns) ? null : $this->location_ns, 'location_ns');
- Event::handle('StartShowNoticeFormData', array($this));
+ if ($this->user->shareLocation()) {
+ $this->out->hidden('notice_data-lat', empty($this->lat) ? (empty($this->profile->lat) ? null : $this->profile->lat) : $this->lat, 'lat');
+ $this->out->hidden('notice_data-lon', empty($this->lon) ? (empty($this->profile->lon) ? null : $this->profile->lon) : $this->lon, 'lon');
+ $this->out->hidden('notice_data-location_id', empty($this->location_id) ? (empty($this->profile->location_id) ? null : $this->profile->location_id) : $this->location_id, 'location_id');
+ $this->out->hidden('notice_data-location_ns', empty($this->location_ns) ? (empty($this->profile->location_ns) ? null : $this->profile->location_ns) : $this->location_ns, 'location_ns');
+
+ $this->out->elementStart('div', array('id' => 'notice_data-location_wrap',
+ 'title' => common_local_url('geocode')));
+ $this->out->checkbox('notice_data-geo', _('Share your location'), true);
+ $this->out->elementEnd('div');
+ }
+
+ Event::handle('EndShowNoticeFormData', array($this));
}
}
diff --git a/lib/repeatform.php b/lib/repeatform.php
index 50e5d6dbe..4f1c8aa32 100644
--- a/lib/repeatform.php
+++ b/lib/repeatform.php
@@ -104,7 +104,7 @@ class RepeatForm extends Form
*/
function formLegend()
{
- $this->out->element('legend', null, _('Repeat this notice'));
+ $this->out->element('legend', null, _('Repeat this notice?'));
}
/**
@@ -129,7 +129,7 @@ class RepeatForm extends Form
function formActions()
{
$this->out->submit('repeat-submit-' . $this->notice->id,
- _('Repeat'), 'submit', null, _('Repeat this notice'));
+ _('Yes'), 'submit', null, _('Repeat this notice'));
}
/**
diff --git a/lib/router.php b/lib/router.php
index 474e05996..7ec962460 100644
--- a/lib/router.php
+++ b/lib/router.php
@@ -100,7 +100,8 @@ class Router
'sandbox', 'unsandbox',
'silence', 'unsilence',
'repeat',
- 'deleteuser');
+ 'deleteuser',
+ 'geocode');
foreach ($main as $a) {
$m->connect('main/'.$a, array('action' => $a));
diff --git a/lib/schema.php b/lib/schema.php
index a8ba91b87..6fe442d56 100644
--- a/lib/schema.php
+++ b/lib/schema.php
@@ -523,6 +523,10 @@ class Schema
} else {
$sql .= ($cd->nullable) ? "null " : "not null ";
}
+
+ if (!empty($cd->auto_increment)) {
+ $sql .= " auto_increment ";
+ }
return $sql;
}
diff --git a/lib/util.php b/lib/util.php
index fdcc87677..50bd0e2ac 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -62,7 +62,7 @@ function common_init_language()
// gettext will still select the right language.
$language = common_language();
$locale_set = common_init_locale($language);
-
+
setlocale(LC_CTYPE, 'C');
// So we do not have to make people install the gettext locales
$path = common_config('site','locale_path');
@@ -1404,41 +1404,17 @@ function common_session_token()
function common_cache_key($extra)
{
- $base_key = common_config('memcached', 'base');
-
- if (empty($base_key)) {
- $base_key = common_keyize(common_config('site', 'name'));
- }
-
- return 'statusnet:' . $base_key . ':' . $extra;
+ return Cache::key($extra);
}
function common_keyize($str)
{
- $str = strtolower($str);
- $str = preg_replace('/\s/', '_', $str);
- return $str;
+ return Cache::keyize($str);
}
function common_memcache()
{
- static $cache = null;
- if (!common_config('memcached', 'enabled')) {
- return null;
- } else {
- if (!$cache) {
- $cache = new Memcache();
- $servers = common_config('memcached', 'server');
- if (is_array($servers)) {
- foreach($servers as $server) {
- $cache->addServer($server);
- }
- } else {
- $cache->addServer($servers);
- }
- }
- return $cache;
- }
+ return Cache::instance();
}
function common_license_terms($uri)