}
require_once 'db-prefs.php';
- require_once 'errors.php';
require_once 'version.php';
- require_once 'lib/phpmailer/class.phpmailer.php';
- require_once 'lib/sphinxapi.php';
- require_once 'lib/tmhoauth/tmhOAuth.php';
-
- //define('MAGPIE_USER_AGENT_EXT', ' (Tiny Tiny RSS/' . VERSION . ')');
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
define('SELF_USER_AGENT', 'Tiny Tiny RSS/' . VERSION . ' (http://tt-rss.org/)');
ini_set('user_agent', SELF_USER_AGENT);
- require_once "lib/simplepie/simplepie.inc";
- require_once "lib/magpierss/rss_fetch.inc";
- require_once 'lib/magpierss/rss_utils.inc';
- require_once 'lib/htmlpurifier/library/HTMLPurifier.auto.php';
require_once 'lib/pubsubhubbub/publisher.php';
- require_once 'lib/pubsubhubbub/subscriber.php';
-
- $config = HTMLPurifier_Config::createDefault();
- $allowed = "p,a[href],i,em,b,strong,code,pre,blockquote,br,img[src|alt|title],ul,ol,li,h1,h2,h3,h4,s,object[classid|type|id|name|width|height|codebase],param[name|value]";
+ $purifier = false;
- $config->set('HTML.SafeObject', true);
- @$config->set('HTML', 'Allowed', $allowed);
- $config->set('Output.FlashCompat', true);
- $config->set('Attr.EnableID', true);
- @$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.
}
} // function purge_feed
- /**
- * Purge old posts from old feeds. Not used anymore, purging is done after feed update.
- *
- * @param mixed $link A database connection
- * @param boolean $do_output Set to true to enable printed output, false by default.
- * @param integer $limit The maximal number of removed posts.
- * @access public
- * @return void
- */
- /* function global_purge_old_posts($link, $do_output = false, $limit = false) {
-
- $random_qpart = sql_random_function();
-
- if ($limit) {
- $limit_qpart = "LIMIT $limit";
- } else {
- $limit_qpart = "";
- }
-
- $result = db_query($link,
- "SELECT id,purge_interval,owner_uid FROM ttrss_feeds
- ORDER BY $random_qpart $limit_qpart");
-
- while ($line = db_fetch_assoc($result)) {
-
- $feed_id = $line["id"];
- $purge_interval = $line["purge_interval"];
- $owner_uid = $line["owner_uid"];
-
- if ($purge_interval == 0) {
-
- $tmp_result = db_query($link,
- "SELECT value FROM ttrss_user_prefs WHERE
- pref_name = 'PURGE_OLD_DAYS' AND owner_uid = '$owner_uid'");
-
- if (db_num_rows($tmp_result) != 0) {
- $purge_interval = db_fetch_result($tmp_result, 0, "value");
- }
- }
-
- if ($do_output) {
-// print "Feed $feed_id: purge interval = $purge_interval\n";
- }
-
- if ($purge_interval > 0 || FORCE_ARTICLE_PURGE) {
- purge_feed($link, $feed_id, $purge_interval, $do_output);
- }
- }
-
- purge_orphans($link, $do_output);
-
- } // function global_purge_old_posts */
-
function feed_purge_interval($link, $feed_id) {
$result = db_query($link, "SELECT purge_interval, owner_uid FROM ttrss_feeds
}
}
- function purge_old_posts($link) {
-
- $user_id = $_SESSION["uid"];
-
- $result = db_query($link, "SELECT id,purge_interval FROM ttrss_feeds
- WHERE owner_uid = '$user_id'");
-
- while ($line = db_fetch_assoc($result)) {
-
- $feed_id = $line["id"];
- $purge_interval = $line["purge_interval"];
-
- if ($purge_interval == 0) $purge_interval = get_pref($link, 'PURGE_OLD_DAYS');
-
- if ($purge_interval > 0) {
- purge_feed($link, $feed_id, $purge_interval);
- }
- }
-
- purge_orphans($link);
- }
-
function purge_orphans($link, $do_output = false) {
// purge orphaned posts in main content table
$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);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
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);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass");
$contents = @curl_exec($ch);
+
if ($contents === false) {
curl_close($ch);
return false;
return $contents;
} else {
- if ($login && $pass && $updated != 3) {
+ if ($login && $pass ){
$url_parts = array();
preg_match("/(^[^:]*):\/\/(.*)/", $url, $url_parts);
} // 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);
+ }
}
}
}
}
}
- 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) {
+
+ require_once "lib/simplepie/simplepie.inc";
+ require_once "lib/magpierss/rss_fetch.inc";
+ require_once 'lib/magpierss/rss_utils.inc';
global $memcache;
$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);
}
+ if ($override_url)
+ $fetch_url = $override_url;
+
if ($debug_enabled) {
_debug("update_rss_feed: fetching [$fetch_url]...");
}
# $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) {
$site_url = $rss->channel["link"];
}
+ $site_url = rewrite_relative_url($fetch_url, $site_url);
+
if ($debug_enabled) {
_debug("update_rss_feed: checking favicon...");
}
return; // no articles
}
- if ($pubsub_state != 2) {
+ if ($pubsub_state != 2 && PUBSUBHUBBUB_ENABLED) {
+
+ if ($debug_enabled) _debug("update_rss_feed: checking for PUSH hub...");
$feed_hub_url = false;
if ($use_simplepie) {
}
}
- if ($feed_hub_url && function_exists('curl_init')) {
+ if ($debug_enabled) _debug("update_rss_feed: feed hub url: $feed_hub_url");
+
+ if ($feed_hub_url && function_exists('curl_init') &&
+ !ini_get("open_basedir")) {
+
+ require_once 'lib/pubsubhubbub/subscriber.php';
+
$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);
- $s->subscribe($fetch_url);
+ $rc = $s->subscribe($fetch_url);
+
+ if ($debug_enabled)
+ _debug("update_rss_feed: feed hub url found, subscribe request sent.");
db_query($link, "UPDATE ttrss_feeds SET pubsub_state = 1
WHERE id = '$feed'");
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);;
if (!$entry_content) $entry_content = $item["content"]["encoded"];
if (!$entry_content) $entry_content = $item["content"];
+ if (is_array($entry_content)) $entry_content = $entry_content[0];
+
// Magpie bugs are getting ridiculous
if (trim($entry_content) == "Array") $entry_content = false;
$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);
}
$post_needs_update = false;
+ $update_insignificant = false;
- if ($content_hash != $orig_content_hash) {
-// print "<!-- [$entry_title] $content_hash vs $orig_content_hash -->";
+ if ($orig_num_comments != $num_comments) {
$post_needs_update = true;
+ $update_insignificant = true;
}
- if (db_escape_string($orig_title) != $entry_title) {
+ if ($content_hash != $orig_content_hash) {
$post_needs_update = true;
+ $update_insignificant = false;
}
- if ($orig_num_comments != $num_comments) {
+ if (db_escape_string($orig_title) != $entry_title) {
$post_needs_update = true;
+ $update_insignificant = false;
}
-// this doesn't seem to be very reliable
-//
-// if ($orig_timestamp != $entry_timestamp && !$orig_no_orig_date) {
-// $post_needs_update = true;
-// }
-
// if post needs update, update it and mark all user entries
// linking to this post as updated
if ($post_needs_update) {
num_comments = '$num_comments'
WHERE id = '$ref_id'");
- if ($mark_unread_on_update) {
- db_query($link, "UPDATE ttrss_user_entries
- SET last_read = null, unread = true WHERE ref_id = '$ref_id'");
- } else if ($update_on_checksum_change) {
- db_query($link, "UPDATE ttrss_user_entries
- SET last_read = null WHERE ref_id = '$ref_id' AND unread = false");
+ if (!$update_insignificant) {
+ if ($mark_unread_on_update) {
+ db_query($link, "UPDATE ttrss_user_entries
+ SET last_read = null, unread = true WHERE ref_id = '$ref_id'");
+ } else if ($update_on_checksum_change) {
+ db_query($link, "UPDATE ttrss_user_entries
+ SET last_read = null WHERE ref_id = '$ref_id'
+ AND unread = false");
+ }
}
-
}
}
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)) {
// 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();
}
- function lookup_user_id($link, $user) {
-
- $result = db_query($link, "SELECT id FROM ttrss_users WHERE
- login = '$login'");
-
- if (db_num_rows($result) == 1) {
- return db_fetch_result($result, 0, "id");
- } else {
- return false;
- }
- }
-
- function http_authenticate_user($link) {
-
-// error_log("http_authenticate_user: ".$_SERVER["PHP_AUTH_USER"]."\n", 3, '/tmp/tt-rss.log');
-
- if (!$_SERVER["PHP_AUTH_USER"]) {
-
- header('WWW-Authenticate: Basic realm="Tiny Tiny RSS RSSGen"');
- header('HTTP/1.0 401 Unauthorized');
- exit;
-
- } else {
- $auth_result = authenticate_user($link,
- $_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]);
-
- if (!$auth_result) {
- header('WWW-Authenticate: Basic realm="Tiny Tiny RSS RSSGen"');
- header('HTTP/1.0 401 Unauthorized');
- exit;
- }
- }
-
- return true;
- }
-
function get_ssl_certificate_id() {
if ($_SERVER["REDIRECT_SSL_CLIENT_M_SERIAL"]) {
return sha1($_SERVER["REDIRECT_SSL_CLIENT_M_SERIAL"] .
// 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);
}
}
// 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"]);
}
}
}
- function get_script_urlpath() {
- return preg_replace('/\/[^\/]*$/', "", $_SERVER["REQUEST_URI"]);
- }
-
function validate_session($link) {
if (SINGLE_USER_MODE) return true;
}
function login_sequence($link, $mobile = false) {
+ $_SESSION["prefs_cache"] = array();
+
if (!SINGLE_USER_MODE) {
$login_action = $_POST["login_action"];
# try to authenticate user if called from login form
if ($login_action == "do_login") {
- $login = $_POST["login"];
+ $login = db_escape_string($_POST["login"]);
$password = $_POST["password"];
$remember_me = $_POST["remember_me"];
setcookie("ttrss_lang", $_SESSION["language"],
time() + SESSION_COOKIE_LIFETIME);
}
+
+ // try to remove possible duplicates from feed counter cache
+// ccache_cleanup($link, $_SESSION["uid"]);
}
} else {
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);
}
}
- function smart_date($timestamp) {
- if (date("Y.m.d", $timestamp) == date("Y.m.d")) {
- return "Today";
- } else if (date("Y", $timestamp) == date("Y")) {
- return date("D m", $timestamp);
- } else {
- return date("Y/m/d", $timestamp);
- }
- }
-
- function sql_bool_to_string($s) {
- if ($s == "t" || $s == "1") {
- return "true";
- } else {
- return "false";
- }
- }
-
function sql_bool_to_bool($s) {
if ($s == "t" || $s == "1" || $s == "true") {
return true;
}
}
- function toggleEvenOdd($a) {
- if ($a == "even")
- return "odd";
- else
- return "even";
- }
-
// Session caching removed due to causing wrong redirects to upgrade
// 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) {
-
- global $ERRORS;
+ require_once 'errors.php';
$error_code = 0;
- $schema_version = get_schema_version($link);
+ $schema_version = get_schema_version($link, true);
if ($schema_version != SCHEMA_VERSION) {
$error_code = 5;
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) {
}
} 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
if (strchr($omode, "l")) $data = array_merge($data, getLabelCounters($link));
if (strchr($omode, "f")) $data = array_merge($data, getFeedCounters($link, $active_feed));
if (strchr($omode, "t")) $data = array_merge($data, getTagCounters($link));
- if (strchr($omode, "c")) {
- if (get_pref($link, 'ENABLE_FEED_CATS')) {
- $data = array_merge($data, getCategoryCounters($link));
- }
- }
+ if (strchr($omode, "c")) $data = array_merge($data, getCategoryCounters($link));
return $data;
}
return $ret_arr;
}
- function getSubscribedFeeds($link) {
- $result = db_query($link, "SELECT COUNT(id) AS fn FROM
- ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]);
-
- return db_fetch_result($result, 0, "fn");
- }
-
function getTagCounters($link) {
$ret_arr = array();
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];
}
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");
}
}
- function get_session_cookie_name() {
- return ((!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME);
- }
-
function make_init_params($link) {
$params = array();
return $params;
}
- function print_runtime_info($link) {
- print "<runtime-info><![CDATA[";
- print json_encode(make_runtime_info($link));
- print "]]></runtime-info>";
- }
-
function make_runtime_info($link) {
$data = array();
$search_query_part = "";
- $keywords = split(" ", $search);
+ $keywords = explode(" ", $search);
$query_keywords = array();
foreach ($keywords as $k) {
$not = "";
}
- $commandpair = split(":", mb_strtolower($k), 2);
+ $commandpair = explode(":", mb_strtolower($k), 2);
if ($commandpair[0] == "note" && $commandpair[1]) {
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"];
$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") {
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");
guid,
ttrss_entries.id,ttrss_entries.title,
updated,
+ label_cache,
+ tag_cache,
+ always_display_enclosures,
+ site_url,
note,
+ num_comments,
+ comments,
+ int_id,
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
$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";
} 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);
$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();
$res = trim($str); if (!$res) return '';
-// if (get_pref($link, "STRIP_UNSAFE_TAGS", $owner) || $force_strip_tags) {
+ // create global Purifier object if needed
+ if (!$purifier) {
+ require_once 'lib/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+
+ $allowed = "p,a[href],i,em,b,strong,code,pre,blockquote,br,img[src|alt|title],ul,ol,li,h1,h2,h3,h4,s,object[classid|type|id|name|width|height|codebase],param[name|value],table,tr,td";
+
+ $config->set('HTML.SafeObject', true);
+ @$config->set('HTML', 'Allowed', $allowed);
+ $config->set('Output.FlashCompat', true);
+ $config->set('Attr.EnableID', true);
+ if (!defined('MOBILE_VERSION')) {
+ @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier");
+ } else {
+ @$config->set('Cache', 'SerializerPath', "../" . CACHE_DIR . "/htmlpurifier");
+ }
+
+ $purifier = new HTMLPurifier($config);
+ }
+
$res = $purifier->purify($res);
-// }
if (get_pref($link, "STRIP_IMAGES", $owner)) {
$res = preg_replace('/<img[^>]+>/is', '', $res);
*/
function send_headlines_digests($link, $limit = 100) {
+ require_once 'lib/phpmailer/class.phpmailer.php';
+
if (!DIGEST_ENABLE) return false;
$user_limit = DIGEST_EMAIL_LIMIT;
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);
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 .= "<option value=\"0\" disabled=\"1\">".__('Feed:')."</option>";
$fg_color = db_fetch_result($result, 0, "fg_color");
$bg_color = db_fetch_result($result, 0, "bg_color");
- $reply .= "<span style='background : $bg_color; color : $fg_color'>";
+ $reply .= "<span style=\"background : $bg_color; color : $fg_color\" >";
$reply .= $feed_title;
$reply .= "</span>";
} else {
}
}
- if ($search) {
- $search_q = "&q=$search&m=$match_on&smode=$search_mode";
- } else {
- $search_q = "";
- }
-
$reply .= "
<a href=\"#\"
title=\"".__("View as RSS feed")."\"
return $feedlist;
}
- function get_article_tags($link, $id, $owner_uid = 0) {
+ function get_article_tags($link, $id, $owner_uid = 0, $tag_cache = false) {
global $memcache;
} else {
/* check cache first */
- $result = db_query($link, "SELECT tag_cache FROM ttrss_user_entries
- WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+ if ($tag_cache === false) {
+ $result = db_query($link, "SELECT tag_cache FROM ttrss_user_entries
+ WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
- $tag_cache = db_fetch_result($result, 0, "tag_cache");
+ $tag_cache = db_fetch_result($result, 0, "tag_cache");
+ }
if ($tag_cache) {
$tags = explode(",", $tag_cache);
return $tags;
}
- function trim_value(&$value) {
- $value = trim($value);
- }
-
function trim_array($array) {
$tmp = $array;
- array_walk($tmp, 'trim_value');
+ array_walk($tmp, 'trim');
return $tmp;
}
return $entry;
}
- function format_article($link, $id, $feed_id, $mark_as_read = true,
- $zoom_mode = false) {
+ function format_article($link, $id, $mark_as_read = true, $zoom_mode = false) {
$rv = array();
(SELECT icon_url FROM ttrss_feeds WHERE id = feed_id) as icon_url,
(SELECT site_url FROM ttrss_feeds WHERE id = feed_id) as site_url,
num_comments,
+ tag_cache,
author,
orig_feed_id,
note
$rv['content'] .= "<div clear='both'>" . $line["title"] . "$entry_author</div>";
}
- $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);
alt='Zoom' title='".__('Share on Twitter')."'>";
}
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-share.png')."\"
+ class='tagsPic' style=\"cursor : pointer\"
+ onclick=\"shareArticle(".$line['int_id'].")\"
+ alt='Zoom' title='".__('Share by URL')."'>";
+
$rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"closeArticlePanel($id)\"
$topmost_article_ids = array();
- if (!$offset) {
- $offset = 0;
- }
-
+ if (!$offset) $offset = 0;
if ($subop == "undefined") $subop = "";
- $subop_split = split(":", $subop);
+ $subop_split = explode(":", $subop);
- if ($subop == "CatchupSelected") {
- $ids = split(",", db_escape_string($_REQUEST["ids"]));
+/* if ($subop == "CatchupSelected") {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
$cmode = sprintf("%d", $_REQUEST["cmode"]);
catchupArticlesById($link, $ids, $cmode);
- }
+ } */
- if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
+ if ($subop == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
update_rss_feed($link, $feed, true);
}
// 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");
$rtl_content = false;
}
- /// START /////////////////////////////////////////////////////////////////////////////////
-
@$search = db_escape_string($_REQUEST["query"]);
if ($search) {
$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);
$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);
- $labels = get_article_labels($link, $id);
+ if ($label_cache) {
+ if ($label_cache["no-labels"] == 1)
+ $labels = array();
+ else
+ $labels = $label_cache;
+ }
+ }
+
+ if (!is_array($labels)) $labels = get_article_labels($link, $id);
$labels_str = "<span id=\"HLLCTR-$id\">";
$labels_str .= format_article_labels($labels, $id);
$marked_pic = "<img id=\"FMPIC-$id\"
src=\"".theme_image($link, 'images/mark_set.png')."\"
class=\"markedPic\" alt=\"Unstar article\"
- onclick='javascript:tMark($id)'>";
+ onclick='javascript:toggleMark($id)'>";
} else {
$marked_pic = "<img id=\"FMPIC-$id\"
src=\"".theme_image($link, 'images/mark_unset.png')."\"
class=\"markedPic\" alt=\"Star article\"
- onclick='javascript:tMark($id)'>";
+ onclick='javascript:toggleMark($id)'>";
}
if ($line["published"] == "t" || $line["published"] == "1") {
$published_pic = "<img id=\"FPPIC-$id\" src=\"".theme_image($link,
'images/pub_set.png')."\"
class=\"markedPic\"
- alt=\"Unpublish article\" onclick='javascript:tPub($id)'>";
+ alt=\"Unpublish article\" onclick='javascript:togglePub($id)'>";
} else {
$published_pic = "<img id=\"FPPIC-$id\" src=\"".theme_image($link,
'images/pub_unset.png')."\"
class=\"markedPic\"
- alt=\"Publish article\" onclick='javascript:tPub($id)'>";
+ alt=\"Publish article\" onclick='javascript:togglePub($id)'>";
}
# $content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" .
$reply['content'] .= "<a id=\"RTITLE-$id\"
href=\"" . htmlspecialchars($line["link"]) . "\"
onclick=\"\">" .
- $line["title"];
+ truncate_string($line["title"], 200);
if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
if ($content_preview) {
$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 "<span class=\"hlFeed\">
+ $reply['content'] .= "<span class=\"hlFeed\">
(<a href=\"#\" onclick=\"viewfeed($feed_id)\">".
$line["feed_title"]."</a>)
</span>";
}
- } */
+ }
$reply['content'] .= "</div>";
$reply['content'] .= "<div class=\"cdmHeader\">";
- $reply['content'] .= "<div style='float : right'>";
- $reply['content'] .= "<span class='updated'>$updated_fmt</span>";
- $reply['content'] .= "$score_pic";
-
- if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
- $reply['content'] .= "<span style=\"cursor : pointer\"
- title=\"".htmlspecialchars($line["feed_title"])."\"
- onclick=\"viewfeed($feed_id)\">$feed_icon_img</span>";
- }
- $reply['content'] .= "<div class=\"updPic\">$update_pic</div>";
-
- $reply['content'] .= "</div>";
+ $reply['content'] .= "<div>";
$reply['content'] .= "<input type=\"checkbox\" onclick=\"toggleSelectRowById(this,
'RROW-$id')\" id=\"RCHK-$id\"/>";
$reply['content'] .= "$marked_pic";
$reply['content'] .= "$published_pic";
+ $reply['content'] .= "</div>";
+
$reply['content'] .= "<span id=\"RTITLE-$id\"
onclick=\"return cdmClicked(event, $id);\"
class=\"titleWrap$hlc_suffix\">
$reply['content'] .= $labels_str;
+ if (!get_pref($link, 'VFEED_GROUP_BY_FEED') &&
+ defined('_SHOW_FEED_TITLE_IN_VFEEDS')) {
+ if (@$line["feed_title"]) {
+ $reply['content'] .= "<span class=\"hlFeed\">
+ (<a href=\"#\" onclick=\"viewfeed($feed_id)\">".
+ $line["feed_title"]."</a>)
+ </span>";
+ }
+ }
+
if (!$expand_cdm)
$content_hidden = "style=\"display : none\"";
else
$reply['content'] .= "</span>";
+ $reply['content'] .= "<div>";
+ $reply['content'] .= "<span class='updated'>$updated_fmt</span>";
+ $reply['content'] .= "$score_pic";
+
+ if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
+ $reply['content'] .= "<span style=\"cursor : pointer\"
+ title=\"".htmlspecialchars($line["feed_title"])."\"
+ onclick=\"viewfeed($feed_id)\">$feed_icon_img</span>";
+ }
+ $reply['content'] .= "<div class=\"updPic\">$update_pic</div>";
+ $reply['content'] .= "</div>";
+
$reply['content'] .= "</div>";
$reply['content'] .= "<div class=\"cdmContent\" $content_hidden
}
}
- // FIXME: make this less of a hack
+ $feed_site_url = $line["site_url"];
- $feed_site_url = false;
-
- if ($line["feed_id"]) {
- $tmp_result = db_query($link, "SELECT site_url FROM ttrss_feeds
- WHERE id = " . $line["feed_id"]);
-
- if (db_num_rows($tmp_result) == 1) {
- $feed_site_url = db_fetch_result($tmp_result, 0, "site_url");
- }
- }
-
- if ($expand_cdm) {
- $article_content = sanitize_rss($link, $line["content_preview"],
+ $article_content = sanitize_rss($link, $line["content_preview"],
false, false, $feed_site_url);
- if (!$article_content) $article_content = " ";
- } else {
- $article_content = '';
- }
-
$reply['content'] .= "<div id=\"POSTNOTE-$id\">";
if ($line['note']) {
$reply['content'] .= format_article_note($id, $line['note']);
}
$reply['content'] .= "</div>";
- $reply['content'] .= "<span id=\"CWRAP-$id\">$article_content</span>";
+ $reply['content'] .= "<span id=\"CWRAP-$id\">";
+ $reply['content'] .= $expand_cdm ? $article_content : '';
+ $reply['content'] .= "</span>";
- $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);
$reply['content'] .= "<div class=\"cdmFooter\">";
- $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'] .= "<img src='".theme_image($link,
'images/tag.png')."' alt='Tags' title='Tags'>
<a title=\"".__('Edit tags for this article')."\"
href=\"#\" onclick=\"editArticleTags($id, $feed_id, true)\">(+)</a>";
+ $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 = "<a target='_blank' href=\"$comments_url\">$num_comments comments</a>";
+ } else {
+ if ($line["comments"] && $line["link"] != $line["comments"]) {
+ $entry_comments = "<a target='_blank' href=\"".$line["comments"]."\">comments</a>";
+ }
+ }
+
+ if ($entry_comments) $reply['content'] .= " ($entry_comments)";
+
$reply['content'] .= "<div style=\"float : right\">";
$reply['content'] .= "<img src=\"images/art-zoom.png\"
alt='Zoom' title='".__('Share on Twitter')."'>";
}
+ $reply['content'] .= "<img src=\"".theme_image($link, 'images/art-share.png')."\"
+ class='tagsPic' style=\"cursor : pointer\"
+ onclick=\"shareArticle(".$line['int_id'].")\"
+ alt='Zoom' title='".__('Share by URL')."'>";
+
$reply['content'] .= "<img src=\"images/digest_checkbox.png\"
style=\"cursor : pointer\" style=\"cursor : pointer\"
onclick=\"dismissArticle($id)\"
++$lnum;
}
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("PE", $timing_info);
+
} else {
$message = "";
}
}
-# if (!$offset) {
-# if ($headlines_count > 0) print "</div>";
-# print "</div>";
-# }
-
- #print "]]></content>";
+ 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
$tags[$line["tag_name"]] = $line["count"];
}
+ if( count($tags) == 0 ){ return; }
+
ksort($tags);
$max_size = 32; // max font size in pixels
}
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();
// 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
}
}
- function rounded_table_start($classname, $header = " ") {
- print "<table width='100%' class='$classname' cellspacing='0' cellpadding='0'>";
- print "<tr><td class='c1'> </td><td class='top'>$header</td><td class='c2'> </td></tr>";
- print "<tr><td class='left'> </td><td class='content'>";
- }
-
- function rounded_table_end($footer = " ") {
- print "</td><td class='right'> </td></tr>";
- print "<tr><td class='c4'> </td><td class='bottom'>$footer</td><td class='c3'> </td></tr>";
- print "</table>";
- }
-
function feed_has_icon($id) {
return is_file(ICONS_DIR . "/$id.ico") && filesize(ICONS_DIR . "/$id.ico") > 0;
}
}
- function ccache_zero($link, $feed_id, $owner_uid) {
+ /* function ccache_zero($link, $feed_id, $owner_uid) {
db_query($link, "UPDATE ttrss_counters_cache SET
value = 0, updated = NOW() WHERE
feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
- }
+ } */
function ccache_zero_all($link, $owner_uid) {
db_query($link, "UPDATE ttrss_counters_cache SET
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'
return $result;
}
- function print_labels_headlines_dropdown($link, $feed_id) {
- print "<option value=\"addLabel()\">".__("Create label...")."</option>";
-
- $result = db_query($link, "SELECT id, caption FROM ttrss_labels2 WHERE
- owner_uid = '".$_SESSION["uid"]."' ORDER BY caption");
-
- while ($line = db_fetch_assoc($result)) {
-
- $label_id = $line["id"];
- $label_caption = $line["caption"];
- $id = $line["id"];
-
- if ($feed_id < -10 && $feed_id == -11-$label_id) {
- print "<option id=\"LHDL-$id\"
- value=\"selectionRemoveLabel($label_id)\">".
- __('Remove:') . " $label_caption</option>";
- } else {
- print "<option id=\"LHDL-$id\"
- value=\"selectionAssignLabel($label_id)\">".
- __('Assign:') . " $label_caption</option>";
- }
- }
- }
-
function format_tags_string($tags, $id) {
$tags_str = "";
$num_tags = 0;
-/* if (get_user_theme($link) == "3pane") {
- $tag_limit = 3;
- } else {
- $tag_limit = 6;
- } */
-
$tag_limit = 6;
$formatted_tags = array();
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);
}
}
- function make_url_from_parts($parts) {
- $url = $parts['scheme'] . '://' . $parts['host'];
-
- if ($parts['path']) $url .= $parts['path'];
- if ($parts['query']) $url .= '?' . $parts['query'];
-
- return $url;
- }
-
/**
* Fixes incomplete URLs by prepending "http://".
* Also replaces feed:// with http://, and
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 */
$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];
$is_updated = ($line["last_read"] == "" &&
($line["unread"] != "t" && $line["unread"] != "1"));
+ $tags = explode(",", $line["tag_cache"]);
+ $labels = json_decode($line["label_cache"], true);
+
+ //if (!$tags) $tags = get_article_tags($link, $line["id"]);
+ //if (!$labels) $labels = get_article_labels($link, $line["id"]);
+
$headline_row = array(
"id" => (int)$line["id"],
"unread" => sql_bool_to_bool($line["unread"]),
"title" => $line["title"],
"link" => $line["link"],
"feed_id" => $line["feed_id"],
- "tags" => get_article_tags($link, $line["id"]),
+ "tags" => $tags,
);
if ($include_attachments)
$headline_row["content"] = $line["content_preview"];
}
+ // unify label output to ease parsing
+ if ($labels["no-labels"] == 1) $labels = array();
+
+ $headline_row["labels"] = $labels;
+
array_push($headlines, $headline_row);
}
}
function sphinx_search($query, $offset = 0, $limit = 30) {
+ require_once 'lib/sphinxapi.php';
+
$sphinxClient = new SphinxClient();
$sphinxClient->SetServer('localhost', 9312);
function fetch_twitter_rss($link, $url, $owner_uid) {
+
+ require_once 'lib/tmhoauth/tmhOAuth.php';
+
$result = db_query($link, "SELECT twitter_oauth FROM ttrss_users
WHERE id = $owner_uid");
if ($query) {
if (DB_TYPE == "pgsql") {
- $query .= " AND ttrss_entries.date_entered > NOW() - INTERVAL '30 days'";
+ $query = " ($query) AND ttrss_entries.date_entered > NOW() - INTERVAL '14 days'";
} else {
- $query .= " AND ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL 30 DAY";
+ $query = " ($query) AND ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL 14 DAY)";
}
$query .= " AND ";
}
+
return $query;
}
_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);
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 "<select style='width: 100%' name='profile'>";
+
+ print "<option value='0'>" . __("Default profile") . "</option>";
+
+ while ($line = db_fetch_assoc($result)) {
+ $id = $line["id"];
+ $title = $line["title"];
+
+ print "<option value='$id'>$title</option>";
+ }
+
+ print "</select>";
+ $_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'");
+
+ }
+ } 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
+
+ }
}
?>