Browse Source

move API to classes/

Andrew Dolgov 8 years ago
parent
commit
de8260cb10
4 changed files with 372 additions and 365 deletions
  1. 18 355
      api/index.php
  2. 1 1
      backend.php
  3. 346 0
      classes/api.php
  4. 7 9
      public.php

+ 18 - 355
api/index.php

@@ -8,15 +8,17 @@
 		dirname(dirname(__FILE__)) . PATH_SEPARATOR .
 		dirname(dirname(__FILE__)) . "/include" );
 
+	function __autoload($class) {
+		$file = "classes/".strtolower(basename($class)).".php";
+		if (file_exists($file)) {
+			require $file;
+		}
+	}
+
 	require_once "db.php";
 	require_once "db-prefs.php";
 	require_once "functions.php";
 
-	define('API_LEVEL', 1);
-
-	define('API_STATUS_OK', 0);
-	define('API_STATUS_ERR', 1);
-
 	chdir("..");
 
 	if (defined('ENABLE_GZIP_OUTPUT') && ENABLE_GZIP_OUTPUT) {
@@ -36,9 +38,7 @@
 	if ($input) {
 		$input = json_decode($input, true);
 
-		if ($input) {
-			$_REQUEST = $input;
-		}
+		if ($input) $_REQUEST = $input;
 	}
 
 	if ($_REQUEST["sid"]) {
@@ -47,356 +47,19 @@
 
 	session_start();
 
-	if (!$link) {
-		if (DB_TYPE == "mysql") {
-			print mysql_error();
-		}
-		// PG seems to display its own errors just fine by default.
-		return;
-	}
-
-	init_connection($link);
-
-	$op = db_escape_string($_REQUEST["op"]);
-	$seq = (int) $_REQUEST["seq"];
-
-	header("Content-Type: text/plain");
-
-	function api_wrap_reply($status, $seq, $reply) {
-		print json_encode(array("seq" => $seq,
-			"status" => $status,
-			"content" => $reply));
-	}
-
-	if (!$_SESSION["uid"] && $op != "login" && $op != "isLoggedIn") {
-		print api_wrap_reply(API_STATUS_ERR, $seq, array("error" => 'NOT_LOGGED_IN'));
-		return;
-	}
-
-	if ($_SESSION["uid"] && $op != "logout" && !get_pref($link, 'ENABLE_API_ACCESS')) {
-		print api_wrap_reply(API_STATUS_ERR, $seq, array("error" => 'API_DISABLED'));
-		return;
-	}
-
-	switch ($op) {
-
-		case "getVersion":
-			$rv = array("version" => VERSION);
-			print api_wrap_reply(API_STATUS_OK, $seq, $rv);
-			break;
-
-		case "getApiLevel":
-			$rv = array("level" => API_LEVEL);
-			print api_wrap_reply(API_STATUS_OK, $seq, $rv);
-			break;
-
-		case "login":
-			$login = db_escape_string($_REQUEST["user"]);
-			$password = $_REQUEST["password"];
-			$password_base64 = base64_decode($_REQUEST["password"]);
-
-			if (SINGLE_USER_MODE) $login = "admin";
-
-			$result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$login'");
-
-			if (db_num_rows($result) != 0) {
-				$uid = db_fetch_result($result, 0, "id");
-			} else {
-				$uid = 0;
-			}
-
-			if (!$uid) {
-				print api_wrap_reply(API_STATUS_ERR, $seq,
-					array("error" => "LOGIN_ERROR"));
-				return;
-			}
-
-			if (get_pref($link, "ENABLE_API_ACCESS", $uid)) {
-				if (authenticate_user($link, $login, $password)) {               // try login with normal password
-					print api_wrap_reply(API_STATUS_OK, $seq,
-						array("session_id" => session_id()));
-				} else if (authenticate_user($link, $login, $password_base64)) { // else try with base64_decoded password
-					print api_wrap_reply(API_STATUS_OK, $seq,
-						array("session_id" => session_id()));
-				} else {                                                         // else we are not logged in
-					print api_wrap_reply(API_STATUS_ERR, $seq,
-						array("error" => "LOGIN_ERROR"));
-				}
-			} else {
-				print api_wrap_reply(API_STATUS_ERR, $seq,
-					array("error" => "API_DISABLED"));
-			}
-
-			break;
-
-		case "logout":
-			logout_user();
-			print api_wrap_reply(API_STATUS_OK, $seq, array("status" => "OK"));
-			break;
-
-		case "isLoggedIn":
-			print api_wrap_reply(API_STATUS_OK, $seq,
-				array("status" => $_SESSION["uid"] != ''));
-			break;
-
-		case "getUnread":
-			$feed_id = db_escape_string($_REQUEST["feed_id"]);
-			$is_cat = db_escape_string($_REQUEST["is_cat"]);
-
-			if ($feed_id) {
-				print api_wrap_reply(API_STATUS_OK, $seq,
-					array("unread" => getFeedUnread($link, $feed_id, $is_cat)));
-			} else {
-				print api_wrap_reply(API_STATUS_OK, $seq,
-					array("unread" => getGlobalUnread($link)));
-			}
-			break;
-
-		/* Method added for ttrss-reader for Android */
-		case "getCounters":
-
-			/* flct (flc is the default) FIXME: document */
-			$output_mode = db_escape_string($_REQUEST["output_mode"]);
-
-			print api_wrap_reply(API_STATUS_OK, $seq,
-				getAllCounters($link, $output_mode));
-			break;
-
-		case "getFeeds":
-			$cat_id = db_escape_string($_REQUEST["cat_id"]);
-			$unread_only = (bool)db_escape_string($_REQUEST["unread_only"]);
-			$limit = (int) db_escape_string($_REQUEST["limit"]);
-			$offset = (int) db_escape_string($_REQUEST["offset"]);
-
-			$feeds = api_get_feeds($link, $cat_id, $unread_only, $limit, $offset);
-
-			print api_wrap_reply(API_STATUS_OK, $seq, $feeds);
-
-			break;
-
-		case "getCategories":
-			$unread_only = (bool)db_escape_string($_REQUEST["unread_only"]);
-
-			// TODO do not return empty categories, return Uncategorized and standard virtual cats
-
-			$result = db_query($link, "SELECT
-					id, title FROM ttrss_feed_categories
-				WHERE owner_uid = " .
-				$_SESSION["uid"]);
-
-			$cats = array();
-
-			while ($line = db_fetch_assoc($result)) {
-				$unread = getFeedUnread($link, $line["id"], true);
-
-				if ($unread || !$unread_only) {
-					array_push($cats, array("id" => $line["id"],
-						"title" => $line["title"],
-						"unread" => $unread));
-				}
-			}
-
-			foreach (array(-2,-1,0) as $cat_id) {
-				$unread = getFeedUnread($link, $cat_id, true);
-
-				if ($unread || !$unread_only) {
-					array_push($cats, array("id" => $cat_id,
-						"title" => getCategoryTitle($link, $cat_id),
-						"unread" => $unread));
-				}
-			}
-
-			print api_wrap_reply(API_STATUS_OK, $seq, $cats);
-			break;
-
-		case "getHeadlines":
-			$feed_id = db_escape_string($_REQUEST["feed_id"]);
-			$limit = (int)db_escape_string($_REQUEST["limit"]);
-			$offset = (int)db_escape_string($_REQUEST["skip"]);
-			$filter = db_escape_string($_REQUEST["filter"]);
-			$is_cat = (bool)db_escape_string($_REQUEST["is_cat"]);
-			$show_excerpt = (bool)db_escape_string($_REQUEST["show_excerpt"]);
-			$show_content = (bool)db_escape_string($_REQUEST["show_content"]);
-			/* all_articles, unread, adaptive, marked, updated */
-			$view_mode = db_escape_string($_REQUEST["view_mode"]);
-			$include_attachments = (bool)db_escape_string($_REQUEST["include_attachments"]);
-			$since_id = (int)db_escape_string($_REQUEST["since_id"]);
+	if (!init_connection($link)) return;
 
-			$headlines = api_get_headlines($link, $feed_id, $limit, $offset,
-				$filter, $is_cat, $show_excerpt, $show_content, $view_mode, false,
-				$include_attachments, $since_id);
+	$method = strtolower($_REQUEST["op"]);
 
-			print api_wrap_reply(API_STATUS_OK, $seq, $headlines);
-
-			break;
-
-		case "updateArticle":
-			$article_ids = array_filter(explode(",", db_escape_string($_REQUEST["article_ids"])), is_numeric);
-			$mode = (int) db_escape_string($_REQUEST["mode"]);
-			$data = db_escape_string($_REQUEST["data"]);
-			$field_raw = (int)db_escape_string($_REQUEST["field"]);
-
-			$field = "";
-			$set_to = "";
-
-			switch ($field_raw) {
-				case 0:
-					$field = "marked";
-					break;
-				case 1:
-					$field = "published";
-					break;
-				case 2:
-					$field = "unread";
-					break;
-				case 3:
-					$field = "note";
-			};
-
-			switch ($mode) {
-				case 1:
-					$set_to = "true";
-					break;
-				case 0:
-					$set_to = "false";
-					break;
-				case 2:
-					$set_to = "NOT $field";
-					break;
-			}
-
-			if ($field == "note") $set_to = "'$data'";
-
-			if ($field && $set_to && count($article_ids) > 0) {
-
-				$article_ids = join(", ", $article_ids);
-
-				if ($field == "unread") {
-					$result = db_query($link, "UPDATE ttrss_user_entries SET $field = $set_to,
-						last_read = NOW()
-						WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]);
-				} else {
-					$result = db_query($link, "UPDATE ttrss_user_entries SET $field = $set_to
-						WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]);
-				}
-
-				$num_updated = db_affected_rows($link, $result);
-
-				if ($num_updated > 0 && $field == "unread") {
-					$result = db_query($link, "SELECT DISTINCT feed_id FROM ttrss_user_entries
-						WHERE ref_id IN ($article_ids)");
-
-					while ($line = db_fetch_assoc($result)) {
-						ccache_update($link, $line["feed_id"], $_SESSION["uid"]);
-					}
-				}
-
-				print api_wrap_reply(API_STATUS_OK, $seq, array("status" => "OK",
-					"updated" => $num_updated));
-
-			} else {
-				print api_wrap_reply(API_STATUS_ERR, $seq,
-					array("error" => 'INCORRECT_USAGE'));
-			}
-
-			break;
-
-		case "getArticle":
-
-			$article_id = join(",", array_filter(explode(",", db_escape_string($_REQUEST["article_id"])), is_numeric));
-
-			$query = "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	id IN ($article_id) AND ref_id = id AND owner_uid = " .
-					$_SESSION["uid"] ;
-
-			$result = db_query($link, $query);
-
-			$articles = array();
-
-			if (db_num_rows($result) != 0) {
-
-				while ($line = db_fetch_assoc($result)) {
-
-					$attachments = get_article_enclosures($link, $line['id']);
-
-					$article = array(
-						"id" => $line["id"],
-						"title" => $line["title"],
-						"link" => $line["link"],
-						"labels" => get_article_labels($link, $line['id']),
-						"unread" => sql_bool_to_bool($line["unread"]),
-						"marked" => sql_bool_to_bool($line["marked"]),
-						"published" => sql_bool_to_bool($line["published"]),
-						"comments" => $line["comments"],
-						"author" => $line["author"],
-						"updated" => strtotime($line["updated"]),
-						"content" => $line["content"],
-						"feed_id" => $line["feed_id"],
-						"attachments" => $attachments
-					);
-
-					array_push($articles, $article);
-
-				}
-			}
-
-			print api_wrap_reply(API_STATUS_OK, $seq, $articles);
-
-			break;
-
-		case "getConfig":
-			$config = array(
-				"icons_dir" => ICONS_DIR,
-				"icons_url" => ICONS_URL);
-
-			$config["daemon_is_running"] = file_is_locked("update_daemon.lock");
-
-			$result = db_query($link, "SELECT COUNT(*) AS cf FROM
-				ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]);
-
-			$num_feeds = db_fetch_result($result, 0, "cf");
-
-			$config["num_feeds"] = (int)$num_feeds;
-
-			print api_wrap_reply(API_STATUS_OK, $seq, $config);
-
-			break;
-
-		case "updateFeed":
-			$feed_id = db_escape_string($_REQUEST["feed_id"]);
-
-			update_rss_feed($link, $feed_id, true);
-
-			print api_wrap_reply(API_STATUS_OK, $seq, array("status" => "OK"));
-
-			break;
-
-		case "catchupFeed":
-			$feed_id = db_escape_string($_REQUEST["feed_id"]);
-			$is_cat = db_escape_string($_REQUEST["is_cat"]);
-
-			catchup_feed($link, $feed_id, $is_cat);
-
-			print api_wrap_reply(API_STATUS_OK, $seq, array("status" => "OK"));
-
-			break;
-
-		case "getPref":
-			$pref_name = db_escape_string($_REQUEST["pref_name"]);
-
-			print api_wrap_reply(API_STATUS_OK, $seq,
-				array("value" => get_pref($link, $pref_name)));
-			break;
-
-		default:
-			print api_wrap_reply(API_STATUS_ERR, $seq,
-				array("error" => 'UNKNOWN_METHOD'));
-			break;
+	$handler = new API($link, $_REQUEST);
 
+	if ($handler->before($method)) {
+		if ($method && method_exists($handler, $method)) {
+			$handler->$method();
+		} else if (method_exists($handler, 'index')) {
+			$handler->index($method);
+		}
+		$handler->after();
 	}
 
 	db_close($link);

+ 1 - 1
backend.php

@@ -137,7 +137,7 @@
 		$handler = new $op($link, $_REQUEST);
 
 		if ($handler) {
-			if ($handler->before()) {
+			if ($handler->before($method)) {
 				if ($method && method_exists($handler, $method)) {
 					$handler->$method();
 				} else if (method_exists($handler, 'index')) {

+ 346 - 0
classes/api.php

@@ -0,0 +1,346 @@
+<?php
+
+class API extends Handler {
+
+	const API_LEVEL  = 1;
+
+	const STATUS_OK  = 0;
+	const STATUS_ERR = 1;
+
+	private $seq;
+
+	function before($method) {
+		if (parent::before($method)) {
+
+			if (!$_SESSION["uid"] && $method != "login" && $method != "isloggedin") {
+				print $this->wrap(self::STATUS_ERR, array("error" => 'NOT_LOGGED_IN'));
+				return false;
+			}
+
+			if ($_SESSION["uid"] && $method != "logout" && !get_pref($this->link, 'ENABLE_API_ACCESS')) {
+				print $this->wrap(self::STATUS_ERR, array("error" => 'API_DISABLED'));
+				return false;
+			}
+
+			$this->seq = (int) $_REQUEST['seq'];
+
+			header("Content-Type: text/plain");
+			return true;
+		}
+		return false;
+	}
+
+	function wrap($status, $reply) {
+		print json_encode(array("seq" => $this->seq,
+			"status" => $status,
+			"content" => $reply));
+	}
+
+	function getVersion() {
+		$rv = array("version" => VERSION);
+		print $this->wrap(self::STATUS_OK, $rv);
+	}
+
+	function getApiLevel() {
+		$rv = array("level" => API_LEVEL);
+		print $this->wrap(self::STATUS_OK, $rv);
+	}
+
+	function login() {
+		$login = db_escape_string($_REQUEST["user"]);
+		$password = $_REQUEST["password"];
+		$password_base64 = base64_decode($_REQUEST["password"]);
+
+		if (SINGLE_USER_MODE) $login = "admin";
+
+		$result = db_query($this->link, "SELECT id FROM ttrss_users WHERE login = '$login'");
+
+		if (db_num_rows($result) != 0) {
+			$uid = db_fetch_result($result, 0, "id");
+		} else {
+			$uid = 0;
+		}
+
+		if (!$uid) {
+			print $this->wrap(self::STATUS_ERR, array("error" => "LOGIN_ERROR"));
+			return;
+		}
+
+		if (get_pref($this->link, "ENABLE_API_ACCESS", $uid)) {
+			if (authenticate_user($this->link, $login, $password)) {               // try login with normal password
+				print $this->wrap(self::STATUS_OK, array("session_id" => session_id()));
+			} else if (authenticate_user($this->link, $login, $password_base64)) { // else try with base64_decoded password
+				print $this->wrap(self::STATUS_OK,	array("session_id" => session_id()));
+			} else {                                                         // else we are not logged in
+				print $this->wrap(self::STATUS_ERR, array("error" => "LOGIN_ERROR"));
+			}
+		} else {
+			print $this->wrap(self::STATUS_ERR, array("error" => "API_DISABLED"));
+		}
+
+	}
+
+	function logout() {
+		logout_user();
+		print $this->wrap(self::STATUS_OK, array("status" => "OK"));
+	}
+
+	function isLoggedIn() {
+		print $this->wrap(self::STATUS_OK, array("status" => $_SESSION["uid"] != ''));
+	}
+
+	function getUnread() {
+		$feed_id = db_escape_string($_REQUEST["feed_id"]);
+		$is_cat = db_escape_string($_REQUEST["is_cat"]);
+
+		if ($feed_id) {
+			print $this->wrap(self::STATUS_OK, array("unread" => getFeedUnread($this->link, $feed_id, $is_cat)));
+		} else {
+			print $this->wrap(self::STATUS_OK, array("unread" => getGlobalUnread($this->link)));
+		}
+	}
+
+	/* Method added for ttrss-reader for Android */
+	function getCounters() {
+
+		/* flct (flc is the default) FIXME: document */
+		$output_mode = db_escape_string($_REQUEST["output_mode"]);
+
+		print $this->wrap(self::STATUS_OK, getAllCounters($this->link, $output_mode));
+	}
+
+	function getFeeds() {
+		$cat_id = db_escape_string($_REQUEST["cat_id"]);
+		$unread_only = (bool)db_escape_string($_REQUEST["unread_only"]);
+		$limit = (int) db_escape_string($_REQUEST["limit"]);
+		$offset = (int) db_escape_string($_REQUEST["offset"]);
+
+		$feeds = api_get_feeds($this->link, $cat_id, $unread_only, $limit, $offset);
+
+		print $this->wrap(self::STATUS_OK, $feeds);
+	}
+
+	function getCategories() {
+		$unread_only = (bool)db_escape_string($_REQUEST["unread_only"]);
+
+		// TODO do not return empty categories, return Uncategorized and standard virtual cats
+
+		$result = db_query($this->link, "SELECT
+				id, title FROM ttrss_feed_categories
+			WHERE owner_uid = " .
+			$_SESSION["uid"]);
+
+		$cats = array();
+
+		while ($line = db_fetch_assoc($result)) {
+			$unread = getFeedUnread($this->link, $line["id"], true);
+
+			if ($unread || !$unread_only) {
+				array_push($cats, array("id" => $line["id"],
+					"title" => $line["title"],
+					"unread" => $unread));
+			}
+		}
+
+		foreach (array(-2,-1,0) as $cat_id) {
+			$unread = getFeedUnread($this->link, $cat_id, true);
+
+			if ($unread || !$unread_only) {
+				array_push($cats, array("id" => $cat_id,
+					"title" => getCategoryTitle($this->link, $cat_id),
+					"unread" => $unread));
+			}
+		}
+
+		print $this->wrap(self::STATUS_OK, $cats);
+	}
+
+	function getHeadlines() {
+		$feed_id = db_escape_string($_REQUEST["feed_id"]);
+		if ($feed_id) {
+
+			$limit = (int)db_escape_string($_REQUEST["limit"]);
+			$offset = (int)db_escape_string($_REQUEST["skip"]);
+			$filter = db_escape_string($_REQUEST["filter"]);
+			$is_cat = (bool)db_escape_string($_REQUEST["is_cat"]);
+			$show_excerpt = (bool)db_escape_string($_REQUEST["show_excerpt"]);
+			$show_content = (bool)db_escape_string($_REQUEST["show_content"]);
+			/* all_articles, unread, adaptive, marked, updated */
+			$view_mode = db_escape_string($_REQUEST["view_mode"]);
+			$include_attachments = (bool)db_escape_string($_REQUEST["include_attachments"]);
+			$since_id = (int)db_escape_string($_REQUEST["since_id"]);
+
+			$headlines = api_get_headlines($this->link, $feed_id, $limit, $offset,
+				$filter, $is_cat, $show_excerpt, $show_content, $view_mode, false,
+				$include_attachments, $since_id);
+
+			print $this->wrap(self::STATUS_OK, $headlines);
+		} else {
+			print $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
+		}
+	}
+
+	function updateArticle() {
+		$article_ids = array_filter(explode(",", db_escape_string($_REQUEST["article_ids"])), is_numeric);
+		$mode = (int) db_escape_string($_REQUEST["mode"]);
+		$data = db_escape_string($_REQUEST["data"]);
+		$field_raw = (int)db_escape_string($_REQUEST["field"]);
+
+		$field = "";
+		$set_to = "";
+
+		switch ($field_raw) {
+			case 0:
+				$field = "marked";
+				break;
+			case 1:
+				$field = "published";
+				break;
+			case 2:
+				$field = "unread";
+				break;
+			case 3:
+				$field = "note";
+		};
+
+		switch ($mode) {
+			case 1:
+				$set_to = "true";
+				break;
+			case 0:
+				$set_to = "false";
+				break;
+			case 2:
+				$set_to = "NOT $field";
+				break;
+		}
+
+		if ($field == "note") $set_to = "'$data'";
+
+		if ($field && $set_to && count($article_ids) > 0) {
+
+			$article_ids = join(", ", $article_ids);
+
+			if ($field == "unread") {
+				$result = db_query($this->link, "UPDATE ttrss_user_entries SET $field = $set_to,
+					last_read = NOW()
+					WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]);
+			} else {
+				$result = db_query($this->link, "UPDATE ttrss_user_entries SET $field = $set_to
+					WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]);
+			}
+
+			$num_updated = db_affected_rows($this->link, $result);
+
+			if ($num_updated > 0 && $field == "unread") {
+				$result = db_query($this->link, "SELECT DISTINCT feed_id FROM ttrss_user_entries
+					WHERE ref_id IN ($article_ids)");
+
+				while ($line = db_fetch_assoc($result)) {
+					ccache_update($this->link, $line["feed_id"], $_SESSION["uid"]);
+				}
+			}
+
+			print $this->wrap(self::STATUS_OK, array("status" => "OK",
+				"updated" => $num_updated));
+
+		} else {
+			print $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
+		}
+
+	}
+
+	function getArticle() {
+
+		$article_id = join(",", array_filter(explode(",", db_escape_string($_REQUEST["article_id"])), is_numeric));
+
+		$query = "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	id IN ($article_id) AND ref_id = id AND owner_uid = " .
+				$_SESSION["uid"] ;
+
+		$result = db_query($this->link, $query);
+
+		$articles = array();
+
+		if (db_num_rows($result) != 0) {
+
+			while ($line = db_fetch_assoc($result)) {
+
+				$attachments = get_article_enclosures($this->link, $line['id']);
+
+				$article = array(
+					"id" => $line["id"],
+					"title" => $line["title"],
+					"link" => $line["link"],
+					"labels" => get_article_labels($this->link, $line['id']),
+					"unread" => sql_bool_to_bool($line["unread"]),
+					"marked" => sql_bool_to_bool($line["marked"]),
+					"published" => sql_bool_to_bool($line["published"]),
+					"comments" => $line["comments"],
+					"author" => $line["author"],
+					"updated" => strtotime($line["updated"]),
+					"content" => $line["content"],
+					"feed_id" => $line["feed_id"],
+					"attachments" => $attachments
+				);
+
+				array_push($articles, $article);
+
+			}
+		}
+
+		print $this->wrap(self::STATUS_OK, $articles);
+
+	}
+
+	function getConfig() {
+		$config = array(
+			"icons_dir" => ICONS_DIR,
+			"icons_url" => ICONS_URL);
+
+		$config["daemon_is_running"] = file_is_locked("update_daemon.lock");
+
+		$result = db_query($this->link, "SELECT COUNT(*) AS cf FROM
+			ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]);
+
+		$num_feeds = db_fetch_result($result, 0, "cf");
+
+		$config["num_feeds"] = (int)$num_feeds;
+
+		print $this->wrap(self::STATUS_OK, $config);
+	}
+
+	function updateFeed() {
+		$feed_id = db_escape_string($_REQUEST["feed_id"]);
+
+		update_rss_feed($this->link, $feed_id, true);
+
+		print $this->wrap(self::STATUS_OK, array("status" => "OK"));
+	}
+
+	function catchupFeed() {
+		$feed_id = db_escape_string($_REQUEST["feed_id"]);
+		$is_cat = db_escape_string($_REQUEST["is_cat"]);
+
+		catchup_feed($this->link, $feed_id, $is_cat);
+
+		print $this->wrap(self::STATUS_OK, array("status" => "OK"));
+	}
+
+	function getPref() {
+		$pref_name = db_escape_string($_REQUEST["pref_name"]);
+
+		print $this->wrap(self::STATUS_OK, array("value" => get_pref($this->link, $pref_name)));
+	}
+
+	function index() {
+		print $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD'));
+	}
+
+}
+
+?>

+ 7 - 9
public.php

@@ -48,16 +48,14 @@
 
 	$handler = new Public_Handler($link, $_REQUEST);
 
-	if ($handler) {
-		if ($handler->before()) {
-			if ($method && method_exists($handler, $method)) {
-				$handler->$method();
-			} else if (method_exists($handler, 'index')) {
-				$handler->index();
-			}
-			$handler->after();
-			return;
+	if ($handler->before($method)) {
+		if ($method && method_exists($handler, $method)) {
+			$handler->$method();
+		} else if (method_exists($handler, 'index')) {
+			$handler->index();
 		}
+		$handler->after();
+		return;
 	}
 
 	header("Content-Type: text/plain");