]>
git.wh0rd.org - tt-rss.git/blob - modules/backend-rpc.php
1e0732ef82a612ecb48fae91459a6cf40e9328c9
2 function handle_rpc_request($link) {
4 $subop = $_REQUEST["subop"];
6 if ($subop == "remarchive") {
7 $ids = split(",", db_escape_string($_REQUEST["ids"]));
11 foreach ($ids as $id) {
12 $result = db_query($link, "DELETE FROM ttrss_archived_feeds WHERE
13 (SELECT COUNT(*) FROM ttrss_user_entries
14 WHERE orig_feed_id = '$id') = 0 AND
15 id = '$id' AND owner_uid = ".$_SESSION["uid"]);
17 $rc = db_affected_rows($link, $result);
19 print "<feed id='$id' rc='$rc'/>";
28 if ($subop == "addfeed") {
30 $feed = db_escape_string($_REQUEST['feed']);
31 $cat = db_escape_string($_REQUEST['cat']);
32 $login = db_escape_string($_REQUEST['login']);
33 $pass = db_escape_string($_REQUEST['pass']);
35 $rc = subscribe_to_feed($link, $feed, $cat, $login, $pass);
38 print "<result code='$rc'/>";
45 if ($subop == "setpref") {
52 $key = db_escape_string($_REQUEST["key"]);
53 $value = db_escape_string($_REQUEST["value"]);
55 set_pref($link, $key, $value);
57 print "<param-set key=\"$key\" value=\"$value\"/>";
64 if ($subop == "getAllCounters") {
68 $omode = $_REQUEST["omode"];
70 getAllCounters($link, $omode);
72 print_runtime_info($link);
78 if ($subop == "mark") {
79 $mark = $_REQUEST["mark"];
80 $id = db_escape_string($_REQUEST["id"]);
88 // FIXME this needs collision testing
90 $result = db_query($link, "UPDATE ttrss_user_entries SET marked = $mark
91 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
93 print "<rpc-reply><counters>";
94 getGlobalCounters($link);
95 getVirtCounters($link);
96 getLabelCounters($link);
97 if (get_pref($link, 'ENABLE_FEED_CATS')) {
98 getCategoryCounters($link);
100 print "</counters></rpc-reply>";
105 if ($subop == "delete") {
106 $ids = db_escape_string($_REQUEST["ids"]);
108 $result = db_query($link, "DELETE FROM ttrss_user_entries
109 WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
111 print "<rpc-reply><counters>";
112 getGlobalCounters($link);
113 getVirtCounters($link);
114 if (get_pref($link, 'ENABLE_FEED_CATS')) {
115 getCategoryCounters($link);
117 print "</counters></rpc-reply>";
122 if ($subop == "unarchive") {
123 $ids = db_escape_string($_REQUEST["ids"]);
125 $result = db_query($link, "UPDATE ttrss_user_entries
126 SET feed_id = orig_feed_id, orig_feed_id = NULL
127 WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
129 print "<rpc-reply><counters>";
130 getGlobalCounters($link);
131 getVirtCounters($link);
132 if (get_pref($link, 'ENABLE_FEED_CATS')) {
133 getCategoryCounters($link);
135 print "</counters></rpc-reply>";
140 if ($subop == "archive") {
141 $ids = split(",", db_escape_string($_REQUEST["ids"]));
143 foreach ($ids as $id) {
144 archive_article($link, $id, $_SESSION["uid"]);
147 print "<rpc-reply><counters>";
148 getGlobalCounters($link);
149 getVirtCounters($link);
150 if (get_pref($link, 'ENABLE_FEED_CATS')) {
151 getCategoryCounters($link);
153 print "</counters></rpc-reply>";
159 if ($subop == "publ") {
160 $pub = $_REQUEST["pub"];
161 $id = db_escape_string($_REQUEST["id"]);
162 $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
170 if ($note != 'undefined') {
171 $note_qpart = "note = '$note',";
174 // FIXME this needs collision testing
176 $result = db_query($link, "UPDATE ttrss_user_entries SET
179 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
185 getGlobalCounters($link);
186 getVirtCounters($link);
187 getLabelCounters($link);
188 if (get_pref($link, 'ENABLE_FEED_CATS')) {
189 getCategoryCounters($link);
193 if ($note != 'undefined') {
194 $note_size = strlen($note);
195 print "<note id=\"$id\" size=\"$note_size\">";
196 print "<![CDATA[" . format_article_note($id, $note) . "]]>";
200 print "</rpc-reply>";
205 if ($subop == "updateFeed") {
206 $feed_id = db_escape_string($_REQUEST["feed"]);
208 $result = db_query($link,
209 "SELECT feed_url FROM ttrss_feeds WHERE id = '$feed_id'
210 AND owner_uid = " . $_SESSION["uid"]);
212 if (db_num_rows($result) > 0) {
213 $feed_url = db_fetch_result($result, 0, "feed_url");
214 update_rss_feed($link, $feed_url, $feed_id);
219 getFeedCounter($link, $feed_id);
221 print "</rpc-reply>";
226 if ($subop == "forceUpdateAllFeeds" ||
$subop == "updateAllFeeds") {
228 $global_unread_caller = sprintf("%d", $_REQUEST["uctr"]);
229 $global_unread = getGlobalUnread($link);
235 if ($global_unread_caller != $global_unread) {
237 $omode = $_REQUEST["omode"];
239 if (!$omode) $omode = "tflc";
241 getVirtCounters($link);
243 if (strchr($omode, "l")) getLabelCounters($link);
245 if (strchr($omode, "c")) {
246 if (get_pref($link, 'ENABLE_FEED_CATS')) {
247 getCategoryCounters($link);
251 if (strchr($omode, "f")) getFeedCounters($link);
252 if (strchr($omode, "t")) getTagCounters($link);
254 getGlobalCounters($link, $global_unread);
259 print_runtime_info($link);
261 print "</rpc-reply>";
266 /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */
267 if ($subop == "catchupSelected") {
269 $ids = split(",", db_escape_string($_REQUEST["ids"]));
270 $cmode = sprintf("%d", $_REQUEST["cmode"]);
272 catchupArticlesById($link, $ids, $cmode);
276 getAllCounters($link, $_REQUEST["omode"]);
278 print_runtime_info($link);
279 print "</rpc-reply>";
284 if ($subop == "markSelected") {
286 $ids = split(",", db_escape_string($_REQUEST["ids"]));
287 $cmode = sprintf("%d", $_REQUEST["cmode"]);
289 markArticlesById($link, $ids, $cmode);
293 getAllCounters($link, $_REQUEST["omode"]);
295 print_runtime_info($link);
296 print "</rpc-reply>";
301 if ($subop == "publishSelected") {
303 $ids = split(",", db_escape_string($_REQUEST["ids"]));
304 $cmode = sprintf("%d", $_REQUEST["cmode"]);
306 publishArticlesById($link, $ids, $cmode);
310 getAllCounters($link, $_REQUEST["omode"]);
312 print_runtime_info($link);
313 print "</rpc-reply>";
318 if ($subop == "sanityCheck") {
320 if (sanity_check($link)) {
321 print "<error error-code=\"0\"/>";
322 print_init_params($link);
323 print_runtime_info($link);
325 # assign client-passed params to session
326 $_SESSION["client.userAgent"] = $_REQUEST["ua"];
329 print "</rpc-reply>";
334 if ($subop == "globalPurge") {
337 global_purge_old_posts($link, true);
338 print "</rpc-reply>";
343 if ($subop == "getArticleLink") {
345 $id = db_escape_string($_REQUEST["id"]);
347 $result = db_query($link, "SELECT link FROM ttrss_entries, ttrss_user_entries
348 WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."'");
350 if (db_num_rows($result) == 1) {
351 $link = htmlspecialchars(strip_tags(db_fetch_result($result, 0, "link")));
352 print "<rpc-reply><link>$link</link><id>$id</id></rpc-reply>";
354 print "<rpc-reply><error>Article not found</error></rpc-reply>";
360 if ($subop == "setArticleTags") {
362 $id = db_escape_string($_REQUEST["id"]);
364 $tags_str = db_escape_string($_REQUEST["tags_str"]);
366 $tags = array_unique(trim_array(split(",", $tags_str)));
368 db_query($link, "BEGIN");
370 $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE
371 ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1");
373 if (db_num_rows($result) == 1) {
375 $int_id = db_fetch_result($result, 0, "int_id");
377 db_query($link, "DELETE FROM ttrss_tags WHERE
378 post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'");
380 foreach ($tags as $tag) {
381 $tag = sanitize_tag($tag);
383 if (!tag_is_valid($tag)) {
387 if (preg_match("/^[0-9]*$/", $tag)) {
391 // print "<!-- $id : $int_id : $tag -->";
394 db_query($link, "INSERT INTO ttrss_tags
395 (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')");
400 db_query($link, "COMMIT");
402 $tags_str = format_tags_string(get_article_tags($link, $id), $id);
405 <tags-str id=\"$id\"><![CDATA[$tags_str]]></tags-str>
411 if ($subop == "regenPubKey") {
415 set_pref($link, "_PREFS_PUBLISH_KEY", generate_publish_key());
417 $new_link = article_publish_url($link);
419 print "<link><![CDATA[$new_link]]></link>";
421 print "</rpc-reply>";
426 if ($subop == "logout") {
432 if ($subop == "completeTags") {
434 $search = db_escape_string($_REQUEST["search"]);
436 $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags
437 WHERE owner_uid = '".$_SESSION["uid"]."' AND
438 tag_name LIKE '$search%' ORDER BY tag_name
442 while ($line = db_fetch_assoc($result)) {
443 print "<li>" . $line["tag_name"] . "</li>";
450 if ($subop == "purge") {
451 $ids = split(",", db_escape_string($_REQUEST["ids"]));
452 $days = sprintf("%d", $_REQUEST["days"]);
456 print "<message><![CDATA[";
458 foreach ($ids as $id) {
460 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
461 id = '$id' AND owner_uid = ".$_SESSION["uid"]);
463 if (db_num_rows($result) == 1) {
464 purge_feed($link, $id, $days, true);
468 print "]]></message>";
470 print "</rpc-reply>";
475 /* if ($subop == "setScore") {
476 $id = db_escape_string($_REQUEST["id"]);
477 $score = sprintf("%d", $_REQUEST["score"]);
479 $result = db_query($link, "UPDATE ttrss_user_entries SET score = '$score'
480 WHERE ref_id = '$id' AND owner_uid = ".$_SESSION["uid"]);
482 print "<rpc-reply><message>Acknowledged.</message></rpc-reply>";
488 if ($subop == "getArticles") {
489 $ids = split(",", db_escape_string($_REQUEST["ids"]));
493 foreach ($ids as $id) {
495 outputArticleXML($link, $id, 0, false);
498 print "</rpc-reply>";
503 if ($subop == "checkDate") {
505 $date = db_escape_string($_REQUEST["date"]);
506 $date_parsed = strtotime($date);
511 print "<result>1</result>";
513 print "<result>0</result>";
516 print "</rpc-reply>";
521 if ($subop == "removeFromLabel") {
523 $ids = split(",", db_escape_string($_REQUEST["ids"]));
524 $label_id = db_escape_string($_REQUEST["lid"]);
526 $label = db_escape_string(label_find_caption($link, $label_id,
530 print "<info-for-headlines>";
534 foreach ($ids as $id) {
535 label_remove_article($link, $id, $label, $_SESSION["uid"]);
537 print "<entry id=\"$id\"><![CDATA[";
539 $labels = get_article_labels($link, $id, $_SESSION["uid"]);
540 print format_article_labels($labels, $id);
547 print "</info-for-headlines>";
550 getAllCounters($link, $omode);
552 print "</rpc-reply>";
557 if ($subop == "assignToLabel") {
559 $ids = split(",", db_escape_string($_REQUEST["ids"]));
560 $label_id = db_escape_string($_REQUEST["lid"]);
562 $label = db_escape_string(label_find_caption($link, $label_id,
567 print "<info-for-headlines>";
571 foreach ($ids as $id) {
572 label_add_article($link, $id, $label, $_SESSION["uid"]);
574 print "<entry id=\"$id\"><![CDATA[";
576 $labels = get_article_labels($link, $id, $_SESSION["uid"]);
577 print format_article_labels($labels, $id);
584 print "</info-for-headlines>";
587 getAllCounters($link, $omode);
589 print "</rpc-reply>";
594 if ($subop == "updateFeedBrowser") {
596 $search = db_escape_string($_REQUEST["search"]);
597 $limit = db_escape_string($_REQUEST["limit"]);
598 $mode = db_escape_string($_REQUEST["mode"]);
603 $ctr = print_feed_browser($link, $search, $limit, $mode);
606 print "<num-results value=\"$ctr\"/>";
607 print "<mode value=\"$mode\"/>";
608 print "</rpc-reply>";
614 if ($subop == "massSubscribe") {
616 $ids = split(",", db_escape_string($_REQUEST["ids"]));
617 $mode = $_REQUEST["mode"];
619 $subscribed = array();
621 foreach ($ids as $id) {
624 $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
626 } else if ($mode == 2) {
627 $result = db_query($link, "SELECT * FROM ttrss_archived_feeds
628 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
629 $orig_id = db_escape_string(db_fetch_result($result, 0, "id"));
630 $site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
633 $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
634 $title = db_escape_string(db_fetch_result($result, 0, "title"));
636 $title_orig = db_fetch_result($result, 0, "title");
638 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
639 feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
641 if (db_num_rows($result) == 0) {
643 $result = db_query($link,
644 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
645 VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
646 } else if ($mode == 2) {
647 $result = db_query($link,
648 "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url)
649 VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')");
651 array_push($subscribed, $title_orig);
655 $num_feeds = count($subscribed);
658 print "<num-feeds value='$num_feeds'/>";
659 print "</rpc-reply>";
664 if ($subop == "download") {
665 $stage = (int) $_REQUEST["stage"];
666 $cidt = (int)db_escape_string($_REQUEST["cidt"]);
667 $cidb = (int)db_escape_string($_REQUEST["cidb"]);
668 $sync = db_escape_string($_REQUEST["sync"]);
669 //$amount = (int) $_REQUEST["amount"];
670 //$unread_only = db_escape_string($_REQUEST["unread_only"]);
671 //if (!$amount) $amount = 50;
673 /* Amount is not used by the frontend offline.js anymore, it goes by
674 * date_qpart below + cidb/cidt IDs */
681 $sync = split(";", $sync);
685 if (count($sync) > 0) {
686 if (strtotime($sync[0])) {
687 $last_online = db_escape_string($sync[0]);
689 print "<sync-point><![CDATA[$last_online]]></sync-point>";
691 for ($i = 1; $i < count($sync); $i++
) {
692 $e = split(",", $sync[$i]);
694 if (count($e) == 3) {
697 $unread = bool_to_sql_bool((bool) $e[1]);
698 $marked = (bool)$e[2];
701 $marked = bool_to_sql_bool($marked);
702 $marked_qpart = "marked = $marked,";
705 $query = "UPDATE ttrss_user_entries SET
708 last_read = '$last_online'
709 WHERE ref_id = '$id' AND
710 (last_read IS NULL OR last_read < '$last_online') AND
711 owner_uid = ".$_SESSION["uid"];
713 $result = db_query($link, $query);
715 print "<sync-ok id=\"$id\"/>";
720 /* Maybe we need to further update local DB for this client */
722 $query = "SELECT ref_id,unread,marked FROM ttrss_user_entries
723 WHERE last_read >= '$last_online' AND
724 owner_uid = ".$_SESSION["uid"] . " LIMIT 1000";
726 $result = db_query($link, $query);
728 while ($line = db_fetch_assoc($result)) {
729 $unread = (int) sql_bool_to_bool($line["unread"]);
730 $marked = (int) sql_bool_to_bool($line["marked"]);
732 print "<sync-ok unread=\"$unread\" marked=\"$marked\"
733 id=\"".$line["ref_id"]."\"/>";
744 $result = db_query($link, "SELECT id, title, cat_id FROM
745 ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"]);
747 while ($line = db_fetch_assoc($result)) {
749 $has_icon = (int) feed_has_icon($line["id"]);
751 print "<feed has_icon=\"$has_icon\"
752 cat_id=\"".(int)$line["cat_id"]."\" id=\"".$line["id"]."\"><![CDATA[";
753 print $line["title"];
759 print "<feed-categories>";
761 $result = db_query($link, "SELECT id, title, collapsed FROM
762 ttrss_feed_categories WHERE owner_uid = ".$_SESSION["uid"]);
764 print "<category id=\"0\" collapsed=\"".
765 (int)get_pref($link, "_COLLAPSED_UNCAT")."\"><![CDATA[";
766 print __("Uncategorized");
767 print "]]></category>";
769 print "<category id=\"-1\" collapsed=\"".
770 (int)get_pref($link, "_COLLAPSED_SPECIAL")."\"><![CDATA[";
772 print "]]></category>";
774 print "<category id=\"-2\" collapsed=\"".
775 (int)get_pref($link, "_COLLAPSED_LABELS")."\"><![CDATA[";
777 print "]]></category>";
779 while ($line = db_fetch_assoc($result)) {
781 id=\"".$line["id"]."\"
782 collapsed=\"".(int)sql_bool_to_bool($line["collapsed"])."\"><![CDATA[";
783 print $line["title"];
784 print "]]></category>";
787 print "</feed-categories>";
791 $result = db_query($link, "SELECT * FROM
792 ttrss_labels2 WHERE owner_uid = ".$_SESSION["uid"]);
794 while ($line = db_fetch_assoc($result)) {
796 id=\"".$line["id"]."\"
797 fg_color=\"".$line["fg_color"]."\"
798 bg_color=\"".$line["bg_color"]."\"
800 print $line["caption"];
813 $skip = $limit*($stage-1);
815 print "<limit value=\"$limit\"/>";
817 if ($amount > 0) $amount -= $skip;
821 $limit = min($limit, $amount);
824 $unread_qpart = "(unread = true OR marked = true) AND ";
827 if ($cidt && $cidb) {
828 $cid_qpart = "(ttrss_entries.id > $cidt OR ttrss_entries.id < $cidb) AND ";
831 if (DB_TYPE
== "pgsql") {
832 $date_qpart = "updated >= NOW() - INTERVAL '1 week' AND";
834 $date_qpart = "updated >= DATE_SUB(NOW(), INTERVAL 1 WEEK) AND";
837 $result = db_query($link,
838 "SELECT DISTINCT ttrss_entries.id,ttrss_entries.title,
840 feed_id,content,updated,unread,marked FROM
841 ttrss_user_entries,ttrss_entries,ttrss_feeds
842 WHERE $unread_qpart $cid_qpart $date_qpart
843 ttrss_feeds.id = feed_id AND
844 ref_id = ttrss_entries.id AND
845 ttrss_user_entries.owner_uid = ".$_SESSION["uid"]."
846 ORDER BY updated DESC LIMIT $limit OFFSET $skip");
848 if (function_exists('json_encode')) {
850 while ($line = db_fetch_assoc($result)) {
851 print "<article><![CDATA[";
853 $line["marked"] = (int)sql_bool_to_bool($line["marked"]);
854 $line["unread"] = (int)sql_bool_to_bool($line["unread"]);
856 $line["labels"] = get_article_labels($link, $line["id"]);
859 // $line["tags"] = format_tags_string(
860 // get_article_tags($link, $line["id"]), $line["id"]);
862 print json_encode($line);
863 print "]]></article>";
873 print "</rpc-reply>";
878 print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";