]> git.wh0rd.org - tt-rss.git/blob - backend.php
cleanup notify box on successful refetch
[tt-rss.git] / backend.php
1 <?
2 session_start();
3
4 header("Cache-Control: no-cache, must-revalidate");
5 header("Pragma: no-cache");
6 header("Expires: -1");
7
8 if ($_GET["debug"]) {
9 define('DEFAULT_ERROR_LEVEL', E_ALL);
10 } else {
11 define('DEFAULT_ERROR_LEVEL', E_ERROR | E_WARNING | E_PARSE);
12 }
13
14 error_reporting(DEFAULT_ERROR_LEVEL);
15
16 $op = $_REQUEST["op"];
17
18 if ((!$op || $op == "rpc" || $op == "globalUpdateFeeds") && !$_REQUEST["noxml"]) {
19 header("Content-Type: application/xml");
20 }
21
22 if (!$_SESSION["uid"] && $op != "globalUpdateFeeds") {
23
24 if ($op == "rpc") {
25 print "<error error-code=\"6\"/>";
26 }
27 exit;
28 }
29
30 if (!$op) {
31 print "<error error-code=\"7\"/>";
32 exit;
33 }
34
35 define('SCHEMA_VERSION', 6);
36
37 require_once "sanity_check.php";
38 require_once "config.php";
39 require_once "db.php";
40 require_once "db-prefs.php";
41 require_once "functions.php";
42 require_once "magpierss/rss_fetch.inc";
43
44 $script_started = getmicrotime();
45
46 $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
47
48 if (!$link) {
49 if (DB_TYPE == "mysql") {
50 print mysql_error();
51 }
52 // PG seems to display its own errors just fine by default.
53 return;
54 }
55
56 if (DB_TYPE == "pgsql") {
57 pg_query("set client_encoding = 'utf-8'");
58 }
59
60 if ($_SESSION["uid"]) {
61 if (get_pref($link, "HIDE_READ_FEEDS") == "true") {
62 setcookie("ttrss_vf_hreadf", 1);
63 } else {
64 setcookie("ttrss_vf_hreadf", 0);
65 }
66
67 setcookie('ttrss_vf_refresh', FEEDS_FRAME_REFRESH);
68 setcookie('ttrss_vf_daemon', ENABLE_UPDATE_DAEMON);
69 }
70
71 $fetch = $_GET["fetch"];
72
73 setcookie("ttrss_icons_url", ICONS_URL);
74
75 if (!sanity_check($link)) { return; }
76
77 function getAllCounters($link) {
78 getLabelCounters($link);
79 getFeedCounters($link);
80 getTagCounters($link);
81 getGlobalCounters($link);
82 if (get_pref($link, 'ENABLE_FEED_CATS')) {
83 getCategoryCounters($link);
84 }
85 }
86
87 function getCategoryCounters($link) {
88 $result = db_query($link, "SELECT cat_id,SUM((SELECT COUNT(int_id)
89 FROM ttrss_user_entries WHERE feed_id = ttrss_feeds.id
90 AND unread = true)) AS unread FROM ttrss_feeds
91 WHERE
92 owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id");
93
94 while ($line = db_fetch_assoc($result)) {
95 $line["cat_id"] = sprintf("%d", $line["cat_id"]);
96 print "<counter type=\"category\" id=\"".$line["cat_id"]."\" counter=\"".
97 $line["unread"]."\"/>";
98 }
99 }
100
101 function getFeedUnread($link, $feed) {
102 $n_feed = sprintf("%d", $feed);
103
104 if ($n_feed == -1) {
105 $match_part = "marked = true";
106 } else if ($feed > 0) {
107 $match_part = "feed_id = '$n_feed'";
108 } else if ($feed < -10) {
109 $label_id = -$feed - 11;
110
111 $result = db_query($link, "SELECT sql_exp FROM ttrss_labels WHERE
112 id = '$label_id' AND owner_uid = " . $_SESSION["uid"]);
113
114 $match_part = db_fetch_result($result, 0, "sql_exp");
115 }
116
117 if ($match_part) {
118
119 $result = db_query($link, "SELECT count(int_id) AS unread
120 FROM ttrss_user_entries
121 WHERE unread = true AND $match_part AND owner_uid = " . $_SESSION["uid"]);
122
123 } else {
124
125 $result = db_query($link, "SELECT COUNT(post_int_id) AS unread
126 FROM ttrss_tags,ttrss_user_entries
127 WHERE tag_name = '$feed' AND post_int_id = int_id AND unread = true AND
128 ttrss_tags.owner_uid = " . $_SESSION["uid"]);
129 }
130
131 $unread = db_fetch_result($result, 0, "unread");
132 return $unread;
133 }
134
135 /* FIXME this needs reworking */
136
137 function getGlobalUnread($link) {
138 $result = db_query($link, "SELECT count(id) as c_id FROM ttrss_entries,ttrss_user_entries
139 WHERE unread = true AND
140 ttrss_user_entries.ref_id = ttrss_entries.id AND
141 owner_uid = " . $_SESSION["uid"]);
142 $c_id = db_fetch_result($result, 0, "c_id");
143 return $c_id;
144 }
145
146 function getGlobalCounters($link, $global_unread = -1) {
147 if ($global_unread == -1) {
148 $global_unread = getGlobalUnread($link);
149 }
150 print "<counter type=\"global\" id='global-unread' counter='$global_unread'/>";
151 }
152
153 function getTagCounters($link, $smart_mode = SMART_RPC_COUNTERS) {
154
155 if ($smart_mode) {
156 if (!$_SESSION["tctr_last_value"]) {
157 $_SESSION["tctr_last_value"] = array();
158 }
159 }
160
161 $old_counters = $_SESSION["tctr_last_value"];
162
163 $tctrs_modified = false;
164
165 /* $result = db_query($link, "SELECT tag_name,count(ttrss_entries.id) AS count
166 FROM ttrss_tags,ttrss_entries,ttrss_user_entries WHERE
167 ttrss_user_entries.ref_id = ttrss_entries.id AND
168 ttrss_tags.owner_uid = ".$_SESSION["uid"]." AND
169 post_int_id = ttrss_user_entries.int_id AND unread = true GROUP BY tag_name
170 UNION
171 select tag_name,0 as count FROM ttrss_tags
172 WHERE ttrss_tags.owner_uid = ".$_SESSION["uid"]); */
173
174 $result = db_query($link, "SELECT tag_name,SUM((SELECT COUNT(int_id)
175 FROM ttrss_user_entries WHERE int_id = post_int_id
176 AND unread = true)) AS count FROM ttrss_tags
177 WHERE owner_uid = 2 GROUP BY tag_name ORDER BY tag_name");
178
179 $tags = array();
180
181 while ($line = db_fetch_assoc($result)) {
182 $tags[$line["tag_name"]] += $line["count"];
183 }
184
185 foreach (array_keys($tags) as $tag) {
186 $unread = $tags[$tag];
187
188 $tag = htmlspecialchars($tag);
189
190 if (!$smart_mode || $old_counters[$tag] != $unread) {
191 $old_counters[$tag] = $unread;
192 $tctrs_modified = true;
193 print "<counter type=\"tag\" id=\"$tag\" counter=\"$unread\"/>";
194 }
195
196 }
197
198 if ($smart_mode && $tctrs_modified) {
199 $_SESSION["tctr_last_value"] = $old_counters;
200 }
201
202 }
203
204 function getLabelCounters($link, $smart_mode = SMART_RPC_COUNTERS) {
205
206 if ($smart_mode) {
207 if (!$_SESSION["lctr_last_value"]) {
208 $_SESSION["lctr_last_value"] = array();
209 }
210 }
211
212 $old_counters = $_SESSION["lctr_last_value"];
213 $lctrs_modified = false;
214
215 $result = db_query($link, "SELECT count(id) as count FROM ttrss_entries,ttrss_user_entries
216 WHERE marked = true AND ttrss_user_entries.ref_id = ttrss_entries.id AND
217 unread = true AND owner_uid = ".$_SESSION["uid"]);
218
219 $count = db_fetch_result($result, 0, "count");
220
221 print "<counter type=\"label\" id=\"-1\" counter=\"$count\"/>";
222
223 $result = db_query($link, "SELECT owner_uid,id,sql_exp,description FROM
224 ttrss_labels WHERE owner_uid = ".$_SESSION["uid"]." ORDER by description");
225
226 while ($line = db_fetch_assoc($result)) {
227
228 $id = -$line["id"] - 11;
229
230 error_reporting (0);
231
232 $tmp_result = db_query($link, "SELECT count(id) as count FROM ttrss_user_entries,ttrss_entries
233 WHERE (" . $line["sql_exp"] . ") AND unread = true AND
234 ttrss_user_entries.ref_id = ttrss_entries.id AND
235 owner_uid = ".$_SESSION["uid"]);
236
237 $count = db_fetch_result($tmp_result, 0, "count");
238
239 if (!$smart_mode || $old_counters[$id] != $count) {
240 $old_counters[$id] = $count;
241 $lctrs_modified = true;
242 print "<counter type=\"label\" id=\"$id\" counter=\"$count\"/>";
243 }
244
245 error_reporting (DEFAULT_ERROR_LEVEL);
246 }
247
248 if ($smart_mode && $lctrs_modified) {
249 $_SESSION["lctr_last_value"] = $old_counters;
250 }
251 }
252
253 /* function getFeedCounter($link, $id) {
254
255 $result = db_query($link, "SELECT
256 count(id) as count,last_error
257 FROM ttrss_entries,ttrss_user_entries,ttrss_feeds
258 WHERE feed_id = '$id' AND unread = true
259 AND ttrss_user_entries.feed_id = ttrss_feeds.id
260 AND ttrss_user_entries.ref_id = ttrss_entries.id");
261
262 $count = db_fetch_result($result, 0, "count");
263 $last_error = htmlspecialchars(db_fetch_result($result, 0, "last_error"));
264
265 print "<counter type=\"feed\" id=\"$id\" counter=\"$count\" error=\"$last_error\"/>";
266 } */
267
268 function getFeedCounters($link, $smart_mode = SMART_RPC_COUNTERS) {
269
270 if ($smart_mode) {
271 if (!$_SESSION["fctr_last_value"]) {
272 $_SESSION["fctr_last_value"] = array();
273 }
274 }
275
276 $old_counters = $_SESSION["fctr_last_value"];
277
278 $result = db_query($link, "SELECT id,last_error,parent_feed,
279 (SELECT count(id)
280 FROM ttrss_entries,ttrss_user_entries
281 WHERE feed_id = ttrss_feeds.id AND
282 ttrss_user_entries.ref_id = ttrss_entries.id
283 AND unread = true AND owner_uid = ".$_SESSION["uid"].") as count
284 FROM ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"] . "
285 AND parent_feed IS NULL");
286
287 $fctrs_modified = false;
288
289 while ($line = db_fetch_assoc($result)) {
290
291 $id = $line["id"];
292 $count = $line["count"];
293 $last_error = htmlspecialchars($line["last_error"]);
294
295 $has_img = is_file(ICONS_DIR . "/$id.ico");
296
297 $tmp_result = db_query($link,
298 "SELECT id,COUNT(unread) AS unread
299 FROM ttrss_feeds LEFT JOIN ttrss_user_entries
300 ON (ttrss_feeds.id = ttrss_user_entries.feed_id)
301 WHERE parent_feed = '$id' AND unread = true GROUP BY ttrss_feeds.id");
302
303 if (db_num_rows($tmp_result) > 0) {
304 while ($l = db_fetch_assoc($tmp_result)) {
305 $count += $l["unread"];
306 }
307 }
308
309 if (!$smart_mode || $old_counters[$id] != $count) {
310 $old_counters[$id] = $count;
311 $fctrs_modified = true;
312
313 if ($last_error) {
314 $error_part = "error=\"$last_error\"";
315 } else {
316 $error_part = "";
317 }
318
319 if ($has_img) {
320 $has_img_part = "hi=\"$has_img\"";
321 } else {
322 $has_img_part = "";
323 }
324
325 print "<counter type=\"feed\" id=\"$id\" counter=\"$count\" $has_img_part $error_part/>";
326 }
327 }
328
329 if ($smart_mode && $fctrs_modified) {
330 $_SESSION["fctr_last_value"] = $old_counters;
331 }
332 }
333
334 function outputFeedList($link, $tags = false) {
335
336 print "<html><head>
337 <title>Tiny Tiny RSS : Feedlist</title>
338 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
339
340 $user_theme = $_SESSION["theme"];
341 if ($user_theme) {
342 print "<link rel=\"stylesheet\" type=\"text/css\"
343 href=\"themes/$user_theme/theme.css\">";
344 }
345
346 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
347 print "<link rel=\"stylesheet\" type=\"text/css\"
348 href=\"tt-rss_compact.css\"/>";
349 } else {
350 print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\"
351 type=\"text/css\" href=\"tt-rss_compact.css\"/>";
352 }
353
354 print "<script type=\"text/javascript\" src=\"functions.js\"></script>
355 <script type=\"text/javascript\" src=\"feedlist.js\"></script>
356 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
357 <!--[if gte IE 5.5000]>
358 <script type=\"text/javascript\" src=\"pngfix.js\"></script>
359 <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss-ie.css\">
360 <![endif]-->
361 </head><body>
362 <script type=\"text/javascript\">
363 if (document.addEventListener) {
364 document.addEventListener(\"DOMContentLoaded\", init, null);
365 }
366 window.onload = init;
367 </script>";
368
369 print "<ul class=\"feedList\" id=\"feedList\">\n";
370
371 $owner_uid = $_SESSION["uid"];
372
373 if (!$tags) {
374
375 /* virtual feeds */
376
377 if (get_pref($link, 'ENABLE_FEED_CATS')) {
378 print "<li class=\"feedCat\">Special</li>";
379 print "<li id=\"feedCatHolder\"><ul class=\"feedCatList\">";
380 }
381
382 $result = db_query($link, "SELECT count(id) as num_starred
383 FROM ttrss_entries,ttrss_user_entries
384 WHERE marked = true AND
385 ttrss_user_entries.ref_id = ttrss_entries.id AND
386 unread = true AND owner_uid = '$owner_uid'");
387 $num_starred = db_fetch_result($result, 0, "num_starred");
388
389 $class = "virt";
390
391 if ($num_starred > 0) $class .= "Unread";
392
393 printFeedEntry(-1, $class, "Starred articles", $num_starred,
394 "images/mark_set.png", $link);
395
396 if (get_pref($link, 'ENABLE_FEED_CATS')) {
397 print "</ul>\n";
398 }
399
400 if (GLOBAL_ENABLE_LABELS && get_pref($link, 'ENABLE_LABELS')) {
401
402 $result = db_query($link, "SELECT id,sql_exp,description FROM
403 ttrss_labels WHERE owner_uid = '$owner_uid' ORDER by description");
404
405 if (db_num_rows($result) > 0) {
406 if (get_pref($link, 'ENABLE_FEED_CATS')) {
407 print "<li class=\"feedCat\">Labels</li>";
408 print "<li id=\"feedCatHolder\"><ul class=\"feedCatList\">";
409 } else {
410 print "<li><hr></li>";
411 }
412 }
413
414 while ($line = db_fetch_assoc($result)) {
415
416 error_reporting (0);
417
418 $tmp_result = db_query($link, "SELECT count(id) as count
419 FROM ttrss_entries,ttrss_user_entries
420 WHERE (" . $line["sql_exp"] . ") AND unread = true AND
421 ttrss_user_entries.ref_id = ttrss_entries.id
422 AND owner_uid = '$owner_uid'");
423
424 $count = db_fetch_result($tmp_result, 0, "count");
425
426 $class = "label";
427
428 if ($count > 0) {
429 $class .= "Unread";
430 }
431
432 error_reporting (DEFAULT_ERROR_LEVEL);
433
434 printFeedEntry(-$line["id"]-11,
435 $class, $line["description"], $count, "images/label.png", $link);
436
437 }
438
439 if (db_num_rows($result) > 0) {
440 if (get_pref($link, 'ENABLE_FEED_CATS')) {
441 print "</ul>";
442 }
443 }
444
445 }
446
447 // if (!get_pref($link, 'ENABLE_FEED_CATS')) {
448 print "<li><hr></li>";
449 // }
450
451 if (get_pref($link, 'ENABLE_FEED_CATS')) {
452 $order_by_qpart = "category,title";
453 } else {
454 $order_by_qpart = "title";
455 }
456
457 $result = db_query($link, "SELECT ttrss_feeds.*,
458 (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
459 WHERE feed_id = ttrss_feeds.id AND
460 ttrss_user_entries.ref_id = ttrss_entries.id AND
461 owner_uid = '$owner_uid') AS total,
462 (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
463 WHERE feed_id = ttrss_feeds.id AND unread = true
464 AND ttrss_user_entries.ref_id = ttrss_entries.id
465 AND owner_uid = '$owner_uid') as unread,
466 cat_id,last_error,
467 ttrss_feed_categories.title AS category,
468 ttrss_feed_categories.collapsed
469 FROM ttrss_feeds LEFT JOIN ttrss_feed_categories
470 ON (ttrss_feed_categories.id = cat_id)
471 WHERE
472 ttrss_feeds.owner_uid = '$owner_uid' AND parent_feed IS NULL
473 ORDER BY $order_by_qpart");
474
475 $actid = $_GET["actid"];
476
477 /* real feeds */
478
479 $lnum = 0;
480
481 $total_unread = 0;
482
483 $category = "";
484
485 while ($line = db_fetch_assoc($result)) {
486
487 $feed = db_unescape_string($line["title"]);
488 $feed_id = $line["id"];
489
490 $subop = $_GET["subop"];
491
492 $total = $line["total"];
493 $unread = $line["unread"];
494
495 $tmp_result = db_query($link,
496 "SELECT id,COUNT(unread) AS unread
497 FROM ttrss_feeds LEFT JOIN ttrss_user_entries
498 ON (ttrss_feeds.id = ttrss_user_entries.feed_id)
499 WHERE parent_feed = '$feed_id' AND unread = true
500 GROUP BY ttrss_feeds.id");
501
502 if (db_num_rows($tmp_result) > 0) {
503 while ($l = db_fetch_assoc($tmp_result)) {
504 $unread += $l["unread"];
505 }
506 }
507
508 $cat_id = $line["cat_id"];
509
510 $tmp_category = $line["category"];
511
512 if (!$tmp_category) {
513 $tmp_category = "Uncategorized";
514 }
515
516 // $class = ($lnum % 2) ? "even" : "odd";
517
518 if ($line["last_error"]) {
519 $class = "error";
520 } else {
521 $class = "feed";
522 }
523
524 if ($unread > 0) $class .= "Unread";
525
526 if ($actid == $feed_id) {
527 $class .= "Selected";
528 }
529
530 $total_unread += $unread;
531
532 if ($category != $tmp_category && get_pref($link, 'ENABLE_FEED_CATS')) {
533
534 if ($category) {
535 print "</ul></li>";
536 }
537
538 $category = $tmp_category;
539
540 $collapsed = $line["collapsed"];
541
542 // workaround for NULL category
543 if ($category == "Uncategorized") {
544 if ($_COOKIE["ttrss_vf_uclps"] == 1) {
545 $collapsed = "t";
546 }
547 }
548
549 if ($collapsed == "t" || $collapsed == "1") {
550 $holder_class = "invisible";
551 $ellipsis = "...";
552 } else {
553 $holder_class = "";
554 $ellipsis = "";
555 }
556
557 if ($cat_id) {
558 $cat_id_qpart = "cat_id = '$cat_id'";
559 } else {
560 $cat_id_qpart = "cat_id IS NULL";
561 }
562
563 $tmp_result = db_query($link, "SELECT count(int_id) AS unread
564 FROM ttrss_user_entries,ttrss_feeds WHERE
565 unread = true AND
566 feed_id = ttrss_feeds.id AND $cat_id_qpart AND
567 ttrss_user_entries.owner_uid = " . $_SESSION["uid"]);
568
569 $cat_unread = db_fetch_result($tmp_result, 0, "unread");
570
571 $cat_id = sprintf("%d", $cat_id);
572
573 print "<li class=\"feedCat\" id=\"FCAT-$cat_id\">
574 <a href=\"javascript:toggleCollapseCat($cat_id)\">$tmp_category
575 <span id=\"FCATCTR-$cat_id\"
576 class=\"$catctr_class\">($cat_unread unread)$ellipsis</span></a></li>";
577
578 // !!! NO SPACE before <ul...feedCatList - breaks firstChild DOM function
579 // -> keyboard navigation, etc.
580 print "<li id=\"feedCatHolder\" class=\"$holder_class\"><ul class=\"feedCatList\" id=\"FCATLIST-$cat_id\">";
581 }
582
583 printFeedEntry($feed_id, $class, $feed, $unread,
584 "icons/$feed_id.ico", $link);
585
586 ++$lnum;
587 }
588
589 } else {
590
591 // tags
592
593 /* $result = db_query($link, "SELECT tag_name,count(ttrss_entries.id) AS count
594 FROM ttrss_tags,ttrss_entries,ttrss_user_entries WHERE
595 post_int_id = ttrss_user_entries.int_id AND
596 unread = true AND ref_id = ttrss_entries.id
597 AND ttrss_tags.owner_uid = '$owner_uid' GROUP BY tag_name
598 UNION
599 select tag_name,0 as count FROM ttrss_tags WHERE owner_uid = '$owner_uid'
600 ORDER BY tag_name"); */
601
602 $result = db_query($link, "SELECT tag_name,SUM((SELECT COUNT(int_id)
603 FROM ttrss_user_entries WHERE int_id = post_int_id
604 AND unread = true)) AS count FROM ttrss_tags
605 WHERE owner_uid = 2 GROUP BY tag_name ORDER BY tag_name");
606
607 $tags = array();
608
609 while ($line = db_fetch_assoc($result)) {
610 $tags[$line["tag_name"]] += $line["count"];
611 }
612
613 foreach (array_keys($tags) as $tag) {
614
615 $unread = $tags[$tag];
616
617 $class = "tag";
618
619 if ($unread > 0) {
620 $class .= "Unread";
621 }
622
623 printFeedEntry($tag, $class, $tag, $unread, "images/tag.png", $link);
624
625 }
626
627 }
628
629 if (db_num_rows($result) == 0) {
630 if ($tags) {
631 $what = "tags";
632 } else {
633 $what = "feeds";
634 }
635 print "<li>No $what to display.</li>";
636 }
637
638 print "</ul>";
639
640 print '
641 <script type="text/javascript">
642 /* for IE */
643 function statechange() {
644 if (document.readyState == "interactive") init();
645 }
646
647 if (document.readyState) {
648 if (document.readyState == "interactive" || document.readyState == "complete") {
649 init();
650 } else {
651 document.onreadystatechange = statechange;
652 }
653 }
654 </script></body></html>';
655 }
656
657
658 if ($op == "rpc") {
659
660 $subop = $_GET["subop"];
661
662 if ($subop == "setpref") {
663 if (WEB_DEMO_MODE) {
664 return;
665 }
666
667 print "<rpc-reply>";
668
669 $key = db_escape_string($_GET["key"]);
670 $value = db_escape_string($_GET["value"]);
671
672 set_pref($link, $key, $value);
673
674 print "<param-set key=\"$key\" value=\"$value\"/>";
675
676 print "</rpc-reply>";
677
678 }
679
680 if ($subop == "getLabelCounters") {
681 $aid = $_GET["aid"];
682 print "<rpc-reply>";
683 getLabelCounters($link);
684 if ($aid) {
685 getFeedCounter($link, $aid);
686 }
687 print "</rpc-reply>";
688 }
689
690 if ($subop == "getFeedCounters") {
691 print "<rpc-reply>";
692 getFeedCounters($link);
693 print "</rpc-reply>";
694 }
695
696 if ($subop == "getAllCounters") {
697 print "<rpc-reply>";
698 getAllCounters($link);
699 print "</rpc-reply>";
700 }
701
702 if ($subop == "mark") {
703 $mark = $_GET["mark"];
704 $id = db_escape_string($_GET["id"]);
705
706 if ($mark == "1") {
707 $mark = "true";
708 } else {
709 $mark = "false";
710 }
711
712 // FIXME this needs collision testing
713
714 $result = db_query($link, "UPDATE ttrss_user_entries SET marked = $mark
715 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
716 }
717
718 if ($subop == "updateFeed") {
719 $feed_id = db_escape_string($_GET["feed"]);
720
721 $result = db_query($link,
722 "SELECT feed_url FROM ttrss_feeds WHERE id = '$feed_id'
723 AND owner_uid = " . $_SESSION["uid"]);
724
725 if (db_num_rows($result) > 0) {
726 $feed_url = db_fetch_result($result, 0, "feed_url");
727 update_rss_feed($link, $feed_url, $feed_id);
728 }
729
730 print "<rpc-reply>";
731 getFeedCounter($link, $feed_id);
732 print "</rpc-reply>";
733
734 return;
735 }
736
737 if ($subop == "forceUpdateAllFeeds" || $subop == "updateAllFeeds") {
738
739 if (ENABLE_UPDATE_DAEMON) {
740
741 if ($subop == "forceUpdateAllFeeds") {
742
743 $result = db_query($link, "SELECT count(id) AS cid FROM
744 ttrss_scheduled_updates WHERE feed_id IS NULL AND
745 owner_uid = " . $_SESSION["uid"]);
746
747 $cid = db_fetch_result($result, 0, "cid");
748
749 # print "<rpc-reply>";
750
751 if ($cid == 0) {
752
753 db_query($link, "INSERT INTO ttrss_scheduled_updates
754 (owner_uid, feed_id, entered) VALUES
755 (".$_SESSION["uid"].", NULL, NOW())");
756
757 // print "<!-- ScheduledOK -->";
758
759 } else {
760 // print "<!-- RequestAlreadyInQueue -->";
761 }
762
763 # print "</rpc-reply>";
764 }
765
766 } else {
767 update_all_feeds($link, $subop == "forceUpdateAllFeeds");
768 }
769
770 $global_unread_caller = sprintf("%d", $_GET["uctr"]);
771 $global_unread = getGlobalUnread($link);
772
773 print "<rpc-reply>";
774
775 if ($global_unread_caller != $global_unread) {
776
777 $omode = $_GET["omode"];
778
779 if (!$omode) $omode = "tflc";
780
781 if (strchr($omode, "l")) getLabelCounters($link);
782 if (strchr($omode, "f")) getFeedCounters($link);
783 if (strchr($omode, "t")) getTagCounters($link);
784 if (strchr($omode, "c")) {
785 if (get_pref($link, 'ENABLE_FEED_CATS')) {
786 getCategoryCounters($link);
787 }
788 }
789 }
790
791 getGlobalCounters($link, $global_unread);
792
793 print "</rpc-reply>";
794
795 }
796
797 /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */
798 if ($subop == "catchupSelected") {
799
800 $ids = split(",", db_escape_string($_GET["ids"]));
801
802 $cmode = sprintf("%d", $_GET["cmode"]);
803
804 foreach ($ids as $id) {
805
806 if ($cmode == 0) {
807 db_query($link, "UPDATE ttrss_user_entries SET
808 unread = false,last_read = NOW()
809 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
810 } else if ($cmode == 1) {
811 db_query($link, "UPDATE ttrss_user_entries SET
812 unread = true
813 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
814 } else {
815 db_query($link, "UPDATE ttrss_user_entries SET
816 unread = NOT unread,last_read = NOW()
817 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
818 }
819 }
820 print "<rpc-reply>";
821 getAllCounters($link);
822 print "</rpc-reply>";
823 }
824
825 if ($subop == "markSelected") {
826
827 $ids = split(",", db_escape_string($_GET["ids"]));
828
829 $cmode = sprintf("%d", $_GET["cmode"]);
830
831 foreach ($ids as $id) {
832
833 if ($cmode == 0) {
834 db_query($link, "UPDATE ttrss_user_entries SET
835 marked = false
836 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
837 } else if ($cmode == 1) {
838 db_query($link, "UPDATE ttrss_user_entries SET
839 marked = true
840 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
841 } else {
842 db_query($link, "UPDATE ttrss_user_entries SET
843 marked = NOT marked
844 WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
845 }
846 }
847 print "<rpc-reply>";
848 getAllCounters($link);
849 print "</rpc-reply>";
850 }
851
852 if ($subop == "sanityCheck") {
853 if (sanity_check($link)) {
854 print "<error error-code=\"0\"/>";
855 }
856 }
857
858 if ($subop == "globalPurge") {
859
860 print "<rpc-reply>";
861 global_purge_old_posts($link, true);
862 print "</rpc-reply>";
863
864 }
865
866 }
867
868 if ($op == "feeds") {
869
870 $tags = $_GET["tags"];
871
872 $subop = $_GET["subop"];
873
874 if ($subop == "catchupAll") {
875 db_query($link, "UPDATE ttrss_user_entries SET
876 last_read = NOW(),unread = false WHERE owner_uid = " . $_SESSION["uid"]);
877 }
878
879 if ($subop == "collapse") {
880 $cat_id = db_escape_string($_GET["cid"]);
881
882 db_query($link, "UPDATE ttrss_feed_categories SET
883 collapsed = NOT collapsed WHERE id = '$cat_id' AND owner_uid = " .
884 $_SESSION["uid"]);
885 return;
886 }
887
888 outputFeedList($link, $tags);
889
890 }
891
892 if ($op == "view") {
893
894 $id = $_GET["id"];
895 $feed_id = $_GET["feed"];
896
897 $result = db_query($link, "UPDATE ttrss_user_entries
898 SET unread = false,last_read = NOW()
899 WHERE ref_id = '$id' AND feed_id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
900
901 $result = db_query($link, "SELECT title,link,content,feed_id,comments,int_id,
902 SUBSTRING(updated,1,16) as updated,
903 (SELECT icon_url FROM ttrss_feeds WHERE id = feed_id) as icon_url,
904 num_comments,
905 author
906 FROM ttrss_entries,ttrss_user_entries
907 WHERE id = '$id' AND ref_id = id");
908
909 print "<html><head>
910 <title>Tiny Tiny RSS : Article $id</title>
911 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
912
913 $user_theme = $_SESSION["theme"];
914 if ($user_theme) {
915 print "<link rel=\"stylesheet\" type=\"text/css\"
916 href=\"themes/$user_theme/theme.css\">";
917 }
918
919 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
920 print "<link rel=\"stylesheet\" type=\"text/css\"
921 href=\"tt-rss_compact.css\"/>";
922 } else {
923 print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\"
924 type=\"text/css\" href=\"tt-rss_compact.css\"/>";
925 }
926
927 print "<script type=\"text/javascript\" src=\"functions.js\"></script>
928 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
929 </head><body>";
930
931 if ($result) {
932
933 $line = db_fetch_assoc($result);
934
935 if ($line["icon_url"]) {
936 $feed_icon = "<img class=\"feedIcon\" src=\"" . $line["icon_url"] . "\">";
937 } else {
938 $feed_icon = "&nbsp;";
939 }
940
941 /* if ($line["comments"] && $line["link"] != $line["comments"]) {
942 $entry_comments = "(<a href=\"".$line["comments"]."\">Comments</a>)";
943 } else {
944 $entry_comments = "";
945 } */
946
947 $num_comments = $line["num_comments"];
948 $entry_comments = "";
949
950 if ($num_comments > 0) {
951 if ($line["comments"]) {
952 $comments_url = $line["comments"];
953 } else {
954 $comments_url = $line["link"];
955 }
956 $entry_comments = "<a href=\"$comments_url\">$num_comments comments</a>";
957 } else {
958 if ($line["comments"] && $line["link"] != $line["comments"]) {
959 $entry_comments = "<a href=\"".$line["comments"]."\">comments</a>";
960 }
961 }
962
963 print "<div class=\"postReply\">";
964
965 print "<div class=\"postHeader\"><table width=\"100%\">";
966
967 $entry_author = $line["author"];
968
969 if ($entry_author) {
970 $entry_author = " - by $entry_author";
971 }
972
973 print "<tr><td><a href=\"" . $line["link"] . "\">" . $line["title"] .
974 "</a>$entry_author</td>";
975
976 $parsed_updated = date(get_pref($link, 'LONG_DATE_FORMAT'),
977 strtotime($line["updated"]));
978
979 print "<td class=\"postDate\">$parsed_updated</td>";
980
981 print "</tr>";
982
983 $tmp_result = db_query($link, "SELECT DISTINCT tag_name FROM
984 ttrss_tags WHERE post_int_id = " . $line["int_id"] . "
985 ORDER BY tag_name");
986
987 $tags_str = "";
988 $f_tags_str = "";
989
990 $num_tags = 0;
991
992 while ($tmp_line = db_fetch_assoc($tmp_result)) {
993 $num_tags++;
994 $tag = $tmp_line["tag_name"];
995 $tag_str = "<a href=\"javascript:parent.viewfeed('$tag')\">$tag</a>, ";
996
997 if ($num_tags == 5) {
998 $tags_str .= "<a href=\"javascript:showBlockElement('allEntryTags')\">...</a>";
999 } else if ($num_tags < 5) {
1000 $tags_str .= $tag_str;
1001 }
1002 $f_tags_str .= $tag_str;
1003 }
1004
1005 $tags_str = preg_replace("/, $/", "", $tags_str);
1006 $f_tags_str = preg_replace("/, $/", "", $f_tags_str);
1007
1008 // $truncated_link = truncate_string($line["link"], 60);
1009
1010 if ($tags_str || $entry_comments) {
1011 print "<tr><td width='50%'>
1012 $entry_comments</td>
1013 <td align=\"right\">$tags_str</td></tr>";
1014 }
1015
1016 print "</table></div>";
1017
1018 print "<div class=\"postIcon\">" . $feed_icon . "</div>";
1019 print "<div class=\"postContent\">";
1020
1021 if (db_num_rows($tmp_result) > 5) {
1022 print "<div id=\"allEntryTags\">Tags: $f_tags_str</div>";
1023 }
1024
1025 print $line["content"] . "</div>";
1026
1027 print "</div>";
1028
1029 print "<script type=\"text/javascript\">
1030 update_all_counters('$feed_id');
1031 </script>";
1032 }
1033
1034 print "</body></html>";
1035 }
1036
1037 if ($op == "viewfeed") {
1038
1039 $feed = $_GET["feed"];
1040 $skip = $_GET["skip"];
1041 $subop = $_GET["subop"];
1042 $view_mode = $_GET["view"];
1043 $limit = $_GET["limit"];
1044
1045 if (!$feed) {
1046 return;
1047 }
1048
1049 if (!$skip) $skip = 0;
1050
1051 if ($subop == "undefined") $subop = "";
1052
1053 print "<html><head>
1054 <title>Tiny Tiny RSS : Feed $feed</title>
1055 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
1056
1057 $user_theme = $_SESSION["theme"];
1058 if ($user_theme) {
1059 print "<link rel=\"stylesheet\" type=\"text/css\"
1060 href=\"themes/$user_theme/theme.css\">";
1061 }
1062
1063 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
1064 print "<link rel=\"stylesheet\"
1065 type=\"text/css\" href=\"tt-rss_compact.css\"/>";
1066
1067 } else {
1068 print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\"
1069 type=\"text/css\" href=\"tt-rss_compact.css\"/>";
1070 }
1071
1072 print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
1073 <script type=\"text/javascript\" src=\"functions.js\"></script>
1074 <script type=\"text/javascript\" src=\"viewfeed.js\"></script>
1075 <!--[if gte IE 5.5000]>
1076 <script type=\"text/javascript\" src=\"pngfix.js\"></script>
1077 <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss-ie.css\">
1078 <![endif]-->
1079 </head><body>
1080 <script type=\"text/javascript\">
1081 if (document.addEventListener) {
1082 document.addEventListener(\"DOMContentLoaded\", init, null);
1083 }
1084 window.onload = init;
1085 </script>";
1086
1087 if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
1088
1089 /* if (ENABLE_UPDATE_DAEMON) {
1090
1091 if ($cid == 0) {
1092
1093 db_query($link, "INSERT INTO ttrss_scheduled_updates
1094 (owner_uid, feed_id, entered) VALUES
1095 (".$_SESSION["uid"].", '$feed', NOW())");
1096 }
1097
1098 } else {
1099 // fixme update_rss_feed...
1100 } */
1101
1102 $tmp_result = db_query($link, "SELECT feed_url FROM ttrss_feeds
1103 WHERE id = '$feed'");
1104 $feed_url = db_fetch_result($tmp_result, 0, "feed_url");
1105 update_rss_feed($link, $feed_url, $feed, ENABLE_UPDATE_DAEMON);
1106 }
1107
1108 if ($subop == "MarkAllRead") {
1109
1110 if (sprintf("%d", $feed) != 0) {
1111
1112 if ($feed > 0) {
1113
1114 $tmp_result = db_query($link, "SELECT id
1115 FROM ttrss_feeds WHERE parent_feed = '$feed'
1116 ORDER BY cat_id,title");
1117
1118 $parent_ids = array();
1119
1120 if (db_num_rows($tmp_result) > 0) {
1121 while ($p = db_fetch_assoc($tmp_result)) {
1122 array_push($parent_ids, "feed_id = " . $p["id"]);
1123 }
1124
1125 $children_qpart = implode(" OR ", $parent_ids);
1126
1127 db_query($link, "UPDATE ttrss_user_entries
1128 SET unread = false,last_read = NOW()
1129 WHERE (feed_id = '$feed' OR $children_qpart)
1130 AND owner_uid = " . $_SESSION["uid"]);
1131
1132 } else {
1133 db_query($link, "UPDATE ttrss_user_entries
1134 SET unread = false,last_read = NOW()
1135 WHERE feed_id = '$feed' AND owner_uid = " . $_SESSION["uid"]);
1136 }
1137
1138 } else if ($feed < 0 && $feed > -10) { // special, like starred
1139
1140 if ($feed == -1) {
1141 db_query($link, "UPDATE ttrss_user_entries
1142 SET unread = false,last_read = NOW()
1143 WHERE marked = true AND owner_uid = ".$_SESSION["uid"]);
1144 }
1145
1146 } else if ($feed < -10) { // label
1147
1148 // TODO make this more efficient
1149
1150 $label_id = -$feed - 11;
1151
1152 $tmp_result = db_query($link, "SELECT sql_exp FROM ttrss_labels
1153 WHERE id = '$label_id'");
1154
1155 if ($tmp_result) {
1156 $sql_exp = db_fetch_result($tmp_result, 0, "sql_exp");
1157
1158 db_query($link, "BEGIN");
1159
1160 $tmp2_result = db_query($link,
1161 "SELECT
1162 int_id
1163 FROM
1164 ttrss_user_entries,ttrss_entries
1165 WHERE
1166 ref_id = id AND
1167 $sql_exp AND
1168 owner_uid = " . $_SESSION["uid"]);
1169
1170 while ($tmp_line = db_fetch_assoc($tmp2_result)) {
1171 db_query($link, "UPDATE
1172 ttrss_user_entries
1173 SET
1174 unread = false, last_read = NOW()
1175 WHERE
1176 int_id = " . $tmp_line["int_id"]);
1177 }
1178
1179 db_query($link, "COMMIT");
1180
1181 /* db_query($link, "UPDATE ttrss_user_entries,ttrss_entries
1182 SET unread = false,last_read = NOW()
1183 WHERE $sql_exp
1184 AND ref_id = id
1185 AND owner_uid = ".$_SESSION["uid"]); */
1186 }
1187 }
1188 } else { // tag
1189 db_query($link, "BEGIN");
1190
1191 $tag_name = db_escape_string($feed);
1192
1193 $result = db_query($link, "SELECT post_int_id FROM ttrss_tags
1194 WHERE tag_name = '$tag_name' AND owner_uid = " . $_SESSION["uid"]);
1195
1196 while ($line = db_fetch_assoc($result)) {
1197 db_query($link, "UPDATE ttrss_user_entries SET
1198 unread = false, last_read = NOW()
1199 WHERE int_id = " . $line["post_int_id"]);
1200 }
1201 db_query($link, "COMMIT");
1202 }
1203
1204 }
1205
1206 $search = db_escape_string($_GET["search"]);
1207 $search_mode = db_escape_string($_GET["smode"]);
1208
1209 if ($search) {
1210 $search_query_part = "(upper(ttrss_entries.title) LIKE upper('%$search%')
1211 OR ttrss_entries.content LIKE '%$search%') AND";
1212 } else {
1213 $search_query_part = "";
1214 }
1215
1216 $view_query_part = "";
1217
1218 if ($view_mode == "Adaptive") {
1219 if ($search) {
1220 $view_query_part = " ";
1221 } else if ($feed != -1) {
1222 $unread = getFeedUnread($link, $feed);
1223 if ($unread > 0) {
1224 $view_query_part = " unread = true AND ";
1225 }
1226 }
1227 }
1228
1229 if ($view_mode == "Starred") {
1230 $view_query_part = " marked = true AND ";
1231 }
1232
1233 if ($view_mode == "Unread") {
1234 $view_query_part = " unread = true AND ";
1235 }
1236
1237 if ($limit && $limit != "All") {
1238 $limit_query_part = "LIMIT " . $limit;
1239 }
1240
1241 $vfeed_query_part = "";
1242
1243 // override query strategy and enable feed display when searching globally
1244 if ($search && $search_mode == "All feeds") {
1245 $query_strategy_part = "ttrss_entries.id > 0";
1246 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
1247 } else if (sprintf("%d", $feed) == 0) {
1248 $query_strategy_part = "ttrss_entries.id > 0";
1249 $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE
1250 id = feed_id) as feed_title,";
1251 } else if ($feed >= 0 && $search && $search_mode == "This category") {
1252
1253 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
1254
1255 $tmp_result = db_query($link, "SELECT id
1256 FROM ttrss_feeds WHERE cat_id =
1257 (SELECT cat_id FROM ttrss_feeds WHERE id = '$feed') AND id != '$feed'");
1258
1259 $cat_siblings = array();
1260
1261 if (db_num_rows($tmp_result) > 0) {
1262 while ($p = db_fetch_assoc($tmp_result)) {
1263 array_push($cat_siblings, "feed_id = " . $p["id"]);
1264 }
1265
1266 $query_strategy_part = sprintf("(feed_id = %d OR %s)",
1267 $feed, implode(" OR ", $cat_siblings));
1268
1269 } else {
1270 $query_strategy_part = "ttrss_entries.id > 0";
1271 }
1272
1273 } else if ($feed >= 0) {
1274
1275 $tmp_result = db_query($link, "SELECT id
1276 FROM ttrss_feeds WHERE parent_feed = '$feed'
1277 ORDER BY cat_id,title");
1278
1279 $parent_ids = array();
1280
1281 if (db_num_rows($tmp_result) > 0) {
1282 while ($p = db_fetch_assoc($tmp_result)) {
1283 array_push($parent_ids, "feed_id = " . $p["id"]);
1284 }
1285
1286 $query_strategy_part = sprintf("(feed_id = %d OR %s)",
1287 $feed, implode(" OR ", $parent_ids));
1288
1289 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
1290 } else {
1291 $query_strategy_part = "feed_id = '$feed'";
1292 }
1293 } else if ($feed == -1) { // starred virtual feed
1294 $query_strategy_part = "marked = true";
1295 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
1296 } else if ($feed <= -10) { // labels
1297 $label_id = -$feed - 11;
1298
1299 $tmp_result = db_query($link, "SELECT sql_exp FROM ttrss_labels
1300 WHERE id = '$label_id'");
1301
1302 $query_strategy_part = db_fetch_result($tmp_result, 0, "sql_exp");
1303
1304 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
1305 } else {
1306 $query_strategy_part = "id > 0"; // dumb
1307 }
1308
1309 $order_by = "updated DESC";
1310
1311 // if ($feed < -10) {
1312 // $order_by = "feed_id,updated DESC";
1313 // }
1314
1315 $feed_title = "";
1316
1317 if ($search && $search_mode == "All feeds") {
1318 $feed_title = "Global search results ($search)";
1319 } else if ($search && sprintf("%d", $feed) == 0) {
1320 $feed_title = "Feed search results ($search, $feed)";
1321 } else if ($feed > 0) {
1322 $result = db_query($link, "SELECT title,site_url,last_error FROM ttrss_feeds
1323 WHERE id = '$feed'");
1324
1325 $feed_title = db_fetch_result($result, 0, "title");
1326 $feed_site_url = db_fetch_result($result, 0, "site_url");
1327 $last_error = db_fetch_result($result, 0, "last_error");
1328
1329 } else if ($feed == -1) {
1330 $feed_title = "Starred articles";
1331 } else if ($feed < -10) {
1332 $label_id = -$feed - 11;
1333 $result = db_query($link, "SELECT description FROM ttrss_labels
1334 WHERE id = '$label_id'");
1335 $feed_title = db_fetch_result($result, 0, "description");
1336 } else {
1337 $feed_title = "?";
1338 }
1339
1340 if ($feed < -10) error_reporting (0);
1341
1342 print "<div id=\"headlinesContainer\">";
1343
1344 if (sprintf("%d", $feed) != 0) {
1345
1346 if ($feed > 0) {
1347 $feed_kind = "Feeds";
1348 } else {
1349 $feed_kind = "Labels";
1350 }
1351
1352 // if (!$vfeed_query_part) {
1353 $content_query_part = "content as content_preview,";
1354 // } else {
1355 // $content_query_part = "";
1356 // }
1357
1358 $result = db_query($link, "SELECT
1359 ttrss_entries.id,ttrss_entries.title,
1360 SUBSTRING(updated,1,16) as updated,
1361 unread,feed_id,marked,link,last_read,
1362 SUBSTRING(last_read,1,19) as last_read_noms,
1363 $vfeed_query_part
1364 $content_query_part
1365 SUBSTRING(updated,1,19) as updated_noms
1366 FROM
1367 ttrss_entries,ttrss_user_entries,ttrss_feeds
1368 WHERE
1369 ttrss_user_entries.feed_id = ttrss_feeds.id AND
1370 ttrss_user_entries.ref_id = ttrss_entries.id AND
1371 ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND
1372 $search_query_part
1373 $view_query_part
1374 $query_strategy_part ORDER BY $order_by
1375 $limit_query_part");
1376
1377 } else {
1378 // browsing by tag
1379
1380 $feed_kind = "Tags";
1381
1382 $result = db_query($link, "SELECT
1383 ttrss_entries.id as id,title,
1384 SUBSTRING(updated,1,16) as updated,
1385 unread,feed_id,
1386 marked,link,last_read,
1387 SUBSTRING(last_read,1,19) as last_read_noms,
1388 $vfeed_query_part
1389 $content_query_part
1390 SUBSTRING(updated,1,19) as updated_noms
1391 FROM
1392 ttrss_entries,ttrss_user_entries,ttrss_tags
1393 WHERE
1394 ref_id = ttrss_entries.id AND
1395 ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND
1396 post_int_id = int_id AND tag_name = '$feed' AND
1397 $view_query_part
1398 $search_query_part
1399 $query_strategy_part ORDER BY $order_by
1400 $limit_query_part");
1401 }
1402
1403 if (!$result) {
1404 print "<div align='center'>
1405 Could not display feed (query failed). Please check label match syntax or local configuration.</div>";
1406 return;
1407 }
1408
1409 function print_headline_subtoolbar($link, $feed_site_url, $feed_title,
1410 $bottom = false) {
1411
1412 if (!$bottom) {
1413 $class = "headlinesSubToolbar";
1414 $tid = "headlineActionsTop";
1415 } else {
1416 $class = "invisible";
1417 $tid = "headlineActionsBottom";
1418 }
1419
1420 print "<table class=\"$class\" id=\"$tid\"
1421 width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
1422
1423 if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1424
1425 print "<td class=\"headlineActions\">
1426 Select:
1427 <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
1428 'RROW-', 'RCHK-', true, '', true)\">All</a>,
1429 <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
1430 'RROW-', 'RCHK-', true, 'Unread', true)\">Unread</a>,
1431 <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
1432 'RROW-', 'RCHK-', false)\">None</a>
1433 &nbsp;&nbsp;
1434 Toggle: <a href=\"javascript:selectionToggleUnread()\">Unread</a>,
1435 <a href=\"javascript:selectionToggleMarked()\">Starred</a>";
1436 print "</td>";
1437
1438 } else {
1439
1440 print "<td class=\"headlineActions\">
1441 Select:
1442 <a href=\"javascript:cdmSelectArticles('all')\">All</a>,
1443 <a href=\"javascript:cdmSelectArticles('unread')\">Unread</a>,
1444 <a href=\"javascript:cdmSelectArticles('none')\">None</a>
1445 &nbsp;&nbsp;
1446 Toggle: <a href=\"javascript:selectionToggleUnread(true)\">Unread</a>,
1447 <a href=\"javascript:selectionToggleMarked(true)\">Starred</a>";
1448
1449 print "</td>";
1450
1451 }
1452
1453 if ($last_error) {
1454 print "<td align='center' class='small'>
1455 <a class=\"warning\" href=\"javascript:alert('TT-RSS encountered an error while trying to update this feed.\\n\\n$last_error')\">Could not update this feed.</a></td>";
1456 }
1457
1458 print "<td class=\"headlineTitle\">";
1459
1460 if ($feed_site_url) {
1461 print "<a target=\"_blank\" href=\"$feed_site_url\">$feed_title</a>";
1462 } else {
1463 print $feed_title;
1464 }
1465
1466 print "</td>";
1467 print "</tr></table>";
1468
1469 }
1470
1471 if (db_num_rows($result) > 0) {
1472
1473 print_headline_subtoolbar($link, $feed_site_url, $feed_title);
1474
1475 if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1476 print "<table class=\"headlinesList\" id=\"headlinesList\"
1477 cellspacing=\"0\" width=\"100%\">";
1478 }
1479
1480 $lnum = 0;
1481
1482 error_reporting (DEFAULT_ERROR_LEVEL);
1483
1484 $num_unread = 0;
1485
1486 while ($line = db_fetch_assoc($result)) {
1487
1488 $class = ($lnum % 2) ? "even" : "odd";
1489
1490 $id = $line["id"];
1491 $feed_id = $line["feed_id"];
1492
1493 if ($line["last_read"] == "" &&
1494 ($line["unread"] != "t" && $line["unread"] != "1")) {
1495
1496 $update_pic = "<img id='FUPDPIC-$id' src=\"images/updated.png\"
1497 alt=\"Updated\">";
1498 } else {
1499 $update_pic = "<img id='FUPDPIC-$id' src=\"images/blank_icon.gif\"
1500 alt=\"Updated\">";
1501 }
1502
1503 if ($line["unread"] == "t" || $line["unread"] == "1") {
1504 $class .= "Unread";
1505 ++$num_unread;
1506 $is_unread = true;
1507 } else {
1508 $is_unread = false;
1509 }
1510
1511 if ($line["marked"] == "t" || $line["marked"] == "1") {
1512 $marked_pic = "<img id=\"FMARKPIC-$id\" src=\"images/mark_set.png\"
1513 alt=\"Reset mark\" onclick='javascript:toggleMark($id)'>";
1514 } else {
1515 $marked_pic = "<img id=\"FMARKPIC-$id\" src=\"images/mark_unset.png\"
1516 alt=\"Set mark\" onclick='javascript:toggleMark($id)'>";
1517 }
1518
1519 $content_link = "<a href=\"javascript:view($id,$feed_id);\">" .
1520 $line["title"] . "</a>";
1521
1522 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
1523 $updated_fmt = smart_date_time(strtotime($line["updated"]));
1524 } else {
1525 $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
1526 $updated_fmt = date($short_date, strtotime($line["updated"]));
1527 }
1528
1529 if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
1530 $content_preview = truncate_string(strip_tags($line["content_preview"]),
1531 100);
1532 }
1533
1534 if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1535
1536 print "<tr class='$class' id='RROW-$id'>";
1537
1538 print "<td class='hlUpdatePic'>$update_pic</td>";
1539
1540 print "<td class='hlSelectRow'>
1541 <input type=\"checkbox\" onclick=\"toggleSelectRow(this)\"
1542 class=\"feedCheckBox\" id=\"RCHK-$id\">
1543 </td>";
1544
1545 print "<td class='hlMarkedPic'>$marked_pic</td>";
1546
1547 if ($line["feed_title"]) {
1548 print "<td class='hlContent'>$content_link</td>";
1549 print "<td class='hlFeed'>
1550 <a href='javascript:viewfeed($feed_id)'>".
1551 $line["feed_title"]."</a>&nbsp;</td>";
1552 } else {
1553 print "<td class='hlContent' valign='middle'>";
1554
1555 print "<a href=\"javascript:view($id,$feed_id);\">" .
1556 $line["title"];
1557
1558 if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
1559
1560 if ($content_preview) {
1561 print "<span class=\"contentPreview\"> - $content_preview</span>";
1562 }
1563 }
1564
1565 print "</a>";
1566 print "</td>";
1567 }
1568
1569 print "<td class=\"hlUpdated\"><nobr>$updated_fmt&nbsp;</nobr></td>";
1570
1571 print "</tr>";
1572
1573 } else {
1574
1575 if ($is_unread) {
1576 $add_class = "Unread";
1577 } else {
1578 $add_class = "";
1579 }
1580
1581 print "<div class=\"cdmArticle$add_class\" id=\"RROW-$id\">";
1582
1583 print "<div class=\"cdmHeader\">";
1584
1585 print "<div style=\"float : right\">$updated_fmt</div>";
1586
1587 print "<a target=\"new\" href=\"".$line["link"]."\">".$line["title"]."</a>";
1588
1589 if ($line["feed_title"]) {
1590 print "&nbsp;(<a href='javascript:viewfeed($feed_id)'>".$line["feed_title"]."</a>)";
1591 }
1592
1593 print "</div>";
1594
1595 print "<div class=\"cdmContent\">" . $line["content_preview"] . "</div>";
1596
1597 print "<div style=\"float : right\">$marked_pic</div>
1598 <div class=\"cdmFooter\">
1599 <input type=\"checkbox\" onclick=\"toggleSelectRowById(this,
1600 'RROW-$id')\" class=\"feedCheckBox\" id=\"RCHK-$id\"></div>";
1601
1602 print "</div>";
1603
1604 }
1605
1606 ++$lnum;
1607 }
1608
1609 if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1610 print "</table>";
1611 }
1612
1613 print_headline_subtoolbar($link,
1614 "javascript:catchupPage()", "Mark page as read", true);
1615
1616
1617 } else {
1618 print "<div width='100%' align='center'>No articles found.</div>";
1619 }
1620
1621 print "</div>";
1622
1623 print "<script type=\"text/javascript\">
1624 document.onkeydown = hotkey_handler;
1625 // if (parent.daemon_enabled) parent.updateTitle('$feed_title');
1626 update_all_counters('$feed');
1627 </script>";
1628
1629 print '
1630 <script type="text/javascript">
1631 /* for IE */
1632 function statechange() {
1633 if (document.readyState == "interactive") init();
1634 }
1635
1636 if (document.readyState) {
1637 if (document.readyState == "interactive" || document.readyState == "complete") {
1638 init();
1639 } else {
1640 document.onreadystatechange = statechange;
1641 }
1642 }
1643 </script>';
1644
1645 print "</body></html>";
1646 }
1647
1648 if ($op == "pref-rpc") {
1649
1650 $subop = $_GET["subop"];
1651
1652 if ($subop == "unread") {
1653 $ids = split(",", db_escape_string($_GET["ids"]));
1654 foreach ($ids as $id) {
1655 db_query($link, "UPDATE ttrss_user_entries SET unread = true
1656 WHERE feed_id = '$id' AND owner_uid = ".$_SESSION["uid"]);
1657 }
1658
1659 print "Marked selected feeds as unread.";
1660 }
1661
1662 if ($subop == "read") {
1663 $ids = split(",", db_escape_string($_GET["ids"]));
1664 foreach ($ids as $id) {
1665 db_query($link, "UPDATE ttrss_user_entries
1666 SET unread = false,last_read = NOW() WHERE
1667 feed_id = '$id' AND owner_uid = ".$_SESSION["uid"]);
1668 }
1669
1670 print "Marked selected feeds as read.";
1671
1672 }
1673
1674 }
1675
1676 if ($op == "pref-feeds") {
1677
1678 $subop = $_REQUEST["subop"];
1679 $quiet = $_REQUEST["quiet"];
1680
1681 if ($subop == "massSubscribe") {
1682 $ids = split(",", db_escape_string($_GET["ids"]));
1683
1684 $subscribed = array();
1685
1686 foreach ($ids as $id) {
1687 $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
1688 WHERE id = '$id'");
1689
1690 $feed_url = db_fetch_result($result, 0, "feed_url");
1691 $title = db_fetch_result($result, 0, "title");
1692
1693 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
1694 feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
1695
1696 if (db_num_rows($result) == 0) {
1697 $result = db_query($link,
1698 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
1699 VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
1700
1701 array_push($subscribed, $title);
1702 }
1703 }
1704
1705 if (count($subscribed) > 0) {
1706 print "<div class=\"notice\">";
1707 print "<b>Subscribed to feeds:</b>";
1708 print "<ul class=\"nomarks\">";
1709 foreach ($subscribed as $title) {
1710 print "<li>$title</li>";
1711 }
1712 print "</ul>";
1713 print "</div>";
1714 }
1715 }
1716
1717 if ($subop == "browse") {
1718
1719 if (!ENABLE_FEED_BROWSER) {
1720 print "Feed browser is administratively disabled.";
1721 return;
1722 }
1723
1724 print "<div class=\"infoBoxContents\">";
1725
1726 print "<h1>Feed browser</h1>";
1727
1728 print "<p>Showing top 50 registered feeds, sorted by popularity:</p>";
1729
1730 $result = db_query($link, "SELECT feed_url,count(id) AS subscribers
1731 FROM ttrss_feeds
1732 WHERE auth_login = '' AND auth_pass = '' AND private = false
1733 GROUP BY feed_url ORDER BY subscribers DESC LIMIT 50");
1734
1735 print "<ul class='browseFeedList' id='browseFeedList'>";
1736
1737 $feedctr = 0;
1738
1739 while ($line = db_fetch_assoc($result)) {
1740 $feed_url = $line["feed_url"];
1741 $subscribers = $line["subscribers"];
1742
1743 $sub_result = db_query($link, "SELECT id
1744 FROM ttrss_feeds WHERE feed_url = '$feed_url' AND owner_uid =" .
1745 $_SESSION["uid"]);
1746
1747 if (db_num_rows($sub_result) > 0) {
1748 continue; // already subscribed
1749 }
1750
1751 $det_result = db_query($link, "SELECT site_url,title,id
1752 FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
1753
1754 $details = db_fetch_assoc($det_result);
1755
1756 $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
1757
1758 if (file_exists($icon_file) && filesize($icon_file) > 0) {
1759 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL .
1760 "/".$details["id"].".ico\">";
1761 } else {
1762 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
1763 }
1764
1765 $check_box = "<input onclick='toggleSelectListRow(this)' class='feedBrowseCB'
1766 type=\"checkbox\" id=\"FBCHK-" . $details["id"] . "\">";
1767
1768 $class = ($feedctr % 2) ? "even" : "odd";
1769
1770 print "<li class='$class' id=\"FBROW-".$details["id"]."\">$check_box".
1771 "$feed_icon " . db_unescape_string($details["title"]) .
1772 "&nbsp;<span class='subscribers'>($subscribers)</span></li>";
1773
1774 ++$feedctr;
1775 }
1776
1777 if ($feedctr == 0) {
1778 print "<li>No feeds found to subscribe.</li>";
1779 }
1780
1781 print "</ul>";
1782
1783 print "<div align='center'>
1784 <input type=\"submit\" class=\"button\"
1785 onclick=\"feedBrowserSubscribe()\" value=\"Subscribe\">
1786 <input type='submit' class='button'
1787 onclick=\"closeInfoBox()\" value=\"Cancel\"></div>";
1788
1789 print "</div>";
1790 return;
1791 }
1792
1793 if ($subop == "editfeed") {
1794 $feed_id = db_escape_string($_GET["id"]);
1795
1796 $result = db_query($link,
1797 "SELECT * FROM ttrss_feeds WHERE id = '$feed_id' AND
1798 owner_uid = " . $_SESSION["uid"]);
1799
1800 $title = htmlspecialchars(db_unescape_string(db_fetch_result($result,
1801 0, "title")));
1802
1803 print "<div class=\"infoBoxContents\">";
1804
1805 $icon_file = ICONS_DIR . "/$feed_id.ico";
1806
1807 if (file_exists($icon_file) && filesize($icon_file) > 0) {
1808 $feed_icon = "<img width=\"16\" height=\"16\"
1809 src=\"" . ICONS_URL . "/$feed_id.ico\">";
1810 } else {
1811 $feed_icon = "";
1812 }
1813
1814 print "<h1>$feed_icon $title</h1>";
1815
1816 print "<table width='100%'>";
1817
1818 $row_class = "odd";
1819
1820 print "<tr class='$row_class'><td>Title:</td>";
1821 print "<td><input id=\"iedit_title\" value=\"$title\"></td></tr>";
1822
1823 $feed_url = db_fetch_result($result, 0, "feed_url");
1824 $feed_url = htmlspecialchars(db_unescape_string(db_fetch_result($result,
1825 0, "feed_url")));
1826 $row_class = toggleEvenOdd($row_class);
1827
1828 print "<tr class='$row_class'><td>Feed URL:</td>";
1829 print "<td><input id=\"iedit_link\" value=\"$feed_url\"></td></tr>";
1830
1831 if (get_pref($link, 'ENABLE_FEED_CATS')) {
1832
1833 $cat_id = db_fetch_result($result, 0, "cat_id");
1834
1835 $row_class = toggleEvenOdd($row_class);
1836
1837 print "<tr class='$row_class'><td>Category:</td>";
1838 print "<td>";
1839 print "<select id=\"iedit_fcat\">";
1840 print "<option id=\"0\">Uncategorized</option>";
1841
1842 $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feed_categories
1843 WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY title");
1844
1845 if (db_num_rows($tmp_result) > 0) {
1846 print "<option disabled>--------</option>";
1847 }
1848
1849 while ($tmp_line = db_fetch_assoc($tmp_result)) {
1850 if ($tmp_line["id"] == $cat_id) {
1851 $is_selected = "selected";
1852 } else {
1853 $is_selected = "";
1854 }
1855 printf("<option $is_selected id='%d'>%s</option>",
1856 $tmp_line["id"], $tmp_line["title"]);
1857 }
1858
1859 print "</select></td>";
1860 print "</td></tr>";
1861
1862 }
1863
1864 $update_interval = db_fetch_result($result, 0, "update_interval");
1865 $row_class = toggleEvenOdd($row_class);
1866
1867 print "<tr class='$row_class'><td>Update Interval:</td>";
1868 print "<td><input id=\"iedit_updintl\"
1869 value=\"$update_interval\"></td></tr>";
1870
1871 $row_class = toggleEvenOdd($row_class);
1872 print "<tr class='$row_class'><td>Link to:</td>";
1873
1874 $tmp_result = db_query($link, "SELECT COUNT(id) AS count
1875 FROM ttrss_feeds WHERE parent_feed = '$feed_id'");
1876
1877 $linked_count = db_fetch_result($tmp_result, 0, "count");
1878
1879 $parent_feed = db_fetch_result($result, 0, "parent_feed");
1880
1881 if ($linked_count > 0) {
1882 $disabled = "disabled";
1883 }
1884
1885 print "<select $disabled id=\"iedit_parent_feed\">";
1886
1887 print "<option id=\"0\">Not linked</option>";
1888
1889 if (get_pref($link, 'ENABLE_FEED_CATS')) {
1890 if ($cat_id) {
1891 $cat_qpart = "AND cat_id = '$cat_id'";
1892 } else {
1893 $cat_qpart = "AND cat_id IS NULL";
1894 }
1895 }
1896
1897 $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds
1898 WHERE id != '$feed_id' AND owner_uid = ".$_SESSION["uid"]."
1899 $cat_qpart ORDER BY title");
1900
1901 if (db_num_rows($tmp_result) > 0) {
1902 print "<option disabled>--------</option>";
1903 }
1904
1905 while ($tmp_line = db_fetch_assoc($tmp_result)) {
1906 if ($tmp_line["id"] == $parent_feed) {
1907 $is_selected = "selected";
1908 } else {
1909 $is_selected = "";
1910 }
1911 printf("<option $is_selected id='%d'>%s</option>",
1912 $tmp_line["id"], $tmp_line["title"]);
1913 }
1914
1915 print "</select></td>";
1916 print "</td></tr>";
1917
1918 $purge_interval = db_fetch_result($result, 0, "purge_interval");
1919 $row_class = toggleEvenOdd($row_class);
1920
1921 print "<tr class='$row_class'><td>Purge Days:</td>";
1922 print "<td><input id=\"iedit_purgintl\"
1923 value=\"$purge_interval\"></td></tr>";
1924
1925 // print "<tr><td colspan=\"2\"><b>Authentication</b></td></tr>";
1926
1927 $row_class = toggleEvenOdd($row_class);
1928 $auth_login = db_fetch_result($result, 0, "auth_login");
1929
1930 print "<tr class='$row_class'><td>Login:</td>";
1931 print "<td><input id=\"iedit_login\"
1932 value=\"$auth_login\"></td></tr>";
1933
1934 $row_class = toggleEvenOdd($row_class);
1935 $auth_pass = db_fetch_result($result, 0, "auth_pass");
1936
1937 print "<tr class='$row_class'><td>Password:</td>";
1938 print "<td><input type=\"password\" id=\"iedit_pass\"
1939 value=\"$auth_pass\"></td></tr>";
1940
1941 $row_class = toggleEvenOdd($row_class);
1942 $private = sql_bool_to_bool(db_fetch_result($result, 0, "private"));
1943
1944 if ($private) {
1945 $checked = "checked";
1946 } else {
1947 $checked = "";
1948 }
1949
1950 print "<tr class='$row_class'><td>Options:</td>";
1951 print "<td><input type=\"checkbox\" id=\"iedit_private\"
1952 $checked><label for=\"iedit_private\">Hide from feed browser</label>
1953 </td></tr>";
1954
1955 print "</table>";
1956 print "</div>";
1957
1958 print "<div align='center'>
1959 <input type=\"submit\" class=\"button\"
1960 onclick=\"feedEditSave()\" value=\"Save\">
1961 <input type='submit' class='button'
1962 onclick=\"feedEditCancel()\" value=\"Cancel\"></div>";
1963 return;
1964 }
1965
1966 if ($subop == "editSave") {
1967 $feed_title = db_escape_string($_POST["t"]);
1968 $feed_link = db_escape_string($_POST["l"]);
1969 $upd_intl = db_escape_string($_POST["ui"]);
1970 $purge_intl = db_escape_string($_POST["pi"]);
1971 $feed_id = db_escape_string($_POST["id"]);
1972 $cat_id = db_escape_string($_POST["catid"]);
1973 $auth_login = db_escape_string($_POST["login"]);
1974 $auth_pass = db_escape_string($_POST["pass"]);
1975 $parent_feed = db_escape_string($_POST["pfeed"]);
1976 $private = db_escape_string($_POST["is_pvt"]);
1977
1978 if (strtoupper($upd_intl) == "DEFAULT")
1979 $upd_intl = 0;
1980
1981 if (strtoupper($upd_intl) == "DISABLED")
1982 $upd_intl = -1;
1983
1984 if (strtoupper($purge_intl) == "DEFAULT")
1985 $purge_intl = 0;
1986
1987 if (strtoupper($purge_intl) == "DISABLED")
1988 $purge_intl = -1;
1989
1990 if ($cat_id != 0) {
1991 $category_qpart = "cat_id = '$cat_id'";
1992 } else {
1993 $category_qpart = 'cat_id = NULL';
1994 }
1995
1996 if ($parent_feed != 0) {
1997 $parent_qpart = "parent_feed = '$parent_feed'";
1998 } else {
1999 $parent_qpart = 'parent_feed = NULL';
2000 }
2001
2002 $result = db_query($link, "UPDATE ttrss_feeds SET
2003 $category_qpart,
2004 $parent_qpart,
2005 title = '$feed_title', feed_url = '$feed_link',
2006 update_interval = '$upd_intl',
2007 purge_interval = '$purge_intl',
2008 auth_login = '$auth_login',
2009 auth_pass = '$auth_pass',
2010 private = '$private'
2011 WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
2012 }
2013
2014 if ($subop == "saveCat") {
2015 $cat_title = db_escape_string($_GET["title"]);
2016 $cat_id = db_escape_string($_GET["id"]);
2017
2018 $result = db_query($link, "UPDATE ttrss_feed_categories SET
2019 title = '$cat_title' WHERE id = '$cat_id' AND owner_uid = ".$_SESSION["uid"]);
2020
2021 }
2022
2023 if ($subop == "remove") {
2024
2025 if (!WEB_DEMO_MODE) {
2026
2027 $ids = split(",", db_escape_string($_GET["ids"]));
2028
2029 foreach ($ids as $id) {
2030 db_query($link, "DELETE FROM ttrss_feeds
2031 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
2032
2033 $icons_dir = ICONS_DIR;
2034
2035 if (file_exists($icons_dir . "/$id.ico")) {
2036 unlink($icons_dir . "/$id.ico");
2037 }
2038 }
2039 }
2040 }
2041
2042 if ($subop == "add") {
2043
2044 if (!WEB_DEMO_MODE) {
2045
2046 $feed_link = db_escape_string(trim($_GET["link"]));
2047 $cat_id = db_escape_string($_GET["cid"]);
2048
2049 if ($cat_id == "0" || !$cat_id) {
2050 $cat_qpart = "NULL";
2051 } else {
2052 $cat_qpart = "'$cat_id'";
2053 }
2054
2055 $result = db_query($link,
2056 "SELECT id FROM ttrss_feeds
2057 WHERE feed_url = '$feed_link' AND owner_uid = ".$_SESSION["uid"]);
2058
2059 if (db_num_rows($result) == 0) {
2060
2061 $result = db_query($link,
2062 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
2063 VALUES ('".$_SESSION["uid"]."', '$feed_link',
2064 '[Unknown]', $cat_qpart)");
2065
2066 $result = db_query($link,
2067 "SELECT id FROM ttrss_feeds WHERE feed_url = '$feed_link'
2068 AND owner_uid = " . $_SESSION["uid"]);
2069
2070 $feed_id = db_fetch_result($result, 0, "id");
2071
2072 if ($feed_id) {
2073 update_rss_feed($link, $feed_link, $feed_id, true);
2074 }
2075 } else {
2076
2077 print "<div class=\"warning\">
2078 Feed <b>$feed_link</b> already exists in the database.
2079 </div>";
2080 }
2081 }
2082 }
2083
2084 if ($subop == "addCat") {
2085
2086 if (!WEB_DEMO_MODE) {
2087
2088 $feed_cat = db_escape_string(trim($_GET["cat"]));
2089
2090 $result = db_query($link,
2091 "SELECT id FROM ttrss_feed_categories
2092 WHERE title = '$feed_cat' AND owner_uid = ".$_SESSION["uid"]);
2093
2094 if (db_num_rows($result) == 0) {
2095
2096 $result = db_query($link,
2097 "INSERT INTO ttrss_feed_categories (owner_uid,title)
2098 VALUES ('".$_SESSION["uid"]."', '$feed_cat')");
2099
2100 } else {
2101
2102 print "<div class=\"warning\">
2103 Category <b>$feed_cat</b> already exists in the database.
2104 </div>";
2105 }
2106
2107
2108 }
2109 }
2110
2111 if ($subop == "removeCats") {
2112
2113 if (!WEB_DEMO_MODE) {
2114
2115 $ids = split(",", db_escape_string($_GET["ids"]));
2116
2117 foreach ($ids as $id) {
2118
2119 db_query($link, "BEGIN");
2120
2121 $result = db_query($link,
2122 "SELECT count(id) as num_feeds FROM ttrss_feeds
2123 WHERE cat_id = '$id'");
2124
2125 $num_feeds = db_fetch_result($result, 0, "num_feeds");
2126
2127 if ($num_feeds == 0) {
2128 db_query($link, "DELETE FROM ttrss_feed_categories
2129 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
2130 } else {
2131
2132 print "<div class=\"warning\">
2133 Unable to delete non empty feed categories.</div>";
2134
2135 }
2136
2137 db_query($link, "COMMIT");
2138 }
2139 }
2140 }
2141
2142 if ($subop == "categorize") {
2143
2144 if (!WEB_DEMO_MODE) {
2145
2146 $ids = split(",", db_escape_string($_GET["ids"]));
2147
2148 $cat_id = db_escape_string($_GET["cat_id"]);
2149
2150 if ($cat_id == 0) {
2151 $cat_id_qpart = 'NULL';
2152 } else {
2153 $cat_id_qpart = "'$cat_id'";
2154 }
2155
2156 db_query($link, "BEGIN");
2157
2158 foreach ($ids as $id) {
2159
2160 db_query($link, "UPDATE ttrss_feeds SET cat_id = $cat_id_qpart
2161 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
2162 }
2163
2164 db_query($link, "COMMIT");
2165 }
2166
2167 }
2168
2169 if ($quiet) return;
2170
2171 // print "<h3>Edit Feeds</h3>";
2172
2173 $result = db_query($link, "SELECT id,title,feed_url,last_error
2174 FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]);
2175
2176 if (db_num_rows($result) > 0) {
2177
2178 print "<div class=\"warning\">";
2179
2180 // print"<img class=\"closeButton\"
2181 // onclick=\"javascript:hideParentElement(this);\" src=\"images/close.png\">";
2182
2183 print "<a href=\"javascript:showBlockElement('feedUpdateErrors')\">
2184 <b>Feeds with update errors</b> (click to expand)</a>";
2185
2186 print "<ul id=\"feedUpdateErrors\" class=\"nomarks\">";
2187
2188 while ($line = db_fetch_assoc($result)) {
2189 print "<li>" . $line["title"] . " (" . $line["feed_url"] . "): " .
2190 $line["last_error"];
2191 }
2192
2193 print "</ul>";
2194 print "</div>";
2195
2196 }
2197
2198 $feed_search = db_escape_string($_GET["search"]);
2199
2200 if (array_key_exists("search", $_GET)) {
2201 $_SESSION["prefs_feed_search"] = $feed_search;
2202 } else {
2203 $feed_search = $_SESSION["prefs_feed_search"];
2204 }
2205
2206 print "<table width='100%' class=\"prefGenericAddBox\"
2207 cellspacing='0' cellpadding='0'><tr>
2208 <td>
2209 <input id=\"fadd_link\"
2210 onchange=\"javascript:addFeed()\"
2211 size=\"40\">
2212 <input type=\"submit\" class=\"button\"
2213 onclick=\"javascript:addFeed()\" value=\"Add feed\">";
2214
2215 if (ENABLE_FEED_BROWSER) {
2216 print "&nbsp;(<a href='javascript:browseFeeds()'>Top 50</a>)";
2217 }
2218
2219 print "</td><td align='right'>
2220 <input id=\"feed_search\" size=\"20\"
2221 onchange=\"javascript:updateFeedList()\"
2222 value=\"$feed_search\">
2223 <input type=\"submit\" class=\"button\"
2224 onclick=\"javascript:updateFeedList()\" value=\"Search\">
2225 </td>
2226 </tr></table>";
2227
2228 $feeds_sort = db_escape_string($_GET["sort"]);
2229
2230 if (!$feeds_sort || $feeds_sort == "undefined") {
2231 $feeds_sort = $_SESSION["pref_sort_feeds"];
2232 if (!$feeds_sort) $feeds_sort = "title";
2233 }
2234
2235 $_SESSION["pref_sort_feeds"] = $feeds_sort;
2236
2237 if ($feed_search) {
2238 $search_qpart = "(UPPER(F1.title) LIKE UPPER('%$feed_search%') OR
2239 UPPER(F1.feed_url) LIKE UPPER('%$feed_search%')) AND";
2240 } else {
2241 $search_qpart = "";
2242 }
2243
2244 $result = db_query($link, "SELECT
2245 F1.id,
2246 F1.title,
2247 F1.feed_url,
2248 substring(F1.last_updated,1,16) AS last_updated,
2249 F1.parent_feed,
2250 F1.update_interval,
2251 F1.purge_interval,
2252 F1.cat_id,
2253 F2.title AS parent_title,
2254 C1.title AS category
2255 FROM
2256 ttrss_feeds AS F1
2257 LEFT JOIN ttrss_feeds AS F2
2258 ON (F1.parent_feed = F2.id)
2259 LEFT JOIN ttrss_feed_categories AS C1
2260 ON (F1.cat_id = C1.id)
2261 WHERE
2262 $search_qpart F1.owner_uid = '".$_SESSION["uid"]."'
2263 ORDER by category,$feeds_sort,title");
2264
2265 if (db_num_rows($result) != 0) {
2266
2267 print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
2268
2269 print "<p><table width=\"100%\" cellspacing=\"0\"
2270 class=\"prefFeedList\" id=\"prefFeedList\">";
2271 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2272 Select:
2273 <a href=\"javascript:selectTableRowsByIdPrefix('prefFeedList',
2274 'FEEDR-', 'FRCHK-', true)\">All</a>,
2275 <a href=\"javascript:selectTableRowsByIdPrefix('prefFeedList',
2276 'FEEDR-', 'FRCHK-', false)\">None</a>
2277 </td</tr>";
2278
2279 if (!get_pref($link, 'ENABLE_FEED_CATS')) {
2280 print "<tr class=\"title\">
2281 <td width='5%' align='center'>&nbsp;</td>
2282 <td width='30%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
2283 <td width='30%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
2284 <td width='15%'><a href=\"javascript:updateFeedList('update_interval')\">Update Interval</a></td>
2285 <td width='15%'><a href=\"javascript:updateFeedList('purge_interval')\">Purge Days</a></td></tr>";
2286 }
2287
2288 $lnum = 0;
2289
2290 $cur_cat_id = -1;
2291
2292 while ($line = db_fetch_assoc($result)) {
2293
2294 $feed_id = $line["id"];
2295 $cat_id = $line["cat_id"];
2296
2297 $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
2298 $edit_link = htmlspecialchars(db_unescape_string($line["feed_url"]));
2299 $edit_cat = htmlspecialchars(db_unescape_string($line["category"]));
2300
2301 if ($line["update_interval"] == "0") $line["update_interval"] = "Default";
2302 if ($line["update_interval"] == "-1") $line["update_interval"] = "Disabled";
2303 if ($line["purge_interval"] == "0") $line["purge_interval"] = "Default";
2304 if ($line["purge_interval"] < 0) $line["purge_interval"] = "Disabled";
2305
2306 if (!$edit_cat) $edit_cat = "Uncategorized";
2307
2308
2309 if (get_pref($link, 'ENABLE_FEED_CATS') && $cur_cat_id != $cat_id) {
2310 $lnum = 0;
2311
2312 print "<tr><td colspan=\"6\" class=\"feedEditCat\">$edit_cat</td></tr>";
2313
2314 print "<tr class=\"title\">
2315 <td width='5%' align='center'>&nbsp;</td>
2316 <td width='30%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
2317 <td width='30%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
2318 <td width='15%'><a href=\"javascript:updateFeedList('update_interval')\">Update Interval</a></td>
2319 <td width='15%'><a href=\"javascript:updateFeedList('purge_interval')\">Purge Days</a></td></tr>";
2320
2321 $cur_cat_id = $cat_id;
2322 }
2323
2324 $class = ($lnum % 2) ? "even" : "odd";
2325 $this_row_id = "id=\"FEEDR-$feed_id\"";
2326
2327 print "<tr class=\"$class\" $this_row_id>";
2328
2329 $icon_file = ICONS_DIR . "/$feed_id.ico";
2330
2331 if (file_exists($icon_file) && filesize($icon_file) > 0) {
2332 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/$feed_id.ico\">";
2333 } else {
2334 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
2335 }
2336 // print "<td class='feedIcon'>$feed_icon</td>";
2337
2338 print "<td class='feedSelect'><input onclick='toggleSelectRow(this);'
2339 type=\"checkbox\" id=\"FRCHK-".$line["id"]."\"></td>";
2340
2341 $edit_title = truncate_string($edit_title, 40);
2342 $edit_link = truncate_string($edit_link, 60);
2343
2344 $parent_title = $line["parent_title"];
2345 if ($parent_title) {
2346 $parent_title = "<span class='groupPrompt'>(linked to
2347 $parent_title)</span>";
2348 }
2349
2350 print "<td><a href=\"javascript:editFeed($feed_id);\">" .
2351 "$feed_icon $edit_title $parent_title" . "</a></td>";
2352
2353 print "<td><a href=\"javascript:editFeed($feed_id);\">" .
2354 $edit_link . "</a></td>";
2355
2356 /* if (get_pref($link, 'ENABLE_FEED_CATS')) {
2357 print "<td><a href=\"javascript:editFeed($feed_id);\">" .
2358 $edit_cat . "</a></td>";
2359 } */
2360
2361 print "<td><a href=\"javascript:editFeed($feed_id);\">" .
2362 $line["update_interval"] . "</a></td>";
2363
2364 print "<td><a href=\"javascript:editFeed($feed_id);\">" .
2365 $line["purge_interval"] . "</a></td>";
2366
2367 print "</tr>";
2368
2369 ++$lnum;
2370 }
2371
2372 print "</table>";
2373
2374 print "<p>";
2375
2376 if ($subop == "edit") {
2377 print "Edit feed:&nbsp;
2378 <input type=\"submit\" class=\"button\"
2379 onclick=\"javascript:feedEditCancel()\" value=\"Cancel\">
2380 <input type=\"submit\" class=\"button\"
2381 onclick=\"javascript:feedEditSave()\" value=\"Save\">";
2382 } else {
2383
2384 print "
2385 Selection:&nbsp;
2386 <input type=\"submit\" class=\"button\"
2387 onclick=\"javascript:selectedFeedDetails()\" value=\"Details\">
2388 <input type=\"submit\" class=\"button\"
2389 onclick=\"javascript:editSelectedFeed()\" value=\"Edit\">
2390 <input type=\"submit\" class=\"button\"
2391 onclick=\"javascript:removeSelectedFeeds()\" value=\"Remove\">";
2392
2393 if (get_pref($link, 'ENABLE_FEED_CATS')) {
2394
2395 print "&nbsp;&nbsp;";
2396
2397 $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories
2398 WHERE owner_uid = ".$_SESSION["uid"]."
2399 ORDER BY title");
2400
2401 print "<select id=\"sfeed_set_fcat\">";
2402 print "<option id=\"0\">Uncategorized</option>";
2403
2404 if (db_num_rows($result) != 0) {
2405
2406 print "<option disabled>--------</option>";
2407
2408 while ($line = db_fetch_assoc($result)) {
2409 printf("<option id='%d'>%s</option>",
2410 $line["id"], $line["title"]);
2411 }
2412 }
2413
2414 print "</select>";
2415
2416 print " <input type=\"submit\" class=\"button\"
2417 onclick=\"javascript:categorizeSelectedFeeds()\" value=\"Set category\">";
2418
2419 }
2420
2421 if (get_pref($link, 'ENABLE_PREFS_CATCHUP_UNCATCHUP')) {
2422 print "
2423 <input type=\"submit\" class=\"button\"
2424 onclick=\"javascript:readSelectedFeeds(true)\" value=\"Mark as read\">
2425 <input type=\"submit\" class=\"button\"
2426 onclick=\"javascript:readSelectedFeeds(false)\"
2427 value=\"Mark as unread\">&nbsp;";
2428 }
2429
2430 print "
2431 &nbsp;All feeds: <input type=\"submit\"
2432 class=\"button\" onclick=\"gotoExportOpml()\"
2433 value=\"Export OPML\">";
2434 }
2435 } else {
2436
2437 print "<p>No feeds defined.</p>";
2438
2439 }
2440
2441 if (get_pref($link, 'ENABLE_FEED_CATS')) {
2442
2443 print "<h3>Edit Categories</h3>";
2444
2445 // print "<h3>Categories</h3>";
2446
2447 print "<div class=\"prefGenericAddBox\">
2448 <input id=\"fadd_cat\"
2449 onchange=\"javascript:addFeedCat()\"
2450 size=\"40\">&nbsp;
2451 <input
2452 type=\"submit\" class=\"button\"
2453 onclick=\"javascript:addFeedCat()\" value=\"Add category\"></div>";
2454
2455 $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories
2456 WHERE owner_uid = ".$_SESSION["uid"]."
2457 ORDER BY title");
2458
2459 if (db_num_rows($result) != 0) {
2460
2461 print "<p><table width=\"100%\" class=\"prefFeedCatList\"
2462 cellspacing=\"0\" id=\"prefFeedCatList\">";
2463
2464 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2465 Select:
2466 <a href=\"javascript:selectTableRowsByIdPrefix('prefFeedCatList',
2467 'FCATR-', 'FCCHK-', true)\">All</a>,
2468 <a href=\"javascript:selectTableRowsByIdPrefix('prefFeedCatList',
2469 'FCATR-', 'FCCHK-', false)\">None</a>
2470 </td</tr>";
2471
2472 print "<tr class=\"title\">
2473 <td width=\"5%\"></td><td width=\"80%\">Title</td>
2474 </tr>";
2475
2476 $lnum = 0;
2477
2478 while ($line = db_fetch_assoc($result)) {
2479
2480 $class = ($lnum % 2) ? "even" : "odd";
2481
2482 $cat_id = $line["id"];
2483
2484 $edit_cat_id = $_GET["id"];
2485
2486 if ($subop == "editCat" && $cat_id != $edit_cat_id) {
2487 $class .= "Grayed";
2488 $this_row_id = "";
2489 } else {
2490 $this_row_id = "id=\"FCATR-$cat_id\"";
2491 }
2492
2493 print "<tr class=\"$class\" $this_row_id>";
2494
2495 $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
2496
2497 if (!$edit_cat_id || $subop != "editCat") {
2498
2499 print "<td align='center'><input onclick='toggleSelectRow(this);'
2500 type=\"checkbox\" id=\"FCCHK-".$line["id"]."\"></td>";
2501
2502 print "<td><a href=\"javascript:editFeedCat($cat_id);\">" .
2503 $edit_title . "</a></td>";
2504
2505 } else if ($cat_id != $edit_cat_id) {
2506
2507 print "<td><input disabled=\"true\" type=\"checkbox\"
2508 id=\"FRCHK-".$line["id"]."\"></td>";
2509
2510 print "<td>$edit_title</td>";
2511
2512 } else {
2513
2514 print "<td><input disabled=\"true\" type=\"checkbox\" checked></td>";
2515
2516 print "<td><input id=\"iedit_title\" value=\"$edit_title\"></td>";
2517
2518 }
2519
2520 print "</tr>";
2521
2522 ++$lnum;
2523 }
2524
2525 print "</table>";
2526
2527 print "<p>";
2528
2529 if ($subop == "editCat") {
2530 print "Edit category:&nbsp;
2531 <input type=\"submit\" class=\"button\"
2532 onclick=\"javascript:feedCatEditCancel()\" value=\"Cancel\">
2533 <input type=\"submit\" class=\"button\"
2534 onclick=\"javascript:feedCatEditSave()\" value=\"Save\">";
2535 } else {
2536
2537 print "
2538 Selection:&nbsp;
2539 <input type=\"submit\" class=\"button\"
2540 onclick=\"javascript:editSelectedFeedCat()\" value=\"Edit\">
2541 <input type=\"submit\" class=\"button\"
2542 onclick=\"javascript:removeSelectedFeedCats()\" value=\"Remove\">";
2543
2544 }
2545
2546 } else {
2547 print "<p>No feed categories defined.</p>";
2548 }
2549 }
2550
2551 print "<h3>Import OPML</h3>
2552 <form enctype=\"multipart/form-data\" method=\"POST\" action=\"opml.php\">
2553 File: <input id=\"opml_file\" name=\"opml_file\" type=\"file\">&nbsp;
2554 <input class=\"button\" name=\"op\" onclick=\"return validateOpmlImport();\"
2555 type=\"submit\" value=\"Import\">
2556 </form>";
2557
2558 }
2559
2560 if ($op == "pref-filters") {
2561
2562 $subop = $_GET["subop"];
2563 $quiet = $_GET["quiet"];
2564
2565 if ($subop == "editSave") {
2566
2567 $regexp = db_escape_string($_GET["r"]);
2568 $descr = db_escape_string($_GET["d"]);
2569 $match = db_escape_string($_GET["m"]);
2570 $filter_id = db_escape_string($_GET["id"]);
2571 $feed_id = db_escape_string($_GET["fid"]);
2572 $action_id = db_escape_string($_GET["aid"]);
2573
2574 if (!$feed_id) {
2575 $feed_id = 'NULL';
2576 } else {
2577 $feed_id = sprintf("'%s'", db_escape_string($feed_id));
2578 }
2579
2580 $result = db_query($link, "UPDATE ttrss_filters SET
2581 reg_exp = '$regexp',
2582 description = '$descr',
2583 feed_id = $feed_id,
2584 action_id = '$action_id',
2585 filter_type = (SELECT id FROM ttrss_filter_types WHERE
2586 description = '$match')
2587 WHERE id = '$filter_id'");
2588 }
2589
2590 if ($subop == "remove") {
2591
2592 if (!WEB_DEMO_MODE) {
2593
2594 $ids = split(",", db_escape_string($_GET["ids"]));
2595
2596 foreach ($ids as $id) {
2597 db_query($link, "DELETE FROM ttrss_filters WHERE id = '$id'");
2598
2599 }
2600 }
2601 }
2602
2603 if ($subop == "add") {
2604
2605 if (!WEB_DEMO_MODE) {
2606
2607 $regexp = db_escape_string(trim($_GET["regexp"]));
2608 $match = db_escape_string(trim($_GET["match"]));
2609 $feed_id = db_escape_string($_GET["fid"]);
2610 $action_id = db_escape_string($_GET["aid"]);
2611
2612 if (!$feed_id) {
2613 $feed_id = 'NULL';
2614 } else {
2615 $feed_id = sprintf("'%s'", db_escape_string($feed_id));
2616 }
2617
2618 $result = db_query($link,
2619 "INSERT INTO ttrss_filters (reg_exp,filter_type,owner_uid,feed_id,
2620 action_id)
2621 VALUES
2622 ('$regexp', (SELECT id FROM ttrss_filter_types WHERE
2623 description = '$match'),'".$_SESSION["uid"]."',
2624 $feed_id, '$action_id')");
2625 }
2626 }
2627
2628 if ($quiet) return;
2629
2630 $result = db_query($link, "SELECT description
2631 FROM ttrss_filter_types ORDER BY description");
2632
2633 $filter_types = array();
2634
2635 while ($line = db_fetch_assoc($result)) {
2636 array_push($filter_types, $line["description"]);
2637 }
2638
2639 print "<div class=\"prefGenericAddBox\">
2640 <input id=\"fadd_regexp\" size=\"40\">&nbsp;";
2641
2642 print_select("fadd_match", "Title", $filter_types);
2643
2644 print "&nbsp;<select id=\"fadd_feed\">";
2645
2646 print "<option selected id=\"0\">All feeds</option>";
2647
2648 $result = db_query($link, "SELECT id,title FROM ttrss_feeds
2649 WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY title");
2650
2651 if (db_num_rows($result) > 0) {
2652 print "<option disabled>--------</option>";
2653 }
2654
2655 while ($line = db_fetch_assoc($result)) {
2656 printf("<option id='%d'>%s</option>", $line["id"], $line["title"]);
2657 }
2658
2659 print "</select>&nbsp;";
2660
2661 print "&nbsp;Action: ";
2662
2663 print "<select id=\"fadd_action\">";
2664
2665 $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions
2666 ORDER BY name");
2667
2668 while ($line = db_fetch_assoc($result)) {
2669 printf("<option id='%d'>%s</option>", $line["id"], $line["description"]);
2670 }
2671
2672 print "</select>&nbsp;";
2673
2674 print "<input type=\"submit\"
2675 class=\"button\" onclick=\"javascript:addFilter()\"
2676 value=\"Add filter\">";
2677
2678 print "</div>";
2679
2680 $result = db_query($link, "SELECT
2681 ttrss_filters.id AS id,reg_exp,
2682 ttrss_filters.description AS description,
2683 ttrss_filter_types.name AS filter_type_name,
2684 ttrss_filter_types.description AS filter_type_descr,
2685 feed_id,
2686 ttrss_filter_actions.description AS action_description,
2687 ttrss_feeds.title AS feed_title
2688 FROM
2689 ttrss_filter_types,ttrss_filter_actions,ttrss_filters LEFT JOIN
2690 ttrss_feeds ON (ttrss_filters.feed_id = ttrss_feeds.id)
2691 WHERE
2692 filter_type = ttrss_filter_types.id AND
2693 ttrss_filter_actions.id = action_id AND
2694 ttrss_filters.owner_uid = ".$_SESSION["uid"]."
2695 ORDER by reg_exp");
2696
2697 if (db_num_rows($result) != 0) {
2698
2699 print "<p><table width=\"100%\" cellspacing=\"0\" class=\"prefFilterList\"
2700 id=\"prefFilterList\">";
2701
2702 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2703 Select:
2704 <a href=\"javascript:selectTableRowsByIdPrefix('prefFilterList',
2705 'FILRR-', 'FICHK-', true)\">All</a>,
2706 <a href=\"javascript:selectTableRowsByIdPrefix('prefFilterList',
2707 'FILRR-', 'FICHK-', false)\">None</a>
2708 </td</tr>";
2709
2710 print "<tr class=\"title\">
2711 <td align='center' width=\"5%\">&nbsp;</td>
2712 <td width=\"20%\">Filter expression</td>
2713 <td width=\"20%\">Feed</td>
2714 <td width=\"15%\">Match</td>
2715 <td width=\"15%\">Action</td>
2716 <td width=\"30%\">Description</td></tr>";
2717
2718 $lnum = 0;
2719
2720 while ($line = db_fetch_assoc($result)) {
2721
2722 $class = ($lnum % 2) ? "even" : "odd";
2723
2724 $filter_id = $line["id"];
2725 $edit_filter_id = $_GET["id"];
2726
2727 if ($subop == "edit" && $filter_id != $edit_filter_id) {
2728 $class .= "Grayed";
2729 $this_row_id = "";
2730 } else {
2731 $this_row_id = "id=\"FILRR-$filter_id\"";
2732 }
2733
2734 print "<tr class=\"$class\" $this_row_id>";
2735
2736 $line["regexp"] = htmlspecialchars($line["reg_exp"]);
2737 $line["description"] = htmlspecialchars($line["description"]);
2738
2739 if (!$line["feed_title"]) $line["feed_title"] = "All feeds";
2740
2741 if (!$edit_filter_id || $subop != "edit") {
2742
2743 if (!$line["description"]) $line["description"] = "[No description]";
2744
2745 print "<td align='center'><input onclick='toggleSelectRow(this);'
2746 type=\"checkbox\" id=\"FICHK-".$line["id"]."\"></td>";
2747
2748 print "<td><a href=\"javascript:editFilter($filter_id);\">" .
2749 $line["reg_exp"] . "</td>";
2750
2751 print "<td><a href=\"javascript:editFilter($filter_id);\">" .
2752 $line["feed_title"] . "</td>";
2753
2754 print "<td><a href=\"javascript:editFilter($filter_id);\">" .
2755 $line["filter_type_descr"] . "</td>";
2756
2757 print "<td><a href=\"javascript:editFilter($filter_id);\">" .
2758 $line["action_description"] . "</td>";
2759
2760 print "<td><a href=\"javascript:editFilter($filter_id);\">" .
2761 $line["description"] . "</td>";
2762
2763 } else if ($filter_id != $edit_filter_id) {
2764
2765 if (!$line["description"]) $line["description"] = "[No description]";
2766
2767 print "<td><input disabled=\"true\" type=\"checkbox\"
2768 id=\"FICHK-".$line["id"]."\"></td>";
2769
2770 print "<td>".$line["reg_exp"]."</td>";
2771 print "<td>".$line["feed_title"]."</td>";
2772 print "<td>".$line["filter_type_descr"]."</td>";
2773 print "<td>".$line["action_description"]."</td>";
2774 print "<td>".$line["description"]."</td>";
2775
2776 } else {
2777
2778 print "<td><input disabled=\"true\" type=\"checkbox\" checked></td>";
2779
2780 print "<td><input id=\"iedit_regexp\" value=\"".$line["reg_exp"].
2781 "\"></td>";
2782
2783 print "<td>";
2784 print "<select id=\"iedit_feed\">";
2785 print "<option id=\"0\">All feeds</option>";
2786
2787 $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds
2788 WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY title");
2789
2790 if (db_num_rows($tmp_result) > 0) {
2791 print "<option disabled>--------</option>";
2792 }
2793
2794 while ($tmp_line = db_fetch_assoc($tmp_result)) {
2795 if ($tmp_line["id"] == $line["feed_id"]) {
2796 $is_selected = "selected";
2797 } else {
2798 $is_selected = "";
2799 }
2800 printf("<option $is_selected id='%d'>%s</option>",
2801 $tmp_line["id"], $tmp_line["title"]);
2802 }
2803
2804 print "</select></td>";
2805
2806 print "<td>";
2807 print_select("iedit_match", $line["filter_type_descr"], $filter_types);
2808 print "</td>";
2809
2810 print "<td>";
2811 print "<select id=\"iedit_filter_action\">";
2812
2813 $tmp_result = db_query($link, "SELECT id,description FROM ttrss_filter_actions
2814 ORDER BY description");
2815
2816 while ($tmp_line = db_fetch_assoc($tmp_result)) {
2817 if ($tmp_line["description"] == $line["action_description"]) {
2818 $is_selected = "selected";
2819 } else {
2820 $is_selected = "";
2821 }
2822 printf("<option $is_selected id='%d'>%s</option>",
2823 $tmp_line["id"], $tmp_line["description"]);
2824 }
2825
2826 print "</select></td>";
2827
2828
2829 print "<td><input id=\"iedit_descr\" value=\"".$line["description"].
2830 "\"></td>";
2831
2832 print "</td>";
2833 }
2834
2835 print "</tr>";
2836
2837 ++$lnum;
2838 }
2839
2840 if ($lnum == 0) {
2841 print "<tr><td colspan=\"4\" align=\"center\">No filters defined.</td></tr>";
2842 }
2843
2844 print "</table>";
2845
2846 print "<p>";
2847
2848 if ($subop == "edit") {
2849 print "Edit filter:
2850 <input type=\"submit\" class=\"button\"
2851 onclick=\"javascript:filterEditSave()\" value=\"Save\">
2852 <input type=\"submit\" class=\"button\"
2853 onclick=\"javascript:filterEditCancel()\" value=\"Cancel\">";
2854
2855 } else {
2856
2857 print "
2858 Selection:
2859 <input type=\"submit\" class=\"button\"
2860 onclick=\"javascript:editSelectedFilter()\" value=\"Edit\">
2861 <input type=\"submit\" class=\"button\"
2862 onclick=\"javascript:removeSelectedFilters()\" value=\"Remove\">";
2863 }
2864
2865 } else {
2866
2867 print "<p>No filters defined.</p>";
2868
2869 }
2870 }
2871
2872 // We need to accept raw SQL data in label queries, so not everything is escaped
2873 // here, this is by design. If you don't like the whole idea, disable labels
2874 // altogether with GLOBAL_ENABLE_LABELS = false
2875
2876 if ($op == "pref-labels") {
2877
2878 if (!GLOBAL_ENABLE_LABELS) {
2879 return;
2880 }
2881
2882 $subop = $_GET["subop"];
2883
2884 if ($subop == "test") {
2885
2886 $expr = $_GET["expr"];
2887 $descr = $_GET["descr"];
2888
2889 print "<div class='infoBoxContents'>";
2890
2891 print "<h1>Label &laquo;$descr&raquo;</h1>";
2892
2893 // print "<p><b>Expression</b>: $expr</p>";
2894
2895 $result = db_query($link,
2896 "SELECT count(id) AS num_matches
2897 FROM ttrss_entries,ttrss_user_entries
2898 WHERE ($expr) AND
2899 ttrss_user_entries.ref_id = ttrss_entries.id AND
2900 owner_uid = " . $_SESSION["uid"]);
2901
2902 $num_matches = db_fetch_result($result, 0, "num_matches");;
2903
2904 if ($num_matches > 0) {
2905
2906 print "<p>Query returned <b>$num_matches</b> matches, first 5 follow:</p>";
2907
2908 $result = db_query($link,
2909 "SELECT title,
2910 (SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
2911 FROM ttrss_entries,ttrss_user_entries
2912 WHERE ($expr) AND
2913 ttrss_user_entries.ref_id = ttrss_entries.id
2914 AND owner_uid = " . $_SESSION["uid"] . "
2915 ORDER BY date_entered DESC LIMIT 5");
2916
2917 print "<ul class=\"nomarks\">";
2918 while ($line = db_fetch_assoc($result)) {
2919 print "<li>".$line["title"].
2920 " <span class=\"insensitive\">(".$line["feed_title"].")</span></li>";
2921 }
2922 print "</ul>";
2923
2924 } else {
2925 print "<p>Query didn't return any matches.</p>";
2926 }
2927
2928 print "</div>";
2929
2930 print "<div align='center'>
2931 <input type='submit' class='button'
2932 onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
2933 return;
2934 }
2935
2936 if ($subop == "editSave") {
2937
2938 $sql_exp = $_GET["s"];
2939 $descr = $_GET["d"];
2940 $label_id = db_escape_string($_GET["id"]);
2941
2942 // print "$sql_exp : $descr : $label_id";
2943
2944 $result = db_query($link, "UPDATE ttrss_labels SET
2945 sql_exp = '$sql_exp',
2946 description = '$descr'
2947 WHERE id = '$label_id'");
2948 }
2949
2950 if ($subop == "remove") {
2951
2952 if (!WEB_DEMO_MODE) {
2953
2954 $ids = split(",", db_escape_string($_GET["ids"]));
2955
2956 foreach ($ids as $id) {
2957 db_query($link, "DELETE FROM ttrss_labels WHERE id = '$id'");
2958
2959 }
2960 }
2961 }
2962
2963 if ($subop == "add") {
2964
2965 if (!WEB_DEMO_MODE) {
2966
2967 // no escaping is done here on purpose
2968 $exp = trim($_GET["exp"]);
2969
2970 $result = db_query($link,
2971 "INSERT INTO ttrss_labels (sql_exp,description,owner_uid)
2972 VALUES ('$exp', '$exp', '".$_SESSION["uid"]."')");
2973 }
2974 }
2975
2976 print "<div class=\"prefGenericAddBox\">
2977 <input size=\"40\" id=\"ladd_expr\">&nbsp;";
2978
2979 print"<input type=\"submit\" class=\"button\"
2980 onclick=\"javascript:addLabel()\" value=\"Add label\"></div>";
2981
2982 $result = db_query($link, "SELECT
2983 id,sql_exp,description
2984 FROM
2985 ttrss_labels
2986 WHERE
2987 owner_uid = ".$_SESSION["uid"]."
2988 ORDER by description");
2989
2990 print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
2991
2992 if (db_num_rows($result) != 0) {
2993
2994 print "<p><table width=\"100%\" cellspacing=\"0\"
2995 class=\"prefLabelList\" id=\"prefLabelList\">";
2996
2997 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2998 Select:
2999 <a href=\"javascript:selectTableRowsByIdPrefix('prefLabelList',
3000 'LILRR-', 'LICHK-', true)\">All</a>,
3001 <a href=\"javascript:selectTableRowsByIdPrefix('prefLabelList',
3002 'LILRR-', 'LICHK-', false)\">None</a>
3003 </td</tr>";
3004
3005 print "<tr class=\"title\">
3006 <td align='center' width=\"5%\">&nbsp;</td>
3007 <td width=\"40%\">SQL expression
3008 <a class=\"helpLink\" href=\"javascript:displayHelpInfobox(1)\">(?)</a>
3009 </td>
3010 <td width=\"40%\">Caption</td></tr>";
3011
3012 $lnum = 0;
3013
3014 while ($line = db_fetch_assoc($result)) {
3015
3016 $class = ($lnum % 2) ? "even" : "odd";
3017
3018 $label_id = $line["id"];
3019 $edit_label_id = $_GET["id"];
3020
3021 if ($subop == "edit" && $label_id != $edit_label_id) {
3022 $class .= "Grayed";
3023 $this_row_id = "";
3024 } else {
3025 $this_row_id = "id=\"LILRR-$label_id\"";
3026 }
3027
3028 print "<tr class=\"$class\" $this_row_id>";
3029
3030 $line["sql_exp"] = htmlspecialchars($line["sql_exp"]);
3031 $line["description"] = htmlspecialchars($line["description"]);
3032
3033 if (!$edit_label_id || $subop != "edit") {
3034
3035 if (!$line["description"]) $line["description"] = "[No caption]";
3036
3037 print "<td align='center'><input onclick='toggleSelectRow(this);'
3038 type=\"checkbox\" id=\"LICHK-".$line["id"]."\"></td>";
3039
3040 print "<td><a href=\"javascript:editLabel($label_id);\">" .
3041 $line["sql_exp"] . "</td>";
3042
3043 print "<td><a href=\"javascript:editLabel($label_id);\">" .
3044 $line["description"] . "</td>";
3045
3046 } else if ($label_id != $edit_label_id) {
3047
3048 if (!$line["description"]) $line["description"] = "[No description]";
3049
3050 print "<td><input disabled=\"true\" type=\"checkbox\"
3051 id=\"LICHK-".$line["id"]."\"></td>";
3052
3053 print "<td>".$line["sql_exp"]."</td>";
3054 print "<td>".$line["description"]."</td>";
3055
3056 } else {
3057
3058 print "<td><input disabled=\"true\" type=\"checkbox\" checked></td>";
3059
3060 print "<td><input id=\"iedit_expr\" value=\"".$line["sql_exp"].
3061 "\"></td>";
3062
3063 print "<td><input id=\"iedit_descr\" value=\"".$line["description"].
3064 "\"></td>";
3065
3066 }
3067
3068
3069 print "</tr>";
3070
3071 ++$lnum;
3072 }
3073
3074 if ($lnum == 0) {
3075 print "<tr><td colspan=\"4\" align=\"center\">No labels defined.</td></tr>";
3076 }
3077
3078 print "</table>";
3079
3080 print "<p>";
3081
3082 if ($subop == "edit") {
3083 print "Edit label:
3084 <input type=\"submit\" class=\"button\"
3085 onclick=\"javascript:labelTest()\" value=\"Test\">
3086 <input type=\"submit\" class=\"button\"
3087 onclick=\"javascript:labelEditSave()\" value=\"Save\">
3088 <input type=\"submit\" class=\"button\"
3089 onclick=\"javascript:labelEditCancel()\" value=\"Cancel\">";
3090
3091 } else {
3092
3093 print "
3094 Selection:
3095 <input type=\"submit\" class=\"button\"
3096 onclick=\"javascript:editSelectedLabel()\" value=\"Edit\">
3097 <input type=\"submit\" class=\"button\"
3098 onclick=\"javascript:removeSelectedLabels()\" value=\"Remove\">";
3099 }
3100 } else {
3101 print "<p>No labels defined.</p>";
3102 }
3103 }
3104
3105 if ($op == "error") {
3106 print "<div width=\"100%\" align='center'>";
3107 $msg = $_GET["msg"];
3108 print $msg;
3109 print "</div>";
3110 }
3111
3112 if ($op == "help") {
3113 if (!$_GET["noheaders"]) {
3114 print "<html><head>
3115 <title>Tiny Tiny RSS : Help</title>
3116 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
3117 <script type=\"text/javascript\" src=\"functions.js\"></script>
3118 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
3119 </head><body>";
3120 }
3121
3122 $tid = sprintf("%d", $_GET["tid"]);
3123
3124 print "<div class='infoBoxContents'>";
3125
3126 if (file_exists("help/$tid.php")) {
3127 include("help/$tid.php");
3128 } else {
3129 print "<p>Help topic not found.</p>";
3130 }
3131
3132 print "</div>";
3133
3134 print "<div align='center'>
3135 <input type='submit' class='button'
3136 onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
3137
3138 if (!$_GET["noheaders"]) {
3139 print "</body></html>";
3140 }
3141
3142 }
3143
3144 if ($op == "dlg") {
3145 $id = $_GET["id"];
3146 $param = $_GET["param"];
3147
3148 if ($id == "quickAddFeed") {
3149 print "
3150 Feed URL: <input
3151 onblur=\"javascript:enableHotkeys()\" onfocus=\"javascript:disableHotkeys()\"
3152 id=\"qafInput\">";
3153
3154 if (get_pref($link, 'ENABLE_FEED_CATS')) {
3155 $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories
3156 WHERE owner_uid = ".$_SESSION["uid"]."
3157 ORDER BY title");
3158
3159 print " <select id=\"qafCat\">";
3160 print "<option id=\"0\">Uncategorized</option>";
3161
3162 if (db_num_rows($result) != 0) {
3163
3164 print "<option disabled>--------</option>";
3165
3166 while ($line = db_fetch_assoc($result)) {
3167 printf("<option id='%d'>%s</option>",
3168 $line["id"], $line["title"]);
3169 }
3170 }
3171
3172 print "</select>";
3173 }
3174
3175 print "&nbsp;<input class=\"button\"
3176 type=\"submit\" onclick=\"javascript:qafAdd()\" value=\"Add feed\">
3177 <input class=\"button\"
3178 type=\"submit\" onclick=\"javascript:closeDlg()\"
3179 value=\"Cancel\">";
3180 }
3181
3182 if ($id == "quickDelFeed") {
3183
3184 $param = db_escape_string($param);
3185
3186 $result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$param'");
3187
3188 if ($result) {
3189
3190 $f_title = db_fetch_result($result, 0, "title");
3191
3192 print "Remove current feed (<b>$f_title</b>)?&nbsp;
3193 <input class=\"button\"
3194 type=\"submit\" onclick=\"javascript:qfdDelete($param)\" value=\"Remove\">
3195 <input class=\"button\"
3196 type=\"submit\" onclick=\"javascript:closeDlg()\"
3197 value=\"Cancel\">";
3198 } else {
3199 print "Error: Feed $param not found.&nbsp;
3200 <input class=\"button\"
3201 type=\"submit\" onclick=\"javascript:closeDlg()\"
3202 value=\"Cancel\">";
3203 }
3204 }
3205
3206 if ($id == "search") {
3207
3208 $active_feed_id = db_escape_string($_GET["param"]);
3209
3210 print "<input id=\"searchbox\" class=\"extSearch\"
3211 onblur=\"javascript:enableHotkeys()\" onfocus=\"javascript:disableHotkeys()\"
3212 onchange=\"javascript:search()\">
3213 <select id=\"searchmodebox\">
3214 <option selected>All feeds</option>";
3215
3216 if ($active_feed_id) {
3217 print "<option>This feed</option>";
3218 } else {
3219 print "<option disabled>This feed</option>";
3220 }
3221
3222 if (get_pref($link, 'ENABLE_FEED_CATS')) {
3223 print "<option>This category</option>";
3224 }
3225
3226 print "</select>
3227 <input type=\"submit\"
3228 class=\"button\" onclick=\"javascript:search()\" value=\"Search\">
3229 <input class=\"button\"
3230 type=\"submit\" onclick=\"javascript:closeDlg()\"
3231 value=\"Close\">";
3232
3233 }
3234
3235 if ($id == "quickAddFilter") {
3236
3237 $result = db_query($link, "SELECT description
3238 FROM ttrss_filter_types ORDER BY description");
3239
3240 $filter_types = array();
3241
3242 while ($line = db_fetch_assoc($result)) {
3243 array_push($filter_types, $line["description"]);
3244 }
3245
3246 print "<table>";
3247
3248 print "<tr><td>Match:</td><td><input id=\"fadd_regexp\" size=\"40\">&nbsp;";
3249
3250 print_select("fadd_match", "Title", $filter_types);
3251
3252 print "</td></tr>";
3253 print "<tr><td>Feed:</td><td><select id=\"fadd_feed\">";
3254
3255 print "<option selected id=\"0\">All feeds</option>";
3256
3257 $result = db_query($link, "SELECT id,title FROM ttrss_feeds
3258 WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY title");
3259
3260 if (db_num_rows($result) > 0) {
3261 print "<option disabled>--------</option>";
3262 }
3263
3264 while ($line = db_fetch_assoc($result)) {
3265 if ($param == $line["id"]) {
3266 $selected = "selected";
3267 } else {
3268 $selected = "";
3269 }
3270 printf("<option id='%d' %s>%s</option>", $line["id"], $selected, $line["title"]);
3271 }
3272
3273 print "</select></td></tr>";
3274
3275 print "<tr><td>Action:</td>";
3276
3277 print "<td><select id=\"fadd_action\">";
3278
3279 $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions
3280 ORDER BY name");
3281
3282 while ($line = db_fetch_assoc($result)) {
3283 printf("<option id='%d'>%s</option>", $line["id"], $line["description"]);
3284 }
3285
3286 print "</select>";
3287
3288 print "</td></tr><tr><td colspan=\"2\" align=\"right\">";
3289
3290 print "<input type=\"submit\"
3291 class=\"button\" onclick=\"javascript:qaddFilter()\"
3292 value=\"Add filter\"> ";
3293
3294 print "<input class=\"button\"
3295 type=\"submit\" onclick=\"javascript:closeDlg()\"
3296 value=\"Close\">";
3297
3298 print "</td></tr></table>";
3299 }
3300 }
3301
3302 // update feeds of all users, may be used anonymously
3303 if ($op == "globalUpdateFeeds") {
3304
3305 $result = db_query($link, "SELECT id FROM ttrss_users");
3306
3307 while ($line = db_fetch_assoc($result)) {
3308 $user_id = $line["id"];
3309 // print "<!-- updating feeds of uid $user_id -->";
3310 update_all_feeds($link, false, $user_id);
3311 }
3312
3313 print "<rpc-reply>
3314 <message msg=\"All feeds updated\"/>
3315 </rpc-reply>";
3316
3317 }
3318
3319 if ($op == "pref-prefs") {
3320
3321 $subop = $_REQUEST["subop"];
3322
3323 if ($subop == "Save configuration") {
3324
3325 if (WEB_DEMO_MODE) {
3326 header("Location: prefs.php");
3327 return;
3328 }
3329
3330 $_SESSION["prefs_op_result"] = "save-config";
3331
3332 $_SESSION["prefs_cache"] = false;
3333
3334 foreach (array_keys($_POST) as $pref_name) {
3335
3336 $pref_name = db_escape_string($pref_name);
3337 $value = db_escape_string($_POST[$pref_name]);
3338
3339 $result = db_query($link, "SELECT type_name
3340 FROM ttrss_prefs,ttrss_prefs_types
3341 WHERE pref_name = '$pref_name' AND type_id = ttrss_prefs_types.id");
3342
3343 if (db_num_rows($result) > 0) {
3344
3345 $type_name = db_fetch_result($result, 0, "type_name");
3346
3347 // print "$pref_name : $type_name : $value<br>";
3348
3349 if ($type_name == "bool") {
3350 if ($value == "1") {
3351 $value = "true";
3352 } else {
3353 $value = "false";
3354 }
3355 } else if ($type_name == "integer") {
3356 $value = sprintf("%d", $value);
3357 }
3358
3359 // print "$pref_name : $type_name : $value<br>";
3360
3361 db_query($link, "UPDATE ttrss_user_prefs SET value = '$value'
3362 WHERE pref_name = '$pref_name' AND owner_uid = ".$_SESSION["uid"]);
3363
3364 }
3365
3366 header("Location: prefs.php");
3367
3368 }
3369
3370 } else if ($subop == "getHelp") {
3371
3372 $pref_name = db_escape_string($_GET["pn"]);
3373
3374 $result = db_query($link, "SELECT help_text FROM ttrss_prefs
3375 WHERE pref_name = '$pref_name'");
3376
3377 if (db_num_rows($result) > 0) {
3378 $help_text = db_fetch_result($result, 0, "help_text");
3379 print $help_text;
3380 } else {
3381 print "Unknown option: $pref_name";
3382 }
3383
3384 } else if ($subop == "Change e-mail") {
3385
3386 if (WEB_DEMO_MODE) {
3387 header("Location: prefs.php");
3388 return;
3389 }
3390
3391 $email = db_escape_string($_GET["email"]);
3392 $active_uid = $_SESSION["uid"];
3393
3394 if ($email) {
3395 db_query($link, "UPDATE ttrss_users SET email = '$email'
3396 WHERE id = '$active_uid'");
3397 }
3398
3399 header("Location: prefs.php");
3400
3401 } else if ($subop == "Change password") {
3402
3403 if (WEB_DEMO_MODE) {
3404 header("Location: prefs.php");
3405 return;
3406 }
3407
3408 $old_pw = $_POST["OLD_PASSWORD"];
3409 $new_pw = $_POST["OLD_PASSWORD"];
3410
3411 $old_pw_hash = 'SHA1:' . sha1($_POST["OLD_PASSWORD"]);
3412 $new_pw_hash = 'SHA1:' . sha1($_POST["NEW_PASSWORD"]);
3413
3414 $active_uid = $_SESSION["uid"];
3415
3416 if ($old_pw && $new_pw) {
3417
3418 $login = db_escape_string($_SERVER['PHP_AUTH_USER']);
3419
3420 $result = db_query($link, "SELECT id FROM ttrss_users WHERE
3421 id = '$active_uid' AND (pwd_hash = '$old_pw' OR
3422 pwd_hash = '$old_pw_hash')");
3423
3424 if (db_num_rows($result) == 1) {
3425 db_query($link, "UPDATE ttrss_users SET pwd_hash = '$new_pw_hash'
3426 WHERE id = '$active_uid'");
3427
3428 $_SESSION["pwd_change_result"] = "ok";
3429 } else {
3430 $_SESSION["pwd_change_result"] = "failed";
3431 }
3432 }
3433
3434 header("Location: prefs.php");
3435
3436 } else if ($subop == "Reset to defaults") {
3437
3438 if (WEB_DEMO_MODE) {
3439 header("Location: prefs.php");
3440 return;
3441 }
3442
3443 $_SESSION["prefs_op_result"] = "reset-to-defaults";
3444
3445 if (DB_TYPE == "pgsql") {
3446 db_query($link,"UPDATE ttrss_user_prefs
3447 SET value = ttrss_prefs.def_value
3448 WHERE owner_uid = '".$_SESSION["uid"]."' AND
3449 ttrss_prefs.pref_name = ttrss_user_prefs.pref_name");
3450 } else {
3451 db_query($link, "DELETE FROM ttrss_user_prefs
3452 WHERE owner_uid = ".$_SESSION["uid"]);
3453 initialize_user_prefs($link, $_SESSION["uid"]);
3454 }
3455
3456 header("Location: prefs.php");
3457
3458 } else if ($subop == "Change theme") {
3459
3460 $theme = db_escape_string($_POST["theme"]);
3461
3462 if ($theme == "Default") {
3463 $theme_qpart = 'NULL';
3464 } else {
3465 $theme_qpart = "'$theme'";
3466 }
3467
3468 $result = db_query($link, "SELECT id,theme_path FROM ttrss_themes
3469 WHERE theme_name = '$theme'");
3470
3471 if (db_num_rows($result) == 1) {
3472 $theme_id = db_fetch_result($result, 0, "id");
3473 $theme_path = db_fetch_result($result, 0, "theme_path");
3474 } else {
3475 $theme_id = "NULL";
3476 $theme_path = "";
3477 }
3478
3479 db_query($link, "UPDATE ttrss_users SET
3480 theme_id = $theme_id WHERE id = " . $_SESSION["uid"]);
3481
3482 $_SESSION["theme"] = $theme_path;
3483
3484 header("Location: prefs.php");
3485
3486 } else {
3487
3488 if (!SINGLE_USER_MODE) {
3489
3490 $result = db_query($link, "SELECT id,email FROM ttrss_users
3491 WHERE id = ".$_SESSION["uid"]." AND (pwd_hash = 'password' OR
3492 pwd_hash = 'SHA1:".sha1("password")."')");
3493
3494 if (db_num_rows($result) != 0) {
3495 print "<div class=\"warning\">
3496 Your password is at default value, please change it.
3497 </div>";
3498 }
3499
3500 if ($_SESSION["pwd_change_result"] == "failed") {
3501 print "<div class=\"warning\">
3502 There was an error while changing your password.
3503 </div>";
3504 }
3505
3506 if ($_SESSION["pwd_change_result"] == "ok") {
3507 print "<div class=\"notice\">
3508 Password changed successfully.
3509 </div>";
3510 }
3511
3512 $_SESSION["pwd_change_result"] = "";
3513
3514 if ($_SESSION["prefs_op_result"] == "reset-to-defaults") {
3515 print "<div class=\"notice\">
3516 Your configuration was reset to defaults.
3517 </div>";
3518 }
3519
3520 if ($_SESSION["prefs_op_result"] == "save-config") {
3521 print "<div class=\"notice\">
3522 Your configuration was saved successfully.
3523 </div>";
3524 }
3525
3526 $_SESSION["prefs_op_result"] = "";
3527
3528 print "<form action=\"backend.php\" method=\"GET\">";
3529
3530 print "<table width=\"100%\" class=\"prefPrefsList\">";
3531 print "<tr><td colspan='3'><h3>Personal data</h3></tr></td>";
3532
3533 $result = db_query($link, "SELECT email FROM ttrss_users
3534 WHERE id = ".$_SESSION["uid"]);
3535
3536 $email = db_fetch_result($result, 0, "email");
3537
3538 print "<tr><td width=\"40%\">E-mail</td>";
3539 print "<td><input class=\"editbox\" name=\"email\"
3540 value=\"$email\"></td></tr>";
3541
3542 print "</table>";
3543
3544 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3545
3546 print "<p><input class=\"button\" type=\"submit\"
3547 value=\"Change e-mail\" name=\"subop\">";
3548
3549 print "</form>";
3550
3551 print "<form action=\"backend.php\" method=\"POST\">";
3552
3553 print "<table width=\"100%\" class=\"prefPrefsList\">";
3554 print "<tr><td colspan='3'><h3>Authentication</h3></tr></td>";
3555
3556 print "<tr><td width=\"40%\">Old password</td>";
3557 print "<td><input class=\"editbox\" type=\"password\"
3558 name=\"OLD_PASSWORD\"></td></tr>";
3559
3560 print "<tr><td width=\"40%\">New password</td>";
3561
3562 print "<td><input class=\"editbox\" type=\"password\"
3563 name=\"NEW_PASSWORD\"></td></tr>";
3564
3565 print "</table>";
3566
3567 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3568
3569 print "<p><input class=\"button\" type=\"submit\"
3570 value=\"Change password\" name=\"subop\">";
3571
3572 print "</form>";
3573
3574 }
3575
3576 $result = db_query($link, "SELECT
3577 theme_id FROM ttrss_users WHERE id = " . $_SESSION["uid"]);
3578
3579 $user_theme_id = db_fetch_result($result, 0, "theme_id");
3580
3581 $result = db_query($link, "SELECT
3582 id,theme_name FROM ttrss_themes ORDER BY theme_name");
3583
3584 if (db_num_rows($result) > 0) {
3585
3586 print "<form action=\"backend.php\" method=\"POST\">";
3587 print "<table width=\"100%\" class=\"prefPrefsList\">";
3588 print "<tr><td colspan='3'><h3>Themes</h3></tr></td>";
3589 print "<tr><td width=\"40%\">Select theme</td>";
3590 print "<td><select name=\"theme\">";
3591 print "<option>Default</option>";
3592 print "<option disabled>--------</option>";
3593
3594 while ($line = db_fetch_assoc($result)) {
3595 if ($line["id"] == $user_theme_id) {
3596 $selected = "selected";
3597 } else {
3598 $selected = "";
3599 }
3600 print "<option $selected>" . $line["theme_name"] . "</option>";
3601 }
3602 print "</select></td></tr>";
3603 print "</table>";
3604 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3605 print "<p><input class=\"button\" type=\"submit\"
3606 value=\"Change theme\" name=\"subop\">";
3607 print "</form>";
3608 }
3609
3610 $result = db_query($link, "SELECT
3611 ttrss_user_prefs.pref_name,short_desc,help_text,value,type_name,
3612 section_name,def_value
3613 FROM ttrss_prefs,ttrss_prefs_types,ttrss_prefs_sections,ttrss_user_prefs
3614 WHERE type_id = ttrss_prefs_types.id AND
3615 section_id = ttrss_prefs_sections.id AND
3616 ttrss_user_prefs.pref_name = ttrss_prefs.pref_name AND
3617 owner_uid = ".$_SESSION["uid"]."
3618 ORDER BY section_id,short_desc");
3619
3620 print "<form action=\"backend.php\" method=\"POST\">";
3621
3622 $lnum = 0;
3623
3624 $active_section = "";
3625
3626 while ($line = db_fetch_assoc($result)) {
3627
3628 if ($active_section != $line["section_name"]) {
3629
3630 if ($active_section != "") {
3631 print "</table>";
3632 }
3633
3634 print "<p><table width=\"100%\" class=\"prefPrefsList\">";
3635
3636 $active_section = $line["section_name"];
3637
3638 print "<tr><td colspan=\"3\"><h3>$active_section</h3></td></tr>";
3639 // print "<tr class=\"title\">
3640 // <td width=\"25%\">Option</td><td>Value</td></tr>";
3641
3642 $lnum = 0;
3643 }
3644
3645 // $class = ($lnum % 2) ? "even" : "odd";
3646
3647 print "<tr>";
3648
3649 $type_name = $line["type_name"];
3650 $pref_name = $line["pref_name"];
3651 $value = $line["value"];
3652 $def_value = $line["def_value"];
3653 $help_text = $line["help_text"];
3654
3655 print "<td width=\"40%\" id=\"$pref_name\">" . $line["short_desc"];
3656
3657 if ($help_text) print "<div class=\"prefHelp\">$help_text</div>";
3658
3659 print "</td>";
3660
3661 print "<td>";
3662
3663 if ($type_name == "bool") {
3664 // print_select($pref_name, $value, array("true", "false"));
3665
3666 if ($value == "true") {
3667 $value = "Yes";
3668 } else {
3669 $value = "No";
3670 }
3671
3672 print_radio($pref_name, $value, array("Yes", "No"));
3673
3674 } else {
3675 print "<input class=\"editbox\" name=\"$pref_name\" value=\"$value\">";
3676 }
3677
3678 print "</td>";
3679
3680 print "</tr>";
3681
3682 $lnum++;
3683 }
3684
3685 print "</table>";
3686
3687 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3688
3689 print "<p><input class=\"button\" type=\"submit\"
3690 name=\"subop\" value=\"Save configuration\">";
3691
3692 print "&nbsp;<input class=\"button\" type=\"submit\"
3693 name=\"subop\" onclick=\"return validatePrefsReset()\"
3694 value=\"Reset to defaults\"></p>";
3695
3696 print "</form>";
3697
3698 }
3699
3700 }
3701
3702 if ($op == "pref-users") {
3703
3704 $subop = $_GET["subop"];
3705
3706 if ($subop == "editSave") {
3707
3708 if (!WEB_DEMO_MODE) {
3709
3710 $login = db_escape_string($_GET["l"]);
3711 $uid = db_escape_string($_GET["id"]);
3712 $access_level = sprintf("%d", $_GET["al"]);
3713 $email = db_escape_string($_GET["e"]);
3714
3715 db_query($link, "UPDATE ttrss_users SET login = '$login',
3716 access_level = '$access_level', email = '$email' WHERE id = '$uid'");
3717
3718 }
3719 } else if ($subop == "remove") {
3720
3721 if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3722
3723 $ids = split(",", db_escape_string($_GET["ids"]));
3724
3725 foreach ($ids as $id) {
3726 db_query($link, "DELETE FROM ttrss_users WHERE id = '$id' AND id != " . $_SESSION["uid"]);
3727
3728 }
3729 }
3730 } else if ($subop == "add") {
3731
3732 if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3733
3734 $login = db_escape_string(trim($_GET["login"]));
3735 $tmp_user_pwd = make_password(8);
3736 $pwd_hash = 'SHA1:' . sha1($tmp_user_pwd);
3737
3738 db_query($link, "INSERT INTO ttrss_users
3739 (login,pwd_hash,access_level,last_login)
3740 VALUES ('$login', '$pwd_hash', 0, NOW())");
3741
3742
3743 $result = db_query($link, "SELECT id FROM ttrss_users WHERE
3744 login = '$login' AND pwd_hash = '$pwd_hash'");
3745
3746 if (db_num_rows($result) == 1) {
3747
3748 $new_uid = db_fetch_result($result, 0, "id");
3749
3750 print "<div class=\"notice\">Added user <b>".$_GET["login"].
3751 "</b> with password <b>$tmp_user_pwd</b>.</div>";
3752
3753 initialize_user($link, $new_uid);
3754
3755 } else {
3756
3757 print "<div class=\"warning\">Error while adding user <b>".
3758 $_GET["login"].".</b></div>";
3759
3760 }
3761 }
3762 } else if ($subop == "resetPass") {
3763
3764 if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3765
3766 $uid = db_escape_string($_GET["id"]);
3767
3768 $result = db_query($link, "SELECT login,email
3769 FROM ttrss_users WHERE id = '$uid'");
3770
3771 $login = db_fetch_result($result, 0, "login");
3772 $email = db_fetch_result($result, 0, "email");
3773 $tmp_user_pwd = make_password(8);
3774 $pwd_hash = 'SHA1:' . sha1($tmp_user_pwd);
3775
3776 db_query($link, "UPDATE ttrss_users SET pwd_hash = '$pwd_hash'
3777 WHERE id = '$uid'");
3778
3779 print "<div class=\"notice\">Changed password of
3780 user <b>$login</b> to <b>$tmp_user_pwd</b>.";
3781
3782 if (MAIL_RESET_PASS && $email) {
3783 print " Notifying <b>$email</b>.";
3784
3785 mail("$login <$email>", "Password reset notification",
3786 "Hi, $login.\n".
3787 "\n".
3788 "Your password for this TT-RSS installation was reset by".
3789 " an administrator.\n".
3790 "\n".
3791 "Your new password is $tmp_user_pwd, please remember".
3792 " it for later reference.\n".
3793 "\n".
3794 "Sincerely, TT-RSS Mail Daemon.", "From: " . MAIL_FROM);
3795 }
3796
3797 print "</div>";
3798
3799 }
3800 }
3801
3802 print "<div class=\"prefGenericAddBox\">
3803 <input id=\"uadd_box\" onchange=\"javascript:addUser()\" size=\"40\">&nbsp;";
3804
3805 print"<input type=\"submit\" class=\"button\"
3806 onclick=\"javascript:addUser()\" value=\"Add user\"></div>";
3807
3808 $result = db_query($link, "SELECT
3809 id,login,access_level,email,
3810 SUBSTRING(last_login,1,16) as last_login
3811 FROM
3812 ttrss_users
3813 ORDER by login");
3814
3815 print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
3816
3817 print "<p><table width=\"100%\" cellspacing=\"0\"
3818 class=\"prefUserList\" id=\"prefUserList\">";
3819
3820 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
3821 Select:
3822 <a href=\"javascript:selectTableRowsByIdPrefix('prefUserList',
3823 'UMRR-', 'UMCHK-', true)\">All</a>,
3824 <a href=\"javascript:selectTableRowsByIdPrefix('prefUserList',
3825 'UMRR-', 'UMCHK-', false)\">None</a>
3826 </td</tr>";
3827
3828 print "<tr class=\"title\">
3829 <td align='center' width=\"5%\">&nbsp;</td>
3830 <td width='20%'>Username</td>
3831 <td width='20%'>E-mail</td>
3832 <td width='20%'>Access Level</td>
3833 <td width='20%'>Last login</td></tr>";
3834
3835 $lnum = 0;
3836
3837 while ($line = db_fetch_assoc($result)) {
3838
3839 $class = ($lnum % 2) ? "even" : "odd";
3840
3841 $uid = $line["id"];
3842 $edit_uid = $_GET["id"];
3843
3844 if ($subop == "edit" && $uid != $edit_uid) {
3845 $class .= "Grayed";
3846 $this_row_id = "";
3847 } else {
3848 $this_row_id = "id=\"UMRR-$uid\"";
3849 }
3850
3851 print "<tr class=\"$class\" $this_row_id>";
3852
3853 $line["login"] = htmlspecialchars($line["login"]);
3854
3855 $line["last_login"] = date(get_pref($link, 'SHORT_DATE_FORMAT'),
3856 strtotime($line["last_login"]));
3857
3858 /* if ($uid == $_SESSION["uid"]) {
3859
3860 print "<td align='center'><input disabled=\"true\" type=\"checkbox\"
3861 id=\"UMCHK-".$line["id"]."\"></td>";
3862
3863 print "<td>".$line["login"]."</td>";
3864 print "<td>".$line["email"]."</td>";
3865 print "<td>".$line["access_level"]."</td>";
3866
3867 } else */ if (!$edit_uid || $subop != "edit") {
3868
3869 print "<td align='center'><input onclick='toggleSelectRow(this);'
3870 type=\"checkbox\" id=\"UMCHK-$uid\"></td>";
3871
3872 print "<td><a href=\"javascript:editUser($uid);\">" .
3873 $line["login"] . "</td>";
3874
3875 print "<td><a href=\"javascript:editUser($uid);\">" .
3876 $line["email"] . "</td>";
3877
3878 print "<td><a href=\"javascript:editUser($uid);\">" .
3879 $line["access_level"] . "</td>";
3880
3881 } else if ($uid != $edit_uid) {
3882
3883 print "<td align='center'><input disabled=\"true\" type=\"checkbox\"
3884 id=\"UMCHK-".$line["id"]."\"></td>";
3885
3886 print "<td>".$line["login"]."</td>";
3887 print "<td>".$line["email"]."</td>";
3888 print "<td>".$line["access_level"]."</td>";
3889
3890 } else {
3891
3892 print "<td align='center'>
3893 <input disabled=\"true\" type=\"checkbox\" checked></td>";
3894
3895 print "<td><input id=\"iedit_ulogin\" value=\"".$line["login"].
3896 "\"></td>";
3897
3898 print "<td><input id=\"iedit_email\" value=\"".$line["email"].
3899 "\"></td>";
3900
3901 print "<td><input id=\"iedit_ulevel\" value=\"".$line["access_level"].
3902 "\"></td>";
3903
3904 }
3905
3906 print "<td>".$line["last_login"]."</td>";
3907
3908 print "</tr>";
3909
3910 ++$lnum;
3911 }
3912
3913 print "</table>";
3914
3915 print "<p>";
3916
3917 if ($subop == "edit") {
3918 print "Edit user:
3919 <input type=\"submit\" class=\"button\"
3920 onclick=\"javascript:userEditSave()\" value=\"Save\">
3921 <input type=\"submit\" class=\"button\"
3922 onclick=\"javascript:userEditCancel()\" value=\"Cancel\">";
3923
3924 } else {
3925
3926 print "
3927 Selection:
3928 <input type=\"submit\" class=\"button\"
3929 onclick=\"javascript:selectedUserDetails()\" value=\"User details\">
3930 <input type=\"submit\" class=\"button\"
3931 onclick=\"javascript:editSelectedUser()\" value=\"Edit\">
3932 <input type=\"submit\" class=\"button\"
3933 onclick=\"javascript:removeSelectedUsers()\" value=\"Remove\">
3934 <input type=\"submit\" class=\"button\"
3935 onclick=\"javascript:resetSelectedUserPass()\" value=\"Reset password\">";
3936
3937 }
3938 }
3939
3940 if ($op == "user-details") {
3941
3942 if (WEB_DEMO_MODE || $_SESSION["access_level"] < 10) {
3943 return;
3944 }
3945
3946 /* print "<html><head>
3947 <title>Tiny Tiny RSS : User Details</title>
3948 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
3949 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
3950 </head><body>"; */
3951
3952 $uid = sprintf("%d", $_GET["id"]);
3953
3954 print "<div class='infoBoxContents'>";
3955
3956 $result = db_query($link, "SELECT login,
3957 SUBSTRING(last_login,1,16) AS last_login,
3958 access_level,
3959 (SELECT COUNT(int_id) FROM ttrss_user_entries
3960 WHERE owner_uid = id) AS stored_articles
3961 FROM ttrss_users
3962 WHERE id = '$uid'");
3963
3964 if (db_num_rows($result) == 0) {
3965 print "<h1>User not found</h1>";
3966 return;
3967 }
3968
3969 print "<h1>User Details</h1>";
3970
3971 print "<table width='100%'>";
3972
3973 $login = db_fetch_result($result, 0, "login");
3974 $last_login = date(get_pref($link, 'LONG_DATE_FORMAT'),
3975 strtotime(db_fetch_result($result, 0, "last_login")));
3976 $access_level = db_fetch_result($result, 0, "access_level");
3977 $stored_articles = db_fetch_result($result, 0, "stored_articles");
3978
3979 print "<tr><td>Username</td><td>$login</td></tr>";
3980 print "<tr><td>Access level</td><td>$access_level</td></tr>";
3981 print "<tr><td>Last logged in</td><td>$last_login</td></tr>";
3982 print "<tr><td>Stored articles</td><td>$stored_articles</td></tr>";
3983
3984 $result = db_query($link, "SELECT COUNT(id) as num_feeds FROM ttrss_feeds
3985 WHERE owner_uid = '$uid'");
3986
3987 $num_feeds = db_fetch_result($result, 0, "num_feeds");
3988
3989 print "<tr><td>Subscribed feeds count</td><td>$num_feeds</td></tr>";
3990
3991 /* $result = db_query($link, "SELECT
3992 SUM(LENGTH(content)+LENGTH(title)+LENGTH(link)+LENGTH(guid)) AS db_size
3993 FROM ttrss_user_entries,ttrss_entries
3994 WHERE owner_uid = '$uid' AND ref_id = id");
3995
3996 $db_size = round(db_fetch_result($result, 0, "db_size") / 1024);
3997
3998 print "<tr><td>Approx. used DB size</td><td>$db_size KBytes</td></tr>"; */
3999
4000 print "</table>";
4001
4002 print "<h1>Subscribed feeds</h1>";
4003
4004 $result = db_query($link, "SELECT id,title,site_url FROM ttrss_feeds
4005 WHERE owner_uid = '$uid' ORDER BY title");
4006
4007 print "<ul class=\"userFeedList\">";
4008
4009 while ($line = db_fetch_assoc($result)) {
4010
4011 $icon_file = ICONS_URL."/".$line["id"].".ico";
4012
4013 if (file_exists($icon_file) && filesize($icon_file) > 0) {
4014 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"$icon_file\">";
4015 } else {
4016 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
4017 }
4018
4019 print "<li>$feed_icon&nbsp;<a href=\"".$line["site_url"]."\">".$line["title"]."</a></li>";
4020 }
4021
4022 if (db_num_rows($result) < $num_feeds) {
4023 // FIXME - add link to show ALL subscribed feeds here somewhere
4024 print "<li><img
4025 class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">&nbsp;...</li>";
4026 }
4027
4028 print "</ul>";
4029
4030 print "</div>";
4031
4032 print "<div align='center'>
4033 <input type='submit' class='button'
4034 onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
4035
4036 // print "</body></html>";
4037
4038 }
4039
4040 if ($op == "feed-details") {
4041
4042 // $feed_id = $_GET["id"];
4043
4044 $feed_ids = split(",", db_escape_string($_GET["id"]));
4045
4046 print "<div class=\"infoBoxContents\">";
4047
4048 foreach ($feed_ids as $feed_id) {
4049
4050 $result = db_query($link,
4051 "SELECT
4052 title,feed_url,
4053 SUBSTRING(last_updated,1,16) as last_updated,
4054 icon_url,site_url,
4055 (SELECT COUNT(int_id) FROM ttrss_user_entries
4056 WHERE feed_id = id) AS total,
4057 (SELECT COUNT(int_id) FROM ttrss_user_entries
4058 WHERE feed_id = id AND unread = true) AS unread,
4059 (SELECT COUNT(int_id) FROM ttrss_user_entries
4060 WHERE feed_id = id AND marked = true) AS marked
4061 FROM ttrss_feeds
4062 WHERE id = '$feed_id' AND owner_uid = ".$_SESSION["uid"]);
4063
4064 if (db_num_rows($result) == 0) return;
4065
4066 $title = db_unescape_string(db_fetch_result($result, 0, "title"));
4067 $last_updated = date(get_pref($link, 'LONG_DATE_FORMAT'),
4068 strtotime(db_fetch_result($result, 0, "last_updated")));
4069 $feed_url = db_fetch_result($result, 0, "feed_url");
4070 $icon_url = db_fetch_result($result, 0, "icon_url");
4071 $total = db_fetch_result($result, 0, "total");
4072 $unread = db_fetch_result($result, 0, "unread");
4073 $marked = db_fetch_result($result, 0, "marked");
4074 $site_url = db_fetch_result($result, 0, "site_url");
4075
4076 $result = db_query($link, "SELECT COUNT(id) AS subscribed
4077 FROM ttrss_feeds WHERE feed_url = '$feed_url' AND private = false");
4078
4079 $subscribed = db_fetch_result($result, 0, "subscribed");
4080
4081 $icon_file = ICONS_DIR . "/$feed_id.ico";
4082
4083 if (file_exists($icon_file) && filesize($icon_file) > 0) {
4084 $feed_icon = "<img width=\"16\" height=\"16\"
4085 src=\"" . ICONS_URL . "/$feed_id.ico\">";
4086 } else {
4087 $feed_icon = "";
4088 }
4089
4090 print "<h1>$feed_icon $title</h1>";
4091
4092 print "<table width='100%'>";
4093
4094 if ($site_url) {
4095 print "<tr><td width='30%'>Link</td>
4096 <td><a href=\"$site_url\">$site_url</a>
4097 <a href=\"$feed_url\">(feed)</a></td>
4098 </td></tr>";
4099 } else {
4100 print "<tr><td width='30%'>Feed URL</td>
4101 <td><a href=\"$feed_url\">$feed_url</a></td></tr>";
4102 }
4103 print "<tr><td>Last updated</td><td>$last_updated</td></tr>";
4104 print "<tr><td>Total articles</td><td>$total</td></tr>";
4105 print "<tr><td>Unread articles</td><td>$unread</td></tr>";
4106 print "<tr><td>Starred articles</td><td>$marked</td></tr>";
4107 print "<tr><td>Subscribed users</td><td>$subscribed</td></tr>";
4108
4109 print "</table>";
4110
4111 /* $result = db_query($link, "SELECT title,
4112 SUBSTRING(updated,1,16) AS updated,unread
4113 FROM ttrss_entries,ttrss_user_entries
4114 WHERE ref_id = id AND feed_id = '$feed_id'
4115 ORDER BY date_entered DESC LIMIT 5");
4116
4117 if (db_num_rows($result) > 0) {
4118
4119 print "<h1>Latest headlines</h1>";
4120
4121 print "<ul class=\"nomarks\">";
4122
4123 while ($line = db_fetch_assoc($result)) {
4124 if ($line["unread"] == "t" || $line["unread"] == "1") {
4125 $line["title"] = "<b>" . $line["title"] . "</b>";
4126 }
4127 print "<li>" . $line["title"].
4128 "&nbsp;<span class=\"insensitive\">(" .
4129 date(get_pref($link, 'SHORT_DATE_FORMAT'),
4130 strtotime($line["updated"])).
4131 ")</span></li>";
4132 }
4133
4134 print "</ul>";
4135
4136 } */
4137 }
4138
4139 print "</div>";
4140
4141 print "<div align='center'>
4142 <input type='submit' class='button'
4143 onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
4144 }
4145
4146 if ($op == "pref-feed-browser") {
4147
4148 if (!ENABLE_FEED_BROWSER) {
4149 print "Feed browser is administratively disabled.";
4150 return;
4151 }
4152
4153 $subop = $_REQUEST["subop"];
4154
4155 if ($subop == "details") {
4156 $id = db_escape_string($_GET["id"]);
4157
4158 print "<div class=\"browserFeedInfo\">";
4159 print "<b>Feed information:</b>";
4160 print "<div class=\"detailsPart\">";
4161
4162 $result = db_query($link, "SELECT
4163 feed_url,site_url,
4164 SUBSTRING(last_updated,1,19) AS last_updated
4165 FROM ttrss_feeds WHERE id = '$id'");
4166
4167 $feed_url = db_fetch_result($result, 0, "feed_url");
4168 $site_url = db_fetch_result($result, 0, "site_url");
4169 $last_updated = db_fetch_result($result, 0, "last_updated");
4170
4171 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
4172 $last_updated = smart_date_time(strtotime($last_updated));
4173 } else {
4174 $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
4175 $last_updated = date($short_date, strtotime($last_updated));
4176 }
4177
4178 print "Site: <a href='$site_url'>$site_url</a> ".
4179 "(<a href='$feed_url'>feed</a>), ".
4180 "Last updated: $last_updated";
4181
4182 print "</div>";
4183
4184 $result = db_query($link, "SELECT
4185 ttrss_entries.title,
4186 content,
4187 substring(date_entered,1,19) as date_entered,
4188 substring(updated,1,19) as updated
4189 FROM ttrss_entries,ttrss_user_entries
4190 WHERE ttrss_entries.id = ref_id AND feed_id = '$id'
4191 ORDER BY updated DESC LIMIT 5");
4192
4193 if (db_num_rows($result) > 0) {
4194
4195 print "<b>Last headlines:</b><br>";
4196
4197 print "<div class=\"detailsPart\">";
4198 print "<ul class=\"compact\">";
4199 while ($line = db_fetch_assoc($result)) {
4200
4201 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
4202 $entry_dt = smart_date_time(strtotime($line["updated"]));
4203 } else {
4204 $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
4205 $entry_dt = date($short_date, strtotime($line["updated"]));
4206 }
4207
4208 print "<li>" . $line["title"] .
4209 "&nbsp;<span class=\"insensitive\">($entry_dt)</span></li>";
4210 }
4211 print "</ul></div>";
4212 }
4213
4214 print "</div>";
4215
4216 return;
4217 }
4218
4219 $result = db_query($link, "SELECT feed_url,count(id) AS subscribers
4220 FROM ttrss_feeds
4221 WHERE auth_login = '' AND auth_pass = '' AND private = false
4222 GROUP BY feed_url ORDER BY subscribers DESC LIMIT 100");
4223
4224 print "<ul class='nomarks' id='browseBigFeedList'>";
4225
4226 $feedctr = 0;
4227
4228 while ($line = db_fetch_assoc($result)) {
4229 $feed_url = $line["feed_url"];
4230 $subscribers = $line["subscribers"];
4231
4232 $sub_result = db_query($link, "SELECT id
4233 FROM ttrss_feeds WHERE feed_url = '$feed_url' AND owner_uid =" .
4234 $_SESSION["uid"]);
4235
4236 if (db_num_rows($sub_result) > 0) {
4237 continue; // already subscribed
4238 }
4239
4240 $det_result = db_query($link, "SELECT site_url,title,id
4241 FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
4242
4243 $details = db_fetch_assoc($det_result);
4244
4245 $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
4246
4247 if (file_exists($icon_file) && filesize($icon_file) > 0) {
4248 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL .
4249 "/".$details["id"].".ico\">";
4250 } else {
4251 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
4252 }
4253
4254 $check_box = "<input onclick='toggleSelectListRow(this)' class='feedBrowseCB'
4255 type=\"checkbox\" id=\"FBCHK-" . $details["id"] . "\">";
4256
4257 $class = ($feedctr % 2) ? "even" : "odd";
4258
4259 print "<li class='$class' id=\"FBROW-".$details["id"]."\">$check_box".
4260 "$feed_icon ";
4261
4262 print "<a href=\"javascript:browserToggleExpand('".$details["id"]."')\">" .
4263 $details["title"] ."</a>&nbsp;" .
4264 "<span class='subscribers'>($subscribers)</span>";
4265
4266 print "<div class=\"browserDetails\" id=\"BRDET-" . $details["id"] . "\">";
4267 print "</div>";
4268
4269 print "</li>";
4270
4271 ++$feedctr;
4272 }
4273
4274 if ($feedctr == 0) {
4275 print "<li>No feeds found to subscribe.</li>";
4276 }
4277
4278 print "</ul>";
4279
4280 print "<p>Selection:
4281 <input type='submit' class='button' onclick=\"feedBrowserSubscribe()\"
4282 value=\"Subscribe\"></p>";
4283
4284 print "</div>";
4285
4286 }
4287
4288 db_close($link);
4289 ?>
4290
4291 <!-- <?= sprintf("Backend execution time: %.4f seconds", getmicrotime() - $script_started) ?> -->
4292