backend-rpc.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. <?php
  2. function handle_rpc_request($link) {
  3. $subop = $_REQUEST["subop"];
  4. $seq = (int) $_REQUEST["seq"];
  5. // Silent
  6. if ($subop == "setprofile") {
  7. $id = db_escape_string($_REQUEST["id"]);
  8. $_SESSION["profile"] = $id;
  9. $_SESSION["prefs_cache"] = array();
  10. return;
  11. }
  12. // Silent
  13. if ($subop == "remprofiles") {
  14. $ids = explode(",", db_escape_string(trim($_REQUEST["ids"])));
  15. foreach ($ids as $id) {
  16. if ($_SESSION["profile"] != $id) {
  17. db_query($link, "DELETE FROM ttrss_settings_profiles WHERE id = '$id' AND
  18. owner_uid = " . $_SESSION["uid"]);
  19. }
  20. }
  21. return;
  22. }
  23. // Silent
  24. if ($subop == "addprofile") {
  25. $title = db_escape_string(trim($_REQUEST["title"]));
  26. if ($title) {
  27. db_query($link, "BEGIN");
  28. $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
  29. WHERE title = '$title' AND owner_uid = " . $_SESSION["uid"]);
  30. if (db_num_rows($result) == 0) {
  31. db_query($link, "INSERT INTO ttrss_settings_profiles (title, owner_uid)
  32. VALUES ('$title', ".$_SESSION["uid"] .")");
  33. $result = db_query($link, "SELECT id FROM ttrss_settings_profiles WHERE
  34. title = '$title'");
  35. if (db_num_rows($result) != 0) {
  36. $profile_id = db_fetch_result($result, 0, "id");
  37. if ($profile_id) {
  38. initialize_user_prefs($link, $_SESSION["uid"], $profile_id);
  39. }
  40. }
  41. }
  42. db_query($link, "COMMIT");
  43. }
  44. return;
  45. }
  46. // Silent
  47. if ($subop == "saveprofile") {
  48. $id = db_escape_string($_REQUEST["id"]);
  49. $title = db_escape_string(trim($_REQUEST["value"]));
  50. if ($id == 0) {
  51. print __("Default profile");
  52. return;
  53. }
  54. if ($title) {
  55. db_query($link, "BEGIN");
  56. $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
  57. WHERE title = '$title' AND owner_uid =" . $_SESSION["uid"]);
  58. if (db_num_rows($result) == 0) {
  59. db_query($link, "UPDATE ttrss_settings_profiles
  60. SET title = '$title' WHERE id = '$id' AND
  61. owner_uid = " . $_SESSION["uid"]);
  62. print $title;
  63. } else {
  64. $result = db_query($link, "SELECT title FROM ttrss_settings_profiles
  65. WHERE id = '$id' AND owner_uid =" . $_SESSION["uid"]);
  66. print db_fetch_result($result, 0, "title");
  67. }
  68. db_query($link, "COMMIT");
  69. }
  70. return;
  71. }
  72. // Silent
  73. if ($subop == "remarchive") {
  74. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  75. foreach ($ids as $id) {
  76. $result = db_query($link, "DELETE FROM ttrss_archived_feeds WHERE
  77. (SELECT COUNT(*) FROM ttrss_user_entries
  78. WHERE orig_feed_id = '$id') = 0 AND
  79. id = '$id' AND owner_uid = ".$_SESSION["uid"]);
  80. $rc = db_affected_rows($link, $result);
  81. }
  82. return;
  83. }
  84. if ($subop == "addfeed") {
  85. $feed = db_escape_string($_REQUEST['feed']);
  86. $cat = db_escape_string($_REQUEST['cat']);
  87. $login = db_escape_string($_REQUEST['login']);
  88. $pass = db_escape_string($_REQUEST['pass']);
  89. $rc = subscribe_to_feed($link, $feed, $cat, $login, $pass);
  90. print json_encode(array("result" => $rc));
  91. return;
  92. }
  93. if ($subop == "extractfeedurls") {
  94. $urls = get_feeds_from_html($_REQUEST['url']);
  95. print json_encode(array("urls" => $urls));
  96. return;
  97. }
  98. if ($subop == "togglepref") {
  99. $key = db_escape_string($_REQUEST["key"]);
  100. set_pref($link, $key, !get_pref($link, $key));
  101. $value = get_pref($link, $key);
  102. print json_encode(array("param" =>$key, "value" => $value));
  103. return;
  104. }
  105. if ($subop == "setpref") {
  106. $value = str_replace("\n", "<br/>", $_REQUEST['value']);
  107. $key = db_escape_string($_REQUEST["key"]);
  108. $value = db_escape_string($value);
  109. set_pref($link, $key, $value);
  110. print json_encode(array("param" =>$key, "value" => $value));
  111. return;
  112. }
  113. if ($subop == "mark") {
  114. $mark = $_REQUEST["mark"];
  115. $id = db_escape_string($_REQUEST["id"]);
  116. if ($mark == "1") {
  117. $mark = "true";
  118. } else {
  119. $mark = "false";
  120. }
  121. $result = db_query($link, "UPDATE ttrss_user_entries SET marked = $mark
  122. WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
  123. print json_encode(array("message" => "UPDATE_COUNTERS"));
  124. return;
  125. }
  126. if ($subop == "delete") {
  127. $ids = db_escape_string($_REQUEST["ids"]);
  128. $result = db_query($link, "DELETE FROM ttrss_user_entries
  129. WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
  130. print json_encode(array("message" => "UPDATE_COUNTERS"));
  131. return;
  132. }
  133. if ($subop == "unarchive") {
  134. $ids = db_escape_string($_REQUEST["ids"]);
  135. $result = db_query($link, "UPDATE ttrss_user_entries
  136. SET feed_id = orig_feed_id, orig_feed_id = NULL
  137. WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
  138. print json_encode(array("message" => "UPDATE_COUNTERS"));
  139. return;
  140. }
  141. if ($subop == "archive") {
  142. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  143. foreach ($ids as $id) {
  144. archive_article($link, $id, $_SESSION["uid"]);
  145. }
  146. print json_encode(array("message" => "UPDATE_COUNTERS"));
  147. return;
  148. }
  149. if ($subop == "publ") {
  150. $pub = $_REQUEST["pub"];
  151. $id = db_escape_string($_REQUEST["id"]);
  152. $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
  153. if ($pub == "1") {
  154. $pub = "true";
  155. } else {
  156. $pub = "false";
  157. }
  158. $result = db_query($link, "UPDATE ttrss_user_entries SET
  159. published = $pub
  160. WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
  161. $pubsub_result = false;
  162. if (PUBSUBHUBBUB_HUB) {
  163. $rss_link = get_self_url_prefix() .
  164. "/public.php?op=rss&id=-2&key=" .
  165. get_feed_access_key($link, -2, false);
  166. $p = new Publisher(PUBSUBHUBBUB_HUB);
  167. $pubsub_result = $p->publish_update($rss_link);
  168. }
  169. print json_encode(array("message" => "UPDATE_COUNTERS",
  170. "pubsub_result" => $pubsub_result));
  171. return;
  172. }
  173. // Silent
  174. /* if ($subop == "update") {
  175. $feed_id = db_escape_string($_REQUEST["feed"]);
  176. update_rss_feed($link, $feed_id);
  177. return;
  178. } */
  179. if ($subop == "updateAllFeeds" || $subop == "getAllCounters") {
  180. $last_article_id = (int) $_REQUEST["last_article_id"];
  181. $reply = array();
  182. if ($seq) $reply['seq'] = $seq;
  183. if ($last_article_id != getLastArticleId($link)) {
  184. $omode = $_REQUEST["omode"];
  185. if ($omode != "T")
  186. $reply['counters'] = getAllCounters($link, $omode);
  187. else
  188. $reply['counters'] = getGlobalCounters($link);
  189. }
  190. $reply['runtime-info'] = make_runtime_info($link);
  191. print json_encode($reply);
  192. return;
  193. }
  194. /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */
  195. if ($subop == "catchupSelected") {
  196. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  197. $cmode = sprintf("%d", $_REQUEST["cmode"]);
  198. catchupArticlesById($link, $ids, $cmode);
  199. print json_encode(array("message" => "UPDATE_COUNTERS"));
  200. return;
  201. }
  202. if ($subop == "markSelected") {
  203. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  204. $cmode = sprintf("%d", $_REQUEST["cmode"]);
  205. markArticlesById($link, $ids, $cmode);
  206. print json_encode(array("message" => "UPDATE_COUNTERS"));
  207. return;
  208. }
  209. if ($subop == "publishSelected") {
  210. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  211. $cmode = sprintf("%d", $_REQUEST["cmode"]);
  212. publishArticlesById($link, $ids, $cmode);
  213. print json_encode(array("message" => "UPDATE_COUNTERS"));
  214. return;
  215. }
  216. if ($subop == "sanityCheck") {
  217. $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true";
  218. $reply = array();
  219. $reply['error'] = sanity_check($link);
  220. if ($reply['error']['code'] == 0) {
  221. $reply['init-params'] = make_init_params($link);
  222. $reply['runtime-info'] = make_runtime_info($link);
  223. }
  224. print json_encode($reply);
  225. return;
  226. }
  227. /* if ($subop == "globalPurge") {
  228. print "<rpc-reply>";
  229. global_purge_old_posts($link, true);
  230. print "</rpc-reply>";
  231. return;
  232. } */
  233. if ($subop == "setArticleTags") {
  234. global $memcache;
  235. $id = db_escape_string($_REQUEST["id"]);
  236. $tags_str = db_escape_string($_REQUEST["tags_str"]);
  237. $tags = array_unique(trim_array(explode(",", $tags_str)));
  238. db_query($link, "BEGIN");
  239. $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE
  240. ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1");
  241. if (db_num_rows($result) == 1) {
  242. $tags_to_cache = array();
  243. $int_id = db_fetch_result($result, 0, "int_id");
  244. db_query($link, "DELETE FROM ttrss_tags WHERE
  245. post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'");
  246. foreach ($tags as $tag) {
  247. $tag = sanitize_tag($tag);
  248. if (!tag_is_valid($tag)) {
  249. continue;
  250. }
  251. if (preg_match("/^[0-9]*$/", $tag)) {
  252. continue;
  253. }
  254. // print "<!-- $id : $int_id : $tag -->";
  255. if ($tag != '') {
  256. db_query($link, "INSERT INTO ttrss_tags
  257. (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')");
  258. }
  259. array_push($tags_to_cache, $tag);
  260. }
  261. /* update tag cache */
  262. sort($tags_to_cache);
  263. $tags_str = join(",", $tags_to_cache);
  264. db_query($link, "UPDATE ttrss_user_entries
  265. SET tag_cache = '$tags_str' WHERE ref_id = '$id'
  266. AND owner_uid = " . $_SESSION["uid"]);
  267. }
  268. db_query($link, "COMMIT");
  269. if ($memcache) {
  270. $obj_id = md5("TAGS:".$_SESSION["uid"].":$id");
  271. $memcache->delete($obj_id);
  272. }
  273. $tags = get_article_tags($link, $id);
  274. $tags_str = format_tags_string($tags, $id);
  275. $tags_str_full = join(", ", $tags);
  276. if (!$tags_str_full) $tags_str_full = __("no tags");
  277. print json_encode(array("tags_str" => array("id" => $id,
  278. "content" => $tags_str, "content_full" => $tags_str_full)));
  279. return;
  280. }
  281. if ($subop == "regenOPMLKey") {
  282. update_feed_access_key($link, 'OPML:Publish',
  283. false, $_SESSION["uid"]);
  284. $new_link = opml_publish_url($link);
  285. print json_encode(array("link" => $new_link));
  286. return;
  287. }
  288. if ($subop == "completeTags") {
  289. $search = db_escape_string($_REQUEST["search"]);
  290. $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags
  291. WHERE owner_uid = '".$_SESSION["uid"]."' AND
  292. tag_name LIKE '$search%' ORDER BY tag_name
  293. LIMIT 10");
  294. print "<ul>";
  295. while ($line = db_fetch_assoc($result)) {
  296. print "<li>" . $line["tag_name"] . "</li>";
  297. }
  298. print "</ul>";
  299. return;
  300. }
  301. if ($subop == "purge") {
  302. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  303. $days = sprintf("%d", $_REQUEST["days"]);
  304. foreach ($ids as $id) {
  305. $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
  306. id = '$id' AND owner_uid = ".$_SESSION["uid"]);
  307. if (db_num_rows($result) == 1) {
  308. purge_feed($link, $id, $days);
  309. }
  310. }
  311. return;
  312. }
  313. /* if ($subop == "setScore") {
  314. $id = db_escape_string($_REQUEST["id"]);
  315. $score = sprintf("%d", $_REQUEST["score"]);
  316. $result = db_query($link, "UPDATE ttrss_user_entries SET score = '$score'
  317. WHERE ref_id = '$id' AND owner_uid = ".$_SESSION["uid"]);
  318. print "<rpc-reply><message>Acknowledged.</message></rpc-reply>";
  319. return;
  320. } */
  321. if ($subop == "getArticles") {
  322. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  323. $articles = array();
  324. foreach ($ids as $id) {
  325. if ($id) {
  326. array_push($articles, format_article($link, $id, 0, false));
  327. }
  328. }
  329. print json_encode($articles);
  330. return;
  331. }
  332. if ($subop == "checkDate") {
  333. $date = db_escape_string($_REQUEST["date"]);
  334. $date_parsed = strtotime($date);
  335. print json_encode(array("result" => (bool)$date_parsed,
  336. "date" => date("c", $date_parsed)));
  337. return;
  338. }
  339. if ($subop == "assignToLabel" || $subop == "removeFromLabel") {
  340. $reply = array();
  341. $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  342. $label_id = db_escape_string($_REQUEST["lid"]);
  343. $label = db_escape_string(label_find_caption($link, $label_id,
  344. $_SESSION["uid"]));
  345. $reply["info-for-headlines"] = array();
  346. if ($label) {
  347. foreach ($ids as $id) {
  348. if ($subop == "assignToLabel")
  349. label_add_article($link, $id, $label, $_SESSION["uid"]);
  350. else
  351. label_remove_article($link, $id, $label, $_SESSION["uid"]);
  352. $labels = get_article_labels($link, $id, $_SESSION["uid"]);
  353. array_push($reply["info-for-headlines"],
  354. array("id" => $id, "labels" => format_article_labels($labels, $id)));
  355. }
  356. }
  357. $reply["message"] = "UPDATE_COUNTERS";
  358. print json_encode($reply);
  359. return;
  360. }
  361. if ($subop == "updateFeedBrowser") {
  362. $search = db_escape_string($_REQUEST["search"]);
  363. $limit = db_escape_string($_REQUEST["limit"]);
  364. $mode = (int) db_escape_string($_REQUEST["mode"]);
  365. print json_encode(array("content" =>
  366. make_feed_browser($link, $search, $limit, $mode),
  367. "mode" => $mode));
  368. return;
  369. }
  370. // Silent
  371. if ($subop == "massSubscribe") {
  372. $payload = json_decode($_REQUEST["payload"], false);
  373. $mode = $_REQUEST["mode"];
  374. if (!$payload || !is_array($payload)) return;
  375. if ($mode == 1) {
  376. foreach ($payload as $feed) {
  377. $title = db_escape_string($feed[0]);
  378. $feed_url = db_escape_string($feed[1]);
  379. $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
  380. feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
  381. if (db_num_rows($result) == 0) {
  382. $result = db_query($link, "INSERT INTO ttrss_feeds
  383. (owner_uid,feed_url,title,cat_id,site_url)
  384. VALUES ('".$_SESSION["uid"]."',
  385. '$feed_url', '$title', NULL, '')");
  386. }
  387. }
  388. } else if ($mode == 2) {
  389. // feed archive
  390. foreach ($payload as $id) {
  391. $result = db_query($link, "SELECT * FROM ttrss_archived_feeds
  392. WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
  393. if (db_num_rows($result) != 0) {
  394. $site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
  395. $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
  396. $title = db_escape_string(db_fetch_result($result, 0, "title"));
  397. $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
  398. feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
  399. if (db_num_rows($result) == 0) {
  400. $result = db_query($link, "INSERT INTO ttrss_feeds
  401. (owner_uid,feed_url,title,cat_id,site_url)
  402. VALUES ('$id','".$_SESSION["uid"]."',
  403. '$feed_url', '$title', NULL, '$site_url')");
  404. }
  405. }
  406. }
  407. }
  408. /* $ids = explode(",", db_escape_string($_REQUEST["ids"]));
  409. $subscribed = array();
  410. foreach ($ids as $id) {
  411. if ($mode == 1) {
  412. $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
  413. WHERE id = '$id'");
  414. } else if ($mode == 2) {
  415. $result = db_query($link, "SELECT * FROM ttrss_archived_feeds
  416. WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
  417. $orig_id = db_escape_string(db_fetch_result($result, 0, "id"));
  418. $site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
  419. }
  420. $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
  421. $title = db_escape_string(db_fetch_result($result, 0, "title"));
  422. $title_orig = db_fetch_result($result, 0, "title");
  423. $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
  424. feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
  425. if (db_num_rows($result) == 0) {
  426. if ($mode == 1) {
  427. $result = db_query($link,
  428. "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
  429. VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
  430. } else if ($mode == 2) {
  431. $result = db_query($link,
  432. "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url)
  433. VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')");
  434. }
  435. array_push($subscribed, $title_orig);
  436. }
  437. } */
  438. return;
  439. }
  440. if ($subop == "digest-get-contents") {
  441. $article_id = db_escape_string($_REQUEST['article_id']);
  442. $result = db_query($link, "SELECT content,title,link,marked,published
  443. FROM ttrss_entries, ttrss_user_entries
  444. WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']);
  445. $content = sanitize_rss($link, db_fetch_result($result, 0, "content"));
  446. $title = strip_tags(db_fetch_result($result, 0, "title"));
  447. $article_url = htmlspecialchars(db_fetch_result($result, 0, "link"));
  448. $marked = sql_bool_to_bool(db_fetch_result($result, 0, "marked"));
  449. $published = sql_bool_to_bool(db_fetch_result($result, 0, "published"));
  450. print json_encode(array("article" =>
  451. array("id" => $article_id, "url" => $article_url,
  452. "tags" => get_article_tags($link, $article_id),
  453. "marked" => $marked, "published" => $published,
  454. "title" => $title, "content" => $content)));
  455. return;
  456. }
  457. if ($subop == "digest-update") {
  458. $feed_id = db_escape_string($_REQUEST['feed_id']);
  459. $offset = db_escape_string($_REQUEST['offset']);
  460. $seq = db_escape_string($_REQUEST['seq']);
  461. if (!$feed_id) $feed_id = -4;
  462. if (!$offset) $offset = 0;
  463. $reply = array();
  464. $reply['seq'] = $seq;
  465. $headlines = api_get_headlines($link, $feed_id, 30, $offset,
  466. '', ($feed_id == -4), true, false, "unread", "updated DESC", 0, 0);
  467. //function api_get_headlines($link, $feed_id, $limit, $offset,
  468. // $filter, $is_cat, $show_excerpt, $show_content, $view_mode) {
  469. $reply['headlines'] = array();
  470. $reply['headlines']['title'] = getFeedTitle($link, $feed_id);
  471. $reply['headlines']['content'] = $headlines;
  472. print json_encode($reply);
  473. return;
  474. }
  475. if ($subop == "digest-init") {
  476. $tmp_feeds = api_get_feeds($link, -4, true, false, 0);
  477. $feeds = array();
  478. foreach ($tmp_feeds as $f) {
  479. if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f);
  480. }
  481. print json_encode(array("feeds" => $feeds));
  482. return;
  483. }
  484. if ($subop == "catchupFeed") {
  485. $feed_id = db_escape_string($_REQUEST['feed_id']);
  486. $is_cat = db_escape_string($_REQUEST['is_cat']) == "true";
  487. catchup_feed($link, $feed_id, $is_cat);
  488. print json_encode(array("message" => "UPDATE_COUNTERS"));
  489. return;
  490. }
  491. if ($subop == "sendEmail") {
  492. $secretkey = $_REQUEST['secretkey'];
  493. $reply = array();
  494. if (DIGEST_ENABLE && $_SESSION['email_secretkey'] &&
  495. $secretkey == $_SESSION['email_secretkey']) {
  496. $_SESSION['email_secretkey'] = '';
  497. $destination = $_REQUEST['destination'];
  498. $subject = $_REQUEST['subject'];
  499. $content = $_REQUEST['content'];
  500. $replyto = strip_tags($_SESSION['email_replyto']);
  501. $fromname = strip_tags($_SESSION['email_fromname']);
  502. $mail = new PHPMailer();
  503. $mail->PluginDir = "lib/phpmailer/";
  504. $mail->SetLanguage("en", "lib/phpmailer/language/");
  505. $mail->CharSet = "UTF-8";
  506. $mail->From = $replyto;
  507. $mail->FromName = $fromname;
  508. $mail->AddAddress($destination);
  509. if (DIGEST_SMTP_HOST) {
  510. $mail->Host = DIGEST_SMTP_HOST;
  511. $mail->Mailer = "smtp";
  512. $mail->SMTPAuth = DIGEST_SMTP_LOGIN != '';
  513. $mail->Username = DIGEST_SMTP_LOGIN;
  514. $mail->Password = DIGEST_SMTP_PASSWORD;
  515. }
  516. $mail->IsHTML(false);
  517. $mail->Subject = $subject;
  518. $mail->Body = $content;
  519. $rc = $mail->Send();
  520. if (!$rc) {
  521. $reply['error'] = $mail->ErrorInfo;
  522. } else {
  523. save_email_address($link, db_escape_string($destination));
  524. $reply['message'] = "UPDATE_COUNTERS";
  525. }
  526. } else {
  527. $reply['error'] = "Not authorized.";
  528. }
  529. print json_encode($reply);
  530. return;
  531. }
  532. if ($subop == "completeEmails") {
  533. $search = db_escape_string($_REQUEST["search"]);
  534. print "<ul>";
  535. foreach ($_SESSION['stored_emails'] as $email) {
  536. if (strpos($email, $search) !== false) {
  537. print "<li>$email</li>";
  538. }
  539. }
  540. print "</ul>";
  541. return;
  542. }
  543. if ($subop == "quickAddCat") {
  544. $cat = db_escape_string($_REQUEST["cat"]);
  545. add_feed_category($link, $cat);
  546. $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE
  547. title = '$cat' AND owner_uid = " . $_SESSION["uid"]);
  548. if (db_num_rows($result) == 1) {
  549. $id = db_fetch_result($result, 0, "id");
  550. } else {
  551. $id = 0;
  552. }
  553. print_feed_cat_select($link, "cat_id", $id);
  554. return;
  555. }
  556. if ($subop == "regenFeedKey") {
  557. $feed_id = db_escape_string($_REQUEST['id']);
  558. $is_cat = db_escape_string($_REQUEST['is_cat']) == "true";
  559. $new_key = update_feed_access_key($link, $feed_id, $is_cat);
  560. print json_encode(array("link" => $new_key));
  561. return;
  562. }
  563. // Silent
  564. if ($subop == "clearKeys") {
  565. db_query($link, "DELETE FROM ttrss_access_keys WHERE
  566. owner_uid = " . $_SESSION["uid"]);
  567. return;
  568. }
  569. // Silent
  570. if ($subop == "clearArticleKeys") {
  571. db_query($link, "UPDATE ttrss_user_entries SET uuid = '' WHERE
  572. owner_uid = " . $_SESSION["uid"]);
  573. return;
  574. }
  575. if ($subop == "verifyRegexp") {
  576. $reg_exp = $_REQUEST["reg_exp"];
  577. $status = @preg_match("/$reg_exp/i", "TEST") !== false;
  578. print json_encode(array("status" => $status));
  579. return;
  580. }
  581. // TODO: unify with digest-get-contents?
  582. if ($subop == "cdmGetArticle") {
  583. $ids = array(db_escape_string($_REQUEST["id"]));
  584. $cids = explode(",", $_REQUEST["cids"]);
  585. $ids = array_merge($ids, $cids);
  586. $rv = array();
  587. foreach ($ids as $id) {
  588. $id = (int)$id;
  589. $result = db_query($link, "SELECT content,
  590. ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds,
  591. ttrss_entries
  592. WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND
  593. ttrss_entries.id = ref_id AND
  594. ttrss_user_entries.owner_uid = ".$_SESSION["uid"]);
  595. if (db_num_rows($result) != 0) {
  596. $line = db_fetch_assoc($result);
  597. $article_content = sanitize_rss($link, $line["content"],
  598. false, false, $line['site_url']);
  599. array_push($rv,
  600. array("id" => $id, "content" => $article_content));
  601. }
  602. }
  603. print json_encode($rv);
  604. return;
  605. }
  606. if ($subop == "scheduleFeedUpdate") {
  607. $feed_id = db_escape_string($_REQUEST["id"]);
  608. $is_cat = db_escape_string($_REQUEST['is_cat']) == 'true';
  609. $message = __("Your request could not be completed.");
  610. if ($feed_id >= 0) {
  611. if (!$is_cat) {
  612. $message = __("Feed update has been scheduled.");
  613. db_query($link, "UPDATE ttrss_feeds SET
  614. last_update_started = '1970-01-01',
  615. last_updated = '1970-01-01' WHERE id = '$feed_id' AND
  616. owner_uid = ".$_SESSION["uid"]);
  617. } else {
  618. $message = __("Category update has been scheduled.");
  619. if ($feed_id)
  620. $cat_query = "cat_id = '$feed_id'";
  621. else
  622. $cat_query = "cat_id IS NULL";
  623. db_query($link, "UPDATE ttrss_feeds SET
  624. last_update_started = '1970-01-01',
  625. last_updated = '1970-01-01' WHERE $cat_query AND
  626. owner_uid = ".$_SESSION["uid"]);
  627. }
  628. } else {
  629. $message = __("Can't update this kind of feed.");
  630. }
  631. print json_encode(array("message" => $message));
  632. return;
  633. }
  634. if ($subop == "getTweetInfo") {
  635. $id = db_escape_string($_REQUEST['id']);
  636. $result = db_query($link, "SELECT title, link
  637. FROM ttrss_entries, ttrss_user_entries
  638. WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']);
  639. if (db_num_rows($result) != 0) {
  640. $title = truncate_string(strip_tags(db_fetch_result($result, 0, 'title')),
  641. 100, '...');
  642. $article_link = db_fetch_result($result, 0, 'link');
  643. }
  644. print json_encode(array("title" => $title, "link" => $article_link,
  645. "id" => $id));
  646. return;
  647. }
  648. if ($subop == "setNote") {
  649. $id = db_escape_string($_REQUEST["id"]);
  650. $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
  651. db_query($link, "UPDATE ttrss_user_entries SET note = '$note'
  652. WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
  653. $formatted_note = format_article_note($id, $note);
  654. print json_encode(array("note" => $formatted_note,
  655. "raw_length" => mb_strlen($note)));
  656. return;
  657. }
  658. if ($subop == "genHash") {
  659. $hash = sha1(uniqid(rand(), true));
  660. print json_encode(array("hash" => $hash));
  661. return;
  662. }
  663. print json_encode(array("error" => array("code" => 7,
  664. "message" => "Unknown method: $subop")));
  665. }
  666. ?>