wip: initial for config object

This commit is contained in:
Andrew Dolgov 2021-02-22 21:47:48 +03:00
parent 42173386b3
commit e4107ac952
30 changed files with 165 additions and 199 deletions

View File

@ -40,7 +40,7 @@
header("Content-Type: text/json; charset=utf-8"); header("Content-Type: text/json; charset=utf-8");
if (SINGLE_USER_MODE) { if (Config::get(Config::SINGLE_USER_MODE)) {
UserHelper::authenticate( "admin", null); UserHelper::authenticate( "admin", null);
} }

View File

@ -57,7 +57,7 @@ class API extends Handler {
$password = clean($_REQUEST["password"]); $password = clean($_REQUEST["password"]);
$password_base64 = base64_decode(clean($_REQUEST["password"])); $password_base64 = base64_decode(clean($_REQUEST["password"]));
if (SINGLE_USER_MODE) $login = "admin"; if (Config::get(Config::SINGLE_USER_MODE)) $login = "admin";
if ($uid = UserHelper::find_user_by_login($login)) { if ($uid = UserHelper::find_user_by_login($login)) {
if (get_pref("ENABLE_API_ACCESS", $uid)) { if (get_pref("ENABLE_API_ACCESS", $uid)) {
@ -361,9 +361,10 @@ class API extends Handler {
} }
function getConfig() { function getConfig() {
$config = array( $config = [
"icons_dir" => ICONS_DIR, "icons_dir" => Config::get(Config::ICONS_DIR),
"icons_url" => ICONS_URL); "icons_url" => Config::get(Config::ICONS_URL)
];
$config["daemon_is_running"] = file_is_locked("update_daemon.lock"); $config["daemon_is_running"] = file_is_locked("update_daemon.lock");

View File

@ -85,7 +85,7 @@ class Article extends Handler_Protected {
content = ?, content_hash = ? WHERE id = ?"); content = ?, content_hash = ? WHERE id = ?");
$sth->execute([$content, $content_hash, $ref_id]); $sth->execute([$content, $content_hash, $ref_id]);
if (DB_TYPE == "pgsql"){ if (Config::get(Config::DB_TYPE) == "pgsql") {
$sth = $pdo->prepare("UPDATE ttrss_entries $sth = $pdo->prepare("UPDATE ttrss_entries
SET tsvector_combined = to_tsvector( :ts_content) SET tsvector_combined = to_tsvector( :ts_content)
WHERE id = :id"); WHERE id = :id");
@ -130,7 +130,7 @@ class Article extends Handler_Protected {
if ($row = $sth->fetch()) { if ($row = $sth->fetch()) {
$ref_id = $row["id"]; $ref_id = $row["id"];
if (DB_TYPE == "pgsql"){ if (Config::get(Config::DB_TYPE) == "pgsql"){
$sth = $pdo->prepare("UPDATE ttrss_entries $sth = $pdo->prepare("UPDATE ttrss_entries
SET tsvector_combined = to_tsvector( :ts_content) SET tsvector_combined = to_tsvector( :ts_content)
WHERE id = :id"); WHERE id = :id");
@ -475,7 +475,7 @@ class Article extends Handler_Protected {
// purge orphaned posts in main content table // purge orphaned posts in main content table
if (DB_TYPE == "mysql") if (Config::get(Config::DB_TYPE) == "mysql")
$limit_qpart = "LIMIT 5000"; $limit_qpart = "LIMIT 5000";
else else
$limit_qpart = ""; $limit_qpart = "";

View File

@ -21,9 +21,9 @@ class Db
$db_host = defined('DB_HOST') && DB_HOST ? ';host=' . DB_HOST : ''; $db_host = defined('DB_HOST') && DB_HOST ? ';host=' . DB_HOST : '';
try { try {
$pdo = new PDO(DB_TYPE . ':dbname=' . DB_NAME . $db_host . $db_port, $pdo = new PDO(Config::get(Config::DB_TYPE) . ':dbname=' . Config::get(Config::DB_NAME) . $db_host . $db_port,
DB_USER, Config::get(Config::DB_USER),
DB_PASS); Config::get(Config::DB_PASS));
} catch (Exception $e) { } catch (Exception $e) {
print "<pre>Exception while creating PDO object:" . $e->getMessage() . "</pre>"; print "<pre>Exception while creating PDO object:" . $e->getMessage() . "</pre>";
exit(101); exit(101);
@ -31,14 +31,14 @@ class Db
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$pdo->query("set client_encoding = 'UTF-8'"); $pdo->query("set client_encoding = 'UTF-8'");
$pdo->query("set datestyle = 'ISO, european'"); $pdo->query("set datestyle = 'ISO, european'");
$pdo->query("set TIME ZONE 0"); $pdo->query("set TIME ZONE 0");
$pdo->query("set cpu_tuple_cost = 0.5"); $pdo->query("set cpu_tuple_cost = 0.5");
} else if (DB_TYPE == "mysql") { } else if (Config::get(Config::DB_TYPE) == "mysql") {
$pdo->query("SET time_zone = '+0:0'"); $pdo->query("SET time_zone = '+0:0'");
if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) { if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) {
@ -68,7 +68,7 @@ class Db
} }
public static function sql_random_function() { public static function sql_random_function() {
if (DB_TYPE == "mysql") { if (Config::get(Config::DB_TYPE) == "mysql") {
return "RAND()"; return "RAND()";
} else { } else {
return "RANDOM()"; return "RANDOM()";

View File

@ -8,9 +8,9 @@ class Digest
Debug::log("Sending digests, batch of max $user_limit users, headline limit = $limit"); Debug::log("Sending digests, batch of max $user_limit users, headline limit = $limit");
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_qpart = "last_digest_sent < NOW() - INTERVAL '1 days'"; $interval_qpart = "last_digest_sent < NOW() - INTERVAL '1 days'";
} else /* if (DB_TYPE == "mysql") */ { } else /* if (Config::get(Config::DB_TYPE) == "mysql") */ {
$interval_qpart = "last_digest_sent < DATE_SUB(NOW(), INTERVAL 1 DAY)"; $interval_qpart = "last_digest_sent < DATE_SUB(NOW(), INTERVAL 1 DAY)";
} }
@ -91,19 +91,19 @@ class Digest
$tpl->setVariable('CUR_DATE', date('Y/m/d', $local_ts)); $tpl->setVariable('CUR_DATE', date('Y/m/d', $local_ts));
$tpl->setVariable('CUR_TIME', date('G:i', $local_ts)); $tpl->setVariable('CUR_TIME', date('G:i', $local_ts));
$tpl->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl->setVariable('TTRSS_HOST', Config::get(Config.Config::get(Config::SELF_URL_PATH)));
$tpl_t->setVariable('CUR_DATE', date('Y/m/d', $local_ts)); $tpl_t->setVariable('CUR_DATE', date('Y/m/d', $local_ts));
$tpl_t->setVariable('CUR_TIME', date('G:i', $local_ts)); $tpl_t->setVariable('CUR_TIME', date('G:i', $local_ts));
$tpl_t->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl_t->setVariable('TTRSS_HOST', Config::get(Config.Config::get(Config::SELF_URL_PATH)));
$affected_ids = array(); $affected_ids = array();
$days = (int) $days; $days = (int) $days;
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_qpart = "ttrss_entries.date_updated > NOW() - INTERVAL '$days days'"; $interval_qpart = "ttrss_entries.date_updated > NOW() - INTERVAL '$days days'";
} else /* if (DB_TYPE == "mysql") */ { } else /* if (Config::get(Config::DB_TYPE) == "mysql") */ {
$interval_qpart = "ttrss_entries.date_updated > DATE_SUB(NOW(), INTERVAL $days DAY)"; $interval_qpart = "ttrss_entries.date_updated > DATE_SUB(NOW(), INTERVAL $days DAY)";
} }

View File

@ -191,7 +191,7 @@ class DiskCache {
]; ];
public function __construct($dir) { public function __construct($dir) {
$this->dir = CACHE_DIR . "/" . basename(clean($dir)); $this->dir = Config::get(Config::CACHE_DIR) . "/" . basename(clean($dir));
} }
public function get_dir() { public function get_dir() {
@ -339,7 +339,7 @@ class DiskCache {
} }
static function expire() { static function expire() {
$dirs = array_filter(glob(CACHE_DIR . "/*"), "is_dir"); $dirs = array_filter(glob(Config::get(Config::CACHE_DIR) . "/*"), "is_dir");
foreach ($dirs as $cache_dir) { foreach ($dirs as $cache_dir) {
$num_deleted = 0; $num_deleted = 0;
@ -396,7 +396,7 @@ class DiskCache {
$tmppluginhost = new PluginHost(); $tmppluginhost = new PluginHost();
$tmppluginhost->load(PLUGINS, PluginHost::KIND_SYSTEM); $tmppluginhost->load(Config::get(Config::PLUGINS), PluginHost::KIND_SYSTEM);
//$tmppluginhost->load_data(); //$tmppluginhost->load_data();
if ($tmppluginhost->run_hooks_until(PluginHost::HOOK_SEND_LOCAL_FILE, true, $filename)) if ($tmppluginhost->run_hooks_until(PluginHost::HOOK_SEND_LOCAL_FILE, true, $filename))

View File

@ -179,7 +179,7 @@ abstract class FeedItem_Common extends FeedItem {
$cat = preg_replace('/[,\'\"]/', "", $cat); $cat = preg_replace('/[,\'\"]/', "", $cat);
if (DB_TYPE == "mysql") { if (Config::get(Config::DB_TYPE) == "mysql") {
$cat = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $cat); $cat = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $cat);
} }

View File

@ -186,7 +186,7 @@ class Feeds extends Handler_Protected {
$id = $line["id"]; $id = $line["id"];
// frontend doesn't expect pdo returning booleans as strings on mysql // frontend doesn't expect pdo returning booleans as strings on mysql
if (DB_TYPE == "mysql") { if (Config::get(Config::DB_TYPE) == "mysql") {
foreach (["unread", "marked", "published"] as $k) { foreach (["unread", "marked", "published"] as $k) {
$line[$k] = $line[$k] === "1"; $line[$k] = $line[$k] === "1";
} }
@ -576,7 +576,7 @@ class Feeds extends Handler_Protected {
function search() { function search() {
print json_encode([ print json_encode([
"show_language" => DB_TYPE == "pgsql", "show_language" => Config::get(Config::DB_TYPE) == "pgsql",
"show_syntax_help" => count(PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH)) == 0, "show_syntax_help" => count(PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH)) == 0,
"all_languages" => Pref_Feeds::get_ts_languages(), "all_languages" => Pref_Feeds::get_ts_languages(),
"default_language" => get_pref('DEFAULT_SEARCH_LANGUAGE') "default_language" => get_pref('DEFAULT_SEARCH_LANGUAGE')
@ -716,21 +716,21 @@ class Feeds extends Handler_Protected {
switch ($mode) { switch ($mode) {
case "1day": case "1day":
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$date_qpart = "date_entered < NOW() - INTERVAL '1 day' "; $date_qpart = "date_entered < NOW() - INTERVAL '1 day' ";
} else { } else {
$date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY) "; $date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY) ";
} }
break; break;
case "1week": case "1week":
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$date_qpart = "date_entered < NOW() - INTERVAL '1 week' "; $date_qpart = "date_entered < NOW() - INTERVAL '1 week' ";
} else { } else {
$date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 WEEK) "; $date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 WEEK) ";
} }
break; break;
case "2week": case "2week":
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$date_qpart = "date_entered < NOW() - INTERVAL '2 week' "; $date_qpart = "date_entered < NOW() - INTERVAL '2 week' ";
} else { } else {
$date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 2 WEEK) "; $date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 2 WEEK) ";
@ -807,7 +807,7 @@ class Feeds extends Handler_Protected {
$intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE"); $intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE");
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$match_part = "date_entered > NOW() - INTERVAL '$intl hour' "; $match_part = "date_entered > NOW() - INTERVAL '$intl hour' ";
} else { } else {
$match_part = "date_entered > DATE_SUB(NOW(), $match_part = "date_entered > DATE_SUB(NOW(),
@ -900,7 +900,7 @@ class Feeds extends Handler_Protected {
$intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid); $intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid);
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$match_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' "; $match_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' ";
} else { } else {
$match_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) "; $match_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) ";
@ -1332,7 +1332,7 @@ class Feeds extends Handler_Protected {
list($search_query_part, $search_words) = self::_search_to_sql($search, $search_language, $owner_uid); list($search_query_part, $search_words) = self::_search_to_sql($search, $search_language, $owner_uid);
} }
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$test_sth = $pdo->prepare("select $search_query_part $test_sth = $pdo->prepare("select $search_query_part
FROM ttrss_entries, ttrss_user_entries WHERE id = ref_id limit 1"); FROM ttrss_entries, ttrss_user_entries WHERE id = ref_id limit 1");
@ -1469,7 +1469,7 @@ class Feeds extends Handler_Protected {
} else if ($feed == -6) { // recently read } else if ($feed == -6) { // recently read
$query_strategy_part = "unread = false AND last_read IS NOT NULL"; $query_strategy_part = "unread = false AND last_read IS NOT NULL";
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$query_strategy_part .= " AND last_read > NOW() - INTERVAL '1 DAY' "; $query_strategy_part .= " AND last_read > NOW() - INTERVAL '1 DAY' ";
} else { } else {
$query_strategy_part .= " AND last_read > DATE_SUB(NOW(), INTERVAL 1 DAY) "; $query_strategy_part .= " AND last_read > DATE_SUB(NOW(), INTERVAL 1 DAY) ";
@ -1486,7 +1486,7 @@ class Feeds extends Handler_Protected {
$intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid); $intl = (int) get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid);
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$query_strategy_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' "; $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' ";
} else { } else {
$query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) "; $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) ";
@ -1605,7 +1605,7 @@ class Feeds extends Handler_Protected {
if ($feed == -3) if ($feed == -3)
$first_id_query_strategy_part = "true"; $first_id_query_strategy_part = "true";
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$sanity_interval_qpart = "date_entered >= NOW() - INTERVAL '1 hour' AND"; $sanity_interval_qpart = "date_entered >= NOW() - INTERVAL '1 hour' AND";
$yyiw_qpart = "to_char(date_entered, 'IYYY-IW') AS yyiw"; $yyiw_qpart = "to_char(date_entered, 'IYYY-IW') AS yyiw";
@ -1705,7 +1705,7 @@ class Feeds extends Handler_Protected {
} else { } else {
// browsing by tag // browsing by tag
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$distinct_columns = str_replace("desc", "", strtolower($order_by)); $distinct_columns = str_replace("desc", "", strtolower($order_by));
$distinct_qpart = "DISTINCT ON (id, $distinct_columns)"; $distinct_qpart = "DISTINCT ON (id, $distinct_columns)";
} else { } else {
@ -1948,10 +1948,10 @@ class Feeds extends Handler_Protected {
if ($row = $sth->fetch()) { if ($row = $sth->fetch()) {
$owner_uid = $row["owner_uid"]; $owner_uid = $row["owner_uid"];
if (FORCE_ARTICLE_PURGE != 0) { if (Config::get(Config::FORCE_ARTICLE_PURGE) != 0) {
Debug::log("purge_feed: FORCE_ARTICLE_PURGE is set, overriding interval to " . FORCE_ARTICLE_PURGE, Debug::$LOG_VERBOSE); Debug::log("purge_feed: FORCE_ARTICLE_PURGE is set, overriding interval to " . Config::get(Config::FORCE_ARTICLE_PURGE), Debug::$LOG_VERBOSE);
$purge_unread = true; $purge_unread = true;
$purge_interval = FORCE_ARTICLE_PURGE; $purge_interval = Config::get(Config::FORCE_ARTICLE_PURGE);
} else { } else {
$purge_unread = get_pref("PURGE_UNREAD_ARTICLES", $owner_uid, false); $purge_unread = get_pref("PURGE_UNREAD_ARTICLES", $owner_uid, false);
} }
@ -1970,7 +1970,7 @@ class Feeds extends Handler_Protected {
else else
$query_limit = ""; $query_limit = "";
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$sth = $pdo->prepare("DELETE FROM ttrss_user_entries $sth = $pdo->prepare("DELETE FROM ttrss_user_entries
USING ttrss_entries USING ttrss_entries
WHERE ttrss_entries.id = ref_id AND WHERE ttrss_entries.id = ref_id AND
@ -2153,7 +2153,7 @@ class Feeds extends Handler_Protected {
array_push($query_keywords, "(".SUBSTRING_FOR_DATE."(updated,1,LENGTH('$k')) $not = '$k')"); array_push($query_keywords, "(".SUBSTRING_FOR_DATE."(updated,1,LENGTH('$k')) $not = '$k')");
} else { } else {
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$k = mb_strtolower($k); $k = mb_strtolower($k);
array_push($search_query_leftover, $not ? "!$k" : $k); array_push($search_query_leftover, $not ? "!$k" : $k);
} else { } else {
@ -2168,7 +2168,7 @@ class Feeds extends Handler_Protected {
if (count($search_query_leftover) > 0) { if (count($search_query_leftover) > 0) {
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
// if there's no joiners consider this a "simple" search and // if there's no joiners consider this a "simple" search and
// concatenate everything with &, otherwise don't try to mess with tsquery syntax // concatenate everything with &, otherwise don't try to mess with tsquery syntax

View File

@ -43,7 +43,7 @@ class Handler_Public extends Handler {
$user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid); $user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid);
$tmppluginhost = new PluginHost(); $tmppluginhost = new PluginHost();
$tmppluginhost->load(PLUGINS, PluginHost::KIND_ALL); $tmppluginhost->load(Config::get(Config::PLUGINS), PluginHost::KIND_ALL);
$tmppluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid); $tmppluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid);
//$tmppluginhost->load_data(); //$tmppluginhost->load_data();
@ -309,7 +309,7 @@ class Handler_Public extends Handler {
$format = clean($_REQUEST['format'] ?? "atom"); $format = clean($_REQUEST['format'] ?? "atom");
$orig_guid = clean($_REQUEST["orig_guid"] ?? false); $orig_guid = clean($_REQUEST["orig_guid"] ?? false);
if (SINGLE_USER_MODE) { if (Config::get(Config::SINGLE_USER_MODE)) {
UserHelper::authenticate("admin", null); UserHelper::authenticate("admin", null);
} }
@ -347,7 +347,7 @@ class Handler_Public extends Handler {
} }
function login() { function login() {
if (!SINGLE_USER_MODE) { if (!Config::get(Config::SINGLE_USER_MODE)) {
$login = clean($_POST["login"]); $login = clean($_POST["login"]);
$password = clean($_POST["password"]); $password = clean($_POST["password"]);
@ -355,7 +355,7 @@ class Handler_Public extends Handler {
$safe_mode = checkbox_to_sql_bool(clean($_POST["safe_mode"] ?? false)); $safe_mode = checkbox_to_sql_bool(clean($_POST["safe_mode"] ?? false));
if ($remember_me) { if ($remember_me) {
@session_set_cookie_params(SESSION_COOKIE_LIFETIME); @session_set_cookie_params(Config::get(Config::SESSION_COOKIE_LIFETIME));
} else { } else {
@session_set_cookie_params(0); @session_set_cookie_params(0);
} }
@ -398,7 +398,7 @@ class Handler_Public extends Handler {
$return = clean($_REQUEST['return']); $return = clean($_REQUEST['return']);
if ($_REQUEST['return'] && mb_strpos($return, SELF_URL_PATH) === 0) { if ($_REQUEST['return'] && mb_strpos($return, Config::get(Config::SELF_URL_PATH)) === 0) {
header("Location: " . clean($_REQUEST['return'])); header("Location: " . clean($_REQUEST['return']));
} else { } else {
header("Location: " . get_self_url_prefix()); header("Location: " . get_self_url_prefix());
@ -559,7 +559,7 @@ class Handler_Public extends Handler {
$tpl->setVariable('LOGIN', $login); $tpl->setVariable('LOGIN', $login);
$tpl->setVariable('RESETPASS_LINK', $resetpass_link); $tpl->setVariable('RESETPASS_LINK', $resetpass_link);
$tpl->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl->setVariable('TTRSS_HOST', Config::get(Config::SELF_URL_PATH));
$tpl->addBlock('message'); $tpl->addBlock('message');
@ -613,7 +613,7 @@ class Handler_Public extends Handler {
function dbupdate() { function dbupdate() {
startup_gettext(); startup_gettext();
if (!SINGLE_USER_MODE && $_SESSION["access_level"] < 10) { if (!Config::get(Config::SINGLE_USER_MODE) && $_SESSION["access_level"] < 10) {
$_SESSION["login_error_msg"] = __("Your access level is insufficient to run this script."); $_SESSION["login_error_msg"] = __("Your access level is insufficient to run this script.");
$this->_render_login_form(); $this->_render_login_form();
exit; exit;
@ -660,7 +660,7 @@ class Handler_Public extends Handler {
<?php <?php
@$op = clean($_REQUEST["subop"]); @$op = clean($_REQUEST["subop"]);
$updater = new DbUpdater(Db::pdo(), DB_TYPE, SCHEMA_VERSION); $updater = new DbUpdater(Db::pdo(), Config::get(Config::DB_TYPE), SCHEMA_VERSION);
if ($op == "performupdate") { if ($op == "performupdate") {
if ($updater->is_update_required()) { if ($updater->is_update_required()) {
@ -709,7 +709,7 @@ class Handler_Public extends Handler {
print "<h2>".T_sprintf("Tiny Tiny RSS database needs update to the latest version (%d to %d).", print "<h2>".T_sprintf("Tiny Tiny RSS database needs update to the latest version (%d to %d).",
$updater->get_schema_version(), SCHEMA_VERSION)."</h2>"; $updater->get_schema_version(), SCHEMA_VERSION)."</h2>";
if (DB_TYPE == "mysql") { if (Config::get(Config::DB_TYPE) == "mysql") {
print_error("<strong>READ THIS:</strong> Due to MySQL limitations, your database is not completely protected while updating. ". print_error("<strong>READ THIS:</strong> Due to MySQL limitations, your database is not completely protected while updating. ".
"Errors may put it in an inconsistent state requiring manual rollback. <strong>BACKUP YOUR DATABASE BEFORE CONTINUING.</strong>"); "Errors may put it in an inconsistent state requiring manual rollback. <strong>BACKUP YOUR DATABASE BEFORE CONTINUING.</strong>");
} else { } else {

View File

@ -594,7 +594,7 @@ class OPML extends Handler_Protected {
} }
if (is_uploaded_file($_FILES['opml_file']['tmp_name'])) { if (is_uploaded_file($_FILES['opml_file']['tmp_name'])) {
$tmp_file = (string)tempnam(CACHE_DIR . '/upload', 'opml'); $tmp_file = (string)tempnam(Config::get(Config::CACHE_DIR) . '/upload', 'opml');
$result = move_uploaded_file($_FILES['opml_file']['tmp_name'], $result = move_uploaded_file($_FILES['opml_file']['tmp_name'],
$tmp_file); $tmp_file);

View File

@ -9,7 +9,7 @@ class Pref_Feeds extends Handler_Protected {
public static function get_ts_languages() { public static function get_ts_languages() {
$rv = []; $rv = [];
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$dbh = Db::pdo(); $dbh = Db::pdo();
$res = $dbh->query("SELECT cfgname FROM pg_ts_config"); $res = $dbh->query("SELECT cfgname FROM pg_ts_config");
@ -453,7 +453,7 @@ class Pref_Feeds extends Handler_Protected {
header("Content-type: text/html"); header("Content-type: text/html");
if (is_uploaded_file($_FILES['icon_file']['tmp_name'])) { if (is_uploaded_file($_FILES['icon_file']['tmp_name'])) {
$tmp_file = tempnam(CACHE_DIR . '/upload', 'icon'); $tmp_file = tempnam(Config::get(Config::CACHE_DIR) . '/upload', 'icon');
if (!$tmp_file) if (!$tmp_file)
return; return;
@ -529,7 +529,7 @@ class Pref_Feeds extends Handler_Protected {
$local_update_intervals = $update_intervals; $local_update_intervals = $update_intervals;
$local_update_intervals[0] .= sprintf(" (%s)", $update_intervals[get_pref("DEFAULT_UPDATE_INTERVAL")]); $local_update_intervals[0] .= sprintf(" (%s)", $update_intervals[get_pref("DEFAULT_UPDATE_INTERVAL")]);
if (FORCE_ARTICLE_PURGE == 0) { if (Config::get(Config::FORCE_ARTICLE_PURGE) == 0) {
$local_purge_intervals = $purge_intervals; $local_purge_intervals = $purge_intervals;
$default_purge_interval = get_pref("PURGE_OLD_DAYS"); $default_purge_interval = get_pref("PURGE_OLD_DAYS");
@ -539,7 +539,7 @@ class Pref_Feeds extends Handler_Protected {
$local_purge_intervals[0] .= " " . sprintf("(%s)", __("Disabled")); $local_purge_intervals[0] .= " " . sprintf("(%s)", __("Disabled"));
} else { } else {
$purge_interval = FORCE_ARTICLE_PURGE; $purge_interval = Config::get(Config::FORCE_ARTICLE_PURGE);
$local_purge_intervals = [ T_nsprintf('%d day', '%d days', $purge_interval, $purge_interval) ]; $local_purge_intervals = [ T_nsprintf('%d day', '%d days', $purge_interval, $purge_interval) ];
} }
@ -550,13 +550,13 @@ class Pref_Feeds extends Handler_Protected {
"select" => \Controls\select_feeds_cats("cat_id", $row["cat_id"]), "select" => \Controls\select_feeds_cats("cat_id", $row["cat_id"]),
], ],
"plugin_data" => $plugin_data, "plugin_data" => $plugin_data,
"force_purge" => (int)FORCE_ARTICLE_PURGE, "force_purge" => (int)Config::get(Config::FORCE_ARTICLE_PURGE),
"intervals" => [ "intervals" => [
"update" => $local_update_intervals, "update" => $local_update_intervals,
"purge" => $local_purge_intervals, "purge" => $local_purge_intervals,
], ],
"lang" => [ "lang" => [
"enabled" => DB_TYPE == "pgsql", "enabled" => Config::get(Config::DB_TYPE) == "pgsql",
"default" => get_pref('DEFAULT_SEARCH_LANGUAGE'), "default" => get_pref('DEFAULT_SEARCH_LANGUAGE'),
"all" => $this::get_ts_languages(), "all" => $this::get_ts_languages(),
] ]
@ -614,7 +614,7 @@ class Pref_Feeds extends Handler_Protected {
</fieldset> </fieldset>
<?php } ?> <?php } ?>
<?php if (DB_TYPE == "pgsql") { ?> <?php if (Config::get(Config::DB_TYPE) == "pgsql") { ?>
<fieldset> <fieldset>
<label><?= __('Language:') ?></label> <label><?= __('Language:') ?></label>
<?= \Controls\select_tag("feed_language", "", $this::get_ts_languages(), ["disabled"=> 1]) ?> <?= \Controls\select_tag("feed_language", "", $this::get_ts_languages(), ["disabled"=> 1]) ?>
@ -632,7 +632,7 @@ class Pref_Feeds extends Handler_Protected {
<?= $this->_batch_toggle_checkbox("update_interval") ?> <?= $this->_batch_toggle_checkbox("update_interval") ?>
</fieldset> </fieldset>
<?php if (FORCE_ARTICLE_PURGE == 0) { ?> <?php if (Config::get(Config::FORCE_ARTICLE_PURGE) == 0) { ?>
<fieldset> <fieldset>
<label><?= __('Article purging:') ?></label> <label><?= __('Article purging:') ?></label>
<?= \Controls\select_hash("purge_interval", "", $local_purge_intervals, ["disabled" => 1]) ?> <?= \Controls\select_hash("purge_interval", "", $local_purge_intervals, ["disabled" => 1]) ?>
@ -1147,7 +1147,7 @@ class Pref_Feeds extends Handler_Protected {
function inactiveFeeds() { function inactiveFeeds() {
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_qpart = "NOW() - INTERVAL '3 months'"; $interval_qpart = "NOW() - INTERVAL '3 months'";
} else { } else {
$interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)"; $interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)";

View File

@ -236,7 +236,7 @@ class Pref_Prefs extends Handler_Protected {
$tpl->setVariable('LOGIN', $row["login"]); $tpl->setVariable('LOGIN', $row["login"]);
$tpl->setVariable('NEWMAIL', $email); $tpl->setVariable('NEWMAIL', $email);
$tpl->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl->setVariable('TTRSS_HOST', Config::get(Config::SELF_URL_PATH));
$tpl->addBlock('message'); $tpl->addBlock('message');
@ -625,7 +625,7 @@ class Pref_Prefs extends Handler_Protected {
continue; continue;
} }
if ($pref_name == "DEFAULT_SEARCH_LANGUAGE" && DB_TYPE != "pgsql") { if ($pref_name == "DEFAULT_SEARCH_LANGUAGE" && Config::get(Config::DB_TYPE) != "pgsql") {
continue; continue;
} }
@ -705,7 +705,7 @@ class Pref_Prefs extends Handler_Protected {
array_push($listed_boolean_prefs, $pref_name); array_push($listed_boolean_prefs, $pref_name);
if ($pref_name == "PURGE_UNREAD_ARTICLES" && FORCE_ARTICLE_PURGE != 0) { if ($pref_name == "PURGE_UNREAD_ARTICLES" && Config::get(Config::FORCE_ARTICLE_PURGE) != 0) {
$is_disabled = true; $is_disabled = true;
$is_checked = true; $is_checked = true;
} else { } else {
@ -719,9 +719,9 @@ class Pref_Prefs extends Handler_Protected {
} else if (in_array($pref_name, ['FRESH_ARTICLE_MAX_AGE', } else if (in_array($pref_name, ['FRESH_ARTICLE_MAX_AGE',
'PURGE_OLD_DAYS', 'LONG_DATE_FORMAT', 'SHORT_DATE_FORMAT'])) { 'PURGE_OLD_DAYS', 'LONG_DATE_FORMAT', 'SHORT_DATE_FORMAT'])) {
if ($pref_name == "PURGE_OLD_DAYS" && FORCE_ARTICLE_PURGE != 0) { if ($pref_name == "PURGE_OLD_DAYS" && Config::get(Config::FORCE_ARTICLE_PURGE) != 0) {
$attributes = ["disabled" => true, "required" => true]; $attributes = ["disabled" => true, "required" => true];
$value = FORCE_ARTICLE_PURGE; $value = Config::get(Config::FORCE_ARTICLE_PURGE);
} else { } else {
$attributes = ["required" => true]; $attributes = ["required" => true];
} }
@ -829,7 +829,7 @@ class Pref_Prefs extends Handler_Protected {
private function index_plugins_system() { private function index_plugins_system() {
print_notice("System plugins are enabled in <strong>config.php</strong> for all users."); print_notice("System plugins are enabled in <strong>config.php</strong> for all users.");
$system_enabled = array_map("trim", explode(",", (string)PLUGINS)); $system_enabled = array_map("trim", explode(",", (string)Config::get(Config::PLUGINS)));
$tmppluginhost = new PluginHost(); $tmppluginhost = new PluginHost();
$tmppluginhost->load_all($tmppluginhost::KIND_ALL, $_SESSION["uid"], true); $tmppluginhost->load_all($tmppluginhost::KIND_ALL, $_SESSION["uid"], true);
@ -862,7 +862,7 @@ class Pref_Prefs extends Handler_Protected {
} }
private function index_plugins_user() { private function index_plugins_user() {
$system_enabled = array_map("trim", explode(",", (string)PLUGINS)); $system_enabled = array_map("trim", explode(",", (string)Config::get(Config::PLUGINS)));
$user_enabled = array_map("trim", explode(",", get_pref("_ENABLED_PLUGINS"))); $user_enabled = array_map("trim", explode(",", get_pref("_ENABLED_PLUGINS")));
$tmppluginhost = new PluginHost(); $tmppluginhost = new PluginHost();
@ -1135,7 +1135,7 @@ class Pref_Prefs extends Handler_Protected {
$tpl->readTemplateFromFile("otp_disabled_template.txt"); $tpl->readTemplateFromFile("otp_disabled_template.txt");
$tpl->setVariable('LOGIN', $row["login"]); $tpl->setVariable('LOGIN', $row["login"]);
$tpl->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl->setVariable('TTRSS_HOST', Config::get(Config::SELF_URL_PATH));
$tpl->addBlock('message'); $tpl->addBlock('message');

View File

@ -174,7 +174,7 @@ class RPC extends Handler_Protected {
static function updaterandomfeed_real() { static function updaterandomfeed_real() {
// Test if the feed need a update (update interval exceded). // Test if the feed need a update (update interval exceded).
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$update_limit_qpart = "AND (( $update_limit_qpart = "AND ((
ttrss_feeds.update_interval = 0 ttrss_feeds.update_interval = 0
AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL) AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)
@ -199,7 +199,7 @@ class RPC extends Handler_Protected {
} }
// Test if feed is currently being updated by another process. // Test if feed is currently being updated by another process.
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')"; $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')";
} else { } else {
$updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))"; $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))";
@ -361,7 +361,7 @@ class RPC extends Handler_Protected {
$params["safe_mode"] = !empty($_SESSION["safe_mode"]); $params["safe_mode"] = !empty($_SESSION["safe_mode"]);
$params["check_for_updates"] = CHECK_FOR_UPDATES; $params["check_for_updates"] = CHECK_FOR_UPDATES;
$params["icons_url"] = ICONS_URL; $params["icons_url"] = ICONS_URL;
$params["cookie_lifetime"] = SESSION_COOKIE_LIFETIME; $params["cookie_lifetime"] = Config::get(Config::SESSION_COOKIE_LIFETIME);
$params["default_view_mode"] = get_pref("_DEFAULT_VIEW_MODE"); $params["default_view_mode"] = get_pref("_DEFAULT_VIEW_MODE");
$params["default_view_limit"] = (int) get_pref("_DEFAULT_VIEW_LIMIT"); $params["default_view_limit"] = (int) get_pref("_DEFAULT_VIEW_LIMIT");
$params["default_view_order_by"] = get_pref("_DEFAULT_VIEW_ORDER_BY"); $params["default_view_order_by"] = get_pref("_DEFAULT_VIEW_ORDER_BY");
@ -433,7 +433,7 @@ class RPC extends Handler_Protected {
$data["labels"] = Labels::get_all($_SESSION["uid"]); $data["labels"] = Labels::get_all($_SESSION["uid"]);
if (LOG_DESTINATION == 'sql' && $_SESSION['access_level'] >= 10) { if (LOG_DESTINATION == 'sql' && $_SESSION['access_level'] >= 10) {
if (DB_TYPE == 'pgsql') { if (Config::get(Config::DB_TYPE) == 'pgsql') {
$log_interval = "created_at > NOW() - interval '1 hour'"; $log_interval = "created_at > NOW() - interval '1 hour'";
} else { } else {
$log_interval = "created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"; $log_interval = "created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)";
@ -452,13 +452,13 @@ class RPC extends Handler_Protected {
} }
} }
if (file_exists(LOCK_DIRECTORY . "/update_daemon.lock")) { if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon.lock")) {
$data['daemon_is_running'] = (int) file_is_locked("update_daemon.lock"); $data['daemon_is_running'] = (int) file_is_locked("update_daemon.lock");
if (time() - ($_SESSION["daemon_stamp_check"] ?? 0) > 30) { if (time() - ($_SESSION["daemon_stamp_check"] ?? 0) > 30) {
$stamp = (int) @file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp"); $stamp = (int) @file_get_contents(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon.stamp");
if ($stamp) { if ($stamp) {
$stamp_delta = time() - $stamp; $stamp_delta = time() - $stamp;

View File

@ -61,8 +61,8 @@ class RSSUtils {
$pdo = Db::pdo(); $pdo = Db::pdo();
if (!SINGLE_USER_MODE && DAEMON_UPDATE_LOGIN_LIMIT > 0) { if (!Config::get(Config::SINGLE_USER_MODE) && DAEMON_UPDATE_LOGIN_LIMIT > 0) {
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '".DAEMON_UPDATE_LOGIN_LIMIT." days'"; $login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '".DAEMON_UPDATE_LOGIN_LIMIT." days'";
} else { } else {
$login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL ".DAEMON_UPDATE_LOGIN_LIMIT." DAY)"; $login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL ".DAEMON_UPDATE_LOGIN_LIMIT." DAY)";
@ -71,7 +71,7 @@ class RSSUtils {
$login_thresh_qpart = ""; $login_thresh_qpart = "";
} }
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$update_limit_qpart = "AND (( $update_limit_qpart = "AND ((
ttrss_feeds.update_interval = 0 ttrss_feeds.update_interval = 0
AND ttrss_user_prefs.value != '-1' AND ttrss_user_prefs.value != '-1'
@ -96,7 +96,7 @@ class RSSUtils {
} }
// Test if feed is currently being updated by another process. // Test if feed is currently being updated by another process.
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$updstart_thresh_qpart = "AND (last_update_started IS NULL OR last_update_started < NOW() - INTERVAL '10 minutes')"; $updstart_thresh_qpart = "AND (last_update_started IS NULL OR last_update_started < NOW() - INTERVAL '10 minutes')";
} else { } else {
$updstart_thresh_qpart = "AND (last_update_started IS NULL OR last_update_started < DATE_SUB(NOW(), INTERVAL 10 MINUTE))"; $updstart_thresh_qpart = "AND (last_update_started IS NULL OR last_update_started < DATE_SUB(NOW(), INTERVAL 10 MINUTE))";
@ -106,7 +106,7 @@ class RSSUtils {
// Update the least recently updated feeds first // Update the least recently updated feeds first
$query_order = "ORDER BY last_updated"; $query_order = "ORDER BY last_updated";
if (DB_TYPE == "pgsql") $query_order .= " NULLS FIRST"; if (Config::get(Config::DB_TYPE) == "pgsql") $query_order .= " NULLS FIRST";
$query = "SELECT DISTINCT ttrss_feeds.feed_url, ttrss_feeds.last_updated $query = "SELECT DISTINCT ttrss_feeds.feed_url, ttrss_feeds.last_updated
FROM FROM
@ -182,7 +182,7 @@ class RSSUtils {
if (self::function_enabled('passthru')) { if (self::function_enabled('passthru')) {
$exit_code = 0; $exit_code = 0;
passthru(PHP_EXECUTABLE . " update.php --update-feed " . $tline["id"] . " --pidlock feed-" . $tline["id"] . " $quiet $log $log_level", $exit_code); passthru(Config::get(Config::PHP_EXECUTABLE) . " update.php --update-feed " . $tline["id"] . " --pidlock feed-" . $tline["id"] . " $quiet $log $log_level", $exit_code);
Debug::log(sprintf("<= %.4f (sec) exit code: %d", microtime(true) - $fstarted, $exit_code)); Debug::log(sprintf("<= %.4f (sec) exit code: %d", microtime(true) - $fstarted, $exit_code));
@ -275,7 +275,7 @@ class RSSUtils {
$pluginhost = new PluginHost(); $pluginhost = new PluginHost();
$user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid); $user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid);
$pluginhost->load(PLUGINS, PluginHost::KIND_ALL); $pluginhost->load(Config::get(Config::PLUGINS), PluginHost::KIND_ALL);
$pluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid); $pluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid);
//$pluginhost->load_data(); //$pluginhost->load_data();
@ -395,12 +395,12 @@ class RSSUtils {
$date_feed_processed = date('Y-m-d H:i'); $date_feed_processed = date('Y-m-d H:i');
$cache_filename = CACHE_DIR . "/feeds/" . sha1($fetch_url) . ".xml"; $cache_filename = Config::get(Config::CACHE_DIR) . "/feeds/" . sha1($fetch_url) . ".xml";
$pluginhost = new PluginHost(); $pluginhost = new PluginHost();
$user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid); $user_plugins = get_pref("_ENABLED_PLUGINS", $owner_uid);
$pluginhost->load(PLUGINS, PluginHost::KIND_ALL); $pluginhost->load(Config::get(Config::PLUGINS), PluginHost::KIND_ALL);
$pluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid); $pluginhost->load((string)$user_plugins, PluginHost::KIND_USER, $owner_uid);
//$pluginhost->load_data(); //$pluginhost->load_data();
@ -488,7 +488,7 @@ class RSSUtils {
} }
// cache vanilla feed data for re-use // cache vanilla feed data for re-use
if ($feed_data && !$auth_pass && !$auth_login && is_writable(CACHE_DIR . "/feeds")) { if ($feed_data && !$auth_pass && !$auth_login && is_writable(Config::get(Config::CACHE_DIR) . "/feeds")) {
$new_rss_hash = sha1($feed_data); $new_rss_hash = sha1($feed_data);
if ($new_rss_hash != $rss_hash) { if ($new_rss_hash != $rss_hash) {
@ -561,7 +561,7 @@ class RSSUtils {
Debug::log("language: $feed_language", Debug::$LOG_VERBOSE); Debug::log("language: $feed_language", Debug::$LOG_VERBOSE);
Debug::log("processing feed data...", Debug::$LOG_VERBOSE); Debug::log("processing feed data...", Debug::$LOG_VERBOSE);
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$favicon_interval_qpart = "favicon_last_checked < NOW() - INTERVAL '12 hour'"; $favicon_interval_qpart = "favicon_last_checked < NOW() - INTERVAL '12 hour'";
} else { } else {
$favicon_interval_qpart = "favicon_last_checked < DATE_SUB(NOW(), INTERVAL 12 HOUR)"; $favicon_interval_qpart = "favicon_last_checked < DATE_SUB(NOW(), INTERVAL 12 HOUR)";
@ -755,7 +755,7 @@ class RSSUtils {
$e->type, $e->length, $e->title, $e->width, $e->height); $e->type, $e->length, $e->title, $e->width, $e->height);
// Yet another episode of "mysql utf8_general_ci is gimped" // Yet another episode of "mysql utf8_general_ci is gimped"
if (DB_TYPE == "mysql" && MYSQL_CHARSET != "UTF8MB4") { if (Config::get(Config::DB_TYPE) == "mysql" && MYSQL_CHARSET != "UTF8MB4") {
for ($i = 0; $i < count($e_item); $i++) { for ($i = 0; $i < count($e_item); $i++) {
if (is_string($e_item[$i])) { if (is_string($e_item[$i])) {
$e_item[$i] = self::strip_utf8mb4($e_item[$i]); $e_item[$i] = self::strip_utf8mb4($e_item[$i]);
@ -833,7 +833,7 @@ class RSSUtils {
Debug::log("plugin data: $entry_plugin_data", Debug::$LOG_VERBOSE); Debug::log("plugin data: $entry_plugin_data", Debug::$LOG_VERBOSE);
// Workaround: 4-byte unicode requires utf8mb4 in MySQL. See https://tt-rss.org/forum/viewtopic.php?f=1&t=3377&p=20077#p20077 // Workaround: 4-byte unicode requires utf8mb4 in MySQL. See https://tt-rss.org/forum/viewtopic.php?f=1&t=3377&p=20077#p20077
if (DB_TYPE == "mysql" && MYSQL_CHARSET != "UTF8MB4") { if (Config::get(Config::DB_TYPE) == "mysql" && MYSQL_CHARSET != "UTF8MB4") {
foreach ($article as $k => $v) { foreach ($article as $k => $v) {
// i guess we'll have to take the risk of 4byte unicode labels & tags here // i guess we'll have to take the risk of 4byte unicode labels & tags here
if (is_string($article[$k])) { if (is_string($article[$k])) {
@ -1079,7 +1079,7 @@ class RSSUtils {
Debug::log("resulting RID: $entry_ref_id, IID: $entry_int_id", Debug::$LOG_VERBOSE); Debug::log("resulting RID: $entry_ref_id, IID: $entry_int_id", Debug::$LOG_VERBOSE);
if (DB_TYPE == "pgsql") if (Config::get(Config::DB_TYPE) == "pgsql")
$tsvector_qpart = "tsvector_combined = to_tsvector(:ts_lang, :ts_content),"; $tsvector_qpart = "tsvector_combined = to_tsvector(:ts_lang, :ts_content),";
else else
$tsvector_qpart = ""; $tsvector_qpart = "";
@ -1107,7 +1107,7 @@ class RSSUtils {
":lang" => $entry_language, ":lang" => $entry_language,
":id" => $ref_id]; ":id" => $ref_id];
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$params[":ts_lang"] = $feed_language; $params[":ts_lang"] = $feed_language;
$params[":ts_content"] = mb_substr(strip_tags($entry_title . " " . $entry_content), 0, 900000); $params[":ts_content"] = mb_substr(strip_tags($entry_title . " " . $entry_content), 0, 900000);
} }
@ -1375,7 +1375,7 @@ class RSSUtils {
$pdo = Db::pdo(); $pdo = Db::pdo();
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$pdo->query("DELETE FROM ttrss_error_log $pdo->query("DELETE FROM ttrss_error_log
WHERE created_at < NOW() - INTERVAL '7 days'"); WHERE created_at < NOW() - INTERVAL '7 days'");
} else { } else {
@ -1396,8 +1396,8 @@ class RSSUtils {
$num_deleted = 0; $num_deleted = 0;
if (is_writable(LOCK_DIRECTORY)) { if (is_writable(Config::get(Config::LOCK_DIRECTORY))) {
$files = glob(LOCK_DIRECTORY . "/*.lock"); $files = glob(Config::get(Config::LOCK_DIRECTORY) . "/*.lock");
if ($files) { if ($files) {
foreach ($files as $file) { foreach ($files as $file) {
@ -1589,9 +1589,9 @@ class RSSUtils {
$days = DAEMON_UNSUCCESSFUL_DAYS_LIMIT; $days = DAEMON_UNSUCCESSFUL_DAYS_LIMIT;
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_query = "last_successful_update < NOW() - INTERVAL '$days days' AND last_updated > NOW() - INTERVAL '1 days'"; $interval_query = "last_successful_update < NOW() - INTERVAL '$days days' AND last_updated > NOW() - INTERVAL '1 days'";
} else /* if (DB_TYPE == "mysql") */ { } else /* if (Config::get(Config::DB_TYPE) == "mysql") */ {
$interval_query = "last_successful_update < DATE_SUB(NOW(), INTERVAL $days DAY) AND last_updated > DATE_SUB(NOW(), INTERVAL 1 DAY)"; $interval_query = "last_successful_update < DATE_SUB(NOW(), INTERVAL $days DAY) AND last_updated > DATE_SUB(NOW(), INTERVAL 1 DAY)";
} }

View File

@ -2,7 +2,7 @@
class UserHelper { class UserHelper {
static function authenticate(string $login = null, string $password = null, bool $check_only = false, string $service = null) { static function authenticate(string $login = null, string $password = null, bool $check_only = false, string $service = null) {
if (!SINGLE_USER_MODE) { if (!Config::get(Config::SINGLE_USER_MODE)) {
$user_id = false; $user_id = false;
$auth_module = false; $auth_module = false;
@ -88,7 +88,7 @@ class UserHelper {
static function login_sequence() { static function login_sequence() {
$pdo = Db::pdo(); $pdo = Db::pdo();
if (SINGLE_USER_MODE) { if (Config::get(Config::SINGLE_USER_MODE)) {
@session_start(); @session_start();
self::authenticate("admin", null); self::authenticate("admin", null);
startup_gettext(); startup_gettext();
@ -98,7 +98,7 @@ class UserHelper {
if (empty($_SESSION["uid"])) { if (empty($_SESSION["uid"])) {
if (AUTH_AUTO_LOGIN && self::authenticate(null, null)) { if (Config::get(Config::AUTH_AUTO_LOGIN) && self::authenticate(null, null)) {
$_SESSION["ref_schema_version"] = get_schema_version(true); $_SESSION["ref_schema_version"] = get_schema_version(true);
} else { } else {
self::authenticate(null, null, true); self::authenticate(null, null, true);

View File

@ -1,6 +1,4 @@
<?php <?php
require_once "functions.php";
spl_autoload_register(function($class) { spl_autoload_register(function($class) {
$namespace = ''; $namespace = '';
$class_name = $class; $class_name = $class;

View File

@ -80,7 +80,9 @@
/* tunables end here */ /* tunables end here */
if (DB_TYPE == "pgsql") { require_once "autoload.php";
if (Config::get(Config::DB_TYPE) == "pgsql") {
define('SUBSTRING_FOR_DATE', 'SUBSTRING_FOR_DATE'); define('SUBSTRING_FOR_DATE', 'SUBSTRING_FOR_DATE');
} else { } else {
define('SUBSTRING_FOR_DATE', 'SUBSTRING'); define('SUBSTRING_FOR_DATE', 'SUBSTRING');
@ -375,9 +377,9 @@
} }
function file_is_locked($filename) { function file_is_locked($filename) {
if (file_exists(LOCK_DIRECTORY . "/$filename")) { if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/$filename")) {
if (function_exists('flock')) { if (function_exists('flock')) {
$fp = @fopen(LOCK_DIRECTORY . "/$filename", "r"); $fp = @fopen(Config::get(Config::LOCK_DIRECTORY) . "/$filename", "r");
if ($fp) { if ($fp) {
if (flock($fp, LOCK_EX | LOCK_NB)) { if (flock($fp, LOCK_EX | LOCK_NB)) {
flock($fp, LOCK_UN); flock($fp, LOCK_UN);
@ -397,11 +399,11 @@
} }
function make_lockfile($filename) { function make_lockfile($filename) {
$fp = fopen(LOCK_DIRECTORY . "/$filename", "w"); $fp = fopen(Config::get(Config::LOCK_DIRECTORY) . "/$filename", "w");
if ($fp && flock($fp, LOCK_EX | LOCK_NB)) { if ($fp && flock($fp, LOCK_EX | LOCK_NB)) {
$stat_h = fstat($fp); $stat_h = fstat($fp);
$stat_f = stat(LOCK_DIRECTORY . "/$filename"); $stat_f = stat(Config::get(Config::LOCK_DIRECTORY) . "/$filename");
if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
if ($stat_h["ino"] != $stat_f["ino"] || if ($stat_h["ino"] != $stat_f["ino"] ||
@ -444,15 +446,15 @@
} }
function is_prefix_https() { function is_prefix_https() {
return parse_url(SELF_URL_PATH, PHP_URL_SCHEME) == 'https'; return parse_url(Config::get(Config::SELF_URL_PATH), PHP_URL_SCHEME) == 'https';
} }
// this returns SELF_URL_PATH sans ending slash // this returns Config::get(Config::SELF_URL_PATH) sans ending slash
function get_self_url_prefix() { function get_self_url_prefix() {
if (strrpos(SELF_URL_PATH, "/") === strlen(SELF_URL_PATH)-1) { if (strrpos(Config::get(Config::SELF_URL_PATH), "/") === strlen(Config::get(Config::SELF_URL_PATH))-1) {
return substr(SELF_URL_PATH, 0, strlen(SELF_URL_PATH)-1); return substr(Config::get(Config::SELF_URL_PATH), 0, strlen(Config::get(Config::SELF_URL_PATH))-1);
} else { } else {
return SELF_URL_PATH; return Config::get(Config::SELF_URL_PATH);
} }
} }
@ -467,7 +469,7 @@
} // function encrypt_password } // function encrypt_password
function init_plugins() { function init_plugins() {
PluginHost::getInstance()->load(PLUGINS, PluginHost::KIND_ALL); PluginHost::getInstance()->load(Config::get(Config::PLUGINS), PluginHost::KIND_ALL);
return true; return true;
} }

View File

@ -79,7 +79,7 @@
}, },
bwLimitChange: function(elem) { bwLimitChange: function(elem) {
Cookie.set("ttrss_bwlimit", elem.checked, Cookie.set("ttrss_bwlimit", elem.checked,
<?php print SESSION_COOKIE_LIFETIME ?>); <?php print Config::get(Config::SESSION_COOKIE_LIFETIME) ?>);
} }
}; };
@ -122,7 +122,7 @@
onblur="UtilityApp.fetchProfiles()" onblur="UtilityApp.fetchProfiles()"
value="<?= $_SESSION["fake_password"] ?? "" ?>"/> value="<?= $_SESSION["fake_password"] ?? "" ?>"/>
</fieldset> </fieldset>
<?php if (strpos(PLUGINS, "auth_internal") !== false) { ?> <?php if (strpos(Config::get(Config::PLUGINS), "auth_internal") !== false) { ?>
<fieldset class="align-right"> <fieldset class="align-right">
<a href="public.php?op=forgotpass"><?= __("I forgot my password") ?></a> <a href="public.php?op=forgotpass"><?= __("I forgot my password") ?></a>
</fieldset> </fieldset>
@ -161,7 +161,7 @@
<div dojoType="dijit.Tooltip" connectId="safe_mode_label" position="below" style="display:none"> <div dojoType="dijit.Tooltip" connectId="safe_mode_label" position="below" style="display:none">
<?= __("Uses default theme and prevents all plugins from loading."); ?> <?= __("Uses default theme and prevents all plugins from loading."); ?>
</div> </div>
<?php if (SESSION_COOKIE_LIFETIME > 0) { ?> <?php if (Config::get(Config::SESSION_COOKIE_LIFETIME) > 0) { ?>
<fieldset class="narrow"> <fieldset class="narrow">
<label> </label> <label> </label>

View File

@ -21,7 +21,7 @@
$sth = $pdo->prepare("SELECT engine, table_name FROM information_schema.tables WHERE $sth = $pdo->prepare("SELECT engine, table_name FROM information_schema.tables WHERE
table_schema = ? AND table_name LIKE 'ttrss_%' AND engine != 'InnoDB'"); table_schema = ? AND table_name LIKE 'ttrss_%' AND engine != 'InnoDB'");
$sth->execute([DB_NAME]); $sth->execute([Config::get(Config::DB_NAME)]);
$bad_tables = []; $bad_tables = [];
@ -44,8 +44,8 @@
array_push($errors, "Please copy config.php-dist to config.php"); array_push($errors, "Please copy config.php-dist to config.php");
} }
if (strpos(PLUGINS, "auth_") === false) { if (strpos(Config::get(Config::PLUGINS), "auth_") === false) {
array_push($errors, "Please enable at least one authentication module via PLUGINS constant in config.php"); array_push($errors, "Please enable at least one authentication module via Config::get(Config::PLUGINS) constant in config.php");
} }
if (function_exists('posix_getuid') && posix_getuid() == 0) { if (function_exists('posix_getuid') && posix_getuid() == 0) {
@ -60,43 +60,25 @@
array_push($errors, "PHP UConverter class is missing, it's provided by the Internationalization (intl) module."); array_push($errors, "PHP UConverter class is missing, it's provided by the Internationalization (intl) module.");
} }
if (CONFIG_VERSION != EXPECTED_CONFIG_VERSION) { if (!is_writable(Config::get(Config::CACHE_DIR) . "/images")) {
array_push($errors, "Configuration file (config.php) has incorrect version. Update it with new options from config.php-dist and set CONFIG_VERSION to the correct value."); array_push($errors, "Image cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/images)");
} }
if (!is_writable(CACHE_DIR . "/images")) { if (!is_writable(Config::get(Config::CACHE_DIR) . "/upload")) {
array_push($errors, "Image cache is not writable (chmod -R 777 ".CACHE_DIR."/images)"); array_push($errors, "Upload cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/upload)");
} }
if (!is_writable(CACHE_DIR . "/upload")) { if (!is_writable(Config::get(Config::CACHE_DIR) . "/export")) {
array_push($errors, "Upload cache is not writable (chmod -R 777 ".CACHE_DIR."/upload)"); array_push($errors, "Data export cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/export)");
} }
if (!is_writable(CACHE_DIR . "/export")) { if (Config::get(Config::SINGLE_USER_MODE) && class_exists("PDO")) {
array_push($errors, "Data export cache is not writable (chmod -R 777 ".CACHE_DIR."/export)");
}
require_once "sanity_config.php";
if (GENERATED_CONFIG_CHECK != EXPECTED_CONFIG_VERSION) {
array_push($errors,
"Configuration option checker sanity_config.php is outdated, please recreate it using ./utils/regen_config_checks.sh");
}
foreach (get_required_defines() as $d) {
if (!defined($d)) {
array_push($errors,
"Required configuration file parameter $d is not defined in config.php. You might need to copy it from config.php-dist.");
}
}
if (SINGLE_USER_MODE && class_exists("PDO")) {
$pdo = Db::pdo(); $pdo = Db::pdo();
$res = $pdo->query("SELECT id FROM ttrss_users WHERE id = 1"); $res = $pdo->query("SELECT id FROM ttrss_users WHERE id = 1");
if (!$res->fetch()) { if (!$res->fetch()) {
array_push($errors, "SINGLE_USER_MODE is enabled in config.php but default admin account is not found."); array_push($errors, "Config::get(Config::SINGLE_USER_MODE) is enabled in config.php but default admin account is not found.");
} }
} }
@ -107,17 +89,17 @@
$ref_self_url_path = preg_replace("/\w+\.php$/", "", $ref_self_url_path); $ref_self_url_path = preg_replace("/\w+\.php$/", "", $ref_self_url_path);
} }
if (SELF_URL_PATH == "http://example.org/tt-rss/") { if (Config::get(Config::SELF_URL_PATH) == "http://example.org/tt-rss/") {
$hint = $ref_self_url_path ? "(possible value: <b>$ref_self_url_path</b>)" : ""; $hint = $ref_self_url_path ? "(possible value: <b>$ref_self_url_path</b>)" : "";
array_push($errors, array_push($errors,
"Please set SELF_URL_PATH to the correct value for your server: $hint"); "Please set Config::get(Config::SELF_URL_PATH) to the correct value for your server: $hint");
} }
if ($ref_self_url_path && if ($ref_self_url_path &&
(!defined('_SKIP_SELF_URL_PATH_CHECKS') || !_SKIP_SELF_URL_PATH_CHECKS) && (!defined('_SKIP_SELF_URL_PATH_CHECKS') || !_SKIP_SELF_URL_PATH_CHECKS) &&
SELF_URL_PATH != $ref_self_url_path && SELF_URL_PATH != mb_substr($ref_self_url_path, 0, mb_strlen($ref_self_url_path)-1)) { Config::get(Config::SELF_URL_PATH) != $ref_self_url_path && Config::get(Config::SELF_URL_PATH) != mb_substr($ref_self_url_path, 0, mb_strlen($ref_self_url_path)-1)) {
array_push($errors, array_push($errors,
"Please set SELF_URL_PATH to the correct value detected for your server: <b>$ref_self_url_path</b> (you're using: <b>" . SELF_URL_PATH . "</b>)"); "Please set Config::get(Config::SELF_URL_PATH) to the correct value detected for your server: <b>$ref_self_url_path</b> (you're using: <b>" . Config::get(Config::SELF_URL_PATH) . "</b>)");
} }
} }
@ -125,8 +107,8 @@
array_push($errors, "ICONS_DIR defined in config.php is not writable (chmod -R 777 ".ICONS_DIR.").\n"); array_push($errors, "ICONS_DIR defined in config.php is not writable (chmod -R 777 ".ICONS_DIR.").\n");
} }
if (!is_writable(LOCK_DIRECTORY)) { if (!is_writable(Config::get(Config::LOCK_DIRECTORY))) {
array_push($errors, "LOCK_DIRECTORY defined in config.php is not writable (chmod -R 777 ".LOCK_DIRECTORY.").\n"); array_push($errors, "Config::get(Config::LOCK_DIRECTORY) defined in config.php is not writable (chmod -R 777 ".Config::get(Config::LOCK_DIRECTORY).").\n");
} }
if (!function_exists("curl_init") && !ini_get("allow_url_fopen")) { if (!function_exists("curl_init") && !ini_get("allow_url_fopen")) {
@ -161,7 +143,7 @@
array_push($errors, "PHP support for DOMDocument is required, but was not found."); array_push($errors, "PHP support for DOMDocument is required, but was not found.");
} }
if (DB_TYPE == "mysql") { if (Config::get(Config::DB_TYPE) == "mysql") {
$bad_tables = check_mysql_tables(); $bad_tables = check_mysql_tables();
if (count($bad_tables) > 0) { if (count($bad_tables) > 0) {

View File

@ -1,3 +0,0 @@
<?php # This file has been generated at: Mon Feb 22 14:17:27 MSK 2021
define('GENERATED_CONFIG_CHECK', 26);
function get_required_defines() { return [ 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'SINGLE_USER_MODE', 'SIMPLE_UPDATE_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'FORCE_ARTICLE_PURGE', 'SESSION_COOKIE_LIFETIME', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'CHECK_FOR_UPDATES', 'PLUGINS', 'LOG_DESTINATION', 'CONFIG_VERSION']; }

View File

@ -5,10 +5,11 @@
require_once "config.php"; require_once "config.php";
require_once "autoload.php"; require_once "autoload.php";
require_once "functions.php";
require_once "errorhandler.php"; require_once "errorhandler.php";
require_once "lib/gettext/gettext.inc.php"; require_once "lib/gettext/gettext.inc.php";
$session_expire = min(2147483647 - time() - 1, max(SESSION_COOKIE_LIFETIME, 86400)); $session_expire = min(2147483647 - time() - 1, max(\Config::get(\Config::SESSION_COOKIE_LIFETIME), 86400));
$session_name = (!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME; $session_name = (!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME;
if (is_server_https()) { if (is_server_https()) {
@ -37,7 +38,7 @@
} }
function validate_session() { function validate_session() {
if (SINGLE_USER_MODE) return true; if (\Config::get(\Config::SINGLE_USER_MODE)) return true;
if (isset($_SESSION["ref_schema_version"]) && $_SESSION["ref_schema_version"] != session_get_schema_version()) { if (isset($_SESSION["ref_schema_version"]) && $_SESSION["ref_schema_version"] != session_get_schema_version()) {
$_SESSION["login_error_msg"] = $_SESSION["login_error_msg"] =
@ -144,7 +145,7 @@
return true; return true;
} }
if (!SINGLE_USER_MODE /* && DB_TYPE == "pgsql" */) { if (!\Config::get(\Config::SINGLE_USER_MODE)) {
session_set_save_handler('\Sessions\ttrss_open', session_set_save_handler('\Sessions\ttrss_open',
'\Sessions\ttrss_close', '\Sessions\ttrss_read', '\Sessions\ttrss_close', '\Sessions\ttrss_read',
'\Sessions\ttrss_write', '\Sessions\ttrss_destroy', '\Sessions\ttrss_write', '\Sessions\ttrss_destroy',

View File

@ -1,4 +1,5 @@
<?php <?php
if (!file_exists("config.php")) { if (!file_exists("config.php")) {
print "<b>Fatal Error</b>: You forgot to copy print "<b>Fatal Error</b>: You forgot to copy
<b>config.php-dist</b> to <b>config.php</b> and edit it.\n"; <b>config.php-dist</b> to <b>config.php</b> and edit it.\n";
@ -16,6 +17,7 @@
get_include_path()); get_include_path());
require_once "autoload.php"; require_once "autoload.php";
require_once "sessions.php"; require_once "sessions.php";
require_once "functions.php"; require_once "functions.php";
require_once "sanity_check.php"; require_once "sanity_check.php";

View File

@ -1,7 +1,7 @@
parameters: parameters:
level: 5 level: 5
ignoreErrors: ignoreErrors:
- '#Constant.*not found#' # - '#Constant.*not found#'
- '#Comparison operation ">" between int<1, max> and 0 is always true.#' - '#Comparison operation ">" between int<1, max> and 0 is always true.#'
- '#Access to an undefined property DOMNode::\$tagName.#' - '#Access to an undefined property DOMNode::\$tagName.#'
- '#Call to an undefined method DOMNode::(get|remove|set)Attribute\(\).#' - '#Call to an undefined method DOMNode::(get|remove|set)Attribute\(\).#'

View File

@ -134,7 +134,7 @@ class Af_Psql_Trgm extends Plugin {
title="<i class='material-icons'>extension</i> <?= __('Mark similar articles as read (af_psql_trgm)') ?>"> title="<i class='material-icons'>extension</i> <?= __('Mark similar articles as read (af_psql_trgm)') ?>">
<?php <?php
if (DB_TYPE != "pgsql") { if (Config::get(Config::DB_TYPE) != "pgsql") {
print_error("Database type not supported."); print_error("Database type not supported.");
} else { } else {
$res = $this->pdo->query("select 'similarity'::regproc"); $res = $this->pdo->query("select 'similarity'::regproc");
@ -258,7 +258,7 @@ class Af_Psql_Trgm extends Plugin {
function hook_article_filter($article) { function hook_article_filter($article) {
if (DB_TYPE != "pgsql") return $article; if (Config::get(Config::DB_TYPE) != "pgsql") return $article;
$res = $this->pdo->query("select 'similarity'::regproc"); $res = $this->pdo->query("select 'similarity'::regproc");
if (!$res || !$res->fetch()) return $article; if (!$res || !$res->fetch()) return $article;

View File

@ -530,7 +530,7 @@ class Af_RedditImgur extends Plugin {
$entry_guid = $article["guid_hashed"]; $entry_guid = $article["guid_hashed"];
$owner_uid = $article["owner_uid"]; $owner_uid = $article["owner_uid"];
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_qpart = "date_entered < NOW() - INTERVAL '1 day'"; $interval_qpart = "date_entered < NOW() - INTERVAL '1 day'";
} else { } else {
$interval_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY)"; $interval_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY)";

View File

@ -244,7 +244,7 @@ class Auth_Internal extends Auth_Base {
$tpl->readTemplateFromFile("password_change_template.txt"); $tpl->readTemplateFromFile("password_change_template.txt");
$tpl->setVariable('LOGIN', $row["login"]); $tpl->setVariable('LOGIN', $row["login"]);
$tpl->setVariable('TTRSS_HOST', SELF_URL_PATH); $tpl->setVariable('TTRSS_HOST', Config::get(Config::SELF_URL_PATH));
$tpl->addBlock('message'); $tpl->addBlock('message');

View File

@ -21,7 +21,7 @@ class Bookmarklets extends Plugin {
} }
function subscribe() { function subscribe() {
if (SINGLE_USER_MODE) { if (Config::get(Config::SINGLE_USER_MODE)) {
UserHelper::login_sequence(); UserHelper::login_sequence();
} }
@ -172,7 +172,7 @@ class Bookmarklets extends Plugin {
} }
function sharepopup() { function sharepopup() {
if (SINGLE_USER_MODE) { if (Config::get(Config::SINGLE_USER_MODE)) {
UserHelper::login_sequence(); UserHelper::login_sequence();
} }

View File

@ -14,7 +14,7 @@
require_once "db-prefs.php"; require_once "db-prefs.php";
function make_stampfile($filename) { function make_stampfile($filename) {
$fp = fopen(LOCK_DIRECTORY . "/$filename", "w"); $fp = fopen(Config::get(Config::LOCK_DIRECTORY) . "/$filename", "w");
if (flock($fp, LOCK_EX | LOCK_NB)) { if (flock($fp, LOCK_EX | LOCK_NB)) {
fwrite($fp, time() . "\n"); fwrite($fp, time() . "\n");
@ -30,9 +30,9 @@
$days = (int) $days; $days = (int) $days;
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$interval_query = "date_updated < NOW() - INTERVAL '$days days'"; $interval_query = "date_updated < NOW() - INTERVAL '$days days'";
} else /*if (DB_TYPE == "mysql") */ { } else /*if (Config::get(Config::DB_TYPE) == "mysql") */ {
$interval_query = "date_updated < DATE_SUB(NOW(), INTERVAL $days DAY)"; $interval_query = "date_updated < DATE_SUB(NOW(), INTERVAL $days DAY)";
} }
@ -224,7 +224,7 @@
$log = isset($options['log']) ? '--log '.$options['log'] : ''; $log = isset($options['log']) ? '--log '.$options['log'] : '';
$log_level = isset($options['log-level']) ? '--log-level '.$options['log-level'] : ''; $log_level = isset($options['log-level']) ? '--log-level '.$options['log-level'] : '';
passthru(PHP_EXECUTABLE . " " . $argv[0] ." --daemon-loop $quiet $log $log_level"); passthru(Config::get(Config::PHP_EXECUTABLE) . " " . $argv[0] ." --daemon-loop $quiet $log $log_level");
// let's enforce a minimum spawn interval as to not forkbomb the host // let's enforce a minimum spawn interval as to not forkbomb the host
$spawn_interval = max(60, DAEMON_SLEEP_INTERVAL); $spawn_interval = max(60, DAEMON_SLEEP_INTERVAL);
@ -277,7 +277,7 @@
Debug::log("clearing existing indexes..."); Debug::log("clearing existing indexes...");
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$sth = $pdo->query( "SELECT relname FROM $sth = $pdo->query( "SELECT relname FROM
pg_catalog.pg_class WHERE relname LIKE 'ttrss_%' pg_catalog.pg_class WHERE relname LIKE 'ttrss_%'
AND relname NOT LIKE '%_pkey' AND relname NOT LIKE '%_pkey'
@ -288,7 +288,7 @@
} }
while ($line = $sth->fetch()) { while ($line = $sth->fetch()) {
if (DB_TYPE == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
$statement = "DROP INDEX " . $line["relname"]; $statement = "DROP INDEX " . $line["relname"];
Debug::log($statement); Debug::log($statement);
} else { } else {
@ -299,9 +299,9 @@
$pdo->query($statement); $pdo->query($statement);
} }
Debug::log("reading indexes from schema for: " . DB_TYPE); Debug::log("reading indexes from schema for: " . Config::get(Config::DB_TYPE));
$fp = fopen("schema/ttrss_schema_" . DB_TYPE . ".sql", "r"); $fp = fopen("schema/ttrss_schema_" . Config::get(Config::DB_TYPE) . ".sql", "r");
if ($fp) { if ($fp) {
while ($line = fgets($fp)) { while ($line = fgets($fp)) {
$matches = array(); $matches = array();
@ -375,14 +375,14 @@
} }
if (isset($options["update-schema"])) { if (isset($options["update-schema"])) {
Debug::log("Checking for updates (" . DB_TYPE . ")..."); Debug::log("Checking for updates (" . Config::get(Config::DB_TYPE) . ")...");
$updater = new DbUpdater(Db::pdo(), DB_TYPE, SCHEMA_VERSION); $updater = new DbUpdater(Db::pdo(), Config::get(Config::DB_TYPE), SCHEMA_VERSION);
if ($updater->is_update_required()) { if ($updater->is_update_required()) {
Debug::log("Schema update required, version " . $updater->get_schema_version() . " to " . SCHEMA_VERSION); Debug::log("Schema update required, version " . $updater->get_schema_version() . " to " . SCHEMA_VERSION);
if (DB_TYPE == "mysql") if (Config::get(Config::DB_TYPE) == "mysql")
Debug::Log("READ THIS: Due to MySQL limitations, your database is not completely protected while updating.\n". Debug::Log("READ THIS: Due to MySQL limitations, your database is not completely protected while updating.\n".
"Errors may put it in an inconsistent state requiring manual rollback.\nBACKUP YOUR DATABASE BEFORE CONTINUING."); "Errors may put it in an inconsistent state requiring manual rollback.\nBACKUP YOUR DATABASE BEFORE CONTINUING.");
else else
@ -460,7 +460,7 @@
if (isset($options["list-plugins"])) { if (isset($options["list-plugins"])) {
$tmppluginhost = new PluginHost(); $tmppluginhost = new PluginHost();
$tmppluginhost->load_all($tmppluginhost::KIND_ALL); $tmppluginhost->load_all($tmppluginhost::KIND_ALL);
$enabled = array_map("trim", explode(",", PLUGINS)); $enabled = array_map("trim", explode(",", Config::get(Config::PLUGINS)));
echo "List of all available plugins:\n"; echo "List of all available plugins:\n";
@ -515,8 +515,8 @@
PluginHost::getInstance()->run_commands($options); PluginHost::getInstance()->run_commands($options);
if (file_exists(LOCK_DIRECTORY . "/$lock_filename")) if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/$lock_filename"))
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
fclose($lock_handle); fclose($lock_handle);
unlink(LOCK_DIRECTORY . "/$lock_filename"); unlink(Config::get(Config::LOCK_DIRECTORY) . "/$lock_filename");
?> ?>

View File

@ -98,9 +98,9 @@
function shutdown($caller_pid) { function shutdown($caller_pid) {
if ($caller_pid == posix_getpid()) { if ($caller_pid == posix_getpid()) {
if (file_exists(LOCK_DIRECTORY . "/update_daemon.lock")) { if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon.lock")) {
Debug::log("Removing lockfile (master)..."); Debug::log("Removing lockfile (master)...");
unlink(LOCK_DIRECTORY . "/update_daemon.lock"); unlink(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon.lock");
} }
} }
} }
@ -108,9 +108,9 @@
function task_shutdown() { function task_shutdown() {
$pid = posix_getpid(); $pid = posix_getpid();
if (file_exists(LOCK_DIRECTORY . "/update_daemon-$pid.lock")) { if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon-$pid.lock")) {
Debug::log("Removing task lockfile for PID $pid..."); Debug::log("Removing task lockfile for PID $pid...");
unlink(LOCK_DIRECTORY . "/update_daemon-$pid.lock"); unlink(Config::get(Config::LOCK_DIRECTORY) . "/update_daemon-$pid.lock");
} }
} }
@ -249,7 +249,7 @@
$my_pid = posix_getpid(); $my_pid = posix_getpid();
passthru(PHP_EXECUTABLE . " update.php --daemon-loop $quiet $log --task $j --pidlock $my_pid"); passthru(Config::get(Config::PHP_EXECUTABLE) . " update.php --daemon-loop $quiet $log --task $j --pidlock $my_pid");
sleep(1); sleep(1);

View File

@ -1,17 +0,0 @@
#!/bin/sh
DESTINATION="include/sanity_config.php"
echo "<?php # This file has been generated at: " `date` > $DESTINATION
echo -n "define('GENERATED_CONFIG_CHECK', " >> $DESTINATION
grep CONFIG_VERSION config.php-dist | awk -F ' |\)' '{ print $2 }' | xargs echo -n >> $DESTINATION
echo ");" >> $DESTINATION
echo -n "function get_required_defines() { return [ " >> $DESTINATION
grep define\( config.php-dist | awk -F\' '{ print "*" $2 "*," }' | grep -v DB_PORT | xargs echo -n | sed -e s/,$// -e s/*/\'/g >> $DESTINATION
echo "]; }" >> $DESTINATION