X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=backend.php;h=c702c9fb8a0ea76dba1098b278fd367929da666b;hb=e0d91d846dd5ac42a95a0832777cc76aaf579bc2;hp=d9b44aefadd6e0976410cebc4833c543438d0752;hpb=d36f560740ee03a7a224058578a88182cb0d3a71;p=tt-rss.git diff --git a/backend.php b/backend.php index d9b44aef..c702c9fb 100644 --- a/backend.php +++ b/backend.php @@ -3,7 +3,7 @@ if (get_magic_quotes_gpc()) { function stripslashes_deep($value) { - $value = is_array($value) ? + $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } @@ -14,8 +14,10 @@ $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } + $op = $_REQUEST["op"]; + require_once "functions.php"; - require_once "sessions.php"; + if ($op != "share") require_once "sessions.php"; require_once "modules/backend-rpc.php"; require_once "sanity_check.php"; require_once "config.php"; @@ -24,77 +26,57 @@ no_cache_incantation(); - if (ENABLE_TRANSLATIONS == true) { - startup_gettext(); - } + startup_gettext(); $script_started = getmicrotime(); - $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); + $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if (!$link) { if (DB_TYPE == "mysql") { print mysql_error(); } - // PG seems to display its own errors just fine by default. + // PG seems to display its own errors just fine by default. return; } init_connection($link); - $op = $_REQUEST["op"]; $subop = $_REQUEST["subop"]; $mode = $_REQUEST["mode"]; - $print_exec_time = false; - - if ((!$op || $op == "rpc" || $op == "rss" || - ($op == "view" && $mode != "zoom") || - $op == "digestSend" || $op == "viewfeed" || $op == "publish" || - $op == "globalUpdateFeeds") && !$_REQUEST["noxml"]) { - header("Content-Type: application/xml; charset=utf-8"); - - if (ENABLE_GZIP_OUTPUT) { - ob_start("ob_gzhandler"); - } - - } else { - if (!$_REQUEST["noxml"]) { - header("Content-Type: text/html; charset=utf-8"); - } else { + if ((!$op || $op == "rss" || $op == "dlg") && !$_REQUEST["noxml"]) { + header("Content-Type: application/xml; charset=utf-8"); + } else { header("Content-Type: text/plain; charset=utf-8"); - } } - if (!$op) { - header("Content-Type: application/xml"); - print_error_xml(7); exit; + if (ENABLE_GZIP_OUTPUT) { + ob_start("ob_gzhandler"); } if (SINGLE_USER_MODE) { authenticate_user($link, "admin", null); } - if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" - && $op != "rss" && $op != "getUnread" && $op != "publish" && $op != "getProfiles") { + $public_calls = array("globalUpdateFeeds", "rss", "getUnread", "getProfiles", "share", + "fbexport", "logout", "pubsub"); + + if (array_search($op, $public_calls) !== false) { - if ($op == "rpc" || $op == "viewfeed" || $op == "view") { - print_error_xml(6); die; + handle_public_request($link, $op); + return; + + } else if (!($_SESSION["uid"] && validate_session($link))) { + if ($op == 'pref-feeds' && $_REQUEST['subop'] == 'add') { + header("Content-Type: text/html"); + login_sequence($link); + render_login_form($link); } else { - print " - -

Error: Not logged in.

- - - "; + header("Content-Type: text/plain"); + print json_encode(array("error" => array("code" => 6))); } - exit; + return; } $purge_intervals = array( @@ -130,7 +112,8 @@ $update_methods = array( 0 => __("Default"), 1 => __("Magpie"), - 2 => __("SimplePie")); + 2 => __("SimplePie"), + 3 => __("Twitter OAuth")); if (DEFAULT_UPDATE_METHOD == "1") { $update_methods[0] .= ' (SimplePie)'; @@ -139,7 +122,7 @@ } $access_level_names = array( - 0 => __("User"), + 0 => __("User"), 5 => __("Power User"), 10 => __("Administrator")); @@ -150,8 +133,14 @@ require_once "modules/pref-filters.php"; require_once "modules/pref-labels.php"; require_once "modules/pref-users.php"; + require_once "modules/pref-instances.php"; + + $error = sanity_check($link); - if (!sanity_check($link)) { return; } + if ($error['code'] != 0 && $op != "logout") { + print json_encode(array("error" => $error)); + return; + } switch($op) { // Select action according to $op value. case "rpc": @@ -160,17 +149,12 @@ break; // rpc case "feeds": - if (ENABLE_GZIP_OUTPUT) { - ob_start("ob_gzhandler"); - } - - $tags = $_REQUEST["tags"]; - $subop = $_REQUEST["subop"]; + $root = (bool)$_REQUEST["root"]; switch($subop) { case "catchupAll": - db_query($link, "UPDATE ttrss_user_entries SET + db_query($link, "UPDATE ttrss_user_entries SET last_read = NOW(),unread = false WHERE owner_uid = " . $_SESSION["uid"]); ccache_zero_all($link, $_SESSION["uid"]); @@ -178,82 +162,98 @@ case "collapse": $cat_id = db_escape_string($_REQUEST["cid"]); - toggle_collapse_cat($link, $cat_id); - return; - break; - - case "catsortreset": - db_query($link, "UPDATE ttrss_feed_categories - SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]); + $mode = (int) db_escape_string($_REQUEST['mode']); + toggle_collapse_cat($link, $cat_id, $mode); return; break; + } - case "catsort": - $corder = db_escape_string($_REQUEST["corder"]); + if (!$root) { + print json_encode(outputFeedList($link)); + } else { - $cats = split(",", $corder); + $feeds = outputFeedList($link, false); - for ($i = 0; $i < count($cats); $i++) { - $cat_id = $cats[$i]; + $root = array(); + $root['id'] = 'root'; + $root['name'] = __('Feeds'); + $root['items'] = $feeds['items']; - if ($cat_id > 0) { - db_query($link, "UPDATE ttrss_feed_categories - SET order_id = '$i' WHERE id = '$cat_id' AND - owner_uid = " . $_SESSION["uid"]); - } - } - - return; - break; + $fl = array(); + $fl['identifier'] = 'id'; + $fl['label'] = 'name'; + $fl['items'] = array($root); + print json_encode($fl); } - outputFeedList($link, $tags); break; // feeds + case "la": + $id = db_escape_string($_REQUEST['id']); + + $result = db_query($link, "SELECT link FROM ttrss_entries, ttrss_user_entries + WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."' + LIMIT 1"); + + if (db_num_rows($result) == 1) { + $article_url = db_fetch_result($result, 0, 'link'); + $article_url = str_replace("\n", "", $article_url); + + header("Location: $article_url"); + return; + + } else { + print_error(__("Article not found.")); + } + break; + case "view": $id = db_escape_string($_REQUEST["id"]); - $cids = split(",", db_escape_string($_REQUEST["cids"])); + $cids = explode(",", db_escape_string($_REQUEST["cids"])); $mode = db_escape_string($_REQUEST["mode"]); $omode = db_escape_string($_REQUEST["omode"]); - if ($mode != "zoom") print ""; - - // in prefetch mode we only output requested cids, main article + // in prefetch mode we only output requested cids, main article // just gets marked as read (it already exists in client cache) + $articles = array(); + if ($mode == "") { - outputArticleXML($link, $id, false); + array_push($articles, format_article($link, $id, false)); } else if ($mode == "zoom") { - outputArticleXML($link, $id, false, true, true); - } else { - catchupArticleById($link, $id, 0); + array_push($articles, format_article($link, $id, true, true)); + } else if ($mode == "raw") { + if ($_REQUEST['html']) { + header("Content-Type: text/html"); + print ''; + } + + $article = format_article($link, $id, false); + print $article['content']; + return; } + catchupArticleById($link, $id, 0); + if (!$_SESSION["bw_limit"]) { foreach ($cids as $cid) { if ($cid) { - outputArticleXML($link, $cid, false, false); + array_push($articles, format_article($link, $cid, false, false)); } } } - /* if ($mode == "prefetch") { - print ""; - } */ + print json_encode($articles); - if ($mode != "zoom") print ""; break; // view case "viewfeed": - $print_exec_time = true; $timing_info = getmicrotime(); - print ""; + $reply = array(); if ($_REQUEST["debug"]) $timing_info = print_checkpoint("0", $timing_info); @@ -263,18 +263,38 @@ $subop = db_escape_string($_REQUEST["subop"]); $view_mode = db_escape_string($_REQUEST["view_mode"]); $limit = (int) get_pref($link, "DEFAULT_ARTICLE_LIMIT"); - @$cat_view = db_escape_string($_REQUEST["cat"]); + @$cat_view = db_escape_string($_REQUEST["cat"]) == "true"; @$next_unread_feed = db_escape_string($_REQUEST["nuf"]); @$offset = db_escape_string($_REQUEST["skip"]); @$vgroup_last_feed = db_escape_string($_REQUEST["vgrlf"]); $order_by = db_escape_string($_REQUEST["order_by"]); + if (is_numeric($feed)) $feed = (int) $feed; + /* Feed -5 is a special case: it is used to display auxiliary information * when there's nothing to load - e.g. no stuff in fresh feed */ if ($feed == -5) { - generate_dashboard_feed($link); - print ""; + print json_encode(generate_dashboard_feed($link)); + return; + } + + $result = false; + + if ($feed < -10) { + $label_feed = -11-$feed; + $result = db_query($link, "SELECT id FROM ttrss_labels2 WHERE + id = '$label_feed' AND owner_uid = " . $_SESSION['uid']); + } else if (!$cat_view && is_numeric($feed) && $feed > 0) { + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE + id = '$feed' AND owner_uid = " . $_SESSION['uid']); + } else if ($cat_view && is_numeric($feed) && $feed > 0) { + $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE + id = '$feed' AND owner_uid = " . $_SESSION['uid']); + } + + if ($result && db_num_rows($result) == 0) { + print json_encode(generate_error_feed($link, __("Feed not found."))); return; } @@ -294,12 +314,15 @@ WHERE id = '$feed' AND owner_uid = ".$_SESSION["uid"]); } - if (!$next_unread_feed) { - print ""; - - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("05", $timing_info); - - //print ""; - //print ""; +// if ($_REQUEST["debug"]) print_r($ret); - $headlines_unread = ccache_find($link, $returned_feed, $_SESSION["uid"], - $cat_view, true); + $reply['headlines']['content'] =& $ret[5]['content']; + $reply['headlines']['toolbar'] =& $ret[5]['toolbar']; - if ($headlines_unread == -1) { - $headlines_unread = getFeedUnread($link, $returned_feed, $cat_view); - - } - - //print ""; - //printf("", $disable_cache); - - print " (int) $headlines_count, + $reply['headlines-info'] = array("count" => (int) $headlines_count, "vgroup_last_feed" => $vgroup_last_feed, - "unread" => (int) $headlines_unread, "disable_cache" => (bool) $disable_cache); - print json_encode($info); - - print "]]>"; - - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("10", $timing_info); + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info); if (is_array($topmost_article_ids) && !get_pref($link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) { - print ""; + $articles = array(); + foreach ($topmost_article_ids as $id) { - outputArticleXML($link, $id, $feed, false); + array_push($articles, format_article($link, $id, false)); } - print ""; - } - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info); + $reply['articles'] = $articles; + } - if (get_pref($link, 'COMBINED_DISPLAY_MODE') || $subop) { - print ""; - } +// if ($subop) { +// $reply['counters'] = getAllCounters($link, $omode, $feed); +// } if ($_REQUEST["debug"]) $timing_info = print_checkpoint("30", $timing_info); - print_runtime_info($link); + $reply['runtime-info'] = make_runtime_info($link); + + print json_encode($reply); - print ""; break; // viewfeed case "pref-feeds": @@ -432,121 +436,34 @@ module_pref_pub_items($link); break; // pref-pub-items - case "globalUpdateFeeds": - // update feeds of all users, may be used anonymously - - print ""; - - print " - - "; - break; // globalUpdateFeeds - case "pref-feed-browser": module_pref_feed_browser($link); break; // pref-feed-browser - case "rss": - $feed = db_escape_string($_REQUEST["id"]); - $key = db_escape_string($_REQUEST["key"]); - $is_cat = $_REQUEST["is_cat"] != false; - $limit = (int)db_escape_string($_REQUEST["limit"]); - - $search = db_escape_string($_REQUEST["q"]); - $match_on = db_escape_string($_REQUEST["m"]); - $search_mode = db_escape_string($_REQUEST["smode"]); - $view_mode = db_escape_string($_REQUEST["view-mode"]); - - if (SINGLE_USER_MODE) { - authenticate_user($link, "admin", null); - } - - if ($key && !$_SESSION["uid"]) { - $result = db_query($link, "SELECT owner_uid FROM - ttrss_access_keys WHERE access_key = '$key' AND feed_id = '$feed'"); - - if (db_num_rows($result) == 1) - $_SESSION["uid"] = db_fetch_result($result, 0, "owner_uid"); - - } - - if ($_SESSION["uid"]) { - generate_syndicated_feed($link, 0, $feed, $is_cat, $limit, - $search, $search_mode, $match_on, $view_mode); - } - break; // rss - - case "getUnread": - $login = db_escape_string($_REQUEST["login"]); - $fresh = $_REQUEST["fresh"] == "1"; - - header("Content-Type: text/plain; charset=utf-8"); - - $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$login'"); - - if (db_num_rows($result) == 1) { - $uid = db_fetch_result($result, 0, "id"); - - print getGlobalUnread($link, $uid); - - if ($fresh) { - print ";"; - print getFeedArticles($link, -3, false, true, $uid); - } - - } else { - print "-1;User not found"; - } - - $print_exec_time = false; - break; // getUnread + case "pref-instances": + module_pref_instances($link); + break; // pref-instances case "digestTest": - header("Content-Type: text/plain"); print_r(prepare_headlines_digest($link, $_SESSION["uid"])); - $print_exec_time = false; break; // digestTest case "digestSend": - header("Content-Type: text/plain"); send_headlines_digests($link); - $print_exec_time = false; break; // digestSend - case "getProfiles": - $login = db_escape_string($_REQUEST["login"]); - $password = db_escape_string($_REQUEST["password"]); - - if (authenticate_user($link, $login, $password)) { - $result = db_query($link, "SELECT * FROM ttrss_settings_profiles - WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title"); - - print ""; - - $_SESSION = array(); - } - break; + case "loading": + header("Content-type: text/html"); + print __("Loading, please wait...") . " " . + ""; + break; // loading + default: + header("Content-Type: text/plain"); + print json_encode(array("error" => array("code" => 7))); + break; // fallback } // Select action according to $op value. // We close the connection to database. db_close($link); ?> - - - -