X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=functions.php;h=8b13bed987983f7d893f66d648744db09ab8a832;hb=6f5b1e042c62023f9341d01120828c01a10a502b;hp=a46061bda64bc10ebaf2235c0d73c9ee6ba0d882;hpb=aec3ce39de92ab044cbfb4eaa7f98a564a010510;p=tt-rss.git
diff --git a/functions.php b/functions.php
index a46061bd..8b13bed9 100644
--- a/functions.php
+++ b/functions.php
@@ -1,4 +1,4 @@
-
+]+rel="(?:shortcut )?icon"[^>]+?href="([^"]+?)"/si', $html, $matches)) {
+ // Attempt to grab a favicon link from their webpage url
+ $linkUrl = html_entity_decode($matches[1]);
+
+ if (substr($linkUrl, 0, 1) == '/') {
+ $urlParts = parse_url($url);
+ $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].$linkUrl;
+ } else if (substr($linkUrl, 0, 7) == 'http://') {
+ $faviconURL = $linkUrl;
+ } else if (substr($url, -1, 1) == '/') {
+ $faviconURL = $url.$linkUrl;
+ } else {
+ $faviconURL = $url.'/'.$linkUrl;
}
- chmod($icon_file, 0644);
+ } else {
+ // If unsuccessful, attempt to "guess" the favicon location
+ $urlParts = parse_url($url);
+ $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].'/favicon.ico';
+ }
+ }
+
+ // Run a test to see if what we have attempted to get actually exists.
+ if(USE_CURL_FOR_ICONS || url_validate($faviconURL)) {
+ return $faviconURL;
+ } else {
+ return false;
+ }
+ }
+
+ function url_validate($link) {
+
+ $url_parts = @parse_url($link);
+
+ if ( empty( $url_parts["host"] ) )
+ return false;
+
+ if ( !empty( $url_parts["path"] ) ) {
+ $documentpath = $url_parts["path"];
+ } else {
+ $documentpath = "/";
+ }
+
+ if ( !empty( $url_parts["query"] ) )
+ $documentpath .= "?" . $url_parts["query"];
+
+ $host = $url_parts["host"];
+ $port = $url_parts["port"];
+
+ if ( empty($port) )
+ $port = "80";
+
+ $socket = @fsockopen( $host, $port, $errno, $errstr, 30 );
+
+ if ( !$socket )
+ return false;
- error_reporting (DEFAULT_ERROR_LEVEL);
+ fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0\r\nHost: $host\r\n\r\n");
+
+ $http_response = fgets( $socket, 22 );
- }
+ $responses = "/(200 OK)|(30[0-9] Moved)/";
+ if ( preg_match($responses, $http_response) ) {
+ fclose($socket);
+ return true;
+ } else {
+ return false;
}
+
+ }
+
+ function check_feed_favicon($site_url, $feed, $link) {
+ $favicon_url = get_favicon_url($site_url);
+
+# print "FAVICON [$site_url]: $favicon_url\n";
+
+ error_reporting(0);
+
+ $icon_file = ICONS_DIR . "/$feed.ico";
+
+ if ($favicon_url && !file_exists($icon_file)) {
+ $contents = fetch_file_contents($favicon_url);
+
+ $fp = fopen($icon_file, "w");
+
+ if ($fp) {
+ fwrite($fp, $contents);
+ fclose($fp);
+ chmod($icon_file, 0644);
+ }
+ }
+
+ error_reporting(DEFAULT_ERROR_LEVEL);
+
}
function update_rss_feed($link, $feed_url, $feed, $ignore_daemon = false) {
@@ -312,8 +402,8 @@
$owner_uid = db_fetch_result($result, 0, "owner_uid");
- if (get_pref($link, 'ENABLE_FEED_ICONS', $owner_uid)) {
- check_feed_favicon($feed_url, $feed, $link);
+ if (get_pref($link, 'ENABLE_FEED_ICONS', $owner_uid, false)) {
+ check_feed_favicon($rss->channel["link"], $feed, $link);
}
if (!$registered_title || $registered_title == "[Unknown]") {
@@ -361,6 +451,7 @@
ttrss_filter_types.name AS name,
ttrss_filter_actions.name AS action
FROM ttrss_filters,ttrss_filter_types,ttrss_filter_actions WHERE
+ enabled = true AND
owner_uid = $owner_uid AND
ttrss_filter_types.id = filter_type AND
ttrss_filter_actions.id = action_id AND
@@ -400,7 +491,8 @@
if (!$entry_guid) $entry_guid = $item["guid"];
if (!$entry_guid) $entry_guid = $item["link"];
-
+ if (!$entry_guid) $entry_guid = make_guid_from_title($item["title"]);
+
if (!$entry_guid) continue;
$entry_timestamp = "";
@@ -423,15 +515,17 @@
$entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp);
- $entry_title = $item["title"];
+ $entry_title = trim(strip_tags($item["title"]));
// strange Magpie workaround
$entry_link = $item["link_"];
if (!$entry_link) $entry_link = $item["link"];
if (!$entry_title) continue;
- if (!$entry_link) continue;
-
+# if (!$entry_link) continue;
+
+ $entry_link = strip_tags($entry_link);
+
$entry_content = $item["content:escaped"];
if (!$entry_content) $entry_content = $item["content:encoded"];
@@ -455,11 +549,10 @@
$entry_content_unescaped = $entry_content;
$content_hash = "SHA1:" . sha1(strip_tags($entry_content));
- $entry_comments = $item["comments"];
-
- $entry_author = db_escape_string($item['dc']['creator']);
+ $entry_comments = strip_tags($item["comments"]);
- $entry_guid = db_escape_string($entry_guid);
+ $entry_author = db_escape_string(strip_tags($item['dc']['creator']));
+ $entry_guid = db_escape_string(strip_tags($entry_guid));
$result = db_query($link, "SELECT id FROM ttrss_entries
WHERE guid = '$entry_guid'");
@@ -472,70 +565,11 @@
$num_comments = db_escape_string($item["slash"]["comments"]);
if (!$num_comments) $num_comments = 0;
-
- } else if (RSS_BACKEND_TYPE == "simplepie") {
-
- $entry_guid = $item->get_id();
-
- if (!$entry_guid) {
- $entry_guid = $item->get_permalink();
- }
-
- if (!$entry_guid) continue;
-
- $entry_timestamp = $item->get_date("U");
-
- if ($entry_timestamp == "") {
- $entry_timestamp = time();
- $no_orig_date = 'true';
- } else {
- $no_orig_date = 'false';
- }
-
- $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp);
-
- $entry_title = $item->get_title();
- $entry_link = $item->get_permalink();
-
- if (!$entry_title) continue;
- if (!$entry_link) continue;
-
- $entry_content = $item->get_description();
-
-// print_r(htmlspecialchars($entry_content));
-// print "
";
-
- $entry_content_unescaped = $entry_content;
- $content_hash = "SHA1:" . sha1(strip_tags($entry_content));
-
- $entry_comments = ""; # FIXME
-
- $entry_author = $item->get_author(0);
-
- $entry_author = db_escape_string($entry_author->name);
-
- $entry_guid = db_escape_string($entry_guid);
-
- $result = db_query($link, "SELECT id FROM ttrss_entries
- WHERE guid = '$entry_guid'");
-
- $entry_content = db_escape_string($entry_content);
- $entry_title = db_escape_string($entry_title);
- $entry_link = db_escape_string($entry_link);
- $entry_comments = db_escape_string($entry_comments);
-
- $num_comments = 0; # FIXME
-
- if (!$num_comments) $num_comments = 0;
-
}
# sanitize content
$entry_content = sanitize_rss($entry_content);
- $entry_title = sanitize_rss($entry_title);
- $entry_link = sanitize_rss($entry_link);
- $entry_comments = sanitize_rss($entry_comments);
db_query($link, "BEGIN");
@@ -605,7 +639,7 @@
// check for user post link to main table
// do we allow duplicate posts with same GUID in different feeds?
- if (get_pref($link, "ALLOW_DUPLICATE_POSTS", $owner_uid)) {
+ if (get_pref($link, "ALLOW_DUPLICATE_POSTS", $owner_uid, false)) {
$dupcheck_qpart = "AND feed_id = '$feed'";
} else {
$dupcheck_qpart = "";
@@ -653,7 +687,7 @@
$post_needs_update = false;
- if (get_pref($link, "UPDATE_POST_ON_CHECKSUM_CHANGE", $owner_uid) &&
+ if (get_pref($link, "UPDATE_POST_ON_CHECKSUM_CHANGE", $owner_uid, false) &&
($content_hash != $orig_content_hash)) {
$post_needs_update = true;
}
@@ -683,7 +717,7 @@
num_comments = '$num_comments'
WHERE id = '$ref_id'");
- if (get_pref($link, "MARK_UNREAD_ON_UPDATE")) {
+ if (get_pref($link, "MARK_UNREAD_ON_UPDATE", $owner_uid, false)) {
db_query($link, "UPDATE ttrss_user_entries
SET last_read = null, unread = true WHERE ref_id = '$ref_id'");
} else {
@@ -859,7 +893,8 @@
$link_title = "Updated: $last_updated";
}
- $feed = "$feed_title";
+ $feed = "$feed_title";
print "
", $str); + "
Disabled script: ", $res); + + $res = preg_replace('/<\/script.*?>/i', "
", $res); + +/* $res = preg_replace('/(Disabled html object + - flash or other embedded content)
", $res); */ return $res; } + + function send_headlines_digests($link, $limit = 100) { + + if (!DIGEST_ENABLE) return false; + + $user_limit = DIGEST_EMAIL_LIMIT; + $days = 1; + + print "Sending digests, batch of max $user_limit users, days = $days, headline limit = $limit\n\n"; + + if (DB_TYPE == "pgsql") { + $interval_query = "last_digest_sent < NOW() - INTERVAL '$days days'"; + } else if (DB_TYPE == "mysql") { + $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + + $result = db_query($link, "SELECT id,email FROM ttrss_users + WHERE email != '' AND (last_digest_sent IS NULL OR $interval_query)"); + + while ($line = db_fetch_assoc($result)) { + if (get_pref($link, 'DIGEST_ENABLE', $line['id'], false)) { + print "Sending digest for UID:" . $line['id'] . " - " . $line["email"] . " ... "; + + $tuple = prepare_headlines_digest($link, $line["id"], $days, $limit); + $digest = $tuple[0]; + $headlines_count = $tuple[1]; + + if ($headlines_count > 0) { + $rc = mail($line["login"] . " <" . $line["email"] . ">", + "[tt-rss] New headlines for last 24 hours", $digest, + "From: " . MAIL_FROM . "\n". + "Content-Type: text/plain; charset=\"utf-8\"\n". + "Content-Transfer-Encoding: 8bit\n"); + print "RC=$rc\n"; + db_query($link, "UPDATE ttrss_users SET last_digest_sent = NOW() + WHERE id = " . $line["id"]); + } else { + print "No headlines\n"; + } + } + } + +// $digest = prepare_headlines_digest($link, $user_id, $days, $limit); + + } + + function prepare_headlines_digest($link, $user_id, $days = 1, $limit = 100) { + $tmp = "New headlines for last 24 hours, as of " . date("Y/m/d H:m") . "\n"; + $tmp .= "=======================================================\n\n"; + + if (DB_TYPE == "pgsql") { + $interval_query = "ttrss_entries.date_entered > NOW() - INTERVAL '$days days'"; + } else if (DB_TYPE == "mysql") { + $interval_query = "ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + + $result = db_query($link, "SELECT ttrss_entries.title, + ttrss_feeds.title AS feed_title, + date_entered, + link, + SUBSTRING(last_updated,1,19) AS last_updated + FROM + ttrss_user_entries,ttrss_entries,ttrss_feeds + WHERE + ref_id = ttrss_entries.id AND feed_id = ttrss_feeds.id + AND include_in_digest = true + AND $interval_query + AND ttrss_user_entries.owner_uid = $user_id + AND unread = true ORDER BY ttrss_feeds.title, date_entered DESC + LIMIT $limit"); + + $cur_feed_title = ""; + + $headlines_count = db_num_rows($result); + + while ($line = db_fetch_assoc($result)) { + $updated = smart_date_time(strtotime($line["last_updated"])); + $feed_title = $line["feed_title"]; + + if ($cur_feed_title != $feed_title) { + $cur_feed_title = $feed_title; + + $tmp .= "$feed_title\n\n"; + } + + $tmp .= " * " . trim($line["title"]) . " - $updated\n"; + $tmp .= " " . trim($line["link"]) . "\n"; + $tmp .= "\n"; + } + + $tmp .= "--- \n"; + $tmp .= "You have been sent this email because you have enabled daily digests in Tiny Tiny RSS at " . + DIGEST_HOSTNAME . "\n". + "To unsubscribe, visit your configuration options or contact instance owner.\n"; + + + return array($tmp, $headlines_count); + } + + function check_for_update($link) { + $releases_feed = "http://tt-rss.spb.ru/releases.rss"; + + if (!CHECK_FOR_NEW_VERSION || $_SESSION["access_level"] < 10) { + return; + } + + error_reporting(0); + $rss = fetch_rss($releases_feed); + error_reporting (DEFAULT_ERROR_LEVEL); + + if ($rss) { + + $items = $rss->items; + + if (!$items || !is_array($items)) $items = $rss->entries; + if (!$items || !is_array($items)) $items = $rss; + + if (!is_array($items) || count($items) == 0) { + return; + } + + $latest_item = $items[0]; + + $latest_version = trim(preg_replace("/(Milestone)|(completed)/", "", $latest_item["title"])); + + $release_url = sanitize_rss($latest_item["link"]); + $content = sanitize_rss($latest_item["description"]); + + if (version_compare(VERSION, $latest_version) == -1) { + return ""; + } + } + } + + function markArticlesById($link, $ids, $cmode) { + + $tmp_ids = array(); + + foreach ($ids as $id) { + array_push($tmp_ids, "ref_id = '$id'"); + } + + $ids_qpart = join(" OR ", $tmp_ids); + + if ($cmode == 0) { + db_query($link, "UPDATE ttrss_user_entries SET + marked = false,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else if ($cmode == 1) { + db_query($link, "UPDATE ttrss_user_entries SET + marked = true + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else { + db_query($link, "UPDATE ttrss_user_entries SET + marked = NOT marked,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } + } + + function catchupArticlesById($link, $ids, $cmode) { + + $tmp_ids = array(); + + foreach ($ids as $id) { + array_push($tmp_ids, "ref_id = '$id'"); + } + + $ids_qpart = join(" OR ", $tmp_ids); + + if ($cmode == 0) { + db_query($link, "UPDATE ttrss_user_entries SET + unread = false,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else if ($cmode == 1) { + db_query($link, "UPDATE ttrss_user_entries SET + unread = true + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else { + db_query($link, "UPDATE ttrss_user_entries SET + unread = NOT unread,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } + } + + function escape_for_form($s) { + return htmlspecialchars(db_unescape_string($s)); + } + + function make_guid_from_title($title) { + return preg_replace("/[ \"\',.:;]/", "-", + mb_strtolower(strip_tags($title))); + } + + function print_headline_subtoolbar($link, $feed_site_url, $feed_title, + $bottom = false, $rtl_content = false, $feed_id = 0, + $is_cat = false, $search = false, $match_on = false, + $search_mode = false) { + + if (!$bottom) { + $class = "headlinesSubToolbar"; + $tid = "headlineActionsTop"; + } else { + $class = "headlinesSubToolbar"; + $tid = "headlineActionsBottom"; + } + + print "+ Select: + All, + Unread, + None + + Toggle: Unread, + Starred + + Mark as read: + Page, + Feed"; + print " | "; + + if ($search && $feed_id > 0 && get_pref($link, 'ENABLE_LABELS') && GLOBAL_ENABLE_LABELS) { + print "+ + Convert this search to label | "; + } + + } else { + + print "+ Select: + All, + Unread, + None + + Toggle: Unread, + Starred"; + + print " | "; + + } + + print "";
+
+ if ($feed_site_url) {
+ if (!$bottom) {
+ $target = "target=\"_blank\"";
+ }
+ print "$feed_title";
+ } else {
+ print $feed_title;
+ }
+
+ if ($search) {
+ $search_q = "&q=$search&m=$match_on&smode=$search_mode";
+ }
+
+ if (!$bottom) {
+ print "
+
+ ![]() | ";
+ print "