X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.php;h=9bd98795b646009b0126868ee3efd06ecf7218ab;hb=02008cb19ac99727889cca05c7eddfbeef30d684;hp=f2fa61b6f1c3fd23c8f520711bedd7f0a312d92a;hpb=4ab4d3640be960e7ae2749665f1fb91592fa614a;p=tt-rss.git diff --git a/functions.php b/functions.php index f2fa61b6..9bd98795 100644 --- a/functions.php +++ b/functions.php @@ -13,7 +13,9 @@ "auto" => "Detect automatically", "en_US" => "English", "fr_FR" => "Français", + "nb_NO" => "Norsk Bokmål", "ru_RU" => "Русский", + "pt_BR" => "Portuguese/Brazil", "zh_CN" => "Simplified Chinese"); return $tr; @@ -61,6 +63,8 @@ require_once 'errors.php'; require_once 'version.php'; + require_once 'phpmailer/class.phpmailer.php'; + define('MAGPIE_USER_AGENT_EXT', ' (Tiny Tiny RSS/' . VERSION . ')'); define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); @@ -71,12 +75,6 @@ require_once 'magpierss/rss_utils.inc'; } - include_once "tw/tw-config.php"; - include_once "tw/tw.php"; - include_once TW_SETUP . "paranoya.php"; - - $tw_parser = new twParser(); - function _debug($msg) { $ts = strftime("%H:%M:%S", time()); print "[$ts] $msg\n"; @@ -84,8 +82,26 @@ function purge_feed($link, $feed_id, $purge_interval, $debug = false) { + if (!$purge_interval) $purge_interval = feed_purge_interval($link, $feed_id); + $rows = -1; + $result = db_query($link, + "SELECT owner_uid FROM ttrss_feeds WHERE id = '$feed_id'"); + + $owner_uid = false; + + if (db_num_rows($result) == 1) { + $owner_uid = db_fetch_result($result, 0, "owner_uid"); + } + + if (!$owner_uid) return; + + $purge_unread = get_pref($link, "PURGE_UNREAD_ARTICLES", + $owner_uid, false); + + if (!$purge_unread) $query_limit = " unread = false AND "; + if (DB_TYPE == "pgsql") { /* $result = db_query($link, "DELETE FROM ttrss_user_entries WHERE marked = false AND feed_id = '$feed_id' AND @@ -100,6 +116,7 @@ ttrss_entries.id = ref_id AND marked = false AND feed_id = '$feed_id' AND + $query_limit ttrss_entries.date_entered < NOW() - INTERVAL '$purge_interval days'"); } else { @@ -109,6 +126,7 @@ WHERE ttrss_entries.id = ref_id AND marked = false AND feed_id = '$feed_id' AND + $query_limit ttrss_entries.date_entered < NOW() - INTERVAL '$purge_interval days'"); } @@ -126,6 +144,7 @@ WHERE ttrss_entries.id = ref_id AND marked = false AND feed_id = '$feed_id' AND + $query_limit ttrss_entries.date_entered < DATE_SUB(NOW(), INTERVAL $purge_interval DAY)"); $rows = mysql_affected_rows($link); @@ -178,9 +197,33 @@ } // purge orphaned posts in main content table - db_query($link, "DELETE FROM ttrss_entries WHERE + $result = db_query($link, "DELETE FROM ttrss_entries WHERE (SELECT COUNT(int_id) FROM ttrss_user_entries WHERE ref_id = id) = 0"); + if ($do_output) { + $rows = db_affected_rows($link, $result); + _debug("Purged $rows orphaned posts."); + } + + } + + function feed_purge_interval($link, $feed_id) { + + $result = db_query($link, "SELECT purge_interval, owner_uid FROM ttrss_feeds + WHERE id = '$feed_id'"); + + if (db_num_rows($result) == 1) { + $purge_interval = db_fetch_result($result, 0, "purge_interval"); + $owner_uid = db_fetch_result($result, 0, "owner_uid"); + + if ($purge_interval == 0) $purge_interval = get_pref($link, + 'PURGE_OLD_DAYS', $user_id); + + return $purge_interval; + + } else { + return -1; + } } function purge_old_posts($link) { @@ -207,6 +250,25 @@ (SELECT COUNT(int_id) FROM ttrss_user_entries WHERE ref_id = id) = 0"); } + function get_feed_update_interval($link, $feed_id) { + $result = db_query($link, "SELECT owner_uid, update_interval FROM + ttrss_feeds WHERE id = '$feed_id'"); + + if (db_num_rows($result) == 1) { + $update_interval = db_fetch_result($result, 0, "update_interval"); + $owner_uid = db_fetch_result($result, 0, "owner_uid"); + + if ($update_interval != 0) { + return $update_interval; + } else { + return get_pref($link, 'DEFAULT_UPDATE_INTERVAL', $owner_uid, false); + } + + } else { + return -1; + } + } + function update_all_feeds($link, $fetch, $user_id = false, $force_daemon = false) { if (WEB_DEMO_MODE) return; @@ -398,7 +460,7 @@ function update_rss_feed($link, $feed_url, $feed, $ignore_daemon = false) { - if (DAEMON_REFRESH_ONLY && !$_GET["daemon"] && !$ignore_daemon) { + if (!$_GET["daemon"] && !$ignore_daemon) { return; } @@ -406,13 +468,36 @@ _debug("update_rss_feed: start"); } - $result = db_query($link, "SELECT update_interval,auth_login,auth_pass - FROM ttrss_feeds WHERE id = '$feed'"); + if (DB_TYPE == "pgsql") { + $updstart_thresh_qpart = "(ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started >= NOW() - INTERVAL '120 seconds')"; + } else { + $updstart_thresh_qpart = "(ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started >= DATE_SUB(NOW(), INTERVAL 120 SECOND))"; + } + + $result = db_query($link, "SELECT id,update_interval,auth_login, + auth_pass,cache_images + FROM ttrss_feeds WHERE id = '$feed' AND $updstart_thresh_qpart"); + + if (db_num_rows($result) == 0) { + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("update_rss_feed: feed $feed [$feed_url] NOT FOUND/SKIPPED"); + } + return; + } + + db_query($link, "UPDATE ttrss_feeds SET last_update_started = NOW() + WHERE id = '$feed'"); $auth_login = db_fetch_result($result, 0, "auth_login"); $auth_pass = db_fetch_result($result, 0, "auth_pass"); + if (!ENABLE_SIMPLEPIE) { + $auth_login = urlencode($auth_login); + $auth_pass = urlencode($auth_pass); + } + $update_interval = db_fetch_result($result, 0, "update_interval"); + $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); if ($update_interval < 0) { return; } @@ -441,11 +526,34 @@ if (!ENABLE_SIMPLEPIE) { $rss = fetch_rss($fetch_url); } else { + if (!is_dir(SIMPLEPIE_CACHE_DIR)) { + mkdir(SIMPLEPIE_CACHE_DIR); + } + $rss = new SimplePie(); $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT); - $rss->set_timeout(MAGPIE_FETCH_TIME_OUT); +// $rss->set_timeout(MAGPIE_FETCH_TIME_OUT); $rss->set_feed_url($fetch_url); $rss->set_output_encoding('UTF-8'); + + if (SIMPLEPIE_CACHE_IMAGES && $cache_images) { + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("enabling image cache"); + } + + $rss->set_image_handler('./image.php', 'i'); + } + + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("feed update interval (sec): " . + get_feed_update_interval($link, $feed)*60); + } + + if (is_dir(SIMPLEPIE_CACHE_DIR)) { + $rss->set_cache_location(SIMPLEPIE_CACHE_DIR); + $rss->set_cache_duration(get_feed_update_interval($link, $feed) * 60); + } + $rss->init(); } @@ -499,7 +607,7 @@ if (!$registered_title || $registered_title == "[Unknown]") { if (ENABLE_SIMPLEPIE) { - $feed_title = $rss->get_title(); + $feed_title = db_escape_string($rss->get_title()); } else { $feed_title = db_escape_string($rss->channel["title"]); } @@ -596,6 +704,11 @@ foreach ($iterator as $item) { + if ($_GET['xdebug']) { + print_r($item); + + } + if (ENABLE_SIMPLEPIE) { $entry_guid = $item->get_id(); if (!$entry_guid) $entry_guid = $item->get_link(); @@ -630,7 +743,11 @@ if ($rss_1_date != "") $entry_timestamp = parse_w3cdtf($rss_1_date); if ($rss_2_date != "") $entry_timestamp = strtotime($rss_2_date); } - + + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("update_rss_feed: date $entry_timestamp"); + } + if ($entry_timestamp == "" || $entry_timestamp == -1 || !$entry_timestamp) { $entry_timestamp = time(); $no_orig_date = 'true'; @@ -654,7 +771,11 @@ if (!$entry_link) $entry_link = $item["link"]; } - if (!$entry_title) continue; + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("update_rss_feed: title $entry_title"); + } + + if (!$entry_title) $entry_title = date("Y-m-d H:i:s", $entry_timestamp);; $entry_link = strip_tags($entry_link); @@ -665,6 +786,10 @@ if (!$entry_content) $entry_content = $item["content:encoded"]; if (!$entry_content) $entry_content = $item["content"]; + + // Magpie bugs are getting ridiculous + if (trim($entry_content) == "Array") $entry_content = false; + if (!$entry_content) $entry_content = $item["atom_content"]; if (!$entry_content) $entry_content = $item["summary"]; if (!$entry_content) $entry_content = $item["description"]; @@ -673,19 +798,21 @@ if (is_array($entry_content)) { $entry_content = $entry_content["encoded"]; if (!$entry_content) $entry_content = $entry_content["escaped"]; - } + } } -// print_r($item); -// print_r(htmlspecialchars($entry_content)); -// print "
"; + if ($_GET["xdebug"]) { + print "update_rss_feed: content: "; + print_r(htmlspecialchars($entry_content)); + } $entry_content_unescaped = $entry_content; if (ENABLE_SIMPLEPIE) { $entry_comments = strip_tags($item->data["comments"]); if ($item->get_author()) { - $entry_author = $item->get_author()->get_name(); + $entry_author_item = $item->get_author(); + $entry_author = $entry_author_item->get_name(); } } else { $entry_comments = strip_tags($item["comments"]); @@ -714,6 +841,7 @@ if (preg_match('/^[\t\n\r ]*$/', $entry_author)) $entry_author = ''; $entry_guid = db_escape_string(strip_tags($entry_guid)); + $entry_guid = mb_substr($entry_guid, 0, 250); $result = db_query($link, "SELECT id FROM ttrss_entries WHERE guid = '$entry_guid'"); @@ -741,7 +869,7 @@ $additional_tags = array(); $additional_tags_src = $item->get_categories(); - + if (is_array($additional_tags_src)) { foreach ($additional_tags_src as $tobj) { array_push($additional_tags, $tobj->get_term()); @@ -761,14 +889,21 @@ if ($t_ctr == 0) { $additional_tags = false; - } else if ($t_ctr == 1) { + } else if ($t_ctr > 0) { $additional_tags = array($item['category']); - } else { - $additional_tags = array(); + + if ($item['category@term']) { + array_push($additional_tags, $item['category@term']); + } + for ($i = 0; $i <= $t_ctr; $i++ ) { if ($item["category#$i"]) { array_push($additional_tags, $item["category#$i"]); } + + if ($item["category#$i@term"]) { + array_push($additional_tags, $item["category#$i@term"]); + } } } @@ -776,10 +911,9 @@ $t_ctr = $item['dc']['subject#']; - if ($t_ctr == 1) { + if ($t_ctr > 0) { $additional_tags = array($item['dc']['subject']); - } else if ($t_ctr > 1) { - $additional_tags = array(); + for ($i = 0; $i <= $t_ctr; $i++ ) { if ($item['dc']["subject#$i"]) { array_push($additional_tags, $item['dc']["subject#$i"]); @@ -788,6 +922,45 @@ } } + // enclosures + + $enclosures = array(); + + if (ENABLE_SIMPLEPIE) { + $encs = $item->get_enclosures(); + + if (is_array($encs)) { + foreach ($encs as $e) { + $e_item = array( + $e->link, $e->type, $e->length); + + array_push($enclosures, $e_item); + } + } + + } else { + $e_ctr = $item['enclosure#']; + + if ($e_ctr > 0) { + $e_item = array($item['enclosure@url'], + $item['enclosure@type'], + $item['enclosure@length']); + + array_push($enclosures, $e_item); + + for ($i = 0; $i <= $e_ctr; $i++ ) { + + if ($item["enclosure#$i@url"]) { + $e_item = array($item["enclosure#$i@url"], + $item["enclosure#$i@type"], + $item["enclosure#$i@length"]); + array_push($enclosures, $e_item); + } + } + } + + } + # sanitize content // $entry_content = sanitize_rss($entry_content); @@ -854,6 +1027,9 @@ ttrss_entries WHERE guid = '$entry_guid'"); + $entry_ref_id = 0; + $entry_int_id = 0; + if (db_num_rows($result) == 1) { if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { @@ -868,6 +1044,7 @@ 0, "date_entered")); $ref_id = db_fetch_result($result, 0, "id"); + $entry_ref_id = $ref_id; // check for user post link to main table @@ -897,7 +1074,7 @@ // error_reporting (DEFAULT_ERROR_LEVEL); $result = db_query($link, - "SELECT ref_id FROM ttrss_user_entries WHERE + "SELECT ref_id, int_id FROM ttrss_user_entries WHERE ref_id = '$ref_id' AND owner_uid = '$owner_uid' $dupcheck_qpart"); @@ -933,8 +1110,24 @@ (ref_id, owner_uid, feed_id, unread, last_read, marked, published) VALUES ('$ref_id', '$owner_uid', '$feed', $unread, $last_read_qpart, $marked, $published)"); + + $result = db_query($link, + "SELECT int_id FROM ttrss_user_entries WHERE + ref_id = '$ref_id' AND owner_uid = '$owner_uid' AND + feed_id = '$feed' LIMIT 1"); + + if (db_num_rows($result) == 1) { + $entry_int_id = db_fetch_result($result, 0, "int_id"); + } + } else { + $entry_ref_id = db_fetch_result($result, 0, "ref_id"); + $entry_int_id = db_fetch_result($result, 0, "int_id"); } - + + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("update_rss_feed: RID: $entry_ref_id, IID: $entry_int_id"); + } + $post_needs_update = false; if (get_pref($link, "UPDATE_POST_ON_CHECKSUM_CHANGE", $owner_uid, false) && @@ -986,6 +1179,33 @@ db_query($link, "COMMIT"); + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + _debug("update_rss_feed: looking for enclosures..."); + } + + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { + print_r($enclosures); + } + + db_query($link, "BEGIN"); + + foreach ($enclosures as $enc) { + $enc_url = db_escape_string($enc[0]); + $enc_type = db_escape_string($enc[1]); + $enc_dur = db_escape_string($enc[2]); + + $result = db_query($link, "SELECT id FROM ttrss_enclosures + WHERE content_url = '$enc_url' AND post_id = '$entry_ref_id'"); + + if (db_num_rows($result) == 0) { + db_query($link, "INSERT INTO ttrss_enclosures + (content_url, content_type, title, duration, post_id) VALUES + ('$enc_url', '$enc_type', '', '$enc_dur', '$entry_ref_id')"); + } + } + + db_query($link, "COMMIT"); + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { _debug("update_rss_feed: looking for tags..."); } @@ -1041,17 +1261,6 @@ db_query($link, "BEGIN"); - $result = db_query($link, "SELECT id,int_id - FROM ttrss_entries,ttrss_user_entries - WHERE guid = '$entry_guid' - AND feed_id = '$feed' AND ref_id = id - AND owner_uid = '$owner_uid'"); - - if (db_num_rows($result) == 1) { - - $entry_id = db_fetch_result($result, 0, "id"); - $entry_int_id = db_fetch_result($result, 0, "int_id"); - foreach ($entry_tags as $tag) { $tag = sanitize_tag($tag); @@ -1072,7 +1281,7 @@ VALUES ('$owner_uid','$tag', '$entry_int_id')"); } } - } + db_query($link, "COMMIT"); } @@ -1105,6 +1314,10 @@ last_updated = NOW() WHERE id = '$feed'"); } + if (ENABLE_SIMPLEPIE) { + unset($rss); + } + if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) { _debug("update_rss_feed: done"); } @@ -1358,16 +1571,23 @@ if (!SINGLE_USER_MODE) { - $pwd_hash = 'SHA1:' . sha1($password); + $pwd_hash1 = encrypt_password($password); + $pwd_hash2 = encrypt_password($password, $login); + + if (defined('ALLOW_REMOTE_USER_AUTH') && ALLOW_REMOTE_USER_AUTH + && $_SERVER["REMOTE_USER"]) { + + $login = db_escape_string($_SERVER["REMOTE_USER"]); - if ($force_auth && defined('_DEBUG_USER_SWITCH')) { $query = "SELECT id,login,access_level FROM ttrss_users WHERE - login = '$login'"; + login = '$login'"; + } else { - $query = "SELECT id,login,access_level + $query = "SELECT id,login,access_level,pwd_hash FROM ttrss_users WHERE - login = '$login' AND pwd_hash = '$pwd_hash'"; + login = '$login' AND (pwd_hash = '$pwd_hash1' OR + pwd_hash = '$pwd_hash2')"; } $result = db_query($link, $query); @@ -1384,6 +1604,7 @@ $_SESSION["theme"] = $user_theme; $_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"]; + $_SESSION["pwd_hash"] = db_fetch_result($result, 0, "pwd_hash"); initialize_user_prefs($link, $_SESSION["uid"]); @@ -1438,7 +1659,7 @@ db_query($link, "insert into ttrss_labels (owner_uid,sql_exp,description) values ('$uid','last_read is null and unread = false', 'Updated articles')"); - + db_query($link, "insert into ttrss_feeds (owner_uid,title,feed_url) values ('$uid', 'Tiny Tiny RSS: New Releases', 'http://tt-rss.spb.ru/releases.rss')"); @@ -1460,6 +1681,10 @@ } function validate_session($link) { + if (SINGLE_USER_MODE) { + return true; + } + if (SESSION_CHECK_ADDRESS && $_SESSION["uid"]) { if ($_SESSION["ip_address"]) { if ($_SESSION["ip_address"] != $_SERVER["REMOTE_ADDR"]) { @@ -1469,6 +1694,18 @@ } } + if ($_SESSION["uid"]) { + + $result = db_query($link, + "SELECT pwd_hash FROM ttrss_users WHERE id = '".$_SESSION["uid"]."'"); + + $pwd_hash = db_fetch_result($result, 0, "pwd_hash"); + + if ($pwd_hash != $_SESSION["pwd_hash"]) { + return false; + } + } + /* if ($_SESSION["cookie_lifetime"] && $_SESSION["uid"]) { //print_r($_SESSION); @@ -1538,7 +1775,7 @@ function truncate_string($str, $max_len) { if (mb_strlen($str, "utf-8") > $max_len - 3) { - return mb_substr($str, 0, $max_len, "utf-8") . "..."; + return mb_substr($str, 0, $max_len, "utf-8") . "…"; } else { return $str; } @@ -1630,23 +1867,25 @@ } function file_is_locked($filename) { - error_reporting(0); - $fp = fopen($filename, "r"); - error_reporting(DEFAULT_ERROR_LEVEL); - if ($fp) { - if (flock($fp, LOCK_EX | LOCK_NB)) { - flock($fp, LOCK_UN); + if (function_exists('flock')) { + error_reporting(0); + $fp = fopen(LOCK_DIRECTORY . "/$filename", "r"); + error_reporting(DEFAULT_ERROR_LEVEL); + if ($fp) { + if (flock($fp, LOCK_EX | LOCK_NB)) { + flock($fp, LOCK_UN); + fclose($fp); + return false; + } fclose($fp); - return false; + return true; } - fclose($fp); - return true; } return false; } function make_lockfile($filename) { - $fp = fopen($filename, "w"); + $fp = fopen(LOCK_DIRECTORY . "/$filename", "w"); if (flock($fp, LOCK_EX | LOCK_NB)) { return $fp; @@ -1656,7 +1895,7 @@ } function make_stampfile($filename) { - $fp = fopen($filename, "w"); + $fp = fopen(LOCK_DIRECTORY . "/$filename", "w"); if (flock($fp, LOCK_EX | LOCK_NB)) { fwrite($fp, time() . "\n"); @@ -1671,7 +1910,7 @@ function read_stampfile($filename) { error_reporting(0); - $fp = fopen($filename, "r"); + $fp = fopen(LOCK_DIRECTORY . "/$filename", "r"); error_reporting (DEFAULT_ERROR_LEVEL); if (flock($fp, LOCK_EX)) { @@ -1762,15 +2001,25 @@ $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE"); if (DB_TYPE == "pgsql") { - $match_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' "; + $match_part = "date_entered > NOW() - INTERVAL '$intl hour' "; } else { - $match_part .= " AND date_entered > DATE_SUB(NOW(), + $match_part = "date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) "; } - db_query($link, "UPDATE ttrss_user_entries - SET unread = false,last_read = NOW() - WHERE $match_part AND owner_uid = ".$_SESSION["uid"]); + $result = db_query($link, "SELECT id FROM ttrss_entries, + ttrss_user_entries WHERE $match_part AND + unread = true AND + ttrss_user_entries.ref_id = ttrss_entries.id AND + owner_uid = ".$_SESSION["uid"]); + + $affected_ids = array(); + + while ($line = db_fetch_assoc($result)) { + array_push($affected_ids, $line["id"]); + } + + catchupArticlesById($link, $affected_ids, 0); } } else if ($feed < -10) { // label @@ -1833,7 +2082,7 @@ } } - function update_generic_feed($link, $feed, $cat_view) { + function update_generic_feed($link, $feed, $cat_view, $force_update = false) { if ($cat_view) { if ($feed > 0) { @@ -1842,23 +2091,24 @@ $cat_qpart = "cat_id IS NULL"; } - $tmp_result = db_query($link, "SELECT feed_url FROM ttrss_feeds + $tmp_result = db_query($link, "SELECT id,feed_url FROM ttrss_feeds WHERE $cat_qpart AND owner_uid = " . $_SESSION["uid"]); while ($tmp_line = db_fetch_assoc($tmp_result)) { $feed_url = $tmp_line["feed_url"]; - update_rss_feed($link, $feed_url, $feed, ENABLE_UPDATE_DAEMON); + $feed_id = $tmp_line["id"]; + update_rss_feed($link, $feed_url, $feed_id, $force_update); } } else { $tmp_result = db_query($link, "SELECT feed_url FROM ttrss_feeds WHERE id = '$feed'"); $feed_url = db_fetch_result($tmp_result, 0, "feed_url"); - update_rss_feed($link, $feed_url, $feed, ENABLE_UPDATE_DAEMON); + update_rss_feed($link, $feed_url, $feed, $force_update); } } - function getAllCounters($link, $omode = "flc") { + function getAllCounters($link, $omode = "flc", $active_feed = false) { /* getLabelCounters($link); getFeedCounters($link); getTagCounters($link); @@ -1872,7 +2122,7 @@ getGlobalCounters($link); if (strchr($omode, "l")) getLabelCounters($link); - if (strchr($omode, "f")) getFeedCounters($link); + if (strchr($omode, "f")) getFeedCounters($link, SMART_RPC_COUNTERS, $active_feed); if (strchr($omode, "t")) getTagCounters($link); if (strchr($omode, "c")) { if (get_pref($link, 'ENABLE_FEED_CATS')) { @@ -1892,8 +2142,11 @@ print ""; + $age_qpart = getMaxAgeSubquery(); + $result = db_query($link, "SELECT cat_id,SUM((SELECT COUNT(int_id) - FROM ttrss_user_entries WHERE feed_id = ttrss_feeds.id + FROM ttrss_user_entries, ttrss_entries WHERE feed_id = ttrss_feeds.id + AND id = ref_id AND $age_qpart AND unread = true)) AS unread FROM ttrss_feeds WHERE hidden = false AND owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id"); @@ -1914,7 +2167,9 @@ } else { $cat_query = "cat_id IS NULL"; } - + + $age_qpart = getMaxAgeSubquery(); + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE $cat_query AND hidden = false AND owner_uid = " . $_SESSION["uid"]); @@ -1929,8 +2184,9 @@ $match_part = implode(" OR ", $cat_feeds); $result = db_query($link, "SELECT COUNT(int_id) AS unread - FROM ttrss_user_entries - WHERE unread = true AND ($match_part) AND owner_uid = " . $_SESSION["uid"]); + FROM ttrss_user_entries,ttrss_entries + WHERE unread = true AND ($match_part) AND id = ref_id + AND $age_qpart AND owner_uid = " . $_SESSION["uid"]); $unread = 0; @@ -1957,9 +2213,21 @@ } } + function getMaxAgeSubquery($days = COUNTERS_MAX_AGE) { + if (DB_TYPE == "pgsql") { + return "ttrss_entries.date_entered > + NOW() - INTERVAL '$days days'"; + } else { + return "ttrss_entries.date_entered > + DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + } + function getFeedUnread($link, $feed, $is_cat = false) { $n_feed = sprintf("%d", $feed); + $age_qpart = getMaxAgeSubquery(); + if ($is_cat) { return getCategoryUnread($link, $n_feed); } else if ($n_feed == -1) { @@ -1996,9 +2264,12 @@ $match_part = implode(" OR ", $linked_feeds); $result = db_query($link, "SELECT COUNT(int_id) AS unread - FROM ttrss_user_entries - WHERE unread = true AND ($match_part) - AND owner_uid = " . $_SESSION["uid"]); + FROM ttrss_user_entries,ttrss_entries + WHERE unread = true AND + ttrss_user_entries.ref_id = ttrss_entries.id AND + $age_qpart AND + ($match_part) AND + owner_uid = " . $_SESSION["uid"]); $unread = 0; @@ -2029,13 +2300,15 @@ ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND ttrss_feeds.hidden = false AND + $age_qpart AND unread = true AND ($match_part) AND ttrss_user_entries.owner_uid = " . $_SESSION["uid"]); } else { $result = db_query($link, "SELECT COUNT(post_int_id) AS unread - FROM ttrss_tags,ttrss_user_entries - WHERE tag_name = '$feed' AND post_int_id = int_id AND unread = true AND + FROM ttrss_tags,ttrss_user_entries,ttrss_entries + WHERE tag_name = '$feed' AND post_int_id = int_id AND ref_id = ttrss_entries.id + AND unread = true AND $age_qpart AND ttrss_tags.owner_uid = " . $_SESSION["uid"]); } @@ -2052,11 +2325,14 @@ $user_id = $_SESSION["uid"]; } + $age_qpart = getMaxAgeSubquery(); + $result = db_query($link, "SELECT count(ttrss_entries.id) as c_id FROM ttrss_entries,ttrss_user_entries,ttrss_feeds WHERE unread = true AND ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND hidden = false AND + $age_qpart AND ttrss_user_entries.owner_uid = '$user_id'"); $c_id = db_fetch_result($result, 0, "c_id"); return $c_id; @@ -2100,8 +2376,11 @@ select tag_name,0 as count FROM ttrss_tags WHERE ttrss_tags.owner_uid = ".$_SESSION["uid"]); */ + $age_qpart = getMaxAgeSubquery(); + $result = db_query($link, "SELECT tag_name,SUM((SELECT COUNT(int_id) - FROM ttrss_user_entries WHERE int_id = post_int_id + FROM ttrss_user_entries,ttrss_entries WHERE int_id = post_int_id + AND ref_id = id AND $age_qpart AND unread = true)) AS count FROM ttrss_tags WHERE owner_uid = ".$_SESSION['uid']." GROUP BY tag_name ORDER BY count DESC LIMIT 55"); @@ -2133,6 +2412,8 @@ function getLabelCounters($link, $smart_mode = SMART_RPC_COUNTERS, $ret_mode = false) { + $age_qpart = getMaxAgeSubquery(); + if ($smart_mode) { if (!$_SESSION["lctr_last_value"]) { $_SESSION["lctr_last_value"] = array(); @@ -2186,6 +2467,7 @@ $tmp_result = db_query($link, "SELECT count(ttrss_entries.id) as count FROM ttrss_user_entries,ttrss_entries,ttrss_feeds WHERE (" . $line["sql_exp"] . ") AND unread = true AND ttrss_feeds.hidden = false AND + $age_qpart AND ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND ttrss_user_entries.owner_uid = ".$_SESSION["uid"]); @@ -2228,7 +2510,9 @@ print ""; } */ - function getFeedCounters($link, $smart_mode = SMART_RPC_COUNTERS) { + function getFeedCounters($link, $smart_mode = SMART_RPC_COUNTERS, $active_feed = false) { + + $age_qpart = getMaxAgeSubquery(); if ($smart_mode) { if (!$_SESSION["fctr_last_value"]) { @@ -2248,7 +2532,8 @@ FROM ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"] . " AND parent_feed IS NULL"); */ - $result = db_query($link, "SELECT ttrss_feeds.id, + $query = "SELECT ttrss_feeds.id, + ttrss_feeds.title, SUBSTRING(ttrss_feeds.last_updated,1,19) AS last_updated, last_error, COUNT(ttrss_entries.id) AS count @@ -2256,11 +2541,13 @@ LEFT JOIN ttrss_user_entries ON (ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.owner_uid = ttrss_feeds.owner_uid AND ttrss_user_entries.unread = true) - LEFT JOIN ttrss_entries ON (ttrss_user_entries.ref_id = ttrss_entries.id) - WHERE ttrss_feeds.owner_uid = ".$_SESSION["uid"]." + LEFT JOIN ttrss_entries ON (ttrss_user_entries.ref_id = ttrss_entries.id AND + $age_qpart) + WHERE ttrss_feeds.owner_uid = ".$_SESSION["uid"]." AND parent_feed IS NULL - GROUP BY ttrss_feeds.id, ttrss_feeds.title, ttrss_feeds.last_updated, last_error"); + GROUP BY ttrss_feeds.id, ttrss_feeds.title, ttrss_feeds.last_updated, last_error"; + $result = db_query($link, $query); $fctrs_modified = false; $short_date = get_pref($link, 'SHORT_DATE_FORMAT'); @@ -2277,13 +2564,16 @@ $last_updated = date($short_date, strtotime($line["last_updated"])); } + $last_updated = htmlspecialchars($last_updated); + $has_img = is_file(ICONS_DIR . "/$id.ico"); $tmp_result = db_query($link, - "SELECT id,COUNT(unread) AS unread + "SELECT ttrss_feeds.id,COUNT(unread) AS unread FROM ttrss_feeds LEFT JOIN ttrss_user_entries ON (ttrss_feeds.id = ttrss_user_entries.feed_id) - WHERE parent_feed = '$id' AND unread = true GROUP BY ttrss_feeds.id"); + LEFT JOIN ttrss_entries ON (ttrss_user_entries.ref_id = ttrss_entries.id) + WHERE parent_feed = '$id' AND $age_qpart AND unread = true GROUP BY ttrss_feeds.id"); if (db_num_rows($tmp_result) > 0) { while ($l = db_fetch_assoc($tmp_result)) { @@ -2307,7 +2597,13 @@ $has_img_part = ""; } - print ""; + if ($active_feed && $id == $active_feed) { + $has_title_part = "title=\"" . htmlspecialchars($line["title"]) . "\""; + } else { + $has_title_part = ""; + } + + print ""; } } @@ -2516,9 +2812,10 @@ } } + print ""; print ""; print ""; - print ""; + print ""; print ""; @@ -2554,32 +2851,41 @@ print ""; + print ""; + print ""; } function print_runtime_info($link) { print ""; + if (ENABLE_UPDATE_DAEMON) { print ""; - if ($_SESSION["daemon_stamp_check"] + 600 < time()) { + if (time() - $_SESSION["daemon_stamp_check"] > 30) { $stamp = (int)read_stampfile("update_daemon.stamp"); +// print ""; + if ($stamp) { - if ($stamp + 86400*3 < time()) { - print ""; + $stamp_delta = time() - $stamp; + + if ($stamp_delta > 1800) { + $stamp_check = 0; } else { - print ""; + $stamp_check = 1; + $_SESSION["daemon_stamp_check"] = time(); } + print ""; + $stamp_fmt = date("Y.m.d, G:i", $stamp); print ""; } - - $_SESSION["daemon_stamp_check"] = time(); } } @@ -2595,6 +2901,8 @@ } } +// print ""; + print ""; } @@ -2847,6 +3155,8 @@ if ($feed < -10) error_reporting (0); + $content_query_part = "content as content_preview,"; + if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) { if ($feed >= 0) { @@ -2855,8 +3165,6 @@ $feed_kind = "Labels"; } - $content_query_part = "content as content_preview,"; - if ($limit_query_part) { $offset_query_part = "OFFSET $offset"; } @@ -3013,10 +3321,9 @@ $res = $str; if (get_pref($link, "STRIP_UNSAFE_TAGS") || $force_strip_tags) { - global $tw_parser; - global $tw_paranoya_setup; - $res = $tw_parser->strip_tags($res, $tw_paranoya_setup); + $res = strip_tags_long($res, + "


  •  
  • -
  • ".__('Mark as read')."
  • "; + print $line["content"]; + + $result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE + post_id = '$id'"); + + if (db_num_rows($result) > 0) { + print "
    "; + + if (db_num_rows($result) == 1) { + print __("Attachment:") . " "; + } else { + print __("Attachments:") . " "; + } + + $entries = array(); + + while ($line = db_fetch_assoc($result)) { + + $url = $line["content_url"]; + + $filename = substr($url, strrpos($url, "/")+1); + + $entry = "" . + $filename . " (" . $line["content_type"] . ")" . ""; + + array_push($entries, $entry); + } + + print join(", ", $entries); + + print "
    "; + } + + print ""; print ""; @@ -4107,6 +4541,8 @@ function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset) { + $disable_cache = false; + $timing_info = getmicrotime(); $topmost_article_ids = array(); @@ -4125,7 +4561,7 @@ } if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) { - update_generic_feed($link, $feed, $cat_view); + update_generic_feed($link, $feed, $cat_view, true); } if ($subop == "MarkAllRead") { @@ -4174,6 +4610,11 @@ /// START ///////////////////////////////////////////////////////////////////////////////// $search = db_escape_string($_GET["query"]); + + if ($search) { + $disable_cache = true; + } + $search_mode = db_escape_string($_GET["search_mode"]); $match_on = db_escape_string($_GET["match_on"]); @@ -4216,6 +4657,8 @@ print "
    "; } + $headlines_count = db_num_rows($result); + if (db_num_rows($result) > 0) { # print "\{$offset}"; @@ -4329,26 +4772,40 @@ print "$marked_pic"; print "$published_pic"; - if ($line["feed_title"]) { - print "$content_link"; - print " - ". - truncate_string($line["feed_title"],30)." "; - } else { - print ""; - - print "" . - $line["title"]; - - if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { - if ($content_preview) { - print " - $content_preview"; - } +# if ($line["feed_title"]) { +# print "$content_link"; +# print " +# ". +# truncate_string($line["feed_title"],30)." "; +# } else { + + print ""; + + print "" . + $line["title"]; + + if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { + if ($content_preview) { + print " - $content_preview"; } - - print ""; - print ""; } + + print ""; + +# ". +# $line["feed_title"]." + + if ($line["feed_title"]) { + print " + (". + $line["feed_title"].") + "; + } + + + print ""; + +# } print "$updated_fmt "; @@ -4361,7 +4818,15 @@ } else { $add_class = ""; } - + + $expand_cdm = get_pref($link, 'CDM_EXPANDED'); + + if ($expand_cdm) { + $cdm_cstyle = ""; + } else { + $cdm_cstyle = "style=\"display : none\""; + } + print "
    "; @@ -4376,6 +4841,13 @@ print $entry_author; + if (!$expand_cdm) { + print "  + (".__('Show article').")"; + } + + if ($line["feed_title"]) { print " (".$line["feed_title"].")"; } @@ -4387,7 +4859,52 @@ "target=\"_new\" href=", $line["content_preview"]); } - print "
    " . $line["content_preview"] . "

    "; + print "
    "; + +// print "
    "; + print $line["content_preview"]; + + $e_result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE + post_id = '$id'"); + + if (db_num_rows($e_result) > 0) { + print "
    "; + + if (db_num_rows($e_result) == 1) { + print __("Attachment:") . " "; + } else { + print __("Attachments:") . " "; + } + + $entries = array(); + + while ($e_line = db_fetch_assoc($e_result)) { + + $url = $e_line["content_url"]; + + $filename = substr($url, strrpos($url, "/")+1); + + $entry = "" . + $filename . " (" . $e_line["content_type"] . ")" . ""; + + array_push($entries, $entry); + } + + print join(", ", $entries); + + print "
    "; + } + + print "
    "; +// print "
    "; + +/* if (!$expand_cdm) { + print " + Show article"; + } */ + + print "
    "; print "
    "; @@ -4412,14 +4929,14 @@ if ($num_tags < 5) { $tags_str .= "$tag, "; } else if ($num_tags == 5) { - $tags_str .= "..."; + $tags_str .= "…"; } } $tags_str = preg_replace("/, $/", "", $tags_str); $full_tags_str = preg_replace("/, $/", "", $full_tags_str); - $all_tags_div = "...
    All Tags: $full_tags_str
    "; + $all_tags_div = "
    All Tags: $full_tags_str
    "; $tags_str = preg_replace("/\.\.\.$/", "$all_tags_div", $tags_str); @@ -4464,7 +4981,7 @@ print "
    "; } - return $topmost_article_ids; + return array($topmost_article_ids, $headlines_count, $feed, $disable_cache); } // from here: http://www.roscripts.com/Create_tag_cloud-71.html @@ -4570,4 +5087,26 @@ return $url_path; } + function clear_feed_articles($link, $id) { + $result = db_query($link, "DELETE FROM ttrss_user_entries + WHERE feed_id = '$id' AND marked = false AND owner_uid = " . $_SESSION["uid"]); + + $result = db_query($link, "DELETE FROM ttrss_entries WHERE + (SELECT COUNT(int_id) FROM ttrss_user_entries WHERE ref_id = id) = 0"); + } + + function add_feed_url() { + $url_path = 'http://' . $_SERVER["HTTP_HOST"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); + $url_path .= "?op=pref-feeds&quiet=1&subop=add&feed_url=%s"; + return $url_path; + } + + function encrypt_password($pass, $login = '') { + if ($login) { + return "SHA1X:" . sha1("$login:$pass"); + } else { + return "SHA1:" . sha1($pass); + } + } + ?>