From 70543b6a400f292c6ed03d0489d0d696d1e13606 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 25 Oct 2010 13:31:37 +0400 Subject: [PATCH] merge API changes from nilsbraden@github --- api/index.php | 362 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 358 insertions(+), 4 deletions(-) diff --git a/api/index.php b/api/index.php index f02f92a77..4fbf296e7 100644 --- a/api/index.php +++ b/api/index.php @@ -7,6 +7,10 @@ require_once "../db-prefs.php"; require_once "../functions.php"; + if (defined('ENABLE_GZIP_OUTPUT') && ENABLE_GZIP_OUTPUT) { + ob_start("ob_gzhandler"); + } + $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); $session_expire = SESSION_EXPIRE_TIME; //seconds @@ -45,13 +49,16 @@ } switch ($op) { + case "getVersion": $rv = array("version" => VERSION); print json_encode($rv); - break; + break; + case "login": $login = db_escape_string($_REQUEST["user"]); $password = db_escape_string($_REQUEST["password"]); + $password_base64 = db_escape_string(base64_decode($_REQUEST["password"])); $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$login'"); @@ -62,9 +69,11 @@ } if ($uid && get_pref($link, "ENABLE_API_ACCESS", $uid)) { - if (authenticate_user($link, $login, $password)) { + if (authenticate_user($link, $login, $password)) { // try login with normal password print json_encode(array("session_id" => session_id())); - } else { + } else if (authenticate_user($link, $login, $password_base64)) { // else try with base64_decoded password + print json_encode(array("session_id" => session_id())); + } else { // else we are not logged in print json_encode(array("error" => "LOGIN_ERROR")); } } else { @@ -72,13 +81,16 @@ } break; + case "logout": logout_user(); print json_encode(array("status" => "OK")); break; + case "isLoggedIn": print json_encode(array("status" => $_SESSION["uid"] != '')); break; + case "getUnread": $feed_id = db_escape_string($_REQUEST["feed_id"]); $is_cat = db_escape_string($_REQUEST["is_cat"]); @@ -89,11 +101,78 @@ print json_encode(array("unread" => getGlobalUnread($link))); } break; + + /* Method added for ttrss-reader for Android */ case "getCounters": + $counters = array(); + + $result = db_query($link, "SELECT + id FROM ttrss_feed_categories + WHERE owner_uid = " . + $_SESSION["uid"]); - /* TODO */ + $cats = array(); + while ($line = db_fetch_assoc($result)) { + array_push($cats, $line["id"]); + } + array_push($cats, "0"); + array_push($cats, "-1"); + array_push($cats, "-2"); + array_push($cats, "-3"); + array_push($cats, "-4"); + + foreach ($cats as $cat) { + + $cat_part = "cat_id = '$cat'"; + if ($cat == 0) { + $cat_part = "cat_id IS null"; + } + + $result = db_query($link, "SELECT + id FROM ttrss_feeds WHERE ". + $cat_part." AND owner_uid = " . $_SESSION["uid"]); + + $feeds = array(); + + while ($line = db_fetch_assoc($result)) { + + $unread = getFeedArticles($link, $line["id"], false, true, $_SESSION["uid"]); + + if ($unread) { + $row = array( + "feed_id" => (int)$line["id"], + "unread" => (int)$unread + ); + array_push($feeds, $row); + } + } + + $is_cat = true; + if ($cat < 0) { + $is_cat = false; + } + + $unread_cat = getFeedArticles($link, $cat, $is_cat, true, $_SESSION["uid"]); + + if ($feeds) { + $count = array( + "cat_id" => $cat, + "unread" => $unread_cat, + "feeds" => $feeds + ); + } else { + $count = array( + "cat_id" => $cat, + "unread" => $unread_cat + ); + } + + array_push($counters, $count); + } + print json_encode($counters); break; + case "getFeeds": $cat_id = db_escape_string($_REQUEST["cat_id"]); $unread_only = (bool)db_escape_string($_REQUEST["unread_only"]); @@ -105,6 +184,7 @@ print json_encode($feeds); break; + case "getCategories": $unread_only = (bool)db_escape_string($_REQUEST["unread_only"]); @@ -127,6 +207,7 @@ print json_encode($cats); break; + case "getHeadlines": $feed_id = db_escape_string($_REQUEST["feed_id"]); $limit = (int)db_escape_string($_REQUEST["limit"]); @@ -144,6 +225,7 @@ print json_encode($headlines); break; + case "updateArticle": $article_ids = split(",", db_escape_string($_REQUEST["article_ids"])); $mode = (int) db_escape_string($_REQUEST["mode"]); @@ -233,6 +315,7 @@ } break; + case "getConfig": $config = array( "icons_dir" => ICONS_DIR, @@ -276,7 +359,278 @@ $pref_name = db_escape_string($_REQUEST["pref_name"]); print json_encode(array("value" => get_pref($link, $pref_name))); break; + + /* Method added for ttrss-reader for Android */ + case "getArticles": + $isCategory = (int)db_escape_string($_REQUEST["is_category"]); + $id = (int)db_escape_string($_REQUEST["id"]); + $displayUnread = (int)db_escape_string($_REQUEST["unread"]); + $limit = (int)db_escape_string($_REQUEST["limit"]); + $feeds = array(); + + if ($isCategory > 0) { + // Get Feeds of the category + + if ($id == 0) { + $category_part = "cat_id is NULL"; + } else { + $category_part = "cat_id = '$id'"; + } + + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE ". + $category_part." AND owner_uid = '".$_SESSION["uid"]."'"); + + while ($line = db_fetch_assoc($result)) { + array_push($feeds, $line["id"]); + } + + // Virtual feeds + $match_part = ""; + if ($id == -1) { + $match_part = "marked = true"; + array_push($feeds, -1); + } else if ($id == -2) { + $match_part = "published = true"; + array_push($feeds, -2); + } else if ($id == -3) { + $match_part = "unread = true"; + array_push($feeds, -3); + $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE", $owner_uid); + + if (DB_TYPE == "pgsql") { + $match_part .= " AND updated > NOW() - INTERVAL '$intl hour' "; + } else { + $match_part .= " AND updated > DATE_SUB(NOW(), INTERVAL $intl HOUR) "; + } + } else if ($id == -4) { + $match_part = "true"; + array_push($feeds, -4); + } + } else { + // Only add one feed + array_push($feeds, $id); + } + + $ret = array(); + + if (DB_TYPE == "mysql") { + $limit_part = " LIMIT 0,".$limit; + } else if (DB_TYPE == "pgsql") { + $limit_part = " LIMIT ".$limit; + } else { + $limit_part = ""; + } + + // Fetch articles for the feeds + foreach ($feeds as $feed) { + + if ($match_part) { + $from_qpart = "ttrss_user_entries,ttrss_feeds,ttrss_entries"; + $feeds_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND"; + + $query = "SELECT ttrss_entries.id,ttrss_entries.title,link,content,feed_id,comments,int_id, + marked,unread,published,".SUBSTRING_FOR_DATE."(updated,1,16) as updated,author + FROM $from_qpart WHERE + ttrss_user_entries.ref_id = ttrss_entries.id AND + $feeds_qpart ($match_part) AND ttrss_user_entries.owner_uid = ".$_SESSION["uid"]." ORDER BY updated DESC".$limit_part; + + $result = db_query($link, $query); + } else { + $query = "SELECT ttrss_entries.id,ttrss_entries.title,link,content,feed_id,comments,int_id, + marked,unread,published,".SUBSTRING_FOR_DATE."(updated,1,16) as updated,author + FROM ttrss_entries,ttrss_user_entries + WHERE feed_id = '".$feed."' AND ref_id = id AND owner_uid = ". + $_SESSION["uid"]." AND unread >= '".$displayUnread."' ORDER BY updated DESC".$limit_part; + + $result = db_query($link, $query); + } + + $articles = array(); + $i=0; + while ($i < mysql_numrows($result)) { + + $article_id = db_fetch_result($result, $i, "id"); + + $attachments = get_article_enclosures($link, $article_id); + + $article = array( + "id" => db_fetch_result($result, $i, "ttrss_entries.id"), + "title" => db_fetch_result($result, $i, "ttrss_entries.title"), + "link" => db_fetch_result($result, $i, "link"), + "labels" => get_article_labels($link, $article_id), + "unread" => sql_bool_to_bool(db_fetch_result($result, $i, "unread")), + "marked" => sql_bool_to_bool(db_fetch_result($result, $i, "marked")), + "published" => sql_bool_to_bool(db_fetch_result($result, $i, "published")), + "comments" => db_fetch_result($result, $i, "comments"), + "author" => db_fetch_result($result, $i, "author"), + "updated" => strtotime(db_fetch_result($result, $i, "updated")), + "content" => db_fetch_result($result, $i, "content"), + "feed_id" => db_fetch_result($result, $i, "feed_id"), + "attachments" => $attachments + ); + + array_push($ret, $article); + + $i++; + } + } + + print json_encode($ret); + break; + + /* Method added for ttrss-reader for Android */ + case "getNewArticles": + $time = (int) db_escape_string($_REQUEST["time"]); + // unread=1 zeigt alle an, unread=0 nur ungelesene + $displayUnread = (int) db_escape_string($_REQUEST["unread"]); + + if (DB_TYPE == "mysql") { + $db_time_function = " AND last_updated > FROM_UNIXTIME(".$time.")"; + } else if (DB_TYPE == "pgsql") { + $db_time_function = " AND last_updated > to_timestamp(".$time.")"; + } else { + $db_time_function = ""; + } + + if (DB_TYPE == "mysql") { + $db_time_function2 = " AND updated > FROM_UNIXTIME(".$time.")"; + } else if (DB_TYPE == "pgsql") { + $db_time_function2 = " AND updated > to_timestamp(".$time.")"; + } else { + $db_time_function2 = ""; + } + + $cats = array(); + + + // Add uncategorized feeds + $unread = getFeedUnread($link, 0, true); + if ($unread || $displayUnread > 0) { + $feeds = array(); + $result_0 = db_query($link, "SELECT id, feed_url, cat_id, title, ". + SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated ". + "FROM ttrss_feeds WHERE cat_id IS null AND owner_uid = '".$_SESSION["uid"]."'" . $db_time_function); + + while ($line_feeds = db_fetch_assoc($result_0)) { + $unread_feed = getFeedUnread($link, $line_feeds["id"], false); + if ($unread || $displayUnread > 0) { + + $result_1 = db_query($link, "SELECT id,title,link,content,feed_id,comments,int_id, + marked,unread,published,". + SUBSTRING_FOR_DATE."(updated,1,16) as updated,author + FROM ttrss_entries,ttrss_user_entries + WHERE feed_id = '".$line_feeds["id"]."' AND ref_id = id AND owner_uid = " . + $_SESSION["uid"]." AND unread >= '".$displayUnread."'" . $db_time_function2); + + $articles = array(); + while ($line_articles = db_fetch_assoc($result_1)) { + $article_id = db_fetch_result($result, $i, "id"); + $attachments = get_article_enclosures($link, $article_id); + array_push($articles, $article = array( + "id" => $line_articles["id"], + "title" => $line_articles["title"], + "link" => $line_articles["link"], + "labels" => $article_id, + "unread" => $line_articles["unread"], + "marked" => $line_articles["marked"], + "published" => $line_articles["published"], + "comments" => $line_articles["comments"], + "author" => $line_articles["author"], + "updated" => strtotime($line_articles["updated"]), + "content" => $line_articles["content"], + "feed_id" => $line_articles["feed_id"], + "attachments" => $attachments)); + } + + array_push($feeds, array( + "feed_url" => $line_feeds["feed_url"], + "title" => $line_feeds["title"], + "id" => (int)$line_feeds["id"], + "unread" => (int)$unread_feed, + "has_icon" => $has_icon, + "cat_id" => (int)$line_feeds["cat_id"], + "last_updated" => strtotime($line_feeds["last_updated"]), + "articles" => $articles + )); + } + } + + array_push($cats, + array( + "id" => 0, + "title" => "Uncategorized Feeds", + "unread" => $unread, + "feeds" => $feeds)); + } + + + $result = db_query($link, "SELECT id, title FROM ttrss_feed_categories WHERE owner_uid = " . $_SESSION["uid"]); + while ($line = db_fetch_assoc($result)) { + $unread = getFeedUnread($link, $line["id"], true); + + if ($unread || $displayUnread > 0) { + $feeds = array(); + $result_0 = db_query($link, "SELECT id, feed_url, cat_id, title, ". + SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated ". + "FROM ttrss_feeds WHERE cat_id = '". + $line["id"]."' AND owner_uid = '".$_SESSION["uid"]."'" . $db_time_function); + + while ($line_feeds = db_fetch_assoc($result_0)) { + $unread_feed = getFeedUnread($link, $line_feeds["id"], false); + if ($unread_feed || $displayUnread > 0) { + + $result_1 = db_query($link, "SELECT id,title,link,content,feed_id,comments,int_id, + marked,unread,published,". + SUBSTRING_FOR_DATE."(updated,1,16) as updated,author + FROM ttrss_entries,ttrss_user_entries + WHERE feed_id = '".$line_feeds["id"]."' AND ref_id = id AND owner_uid = " . + $_SESSION["uid"]." AND unread >= '".$displayUnread."'" . $db_time_function2); + + $articles = array(); + while ($line_articles = db_fetch_assoc($result_1)) { + $article_id = db_fetch_result($result, $i, "id"); + $attachments = get_article_enclosures($link, $article_id); + array_push($articles, $article = array( + "id" => $line_articles["id"], + "title" => $line_articles["title"], + "link" => $line_articles["link"], + "labels" => $article_id, + "unread" => $line_articles["unread"], + "marked" => $line_articles["marked"], + "published" => $line_articles["published"], + "comments" => $line_articles["comments"], + "author" => $line_articles["author"], + "updated" => strtotime($line_articles["updated"]), + "content" => $line_articles["content"], + "feed_id" => $line_articles["feed_id"], + "attachments" => $attachments)); + } + + array_push($feeds, array( + "feed_url" => $line_feeds["feed_url"], + "title" => $line_feeds["title"], + "id" => (int)$line_feeds["id"], + "unread" => (int)$unread_feed, + "cat_id" => (int)$line_feeds["cat_id"], + "last_updated" => strtotime($line_feeds["last_updated"]), + "articles" => $articles + )); + + } + } + + array_push($cats, + array( + "id" => $line["id"], + "title" => $line["title"], + "unread" => $unread, + "feeds" => $feeds)); + } + } + print json_encode($cats); + break; + default: print json_encode(array("error" => 'UNKNOWN_METHOD')); break;