From d51124689d199ef3796c09f4353ef595bd3827b0 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Mon, 12 Dec 2011 23:32:29 +0400
Subject: add tiny-OOP style backend RPC
---
classes/handler.php | 15 +
classes/rpc.php | 792 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 807 insertions(+)
create mode 100644 classes/handler.php
create mode 100644 classes/rpc.php
(limited to 'classes')
diff --git a/classes/handler.php b/classes/handler.php
new file mode 100644
index 000000000..3bd82c725
--- /dev/null
+++ b/classes/handler.php
@@ -0,0 +1,15 @@
+link = $link;
+ $this->args = $args;
+ }
+
+ function before() {
+ return true;
+ }
+}
+?>
diff --git a/classes/rpc.php b/classes/rpc.php
new file mode 100644
index 000000000..8f03381f8
--- /dev/null
+++ b/classes/rpc.php
@@ -0,0 +1,792 @@
+link, "DELETE FROM ttrss_settings_profiles WHERE id = '$id' AND
+ owner_uid = " . $_SESSION["uid"]);
+ }
+ }
+ }
+
+ // Silent
+ function addprofile() {
+ $title = db_escape_string(trim($_REQUEST["title"]));
+ if ($title) {
+ db_query($this->link, "BEGIN");
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles
+ WHERE title = '$title' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+
+ db_query($this->link, "INSERT INTO ttrss_settings_profiles (title, owner_uid)
+ VALUES ('$title', ".$_SESSION["uid"] .")");
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles WHERE
+ title = '$title'");
+
+ if (db_num_rows($result) != 0) {
+ $profile_id = db_fetch_result($result, 0, "id");
+
+ if ($profile_id) {
+ initialize_user_prefs($this->link, $_SESSION["uid"], $profile_id);
+ }
+ }
+ }
+
+ db_query($this->link, "COMMIT");
+ }
+ }
+
+ // Silent
+ function saveprofile() {
+ $id = db_escape_string($_REQUEST["id"]);
+ $title = db_escape_string(trim($_REQUEST["value"]));
+
+ if ($id == 0) {
+ print __("Default profile");
+ return;
+ }
+
+ if ($title) {
+ db_query($this->link, "BEGIN");
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles
+ WHERE title = '$title' AND owner_uid =" . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+ db_query($this->link, "UPDATE ttrss_settings_profiles
+ SET title = '$title' WHERE id = '$id' AND
+ owner_uid = " . $_SESSION["uid"]);
+ print $title;
+ } else {
+ $result = db_query($this->link, "SELECT title FROM ttrss_settings_profiles
+ WHERE id = '$id' AND owner_uid =" . $_SESSION["uid"]);
+ print db_fetch_result($result, 0, "title");
+ }
+
+ db_query($this->link, "COMMIT");
+ }
+ }
+
+ // Silent
+ function remarchive() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ $result = db_query($this->link, "DELETE FROM ttrss_archived_feeds WHERE
+ (SELECT COUNT(*) FROM ttrss_user_entries
+ WHERE orig_feed_id = '$id') = 0 AND
+ id = '$id' AND owner_uid = ".$_SESSION["uid"]);
+
+ $rc = db_affected_rows($this->link, $result);
+ }
+ }
+
+ function addfeed() {
+ $feed = db_escape_string($_REQUEST['feed']);
+ $cat = db_escape_string($_REQUEST['cat']);
+ $login = db_escape_string($_REQUEST['login']);
+ $pass = db_escape_string($_REQUEST['pass']);
+
+ $rc = subscribe_to_feed($this->link, $feed, $cat, $login, $pass);
+
+ print json_encode(array("result" => $rc));
+ }
+
+ function extractfeedurls() {
+ $urls = get_feeds_from_html($_REQUEST['url']);
+
+ print json_encode(array("urls" => $urls));
+ }
+
+ function togglepref() {
+ $key = db_escape_string($_REQUEST["key"]);
+ set_pref($this->link, $key, !get_pref($this->link, $key));
+ $value = get_pref($this->link, $key);
+
+ print json_encode(array("param" =>$key, "value" => $value));
+ }
+
+ function setpref() {
+ $value = str_replace("\n", " ", $_REQUEST['value']);
+
+ $key = db_escape_string($_REQUEST["key"]);
+ $value = db_escape_string($value);
+
+ set_pref($this->link, $key, $value);
+
+ print json_encode(array("param" =>$key, "value" => $value));
+ }
+
+ function mark() {
+ $mark = $_REQUEST["mark"];
+ $id = db_escape_string($_REQUEST["id"]);
+
+ if ($mark == "1") {
+ $mark = "true";
+ } else {
+ $mark = "false";
+ }
+
+ $result = db_query($this->link, "UPDATE ttrss_user_entries SET marked = $mark
+ WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function delete() {
+ $ids = db_escape_string($_REQUEST["ids"]);
+
+ $result = db_query($this->link, "DELETE FROM ttrss_user_entries
+ WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function unarchive() {
+ $ids = db_escape_string($_REQUEST["ids"]);
+
+ $result = db_query($this->link, "UPDATE ttrss_user_entries
+ SET feed_id = orig_feed_id, orig_feed_id = NULL
+ WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function archive() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ archive_article($this->link, $id, $_SESSION["uid"]);
+ }
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function publ() {
+ $pub = $_REQUEST["pub"];
+ $id = db_escape_string($_REQUEST["id"]);
+ $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
+
+ if ($pub == "1") {
+ $pub = "true";
+ } else {
+ $pub = "false";
+ }
+
+ $result = db_query($this->link, "UPDATE ttrss_user_entries SET
+ published = $pub
+ WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+
+ $pubsub_result = false;
+
+ if (PUBSUBHUBBUB_HUB) {
+ $rss_link = get_self_url_prefix() .
+ "/public.php?op=rss&id=-2&key=" .
+ get_feed_access_key($this->link, -2, false);
+
+ $p = new Publisher(PUBSUBHUBBUB_HUB);
+
+ $pubsub_result = $p->publish_update($rss_link);
+ }
+
+ print json_encode(array("message" => "UPDATE_COUNTERS",
+ "pubsub_result" => $pubsub_result));
+ }
+
+ function getAllCounters() {
+ $last_article_id = (int) $_REQUEST["last_article_id"];
+
+ $reply = array();
+
+ if ($seq) $reply['seq'] = $seq;
+
+ if ($last_article_id != getLastArticleId($this->link)) {
+ $omode = $_REQUEST["omode"];
+
+ if ($omode != "T")
+ $reply['counters'] = getAllCounters($this->link, $omode);
+ else
+ $reply['counters'] = getGlobalCounters($this->link);
+ }
+
+ $reply['runtime-info'] = make_runtime_info($this->link);
+
+ print json_encode($reply);
+ }
+
+ /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */
+ function catchupSelected() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $cmode = sprintf("%d", $_REQUEST["cmode"]);
+
+ catchupArticlesById($this->link, $ids, $cmode);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function markSelected() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $cmode = sprintf("%d", $_REQUEST["cmode"]);
+
+ markArticlesById($this->link, $ids, $cmode);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function publishSelected() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $cmode = sprintf("%d", $_REQUEST["cmode"]);
+
+ publishArticlesById($this->link, $ids, $cmode);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function sanityCheck() {
+ $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true";
+
+ $reply = array();
+
+ $reply['error'] = sanity_check($this->link);
+
+ if ($reply['error']['code'] == 0) {
+ $reply['init-params'] = make_init_params($this->link);
+ $reply['runtime-info'] = make_runtime_info($this->link);
+ }
+
+ print json_encode($reply);
+ }
+
+ function setArticleTags() {
+ global $memcache;
+
+ $id = db_escape_string($_REQUEST["id"]);
+
+ $tags_str = db_escape_string($_REQUEST["tags_str"]);
+ $tags = array_unique(trim_array(explode(",", $tags_str)));
+
+ db_query($this->link, "BEGIN");
+
+ $result = db_query($this->link, "SELECT int_id FROM ttrss_user_entries WHERE
+ ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1");
+
+ if (db_num_rows($result) == 1) {
+
+ $tags_to_cache = array();
+
+ $int_id = db_fetch_result($result, 0, "int_id");
+
+ db_query($this->link, "DELETE FROM ttrss_tags WHERE
+ post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'");
+
+ foreach ($tags as $tag) {
+ $tag = sanitize_tag($tag);
+
+ if (!tag_is_valid($tag)) {
+ continue;
+ }
+
+ if (preg_match("/^[0-9]*$/", $tag)) {
+ continue;
+ }
+
+ // print "";
+
+ if ($tag != '') {
+ db_query($this->link, "INSERT INTO ttrss_tags
+ (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')");
+ }
+
+ array_push($tags_to_cache, $tag);
+ }
+
+ /* update tag cache */
+
+ sort($tags_to_cache);
+ $tags_str = join(",", $tags_to_cache);
+
+ db_query($this->link, "UPDATE ttrss_user_entries
+ SET tag_cache = '$tags_str' WHERE ref_id = '$id'
+ AND owner_uid = " . $_SESSION["uid"]);
+ }
+
+ db_query($this->link, "COMMIT");
+
+ if ($memcache) {
+ $obj_id = md5("TAGS:".$_SESSION["uid"].":$id");
+ $memcache->delete($obj_id);
+ }
+
+ $tags = get_article_tags($this->link, $id);
+ $tags_str = format_tags_string($tags, $id);
+ $tags_str_full = join(", ", $tags);
+
+ if (!$tags_str_full) $tags_str_full = __("no tags");
+
+ print json_encode(array("tags_str" => array("id" => $id,
+ "content" => $tags_str, "content_full" => $tags_str_full)));
+ }
+
+ function regenOPMLKey() {
+ update_feed_access_key($this->link, 'OPML:Publish',
+ false, $_SESSION["uid"]);
+
+ $new_link = opml_publish_url($this->link);
+
+ print json_encode(array("link" => $new_link));
+ }
+
+ function completeTags() {
+ $search = db_escape_string($_REQUEST["search"]);
+
+ $result = db_query($this->link, "SELECT DISTINCT tag_name FROM ttrss_tags
+ WHERE owner_uid = '".$_SESSION["uid"]."' AND
+ tag_name LIKE '$search%' ORDER BY tag_name
+ LIMIT 10");
+
+ print "";
+ while ($line = db_fetch_assoc($result)) {
+ print "" . $line["tag_name"] . " ";
+ }
+ print " ";
+ }
+
+ function purge() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $days = sprintf("%d", $_REQUEST["days"]);
+
+ foreach ($ids as $id) {
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
+ id = '$id' AND owner_uid = ".$_SESSION["uid"]);
+
+ if (db_num_rows($result) == 1) {
+ purge_feed($this->link, $id, $days);
+ }
+ }
+ }
+
+ function getArticles() {
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $articles = array();
+
+ foreach ($ids as $id) {
+ if ($id) {
+ array_push($articles, format_article($this->link, $id, 0, false));
+ }
+ }
+
+ print json_encode($articles);
+ }
+
+ function checkDate() {
+ $date = db_escape_string($_REQUEST["date"]);
+ $date_parsed = strtotime($date);
+
+ print json_encode(array("result" => (bool)$date_parsed,
+ "date" => date("c", $date_parsed)));
+ }
+
+ function assigntolabel() {
+ return labelops(true);
+ }
+
+ function removefromlabel() {
+ return labelops(false);
+ }
+
+ function labelops($assign) {
+ $reply = array();
+
+ $ids = explode(",", db_escape_string($_REQUEST["ids"]));
+ $label_id = db_escape_string($_REQUEST["lid"]);
+
+ $label = db_escape_string(label_find_caption($this->link, $label_id,
+ $_SESSION["uid"]));
+
+ $reply["info-for-headlines"] = array();
+
+ if ($label) {
+
+ foreach ($ids as $id) {
+
+ if ($assign)
+ label_add_article($this->link, $id, $label, $_SESSION["uid"]);
+ else
+ label_remove_article($this->link, $id, $label, $_SESSION["uid"]);
+
+ $labels = get_article_labels($this->link, $id, $_SESSION["uid"]);
+
+ array_push($reply["info-for-headlines"],
+ array("id" => $id, "labels" => format_article_labels($labels, $id)));
+
+ }
+ }
+
+ $reply["message"] = "UPDATE_COUNTERS";
+
+ print json_encode($reply);
+ }
+
+ function updateFeedBrowser() {
+ $search = db_escape_string($_REQUEST["search"]);
+ $limit = db_escape_string($_REQUEST["limit"]);
+ $mode = (int) db_escape_string($_REQUEST["mode"]);
+
+ print json_encode(array("content" =>
+ make_feed_browser($this->link, $search, $limit, $mode),
+ "mode" => $mode));
+ }
+
+ // Silent
+ function massSubscribe() {
+
+ $payload = json_decode($_REQUEST["payload"], false);
+ $mode = $_REQUEST["mode"];
+
+ if (!$payload || !is_array($payload)) return;
+
+ if ($mode == 1) {
+ foreach ($payload as $feed) {
+
+ $title = db_escape_string($feed[0]);
+ $feed_url = db_escape_string($feed[1]);
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
+ feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+ $result = db_query($this->link, "INSERT INTO ttrss_feeds
+ (owner_uid,feed_url,title,cat_id,site_url)
+ VALUES ('".$_SESSION["uid"]."',
+ '$feed_url', '$title', NULL, '')");
+ }
+ }
+ } else if ($mode == 2) {
+ // feed archive
+ foreach ($payload as $id) {
+ $result = db_query($this->link, "SELECT * FROM ttrss_archived_feeds
+ WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ $site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
+ $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
+ $title = db_escape_string(db_fetch_result($result, 0, "title"));
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
+ feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+ $result = db_query($this->link, "INSERT INTO ttrss_feeds
+ (owner_uid,feed_url,title,cat_id,site_url)
+ VALUES ('$id','".$_SESSION["uid"]."',
+ '$feed_url', '$title', NULL, '$site_url')");
+ }
+ }
+ }
+ }
+ }
+
+ function digestgetcontents() {
+ $article_id = db_escape_string($_REQUEST['article_id']);
+
+ $result = db_query($this->link, "SELECT content,title,link,marked,published
+ FROM ttrss_entries, ttrss_user_entries
+ WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']);
+
+ $content = sanitize_rss($this->link, db_fetch_result($result, 0, "content"));
+ $title = strip_tags(db_fetch_result($result, 0, "title"));
+ $article_url = htmlspecialchars(db_fetch_result($result, 0, "link"));
+ $marked = sql_bool_to_bool(db_fetch_result($result, 0, "marked"));
+ $published = sql_bool_to_bool(db_fetch_result($result, 0, "published"));
+
+ print json_encode(array("article" =>
+ array("id" => $article_id, "url" => $article_url,
+ "tags" => get_article_tags($this->link, $article_id),
+ "marked" => $marked, "published" => $published,
+ "title" => $title, "content" => $content)));
+ }
+
+ function digestupdate() {
+ $feed_id = db_escape_string($_REQUEST['feed_id']);
+ $offset = db_escape_string($_REQUEST['offset']);
+ $seq = db_escape_string($_REQUEST['seq']);
+
+ if (!$feed_id) $feed_id = -4;
+ if (!$offset) $offset = 0;
+
+ $reply = array();
+
+ $reply['seq'] = $seq;
+
+ $headlines = api_get_headlines($this->link, $feed_id, 30, $offset,
+ '', ($feed_id == -4), true, false, "unread", "updated DESC", 0, 0);
+
+ $reply['headlines'] = array();
+ $reply['headlines']['title'] = getFeedTitle($this->link, $feed_id);
+ $reply['headlines']['content'] = $headlines;
+
+ print json_encode($reply);
+ }
+
+ function digestinit() {
+ $tmp_feeds = api_get_feeds($this->link, -4, true, false, 0);
+
+ $feeds = array();
+
+ foreach ($tmp_feeds as $f) {
+ if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f);
+ }
+
+ print json_encode(array("feeds" => $feeds));
+ }
+
+ function catchupFeed() {
+ $feed_id = db_escape_string($_REQUEST['feed_id']);
+ $is_cat = db_escape_string($_REQUEST['is_cat']) == "true";
+
+ catchup_feed($this->link, $feed_id, $is_cat);
+
+ print json_encode(array("message" => "UPDATE_COUNTERS"));
+ }
+
+ function sendEmail() {
+ $secretkey = $_REQUEST['secretkey'];
+
+ require_once 'lib/phpmailer/class.phpmailer.php';
+
+ $reply = array();
+
+ if (DIGEST_ENABLE && $_SESSION['email_secretkey'] &&
+ $secretkey == $_SESSION['email_secretkey']) {
+
+ $_SESSION['email_secretkey'] = '';
+
+ $destination = $_REQUEST['destination'];
+ $subject = $_REQUEST['subject'];
+ $content = $_REQUEST['content'];
+
+ $replyto = strip_tags($_SESSION['email_replyto']);
+ $fromname = strip_tags($_SESSION['email_fromname']);
+
+ $mail = new PHPMailer();
+
+ $mail->PluginDir = "lib/phpmailer/";
+ $mail->SetLanguage("en", "lib/phpmailer/language/");
+
+ $mail->CharSet = "UTF-8";
+
+ $mail->From = $replyto;
+ $mail->FromName = $fromname;
+ $mail->AddAddress($destination);
+
+ if (DIGEST_SMTP_HOST) {
+ $mail->Host = DIGEST_SMTP_HOST;
+ $mail->Mailer = "smtp";
+ $mail->SMTPAuth = DIGEST_SMTP_LOGIN != '';
+ $mail->Username = DIGEST_SMTP_LOGIN;
+ $mail->Password = DIGEST_SMTP_PASSWORD;
+ }
+
+ $mail->IsHTML(false);
+ $mail->Subject = $subject;
+ $mail->Body = $content;
+
+ $rc = $mail->Send();
+
+ if (!$rc) {
+ $reply['error'] = $mail->ErrorInfo;
+ } else {
+ save_email_address($this->link, db_escape_string($destination));
+ $reply['message'] = "UPDATE_COUNTERS";
+ }
+
+ } else {
+ $reply['error'] = "Not authorized.";
+ }
+
+ print json_encode($reply);
+ }
+
+ function completeEmails() {
+ $search = db_escape_string($_REQUEST["search"]);
+
+ print "";
+
+ foreach ($_SESSION['stored_emails'] as $email) {
+ if (strpos($email, $search) !== false) {
+ print "$email ";
+ }
+ }
+
+ print " ";
+ }
+
+ function quickAddCat() {
+ $cat = db_escape_string($_REQUEST["cat"]);
+
+ add_feed_category($this->link, $cat);
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feed_categories WHERE
+ title = '$cat' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 1) {
+ $id = db_fetch_result($result, 0, "id");
+ } else {
+ $id = 0;
+ }
+
+ print_feed_cat_select($this->link, "cat_id", $id);
+ }
+
+ function regenFeedKey() {
+ $feed_id = db_escape_string($_REQUEST['id']);
+ $is_cat = db_escape_string($_REQUEST['is_cat']) == "true";
+
+ $new_key = update_feed_access_key($this->link, $feed_id, $is_cat);
+
+ print json_encode(array("link" => $new_key));
+ }
+
+ // Silent
+ function clearKeys() {
+ db_query($this->link, "DELETE FROM ttrss_access_keys WHERE
+ owner_uid = " . $_SESSION["uid"]);
+ }
+
+ // Silent
+ function clearArticleKeys() {
+ db_query($this->link, "UPDATE ttrss_user_entries SET uuid = '' WHERE
+ owner_uid = " . $_SESSION["uid"]);
+
+ return;
+ }
+
+
+ function verifyRegexp() {
+ $reg_exp = $_REQUEST["reg_exp"];
+
+ $status = @preg_match("/$reg_exp/i", "TEST") !== false;
+
+ print json_encode(array("status" => $status));
+ }
+
+ // TODO: unify with digest-get-contents?
+ function cdmGetArticle() {
+ $ids = array(db_escape_string($_REQUEST["id"]));
+ $cids = explode(",", $_REQUEST["cids"]);
+
+ $ids = array_merge($ids, $cids);
+
+ $rv = array();
+
+ foreach ($ids as $id) {
+ $id = (int)$id;
+
+ $result = db_query($this->link, "SELECT content,
+ ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds,
+ ttrss_entries
+ WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND
+ ttrss_entries.id = ref_id AND
+ ttrss_user_entries.owner_uid = ".$_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ $line = db_fetch_assoc($result);
+
+ $article_content = sanitize_rss($this->link, $line["content"],
+ false, false, $line['site_url']);
+
+ array_push($rv,
+ array("id" => $id, "content" => $article_content));
+ }
+ }
+
+ print json_encode($rv);
+ }
+
+ function scheduleFeedUpdate() {
+ $feed_id = db_escape_string($_REQUEST["id"]);
+ $is_cat = db_escape_string($_REQUEST['is_cat']) == 'true';
+
+ $message = __("Your request could not be completed.");
+
+ if ($feed_id >= 0) {
+ if (!$is_cat) {
+ $message = __("Feed update has been scheduled.");
+
+ db_query($this->link, "UPDATE ttrss_feeds SET
+ last_update_started = '1970-01-01',
+ last_updated = '1970-01-01' WHERE id = '$feed_id' AND
+ owner_uid = ".$_SESSION["uid"]);
+
+ } else {
+ $message = __("Category update has been scheduled.");
+
+ if ($feed_id)
+ $cat_query = "cat_id = '$feed_id'";
+ else
+ $cat_query = "cat_id IS NULL";
+
+ db_query($this->link, "UPDATE ttrss_feeds SET
+ last_update_started = '1970-01-01',
+ last_updated = '1970-01-01' WHERE $cat_query AND
+ owner_uid = ".$_SESSION["uid"]);
+ }
+ } else {
+ $message = __("Can't update this kind of feed.");
+ }
+
+ print json_encode(array("message" => $message));
+ return;
+ }
+
+ function getTweetInfo() {
+ $id = db_escape_string($_REQUEST['id']);
+
+ $result = db_query($this->link, "SELECT title, link
+ FROM ttrss_entries, ttrss_user_entries
+ WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']);
+
+ if (db_num_rows($result) != 0) {
+ $title = truncate_string(strip_tags(db_fetch_result($result, 0, 'title')),
+ 100, '...');
+ $article_link = db_fetch_result($result, 0, 'link');
+ }
+
+ print json_encode(array("title" => $title, "link" => $article_link,
+ "id" => $id));
+ }
+
+ function setNote() {
+ $id = db_escape_string($_REQUEST["id"]);
+ $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
+
+ db_query($this->link, "UPDATE ttrss_user_entries SET note = '$note'
+ WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+
+ $formatted_note = format_article_note($id, $note);
+
+ print json_encode(array("note" => $formatted_note,
+ "raw_length" => mb_strlen($note)));
+ }
+
+ function genHash() {
+ $hash = sha1(uniqid(rand(), true));
+
+ print json_encode(array("hash" => $hash));
+ }
+}
+?>
--
cgit v1.2.3
From 3f3630529e1e7a0adf2ce0022596006cfcba0089 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 00:20:53 +0400
Subject: implement tiny-OOP routing
---
classes/article.php | 63 +++
classes/dlg.php | 1089 +++++++++++++++++++++++++++++++++++++++++++++++++++
classes/feeds.php | 187 +++++++++
classes/handler.php | 4 +
4 files changed, 1343 insertions(+)
create mode 100644 classes/article.php
create mode 100644 classes/dlg.php
create mode 100644 classes/feeds.php
(limited to 'classes')
diff --git a/classes/article.php b/classes/article.php
new file mode 100644
index 000000000..98141d91e
--- /dev/null
+++ b/classes/article.php
@@ -0,0 +1,63 @@
+link, "SELECT link FROM ttrss_entries, ttrss_user_entries
+ WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."'
+ LIMIT 1");
+
+ if (db_num_rows($result) == 1) {
+ $article_url = db_fetch_result($result, 0, 'link');
+ $article_url = str_replace("\n", "", $article_url);
+
+ header("Location: $article_url");
+ return;
+
+ } else {
+ print_error(__("Article not found."));
+ }
+ }
+
+ function view() {
+ $id = db_escape_string($_REQUEST["id"]);
+ $cids = explode(",", db_escape_string($_REQUEST["cids"]));
+ $mode = db_escape_string($_REQUEST["mode"]);
+ $omode = db_escape_string($_REQUEST["omode"]);
+
+ // in prefetch mode we only output requested cids, main article
+ // just gets marked as read (it already exists in client cache)
+
+ $articles = array();
+
+ if ($mode == "") {
+ array_push($articles, format_article($this->link, $id, false));
+ } else if ($mode == "zoom") {
+ array_push($articles, format_article($this->link, $id, true, true));
+ } else if ($mode == "raw") {
+ if ($_REQUEST['html']) {
+ header("Content-Type: text/html");
+ print ' ';
+ }
+
+ $article = format_article($this->link, $id, false);
+ print $article['content'];
+ return;
+ }
+
+ catchupArticleById($this->link, $id, 0);
+
+ if (!$_SESSION["bw_limit"]) {
+ foreach ($cids as $cid) {
+ if ($cid) {
+ array_push($articles, format_article($this->link, $cid, false, false));
+ }
+ }
+ }
+
+ print json_encode($articles);
+
+ }
+
+}
\ No newline at end of file
diff --git a/classes/dlg.php b/classes/dlg.php
new file mode 100644
index 000000000..3a66bf129
--- /dev/null
+++ b/classes/dlg.php
@@ -0,0 +1,1089 @@
+param = db_escape_string($_REQUEST["param"]);
+ print "";
+ return true;
+ }
+ return false;
+ }
+
+ function after() {
+ print " ";
+ }
+
+ function importOpml() {
+ header("Content-Type: text/html"); # required for iframe
+
+ print "";
+ $owner_uid = $_SESSION["uid"];
+
+ db_query($this->link, "BEGIN");
+
+ /* create Imported feeds category just in case */
+
+ $result = db_query($this->link, "SELECT id FROM
+ ttrss_feed_categories WHERE title = 'Imported feeds' AND
+ owner_uid = '$owner_uid' LIMIT 1");
+
+ if (db_num_rows($result) == 0) {
+ db_query($this->link, "INSERT INTO ttrss_feed_categories
+ (title,owner_uid)
+ VALUES ('Imported feeds', '$owner_uid')");
+ }
+
+ db_query($this->link, "COMMIT");
+
+ /* Handle OPML import by DOMXML/DOMDocument */
+
+ if (function_exists('domxml_open_file')) {
+ print "
";
+ print "".__("Importing using DOMXML.")." ";
+ require_once "opml_domxml.php";
+ opml_import_domxml($this->link, $owner_uid);
+ print " ";
+ } else if (PHP_VERSION >= 5) {
+ print "
";
+ print "".__("Importing using DOMDocument.")." ";
+ require_once "opml_domdoc.php";
+ opml_import_domdoc($this->link, $owner_uid);
+ print " ";
+ } else {
+ print_error(__("DOMXML extension is not found. It is required for PHP versions below 5."));
+ }
+
+ print "
";
+
+ print "";
+ print "".
+ __('Close this window')." ";
+ print "
";
+
+ print "";
+
+ //return;
+ }
+
+ function editPrefProfiles() {
+ print "";
+
+ print "
+ ".
+ __('Create profile')."
";
+
+ $result = db_query($this->link, "SELECT title,id FROM ttrss_settings_profiles
+ WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY title");
+
+ print "";
+
+ print "
";
+ print "
";
+
+ print "";
+
+ }
+
+ function pubOPMLUrl() {
+ print "".__('Public OPML URL')." ";
+ print "link);
+
+ print __("Your Public OPML URL is:");
+
+ print "";
+
+ print "";
+
+ print "".
+ __('Generate new URL')." ";
+
+ print "".
+ __('Close this window')." ";
+
+ print "
";
+ print "]]> ";
+
+ //return;
+ }
+
+ function explainError() {
+ print "".__('Notice')." ";
+ print "";
+
+ if ($this->param == 1) {
+ print __("Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner.");
+
+ $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp");
+
+ print "" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
+
+ }
+
+ if ($this->param == 3) {
+ print __("Update daemon is taking too long to perform a feed update. This could indicate a problem like crash or a hang. Please check the daemon process or contact instance owner.");
+
+ $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp");
+
+ print "
" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
+
+ }
+
+ print "";
+
+ print "
";
+
+ print "".
+ __('Close this window')." ";
+
+ print "
";
+ print "]]> ";
+
+ //return;
+ }
+
+ function quickAddFeed() {
+ print " ";
+ print " ";
+
+ print "".__("Feed")."
";
+ print "";
+
+ print " ";
+
+ print "
";
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+ print __('Place in category:') . " ";
+ print_feed_cat_select($this->link, "cat", false, 'dojoType="dijit.form.Select"');
+ }
+
+ print "
";
+
+ print '
+
+
' . __('Available feeds') . '
+
'.
+ '
+
+ '.
+ '
';
+
+ print "";
+
+
+ print "
+
+ ".
+ __('This feed requires authentication.')."
";
+
+ print "";
+
+ print "
+ ".__('Subscribe')."
+ ".__('More feeds')."
+ ".__('Cancel')."
+
";
+
+ //return;
+ }
+
+ function feedBrowser() {
+ $browser_search = db_escape_string($_REQUEST["search"]);
+
+ print " ";
+ print " ";
+
+ print "
+
+
+
+
".__('Search')."
+
";
+
+ print "
+ " . __('Popular feeds') . "
+ " . __('Feed archive') . "
+ ";
+
+ print __("limit:");
+
+ print "
";
+
+ foreach (array(25, 50, 100, 200) as $l) {
+ $issel = ($l == $limit) ? "selected=\"1\"" : "";
+ print "$l ";
+ }
+
+ print " ";
+
+ print "
";
+
+ $owner_uid = $_SESSION["uid"];
+
+ print "";
+ print make_feed_browser($this->link, $search, 25);
+ print " ";
+
+ print "
+ ".__('Subscribe')."
+ ".__('Remove')."
+ ".__('Cancel')."
";
+
+ }
+
+ function search() {
+ $this->params = explode(":", db_escape_string($_REQUEST["param"]), 2);
+
+ $active_feed_id = sprintf("%d", $this->params[0]);
+ $is_cat = $this->params[1] != "false";
+
+ print "".__('Look for')."
";
+
+ print "";
+
+ if (!SPHINX_ENABLED) {
+
+ print " ";
+
+ print " " . __('match on')." ";
+
+ $search_fields = array(
+ "title" => __("Title"),
+ "content" => __("Content"),
+ "both" => __("Title or content"));
+
+ print_select_hash("match_on", 3, $search_fields,
+ 'dojoType="dijit.form.Select"');
+ } else {
+ print " ";
+ }
+
+
+ print "
".__('Limit search to:')." ";
+
+ print "
+ ".__('All feeds')." ";
+
+ $feed_title = getFeedTitle($this->link, $active_feed_id);
+
+ if (!$is_cat) {
+ $feed_cat_title = getFeedCatTitle($this->link, $active_feed_id);
+ } else {
+ $feed_cat_title = getCategoryTitle($this->link, $active_feed_id);
+ }
+
+ if ($active_feed_id && !$is_cat) {
+ print "$feed_title ";
+ } else {
+ print "".__('This feed')." ";
+ }
+
+ if ($is_cat) {
+ $cat_preselected = "selected=\"1\"";
+ }
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
+ print "$feed_cat_title ";
+ } else {
+ //print "".__('This category')." ";
+ }
+
+ print " ";
+
+ print "";
+
+ print "";
+ }
+
+ function quickAddFilter() {
+ $active_feed_id = db_escape_string($_REQUEST["param"]);
+
+ print " ";
+ print " ";
+ print " ";
+
+ $result = db_query($this->link, "SELECT id,description
+ FROM ttrss_filter_types ORDER BY description");
+
+ $filter_types = array();
+
+ while ($line = db_fetch_assoc($result)) {
+ //array_push($filter_types, $line["description"]);
+ $filter_types[$line["id"]] = __($line["description"]);
+ }
+
+ print "".__("Match")."
";
+
+ print "";
+
+ print "";
+
+ $filter_params = array(
+ "before" => __("before"),
+ "after" => __("after"));
+
+ print_select_hash("filter_date_modifier", "before",
+ $filter_params, 'dojoType="dijit.form.Select"');
+
+ print " ";
+
+ print " ";
+
+ print "";
+ print " ".
+ __('Check it')." ";
+ print " ";
+
+ print "
" . __("on field") . " ";
+ print_select_hash("filter_type", 1, $filter_types,
+ 'onchange="filterDlgCheckType(this)" dojoType="dijit.form.Select"');
+
+ print " ";
+
+ print __("in") . " ";
+ print_feed_select($this->link, "feed_id", $active_feed_id,
+ 'dojoType="dijit.form.FilteringSelect"');
+
+ print "";
+
+ print "".__("Perform Action")."
";
+
+ print "";
+
+ print "";
+
+ $result = db_query($this->link, "SELECT id,description FROM ttrss_filter_actions
+ ORDER BY name");
+
+ while ($line = db_fetch_assoc($result)) {
+ printf("%s ", $line["id"], __($line["description"]));
+ }
+
+ print " ";
+
+ print "";
+ print " " . __("with parameters:") . " ";
+ print " ";
+
+ print_label_select($this->link, "action_param_label", $action_param,
+ 'id="filterDlg_actionParamLabel" dojoType="dijit.form.Select"');
+
+ print " ";
+
+ print " "; // tiny layout hack
+
+ print "
";
+
+ print "".__("Options")."
";
+ print "";
+
+ print "
+ ".__('Enabled')."
";
+
+ print "
+ ".__('Inverse match')." ";
+
+ print "";
+
+ print "";
+
+ print "".
+ __('Test')." ";
+
+ print "".
+ __('Create')." ";
+
+ print "".
+ __('Cancel')." ";
+
+ print "
";
+ }
+
+ function inactiveFeeds() {
+
+ if (DB_TYPE == "pgsql") {
+ $interval_qpart = "NOW() - INTERVAL '3 months'";
+ } else {
+ $interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)";
+ }
+
+ $result = db_query($this->link, "SELECT ttrss_feeds.title, ttrss_feeds.site_url,
+ ttrss_feeds.feed_url, ttrss_feeds.id, MAX(updated) AS last_article
+ FROM ttrss_feeds, ttrss_entries, ttrss_user_entries WHERE
+ (SELECT MAX(updated) FROM ttrss_entries, ttrss_user_entries WHERE
+ ttrss_entries.id = ref_id AND
+ ttrss_user_entries.feed_id = ttrss_feeds.id) < $interval_qpart
+ AND ttrss_feeds.owner_uid = ".$_SESSION["uid"]." AND
+ ttrss_user_entries.feed_id = ttrss_feeds.id AND
+ ttrss_entries.id = ref_id
+ GROUP BY ttrss_feeds.title, ttrss_feeds.id, ttrss_feeds.site_url, ttrss_feeds.feed_url
+ ORDER BY last_article");
+
+ print __("These feeds have not been updated with new content for 3 months (oldest first):");
+
+ print "";
+
+ print "
";
+ print "
";
+
+ print "";
+
+ }
+
+ function feedsWithErrors() {
+ print __("These feeds have not been updated because of errors:");
+
+ $result = db_query($this->link, "SELECT id,title,feed_url,last_error,site_url
+ FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]);
+
+ print "";
+
+ print "
";
+ print "
";
+
+ print "";
+ }
+
+ function editArticleTags() {
+
+ print __("Tags for this article (separated by commas):")." ";
+
+ $tags = get_article_tags($this->link, $this->param);
+
+ $tags_str = join(", ", $tags);
+
+ print " param\">";
+ print " ";
+ print " ";
+
+ print "";
+
+ print "
+
";
+
+ print "
";
+
+ print "";
+
+ print "".__('Save')." ";
+ print "".__('Cancel')." ";
+ print "
";
+
+ }
+
+ function printTagCloud() {
+ print "".__('Tag Cloud')." ";
+ print "";
+
+ printTagCloud($this->link);
+
+ print "";
+
+ print "";
+ print "".
+ __('Close this window')." ";
+ print "
";
+
+ print "]]> ";
+ }
+
+ function printTagSelect() {
+
+ print "" . __('Select item(s) by tags') . " ";
+ print " Any ";
+ print " All ";
+ print " tags.";
+
+ print "";
+ $result = db_query($this->link, "SELECT DISTINCT tag_name FROM ttrss_tags WHERE owner_uid = ".$_SESSION['uid']."
+ AND LENGTH(tag_name) <= 30 ORDER BY tag_name ASC");
+
+ while ($row = db_fetch_assoc($result)) {
+ $tmp = htmlspecialchars($row["tag_name"]);
+ print "$tmp ";
+ }
+
+ print " ";
+
+ print "";
+ print "" . __('Display entries') . " ";
+ print " ";
+ print "" .
+ __('Close this window') . " ";
+ print "
";
+
+ print "]]> ";
+ }
+
+ function emailArticle() {
+
+ $secretkey = sha1(uniqid(rand(), true));
+
+ $_SESSION['email_secretkey'] = $secretkey;
+
+ print " ";
+ print " ";
+ print " ";
+
+ $result = db_query($this->link, "SELECT email, full_name FROM ttrss_users WHERE
+ id = " . $_SESSION["uid"]);
+
+ $user_email = htmlspecialchars(db_fetch_result($result, 0, "email"));
+ $user_name = htmlspecialchars(db_fetch_result($result, 0, "full_name"));
+
+ if (!$user_name) $user_name = $_SESSION['name'];
+
+ $_SESSION['email_replyto'] = $user_email;
+ $_SESSION['email_fromname'] = $user_name;
+
+ require_once "lib/MiniTemplator.class.php";
+
+ $tpl = new MiniTemplator;
+ $tpl_t = new MiniTemplator;
+
+ $tpl->readTemplateFromFile("templates/email_article_template.txt");
+
+ $tpl->setVariable('USER_NAME', $_SESSION["name"]);
+ $tpl->setVariable('USER_EMAIL', $user_email);
+ $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]);
+
+
+ $result = db_query($this->link, "SELECT link, content, title
+ FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND
+ id IN ($this->param) AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) > 1) {
+ $subject = __("[Forwarded]") . " " . __("Multiple articles");
+ }
+
+ while ($line = db_fetch_assoc($result)) {
+
+ if (!$subject)
+ $subject = __("[Forwarded]") . " " . htmlspecialchars($line["title"]);
+
+ $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"]));
+ $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"]));
+
+ $tpl->addBlock('article');
+ }
+
+ $tpl->addBlock('email');
+
+ $content = "";
+ $tpl->generateOutputToString($content);
+
+ print "";
+
+ print "";
+ print "".__('Send e-mail')." ";
+ print "".__('Cancel')." ";
+ print "
";
+
+ //return;
+ }
+
+ function generatedFeed() {
+
+ print "".__('View as RSS')." ";
+ print "params = explode(":", $this->param, 3);
+ $feed_id = db_escape_string($this->params[0]);
+ $is_cat = (bool) $this->params[1];
+
+ $key = get_feed_access_key($this->link, $feed_id, $is_cat);
+
+ $url_path = htmlspecialchars($this->params[2]) . "&key=" . $key;
+
+ print __("You can view this feed as RSS using the following URL:");
+
+ print "";
+
+ print "";
+
+ print "".
+ __('Generate new URL')." ";
+
+ print "".
+ __('Close this window')." ";
+
+ print "
";
+ print "]]> ";
+
+ //return;
+ }
+
+ function newVersion() {
+
+ $version_data = check_for_update($this->link);
+ $version = $version_data['version'];
+ $id = $version_data['version_id'];
+
+ print "";
+
+ print T_sprintf("New version of Tiny Tiny RSS is available (%s).",
+ "$version ");
+
+ print "
";
+
+ $details = "http://tt-rss.org/redmine/versions/show/$id";
+ $download = "http://tt-rss.org/#Download";
+
+ print "";
+ print "".__("Details")." ";
+ print "".__("Download")." ";
+ print "".
+ __('Close this window')." ";
+ print "
";
+
+ }
+
+ function customizeCSS() {
+ $value = get_pref($this->link, "USER_STYLESHEET");
+
+ $value = str_replace(" ", "\n", $value);
+
+ print T_sprintf("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here. This file can be used as a baseline.", "tt-rss.css");
+
+ print " ";
+ print " ";
+ print " ";
+
+ print "";
+
+ print "";
+ print "".__('Save')." ";
+ print "".__('Cancel')." ";
+ print "
";
+
+ }
+
+ function editArticleNote() {
+ $result = db_query($this->link, "SELECT note FROM ttrss_user_entries WHERE
+ ref_id = '$this->param' AND owner_uid = " . $_SESSION['uid']);
+
+ $note = db_fetch_result($result, 0, "note");
+
+ print " param\">";
+ print " ";
+ print " ";
+
+ print "";
+
+ print "";
+ print "".__('Save')." ";
+ print "".__('Cancel')." ";
+ print "
";
+
+ }
+
+ function about() {
+ print "";
+ print " ";
+ print " ";
+ print "";
+
+ print "Tiny Riny RSS
+ Version ".VERSION."
+ Copyright © 2005-".date('Y')."
+ Andrew Dolgov
+ and other contributors.
+ Licensed under GNU GPL version 2.
";
+
+ print "
+ Official site —
+
+ Support the project.
";
+
+ print " ";
+ print "
";
+
+ print "";
+ print "".
+ __('Close this window')." ";
+ print "
";
+ }
+
+ function addInstance() {
+ print " ";
+ print " ";
+
+ print "".__("Instance")."
";
+
+ print "";
+
+ print "";
+
+ return;
+ }
+
+ function shareArticle() {
+ $result = db_query($this->link, "SELECT uuid, ref_id FROM ttrss_user_entries WHERE int_id = '$this->param'
+ AND owner_uid = " . $_SESSION['uid']);
+
+ if (db_num_rows($result) == 0) {
+ print "Article not found.";
+ } else {
+
+ $uuid = db_fetch_result($result, 0, "uuid");
+ $ref_id = db_fetch_result($result, 0, "ref_id");
+
+ if (!$uuid) {
+ $uuid = db_escape_string(sha1(uniqid(rand(), true)));
+ db_query($this->link, "UPDATE ttrss_user_entries SET uuid = '$uuid' WHERE int_id = '$this->param'
+ AND owner_uid = " . $_SESSION['uid']);
+ }
+
+ print __("You can share this article by the following unique URL:");
+
+ $url_path = get_self_url_prefix();
+ $url_path .= "/public.php?op=share&key=$uuid";
+
+ print "";
+
+ /* if (!label_find_id($this->link, __('Shared'), $_SESSION["uid"]))
+ label_create($this->link, __('Shared'), $_SESSION["uid"]);
+
+ label_add_article($this->link, $ref_id, __('Shared'), $_SESSION['uid']); */
+ }
+
+ print "";
+
+ print "".
+ __('Close this window')." ";
+
+ print "
";
+ }
+
+}
+?>
diff --git a/classes/feeds.php b/classes/feeds.php
new file mode 100644
index 000000000..a654c92ae
--- /dev/null
+++ b/classes/feeds.php
@@ -0,0 +1,187 @@
+link, "UPDATE ttrss_user_entries SET
+ last_read = NOW(),unread = false WHERE owner_uid = " . $_SESSION["uid"]);
+ ccache_zero_all($this->link, $_SESSION["uid"]);
+ }
+
+ function collapse() {
+ $cat_id = db_escape_string($_REQUEST["cid"]);
+ $mode = (int) db_escape_string($_REQUEST['mode']);
+ toggle_collapse_cat($this->link, $cat_id, $mode);
+ }
+
+ function index() {
+ $root = (bool)$_REQUEST["root"];
+
+ if (!$root) {
+ print json_encode(outputFeedList($this->link));
+ } else {
+
+ $feeds = outputFeedList($this->link, false);
+
+ $root = array();
+ $root['id'] = 'root';
+ $root['name'] = __('Feeds');
+ $root['items'] = $feeds['items'];
+
+ $fl = array();
+ $fl['identifier'] = 'id';
+ $fl['label'] = 'name';
+ $fl['items'] = array($root);
+
+ print json_encode($fl);
+ }
+ }
+
+ function view() {
+ $timing_info = getmicrotime();
+
+ $reply = array();
+
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("0", $timing_info);
+
+ $omode = db_escape_string($_REQUEST["omode"]);
+
+ $feed = db_escape_string($_REQUEST["feed"]);
+ $method = db_escape_string($_REQUEST["m"]);
+ $view_mode = db_escape_string($_REQUEST["view_mode"]);
+ $limit = (int) get_pref($this->link, "DEFAULT_ARTICLE_LIMIT");
+ @$cat_view = db_escape_string($_REQUEST["cat"]) == "true";
+ @$next_unread_feed = db_escape_string($_REQUEST["nuf"]);
+ @$offset = db_escape_string($_REQUEST["skip"]);
+ @$vgroup_last_feed = db_escape_string($_REQUEST["vgrlf"]);
+ $order_by = db_escape_string($_REQUEST["order_by"]);
+
+ 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(generate_dashboard_feed($this->link));
+ return;
+ }
+
+ $result = false;
+
+ if ($feed < -10) {
+ $label_feed = -11-$feed;
+ $result = db_query($this->link, "SELECT id FROM ttrss_labels2 WHERE
+ id = '$label_feed' AND owner_uid = " . $_SESSION['uid']);
+ } else if (!$cat_view && is_numeric($feed) && $feed > 0) {
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
+ id = '$feed' AND owner_uid = " . $_SESSION['uid']);
+ } else if ($cat_view && is_numeric($feed) && $feed > 0) {
+ $result = db_query($this->link, "SELECT id FROM ttrss_feed_categories WHERE
+ id = '$feed' AND owner_uid = " . $_SESSION['uid']);
+ }
+
+ if ($result && db_num_rows($result) == 0) {
+ print json_encode(generate_error_feed($this->link, __("Feed not found.")));
+ return;
+ }
+
+ /* Updating a label ccache means recalculating all of the caches
+ * so for performance reasons we don't do that here */
+
+ if ($feed >= 0) {
+ ccache_update($this->link, $feed, $_SESSION["uid"], $cat_view);
+ }
+
+ set_pref($this->link, "_DEFAULT_VIEW_MODE", $view_mode);
+ set_pref($this->link, "_DEFAULT_VIEW_LIMIT", $limit);
+ set_pref($this->link, "_DEFAULT_VIEW_ORDER_BY", $order_by);
+
+ if (!$cat_view && preg_match("/^[0-9][0-9]*$/", $feed)) {
+ db_query($this->link, "UPDATE ttrss_feeds SET last_viewed = NOW()
+ WHERE id = '$feed' AND owner_uid = ".$_SESSION["uid"]);
+ }
+
+ $reply['headlines'] = array();
+
+ if (!$next_unread_feed)
+ $reply['headlines']['id'] = $feed;
+ else
+ $reply['headlines']['id'] = $next_unread_feed;
+
+ $reply['headlines']['is_cat'] = (bool) $cat_view;
+
+ $override_order = false;
+
+ if (get_pref($this->link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) {
+ $date_sort_field = "updated";
+ } else {
+ $date_sort_field = "date_entered";
+ }
+
+ switch ($order_by) {
+ case "date":
+ if (get_pref($this->link, 'REVERSE_HEADLINES', $owner_uid)) {
+ $override_order = "$date_sort_field";
+ } else {
+ $override_order = "$date_sort_field DESC";
+ }
+ break;
+
+ case "title":
+ if (get_pref($this->link, 'REVERSE_HEADLINES', $owner_uid)) {
+ $override_order = "title DESC, $date_sort_field";
+ } else {
+ $override_order = "title, $date_sort_field DESC";
+ }
+ break;
+
+ case "score":
+ if (get_pref($this->link, 'REVERSE_HEADLINES', $owner_uid)) {
+ $override_order = "score, $date_sort_field";
+ } else {
+ $override_order = "score DESC, $date_sort_field DESC";
+ }
+ break;
+ }
+
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("04", $timing_info);
+
+ $ret = format_headlines_list($this->link, $feed, $method,
+ $view_mode, $limit, $cat_view, $next_unread_feed, $offset,
+ $vgroup_last_feed, $override_order);
+
+ $topmost_article_ids = $ret[0];
+ $headlines_count = $ret[1];
+ $returned_feed = $ret[2];
+ $disable_cache = $ret[3];
+ $vgroup_last_feed = $ret[4];
+
+ $reply['headlines']['content'] =& $ret[5]['content'];
+ $reply['headlines']['toolbar'] =& $ret[5]['toolbar'];
+
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("05", $timing_info);
+
+ $reply['headlines-info'] = array("count" => (int) $headlines_count,
+ "vgroup_last_feed" => $vgroup_last_feed,
+ "disable_cache" => (bool) $disable_cache);
+
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info);
+
+ if (is_array($topmost_article_ids) && !get_pref($this->link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) {
+ $articles = array();
+
+ foreach ($topmost_article_ids as $id) {
+ array_push($articles, format_article($this->link, $id, false));
+ }
+
+ $reply['articles'] = $articles;
+ }
+
+ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("30", $timing_info);
+
+ $reply['runtime-info'] = make_runtime_info($this->link);
+
+ print json_encode($reply);
+
+ }
+}
+?>
\ No newline at end of file
diff --git a/classes/handler.php b/classes/handler.php
index 3bd82c725..53b52ea03 100644
--- a/classes/handler.php
+++ b/classes/handler.php
@@ -11,5 +11,9 @@ class Handler {
function before() {
return true;
}
+
+ function after() {
+ return true;
+ }
}
?>
--
cgit v1.2.3
From afcfe6cad5606370c2e8ba3737bf96ae4f045bf9 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 09:29:22 +0400
Subject: add pref_feeds class
---
classes/pref_feeds.php | 1538 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1538 insertions(+)
create mode 100644 classes/pref_feeds.php
(limited to 'classes')
diff --git a/classes/pref_feeds.php b/classes/pref_feeds.php
new file mode 100644
index 000000000..bf15bf25a
--- /dev/null
+++ b/classes/pref_feeds.php
@@ -0,0 +1,1538 @@
+";
+ }
+
+ function renamecat() {
+ $title = db_escape_string($_REQUEST['title']);
+ $id = db_escape_string($_REQUEST['id']);
+
+ if ($title) {
+ db_query($this->link, "UPDATE ttrss_feed_categories SET
+ title = '$title' WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+ }
+ return;
+ }
+
+ function remtwitterinfo() {
+
+ db_query($this->link, "UPDATE ttrss_users SET twitter_oauth = NULL
+ WHERE id = " . $_SESSION['uid']);
+
+ return;
+ }
+
+ function getfeedtree() {
+
+ $search = $_SESSION["prefs_feed_search"];
+
+ if ($search) $search_qpart = " AND LOWER(title) LIKE LOWER('%$search%')";
+
+ $root = array();
+ $root['id'] = 'root';
+ $root['name'] = __('Feeds');
+ $root['items'] = array();
+ $root['type'] = 'category';
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+
+ $result = db_query($this->link, "SELECT id, title FROM ttrss_feed_categories
+ WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY order_id, title");
+
+ while ($line = db_fetch_assoc($result)) {
+ $cat = array();
+ $cat['id'] = 'CAT:' . $line['id'];
+ $cat['bare_id'] = $feed_id;
+ $cat['name'] = $line['title'];
+ $cat['items'] = array();
+ $cat['checkbox'] = false;
+ $cat['type'] = 'category';
+
+ $feed_result = db_query($this->link, "SELECT id, title, last_error,
+ ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
+ FROM ttrss_feeds
+ WHERE cat_id = '".$line['id']."' AND owner_uid = ".$_SESSION["uid"].
+ "$search_qpart ORDER BY order_id, title");
+
+ while ($feed_line = db_fetch_assoc($feed_result)) {
+ $feed = array();
+ $feed['id'] = 'FEED:' . $feed_line['id'];
+ $feed['bare_id'] = $feed_line['id'];
+ $feed['name'] = $feed_line['title'];
+ $feed['checkbox'] = false;
+ $feed['error'] = $feed_line['last_error'];
+ $feed['icon'] = getFeedIcon($feed_line['id']);
+ $feed['param'] = make_local_datetime($this->link,
+ $feed_line['last_updated'], true);
+
+ array_push($cat['items'], $feed);
+ }
+
+ $cat['param'] = T_sprintf('(%d feeds)', count($cat['items']));
+
+ if (count($cat['items']) > 0)
+ array_push($root['items'], $cat);
+
+ $root['param'] += count($cat['items']);
+ }
+
+ /* Uncategorized is a special case */
+
+ $cat = array();
+ $cat['id'] = 'CAT:0';
+ $cat['bare_id'] = 0;
+ $cat['name'] = __("Uncategorized");
+ $cat['items'] = array();
+ $cat['type'] = 'category';
+ $cat['checkbox'] = false;
+
+ $feed_result = db_query($this->link, "SELECT id, title,last_error,
+ ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
+ FROM ttrss_feeds
+ WHERE cat_id IS NULL AND owner_uid = ".$_SESSION["uid"].
+ "$search_qpart ORDER BY order_id, title");
+
+ while ($feed_line = db_fetch_assoc($feed_result)) {
+ $feed = array();
+ $feed['id'] = 'FEED:' . $feed_line['id'];
+ $feed['bare_id'] = $feed_line['id'];
+ $feed['name'] = $feed_line['title'];
+ $feed['checkbox'] = false;
+ $feed['error'] = $feed_line['last_error'];
+ $feed['icon'] = getFeedIcon($feed_line['id']);
+ $feed['param'] = make_local_datetime($this->link,
+ $feed_line['last_updated'], true);
+
+ array_push($cat['items'], $feed);
+ }
+
+ $cat['param'] = T_sprintf('(%d feeds)', count($cat['items']));
+
+ if (count($cat['items']) > 0)
+ array_push($root['items'], $cat);
+
+ $root['param'] += count($cat['items']);
+ $root['param'] = T_sprintf('(%d feeds)', $root['param']);
+
+ } else {
+ $feed_result = db_query($this->link, "SELECT id, title, last_error,
+ ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
+ FROM ttrss_feeds
+ WHERE owner_uid = ".$_SESSION["uid"].
+ "$search_qpart ORDER BY order_id, title");
+
+ while ($feed_line = db_fetch_assoc($feed_result)) {
+ $feed = array();
+ $feed['id'] = 'FEED:' . $feed_line['id'];
+ $feed['bare_id'] = $feed_line['id'];
+ $feed['name'] = $feed_line['title'];
+ $feed['checkbox'] = false;
+ $feed['error'] = $feed_line['last_error'];
+ $feed['icon'] = getFeedIcon($feed_line['id']);
+ $feed['param'] = make_local_datetime($this->link,
+ $feed_line['last_updated'], true);
+
+ array_push($root['items'], $feed);
+ }
+
+ $root['param'] = T_sprintf('(%d feeds)', count($root['items']));
+
+ }
+
+ $fl = array();
+ $fl['identifier'] = 'id';
+ $fl['label'] = 'name';
+ $fl['items'] = array($root);
+
+ print json_encode($fl);
+ return;
+ }
+
+ function catsortreset() {
+ db_query($this->link, "UPDATE ttrss_feed_categories
+ SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
+ return;
+ }
+
+ function feedsortreset() {
+ db_query($this->link, "UPDATE ttrss_feeds
+ SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
+ return;
+ }
+
+ function savefeedorder() {
+ $data = json_decode($_POST['payload'], true);
+
+ if (is_array($data) && is_array($data['items'])) {
+ $cat_order_id = 0;
+
+ $data_map = array();
+
+ foreach ($data['items'] as $item) {
+
+ if ($item['id'] != 'root') {
+ if (is_array($item['items'])) {
+ if (isset($item['items']['_reference'])) {
+ $data_map[$item['id']] = array($item['items']);
+ } else {
+ $data_map[$item['id']] =& $item['items'];
+ }
+ }
+ }
+ }
+
+ foreach ($data['items'][0]['items'] as $item) {
+ $id = $item['_reference'];
+ $bare_id = substr($id, strpos($id, ':')+1);
+
+ ++$cat_order_id;
+
+ if ($bare_id > 0) {
+ db_query($this->link, "UPDATE ttrss_feed_categories
+ SET order_id = '$cat_order_id' WHERE id = '$bare_id' AND
+ owner_uid = " . $_SESSION["uid"]);
+ }
+
+ $feed_order_id = 0;
+
+ if (is_array($data_map[$id])) {
+ foreach ($data_map[$id] as $feed) {
+ $id = $feed['_reference'];
+ $feed_id = substr($id, strpos($id, ':')+1);
+
+ if ($bare_id != 0)
+ $cat_query = "cat_id = '$bare_id'";
+ else
+ $cat_query = "cat_id = NULL";
+
+ db_query($this->link, "UPDATE ttrss_feeds
+ SET order_id = '$feed_order_id',
+ $cat_query
+ WHERE id = '$feed_id' AND
+ owner_uid = " . $_SESSION["uid"]);
+
+ ++$feed_order_id;
+ }
+ }
+ }
+ }
+
+ return;
+ }
+
+ function removeicon() {
+ $feed_id = db_escape_string($_REQUEST["feed_id"]);
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds
+ WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ unlink(ICONS_DIR . "/$feed_id.ico");
+ }
+
+ return;
+ }
+
+ function uploadicon() {
+ $icon_file = $_FILES['icon_file']['tmp_name'];
+ $feed_id = db_escape_string($_REQUEST["feed_id"]);
+
+ if (is_file($icon_file) && $feed_id) {
+ if (filesize($icon_file) < 20000) {
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds
+ WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ unlink(ICONS_DIR . "/$feed_id.ico");
+ move_uploaded_file($icon_file, ICONS_DIR . "/$feed_id.ico");
+ $rc = 0;
+ } else {
+ $rc = 2;
+ }
+ } else {
+ $rc = 1;
+ }
+ } else {
+ $rc = 2;
+ }
+
+ print "";
+ return;
+ }
+
+ function editfeed() {
+ global $purge_intervals;
+ global $update_intervals;
+ global $update_methods;
+
+ $feed_id = db_escape_string($_REQUEST["id"]);
+
+ $result = db_query($this->link,
+ "SELECT * FROM ttrss_feeds WHERE id = '$feed_id' AND
+ owner_uid = " . $_SESSION["uid"]);
+
+ $title = htmlspecialchars(db_fetch_result($result,
+ 0, "title"));
+
+ print " ";
+ print " ";
+ print " ";
+
+ print "".__("Feed")."
";
+ print "";
+
+ /* Title */
+
+ print " ";
+
+ /* Feed URL */
+
+ $feed_url = db_fetch_result($result, 0, "feed_url");
+ $feed_url = htmlspecialchars(db_fetch_result($result,
+ 0, "feed_url"));
+
+ print "
";
+
+ print __('URL:') . " ";
+ print " ";
+
+ $last_error = db_fetch_result($result, 0, "last_error");
+
+ if ($last_error) {
+ print " (error) ";
+
+ }
+
+ /* Category */
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+
+ $cat_id = db_fetch_result($result, 0, "cat_id");
+
+ print " ";
+
+ print __('Place in category:') . " ";
+
+ print_feed_cat_select($this->link, "cat_id", $cat_id,
+ 'dojoType="dijit.form.Select"');
+ }
+
+ print "";
+
+ print "".__("Update")."
";
+ print "";
+
+ /* Update Interval */
+
+ $update_interval = db_fetch_result($result, 0, "update_interval");
+
+ print_select_hash("update_interval", $update_interval, $update_intervals,
+ 'dojoType="dijit.form.Select"');
+
+ /* Update method */
+
+ $update_method = db_fetch_result($result, 0, "update_method",
+ 'dojoType="dijit.form.Select"');
+
+ print " " . __('using') . " ";
+ print_select_hash("update_method", $update_method, $update_methods,
+ 'dojoType="dijit.form.Select"');
+
+ $purge_interval = db_fetch_result($result, 0, "purge_interval");
+
+
+ /* Purge intl */
+
+ print "
";
+ print __('Article purging:') . " ";
+
+ print_select_hash("purge_interval", $purge_interval, $purge_intervals,
+ 'dojoType="dijit.form.Select" ' .
+ ((FORCE_ARTICLE_PURGE == 0) ? "" : 'disabled="1"'));
+
+ print "";
+ print "".__("Authentication")."
";
+ print "";
+ print "".__("Options")."
";
+ print "";
+
+ $private = sql_bool_to_bool(db_fetch_result($result, 0, "private"));
+
+ if ($private) {
+ $checked = "checked=\"1\"";
+ } else {
+ $checked = "";
+ }
+
+ print " ".__('Hide from Popular feeds')." ";
+
+ $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
+
+ if ($rtl_content) {
+ $checked = "checked=\"1\"";
+ } else {
+ $checked = "";
+ }
+
+ print "
".__('Right-to-left content')." ";
+
+ $include_in_digest = sql_bool_to_bool(db_fetch_result($result, 0, "include_in_digest"));
+
+ if ($include_in_digest) {
+ $checked = "checked=\"1\"";
+ } else {
+ $checked = "";
+ }
+
+ print " ".__('Include in e-mail digest')." ";
+
+
+ $always_display_enclosures = sql_bool_to_bool(db_fetch_result($result, 0, "always_display_enclosures"));
+
+ if ($always_display_enclosures) {
+ $checked = "checked";
+ } else {
+ $checked = "";
+ }
+
+ print " ".__('Always display image attachments')." ";
+
+
+ $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images"));
+
+ if ($cache_images) {
+ $checked = "checked=\"1\"";
+ } else {
+ $checked = "";
+ }
+
+ if (SIMPLEPIE_CACHE_IMAGES) {
+ print " ".
+ __('Cache images locally (SimplePie only)')." ";
+ }
+
+ $mark_unread_on_update = sql_bool_to_bool(db_fetch_result($result, 0, "mark_unread_on_update"));
+
+ if ($mark_unread_on_update) {
+ $checked = "checked";
+ } else {
+ $checked = "";
+ }
+
+ print " ".__('Mark updated articles as unread')." ";
+
+ $update_on_checksum_change = sql_bool_to_bool(db_fetch_result($result, 0, "update_on_checksum_change"));
+
+ if ($update_on_checksum_change) {
+ $checked = "checked";
+ } else {
+ $checked = "";
+ }
+
+ print " ".__('Mark posts as updated on content change')." ";
+
+ print "";
+
+ /* Icon */
+
+ print "".__("Icon")."
";
+ print "";
+
+ print "";
+
+ print "";
+
+ print "
";
+
+ $title = htmlspecialchars($title, ENT_QUOTES);
+
+ print "";
+
+ return;
+ }
+
+ function editfeeds() {
+ global $purge_intervals;
+ global $update_intervals;
+ global $update_methods;
+
+ $feed_ids = db_escape_string($_REQUEST["ids"]);
+
+ print " ";
+ print " ";
+ print " ";
+
+ print "".__("Feed")."
";
+ print "";
+
+ /* Title */
+
+ print " ";
+
+ $this->batch_edit_cbox("title");
+
+ /* Feed URL */
+
+ print " ";
+
+ print __('URL:') . " ";
+ print " ";
+
+ $this->batch_edit_cbox("feed_url");
+
+ /* Category */
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+
+ print " ";
+
+ print __('Place in category:') . " ";
+
+ print_feed_cat_select($this->link, "cat_id", $cat_id,
+ 'disabled="1" dojoType="dijit.form.Select"');
+
+ $this->batch_edit_cbox("cat_id");
+
+ }
+
+ print "
";
+
+ print "".__("Update")."
";
+ print "";
+
+ /* Update Interval */
+
+ print_select_hash("update_interval", $update_interval, $update_intervals,
+ 'disabled="1" dojoType="dijit.form.Select"');
+
+ $this->batch_edit_cbox("update_interval");
+
+ /* Update method */
+
+ print " " . __('using') . " ";
+ print_select_hash("update_method", $update_method, $update_methods,
+ 'disabled="1" dojoType="dijit.form.Select"');
+ $this->batch_edit_cbox("update_method");
+
+ /* Purge intl */
+
+ if (FORCE_ARTICLE_PURGE == 0) {
+
+ print " ";
+
+ print __('Article purging:') . " ";
+
+ print_select_hash("purge_interval", $purge_interval, $purge_intervals,
+ 'disabled="1" dojoType="dijit.form.Select"');
+
+ $this->batch_edit_cbox("purge_interval");
+ }
+
+ print "
";
+ print "".__("Authentication")."
";
+ print "";
+
+ print " ";
+
+ $this->batch_edit_cbox("auth_login");
+
+ print " ";
+
+ $this->batch_edit_cbox("auth_pass");
+
+ print "
";
+ print "".__("Options")."
";
+ print "";
+
+ print " ".__('Hide from Popular feeds')." ";
+
+ print " "; $this->batch_edit_cbox("private", "private_l");
+
+ print " ".__('Right-to-left content')." ";
+
+ print " "; $this->batch_edit_cbox("rtl_content", "rtl_content_l");
+
+ print " ".__('Include in e-mail digest')." ";
+
+ print " "; $this->batch_edit_cbox("include_in_digest", "include_in_digest_l");
+
+ print " ".__('Always display image attachments')." ";
+
+ print " "; $this->batch_edit_cbox("always_display_enclosures", "always_display_enclosures_l");
+
+ if (SIMPLEPIE_CACHE_IMAGES) {
+ print " ".
+ __('Cache images locally')." ";
+
+
+ print " "; $this->batch_edit_cbox("cache_images", "cache_images_l");
+ }
+
+ print " ".__('Mark updated articles as unread')." ";
+
+ print " "; $this->batch_edit_cbox("mark_unread_on_update", "mark_unread_on_update_l");
+
+ print " ".__('Mark posts as updated on content change')." ";
+
+ print " "; $this->batch_edit_cbox("update_on_checksum_change", "update_on_checksum_change_l");
+
+ print "
";
+
+ print "
+ ".
+ __('Save')."
+ ".
+ __('Cancel')."
+
";
+
+ return;
+ }
+
+ function batchEditSave() {
+ return editsaveops(true);
+ }
+
+ function editSave() {
+ return editsaveops(false);
+ }
+
+ function editsaveops($batch) {
+
+ $feed_title = db_escape_string(trim($_POST["title"]));
+ $feed_link = db_escape_string(trim($_POST["feed_url"]));
+ $upd_intl = (int) db_escape_string($_POST["update_interval"]);
+ $purge_intl = (int) db_escape_string($_POST["purge_interval"]);
+ $feed_id = (int) db_escape_string($_POST["id"]); /* editSave */
+ $feed_ids = db_escape_string($_POST["ids"]); /* batchEditSave */
+ $cat_id = (int) db_escape_string($_POST["cat_id"]);
+ $auth_login = db_escape_string(trim($_POST["auth_login"]));
+ $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
+ $private = checkbox_to_sql_bool(db_escape_string($_POST["private"]));
+ $rtl_content = checkbox_to_sql_bool(db_escape_string($_POST["rtl_content"]));
+ $include_in_digest = checkbox_to_sql_bool(
+ db_escape_string($_POST["include_in_digest"]));
+ $cache_images = checkbox_to_sql_bool(
+ db_escape_string($_POST["cache_images"]));
+ $update_method = (int) db_escape_string($_POST["update_method"]);
+
+ $always_display_enclosures = checkbox_to_sql_bool(
+ db_escape_string($_POST["always_display_enclosures"]));
+
+ $mark_unread_on_update = checkbox_to_sql_bool(
+ db_escape_string($_POST["mark_unread_on_update"]));
+
+ $update_on_checksum_change = checkbox_to_sql_bool(
+ db_escape_string($_POST["update_on_checksum_change"]));
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+ if ($cat_id && $cat_id != 0) {
+ $category_qpart = "cat_id = '$cat_id',";
+ $category_qpart_nocomma = "cat_id = '$cat_id'";
+ } else {
+ $category_qpart = 'cat_id = NULL,';
+ $category_qpart_nocomma = 'cat_id = NULL';
+ }
+ } else {
+ $category_qpart = "";
+ $category_qpart_nocomma = "";
+ }
+
+ if (SIMPLEPIE_CACHE_IMAGES) {
+ $cache_images_qpart = "cache_images = $cache_images,";
+ } else {
+ $cache_images_qpart = "";
+ }
+
+ if ($method == "editSave") {
+
+ $result = db_query($this->link, "UPDATE ttrss_feeds SET
+ $category_qpart
+ title = '$feed_title', feed_url = '$feed_link',
+ update_interval = '$upd_intl',
+ purge_interval = '$purge_intl',
+ auth_login = '$auth_login',
+ auth_pass = '$auth_pass',
+ private = $private,
+ rtl_content = $rtl_content,
+ $cache_images_qpart
+ include_in_digest = $include_in_digest,
+ always_display_enclosures = $always_display_enclosures,
+ mark_unread_on_update = $mark_unread_on_update,
+ update_on_checksum_change = $update_on_checksum_change,
+ update_method = '$update_method'
+ WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
+
+ } else if ($batch) {
+ $feed_data = array();
+
+ foreach (array_keys($_POST) as $k) {
+ if ($k != "op" && $k != "method" && $k != "ids") {
+ $feed_data[$k] = $_POST[$k];
+ }
+ }
+
+ db_query($this->link, "BEGIN");
+
+ foreach (array_keys($feed_data) as $k) {
+
+ $qpart = "";
+
+ switch ($k) {
+ case "title":
+ $qpart = "title = '$feed_title'";
+ break;
+
+ case "feed_url":
+ $qpart = "feed_url = '$feed_link'";
+ break;
+
+ case "update_interval":
+ $qpart = "update_interval = '$upd_intl'";
+ break;
+
+ case "purge_interval":
+ $qpart = "purge_interval = '$purge_intl'";
+ break;
+
+ case "auth_login":
+ $qpart = "auth_login = '$auth_login'";
+ break;
+
+ case "auth_pass":
+ $qpart = "auth_pass = '$auth_pass'";
+ break;
+
+ case "private":
+ $qpart = "private = '$private'";
+ break;
+
+ case "include_in_digest":
+ $qpart = "include_in_digest = '$include_in_digest'";
+ break;
+
+ case "always_display_enclosures":
+ $qpart = "always_display_enclosures = '$always_display_enclosures'";
+ break;
+
+ case "mark_unread_on_update":
+ $qpart = "mark_unread_on_update = '$mark_unread_on_update'";
+ break;
+
+ case "update_on_checksum_change":
+ $qpart = "update_on_checksum_change = '$update_on_checksum_change'";
+ break;
+
+ case "cache_images":
+ $qpart = "cache_images = '$cache_images'";
+ break;
+
+ case "rtl_content":
+ $qpart = "rtl_content = '$rtl_content'";
+ break;
+
+ case "update_method":
+ $qpart = "update_method = '$update_method'";
+ break;
+
+ case "cat_id":
+ $qpart = $category_qpart_nocomma;
+ break;
+
+ }
+
+ if ($qpart) {
+ db_query($this->link,
+ "UPDATE ttrss_feeds SET $qpart WHERE id IN ($feed_ids)
+ AND owner_uid = " . $_SESSION["uid"]);
+ print " ";
+ }
+ }
+
+ db_query($this->link, "COMMIT");
+ }
+ return;
+ }
+
+ function resetPubSub() {
+
+ $ids = db_escape_string($_REQUEST["ids"]);
+
+ db_query($this->link, "UPDATE ttrss_feeds SET pubsub_state = 0 WHERE id IN ($ids)
+ AND owner_uid = " . $_SESSION["uid"]);
+
+ return;
+ }
+
+ function remove() {
+
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ remove_feed($this->link, $id, $_SESSION["uid"]);
+ }
+
+ return;
+ }
+
+ function clear() {
+ $id = db_escape_string($_REQUEST["id"]);
+ clear_feed_articles($this->link, $id);
+ }
+
+ function rescore() {
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+
+ $filters = load_filters($this->link, $id, $_SESSION["uid"], 6);
+
+ $result = db_query($this->link, "SELECT
+ title, content, link, ref_id, author,".
+ SUBSTRING_FOR_DATE."(updated, 1, 19) AS updated
+ FROM
+ ttrss_user_entries, ttrss_entries
+ WHERE ref_id = id AND feed_id = '$id' AND
+ owner_uid = " .$_SESSION['uid']."
+ ");
+
+ $scores = array();
+
+ while ($line = db_fetch_assoc($result)) {
+
+ $tags = get_article_tags($this->link, $line["ref_id"]);
+
+ $article_filters = get_article_filters($filters, $line['title'],
+ $line['content'], $line['link'], strtotime($line['updated']),
+ $line['author'], $tags);
+
+ $new_score = calculate_article_score($article_filters);
+
+ if (!$scores[$new_score]) $scores[$new_score] = array();
+
+ array_push($scores[$new_score], $line['ref_id']);
+ }
+
+ foreach (array_keys($scores) as $s) {
+ if ($s > 1000) {
+ db_query($this->link, "UPDATE ttrss_user_entries SET score = '$s',
+ marked = true WHERE
+ ref_id IN (" . join(',', $scores[$s]) . ")");
+ } else if ($s < -500) {
+ db_query($this->link, "UPDATE ttrss_user_entries SET score = '$s',
+ unread = false WHERE
+ ref_id IN (" . join(',', $scores[$s]) . ")");
+ } else {
+ db_query($this->link, "UPDATE ttrss_user_entries SET score = '$s' WHERE
+ ref_id IN (" . join(',', $scores[$s]) . ")");
+ }
+ }
+ }
+
+ print __("All done.");
+
+ }
+
+ function rescoreAll() {
+
+ $result = db_query($this->link,
+ "SELECT id FROM ttrss_feeds WHERE owner_uid = " . $_SESSION['uid']);
+
+ while ($feed_line = db_fetch_assoc($result)) {
+
+ $id = $feed_line["id"];
+
+ $filters = load_filters($this->link, $id, $_SESSION["uid"], 6);
+
+ $tmp_result = db_query($this->link, "SELECT
+ title, content, link, ref_id, author,".
+ SUBSTRING_FOR_DATE."(updated, 1, 19) AS updated
+ FROM
+ ttrss_user_entries, ttrss_entries
+ WHERE ref_id = id AND feed_id = '$id' AND
+ owner_uid = " .$_SESSION['uid']."
+ ");
+
+ $scores = array();
+
+ while ($line = db_fetch_assoc($tmp_result)) {
+
+ $tags = get_article_tags($this->link, $line["ref_id"]);
+
+ $article_filters = get_article_filters($filters, $line['title'],
+ $line['content'], $line['link'], strtotime($line['updated']),
+ $line['author'], $tags);
+
+ $new_score = calculate_article_score($article_filters);
+
+ if (!$scores[$new_score]) $scores[$new_score] = array();
+
+ array_push($scores[$new_score], $line['ref_id']);
+ }
+
+ foreach (array_keys($scores) as $s) {
+ if ($s > 1000) {
+ db_query($this->link, "UPDATE ttrss_user_entries SET score = '$s',
+ marked = true WHERE
+ ref_id IN (" . join(',', $scores[$s]) . ")");
+ } else {
+ db_query($this->link, "UPDATE ttrss_user_entries SET score = '$s' WHERE
+ ref_id IN (" . join(',', $scores[$s]) . ")");
+ }
+ }
+ }
+
+ print __("All done.");
+
+ }
+
+ function add() {
+ $feed_url = db_escape_string(trim($_REQUEST["feed_url"]));
+ $cat_id = db_escape_string($_REQUEST["cat_id"]);
+ $p_from = db_escape_string($_REQUEST["from"]);
+
+ /* only read authentication information from POST */
+
+ $auth_login = db_escape_string(trim($_POST["auth_login"]));
+ $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
+
+ if ($p_from != 'tt-rss') {
+ header("Content-Type: text/html");
+ print "
+
+ Tiny Tiny RSS
+
+
+
+
+ Subscribe to feed... ";
+ }
+
+ $rc = subscribe_to_feed($this->link, $feed_url, $cat_id, $auth_login, $auth_pass);
+
+ switch ($rc) {
+ case 1:
+ print_notice(T_sprintf("Subscribed to %s .", $feed_url));
+ break;
+ case 2:
+ print_error(T_sprintf("Could not subscribe to %s .", $feed_url));
+ break;
+ case 3:
+ print_error(T_sprintf("No feeds found in %s .", $feed_url));
+ break;
+ case 0:
+ print_warning(T_sprintf("Already subscribed to %s .", $feed_url));
+ break;
+ case 4:
+ print_notice("Multiple feed URLs found.");
+
+ $feed_urls = get_feeds_from_html($feed_url);
+ break;
+ case 5:
+ print_error(T_sprintf("Could not subscribe to %s . Can't download the Feed URL.", $feed_url));
+ break;
+ }
+
+ if ($p_from != 'tt-rss') {
+
+ if ($feed_urls) {
+
+ print "";
+ }
+
+ $tp_uri = get_self_url_prefix() . "/prefs.php";
+ $tt_uri = get_self_url_prefix();
+
+ if ($rc <= 2){
+ $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
+ feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
+
+ $feed_id = db_fetch_result($result, 0, "id");
+ } else {
+ $feed_id = 0;
+ }
+ print "";
+
+ if ($feed_id) {
+ print "
";
+ }
+
+ print " ";
+
+ print "";
+ return;
+ }
+ }
+
+ function categorize() {
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ $cat_id = db_escape_string($_REQUEST["cat_id"]);
+
+ if ($cat_id == 0) {
+ $cat_id_qpart = 'NULL';
+ } else {
+ $cat_id_qpart = "'$cat_id'";
+ }
+
+ db_query($this->link, "BEGIN");
+
+ foreach ($ids as $id) {
+
+ db_query($this->link, "UPDATE ttrss_feeds SET cat_id = $cat_id_qpart
+ WHERE id = '$id'
+ AND owner_uid = " . $_SESSION["uid"]);
+
+ }
+
+ db_query($this->link, "COMMIT");
+ }
+
+ function editCats() {
+
+ $action = $_REQUEST["action"];
+
+ if ($action == "save") {
+
+ $cat_title = db_escape_string(trim($_REQUEST["value"]));
+ $cat_id = db_escape_string($_REQUEST["cid"]);
+
+ db_query($this->link, "BEGIN");
+
+ $result = db_query($this->link, "SELECT title FROM ttrss_feed_categories
+ WHERE id = '$cat_id' AND owner_uid = ".$_SESSION["uid"]);
+
+ if (db_num_rows($result) == 1) {
+
+ $old_title = db_fetch_result($result, 0, "title");
+
+ if ($cat_title != "") {
+ $result = db_query($this->link, "UPDATE ttrss_feed_categories SET
+ title = '$cat_title' WHERE id = '$cat_id' AND
+ owner_uid = ".$_SESSION["uid"]);
+
+ print $cat_title;
+ } else {
+ print $old_title;
+ }
+ } else {
+ print $_REQUEST["value"];
+ }
+
+ db_query($this->link, "COMMIT");
+
+ return;
+
+ }
+
+ if ($action == "add") {
+
+ $feed_cat = db_escape_string(trim($_REQUEST["cat"]));
+
+ if (!add_feed_category($this->link, $feed_cat))
+ print_warning(T_sprintf("Category $%s already exists in the database.", $feed_cat));
+
+ }
+
+ if ($action == "remove") {
+
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ remove_feed_category($this->link, $id, $_SESSION["uid"]);
+ }
+ }
+
+ print "
+
+ ".
+ __('Create category')."
";
+
+ $result = db_query($this->link, "SELECT title,id FROM ttrss_feed_categories
+ WHERE owner_uid = ".$_SESSION["uid"]."
+ ORDER BY title");
+
+ if (db_num_rows($result) != 0) {
+
+ print "";
+
+ print "
";
+ print "
";
+
+ } else {
+ print "".__('No feed categories defined.')."
";
+ }
+
+ print "";
+
+ return;
+
+ }
+
+ function index() {
+
+ print "";
+ print "
";
+
+ $result = db_query($this->link, "SELECT COUNT(id) AS num_errors
+ FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]);
+
+ $num_errors = db_fetch_result($result, 0, "num_errors");
+
+ if ($num_errors > 0) {
+
+ $error_button = "
" .
+ __("Feeds with errors") . " ";
+ }
+
+ if (DB_TYPE == "pgsql") {
+ $interval_qpart = "NOW() - INTERVAL '3 months'";
+ } else {
+ $interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)";
+ }
+
+ $result = db_query($this->link, "SELECT COUNT(*) AS num_inactive FROM ttrss_feeds WHERE
+ (SELECT MAX(updated) FROM ttrss_entries, ttrss_user_entries WHERE
+ ttrss_entries.id = ref_id AND
+ ttrss_user_entries.feed_id = ttrss_feeds.id) < $interval_qpart AND
+ ttrss_feeds.owner_uid = ".$_SESSION["uid"]);
+
+ $num_inactive = db_fetch_result($result, 0, "num_inactive");
+
+ if ($num_inactive > 0) {
+ $inactive_button = "
" .
+ __("Inactive feeds") . " ";
+ }
+
+ $feed_search = db_escape_string($_REQUEST["search"]);
+
+ if (array_key_exists("search", $_REQUEST)) {
+ $_SESSION["prefs_feed_search"] = $feed_search;
+ } else {
+ $feed_search = $_SESSION["prefs_feed_search"];
+ }
+
+ print '
';
+
+ print "
"; #toolbar
+
+ print "
+
+ ".
+ __('Search')."
+
";
+
+ print "
".
+ "
" . __('Select')." ";
+ print "
";
+ print "
".__('All')."
";
+ print "
".__('None')."
";
+ print "
";
+
+ print "
".
+ "
" . __('Feeds')." ";
+ print "
";
+ print "
".__('Subscribe to feed')."
";
+ print "
".__('Edit selected feeds')."
";
+ print "
".__('Reset sort order')."
";
+ print "
";
+
+ if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+ print "
".
+ "
" . __('Categories')." ";
+ print "
";
+ print "
".__('Edit categories')."
";
+ print "
".__('Reset sort order')."
";
+ print "
";
+
+ }
+
+ print $error_button;
+ print $inactive_button;
+
+ print "
"
+ .__('Unsubscribe')." ";
+
+ if (defined('_ENABLE_FEED_DEBUGGING')) {
+
+ print "
+ ".__('More actions...')." ";
+
+ if (FORCE_ARTICLE_PURGE == 0) {
+ print
+ "".__('Manual purge')." ";
+ }
+
+ print "
+ ".__('Clear feed data')."
+ ".__('Rescore articles')." ";
+
+ print " ";
+
+ }
+
+ print "
"; # toolbar
+
+ //print '
';
+ print '
';
+
+ print "
+
".
+ __("Loading, please wait...")."
";
+
+ print "
+
+
+
+
+
+
+
";
+
+ print "
+ ".__('Hint: you can drag feeds and categories around.')."
+
";
+
+ print '
';
+ print '
';
+
+ print "
"; # feeds pane
+
+ print "";
+
+ print "
" . __("Using OPML you can export and import your feeds and Tiny Tiny RSS settings.") . " ";
+
+ print "" . __("Note: Only main settings profile can be migrated using OPML.") . " ";
+
+ print "
";
+
+ print "
" . __("Import") . " ";
+
+ print "
";
+
+ print "
";
+
+ print "
" . __("Publish") . " ";
+
+ print "
".__('Your OPML can be published publicly and can be subscribed by anyone who knows the URL below.') . " ";
+
+ print "" . __("Note: Published OPML does not include your Tiny Tiny RSS settings, feeds that require authentication or feeds hidden from Popular feeds.") . " " . "
";
+
+ print "
".
+ __('Display URL')." ";
+
+
+ print "
"; # pane
+
+ if (strpos($_SERVER['HTTP_USER_AGENT'], "Firefox") !== false) {
+
+ print "";
+
+ print "
" . __('This Tiny Tiny RSS site can be used as a Firefox Feed Reader by clicking the link below.') . "
";
+
+ print "
";
+
+ print "" .
+ __('Click here to register this site as a feed reader.') .
+ " ";
+
+ print "
";
+
+ print "
"; # pane
+ }
+
+ print "";
+
+ print "
" . __("Drag the link below to your browser toolbar, open the feed you're interested in in your browser and click on the link to subscribe to it.") . "
";
+
+ $bm_subscribe_url = str_replace('%s', '', add_feed_url());
+
+ $confirm_str = __('Subscribe to %s in Tiny Tiny RSS?');
+
+ $bm_url = htmlspecialchars("javascript:{if(confirm('$confirm_str'.replace('%s',window.location.href)))window.location.href='$bm_subscribe_url'+window.location.href}");
+
+ print "
" . __('Subscribe in Tiny Tiny RSS'). " ";
+
+ print "
"; #pane
+
+ print "";
+
+ print "
" . __("Published articles and generated feeds") . " ";
+
+ print "
".__('Published articles are exported as a public RSS feed and can be subscribed by anyone who knows the URL specified below.')."
";
+
+ $rss_url = '-2::' . htmlspecialchars(get_self_url_prefix() .
+ "/public.php?op=rss&id=-2&view-mode=all_articles");;
+
+ print "
".
+ __('Display URL')." ";
+
+ print "
".
+ __('Clear all generated URLs')." ";
+
+ print "
" . __("Articles shared by URL") . " ";
+
+ print "
" . __("You can disable all articles shared by unique URLs here.") . "
";
+
+ print "
".
+ __('Unshare all articles')." ";
+
+ print "
"; #pane
+
+ if (defined('CONSUMER_KEY') && CONSUMER_KEY != '') {
+
+ print ""; # pane
+
+ }
+
+ print ""; #container
+
+ }
+}
+?>
--
cgit v1.2.3
From 1395083e9471ef5cd39314479790552a569d37d0 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 10:00:42 +0400
Subject: add pref_prefs class
---
classes/pref_prefs.php | 493 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 493 insertions(+)
create mode 100644 classes/pref_prefs.php
(limited to 'classes')
diff --git a/classes/pref_prefs.php b/classes/pref_prefs.php
new file mode 100644
index 000000000..896268275
--- /dev/null
+++ b/classes/pref_prefs.php
@@ -0,0 +1,493 @@
+link, "SELECT id FROM ttrss_users WHERE
+ id = '$active_uid' AND (pwd_hash = '$old_pw_hash1' OR
+ pwd_hash = '$old_pw_hash2')");
+
+ if (db_num_rows($result) == 1) {
+ db_query($this->link, "UPDATE ttrss_users SET pwd_hash = '$new_pw_hash'
+ WHERE id = '$active_uid'");
+
+ $_SESSION["pwd_hash"] = $new_pw_hash;
+
+ print __("Password has been changed.");
+ } else {
+ print "ERROR: ".__('Old password is incorrect.');
+ }
+ }
+
+ return;
+
+ }
+
+ function saveconfig() {
+
+ $_SESSION["prefs_cache"] = false;
+
+ $orig_theme = get_pref($this->link, "_THEME_ID");
+
+ foreach (array_keys($_POST) as $pref_name) {
+
+ $pref_name = db_escape_string($pref_name);
+ $value = db_escape_string($_POST[$pref_name]);
+
+ set_pref($this->link, $pref_name, $value);
+
+ }
+
+ if ($orig_theme != get_pref($this->link, "_THEME_ID")) {
+ print "PREFS_THEME_CHANGED";
+ } else {
+ print __("The configuration was saved.");
+ }
+ }
+
+ function getHelp() {
+
+ $pref_name = db_escape_string($_REQUEST["pn"]);
+
+ $result = db_query($this->link, "SELECT help_text FROM ttrss_prefs
+ WHERE pref_name = '$pref_name'");
+
+ if (db_num_rows($result) > 0) {
+ $help_text = db_fetch_result($result, 0, "help_text");
+ print $help_text;
+ } else {
+ printf(__("Unknown option: %s"), $pref_name);
+ }
+ }
+
+ function changeemail() {
+
+ $email = db_escape_string($_POST["email"]);
+ $full_name = db_escape_string($_POST["full_name"]);
+
+ $active_uid = $_SESSION["uid"];
+
+ db_query($this->link, "UPDATE ttrss_users SET email = '$email',
+ full_name = '$full_name' WHERE id = '$active_uid'");
+
+ print __("Your personal data has been saved.");
+
+ return;
+ }
+
+ function resetconfig() {
+
+ $_SESSION["prefs_op_result"] = "reset-to-defaults";
+
+ if ($_SESSION["profile"]) {
+ $profile_qpart = "profile = '" . $_SESSION["profile"] . "'";
+ } else {
+ $profile_qpart = "profile IS NULL";
+ }
+
+ db_query($this->link, "DELETE FROM ttrss_user_prefs
+ WHERE $profile_qpart AND owner_uid = ".$_SESSION["uid"]);
+
+ initialize_user_prefs($this->link, $_SESSION["uid"], $_SESSION["profile"]);
+
+ print "PREFS_THEME_CHANGED";
+ }
+
+ function index() {
+
+ global $access_level_names;
+
+ $prefs_blacklist = array("HIDE_READ_FEEDS", "FEEDS_SORT_BY_UNREAD",
+ "STRIP_UNSAFE_TAGS");
+
+ $profile_blacklist = array("ALLOW_DUPLICATE_POSTS", "PURGE_OLD_DAYS",
+ "PURGE_UNREAD_ARTICLES", "DIGEST_ENABLE", "DIGEST_CATCHUP",
+ "BLACKLISTED_TAGS", "ENABLE_API_ACCESS", "UPDATE_POST_ON_CHECKSUM_CHANGE",
+ "DEFAULT_UPDATE_INTERVAL", "USER_TIMEZONE", "SORT_HEADLINES_BY_FEED_DATE",
+ "SSL_CERT_SERIAL");
+
+
+ if (!SINGLE_USER_MODE) {
+
+ $_SESSION["prefs_op_result"] = "";
+
+ print "";
+ print "
";
+
+ print "
";
+
+ print "
"; # pane
+ print "
";
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_users
+ WHERE id = ".$_SESSION["uid"]." AND pwd_hash
+ = 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'");
+
+ if (db_num_rows($result) != 0) {
+ print format_warning(__("Your password is at default value, please change it."), "default_pass_warning");
+ }
+
+ print "
";
+
+ print "
"; #pane
+ }
+
+ print "
";
+
+ print "
";
+
+ print "
"; #pane
+ print "
"; #container
+ }
+}
+?>
--
cgit v1.2.3
From 611efae712769e38e232478b484779d73af263db Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 10:58:30 +0400
Subject: add catchall backend class
---
classes/article.php | 32 ++++++++++++++++----------------
classes/backend.php | 10 ++++++++++
2 files changed, 26 insertions(+), 16 deletions(-)
create mode 100644 classes/backend.php
(limited to 'classes')
diff --git a/classes/article.php b/classes/article.php
index 98141d91e..70ecd2653 100644
--- a/classes/article.php
+++ b/classes/article.php
@@ -1,20 +1,20 @@
link, "SELECT link FROM ttrss_entries, ttrss_user_entries
WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."'
LIMIT 1");
-
+
if (db_num_rows($result) == 1) {
$article_url = db_fetch_result($result, 0, 'link');
$article_url = str_replace("\n", "", $article_url);
-
+
header("Location: $article_url");
return;
-
+
} else {
print_error(__("Article not found."));
}
@@ -25,12 +25,12 @@ class Article extends Handler {
$cids = explode(",", db_escape_string($_REQUEST["cids"]));
$mode = db_escape_string($_REQUEST["mode"]);
$omode = db_escape_string($_REQUEST["omode"]);
-
+
// in prefetch mode we only output requested cids, main article
// just gets marked as read (it already exists in client cache)
-
+
$articles = array();
-
+
if ($mode == "") {
array_push($articles, format_article($this->link, $id, false));
} else if ($mode == "zoom") {
@@ -40,14 +40,14 @@ class Article extends Handler {
header("Content-Type: text/html");
print ' ';
}
-
+
$article = format_article($this->link, $id, false);
print $article['content'];
return;
}
-
+
catchupArticleById($this->link, $id, 0);
-
+
if (!$_SESSION["bw_limit"]) {
foreach ($cids as $cid) {
if ($cid) {
@@ -55,9 +55,9 @@ class Article extends Handler {
}
}
}
-
+
print json_encode($articles);
-
+
}
-
-}
\ No newline at end of file
+
+}
diff --git a/classes/backend.php b/classes/backend.php
new file mode 100644
index 000000000..47fc2d826
--- /dev/null
+++ b/classes/backend.php
@@ -0,0 +1,10 @@
+";
+ }
+}
+?>
--
cgit v1.2.3
From 4f09f594c24a2fbdacd6124ecdeb07b92814cb88 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 11:02:43 +0400
Subject: move help to backend class
---
classes/backend.php | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
(limited to 'classes')
diff --git a/classes/backend.php b/classes/backend.php
index 47fc2d826..f7e7b84b8 100644
--- a/classes/backend.php
+++ b/classes/backend.php
@@ -6,5 +6,23 @@ class Backend extends Handler {
print __("Loading, please wait...") . " " .
" ";
}
+
+ function digestSend() {
+ send_headlines_digests($this->link);
+ }
+
+ function help() {
+ $tid = (int) $_REQUEST["tid"];
+
+ if (file_exists("help/$tid.php")) {
+ include("help/$tid.php");
+ } else {
+ print "".__("Help topic not found.")."
";
+ }
+ print "
+ ".
+ __('Close this window')."
";
+
+ }
}
?>
--
cgit v1.2.3
From cbe50c800d4846be184673e623063abee7101a0c Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 13:34:43 +0400
Subject: add pref_labels class
---
classes/pref_labels.php | 320 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 320 insertions(+)
create mode 100644 classes/pref_labels.php
(limited to 'classes')
diff --git a/classes/pref_labels.php b/classes/pref_labels.php
new file mode 100644
index 000000000..5de4443f7
--- /dev/null
+++ b/classes/pref_labels.php
@@ -0,0 +1,320 @@
+link, "SELECT * FROM ttrss_labels2 WHERE
+ id = '$label_id' AND owner_uid = " . $_SESSION["uid"]);
+
+ $line = db_fetch_assoc($result);
+
+ print " ";
+ print " ";
+ print " ";
+
+ print "".__("Caption")."
";
+
+ print "";
+
+ $fg_color = $line['fg_color'];
+ $bg_color = $line['bg_color'];
+
+ print "α ";
+
+ print " ";
+
+ print "
";
+ print "" . __("Colors") . "
";
+ print "";
+
+ print "
";
+ print "
";
+
+# print "";
+
+ print "";
+ print "".
+ __('Save')." ";
+ print "".
+ __('Cancel')." ";
+ print "
";
+
+ return;
+ }
+
+ function getlabeltree() {
+ $root = array();
+ $root['id'] = 'root';
+ $root['name'] = __('Labels');
+ $root['items'] = array();
+
+ $result = db_query($this->link, "SELECT *
+ FROM ttrss_labels2
+ WHERE owner_uid = ".$_SESSION["uid"]."
+ ORDER BY caption");
+
+ while ($line = db_fetch_assoc($result)) {
+ $label = array();
+ $label['id'] = 'LABEL:' . $line['id'];
+ $label['bare_id'] = $line['id'];
+ $label['name'] = $line['caption'];
+ $label['fg_color'] = $line['fg_color'];
+ $label['bg_color'] = $line['bg_color'];
+ $label['type'] = 'label';
+ $label['checkbox'] = false;
+
+ array_push($root['items'], $label);
+ }
+
+ $fl = array();
+ $fl['identifier'] = 'id';
+ $fl['label'] = 'name';
+ $fl['items'] = array($root);
+
+ print json_encode($fl);
+ return;
+ }
+
+ function colorset() {
+ $kind = db_escape_string($_REQUEST["kind"]);
+ $ids = split(',', db_escape_string($_REQUEST["ids"]));
+ $color = db_escape_string($_REQUEST["color"]);
+ $fg = db_escape_string($_REQUEST["fg"]);
+ $bg = db_escape_string($_REQUEST["bg"]);
+
+ foreach ($ids as $id) {
+
+ if ($kind == "fg" || $kind == "bg") {
+ db_query($this->link, "UPDATE ttrss_labels2 SET
+ ${kind}_color = '$color' WHERE id = '$id'
+ AND owner_uid = " . $_SESSION["uid"]);
+ } else {
+ db_query($this->link, "UPDATE ttrss_labels2 SET
+ fg_color = '$fg', bg_color = '$bg' WHERE id = '$id'
+ AND owner_uid = " . $_SESSION["uid"]);
+ }
+
+ $caption = db_escape_string(label_find_caption($this->link, $id, $_SESSION["uid"]));
+
+ /* Remove cached data */
+
+ db_query($this->link, "UPDATE ttrss_user_entries SET label_cache = ''
+ WHERE label_cache LIKE '%$caption%' AND owner_uid = " . $_SESSION["uid"]);
+
+ }
+
+ return;
+ }
+
+ function colorreset() {
+ $ids = split(',', db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ db_query($this->link, "UPDATE ttrss_labels2 SET
+ fg_color = '', bg_color = '' WHERE id = '$id'
+ AND owner_uid = " . $_SESSION["uid"]);
+
+ $caption = db_escape_string(label_find_caption($this->link, $id, $_SESSION["uid"]));
+
+ /* Remove cached data */
+
+ db_query($this->link, "UPDATE ttrss_user_entries SET label_cache = ''
+ WHERE label_cache LIKE '%$caption%' AND owner_uid = " . $_SESSION["uid"]);
+ }
+
+ }
+
+ function save() {
+
+ $id = db_escape_string($_REQUEST["id"]);
+ $caption = db_escape_string(trim($_REQUEST["caption"]));
+
+ db_query($this->link, "BEGIN");
+
+ $result = db_query($this->link, "SELECT caption FROM ttrss_labels2
+ WHERE id = '$id' AND owner_uid = ". $_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ $old_caption = db_fetch_result($result, 0, "caption");
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_labels2
+ WHERE caption = '$caption' AND owner_uid = ". $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+ if ($caption) {
+ $result = db_query($this->link, "UPDATE ttrss_labels2 SET
+ caption = '$caption' WHERE id = '$id' AND
+ owner_uid = " . $_SESSION["uid"]);
+
+ /* Update filters that reference label being renamed */
+
+ $old_caption = db_escape_string($old_caption);
+
+ db_query($this->link, "UPDATE ttrss_filters SET
+ action_param = '$caption' WHERE action_param = '$old_caption'
+ AND action_id = 7
+ AND owner_uid = " . $_SESSION["uid"]);
+
+ print $_REQUEST["value"];
+ } else {
+ print $old_caption;
+ }
+ } else {
+ print $old_caption;
+ }
+ }
+
+ db_query($this->link, "COMMIT");
+
+ return;
+ }
+
+ function remove() {
+
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ label_remove($this->link, $id, $_SESSION["uid"]);
+ }
+
+ }
+
+ function add() {
+ $caption = db_escape_string($_REQUEST["caption"]);
+ $output = db_escape_string($_REQUEST["output"]);
+
+ if ($caption) {
+
+ if (label_create($this->link, $caption)) {
+ if (!$output) {
+ print T_sprintf("Created label %s ", htmlspecialchars($caption));
+ }
+ }
+
+ if ($output == "select") {
+ header("Content-Type: text/xml");
+
+ print "";
+
+ print_label_select($this->link, "select_label",
+ $caption, "");
+
+ print " ";
+ }
+ }
+
+ return;
+ }
+
+ function index() {
+
+ $sort = db_escape_string($_REQUEST["sort"]);
+
+ if (!$sort || $sort == "undefined") {
+ $sort = "caption";
+ }
+
+ $label_search = db_escape_string($_REQUEST["search"]);
+
+ if (array_key_exists("search", $_REQUEST)) {
+ $_SESSION["prefs_label_search"] = $label_search;
+ } else {
+ $label_search = $_SESSION["prefs_label_search"];
+ }
+
+ print "";
+ print ""; #pane
+ print "
";
+
+ print "
+
".
+ __("Loading, please wait...")."
";
+
+ print "
+
+
+
+
+
+
+
";
+
+ print "
"; #pane
+ print "
"; #container
+
+ }
+}
+
+?>
--
cgit v1.2.3
From 66665fba79c97dc3b96103e60945aedd0b9be676 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 14:00:36 +0400
Subject: add Pref_Users class
---
classes/pref_users.php | 483 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 483 insertions(+)
create mode 100644 classes/pref_users.php
(limited to 'classes')
diff --git a/classes/pref_users.php b/classes/pref_users.php
new file mode 100644
index 000000000..5f762b50e
--- /dev/null
+++ b/classes/pref_users.php
@@ -0,0 +1,483 @@
+";
+
+ $uid = sprintf("%d", $_REQUEST["id"]);
+
+ print "".__('User details')." ";
+
+ print "link, "SELECT login,
+ ".SUBSTRING_FOR_DATE."(last_login,1,16) AS last_login,
+ access_level,
+ (SELECT COUNT(int_id) FROM ttrss_user_entries
+ WHERE owner_uid = id) AS stored_articles,
+ ".SUBSTRING_FOR_DATE."(created,1,16) AS created
+ FROM ttrss_users
+ WHERE id = '$uid'");
+
+ if (db_num_rows($result) == 0) {
+ print "".__('User not found')." ";
+ return;
+ }
+
+ // print "User Details ";
+
+ $login = db_fetch_result($result, 0, "login");
+
+ print "";
+
+ $last_login = make_local_datetime($this->link,
+ db_fetch_result($result, 0, "last_login"), true);
+
+ $created = make_local_datetime($this->link,
+ db_fetch_result($result, 0, "created"), true);
+
+ $access_level = db_fetch_result($result, 0, "access_level");
+ $stored_articles = db_fetch_result($result, 0, "stored_articles");
+
+ print "".__('Registered')." $created ";
+ print "".__('Last logged in')." $last_login ";
+
+ $result = db_query($this->link, "SELECT COUNT(id) as num_feeds FROM ttrss_feeds
+ WHERE owner_uid = '$uid'");
+
+ $num_feeds = db_fetch_result($result, 0, "num_feeds");
+
+ print "".__('Subscribed feeds count')." $num_feeds ";
+
+ print "
";
+
+ print "".__('Subscribed feeds')." ";
+
+ $result = db_query($this->link, "SELECT id,title,site_url FROM ttrss_feeds
+ WHERE owner_uid = '$uid' ORDER BY title");
+
+ print "";
+
+ $row_class = "odd";
+
+ while ($line = db_fetch_assoc($result)) {
+
+ $icon_file = ICONS_URL."/".$line["id"].".ico";
+
+ if (file_exists($icon_file) && filesize($icon_file) > 0) {
+ $feed_icon = " ";
+ } else {
+ $feed_icon = " ";
+ }
+
+ print "$feed_icon ".$line["title"]." ";
+
+ $row_class = $row_class == "even" ? "odd" : "even";
+
+ }
+
+ if (db_num_rows($result) < $num_feeds) {
+ // FIXME - add link to show ALL subscribed feeds here somewhere
+ print " ... ";
+ }
+
+ print " ";
+
+ print "
+ ".__("Close this window").
+ "
";
+
+ print "]]> ";
+
+ return;
+ }
+
+ function edit() {
+ global $access_level_names;
+
+ header("Content-Type: text/xml");
+
+ $id = db_escape_string($_REQUEST["id"]);
+
+ print "";
+ print "".__('User Editor')." ";
+ print "";
+
+ print " ";
+ print " ";
+ print " ";
+
+ $result = db_query($this->link, "SELECT * FROM ttrss_users WHERE id = '$id'");
+
+ $login = db_fetch_result($result, 0, "login");
+ $access_level = db_fetch_result($result, 0, "access_level");
+ $email = db_fetch_result($result, 0, "email");
+
+ $sel_disabled = ($id == $_SESSION["uid"]) ? "disabled" : "";
+
+ print "".__("User")."
";
+ print "";
+
+ if ($sel_disabled) {
+ print " ";
+ print " ";
+ } else {
+ print " ";
+ }
+
+ print "
";
+
+ print "".__("Authentication")."
";
+ print "";
+
+ print __('Access level: ') . " ";
+
+ if (!$sel_disabled) {
+ print_select_hash("access_level", $access_level, $access_level_names,
+ $sel_disabled);
+ } else {
+ print_select_hash("", $access_level, $access_level_names,
+ $sel_disabled);
+ print " ";
+ }
+
+ print " ";
+
+ print __('Change password to') .
+ " ";
+
+ print "
";
+
+ print "".__("Options")."
";
+ print "";
+
+ print __('E-mail: ').
+ " ";
+
+ print "
";
+
+ print "";
+
+ print "";
+
+ print "
+ ".
+ __('Save')."
+ ".
+ __('Cancel')."
";
+
+ print "]]> ";
+
+ return;
+ }
+
+ function editSave() {
+ $login = db_escape_string(trim($_REQUEST["login"]));
+ $uid = db_escape_string($_REQUEST["id"]);
+ $access_level = (int) $_REQUEST["access_level"];
+ $email = db_escape_string(trim($_REQUEST["email"]));
+ $password = db_escape_string(trim($_REQUEST["password"]));
+
+ if ($password) {
+ $pwd_hash = encrypt_password($password, $login);
+ $pass_query_part = "pwd_hash = '$pwd_hash', ";
+ } else {
+ $pass_query_part = "";
+ }
+
+ db_query($this->link, "UPDATE ttrss_users SET $pass_query_part login = '$login',
+ access_level = '$access_level', email = '$email' WHERE id = '$uid'");
+
+ }
+
+ function remove() {
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+
+ foreach ($ids as $id) {
+ if ($id != $_SESSION["uid"] && $id != 1) {
+ db_query($this->link, "DELETE FROM ttrss_tags WHERE owner_uid = '$id'");
+ db_query($this->link, "DELETE FROM ttrss_feeds WHERE owner_uid = '$id'");
+ db_query($this->link, "DELETE FROM ttrss_users WHERE id = '$id'");
+ }
+ }
+ }
+
+ function add() {
+
+ $login = db_escape_string(trim($_REQUEST["login"]));
+ $tmp_user_pwd = make_password(8);
+ $pwd_hash = encrypt_password($tmp_user_pwd, $login);
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_users WHERE
+ login = '$login'");
+
+ if (db_num_rows($result) == 0) {
+
+ db_query($this->link, "INSERT INTO ttrss_users
+ (login,pwd_hash,access_level,last_login,created)
+ VALUES ('$login', '$pwd_hash', 0, null, NOW())");
+
+
+ $result = db_query($this->link, "SELECT id FROM ttrss_users WHERE
+ login = '$login' AND pwd_hash = '$pwd_hash'");
+
+ if (db_num_rows($result) == 1) {
+
+ $new_uid = db_fetch_result($result, 0, "id");
+
+ print format_notice(T_sprintf("Added user %s with password %s ",
+ $login, $tmp_user_pwd));
+
+ initialize_user($this->link, $new_uid);
+
+ } else {
+
+ print format_warning(T_sprintf("Could not create user %s ", $login));
+
+ }
+ } else {
+ print format_warning(T_sprintf("User %s already exists.", $login));
+ }
+ }
+
+ function resetPass() {
+
+ $uid = db_escape_string($_REQUEST["id"]);
+
+ $result = db_query($this->link, "SELECT login,email
+ FROM ttrss_users WHERE id = '$uid'");
+
+ $login = db_fetch_result($result, 0, "login");
+ $email = db_fetch_result($result, 0, "email");
+ $tmp_user_pwd = make_password(8);
+ $pwd_hash = encrypt_password($tmp_user_pwd, $login);
+
+ db_query($this->link, "UPDATE ttrss_users SET pwd_hash = '$pwd_hash'
+ WHERE id = '$uid'");
+
+ print T_sprintf("Changed password of user %s
+ to %s ", $login, $tmp_user_pwd);
+
+ require_once 'lib/phpmailer/class.phpmailer.php';
+
+ if ($email) {
+ print " ";
+ print T_sprintf("Notifying %s .", $email);
+
+ require_once "lib/MiniTemplator.class.php";
+
+ $tpl = new MiniTemplator;
+
+ $tpl->readTemplateFromFile("templates/resetpass_template.txt");
+
+ $tpl->setVariable('LOGIN', $login);
+ $tpl->setVariable('NEWPASS', $tmp_user_pwd);
+
+ $tpl->addBlock('message');
+
+ $message = "";
+
+ $tpl->generateOutputToString($message);
+
+ $mail = new PHPMailer();
+
+ $mail->PluginDir = "lib/phpmailer/";
+ $mail->SetLanguage("en", "lib/phpmailer/language/");
+
+ $mail->CharSet = "UTF-8";
+
+ $mail->From = DIGEST_FROM_ADDRESS;
+ $mail->FromName = DIGEST_FROM_NAME;
+ $mail->AddAddress($email, $login);
+
+ if (DIGEST_SMTP_HOST) {
+ $mail->Host = DIGEST_SMTP_HOST;
+ $mail->Mailer = "smtp";
+ $mail->SMTPAuth = DIGEST_SMTP_LOGIN != '';
+ $mail->Username = DIGEST_SMTP_LOGIN;
+ $mail->Password = DIGEST_SMTP_PASSWORD;
+ }
+
+ $mail->IsHTML(false);
+ $mail->Subject = __("[tt-rss] Password change notification");
+ $mail->Body = $message;
+
+ $rc = $mail->Send();
+
+ if (!$rc) print_error($mail->ErrorInfo);
+ }
+
+ print "";
+ }
+
+ function index() {
+
+ global $access_level_names;
+
+ print "";
+ print ""; #pane
+ print "
";
+
+ print "
";
+
+ if ($user_search) {
+
+ $user_search = split(" ", $user_search);
+ $tokens = array();
+
+ foreach ($user_search as $token) {
+ $token = trim($token);
+ array_push($tokens, "(UPPER(login) LIKE UPPER('%$token%'))");
+ }
+
+ $user_search_query = "(" . join($tokens, " AND ") . ") AND ";
+
+ } else {
+ $user_search_query = "";
+ }
+
+ $result = db_query($this->link, "SELECT
+ id,login,access_level,email,
+ ".SUBSTRING_FOR_DATE."(last_login,1,16) as last_login,
+ ".SUBSTRING_FOR_DATE."(created,1,16) as created
+ FROM
+ ttrss_users
+ WHERE
+ $user_search_query
+ id > 0
+ ORDER BY $sort");
+
+ if (db_num_rows($result) > 0) {
+
+ print "
";
+
+ } else {
+ print "
";
+ if (!$user_search) {
+ print_warning(__('No users defined.'));
+ } else {
+ print_warning(__('No matching users found.'));
+ }
+ print "
";
+
+ }
+
+ print "
"; #pane
+ print "
"; #container
+
+ }
+
+ }
+?>
--
cgit v1.2.3
From 8e17d6636ec4035ee7fa0fdec335112a7eb08a16 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Tue, 13 Dec 2011 14:09:34 +0400
Subject: add Pref_Filters
---
classes/pref_filters.php | 570 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 570 insertions(+)
create mode 100644 classes/pref_filters.php
(limited to 'classes')
diff --git a/classes/pref_filters.php b/classes/pref_filters.php
new file mode 100644
index 000000000..754e8d211
--- /dev/null
+++ b/classes/pref_filters.php
@@ -0,0 +1,570 @@
+link, "SELECT name FROM ttrss_filter_types WHERE
+ id = " . $filter_type);
+ $type_name = db_fetch_result($result, 0, "name");
+
+ $result = db_query($this->link, "SELECT name FROM ttrss_filter_actions WHERE
+ id = " . $action_id);
+ $action_name = db_fetch_result($result, 0, "name");
+
+ $filter["reg_exp"] = $reg_exp;
+ $filter["action"] = $action_name;
+ $filter["type"] = $type_name;
+ $filter["action_param"] = $action_param;
+ $filter["filter_param"] = $filter_param;
+ $filter["inverse"] = $inverse;
+
+ $filters[$type_name] = array($filter);
+
+ if ($feed_id)
+ $feed = $feed_id;
+ else
+ $feed = -4;
+
+ $feed_title = getFeedTitle($this->link, $feed);
+
+ $qfh_ret = queryFeedHeadlines($this->link, $feed,
+ 30, "", false, false, false,
+ false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
+
+ $result = $qfh_ret[0];
+
+ $articles = array();
+ $found = 0;
+
+ print __("Articles matching this filter:");
+
+ print "";
+
+ }
+
+ function getfiltertree() {
+ $root = array();
+ $root['id'] = 'root';
+ $root['name'] = __('Filters');
+ $root['items'] = array();
+
+ $result = db_query($this->link, "SELECT
+ ttrss_filters.id AS id,reg_exp,
+ ttrss_filter_types.name AS filter_type_name,
+ ttrss_filter_types.description AS filter_type_descr,
+ enabled,
+ inverse,
+ feed_id,
+ action_id,
+ filter_param,
+ filter_type,
+ ttrss_filter_actions.description AS action_description,
+ ttrss_feeds.title AS feed_title,
+ ttrss_filter_actions.name AS action_name,
+ ttrss_filters.action_param AS action_param
+ FROM
+ ttrss_filter_types,ttrss_filter_actions,ttrss_filters LEFT JOIN
+ ttrss_feeds ON (ttrss_filters.feed_id = ttrss_feeds.id)
+ WHERE
+ filter_type = ttrss_filter_types.id AND
+ ttrss_filter_actions.id = action_id AND
+ ttrss_filters.owner_uid = ".$_SESSION["uid"]."
+ ORDER by action_description, reg_exp");
+
+ $cat = false;
+ $cur_action_description = "";
+
+ if (db_num_rows($result) > 0) {
+
+ while ($line = db_fetch_assoc($result)) {
+ if ($cur_action_description != $line['action_description']) {
+
+ if ($cat)
+ array_push($root['items'], $cat);
+
+ $cat = array();
+ $cat['id'] = 'ACTION:' . $line['action_id'];
+ $cat['name'] = $line['action_description'];
+ $cat['items'] = array();
+
+ $cur_action_description = $line['action_description'];
+ }
+
+ if (array_search($line["action_name"],
+ array("score", "tag", "label")) === false) {
+
+ $line["action_param"] = '';
+ } else {
+ if ($line['action_name'] == 'label') {
+
+ $tmp_result = db_query($this->link, "SELECT fg_color, bg_color
+ FROM ttrss_labels2 WHERE caption = '".
+ db_escape_string($line["action_param"])."' AND
+ owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($tmp_result) != 0) {
+ $fg_color = db_fetch_result($tmp_result, 0, "fg_color");
+ $bg_color = db_fetch_result($tmp_result, 0, "bg_color");
+
+ $tmp = "α " . $line['action_param'];
+
+ $line['action_param'] = $tmp;
+ }
+ }
+ }
+
+ $filter = array();
+ $filter['id'] = 'FILTER:' . $line['id'];
+ $filter['bare_id'] = $line['id'];
+ $filter['name'] = $line['reg_exp'];
+ $filter['type'] = $line['filter_type'];
+ $filter['enabled'] = sql_bool_to_bool($line['enabled']);
+ $filter['param'] = $line['action_param'];
+ $filter['inverse'] = sql_bool_to_bool($line['inverse']);
+ $filter['checkbox'] = false;
+
+ if ($line['feed_id'])
+ $filter['feed'] = $line['feed_title'];
+
+ array_push($cat['items'], $filter);
+ }
+
+ array_push($root['items'], $cat);
+ }
+
+ $fl = array();
+ $fl['identifier'] = 'id';
+ $fl['label'] = 'name';
+ $fl['items'] = array($root);
+
+ print json_encode($fl);
+ return;
+ }
+
+ function edit() {
+
+ $filter_id = db_escape_string($_REQUEST["id"]);
+
+ $result = db_query($this->link,
+ "SELECT * FROM ttrss_filters WHERE id = '$filter_id' AND owner_uid = " . $_SESSION["uid"]);
+
+ $reg_exp = htmlspecialchars(db_fetch_result($result, 0, "reg_exp"));
+ $filter_type = db_fetch_result($result, 0, "filter_type");
+ $feed_id = db_fetch_result($result, 0, "feed_id");
+ $action_id = db_fetch_result($result, 0, "action_id");
+ $action_param = db_fetch_result($result, 0, "action_param");
+ $filter_param = db_fetch_result($result, 0, "filter_param");
+
+ $enabled = sql_bool_to_bool(db_fetch_result($result, 0, "enabled"));
+ $inverse = sql_bool_to_bool(db_fetch_result($result, 0, "inverse"));
+
+ print "