X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.php;h=83159e62cabbefe1f79576f7bd34ee75ec6849a2;hb=e0d91d846dd5ac42a95a0832777cc76aaf579bc2;hp=9ef45cd3f2a4b91cf4ab4698e275cc030fe183eb;hpb=19929bbeeca6598827855cffdf21a810da4b7c87;p=tt-rss.git diff --git a/functions.php b/functions.php index 9ef45cd3..83159e62 100644 --- a/functions.php +++ b/functions.php @@ -120,10 +120,18 @@ @$config->set('HTML', 'Allowed', $allowed); $config->set('Output.FlashCompat', true); $config->set('Attr.EnableID', true); - @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier"); + if (!defined('MOBILE_VERSION')) { + @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier"); + } else { + @$config->set('Cache', 'SerializerPath', "../" . CACHE_DIR . "/htmlpurifier"); + } $purifier = new HTMLPurifier($config); + $tz_offset = -1; + $utc_tz = new DateTimeZone('UTC'); + $schema_version = false; + /** * Print a timestamped debug message. * @@ -362,7 +370,7 @@ $login = urlencode($login); $pass = urlencode($pass); - if (function_exists('curl_init')) { + if (function_exists('curl_init') && !ini_get("open_basedir")) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); @@ -374,6 +382,7 @@ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_USERAGENT, SELF_USER_AGENT); + curl_setopt($ch, CURLOPT_ENCODING , "gzip"); if ($post_query) { curl_setopt($ch, CURLOPT_POST, true); @@ -384,6 +393,7 @@ curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass"); $contents = @curl_exec($ch); + if ($contents === false) { curl_close($ch); return false; @@ -399,7 +409,7 @@ return $contents; } else { - if ($login && $pass && $updated != 3) { + if ($login && $pass ){ $url_parts = array(); preg_match("/(^[^:]*):\/\/(.*)/", $url, $url_parts); @@ -457,21 +467,24 @@ } // function get_favicon_url function check_feed_favicon($site_url, $feed, $link) { - $favicon_url = get_favicon_url($site_url); - # print "FAVICON [$site_url]: $favicon_url\n"; $icon_file = ICONS_DIR . "/$feed.ico"; - if ($favicon_url && !file_exists($icon_file)) { - $contents = fetch_file_contents($favicon_url, "image"); - if ($contents) { - $fp = fopen($icon_file, "w"); + if (!file_exists($icon_file)) { + $favicon_url = get_favicon_url($site_url); - if ($fp) { - fwrite($fp, $contents); - fclose($fp); - chmod($icon_file, 0644); + if ($favicon_url) { + $contents = fetch_file_contents($favicon_url, "image"); + + if ($contents) { + $fp = @fopen($icon_file, "w"); + + if ($fp) { + fwrite($fp, $contents); + fclose($fp); + chmod($icon_file, 0644); + } } } } @@ -496,7 +509,8 @@ } } - function update_rss_feed_real($link, $feed, $ignore_daemon = false, $no_cache = false) { + function update_rss_feed_real($link, $feed, $ignore_daemon = false, $no_cache = false, + $override_url = false) { global $memcache; @@ -579,11 +593,11 @@ $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); $fetch_url = db_fetch_result($result, 0, "feed_url"); - if ($update_interval < 0) { return; } + if ($update_interval < 0) { return false; } $feed = db_escape_string($feed); - if ($auth_login && $auth_pass && $updated != 3) { + if ($auth_login && $auth_pass ){ $url_parts = array(); preg_match("/(^[^:]*):\/\/(.*)/", $fetch_url, $url_parts); @@ -593,6 +607,9 @@ } + if ($override_url) + $fetch_url = $override_url; + if ($debug_enabled) { _debug("update_rss_feed: fetching [$fetch_url]..."); } @@ -631,6 +648,7 @@ # $rss->set_timeout(10); $rss->set_feed_url($fetch_url); $rss->set_output_encoding('UTF-8'); + $rss->force_feed(true); if (SIMPLEPIE_CACHE_IMAGES && $cache_images) { @@ -696,6 +714,8 @@ $site_url = $rss->channel["link"]; } + $site_url = rewrite_relative_url($fetch_url, $site_url); + if ($debug_enabled) { _debug("update_rss_feed: checking favicon..."); } @@ -816,10 +836,11 @@ if ($debug_enabled) _debug("update_rss_feed: feed hub url: $feed_hub_url"); - if ($feed_hub_url && function_exists('curl_init')) { + if ($feed_hub_url && function_exists('curl_init') && + !ini_get("open_basedir")) { $callback_url = get_self_url_prefix() . - "/backend.php?op=pubsub&id=$feed"; + "/public.php?op=pubsub&id=$feed"; $s = new Subscriber($feed_hub_url, $callback_url); @@ -907,8 +928,11 @@ if (!$entry_link) $entry_link = $item["link"]; } + $entry_link = rewrite_relative_url($site_url, $entry_link); + if ($debug_enabled) { _debug("update_rss_feed: title $entry_title"); + _debug("update_rss_feed: link $entry_link"); } if (!$entry_title) $entry_title = date("Y-m-d H:i:s", $entry_timestamp);; @@ -1254,13 +1278,13 @@ $result = db_query($link, "INSERT INTO ttrss_user_entries (ref_id, owner_uid, feed_id, unread, last_read, marked, - published, score, tag_cache, label_cache) + published, score, tag_cache, label_cache, uuid) VALUES ('$ref_id', '$owner_uid', '$feed', $unread, - $last_read_qpart, $marked, $published, '$score', '', '')"); + $last_read_qpart, $marked, $published, '$score', '', '', '')"); if (PUBSUBHUBBUB_HUB && $published == 'true') { $rss_link = get_self_url_prefix() . - "/backend.php?op=rss&id=-2&key=" . + "/public.php?op=rss&id=-2&key=" . get_feed_access_key($link, -2, false, $owner_uid); $p = new Publisher(PUBSUBHUBBUB_HUB); @@ -1444,7 +1468,7 @@ foreach ($article_filters as $f) { if ($f[0] == "tag") { - $manual_tags = trim_array(split(",", $f[1])); + $manual_tags = trim_array(explode(",", $f[1])); foreach ($manual_tags as $tag) { if (tag_is_valid($tag)) { @@ -1456,7 +1480,7 @@ // Skip boring tags - $boring_tags = trim_array(split(",", mb_strtolower(get_pref($link, + $boring_tags = trim_array(explode(",", mb_strtolower(get_pref($link, 'BLACKLISTED_TAGS', $owner_uid, ''), 'utf-8'))); $filtered_tags = array(); @@ -1816,8 +1840,7 @@ function lookup_user_id($link, $user) { - $result = db_query($link, "SELECT id FROM ttrss_users WHERE - login = '$login'"); + $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$user'"); if (db_num_rows($result) == 1) { return db_fetch_result($result, 0, "id"); @@ -1914,10 +1937,10 @@ // First login ? if (db_num_rows($result) == 0) { - $query = "INSERT INTO ttrss_users + $query2 = "INSERT INTO ttrss_users (login,access_level,last_login,created) VALUES ('$login', 0, null, NOW())"; - db_query($link, $query); + db_query($link, $query2); } } @@ -1942,14 +1965,16 @@ // LemonLDAP can send user informations via HTTP HEADER if (defined('AUTO_CREATE_USER') && AUTO_CREATE_USER){ // update user name - if ($_SERVER['HTTP_USER_NAME']){ - $fullname = db_escape_string($_SERVER['HTTP_USER_NAME']); + $fullname = $_SERVER['HTTP_USER_NAME'] ? $_SERVER['HTTP_USER_NAME'] : $_SERVER['AUTHENTICATE_CN']; + if ($fullname){ + $fullname = db_escape_string($fullname); db_query($link, "UPDATE ttrss_users SET full_name = '$fullname' WHERE id = " . $_SESSION["uid"]); } // update user mail - if ($_SERVER['HTTP_USER_MAIL']){ - $email = db_escape_string($_SERVER['HTTP_USER_MAIL']); + $email = $_SERVER['HTTP_USER_MAIL'] ? $_SERVER['HTTP_USER_MAIL'] : $_SERVER['AUTHENTICATE_MAIL']; + if ($email){ + $email = db_escape_string($email); db_query($link, "UPDATE ttrss_users SET email = '$email' WHERE id = " . $_SESSION["uid"]); } @@ -2077,6 +2102,8 @@ } function login_sequence($link, $mobile = false) { + $_SESSION["prefs_cache"] = array(); + if (!SINGLE_USER_MODE) { $login_action = $_POST["login_action"]; @@ -2140,6 +2167,9 @@ setcookie("ttrss_lang", $_SESSION["language"], time() + SESSION_COOKIE_LIFETIME); } + + // try to remove possible duplicates from feed counter cache +// ccache_cleanup($link, $_SESSION["uid"]); } } else { @@ -2290,21 +2320,30 @@ if (!$owner_uid) $owner_uid = $_SESSION['uid']; if (!$timestamp) $timestamp = '1970-01-01 0:00'; - $user_tz_string = get_pref($link, 'USER_TIMEZONE', $owner_uid); + global $utc_tz; + global $tz_offset; - try { - $user_tz = new DateTimeZone($user_tz_string); - } catch (Exception $e) { - $user_tz = new DateTimeZone('UTC'); + # We store date in UTC internally + $dt = new DateTime($timestamp, $utc_tz); + + if ($tz_offset == -1) { + + $user_tz_string = get_pref($link, 'USER_TIMEZONE', $owner_uid); + + try { + $user_tz = new DateTimeZone($user_tz_string); + } catch (Exception $e) { + $user_tz = $utc_tz; + } + + $tz_offset = $user_tz->getOffset($dt); } - # We store date in UTC internally - $dt = new DateTime($timestamp, new DateTimeZone('UTC')); - $user_timestamp = $dt->format('U') + $user_tz->getOffset($dt); + $user_timestamp = $dt->format('U') + $tz_offset; if (!$no_smart_dt) { return smart_date_time($link, $user_timestamp, - $user_tz->getOffset($dt), $owner_uid); + $tz_offset, $owner_uid); } else { if ($long) $format = get_pref($link, 'LONG_DATE_FORMAT', $owner_uid); @@ -2374,14 +2413,16 @@ // script when get_schema_version() is called on an obsolete session // created on a previous schema version. function get_schema_version($link, $nocache = false) { -// if (!$_SESSION["schema_version"] || $nocache) { + global $schema_version; + + if (!$schema_version) { $result = db_query($link, "SELECT schema_version FROM ttrss_version"); $version = db_fetch_result($result, 0, "schema_version"); - $_SESSION["schema_version"] = $version; + $schema_version = $version; return $version; -// } else { -// return $_SESSION["schema_version"]; -// } + } else { + return $schema_version; + } } function sanity_check($link) { @@ -2389,7 +2430,7 @@ global $ERRORS; $error_code = 0; - $schema_version = get_schema_version($link); + $schema_version = get_schema_version($link, true); if ($schema_version != SCHEMA_VERSION) { $error_code = 5; @@ -2465,8 +2506,9 @@ if (!$owner_uid) $owner_uid = $_SESSION['uid']; - if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) { + //if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) { + if (is_numeric($feed)) { if ($cat_view) { if ($feed >= 0) { @@ -2490,7 +2532,6 @@ } } else if ($feed == -2) { - db_query($link, "UPDATE ttrss_user_entries SET unread = false,last_read = NOW() WHERE (SELECT COUNT(*) FROM ttrss_user_labels2 WHERE article_id = ref_id) > 0 @@ -2999,7 +3040,7 @@ function get_pgsql_version($link) { $result = db_query($link, "SELECT version() AS version"); - $version = split(" ", db_fetch_result($result, 0, "version")); + $version = explode(" ", db_fetch_result($result, 0, "version")); return $version[1]; } @@ -3225,7 +3266,7 @@ return "Unknown label ($label_id)"; } - } else if ($id > 0) { + } else if (is_numeric($id) && $id > 0) { $result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$id'"); if (db_num_rows($result) == 1) { return db_fetch_result($result, 0, "title"); @@ -3344,7 +3385,7 @@ $search_query_part = ""; - $keywords = split(" ", $search); + $keywords = explode(" ", $search); $query_keywords = array(); foreach ($keywords as $k) { @@ -3355,7 +3396,7 @@ $not = ""; } - $commandpair = split(":", mb_strtolower($k), 2); + $commandpair = explode(":", mb_strtolower($k), 2); if ($commandpair[0] == "note" && $commandpair[1]) { @@ -3402,7 +3443,8 @@ return $search_query_part; } - function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false) { + + function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0) { if (!$owner_uid) $owner_uid = $_SESSION["uid"]; @@ -3433,6 +3475,12 @@ $filter_query_part = ""; } + if ($since_id) { + $since_id_part = "ttrss_entries.id > $since_id AND "; + } else { + $since_id_part = ""; + } + $view_query_part = ""; if ($view_mode == "adaptive" || $view_query_part == "noscores") { @@ -3601,7 +3649,7 @@ if ($cat_view) { $feed_title = getCategoryTitle($link, $feed); } else { - if ((int)$feed == $feed && $feed > 0) { + if (is_numeric($feed) && $feed > 0) { $result = db_query($link, "SELECT title,site_url,last_error FROM ttrss_feeds WHERE id = '$feed' AND owner_uid = $owner_uid"); @@ -3648,7 +3696,13 @@ guid, ttrss_entries.id,ttrss_entries.title, updated, + label_cache, + tag_cache, + always_display_enclosures, + site_url, note, + num_comments, + comments, unread,feed_id,marked,published,link,last_read,orig_feed_id, ".SUBSTRING_FOR_DATE."(last_read,1,19) as last_read_noms, $vfeed_query_part @@ -3664,6 +3718,7 @@ $search_query_part $filter_query_part $view_query_part + $since_id_part $query_strategy_part ORDER BY $order_by $limit_query_part $offset_query_part"; @@ -3674,31 +3729,73 @@ } else { // browsing by tag + $select_qpart = "SELECT DISTINCT " . + "date_entered," . + "guid," . + "note," . + "ttrss_entries.id as id," . + "title," . + "updated," . + "unread," . + "feed_id," . + "orig_feed_id," . + "site_url," . + "always_display_enclosures, ". + "marked," . + "num_comments, " . + "comments, " . + "tag_cache," . + "label_cache," . + "link," . + "last_read," . + SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms," . + $since_id_part . + $vfeed_query_part . + $content_query_part . + SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms," . + "score "; + $feed_kind = "Tags"; + $all_tags = explode(",", $feed); + if ($search_mode == 'any') { + $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")"; + $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags "; + $where_qpart = " WHERE " . + "ref_id = ttrss_entries.id AND " . + "ttrss_user_entries.owner_uid = $owner_uid AND " . + "post_int_id = int_id AND $tag_sql AND " . + $view_query_part . + $search_query_part . + $query_strategy_part . " ORDER BY $order_by " . + $limit_query_part; - $result = db_query($link, "SELECT DISTINCT - date_entered, - guid, - note, - ttrss_entries.id as id,title, - updated, - unread,feed_id,orig_feed_id, - marked,link,last_read, - ".SUBSTRING_FOR_DATE."(last_read,1,19) as last_read_noms, - $vfeed_query_part - $content_query_part - ".SUBSTRING_FOR_DATE."(updated,1,19) as updated_noms, - score - FROM - ttrss_entries,ttrss_user_entries,ttrss_tags - WHERE - ref_id = ttrss_entries.id AND - ttrss_user_entries.owner_uid = '$owner_uid' AND - post_int_id = int_id AND tag_name = '$feed' AND - $view_query_part - $search_query_part - $query_strategy_part ORDER BY $order_by - $limit_query_part"); + } else { + $i = 1; + $sub_selects = array(); + $sub_ands = array(); + foreach ($all_tags as $term) { + array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = $owner_uid) as A$i"); + $i++; + } + if ($i > 2) { + $x = 1; + $y = 2; + do { + array_push($sub_ands, "A$x.post_int_id = A$y.post_int_id"); + $x++; + $y++; + } while ($y < $i); + } + array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = $owner_uid"); + array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id"); + $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries"; + $where_qpart = " WHERE " . implode(" AND ", $sub_ands); + } + // error_log("TAG SQL: " . $tag_sql); + // $tag_sql = "tag_name = '$feed'"; DEFAULT way + + // error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]"); + $result = db_query($link, $select_qpart . $from_qpart . $where_qpart); } return array($result, $feed_title, $feed_site_url, $last_error); @@ -3733,7 +3830,7 @@ $last_error = $qfh_ret[3]; $feed_self_url = get_self_url_prefix() . - "/backend.php?op=rss&id=-2&key=" . + "/public.php?op=rss&id=-2&key=" . get_feed_access_key($link, -2, false); if (!$feed_site_url) $feed_site_url = get_self_url_prefix(); @@ -4142,7 +4239,7 @@ if (PUBSUBHUBBUB_HUB) { $rss_link = get_self_url_prefix() . - "/backend.php?op=rss&id=-2&key=" . + "/public.php?op=rss&id=-2&key=" . get_feed_access_key($link, -2, false); $p = new Publisher(PUBSUBHUBBUB_HUB); @@ -4274,8 +4371,14 @@ if ($is_cat) $cat_q = "&is_cat=$is_cat"; + if ($search) { + $search_q = "&q=$search&m=$match_on&smode=$search_mode"; + } else { + $search_q = ""; + } + $rss_link = htmlspecialchars(get_self_url_prefix() . - "/backend.php?op=rss&id=$feed_id$cat_q$search_q"); + "/public.php?op=rss&id=$feed_id$cat_q$search_q"); $reply .= ""; @@ -4310,7 +4413,7 @@ $fg_color = db_fetch_result($result, 0, "fg_color"); $bg_color = db_fetch_result($result, 0, "bg_color"); - $reply .= ""; + $reply .= ""; $reply .= $feed_title; $reply .= ""; } else { @@ -4322,12 +4425,6 @@ } } - if ($search) { - $search_q = "&q=$search&m=$match_on&smode=$search_mode"; - } else { - $search_q = ""; - } - $reply .= " "; } - $tags = get_article_tags($link, $id); + $tag_cache = $line["tag_cache"]; + + if (!$tag_cache) + $tags = get_article_tags($link, $id); + else + $tags = explode(",", $tag_cache); + $tags_str = format_tags_string($tags, $id); $tags_str_full = join(", ", $tags); @@ -4848,6 +4953,11 @@ alt='Zoom' title='".__('Share on Twitter')."'>"; } + $rv['content'] .= "Zoom"; + $rv['content'] .= " 0) { + if ($subop == "ForceUpdate" && $feed && is_numeric($feed) > 0) { update_rss_feed($link, $feed, true); } @@ -4975,7 +5082,7 @@ // FIXME: might break tag display? - if ($feed > 0 && !$cat_view) { + if (is_numeric($feed) && $feed > 0 && !$cat_view) { $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE id = '$feed' LIMIT 1"); @@ -5005,8 +5112,6 @@ $rtl_content = false; } - /// START ///////////////////////////////////////////////////////////////////////////////// - @$search = db_escape_string($_REQUEST["query"]); if ($search) { @@ -5020,12 +5125,15 @@ $match_on = "both"; } - $real_offset = $offset * $limit; - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H0", $timing_info); +// error_log("format_headlines_list: [" . $feed . "] subop [" . $subop . "]"); + if( $search_mode == '' && $subop != '' ){ + $search_mode = $subop; + } +// error_log("search_mode: " . $search_mode); $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, - $search, $search_mode, $match_on, $override_order, $real_offset); + $search, $search_mode, $match_on, $override_order, $offset); if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H1", $timing_info); @@ -5036,36 +5144,50 @@ $vgroup_last_feed = $vgr_last_feed; - /// STOP ////////////////////////////////////////////////////////////////////////////////// - - if (!$offset) { +// if (!$offset) { if (db_num_rows($result) > 0) { - $reply['toolbar'] = format_headline_subtoolbar($link, $feed_site_url, $feed_title, + $reply['toolbar'] = format_headline_subtoolbar($link, $feed_site_url, + $feed_title, $feed, $cat_view, $search, $match_on, $search_mode, $view_mode, $last_error); } - } +// } $headlines_count = db_num_rows($result); if (db_num_rows($result) > 0) { - $lnum = $limit*$offset; + $lnum = $offset; $num_unread = 0; $cur_feed_title = ''; $fresh_intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60; + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("PS", $timing_info); + while ($line = db_fetch_assoc($result)) { $class = ($lnum % 2) ? "even" : "odd"; $id = $line["id"]; $feed_id = $line["feed_id"]; + $label_cache = $line["label_cache"]; + $labels = false; + + if ($label_cache) { + $label_cache = json_decode($label_cache, true); + + if ($label_cache) { + if ($label_cache["no-labels"] == 1) + $labels = array(); + else + $labels = $label_cache; + } + } - $labels = get_article_labels($link, $id); + if (!is_array($labels)) $labels = get_article_labels($link, $id); $labels_str = ""; $labels_str .= format_article_labels($labels, $id); @@ -5218,7 +5340,7 @@ $reply['content'] .= "" . - $line["title"]; + truncate_string($line["title"], 200); if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { if ($content_preview) { @@ -5230,14 +5352,15 @@ $reply['content'] .= $labels_str; - /* if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) { + if (!get_pref($link, 'VFEED_GROUP_BY_FEED') && + defined('_SHOW_FEED_TITLE_IN_VFEEDS')) { if (@$line["feed_title"]) { - print " + $reply['content'] .= " (". $line["feed_title"].") "; } - } */ + } $reply['content'] .= ""; @@ -5294,18 +5417,7 @@ $reply['content'] .= "
"; - $reply['content'] .= "
"; - $reply['content'] .= "$updated_fmt"; - $reply['content'] .= "$score_pic"; - - if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) { - $reply['content'] .= "$feed_icon_img"; - } - $reply['content'] .= "
$update_pic
"; - - $reply['content'] .= "
"; + $reply['content'] .= "
"; $reply['content'] .= ""; @@ -5313,6 +5425,8 @@ $reply['content'] .= "$marked_pic"; $reply['content'] .= "$published_pic"; + $reply['content'] .= "
"; + $reply['content'] .= " @@ -5325,6 +5439,16 @@ $reply['content'] .= $labels_str; + if (!get_pref($link, 'VFEED_GROUP_BY_FEED') && + defined('_SHOW_FEED_TITLE_IN_VFEEDS')) { + if (@$line["feed_title"]) { + $reply['content'] .= " + (". + $line["feed_title"].") + "; + } + } + if (!$expand_cdm) $content_hidden = "style=\"display : none\""; else @@ -5335,6 +5459,18 @@ $reply['content'] .= ""; + $reply['content'] .= "
"; + $reply['content'] .= "$updated_fmt"; + $reply['content'] .= "$score_pic"; + + if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) { + $reply['content'] .= "$feed_icon_img"; + } + $reply['content'] .= "
$update_pic
"; + $reply['content'] .= "
"; + $reply['content'] .= "
"; $reply['content'] .= "
"; if ($line['note']) { $reply['content'] .= format_article_note($id, $line['note']); } $reply['content'] .= "
"; - $reply['content'] .= "$article_content"; + $reply['content'] .= ""; + $reply['content'] .= $expand_cdm ? $article_content : ''; + $reply['content'] .= ""; - $tmp_result = db_query($link, "SELECT always_display_enclosures FROM +/* $tmp_result = db_query($link, "SELECT always_display_enclosures FROM ttrss_feeds WHERE id = ". (($line['feed_id'] == null) ? $line['orig_feed_id'] : - $line['feed_id'])." AND owner_uid = ".$_SESSION["uid"]); + $line['feed_id'])." AND owner_uid = ".$_SESSION["uid"]); $always_display_enclosures = sql_bool_to_bool(db_fetch_result($tmp_result, - 0, "always_display_enclosures")); + 0, "always_display_enclosures")); */ + + $always_display_enclosures = sql_bool_to_bool($line["always_display_enclosures"]); $reply['content'] .= format_article_enclosures($link, $id, $always_display_enclosures, $article_content); @@ -5415,7 +5538,11 @@ $reply['content'] .= "
"; - $tags_str = format_tags_string(get_article_tags($link, $id), $id); + $tag_cache = $line["tag_cache"]; + + $tags_str = format_tags_string( + get_article_tags($link, $id, $_SESSION["uid"], $tag_cache), + $id); $reply['content'] .= "Tags @@ -5423,6 +5550,24 @@ (+)"; + $num_comments = $line["num_comments"]; + $entry_comments = ""; + + if ($num_comments > 0) { + if ($line["comments"]) { + $comments_url = $line["comments"]; + } else { + $comments_url = $line["link"]; + } + $entry_comments = "$num_comments comments"; + } else { + if ($line["comments"] && $line["link"] != $line["comments"]) { + $entry_comments = "comments"; + } + } + + if ($entry_comments) $reply['content'] .= " ($entry_comments)"; + $reply['content'] .= "
"; $reply['content'] .= " 0) print "
"; -# print "
"; -# } - - #print "]]>"; + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H2", $timing_info); return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, - $vgroup_last_feed, $reply['content'], $reply['toolbar']); + $vgroup_last_feed, $reply); } // from here: http://www.roscripts.com/Create_tag_cloud-71.html @@ -5544,6 +5686,8 @@ $tags[$line["tag_name"]] = $line["count"]; } + if( count($tags) == 0 ){ return; } + ksort($tags); $max_size = 32; // max font size in pixels @@ -5599,22 +5743,9 @@ } function get_self_url_prefix() { - - /* $url_path = ""; - - if ($_SERVER['HTTPS'] != "on") { - $url_path = "http://"; - } else { - $url_path = "https://"; - } - - $url_path .= $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']); - - return $url_path; */ - return SELF_URL_PATH; - } + function opml_publish_url($link){ $url_path = get_self_url_prefix(); @@ -5722,9 +5853,9 @@ // Test if feed is currently being updated by another process. if (DB_TYPE == "pgsql") { - $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '120 seconds')"; + $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')"; } else { - $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 120 SECOND))"; + $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))"; } // Test if there is a limit to number of updated feeds @@ -6110,6 +6241,38 @@ return $unread; } + function ccache_cleanup($link, $owner_uid) { + + if (DB_TYPE == "pgsql") { + db_query($link, "DELETE FROM ttrss_counters_cache AS c1 WHERE + (SELECT count(*) FROM ttrss_counters_cache AS c2 + WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1 + AND owner_uid = '$owner_uid'"); + + db_query($link, "DELETE FROM ttrss_cat_counters_cache AS c1 WHERE + (SELECT count(*) FROM ttrss_cat_counters_cache AS c2 + WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1 + AND owner_uid = '$owner_uid'"); + } else { + db_query($link, "DELETE c1 FROM + ttrss_counters_cache AS c1, + ttrss_counters_cache AS c2 + WHERE + c1.owner_uid = '$owner_uid' AND + c1.owner_uid = c2.owner_uid AND + c1.feed_id = c2.feed_id"); + + db_query($link, "DELETE c1 FROM + ttrss_cat_counters_cache AS c1, + ttrss_cat_counters_cache AS c2 + WHERE + c1.owner_uid = '$owner_uid' AND + c1.owner_uid = c2.owner_uid AND + c1.feed_id = c2.feed_id"); + + } + } + function label_find_id($link, $label, $owner_uid) { $result = db_query($link, "SELECT id FROM ttrss_labels2 WHERE caption = '$label' @@ -6353,12 +6516,6 @@ $num_tags = 0; -/* if (get_user_theme($link) == "3pane") { - $tag_limit = 3; - } else { - $tag_limit = 6; - } */ - $tag_limit = 6; $formatted_tags = array(); @@ -6487,9 +6644,9 @@ db_query($link, "COMMIT"); -/* if (file_exists(ICONS_DIR . "/$id.ico")) { + if (file_exists(ICONS_DIR . "/$id.ico")) { unlink(ICONS_DIR . "/$id.ico"); - } */ + } ccache_remove($link, $id, $owner_uid); @@ -6749,7 +6906,7 @@ function api_get_headlines($link, $feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, - $include_attachments) { + $include_attachments, $since_id) { /* do not rely on params below */ @@ -6759,7 +6916,7 @@ $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, $match_on, - $order, $offset); + $order, $offset, 0, false, $since_id); $result = $qfh_ret[0]; $feed_title = $qfh_ret[1]; @@ -7387,11 +7544,17 @@ _debug("Updating: " . $line['access_url'] . " ($id)"); - $fetch_url = $line['access_url'] . '/backend.php?op=fbexport'; + $fetch_url = $line['access_url'] . '/public.php?op=fbexport'; $post_query = 'key=' . $line['access_key']; $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); + // try doing it the old way + if (!$feeds) { + $fetch_url = $line['access_url'] . '/backend.php?op=fbexport'; + $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); + } + if ($feeds) { $feeds = json_decode($feeds, true); @@ -7441,6 +7604,223 @@ last_status_out = '$status', last_connected = NOW() WHERE id = '$id'"); } + } + + function handle_public_request($link, $op) { + switch ($op) { + + case "getUnread": + $login = db_escape_string($_REQUEST["login"]); + $fresh = $_REQUEST["fresh"] == "1"; + + $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$login'"); + + if (db_num_rows($result) == 1) { + $uid = db_fetch_result($result, 0, "id"); + + print getGlobalUnread($link, $uid); + + if ($fresh) { + print ";"; + print getFeedArticles($link, -3, false, true, $uid); + } + + } else { + print "-1;User not found"; + } + + break; // getUnread + + case "getProfiles": + $login = db_escape_string($_REQUEST["login"]); + $password = db_escape_string($_REQUEST["password"]); + + if (authenticate_user($link, $login, $password)) { + $result = db_query($link, "SELECT * FROM ttrss_settings_profiles + WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title"); + + print ""; + + $_SESSION = array(); + } + break; // getprofiles + + case "pubsub": + $mode = db_escape_string($_REQUEST['hub_mode']); + $feed_id = (int) db_escape_string($_REQUEST['id']); + $feed_url = db_escape_string($_REQUEST['hub_topic']); + + if (!PUBSUBHUBBUB_ENABLED) { + header('HTTP/1.0 404 Not Found'); + echo "404 Not found"; + return; + } + + // TODO: implement hub_verifytoken checking + + $result = db_query($link, "SELECT feed_url FROM ttrss_feeds + WHERE id = '$feed_id'"); + + if (db_num_rows($result) != 0) { + + $check_feed_url = db_fetch_result($result, 0, "feed_url"); + + if ($check_feed_url && ($check_feed_url == $feed_url || !$feed_url)) { + if ($mode == "subscribe") { + db_query($link, "UPDATE ttrss_feeds SET pubsub_state = 2 + WHERE id = '$feed_id'"); + + print $_REQUEST['hub_challenge']; + return; + + } else if ($mode == "unsubscribe") { + + db_query($link, "UPDATE ttrss_feeds SET pubsub_state = 0 + WHERE id = '$feed_id'"); + + print $_REQUEST['hub_challenge']; + return; + + } else if (!$mode) { + + // Received update ping, schedule feed update. + //update_rss_feed($link, $feed_id, true, true); + + db_query($link, "UPDATE ttrss_feeds SET + last_update_started = '1970-01-01', + last_updated = '1970-01-01' WHERE id = '$feed_id' AND + owner_uid = ".$_SESSION["uid"]); + + } + } else { + header('HTTP/1.0 404 Not Found'); + echo "404 Not found"; + } + } else { + header('HTTP/1.0 404 Not Found'); + echo "404 Not found"; + } + + break; // pubsub + + case "logout": + logout_user(); + header("Location: tt-rss.php"); + break; // logout + + case "fbexport": + + $access_key = db_escape_string($_POST["key"]); + + // TODO: rate limit checking using last_connected + $result = db_query($link, "SELECT id FROM ttrss_linked_instances + WHERE access_key = '$access_key'"); + + if (db_num_rows($result) == 1) { + + $instance_id = db_fetch_result($result, 0, "id"); + + $result = db_query($link, "SELECT feed_url, site_url, title, subscribers + FROM ttrss_feedbrowser_cache ORDER BY subscribers DESC LIMIT 100"); + + $feeds = array(); + + while ($line = db_fetch_assoc($result)) { + array_push($feeds, $line); + } + + db_query($link, "UPDATE ttrss_linked_instances SET + last_status_in = 1 WHERE id = '$instance_id'"); + + print json_encode(array("feeds" => $feeds)); + } else { + print json_encode(array("error" => array("code" => 6))); + } + break; // fbexport + + case "share": + $uuid = db_escape_string($_REQUEST["key"]); + + $result = db_query($link, "SELECT ref_id, owner_uid FROM ttrss_user_entries WHERE + uuid = '$uuid'"); + + if (db_num_rows($result) != 0) { + header("Content-Type: text/html"); + + $id = db_fetch_result($result, 0, "ref_id"); + $owner_uid = db_fetch_result($result, 0, "owner_uid"); + + $_SESSION["uid"] = $owner_uid; + $article = format_article($link, $id, false, true); + $_SESSION["uid"] = ""; + + print_r($article['content']); + + } else { + print "Article not found."; + } + + break; + + case "rss": + $feed = db_escape_string($_REQUEST["id"]); + $key = db_escape_string($_REQUEST["key"]); + $is_cat = $_REQUEST["is_cat"] != false; + $limit = (int)db_escape_string($_REQUEST["limit"]); + + $search = db_escape_string($_REQUEST["q"]); + $match_on = db_escape_string($_REQUEST["m"]); + $search_mode = db_escape_string($_REQUEST["smode"]); + $view_mode = db_escape_string($_REQUEST["view-mode"]); + + if (SINGLE_USER_MODE) { + authenticate_user($link, "admin", null); + } + + $owner_id = false; + + if ($key) { + $result = db_query($link, "SELECT owner_uid FROM + ttrss_access_keys WHERE access_key = '$key' AND feed_id = '$feed'"); + + if (db_num_rows($result) == 1) + $owner_id = db_fetch_result($result, 0, "owner_uid"); + } + + if ($owner_id) { + $_SESSION['uid'] = $owner_id; + + generate_syndicated_feed($link, 0, $feed, $is_cat, $limit, + $search, $search_mode, $match_on, $view_mode); + } else { + header('HTTP/1.1 403 Forbidden'); + } + break; // rss + + + case "globalUpdateFeeds": + // Update all feeds needing a update. + update_daemon_common($link, 0, true, true); + break; // globalUpdateFeeds + + + default: + header("Content-Type: text/plain"); + print json_encode(array("error" => array("code" => 7))); + break; // fallback + + } } ?>