diff options
-rw-r--r-- | Zotlabs/Lib/Config.php | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/Zotlabs/Lib/Config.php b/Zotlabs/Lib/Config.php index 267543963..5e735be34 100644 --- a/Zotlabs/Lib/Config.php +++ b/Zotlabs/Lib/Config.php @@ -2,6 +2,7 @@ namespace Zotlabs\Lib; +use App; class Config { @@ -14,11 +15,26 @@ class Config { * @param string $family * The category of the configuration value */ - static public function Load($family) { - if(! array_key_exists($family, \App::$config)) - \App::$config[$family] = array(); + public static function Load($family, $recursionCounter = 0) { + if (! array_key_exists($family, App::$config)) { + App::$config[$family] = []; + } + + // We typically continue when presented with minor DB issues, + // but loading the site configuration is more important. + + // Check for query returning false and give it approx 30 seconds + // to recover if there's a problem. This is intended to fix a + // rare issue on Galera where temporary sync issues were causing + // the site encryption keys to be regenerated, which was causing + // communication issues for members. + + // This code probably belongs at the database layer, but we don't + // necessarily want to shut the site down for problematic queries + // caused by bad data. That could be used in a denial of service + // attack. Those do need to be (and they are) logged. - if(! array_key_exists('config_loaded', \App::$config[$family])) { + if (! array_key_exists('config_loaded', App::$config[$family])) { $r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family)); if ($r === false && !App::$install) { sleep(3); @@ -26,7 +42,7 @@ class Config { if ($recursionCounter > 10) { system_unavailable(); } - \App::$config[$family]['config_loaded'] = true; + self::Load($family, $recursionCounter); } elseif (is_array($r)) { foreach ($r as $rr) { @@ -54,19 +70,19 @@ class Config { * @return mixed * Return the set value, or false if the database update failed */ - static public function Set($family, $key, $value) { + public static function Set($family, $key, $value) { // manage array value $dbvalue = ((is_array($value)) ? 'json:' . json_encode($value) : $value); $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue); - if(self::Get($family, $key) === false || (! self::get_from_storage($family, $key))) { + if (self::Get($family, $key) === false || (! self::get_from_storage($family, $key))) { $ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ", dbesc($family), dbesc($key), dbesc($dbvalue) ); - if($ret) { - \App::$config[$family][$key] = $value; + if ($ret) { + App::$config[$family][$key] = $value; $ret = $value; } return $ret; @@ -78,8 +94,8 @@ class Config { dbesc($key) ); - if($ret) { - \App::$config[$family][$key] = $value; + if ($ret) { + App::$config[$family][$key] = $value; $ret = $value; } @@ -108,9 +124,10 @@ class Config { if ((! array_key_exists($family, App::$config)) || (! array_key_exists('config_loaded', App::$config[$family]))) { self::Load($family); + } - if(array_key_exists('config_loaded', \App::$config[$family])) { - if(! array_key_exists($key, \App::$config[$family])) { + if (array_key_exists('config_loaded', App::$config[$family])) { + if (! array_key_exists($key, App::$config[$family])) { return $default; } @@ -145,12 +162,13 @@ class Config { * The configuration key to delete * @return mixed */ - static public function Delete($family, $key) { + public static function Delete($family, $key) { $ret = false; - if(array_key_exists($family, \App::$config) && array_key_exists($key, \App::$config[$family])) - unset(\App::$config[$family][$key]); + if (array_key_exists($family, App::$config) && array_key_exists($key, App::$config[$family])) { + unset(App::$config[$family][$key]); + } $ret = q("DELETE FROM config WHERE cat = '%s' AND k = '%s'", dbesc($family), @@ -173,7 +191,7 @@ class Config { * The configuration key to query * @return mixed */ - static private function get_from_storage($family,$key) { + private static function get_from_storage($family, $key) { $ret = q("SELECT * FROM config WHERE cat = '%s' AND k = '%s' LIMIT 1", dbesc($family), dbesc($key) @@ -181,5 +199,4 @@ class Config { return $ret; } - } |