summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/File.php7
-rw-r--r--classes/File_oembed.php8
-rw-r--r--classes/Login_token.php27
-rw-r--r--classes/Memcached_DataObject.php169
-rw-r--r--classes/Status_network.php25
5 files changed, 125 insertions, 111 deletions
diff --git a/classes/File.php b/classes/File.php
index 6173f31d6..c527c4ffe 100644
--- a/classes/File.php
+++ b/classes/File.php
@@ -80,7 +80,14 @@ class File extends Memcached_DataObject
if (isset($redir_data['type'])
&& (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21)))
&& ($oembed_data = File_oembed::_getOembed($given_url))) {
+
+ $fo = File_oembed::staticGet('file_id', $file_id);
+
+ if (empty($fo)) {
File_oembed::saveNew($oembed_data, $file_id);
+ } else {
+ common_log(LOG_WARNING, "Strangely, a File_oembed object exists for new file $file_id", __FILE__);
+ }
}
return $x;
}
diff --git a/classes/File_oembed.php b/classes/File_oembed.php
index e41ccfd09..11f160718 100644
--- a/classes/File_oembed.php
+++ b/classes/File_oembed.php
@@ -115,7 +115,13 @@ class File_oembed extends Memcached_DataObject
}
$file_oembed->insert();
if (!empty($data->thumbnail_url)) {
- File_thumbnail::saveNew($data, $file_id);
+ $ft = File_thumbnail::staticGet('file_id', $file_id);
+ if (!empty($ft)) {
+ common_log(LOG_WARNING, "Strangely, a File_thumbnail object exists for new file $file_id",
+ __FILE__);
+ } else {
+ File_thumbnail::saveNew($data, $file_id);
+ }
}
}
}
diff --git a/classes/Login_token.php b/classes/Login_token.php
index 746cd7f22..51dc61262 100644
--- a/classes/Login_token.php
+++ b/classes/Login_token.php
@@ -40,6 +40,8 @@ class Login_token extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
+ const TIMEOUT = 120; // seconds after which to timeout the token
+
/*
DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function.
In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but
@@ -52,4 +54,29 @@ class Login_token extends Memcached_DataObject
{
return array(false,false);
}
+
+ function makeNew($user)
+ {
+ $login_token = Login_token::staticGet('user_id', $user->id);
+
+ if (!empty($login_token)) {
+ $login_token->delete();
+ }
+
+ $login_token = new Login_token();
+
+ $login_token->user_id = $user->id;
+ $login_token->token = common_good_rand(16);
+ $login_token->created = common_sql_now();
+
+ $result = $login_token->insert();
+
+ if (!$result) {
+ common_log_db_error($login_token, 'INSERT', __FILE__);
+ throw new Exception(sprintf(_('Could not create login token for %s'),
+ $user->nickname));
+ }
+
+ return $login_token;
+ }
}
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 400b05f97..b68a4af8e 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -19,6 +19,8 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
class Memcached_DataObject extends DB_DataObject
{
/**
@@ -66,6 +68,7 @@ class Memcached_DataObject extends DB_DataObject
// Clear this out so we don't accidentally break global
// state in *this* process.
$this->_DB_resultid = null;
+
// We don't have any local DBO refs, so clear these out.
$this->_link_loaded = false;
}
@@ -90,42 +93,30 @@ class Memcached_DataObject extends DB_DataObject
unset($i);
}
$i = Memcached_DataObject::getcached($cls, $k, $v);
- if ($i === false) { // false == cache miss
+ if ($i) {
+ return $i;
+ } else {
$i = DB_DataObject::factory($cls);
if (empty($i)) {
- $i = false;
- return $i;
+ return false;
}
$result = $i->get($k, $v);
if ($result) {
- // Hit!
$i->encache();
+ return $i;
} else {
- // save the fact that no such row exists
- $c = self::memcache();
- if (!empty($c)) {
- $ck = self::cachekey($cls, $k, $v);
- $c->set($ck, null);
- }
- $i = false;
+ return false;
}
}
- return $i;
}
- /**
- * @fixme Should this return false on lookup fail to match staticGet?
- */
- function pkeyGet($cls, $kv)
+ function &pkeyGet($cls, $kv)
{
$i = Memcached_DataObject::multicache($cls, $kv);
- if ($i !== false) { // false == cache miss
+ if ($i) {
return $i;
} else {
- $i = DB_DataObject::factory($cls);
- if (empty($i)) {
- return false;
- }
+ $i = new $cls();
foreach ($kv as $k => $v) {
$i->$k = $v;
}
@@ -133,11 +124,6 @@ class Memcached_DataObject extends DB_DataObject
$i->encache();
} else {
$i = null;
- $c = self::memcache();
- if (!empty($c)) {
- $ck = self::multicacheKey($cls, $kv);
- $c->set($ck, null);
- }
}
return $i;
}
@@ -146,9 +132,6 @@ class Memcached_DataObject extends DB_DataObject
function insert()
{
$result = parent::insert();
- if ($result) {
- $this->encache(); // in case of cached negative lookups
- }
return $result;
}
@@ -188,23 +171,21 @@ class Memcached_DataObject extends DB_DataObject
if (!$c) {
return false;
} else {
- return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+ $obj = $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+ if (0 == strcasecmp($cls, 'User')) {
+ // Special case for User
+ if (is_object($obj) && is_object($obj->id)) {
+ common_log(LOG_ERR, "User " . $obj->nickname . " was cached with User as ID; deleting");
+ $c->delete(Memcached_DataObject::cacheKey($cls, $k, $v));
+ return false;
+ }
+ }
+ return $obj;
}
}
function keyTypes()
{
- // ini-based classes return number-indexed arrays. handbuilt
- // classes return column => keytype. Make this uniform.
-
- $keys = $this->keys();
-
- $keyskeys = array_keys($keys);
-
- if (is_string($keyskeys[0])) {
- return $keys;
- }
-
global $_DB_DATAOBJECT;
if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
$this->databaseStructure();
@@ -216,90 +197,73 @@ class Memcached_DataObject extends DB_DataObject
function encache()
{
$c = $this->memcache();
-
if (!$c) {
return false;
- }
-
- $keys = $this->_allCacheKeys();
-
- foreach ($keys as $key) {
- $c->set($key, $this);
+ } else if ($this->tableName() == 'user' && is_object($this->id)) {
+ // Special case for User bug
+ $e = new Exception();
+ common_log(LOG_ERR, __METHOD__ . ' caching user with User object as ID ' .
+ str_replace("\n", " ", $e->getTraceAsString()));
+ return false;
+ } else {
+ $pkey = array();
+ $pval = array();
+ $types = $this->keyTypes();
+ ksort($types);
+ foreach ($types as $key => $type) {
+ if ($type == 'K') {
+ $pkey[] = $key;
+ $pval[] = $this->$key;
+ } else {
+ $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
+ }
+ }
+ # XXX: should work for both compound and scalar pkeys
+ $pvals = implode(',', $pval);
+ $pkeys = implode(',', $pkey);
+ $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
}
}
function decache()
{
$c = $this->memcache();
-
if (!$c) {
return false;
- }
-
- $keys = $this->_allCacheKeys();
-
- foreach ($keys as $key) {
- $c->delete($key, $this);
- }
- }
-
- function _allCacheKeys()
- {
- $ckeys = array();
-
- $types = $this->keyTypes();
- ksort($types);
-
- $pkey = array();
- $pval = array();
-
- foreach ($types as $key => $type) {
-
- assert(!empty($key));
-
- if ($type == 'U') {
- if (empty($this->$key)) {
- continue;
+ } else {
+ $pkey = array();
+ $pval = array();
+ $types = $this->keyTypes();
+ ksort($types);
+ foreach ($types as $key => $type) {
+ if ($type == 'K') {
+ $pkey[] = $key;
+ $pval[] = $this->$key;
+ } else {
+ $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
}
- $ckeys[] = $this->cacheKey($this->tableName(), $key, $this->$key);
- } else if ($type == 'K' || $type == 'N') {
- $pkey[] = $key;
- $pval[] = $this->$key;
- } else {
- throw new Exception("Unknown key type $key => $type for " . $this->tableName());
}
+ # should work for both compound and scalar pkeys
+ # XXX: comma works for now but may not be safe separator for future keys
+ $pvals = implode(',', $pval);
+ $pkeys = implode(',', $pkey);
+ $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
}
-
- assert(count($pkey) > 0);
-
- // XXX: should work for both compound and scalar pkeys
- $pvals = implode(',', $pval);
- $pkeys = implode(',', $pkey);
-
- $ckeys[] = $this->cacheKey($this->tableName(), $pkeys, $pvals);
-
- return $ckeys;
}
function multicache($cls, $kv)
{
ksort($kv);
- $c = self::memcache();
+ $c = Memcached_DataObject::memcache();
if (!$c) {
return false;
} else {
- return $c->get(self::multicacheKey($cls, $kv));
+ $pkeys = implode(',', array_keys($kv));
+ $pvals = implode(',', array_values($kv));
+ return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
}
}
- static function multicacheKey($cls, $kv)
- {
- ksort($kv);
- $pkeys = implode(',', array_keys($kv));
- $pvals = implode(',', array_values($kv));
- return self::cacheKey($cls, $pkeys, $pvals);
- }
-
function getSearchEngine($table)
{
require_once INSTALLDIR.'/lib/search_engines.php';
@@ -334,8 +298,7 @@ class Memcached_DataObject extends DB_DataObject
$key_part = common_keyize($cls).':'.md5($qry);
$ckey = common_cache_key($key_part);
$stored = $c->get($ckey);
-
- if ($stored !== false) {
+ if ($stored) {
return new ArrayWrapper($stored);
}
diff --git a/classes/Status_network.php b/classes/Status_network.php
index b3117640d..776f6abb0 100644
--- a/classes/Status_network.php
+++ b/classes/Status_network.php
@@ -150,9 +150,19 @@ class Status_network extends DB_DataObject
}
if (!empty($sn)) {
- if (!empty($sn->hostname) && 0 != strcasecmp($sn->hostname, $servername)) {
- $sn->redirectToHostname();
+
+ // Redirect to the right URL
+
+ if (!empty($sn->hostname) &&
+ empty($_SERVER['HTTPS']) &&
+ 0 != strcasecmp($sn->hostname, $servername)) {
+ $sn->redirectTo('http://'.$sn->hostname.$_SERVER['REQUEST_URI']);
+ } else if (!empty($_SERVER['HTTPS']) &&
+ 0 != strcasecmp($sn->hostname, $servername) &&
+ 0 != strcasecmp($sn->nickname.'.'.$wildcard, $servername)) {
+ $sn->redirectTo('https://'.$sn->nickname.'.'.$wildcard.$_SERVER['REQUEST_URI']);
}
+
$dbhost = (empty($sn->dbhost)) ? 'localhost' : $sn->dbhost;
$dbuser = (empty($sn->dbuser)) ? $sn->nickname : $sn->dbuser;
$dbpass = $sn->dbpass;
@@ -160,7 +170,11 @@ class Status_network extends DB_DataObject
$config['db']['database'] = "mysqli://$dbuser:$dbpass@$dbhost/$dbname";
- $config['site']['name'] = $sn->sitename;
+ $config['site']['name'] = $sn->sitename;
+
+ if (!empty($sn->hostname)) {
+ $config['site']['server'] = $sn->hostname;
+ }
if (!empty($sn->theme)) {
$config['site']['theme'] = $sn->theme;
@@ -179,11 +193,8 @@ class Status_network extends DB_DataObject
// (C) 2006 by Heiko Richler http://www.richler.de/
// LGPL
- function redirectToHostname()
+ function redirectTo($destination)
{
- $destination = 'http://'.$this->hostname;
- $destination .= $_SERVER['REQUEST_URI'];
-
$old = 'http'.
(($_SERVER['HTTPS'] == 'on') ? 'S' : '').
'://'.