summaryrefslogtreecommitdiff
path: root/include/functions.php
diff options
context:
space:
mode:
Diffstat (limited to 'include/functions.php')
-rw-r--r--include/functions.php215
1 files changed, 89 insertions, 126 deletions
diff --git a/include/functions.php b/include/functions.php
index f870f3382..d916301fb 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -1,16 +1,9 @@
<?php
- define('EXPECTED_CONFIG_VERSION', 26);
define('SCHEMA_VERSION', 140);
define('LABEL_BASE_INDEX', -1024);
define('PLUGIN_FEED_BASE_INDEX', -128);
- define('COOKIE_LIFETIME_LONG', 86400*365);
-
- // this CSS file is included for everyone (if it exists in themes.local)
- // on login, registration, and main (index and prefs) pages
- define('LOCAL_OVERRIDE_STYLESHEET', '.local-overrides.css');
-
$fetch_last_error = false;
$fetch_last_error_code = false;
$fetch_last_content_type = false;
@@ -34,71 +27,31 @@
error_reporting(E_ALL & ~E_NOTICE);
}
- ini_set('display_errors', 0);
- ini_set('display_startup_errors', 0);
-
- require_once 'config.php';
-
- /**
- * Define a constant if not already defined
- */
- function define_default($name, $value) {
- defined($name) or define($name, $value);
- }
-
- /* Some tunables you can override in config.php using define(): */
-
- define_default('FEED_FETCH_TIMEOUT', 45);
- // How may seconds to wait for response when requesting feed from a site
- define_default('FEED_FETCH_NO_CACHE_TIMEOUT', 15);
- // How may seconds to wait for response when requesting feed from a
- // site when that feed wasn't cached before
- define_default('FILE_FETCH_TIMEOUT', 45);
- // Default timeout when fetching files from remote sites
- define_default('FILE_FETCH_CONNECT_TIMEOUT', 15);
- // How many seconds to wait for initial response from website when
- // fetching files from remote sites
- define_default('DAEMON_UPDATE_LOGIN_LIMIT', 30);
- // stop updating feeds if users haven't logged in for X days
- define_default('DAEMON_FEED_LIMIT', 500);
- // feed limit for one update batch
- define_default('DAEMON_SLEEP_INTERVAL', 120);
- // default sleep interval between feed updates (sec)
- define_default('MAX_CACHE_FILE_SIZE', 64*1024*1024);
- // do not cache files larger than that (bytes)
- define_default('MAX_DOWNLOAD_FILE_SIZE', 16*1024*1024);
- // do not download general files larger than that (bytes)
- define_default('CACHE_MAX_DAYS', 7);
- // max age in days for various automatically cached (temporary) files
- define_default('MAX_CONDITIONAL_INTERVAL', 3600*12);
- // max interval between forced unconditional updates for servers
- // not complying with http if-modified-since (seconds)
- // define_default('MAX_FETCH_REQUESTS_PER_HOST', 25);
- // a maximum amount of allowed HTTP requests per destination host
- // during a single update (i.e. within PHP process lifetime)
- // this is used to not cause excessive load on the origin server on
- // e.g. feed subscription when all articles are being processes
- // (not implemented)
- define_default('DAEMON_UNSUCCESSFUL_DAYS_LIMIT', 30);
- // automatically disable updates for feeds which failed to
- // update for this amount of days; 0 disables
-
- /* tunables end here */
-
- if (DB_TYPE == "pgsql") {
+ ini_set('display_errors', "false");
+ ini_set('display_startup_errors', "false");
+
+ // config.php is optional
+ if (stream_resolve_include_path("config.php"))
+ require_once "config.php";
+
+ require_once "autoload.php";
+
+ if (Config::get(Config::DB_TYPE) == "pgsql") {
define('SUBSTRING_FOR_DATE', 'SUBSTRING_FOR_DATE');
} else {
define('SUBSTRING_FOR_DATE', 'SUBSTRING');
}
- /**
- * Return available translations names.
- *
- * @access public
- * @return array A array of available translations.
- */
+ function get_pref($pref_name, $user_id = false, $die_on_error = false) {
+ return Db_Prefs::get()->read($pref_name, $user_id, $die_on_error);
+ }
+
+ function set_pref($pref_name, $value, $user_id = false, $strip_tags = true) {
+ return Db_Prefs::get()->write($pref_name, $value, $user_id, $strip_tags);
+ }
+
function get_translations() {
- $tr = array(
+ $t = array(
"auto" => __("Detect automatically"),
"ar_SA" => "العربيّة (Arabic)",
"bg_BG" => "Bulgarian",
@@ -129,38 +82,76 @@
"fi_FI" => "Suomi",
"tr_TR" => "Türkçe");
- return $tr;
+ return $t;
}
- require_once "lib/accept-to-gettext.php";
require_once "lib/gettext/gettext.inc.php";
function startup_gettext() {
- # Get locale from Accept-Language header
- if (version_compare(PHP_VERSION, '8.0.0', '<')) {
- $lang = al2gt(array_keys(get_translations()), "text/html");
- } else {
- $lang = ""; // FIXME: do something with accept-to-gettext.php
- }
+ $selected_locale = "";
+
+ // https://www.codingwithjesse.com/blog/use-accept-language-header/
+ if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ $valid_langs = [];
+ $translations = array_keys(get_translations());
+
+ array_shift($translations); // remove "auto"
+
+ // full locale first
+ foreach ($translations as $t) {
+ $lang = strtolower(str_replace("_", "-", (string)$t));
+ $valid_langs[$lang] = $t;
+
+ $lang = substr($lang, 0, 2);
+ if (!isset($valid_langs[$lang]))
+ $valid_langs[$lang] = $t;
+ }
+
+ // break up string into pieces (languages and q factors)
+ preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
+ $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
+
+ if (count($lang_parse[1])) {
+ // create a list like "en" => 0.8
+ $langs = array_combine($lang_parse[1], $lang_parse[4]);
- if (defined('_TRANSLATION_OVERRIDE_DEFAULT')) {
- $lang = _TRANSLATION_OVERRIDE_DEFAULT;
+ if (is_array($langs)) {
+ // set default to 1 for any without q factor
+ foreach ($langs as $lang => $val) {
+ if ($val === '') $langs[$lang] = 1;
+ }
+
+ // sort list based on value
+ arsort($langs, SORT_NUMERIC);
+
+ foreach (array_keys($langs) as $lang) {
+ $lang = strtolower($lang);
+
+ foreach ($valid_langs as $vlang => $vlocale) {
+ if ($vlang == $lang) {
+ $selected_locale = $vlocale;
+ break 2;
+ }
+ }
+ }
+ }
+ }
}
if (!empty($_SESSION["uid"]) && get_schema_version() >= 120) {
- $pref_lang = get_pref("USER_LANGUAGE", $_SESSION["uid"]);
+ $pref_locale = get_pref("USER_LANGUAGE", $_SESSION["uid"]);
- if ($pref_lang && $pref_lang != 'auto') {
- $lang = $pref_lang;
+ if (!empty($pref_locale) && $pref_locale != 'auto') {
+ $selected_locale = $pref_locale;
}
}
- if ($lang) {
+ if ($selected_locale) {
if (defined('LC_MESSAGES')) {
- _setlocale(LC_MESSAGES, $lang);
+ _setlocale(LC_MESSAGES, $selected_locale);
} else if (defined('LC_ALL')) {
- _setlocale(LC_ALL, $lang);
+ _setlocale(LC_ALL, $selected_locale);
}
_bindtextdomain("messages", "locale");
@@ -169,8 +160,8 @@
}
}
- require_once 'db-prefs.php';
require_once 'controls.php';
+ require_once 'controls_compat.php';
define('SELF_USER_AGENT', 'Tiny Tiny RSS/' . get_version() . ' (http://tt-rss.org/)');
ini_set('user_agent', SELF_USER_AGENT);
@@ -185,7 +176,7 @@
// @deprecated
function getFeedUnread($feed, $is_cat = false) {
- return Feeds::getFeedArticles($feed, $is_cat, true, $_SESSION["uid"]);
+ return Feeds::_get_counters($feed, $is_cat, true, $_SESSION["uid"]);
}
// @deprecated
@@ -248,7 +239,7 @@
} else if (is_string($param)) {
return trim(strip_tags($param));
} else {
- return trim($param);
+ return $param;
}
}
@@ -278,7 +269,7 @@
}
function validate_csrf($csrf_token) {
- return isset($csrf_token) && hash_equals($_SESSION['csrf_token'], $csrf_token);
+ return isset($csrf_token) && hash_equals($_SESSION['csrf_token'] ?? "", $csrf_token);
}
function truncate_string($str, $max_len, $suffix = '&hellip;') {
@@ -332,24 +323,10 @@
}
}
- function sanity_check() {
- require_once 'errors.php';
- $ERRORS = get_error_types();
-
- $error_code = 0;
- $schema_version = get_schema_version(true);
-
- if ($schema_version != SCHEMA_VERSION) {
- $error_code = 5;
- }
-
- return array("code" => $error_code, "message" => $ERRORS[$error_code]);
- }
-
function file_is_locked($filename) {
- if (file_exists(LOCK_DIRECTORY . "/$filename")) {
+ if (file_exists(Config::get(Config::LOCK_DIRECTORY) . "/$filename")) {
if (function_exists('flock')) {
- $fp = @fopen(LOCK_DIRECTORY . "/$filename", "r");
+ $fp = @fopen(Config::get(Config::LOCK_DIRECTORY) . "/$filename", "r");
if ($fp) {
if (flock($fp, LOCK_EX | LOCK_NB)) {
flock($fp, LOCK_UN);
@@ -369,11 +346,11 @@
}
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)) {
$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 ($stat_h["ino"] != $stat_f["ino"] ||
@@ -397,7 +374,7 @@
}
function uniqid_short() {
- return uniqid(base_convert(rand(), 10, 36));
+ return uniqid(base_convert((string)rand(), 10, 36));
}
function T_sprintf() {
@@ -416,15 +393,15 @@
}
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() {
- if (strrpos(SELF_URL_PATH, "/") === strlen(SELF_URL_PATH)-1) {
- return substr(SELF_URL_PATH, 0, strlen(SELF_URL_PATH)-1);
+ if (strrpos(Config::get(Config::SELF_URL_PATH), "/") === strlen(Config::get(Config::SELF_URL_PATH))-1) {
+ return substr(Config::get(Config::SELF_URL_PATH), 0, strlen(Config::get(Config::SELF_URL_PATH))-1);
} else {
- return SELF_URL_PATH;
+ return Config::get(Config::SELF_URL_PATH);
}
}
@@ -439,7 +416,7 @@
} // function encrypt_password
function init_plugins() {
- PluginHost::getInstance()->load(PLUGINS, PluginHost::KIND_ALL);
+ PluginHost::getInstance()->load(Config::get(Config::PLUGINS), PluginHost::KIND_ALL);
return true;
}
@@ -542,20 +519,6 @@
return file_exists("themes/$theme") || file_exists("themes.local/$theme");
}
- /**
- * @SuppressWarnings(unused)
- */
- function error_json($code) {
- require_once "errors.php";
- $ERRORS = get_error_types();
-
- @$message = $ERRORS[$code];
-
- return json_encode(array("error" =>
- array("code" => $code, "message" => $message)));
-
- }
-
function arr_qmarks($arr) {
return str_repeat('?,', count($arr) - 1) . '?';
}
@@ -592,7 +555,7 @@
$ttrss_version['version'] = "UNKNOWN (Unsupported)";
date_default_timezone_set('UTC');
- $root_dir = dirname(dirname(__FILE__));
+ $root_dir = dirname(__DIR__);
if (PHP_OS === "Darwin") {
$ttrss_version['version'] = "UNKNOWN (Unsupported, Darwin)";