<?php
define('EXPECTED_CONFIG_VERSION', 26);
- define('SCHEMA_VERSION', 120);
+ define('SCHEMA_VERSION', 121);
define('LABEL_BASE_INDEX', -1024);
define('PLUGIN_FEED_BASE_INDEX', -128);
"hu_HU" => "Magyar (Hungarian)",
"it_IT" => "Italiano",
"ja_JP" => "日本語 (Japanese)",
+ "ko_KR" => "한국어 (Korean)",
"lv_LV" => "Latviešu",
"nb_NO" => "Norwegian bokmål",
"nl_NL" => "Dutch",
if ($_SESSION["uid"] && get_schema_version() >= 120) {
$pref_lang = get_pref("USER_LANGUAGE", $_SESSION["uid"]);
- if ($pref_lang) {
+ if ($pref_lang && $pref_lang != 'auto') {
$lang = $pref_lang;
}
}
$fetch_curl_used = true;
if (ini_get("safe_mode") || ini_get("open_basedir")) {
- $ch = curl_init(geturl($url));
+ $new_url = geturl($url);
+ if (!$new_url) {
+ // geturl has already populated $fetch_last_error
+ return false;
+ }
+ $ch = curl_init($new_url);
} else {
$ch = curl_init($url);
}
}
function file_is_locked($filename) {
- if (function_exists('flock')) {
- $fp = @fopen(LOCK_DIRECTORY . "/$filename", "r");
- if ($fp) {
- if (flock($fp, LOCK_EX | LOCK_NB)) {
- flock($fp, LOCK_UN);
+ if (file_exists(LOCK_DIRECTORY . "/$filename")) {
+ if (function_exists('flock')) {
+ $fp = @fopen(LOCK_DIRECTORY . "/$filename", "r");
+ if ($fp) {
+ if (flock($fp, LOCK_EX | LOCK_NB)) {
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ return false;
+ }
fclose($fp);
+ return true;
+ } else {
return false;
}
- fclose($fp);
- return true;
- } else {
- return false;
}
+ return true; // consider the file always locked and skip the test
+ } else {
+ return false;
}
- return true; // consider the file always locked and skip the test
}
+
function make_lockfile($filename) {
$fp = fopen(LOCK_DIRECTORY . "/$filename", "w");
if ($fp && flock($fp, LOCK_EX | LOCK_NB)) {
+ $stat_h = fstat($fp);
+ $stat_f = stat(LOCK_DIRECTORY . "/$filename");
+
+ if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
+ if ($stat_h["ino"] != $stat_f["ino"] ||
+ $stat_h["dev"] != $stat_f["dev"]) {
+
+ return false;
+ }
+ }
+
if (function_exists('posix_getpid')) {
fwrite($fp, posix_getpid() . "\n");
}
$date_qpart = "date_entered < DATE_SUB(NOW(), INTERVAL 1 WEEK) ";
}
break;
- case "2weeks":
+ case "2week":
if (DB_TYPE == "pgsql") {
$date_qpart = "date_entered < NOW() - INTERVAL '2 week' ";
} else {
$count = getFeedUnread($i);
+ if ($i == 0 || $i == -1 || $i == -2)
+ $auxctr = getFeedArticles($i, false);
+ else
+ $auxctr = 0;
+
$cv = array("id" => $i,
- "counter" => (int) $count);
+ "counter" => (int) $count,
+ "auxcounter" => $auxctr);
// if (get_pref('EXTENDED_FEEDLIST'))
// $cv["xmsg"] = getFeedArticles($i)." ".__("total");
$owner_uid = $_SESSION["uid"];
- $result = db_query("SELECT id,caption,COUNT(unread) AS unread
+ $result = db_query("SELECT id,caption,COUNT(u1.unread) AS unread,COUNT(u2.unread) AS total
FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
(ttrss_labels2.id = label_id)
- LEFT JOIN ttrss_user_entries ON (ref_id = article_id AND unread = true
- AND ttrss_user_entries.owner_uid = $owner_uid)
+ LEFT JOIN ttrss_user_entries AS u1 ON (u1.ref_id = article_id AND u1.unread = true
+ AND u1.owner_uid = $owner_uid)
+ LEFT JOIN ttrss_user_entries AS u2 ON (u2.ref_id = article_id AND u2.unread = false
+ AND u2.owner_uid = $owner_uid)
WHERE ttrss_labels2.owner_uid = $owner_uid GROUP BY ttrss_labels2.id,
ttrss_labels2.caption");
$id = label_to_feed_id($line["id"]);
- $label_name = $line["caption"];
- $count = $line["unread"];
-
$cv = array("id" => $id,
- "counter" => (int) $count);
+ "counter" => (int) $line["unread"],
+ "auxcounter" => (int) $line["total"]);
if ($descriptions)
- $cv["description"] = $label_name;
-
-// if (get_pref('EXTENDED_FEEDLIST'))
-// $cv["xmsg"] = getFeedArticles($id)." ".__("total");
+ $cv["description"] = $line["caption"];
array_push($ret_arr, $cv);
}
return "images/archive.png";
break;
case -1:
- return "images/mark_set.svg";
+ return "images/star.png";
break;
case -2:
- return "images/pub_set.svg";
+ return "images/feed.png";
break;
case -3:
return "images/fresh.png";
break;
case -4:
- return "images/tag.png";
+ return "images/folder.png";
break;
case -6:
- return "images/recently_read.png";
+ return "images/time.png";
break;
default:
if ($id < LABEL_BASE_INDEX) {
$params["max_feed_id"] = (int) $max_feed_id;
$params["num_feeds"] = (int) $num_feeds;
- $params["collapsed_feedlist"] = (int) get_pref("_COLLAPSED_FEEDLIST");
$params["hotkeys"] = get_hotkeys_map();
$params["csrf_token"] = $_SESSION["csrf_token"];
$filter_query_part = filter_to_sql($filter, $owner_uid);
// Try to check if SQL regexp implementation chokes on a valid regexp
+
+
$result = db_query("SELECT true AS true_val FROM ttrss_entries,
- ttrss_user_entries, ttrss_feeds, ttrss_feed_categories
+ ttrss_user_entries, ttrss_feeds
WHERE $filter_query_part LIMIT 1", false);
if ($result) {
if ($site_url) {
- if ($entry->hasAttribute('href'))
+ if ($entry->hasAttribute('href')) {
$entry->setAttribute('href',
rewrite_relative_url($site_url, $entry->getAttribute('href')));
+ $entry->setAttribute('rel', 'noreferrer');
+ }
+
if ($entry->hasAttribute('src')) {
$src = rewrite_relative_url($site_url, $entry->getAttribute('src'));
function format_warning($msg, $id = "") {
global $link;
return "<div class=\"warning\" id=\"$id\">
- <span><img src=\"images/sign_excl.svg\"></span><span>$msg</span></div>";
+ <span><img src=\"images/alert.png\"></span><span>$msg</span></div>";
}
function format_notice($msg, $id = "") {
global $link;
return "<div class=\"notice\" id=\"$id\">
- <span><img src=\"images/sign_info.svg\"></span><span>$msg</span></div>";
+ <span><img src=\"images/information.png\"></span><span>$msg</span></div>";
}
function format_error($msg, $id = "") {
global $link;
return "<div class=\"error\" id=\"$id\">
- <span><img src=\"images/sign_excl.svg\"></span><span>$msg</span></div>";
+ <span><img src=\"images/alert.png\"></span><span>$msg</span></div>";
}
function print_notice($msg) {
if ($_SESSION["hasAudio"] && (strpos($ctype, "ogg") !== false ||
$_SESSION["hasMp3"])) {
- $entry .= "<audio controls>
+ $entry .= "<audio preload=\"none\" controls>
<source type=\"$ctype\" src=\"$url\"></source>
</audio>";
$line["tags"] = get_article_tags($id, $owner_uid, $line["tag_cache"]);
unset($line["tag_cache"]);
- $line["content"] = sanitize($line["content"], false, $owner_uid, $line["site_url"]);
+ $line["content"] = sanitize($line["content"],
+ sql_bool_to_bool($line['hide_images']),
+ $owner_uid, $line["site_url"]);
foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE) as $p) {
$line = $p->hook_render_article($line);
$rv['content'] .= "<html><head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
<title>Tiny Tiny RSS - ".$line["title"]."</title>
- <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss.css\">
+ <link rel=\"stylesheet\" type=\"text/css\" href=\"css/tt-rss.css\">
</head><body id=\"ttrssZoom\">";
}
$maxtags = min(5, count($tags));
for ($i = 0; $i < $maxtags; $i++) {
- $tags_str .= "<a class=\"tag\" href=\"#\" onclick=\"viewfeed('".$tags[$i]."'\")>" . $tags[$i] . "</a>, ";
+ $tags_str .= "<a class=\"tag\" href=\"#\" onclick=\"viewfeed('".$tags[$i]."')\">" . $tags[$i] . "</a>, ";
}
$tags_str = mb_substr($tags_str, 0, mb_strlen($tags_str)-2);
* @return string Absolute URL
*/
function rewrite_relative_url($url, $rel_url) {
- if (strpos($rel_url, "magnet:") === 0) {
+ if (strpos($rel_url, ":") !== false) {
return $rel_url;
} else if (strpos($rel_url, "://") !== false) {
return $rel_url;
$sphinxpair = explode(":", SPHINX_SERVER, 2);
- $sphinxClient->SetServer($sphinxpair[0], $sphinxpair[1]);
+ $sphinxClient->SetServer($sphinxpair[0], (int)$sphinxpair[1]);
$sphinxClient->SetConnectTimeout(1);
$sphinxClient->SetFieldWeights(array('title' => 70, 'content' => 30,
$reg_qpart = "REGEXP";
foreach ($filter["rules"] AS $rule) {
+ $rule['reg_exp'] = str_replace('/', '\/', $rule["reg_exp"]);
$regexp_valid = preg_match('/' . $rule['reg_exp'] . '/',
$rule['reg_exp']) !== FALSE;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //CURLOPT_FOLLOWLOCATION Disabled...
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($curl);
$status = curl_getinfo($curl);
- curl_close($curl);
if($status['http_code']!=200){
if($status['http_code'] == 301 || $status['http_code'] == 302) {
+ curl_close($curl);
list($header) = explode("\r\n\r\n", $html, 2);
$matches = array();
preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
$url_parsed = parse_url($url);
return (isset($url_parsed))? geturl($url):'';
}
+
+ global $fetch_last_error;
+
+ $fetch_last_error = curl_errno($curl) . " " . curl_error($curl);
+ curl_close($curl);
+
$oline='';
foreach($status as $key=>$eline){$oline.='['.$key.']'.$eline.' ';}
$line =$oline." \r\n ".$url."\r\n-----------------\r\n";
# fwrite($handle, $line);
return FALSE;
}
+ curl_close($curl);
return $url;
}
foreach ($files as $js) {
if (!isset($_GET['debug'])) {
- $cached_file = CACHE_DIR . "/js/$js.js";
+ $cached_file = CACHE_DIR . "/js/".basename($js).".js";
if (file_exists($cached_file) &&
is_readable($cached_file) &&
}
function calculate_dep_timestamp() {
- $files = array_merge(glob("js/*.js"), glob("*.css"));
+ $files = array_merge(glob("js/*.js"), glob("css/*.css"));
$max_ts = -1;