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