summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/api.php2
-rw-r--r--classes/feeds.php16
-rw-r--r--classes/handler/public.php20
-rw-r--r--css/cdm.css19
-rw-r--r--css/tt-rss.css17
-rw-r--r--include/functions.php5
-rw-r--r--include/sessions.php18
-rw-r--r--js/tt-rss.js7
-rw-r--r--plugins/googlereaderimport/init.php7
-rw-r--r--templates/generated_feed.txt3
10 files changed, 82 insertions, 32 deletions
diff --git a/classes/api.php b/classes/api.php
index aa092df78..b3f4ebc2a 100644
--- a/classes/api.php
+++ b/classes/api.php
@@ -203,7 +203,7 @@ class API extends Handler {
$override_order = false;
switch ($_REQUEST["order_by"]) {
case "date_reverse":
- $override_order = "date_entered, updated";
+ $override_order = "score DESC, date_entered, updated";
break;
case "feed_dates":
$override_order = "updated DESC";
diff --git a/classes/feeds.php b/classes/feeds.php
index 44af9ae0b..ccc0548db 100644
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -380,9 +380,9 @@ class Feeds extends Handler_Protected {
title=\"$score\">";
if ($score > 500) {
- $hlc_suffix = "H";
+ $hlc_suffix = "high";
} else if ($score < -100) {
- $hlc_suffix = "L";
+ $hlc_suffix = "low";
} else {
$hlc_suffix = "";
}
@@ -451,8 +451,8 @@ class Feeds extends Handler_Protected {
$reply['content'] .= "</div>";
$reply['content'] .= "<div onclick='return hlClicked(event, $id)'
- class=\"hlTitle\"><span class='hlContent$hlc_suffix'>";
- $reply['content'] .= "<a id=\"RTITLE-$id\" class=\"title\"
+ class=\"hlTitle\"><span class='hlContent $hlc_suffix'>";
+ $reply['content'] .= "<a id=\"RTITLE-$id\" class=\"title $hlc_suffix\"
href=\"" . htmlspecialchars($line["link"]) . "\"
onclick=\"\">" .
truncate_string($line["title"], 200);
@@ -540,7 +540,7 @@ class Feeds extends Handler_Protected {
$expanded_class = $expand_cdm ? "expanded" : "expandable";
- $reply['content'] .= "<div class=\"cdm $expanded_class $class\"
+ $reply['content'] .= "<div class=\"cdm $hlc_suffix $expanded_class $class\"
id=\"RROW-$id\" $mouseover_attrs>";
$reply['content'] .= "<div class=\"cdmHeader\" style=\"$row_background\">";
@@ -557,8 +557,8 @@ class Feeds extends Handler_Protected {
$reply['content'] .= "<span id=\"RTITLE-$id\"
onclick=\"return cdmClicked(event, $id);\"
- class=\"titleWrap$hlc_suffix\">
- <a class=\"title\"
+ class=\"titleWrap $hlc_suffix\">
+ <a class=\"title $hlc_suffix\"
target=\"_blank\" href=\"".
htmlspecialchars($line["link"])."\">".
$line["title"] .
@@ -864,7 +864,7 @@ class Feeds extends Handler_Protected {
$override_order = "ttrss_entries.title";
break;
case "date_reverse":
- $override_order = "date_entered, updated";
+ $override_order = "score DESC, date_entered, updated";
break;
case "feed_dates":
$override_order = "updated DESC";
diff --git a/classes/handler/public.php b/classes/handler/public.php
index 810f4c034..60a961bfa 100644
--- a/classes/handler/public.php
+++ b/classes/handler/public.php
@@ -3,7 +3,7 @@ class Handler_Public extends Handler {
private function generate_syndicated_feed($owner_uid, $feed, $is_cat,
$limit, $offset, $search, $search_mode,
- $view_mode = false, $format = 'atom', $order = false) {
+ $view_mode = false, $format = 'atom', $order = false, $orig_guid = false) {
require_once "lib/MiniTemplator.class.php";
@@ -65,8 +65,8 @@ class Handler_Public extends Handler {
$last_error = $qfh_ret[3];
$feed_self_url = get_self_url_prefix() .
- "/public.php?op=rss&id=-2&key=" .
- get_feed_access_key(-2, false, $owner_uid);
+ "/public.php?op=rss&id=$feed&key=" .
+ get_feed_access_key($feed, false, $owner_uid);
if (!$feed_site_url) $feed_site_url = get_self_url_prefix();
@@ -91,7 +91,10 @@ class Handler_Public extends Handler {
$line = $p->hook_query_headlines($line);
}
- $tpl->setVariable('ARTICLE_ID', htmlspecialchars($line['link']), true);
+ $tpl->setVariable('ARTICLE_ID',
+ htmlspecialchars($orig_guid ? $line['link'] :
+ get_self_url_prefix() .
+ "/public.php?url=" . urlencode($line['link'])), true);
$tpl->setVariable('ARTICLE_LINK', htmlspecialchars($line['link']), true);
$tpl->setVariable('ARTICLE_TITLE', htmlspecialchars($line['title']), true);
$tpl->setVariable('ARTICLE_EXCERPT', $line["content_preview"], true);
@@ -113,6 +116,9 @@ class Handler_Public extends Handler {
$tpl->setVariable('ARTICLE_AUTHOR', htmlspecialchars($line['author']), true);
+ $tpl->setVariable('ARTICLE_SOURCE_LINK', htmlspecialchars($line['site_url']), true);
+ $tpl->setVariable('ARTICLE_SOURCE_TITLE', htmlspecialchars($line['feed_title']), true);
+
$tags = get_article_tags($line["id"], $owner_uid);
foreach ($tags as $tag) {
@@ -348,7 +354,7 @@ class Handler_Public extends Handler {
function rss() {
$feed = $this->dbh->escape_string($_REQUEST["id"]);
$key = $this->dbh->escape_string($_REQUEST["key"]);
- $is_cat = $_REQUEST["is_cat"] != false;
+ $is_cat = sql_bool_to_bool($_REQUEST["is_cat"]);
$limit = (int)$this->dbh->escape_string($_REQUEST["limit"]);
$offset = (int)$this->dbh->escape_string($_REQUEST["offset"]);
@@ -358,6 +364,7 @@ class Handler_Public extends Handler {
$order = $this->dbh->escape_string($_REQUEST["order"]);
$format = $this->dbh->escape_string($_REQUEST['format']);
+ $orig_guid = !sql_bool_to_bool($_REQUEST["no_orig_guid"]);
if (!$format) $format = 'atom';
@@ -377,7 +384,7 @@ class Handler_Public extends Handler {
if ($owner_id) {
$this->generate_syndicated_feed($owner_id, $feed, $is_cat, $limit,
- $offset, $search, $search_mode, $view_mode, $format, $order);
+ $offset, $search, $search_mode, $view_mode, $format, $order, $orig_guid);
} else {
header('HTTP/1.1 403 Forbidden');
}
@@ -549,6 +556,7 @@ class Handler_Public extends Handler {
}
} else {
$_SESSION["login_error_msg"] = __("Incorrect username or password");
+ user_error("Failed login attempt from {$_SERVER['REMOTE_ADDR']}", E_USER_WARNING);
}
if ($_REQUEST['return']) {
diff --git a/css/cdm.css b/css/cdm.css
index 18bedce01..7e85cbfff 100644
--- a/css/cdm.css
+++ b/css/cdm.css
@@ -265,3 +265,22 @@ div#floatingTitle span.author,
div#floatingTitle img.tinyFeedIcon {
display : none;
}
+
+.cdm.high .cdmHeader a.title.high, .cdm.high .cdmHeader .cdmExcerpt,
+.cdm.high .cdmHeader span.author {
+ color : #00aa00;
+}
+
+.cdm.Unread.high .cdmHeader a.title.high, .cdm.Unread.high .cdmHeader .cdmExcerpt,
+.cdm.Unread.high .cdmHeader span.author {
+ color : #00dd00;
+}
+
+.cdm .cdmHeader a.title.low, .cdm.low .cdmHeader .cdmExcerpt,
+.cdm.Unread .cdmHeader a.title.low, .cdm.Unread.low .cdmHeader .cdmExcerpt,
+.cdm.low .cdmHeader span.author {
+ color : #909090;
+ text-decoration : line-through;
+}
+
+
diff --git a/css/tt-rss.css b/css/tt-rss.css
index 3e6b8cd38..c5ab8d991 100644
--- a/css/tt-rss.css
+++ b/css/tt-rss.css
@@ -606,20 +606,15 @@ div#headlines-frame.wide .hlTitle {
white-space : normal;
}
-.hlContentH a, .hlContentH span {
- color : #00cc00;
+.hl a.title.high, span.hlContent.high .contentPreview {
+ color : #00aa00;
}
-
-.hlContentL a, .hlContentL span {
- color : #909090;
- text-decoration : line-through;
-}
-
-span.titleWrapH, span.titleWrapH a {
- color : #00cc00;
+.hl.Unread a.title.high, .hl.Unread span.hlContent.high .contentPreview {
+ color : #00dd00;
}
-span.titleWrapL, span.titleWrapL a {
+.hl a.title.low, span.hlContent.low .contentPreview,
+.hl.Unread a.title.low, .hl.Unread span.hlContent.low .contentPreview {
color : #909090;
text-decoration : line-through;
}
diff --git a/include/functions.php b/include/functions.php
index eb011b6db..556b8a8cd 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -2578,8 +2578,10 @@
}
}
+
$content_query_part = "content, content AS content_preview, cached_content, ";
+
if (is_numeric($feed)) {
if ($feed >= 0) {
@@ -3784,7 +3786,7 @@
* @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;
@@ -3954,6 +3956,7 @@
$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;
diff --git a/include/sessions.php b/include/sessions.php
index 423ef0eda..66214afe7 100644
--- a/include/sessions.php
+++ b/include/sessions.php
@@ -62,11 +62,17 @@
return false;
}
- if ($_SESSION["ref_schema_version"] != session_get_schema_version(true))
+ if ($_SESSION["ref_schema_version"] != session_get_schema_version(true)) {
+ $_SESSION["login_error_msg"] =
+ __("Session failed to validate (schema version changed)");
return false;
+ }
- if (sha1($_SERVER['HTTP_USER_AGENT']) != $_SESSION["user_agent"])
+ if (sha1($_SERVER['HTTP_USER_AGENT']) != $_SESSION["user_agent"]) {
+ $_SESSION["login_error_msg"] =
+ __("Session failed to validate (user agent changed)");
return false;
+ }
if ($_SESSION["uid"]) {
$result = Db::get()->query(
@@ -74,11 +80,19 @@
// user not found
if (Db::get()->num_rows($result) == 0) {
+
+ $_SESSION["login_error_msg"] =
+ __("Session failed to validate (user not found)");
+
return false;
} else {
$pwd_hash = Db::get()->fetch_result($result, 0, "pwd_hash");
if ($pwd_hash != $_SESSION["pwd_hash"]) {
+
+ $_SESSION["login_error_msg"] =
+ __("Session failed to validate (password changed)");
+
return false;
}
}
diff --git a/js/tt-rss.js b/js/tt-rss.js
index a1d7d6411..46e282351 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -847,11 +847,16 @@ function hotkey_handler(e) {
var keycode = false;
var shift_key = false;
+ var ctrl_key = false;
+ var alt_key = false;
+ var meta_key = false;
var cmdline = $('cmdline');
shift_key = e.shiftKey;
ctrl_key = e.ctrlKey;
+ alt_key = e.altKey;
+ meta_key = e.metaKey;
if (window.event) {
keycode = window.event.keyCode;
@@ -893,6 +898,8 @@ function hotkey_handler(e) {
// ensure ^*char notation
if (shift_key) hotkey = "*" + hotkey;
if (ctrl_key) hotkey = "^" + hotkey;
+ if (alt_key) hotkey = "+" + hotkey;
+ if (meta_key) hotkey = "%" + hotkey;
hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
hotkey_prefix = false;
diff --git a/plugins/googlereaderimport/init.php b/plugins/googlereaderimport/init.php
index 2e22161b9..dcb335a0d 100644
--- a/plugins/googlereaderimport/init.php
+++ b/plugins/googlereaderimport/init.php
@@ -114,6 +114,7 @@ class GoogleReaderImport extends Plugin {
$guid = db_escape_string(mb_substr($item['id'], 0, 250));
$title = db_escape_string($item['title']);
$updated = date('Y-m-d h:i:s', $item['updated']);
+ $last_marked = date('Y-m-d h:i:s', mb_substr($item['crawlTimeMsec'], 0, 10));
$link = '';
$content = '';
$author = db_escape_string($item['author']);
@@ -165,7 +166,7 @@ class GoogleReaderImport extends Plugin {
$imported += (int) $this->create_article($owner_uid, $guid, $title,
$link, $updated, $content, $author, $sql_set_marked, $tags,
- $orig_feed_data);
+ $orig_feed_data, $last_marked);
if ($file && $processed % 25 == 0) {
_debug("processed $processed articles...");
@@ -196,7 +197,7 @@ class GoogleReaderImport extends Plugin {
}
// expects ESCAPED data
- private function create_article($owner_uid, $guid, $title, $link, $updated, $content, $author, $marked, $tags, $orig_feed_data) {
+ private function create_article($owner_uid, $guid, $title, $link, $updated, $content, $author, $marked, $tags, $orig_feed_data, $last_marked) {
if (!$guid) $guid = sha1($link);
@@ -299,7 +300,7 @@ class GoogleReaderImport extends Plugin {
(ref_id, uuid, feed_id, orig_feed_id, owner_uid, marked, tag_cache, label_cache,
last_read, note, unread, last_marked)
VALUES
- ('$ref_id', '', NULL, $orig_feed_id, $owner_uid, $marked, '', '', NOW(), '', false, NOW())");
+ ('$ref_id', '', NULL, $orig_feed_id, $owner_uid, $marked, '', '', '$last_marked', '', false, '$last_marked')");
$result = db_query("SELECT int_id FROM ttrss_user_entries, ttrss_entries
WHERE owner_uid = $owner_uid AND ref_id = id AND ref_id = $ref_id");
diff --git a/templates/generated_feed.txt b/templates/generated_feed.txt
index 6bfa50b1b..c1f921c45 100644
--- a/templates/generated_feed.txt
+++ b/templates/generated_feed.txt
@@ -20,6 +20,9 @@
<content type="html"><![CDATA[${ARTICLE_CONTENT}]]></content>
<updated>${ARTICLE_UPDATED_ATOM}</updated>
<author><name>${ARTICLE_AUTHOR}</name></author>
+ <source>
+ <link rel="self" href="${ARTICLE_SOURCE_LINK}"/>
+ <title>${ARTICLE_SOURCE_TITLE}</title></source>
<!-- $BeginBlock category -->
<category term="${ARTICLE_CATEGORY}"/>
<!-- $EndBlock category -->