]> git.wh0rd.org - tt-rss.git/blob - modules/backend-rpc.php
remove xml from getAllCounters rpc call, use pure JSON
[tt-rss.git] / modules / backend-rpc.php
1 <?php
2 function handle_rpc_request($link) {
3
4 $subop = $_REQUEST["subop"];
5 $seq = (int) $_REQUEST["seq"];
6
7 if ($subop == "setprofile") {
8 $id = db_escape_string($_REQUEST["id"]);
9
10 $_SESSION["profile"] = $id;
11 $_SESSION["prefs_cache"] = array();
12 return;
13 }
14
15 if ($subop == "remprofiles") {
16 $ids = split(",", db_escape_string(trim($_REQUEST["ids"])));
17
18 foreach ($ids as $id) {
19 if ($_SESSION["profile"] != $id) {
20 db_query($link, "DELETE FROM ttrss_settings_profiles WHERE id = '$id' AND
21 owner_uid = " . $_SESSION["uid"]);
22 }
23 }
24 return;
25 }
26
27 if ($subop == "addprofile") {
28 $title = db_escape_string(trim($_REQUEST["title"]));
29 if ($title) {
30 db_query($link, "BEGIN");
31
32 $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
33 WHERE title = '$title' AND owner_uid = " . $_SESSION["uid"]);
34
35 if (db_num_rows($result) == 0) {
36
37 db_query($link, "INSERT INTO ttrss_settings_profiles (title, owner_uid)
38 VALUES ('$title', ".$_SESSION["uid"] .")");
39
40 $result = db_query($link, "SELECT id FROM ttrss_settings_profiles WHERE
41 title = '$title'");
42
43 if (db_num_rows($result) != 0) {
44 $profile_id = db_fetch_result($result, 0, "id");
45
46 if ($profile_id) {
47 initialize_user_prefs($link, $_SESSION["uid"], $profile_id);
48 }
49 }
50 }
51
52 db_query($link, "COMMIT");
53 }
54 return;
55 }
56
57 if ($subop == "saveprofile") {
58 $id = db_escape_string($_REQUEST["id"]);
59 $title = db_escape_string(trim($_REQUEST["value"]));
60
61 if ($id == 0) {
62 print __("Default profile");
63 return;
64 }
65
66 if ($title) {
67 db_query($link, "BEGIN");
68
69 $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
70 WHERE title = '$title' AND owner_uid =" . $_SESSION["uid"]);
71
72 if (db_num_rows($result) == 0) {
73 db_query($link, "UPDATE ttrss_settings_profiles
74 SET title = '$title' WHERE id = '$id' AND
75 owner_uid = " . $_SESSION["uid"]);
76 print $title;
77 } else {
78 $result = db_query($link, "SELECT title FROM ttrss_settings_profiles
79 WHERE id = '$id' AND owner_uid =" . $_SESSION["uid"]);
80 print db_fetch_result($result, 0, "title");
81 }
82
83 db_query($link, "COMMIT");
84 }
85 return;
86 }
87
88 if ($subop == "remarchive") {
89 $ids = split(",", db_escape_string($_REQUEST["ids"]));
90
91 print "<rpc-reply>";
92
93 foreach ($ids as $id) {
94 $result = db_query($link, "DELETE FROM ttrss_archived_feeds WHERE
95 (SELECT COUNT(*) FROM ttrss_user_entries
96 WHERE orig_feed_id = '$id') = 0 AND
97 id = '$id' AND owner_uid = ".$_SESSION["uid"]);
98
99 $rc = db_affected_rows($link, $result);
100
101 print "<feed id='$id' rc='$rc'/>";
102
103 }
104
105 print "</rpc-reply>";
106
107 return;
108 }
109
110 if ($subop == "addfeed") {
111
112 $feed = db_escape_string($_REQUEST['feed']);
113 $cat = db_escape_string($_REQUEST['cat']);
114 $login = db_escape_string($_REQUEST['login']);
115 $pass = db_escape_string($_REQUEST['pass']);
116
117 $rc = subscribe_to_feed($link, $feed, $cat, $login, $pass);
118
119 print "<rpc-reply>";
120 print "<result code='$rc'/>";
121 print "</rpc-reply>";
122
123 return;
124
125 }
126
127 if ($subop == "extractfeedurls") {
128 print "<rpc-reply>";
129
130 $urls = get_feeds_from_html($_REQUEST['url']);
131 print "<urls><![CDATA[" . json_encode($urls) . "]]></urls>";
132
133 print "</rpc-reply>";
134 return;
135 }
136
137 if ($subop == "togglepref") {
138 print "<rpc-reply>";
139
140 $key = db_escape_string($_REQUEST["key"]);
141
142 set_pref($link, $key, !get_pref($link, $key));
143
144 $value = get_pref($link, $key);
145
146 print "<param-set key=\"$key\" value=\"$value\"/>";
147
148 print "</rpc-reply>";
149
150 return;
151 }
152
153 if ($subop == "setpref") {
154 print "<rpc-reply>";
155
156 $key = db_escape_string($_REQUEST["key"]);
157 $value = db_escape_string($_REQUEST["value"]);
158
159 set_pref($link, $key, $value);
160
161 print "<param-set key=\"$key\" value=\"$value\"/>";
162
163 print "</rpc-reply>";
164
165 return;
166 }
167
168 if ($subop == "mark") {
169 $mark = $_REQUEST["mark"];
170 $id = db_escape_string($_REQUEST["id"]);
171
172 if ($mark == "1") {
173 $mark = "true";
174 } else {
175 $mark = "false";
176 }
177
178 // FIXME this needs collision testing
179
180 $result = db_query($link, "UPDATE ttrss_user_entries SET marked = $mark
181 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
182
183 print "<rpc-reply>";
184 print "<message>UPDATE_COUNTERS</message>";
185 print "</rpc-reply>";
186
187 return;
188 }
189
190 if ($subop == "delete") {
191 $ids = db_escape_string($_REQUEST["ids"]);
192
193 $result = db_query($link, "DELETE FROM ttrss_user_entries
194 WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
195
196 print "<rpc-reply>";
197 print "<message>UPDATE_COUNTERS</message>";
198 print "</rpc-reply>";
199
200 return;
201 }
202
203 if ($subop == "unarchive") {
204 $ids = db_escape_string($_REQUEST["ids"]);
205
206 $result = db_query($link, "UPDATE ttrss_user_entries
207 SET feed_id = orig_feed_id, orig_feed_id = NULL
208 WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
209
210 print "<rpc-reply>";
211 print "<message>UPDATE_COUNTERS</message>";
212 print "</rpc-reply>";
213
214 return;
215 }
216
217 if ($subop == "archive") {
218 $ids = split(",", db_escape_string($_REQUEST["ids"]));
219
220 foreach ($ids as $id) {
221 archive_article($link, $id, $_SESSION["uid"]);
222 }
223
224 print "<rpc-reply>";
225 print "<message>UPDATE_COUNTERS</message>";
226 print "</rpc-reply>";
227
228 return;
229 }
230
231
232 if ($subop == "publ") {
233 $pub = $_REQUEST["pub"];
234 $id = db_escape_string($_REQUEST["id"]);
235 $note = trim(strip_tags(db_escape_string($_REQUEST["note"])));
236
237 if ($pub == "1") {
238 $pub = "true";
239 } else {
240 $pub = "false";
241 }
242
243 if ($note != 'undefined') {
244 $note_qpart = "note = '$note',";
245 }
246
247 // FIXME this needs collision testing
248
249 $result = db_query($link, "UPDATE ttrss_user_entries SET
250 $note_qpart
251 published = $pub
252 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
253
254
255 print "<rpc-reply>";
256
257 if ($note != 'undefined') {
258 $note_size = strlen($note);
259 print "<note id=\"$id\" size=\"$note_size\">";
260 print "<![CDATA[" . format_article_note($id, $note) . "]]>";
261 print "</note>";
262 }
263
264 print "<message>UPDATE_COUNTERS</message>";
265
266 print "</rpc-reply>";
267
268 return;
269 }
270
271 if ($subop == "updateFeed") {
272 $feed_id = db_escape_string($_REQUEST["feed"]);
273
274 update_rss_feed($link, $feed_id);
275
276 print "<rpc-reply>";
277 print "<message>UPDATE_COUNTERS</message>";
278 print "</rpc-reply>";
279
280 return;
281 }
282
283 if ($subop == "updateAllFeeds" || $subop == "getAllCounters") {
284
285 header("Content-Type: text/plain");
286
287 $last_article_id = (int) $_REQUEST["last_article_id"];
288
289 $reply = array();
290
291 if ($seq) $reply['seq'] = $seq;
292
293 if ($last_article_id != getLastArticleId($link)) {
294 $omode = $_REQUEST["omode"];
295
296 if ($omode != "T")
297 $reply['counters'] = getAllCounters($link, $omode);
298 else
299 $reply['counters'] = getGlobalCounters($link);
300 }
301
302 $reply['runtime-info'] = make_runtime_info($link);
303
304
305 print json_encode($reply);
306 return;
307 }
308
309 /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */
310 if ($subop == "catchupSelected") {
311
312 $ids = split(",", db_escape_string($_REQUEST["ids"]));
313 $cmode = sprintf("%d", $_REQUEST["cmode"]);
314
315 catchupArticlesById($link, $ids, $cmode);
316
317 print "<rpc-reply>";
318 print "<message>UPDATE_COUNTERS</message>";
319 print "</rpc-reply>";
320
321 return;
322 }
323
324 if ($subop == "markSelected") {
325
326 $ids = split(",", db_escape_string($_REQUEST["ids"]));
327 $cmode = sprintf("%d", $_REQUEST["cmode"]);
328
329 markArticlesById($link, $ids, $cmode);
330
331 print "<rpc-reply>";
332 print "<message>UPDATE_COUNTERS</message>";
333 print "</rpc-reply>";
334
335 return;
336 }
337
338 if ($subop == "publishSelected") {
339
340 $ids = split(",", db_escape_string($_REQUEST["ids"]));
341 $cmode = sprintf("%d", $_REQUEST["cmode"]);
342
343 publishArticlesById($link, $ids, $cmode);
344
345 print "<rpc-reply>";
346 print "<message>UPDATE_COUNTERS</message>";
347 print "</rpc-reply>";
348
349 return;
350 }
351
352 if ($subop == "sanityCheck") {
353 print "<rpc-reply>";
354 if (sanity_check($link)) {
355 print "<error error-code=\"0\"/>";
356
357 print "<init-params><![CDATA[";
358 print json_encode(make_init_params($link));
359 print "]]></init-params>";
360
361 print_runtime_info($link);
362
363 # assign client-passed params to session
364 $_SESSION["client.userAgent"] = $_REQUEST["ua"];
365
366 }
367 print "</rpc-reply>";
368
369 return;
370 }
371
372 if ($subop == "globalPurge") {
373
374 print "<rpc-reply>";
375 global_purge_old_posts($link, true);
376 print "</rpc-reply>";
377
378 return;
379 }
380
381 if ($subop == "setArticleTags") {
382
383 global $memcache;
384
385 $id = db_escape_string($_REQUEST["id"]);
386
387 $tags_str = db_escape_string($_REQUEST["tags_str"]);
388 $tags = array_unique(trim_array(split(",", $tags_str)));
389
390 db_query($link, "BEGIN");
391
392 $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE
393 ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1");
394
395 if (db_num_rows($result) == 1) {
396
397 $tags_to_cache = array();
398
399 $int_id = db_fetch_result($result, 0, "int_id");
400
401 db_query($link, "DELETE FROM ttrss_tags WHERE
402 post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'");
403
404 foreach ($tags as $tag) {
405 $tag = sanitize_tag($tag);
406
407 if (!tag_is_valid($tag)) {
408 continue;
409 }
410
411 if (preg_match("/^[0-9]*$/", $tag)) {
412 continue;
413 }
414
415 // print "<!-- $id : $int_id : $tag -->";
416
417 if ($tag != '') {
418 db_query($link, "INSERT INTO ttrss_tags
419 (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')");
420 }
421
422 array_push($tags_to_cache, $tag);
423 }
424
425 /* update tag cache */
426
427 $tags_str = join(",", $tags_to_cache);
428
429 db_query($link, "UPDATE ttrss_user_entries
430 SET tag_cache = '$tags_str' WHERE ref_id = '$id'
431 AND owner_uid = " . $_SESSION["uid"]);
432 }
433
434 db_query($link, "COMMIT");
435
436 if ($memcache) {
437 $obj_id = md5("TAGS:".$_SESSION["uid"].":$id");
438 $memcache->delete($obj_id);
439 }
440
441 $tags_str = format_tags_string(get_article_tags($link, $id), $id);
442
443 print "<rpc-reply>
444 <tags-str id=\"$id\"><![CDATA[$tags_str]]></tags-str>
445 </rpc-reply>";
446
447 return;
448 }
449
450 if ($subop == "regenOPMLKey") {
451
452 print "<rpc-reply>";
453
454 update_feed_access_key($link, 'OPML:Publish',
455 false, $_SESSION["uid"]);
456
457 $new_link = opml_publish_url($link);
458 print "<link><![CDATA[$new_link]]></link>";
459 print "</rpc-reply>";
460 return;
461 }
462
463 if ($subop == "logout") {
464 logout_user();
465 print_error_xml(6);
466 return;
467 }
468
469 if ($subop == "completeTags") {
470
471 $search = db_escape_string($_REQUEST["search"]);
472
473 $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags
474 WHERE owner_uid = '".$_SESSION["uid"]."' AND
475 tag_name LIKE '$search%' ORDER BY tag_name
476 LIMIT 10");
477
478 print "<ul>";
479 while ($line = db_fetch_assoc($result)) {
480 print "<li>" . $line["tag_name"] . "</li>";
481 }
482 print "</ul>";
483
484 return;
485 }
486
487 if ($subop == "purge") {
488 $ids = split(",", db_escape_string($_REQUEST["ids"]));
489 $days = sprintf("%d", $_REQUEST["days"]);
490
491 print "<rpc-reply>";
492
493 print "<message><![CDATA[";
494
495 foreach ($ids as $id) {
496
497 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
498 id = '$id' AND owner_uid = ".$_SESSION["uid"]);
499
500 if (db_num_rows($result) == 1) {
501 purge_feed($link, $id, $days, true);
502 }
503 }
504
505 print "]]></message>";
506
507 print "</rpc-reply>";
508
509 return;
510 }
511
512 /* if ($subop == "setScore") {
513 $id = db_escape_string($_REQUEST["id"]);
514 $score = sprintf("%d", $_REQUEST["score"]);
515
516 $result = db_query($link, "UPDATE ttrss_user_entries SET score = '$score'
517 WHERE ref_id = '$id' AND owner_uid = ".$_SESSION["uid"]);
518
519 print "<rpc-reply><message>Acknowledged.</message></rpc-reply>";
520
521 return;
522
523 } */
524
525 if ($subop == "getArticles") {
526 $ids = split(",", db_escape_string($_REQUEST["ids"]));
527
528 print "<rpc-reply>";
529
530 foreach ($ids as $id) {
531 if ($id) {
532 outputArticleXML($link, $id, 0, false);
533 }
534 }
535 print "</rpc-reply>";
536
537 return;
538 }
539
540 if ($subop == "checkDate") {
541
542 $date = db_escape_string($_REQUEST["date"]);
543 $date_parsed = strtotime($date);
544
545 print "<rpc-reply>";
546
547 if ($date_parsed) {
548 print "<result>1</result>";
549 } else {
550 print "<result>0</result>";
551 }
552
553 print "</rpc-reply>";
554
555 return;
556 }
557
558 if ($subop == "removeFromLabel") {
559
560 $ids = explode(",", db_escape_string($_REQUEST["ids"]));
561 $label_id = db_escape_string($_REQUEST["lid"]);
562
563 $label = db_escape_string(label_find_caption($link, $label_id,
564 $_SESSION["uid"]));
565
566 print "<rpc-reply>";
567 print "<info-for-headlines>";
568
569 if ($label) {
570
571 foreach ($ids as $id) {
572 label_remove_article($link, $id, $label, $_SESSION["uid"]);
573
574 print "<entry id=\"$id\"><![CDATA[";
575
576 $labels = get_article_labels($link, $id, $_SESSION["uid"]);
577 print format_article_labels($labels, $id);
578
579 print "]]></entry>";
580
581 }
582 }
583
584 print "</info-for-headlines>";
585
586 print "<message>UPDATE_COUNTERS</message>";
587 print "</rpc-reply>";
588
589 return;
590 }
591
592 if ($subop == "assignToLabel") {
593
594 $ids = split(",", db_escape_string($_REQUEST["ids"]));
595 $label_id = db_escape_string($_REQUEST["lid"]);
596
597 $label = db_escape_string(label_find_caption($link, $label_id,
598 $_SESSION["uid"]));
599
600 print "<rpc-reply>";
601
602 print "<info-for-headlines>";
603
604 if ($label) {
605
606 foreach ($ids as $id) {
607 label_add_article($link, $id, $label, $_SESSION["uid"]);
608
609 print "<entry id=\"$id\"><![CDATA[";
610
611 $labels = get_article_labels($link, $id, $_SESSION["uid"]);
612 print format_article_labels($labels, $id);
613
614 print "]]></entry>";
615
616 }
617 }
618
619 print "</info-for-headlines>";
620
621 print "<message>UPDATE_COUNTERS</message>";
622 print "</rpc-reply>";
623
624 return;
625 }
626
627 if ($subop == "updateFeedBrowser") {
628
629 $search = db_escape_string($_REQUEST["search"]);
630 $limit = db_escape_string($_REQUEST["limit"]);
631 $mode = db_escape_string($_REQUEST["mode"]);
632
633 print "<rpc-reply>";
634 print "<content>";
635 print "<![CDATA[";
636 $ctr = print_feed_browser($link, $search, $limit, $mode);
637 print "]]>";
638 print "</content>";
639 print "<num-results value=\"$ctr\"/>";
640 print "<mode value=\"$mode\"/>";
641 print "</rpc-reply>";
642
643 return;
644 }
645
646
647 if ($subop == "massSubscribe") {
648
649 $ids = split(",", db_escape_string($_REQUEST["ids"]));
650 $mode = $_REQUEST["mode"];
651
652 $subscribed = array();
653
654 foreach ($ids as $id) {
655
656 if ($mode == 1) {
657 $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
658 WHERE id = '$id'");
659 } else if ($mode == 2) {
660 $result = db_query($link, "SELECT * FROM ttrss_archived_feeds
661 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
662 $orig_id = db_escape_string(db_fetch_result($result, 0, "id"));
663 $site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
664 }
665
666 $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
667 $title = db_escape_string(db_fetch_result($result, 0, "title"));
668
669 $title_orig = db_fetch_result($result, 0, "title");
670
671 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
672 feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
673
674 if (db_num_rows($result) == 0) {
675 if ($mode == 1) {
676 $result = db_query($link,
677 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
678 VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
679 } else if ($mode == 2) {
680 $result = db_query($link,
681 "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url)
682 VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')");
683 }
684 array_push($subscribed, $title_orig);
685 }
686 }
687
688 $num_feeds = count($subscribed);
689
690 print "<rpc-reply>";
691 print "<num-feeds value='$num_feeds'/>";
692 print "</rpc-reply>";
693
694 return;
695 }
696
697 if ($subop == "digest-get-contents") {
698 $article_id = db_escape_string($_REQUEST['article_id']);
699
700 $result = db_query($link, "SELECT content
701 FROM ttrss_entries, ttrss_user_entries
702 WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']);
703
704 print "<rpc-reply>";
705
706 print "<article id=\"$article_id\"><![CDATA[";
707
708 $content = sanitize_rss($link, db_fetch_result($result, 0, "content"));
709
710 print $content;
711
712 print "]]></article>";
713
714 print "</rpc-reply>";
715
716 return;
717 }
718
719 if ($subop == "digest-update") {
720 $feed_id = db_escape_string($_REQUEST['feed_id']);
721 $offset = db_escape_string($_REQUEST['offset']);
722 $seq = db_escape_string($_REQUEST['seq']);
723
724 if (!$feed_id) $feed_id = -4;
725 if (!$offset) $offset = 0;
726 print "<rpc-reply>";
727
728 print "<seq>$seq</seq>";
729
730 $headlines = api_get_headlines($link, $feed_id, 10, $offset,
731 '', ($feed_id == -4), true, false, "unread", "updated DESC");
732
733 //function api_get_headlines($link, $feed_id, $limit, $offset,
734 // $filter, $is_cat, $show_excerpt, $show_content, $view_mode) {
735
736 print "<headlines-title><![CDATA[" . getFeedTitle($link, $feed_id) .
737 "]]></headlines-title>";
738
739 print "<headlines><![CDATA[" . json_encode($headlines) . "]]></headlines>";
740
741 print "</rpc-reply>";
742 return;
743 }
744
745 if ($subop == "digest-init") {
746 print "<rpc-reply>";
747
748 $tmp_feeds = api_get_feeds($link, -3, true, false, 0);
749
750 $feeds = array();
751
752 foreach ($tmp_feeds as $f) {
753 if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f);
754 }
755
756 print "<feeds><![CDATA[" . json_encode($feeds) . "]]></feeds>";
757
758 print "</rpc-reply>";
759 return;
760 }
761
762 if ($subop == "catchupFeed") {
763
764 $feed_id = db_escape_string($_REQUEST['feed_id']);
765 $is_cat = db_escape_string($_REQUEST['is_cat']);
766
767 print "<rpc-reply>";
768
769 catchup_feed($link, $feed_id, $is_cat);
770
771 print "</rpc-reply>";
772
773 return;
774 }
775
776 if ($subop == "sendEmail") {
777 $secretkey = $_REQUEST['secretkey'];
778
779 print "<rpc-reply>";
780
781 if (DIGEST_ENABLE && $_SESSION['email_secretkey'] &&
782 $secretkey == $_SESSION['email_secretkey']) {
783
784 $_SESSION['email_secretkey'] = '';
785
786 $destination = $_REQUEST['destination'];
787 $subject = $_REQUEST['subject'];
788 $content = $_REQUEST['content'];
789
790 $replyto = strip_tags($_SESSION['email_replyto']);
791 $fromname = strip_tags($_SESSION['email_fromname']);
792
793 $mail = new PHPMailer();
794
795 $mail->PluginDir = "lib/phpmailer/";
796 $mail->SetLanguage("en", "lib/phpmailer/language/");
797
798 $mail->CharSet = "UTF-8";
799
800 $mail->From = $replyto;
801 $mail->FromName = $fromname;
802 $mail->AddAddress($destination);
803
804 if (DIGEST_SMTP_HOST) {
805 $mail->Host = DIGEST_SMTP_HOST;
806 $mail->Mailer = "smtp";
807 $mail->SMTPAuth = DIGEST_SMTP_LOGIN != '';
808 $mail->Username = DIGEST_SMTP_LOGIN;
809 $mail->Password = DIGEST_SMTP_PASSWORD;
810 }
811
812 $mail->IsHTML(false);
813 $mail->Subject = $subject;
814 $mail->Body = $content;
815
816 $rc = $mail->Send();
817
818 if (!$rc) {
819 print "<error><![CDATA[" . $mail->ErrorInfo . "]]></error>";
820 } else {
821 save_email_address($link, db_escape_string($destination));
822 print "<message>UPDATE_COUNTERS</message>";
823 }
824
825 } else {
826 print "<error>Not authorized.</error>";
827 }
828
829 print "</rpc-reply>";
830
831 return;
832 }
833
834 if ($subop == "completeEmails") {
835
836 $search = db_escape_string($_REQUEST["search"]);
837
838 print "<ul>";
839
840 foreach ($_SESSION['stored_emails'] as $email) {
841 if (strpos($email, $search) !== false) {
842 print "<li>$email</li>";
843 }
844 }
845
846 print "</ul>";
847
848 return;
849 }
850
851 if ($subop == "quickAddCat") {
852 print "<rpc-reply>";
853
854 $cat = db_escape_string($_REQUEST["cat"]);
855
856 add_feed_category($link, $cat);
857
858 $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE
859 title = '$cat' AND owner_uid = " . $_SESSION["uid"]);
860
861 if (db_num_rows($result) == 1) {
862 $id = db_fetch_result($result, 0, "id");
863 } else {
864 $id = 0;
865 }
866
867 print_feed_cat_select($link, "cat_id", $id);
868
869 print "</rpc-reply>";
870
871 return;
872 }
873
874 if ($subop == "regenFeedKey") {
875 $feed_id = db_escape_string($_REQUEST['id']);
876 $is_cat = (bool) db_escape_string($_REQUEST['is_cat']);
877
878 print "<rpc-reply>";
879
880 $new_key = update_feed_access_key($link, $feed_id, $is_cat);
881
882 print "<link><![CDATA[$new_key]]></link>";
883
884 print "</rpc-reply>";
885
886 return;
887 }
888
889 if ($subop == "clearKeys") {
890
891 db_query($link, "DELETE FROM ttrss_access_keys WHERE
892 owner_uid = " . $_SESSION["uid"]);
893
894 print "<rpc-reply>";
895 print "<message>UPDATE_COUNTERS</message>";
896 print "</rpc-reply>";
897
898 return;
899 }
900
901 if ($subop == "verifyRegexp") {
902 $reg_exp = $_REQUEST["reg_exp"];
903
904 print "<rpc-reply><status>";
905
906 if (@preg_match("/$reg_exp/i", "TEST") === false) {
907 print "INVALID";
908 } else {
909 print "OK";
910 }
911
912 print "</status></rpc-reply>";
913
914 return;
915 }
916
917 if ($subop == "cdmGetArticle") {
918 $id = db_escape_string($_REQUEST["id"]);
919
920 $result = db_query($link, "SELECT content,
921 ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds,
922 ttrss_entries
923 WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND
924 ttrss_entries.id = ref_id AND
925 ttrss_user_entries.owner_uid = ".$_SESSION["uid"]);
926
927 if (db_num_rows($result) != 0) {
928 $line = db_fetch_assoc($result);
929
930 $article_content = sanitize_rss($link, $line["content"],
931 false, false, $line['site_url']);
932
933 } else {
934 $article_content = '';
935 }
936
937 print "<rpc-reply><article id=\"$id\"><![CDATA[";
938 print "$article_content";
939 print "]]></article></rpc-reply>";
940
941 return;
942 }
943
944 if ($subop == "scheduleFeedUpdate") {
945 $feed_id = db_escape_string($_REQUEST["id"]);
946 $is_cat = db_escape_string($_REQUEST['is_cat']) == 'true';
947
948 $message = __("Your request could not be completed.");
949
950 if ($feed_id >= 0) {
951 if (!$is_cat) {
952 $message = __("Feed update has been scheduled.");
953
954 db_query($link, "UPDATE ttrss_feeds SET
955 last_update_started = '1970-01-01',
956 last_updated = '1970-01-01' WHERE id = '$feed_id' AND
957 owner_uid = ".$_SESSION["uid"]);
958
959 } else {
960 $message = __("Category update has been scheduled.");
961
962 if ($feed_id)
963 $cat_query = "cat_id = '$feed_id'";
964 else
965 $cat_query = "cat_id IS NULL";
966
967 db_query($link, "UPDATE ttrss_feeds SET
968 last_update_started = '1970-01-01',
969 last_updated = '1970-01-01' WHERE $cat_query AND
970 owner_uid = ".$_SESSION["uid"]);
971 }
972 } else {
973 $message = __("Can't update this kind of feed.");
974 }
975
976 print "<rpc-reply>";
977 print "<message>$message</message>";
978 print "</rpc-reply>";
979
980 return;
981 }
982
983 if ($subop == "getTweetInfo") {
984 header("Content-Type: text/plain");
985 $id = db_escape_string($_REQUEST['id']);
986
987 $result = db_query($link, "SELECT title, link
988 FROM ttrss_entries, ttrss_user_entries
989 WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']);
990
991 if (db_num_rows($result) != 0) {
992 $title = truncate_string(strip_tags(db_fetch_result($result, 0, 'title')),
993 100, '...');
994 $article_link = db_fetch_result($result, 0, 'link');
995 }
996
997 print json_encode(array("title" => $title, "link" => $article_link,
998 "id" => $id));
999
1000 return;
1001 }
1002
1003 print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";
1004 }
1005 ?>