summaryrefslogtreecommitdiff
path: root/classes/handler/feeds.php
diff options
context:
space:
mode:
Diffstat (limited to 'classes/handler/feeds.php')
-rw-r--r--classes/handler/feeds.php305
1 files changed, 305 insertions, 0 deletions
diff --git a/classes/handler/feeds.php b/classes/handler/feeds.php
new file mode 100644
index 000000000..0d262a554
--- /dev/null
+++ b/classes/handler/feeds.php
@@ -0,0 +1,305 @@
+<?php
+require_once "colors.php";
+
+class Handler_Feeds extends Handler_Protected {
+ function csrf_ignore($method) {
+ $csrf_ignored = array("index");
+
+ return array_search($method, $csrf_ignored) !== false;
+ }
+
+ function catchupAll() {
+ $sth = $this->pdo->prepare("UPDATE ttrss_user_entries SET
+ last_read = NOW(), unread = false WHERE unread = true AND owner_uid = ?");
+ $sth->execute([$_SESSION['uid']]);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function view() {
+ $reply = array();
+
+ $feed = $_REQUEST["feed"];
+ $method = $_REQUEST["m"] ?? "";
+ $view_mode = $_REQUEST["view_mode"] ?? "";
+ $limit = 30;
+ $cat_view = $_REQUEST["cat"] == "true";
+ $next_unread_feed = $_REQUEST["nuf"] ?? 0;
+ $offset = $_REQUEST["skip"] ?? 0;
+ $order_by = $_REQUEST["order_by"] ?? "";
+ $check_first_id = $_REQUEST["fid"] ?? 0;
+
+ if (is_numeric($feed)) $feed = (int) $feed;
+
+ /* Feed -5 is a special case: it is used to display auxiliary information
+ * when there's nothing to load - e.g. no stuff in fresh feed */
+
+ if ($feed == -5) {
+ print json_encode($this->_generate_dashboard_feed());
+ return;
+ }
+
+ $sth = false;
+ if ($feed < LABEL_BASE_INDEX) {
+
+ $label_feed = Labels::feed_to_label_id($feed);
+
+ $sth = $this->pdo->prepare("SELECT id FROM ttrss_labels2 WHERE
+ id = ? AND owner_uid = ?");
+ $sth->execute([$label_feed, $_SESSION['uid']]);
+
+ } else if (!$cat_view && is_numeric($feed) && $feed > 0) {
+
+ $sth = $this->pdo->prepare("SELECT id FROM ttrss_feeds WHERE
+ id = ? AND owner_uid = ?");
+ $sth->execute([$feed, $_SESSION['uid']]);
+
+ } else if ($cat_view && is_numeric($feed) && $feed > 0) {
+
+ $sth = $this->pdo->prepare("SELECT id FROM ttrss_feed_categories WHERE
+ id = ? AND owner_uid = ?");
+
+ $sth->execute([$feed, $_SESSION['uid']]);
+ }
+
+ if ($sth && !$sth->fetch()) {
+ print json_encode($this->_generate_error_feed(__("Feed not found.")));
+ return;
+ }
+
+ set_pref(Prefs::_DEFAULT_VIEW_MODE, $view_mode);
+ set_pref(Prefs::_DEFAULT_VIEW_ORDER_BY, $order_by);
+
+ /* bump login timestamp if needed */
+ if (time() - $_SESSION["last_login_update"] > 3600) {
+ $user = ORM::for_table('ttrss_users')->find_one($_SESSION["uid"]);
+ $user->last_login = Db::NOW();
+ $user->save();
+
+ $_SESSION["last_login_update"] = time();
+ }
+
+ if (!$cat_view && is_numeric($feed) && $feed > 0) {
+ $sth = $this->pdo->prepare("UPDATE ttrss_feeds SET last_viewed = NOW()
+ WHERE id = ? AND owner_uid = ?");
+ $sth->execute([$feed, $_SESSION['uid']]);
+ }
+
+ $reply['headlines'] = [];
+
+ list($override_order, $skip_first_id_check) = Feeds::_order_to_override_query($order_by);
+
+ $ret = Feeds::_format_headlines_list($feed, $method,
+ $view_mode, $limit, $cat_view, $offset,
+ $override_order, true, $check_first_id, $skip_first_id_check, $order_by);
+
+ $headlines_count = $ret[1];
+ $disable_cache = $ret[3];
+ $reply['headlines'] = $ret[4];
+
+ if (!$next_unread_feed)
+ $reply['headlines']['id'] = $feed;
+ else
+ $reply['headlines']['id'] = $next_unread_feed;
+
+ $reply['headlines']['is_cat'] = $cat_view;
+
+ $reply['headlines-info'] = ["count" => (int) $headlines_count,
+ "disable_cache" => (bool) $disable_cache];
+
+ // this is parsed by handleRpcJson() on first viewfeed() to set cdm expanded, etc
+ $reply['runtime-info'] = RPC::_make_runtime_info();
+
+ print json_encode($reply);
+ }
+
+ private function _generate_dashboard_feed() {
+ $reply = array();
+
+ $reply['headlines']['id'] = -5;
+ $reply['headlines']['is_cat'] = false;
+
+ $reply['headlines']['toolbar'] = '';
+
+ $reply['headlines']['content'] = "<div class='whiteBox'>".__('No feed selected.');
+
+ $reply['headlines']['content'] .= "<p><span class=\"text-muted\">";
+
+ $sth = $this->pdo->prepare("SELECT ".SUBSTRING_FOR_DATE."(MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds
+ WHERE owner_uid = ?");
+ $sth->execute([$_SESSION['uid']]);
+ $row = $sth->fetch();
+
+ $last_updated = TimeHelper::make_local_datetime($row["last_updated"], false);
+
+ $reply['headlines']['content'] .= sprintf(__("Feeds last updated at %s"), $last_updated);
+
+ $sth = $this->pdo->prepare("SELECT COUNT(id) AS num_errors
+ FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ?");
+ $sth->execute([$_SESSION['uid']]);
+ $row = $sth->fetch();
+
+ $num_errors = $row["num_errors"];
+
+ if ($num_errors > 0) {
+ $reply['headlines']['content'] .= "<br/>";
+ $reply['headlines']['content'] .= "<a class=\"text-muted\" href=\"#\" onclick=\"CommonDialogs.showFeedsWithErrors()\">".
+ __('Some feeds have update errors (click for details)')."</a>";
+ }
+ $reply['headlines']['content'] .= "</span></p>";
+
+ $reply['headlines-info'] = array("count" => 0,
+ "unread" => 0,
+ "disable_cache" => true);
+
+ return $reply;
+ }
+
+ private function _generate_error_feed($error) {
+ $reply = array();
+
+ $reply['headlines']['id'] = -7;
+ $reply['headlines']['is_cat'] = false;
+
+ $reply['headlines']['toolbar'] = '';
+ $reply['headlines']['content'] = "<div class='whiteBox'>". $error . "</div>";
+
+ $reply['headlines-info'] = array("count" => 0,
+ "unread" => 0,
+ "disable_cache" => true);
+
+ return $reply;
+ }
+
+ function subscribeToFeed() {
+ print json_encode([
+ "cat_select" => \Controls\select_feeds_cats("cat")
+ ]);
+ }
+
+ function search() {
+ print json_encode([
+ "show_language" => Config::get(Config::DB_TYPE) == "pgsql",
+ "show_syntax_help" => count(PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH)) == 0,
+ "all_languages" => Pref_Feeds::get_ts_languages(),
+ "default_language" => get_pref(Prefs::DEFAULT_SEARCH_LANGUAGE)
+ ]);
+ }
+
+ function updatedebugger() {
+ header("Content-type: text/html");
+
+ $xdebug = isset($_REQUEST["xdebug"]) ? (int)$_REQUEST["xdebug"] : 1;
+
+ Debug::set_enabled(true);
+ Debug::set_loglevel($xdebug);
+
+ $feed_id = (int)$_REQUEST["feed_id"];
+ $do_update = ($_REQUEST["action"] ?? "") == "do_update";
+ $csrf_token = $_POST["csrf_token"];
+
+ $sth = $this->pdo->prepare("SELECT id FROM ttrss_feeds WHERE id = ? AND owner_uid = ?");
+ $sth->execute([$feed_id, $_SESSION['uid']]);
+
+ if (!$sth->fetch()) {
+ print "Access denied.";
+ return;
+ }
+ ?>
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title>Feed Debugger</title>
+ <style type='text/css'>
+ @media (prefers-color-scheme: dark) {
+ body {
+ background : #222;
+ }
+ }
+ body.css_loading * {
+ display : none;
+ }
+ </style>
+ <script>
+ dojoConfig = {
+ async: true,
+ cacheBust: "<?= get_scripts_timestamp(); ?>",
+ packages: [
+ { name: "fox", location: "../../js" },
+ ]
+ };
+ </script>
+ <?= javascript_tag("js/utility.js") ?>
+ <?= javascript_tag("js/common.js") ?>
+ <?= javascript_tag("lib/dojo/dojo.js") ?>
+ <?= javascript_tag("lib/dojo/tt-rss-layer.js") ?>
+ </head>
+ <body class="flat ttrss_utility feed_debugger css_loading">
+ <script type="text/javascript">
+ require(['dojo/parser', "dojo/ready", 'dijit/form/Button','dijit/form/CheckBox', 'fox/form/Select', 'dijit/form/Form',
+ 'dijit/form/Select','dijit/form/TextBox','dijit/form/ValidationTextBox'],function(parser, ready){
+ ready(function() {
+ parser.parse();
+ });
+ });
+ </script>
+
+ <div class="container">
+ <h1>Feed Debugger: <?= "$feed_id: " . $this->_get_title($feed_id) ?></h1>
+ <div class="content">
+ <form method="post" action="" dojoType="dijit.form.Form">
+ <?= \Controls\hidden_tag("op", "feeds") ?>
+ <?= \Controls\hidden_tag("method", "updatedebugger") ?>
+ <?= \Controls\hidden_tag("csrf_token", $csrf_token) ?>
+ <?= \Controls\hidden_tag("action", "do_update") ?>
+ <?= \Controls\hidden_tag("feed_id", (string)$feed_id) ?>
+
+ <fieldset>
+ <label>
+ <?= \Controls\select_hash("xdebug", $xdebug,
+ [Debug::$LOG_VERBOSE => "LOG_VERBOSE", Debug::$LOG_EXTENDED => "LOG_EXTENDED"]);
+ ?></label>
+ </fieldset>
+
+ <fieldset>
+ <label class="checkbox"><?= \Controls\checkbox_tag("force_refetch", isset($_REQUEST["force_refetch"])) ?> Force refetch</label>
+ </fieldset>
+
+ <fieldset class="narrow">
+ <label class="checkbox"><?= \Controls\checkbox_tag("force_rehash", isset($_REQUEST["force_rehash"])) ?> Force rehash</label>
+ </fieldset>
+
+ <?= \Controls\submit_tag("Continue") ?>
+ </form>
+
+ <hr>
+
+ <pre><?php
+
+ if ($do_update) {
+ RSSUtils::update_rss_feed($feed_id, true);
+ }
+
+ ?></pre>
+ </div>
+ </div>
+ </body>
+ </html>
+ <?php
+
+ }
+
+ function add() {
+ $feed = clean($_REQUEST['feed']);
+ $cat = clean($_REQUEST['cat'] ?? '');
+ $need_auth = isset($_REQUEST['need_auth']);
+ $login = $need_auth ? clean($_REQUEST['login']) : '';
+ $pass = $need_auth ? clean($_REQUEST['pass']) : '';
+
+ $rc = Feeds::_subscribe($feed, $cat, $login, $pass);
+
+ print json_encode(array("result" => $rc));
+ }
+
+}
+