2 require "lib/xmlrpc/lib/xmlrpc.inc";
3 require "lib/xmlrpc/lib/xmlrpcs.inc";
5 require_once "sanity_check.php";
6 require_once "config.php";
9 require_once "db-prefs.php";
10 require_once "functions.php";
12 $link = db_connect(DB_HOST
, DB_USER
, DB_PASS
, DB_NAME
);
15 if (DB_TYPE
== "mysql") {
18 // PG seems to display its own errors just fine by default.
22 init_connection($link);
24 function getVirtualFeeds($msg) {
29 $login_o = $msg->getParam(0);
30 $pass_o = $msg->getParam(1);
32 $login = $login_o->scalarval();
33 $pass = $pass_o->scalarval();
35 $user_id = authenticate_user($link, $login, $pass);
37 $counters_ret = array();
39 if (authenticate_user($link, $login, $pass)) {
41 $counters = getLabelCounters($link, false, true);
43 foreach (array_keys($counters) as $id) {
44 $line_struct = new xmlrpcval(
46 "id" => new xmlrpcval($id, "int"),
47 "title" => new xmlrpcval($counters[$id]["description"]),
48 "unread" => new xmlrpcval($counters[$id]["counter"], "int")
52 array_push($counters_ret, $line_struct);
55 $reply = new xmlrpcval($counters_ret, "array");
58 $reply_msg = "Login failed.";
62 if ($error_code != 0) {
63 return new xmlrpcresp(0, $error_code, $reply_msg);
65 return new xmlrpcresp($reply);
70 function getCategories($msg) {
73 $login_o = $msg->getParam(0);
74 $pass_o = $msg->getParam(1);
76 $login = $login_o->scalarval();
77 $pass = $pass_o->scalarval();
79 $user_id = authenticate_user($link, $login, $pass);
83 if (authenticate_user($link, $login, $pass)) {
85 $result = db_query($link, "SELECT
86 id, title FROM ttrss_feed_categories
92 while ($line = db_fetch_assoc($result)) {
94 $unread = getFeedUnread($link, $line["id"]);
96 $line_struct = new xmlrpcval(
98 "title" => new xmlrpcval($line["title"]),
99 "id" => new xmlrpcval($line["id"], "int")
103 array_push($feeds, $line_struct);
106 $reply = new xmlrpcval($feeds, "array");
109 $reply = "Login failed.";
113 if ($error_code != 0) {
114 return new xmlrpcresp(0, $error_code, $reply_msg);
116 return new xmlrpcresp($reply);
121 function getTotalUnread($msg) {
126 $login_o = $msg->getParam(0);
127 $pass_o = $msg->getParam(1);
129 $login = $login_o->scalarval();
130 $pass = $pass_o->scalarval();
132 $user_id = authenticate_user($link, $login, $pass);
135 if (authenticate_user($link, $login, $pass)) {
137 $reply_msg = getGlobalUnread($link);
140 $reply_msg = "Login failed.";
144 if ($error_code != 0) {
145 return new xmlrpcresp(0, $error_code, $reply_msg);
147 return new xmlrpcresp(new xmlrpcval($reply_msg));
152 function getVersion() {
153 return new xmlrpcval(VERSION
);
156 function getSubscribedFeeds($msg) {
159 $login_o = $msg->getParam(0);
160 $pass_o = $msg->getParam(1);
162 $login = $login_o->scalarval();
163 $pass = $pass_o->scalarval();
165 $user_id = authenticate_user($link, $login, $pass);
167 if (authenticate_user($link, $login, $pass)) {
169 $result = db_query($link, "SELECT
170 id, feed_url, cat_id, title, ".SUBSTRING_FOR_DATE
."(last_updated,1,19) AS last_updated
171 FROM ttrss_feeds WHERE owner_uid = " .
176 while ($line = db_fetch_assoc($result)) {
178 $unread = getFeedUnread($link, $line["id"]);
180 $line_struct = new xmlrpcval(
182 "feed_url" => new xmlrpcval($line["feed_url"]),
183 "title" => new xmlrpcval($line["title"]),
184 "id" => new xmlrpcval($line["id"], "int"),
185 "unread" => new xmlrpcval($unread, "int"),
186 "cat_id" => new xmlrpcval($line["cat_id"], "int"),
187 "last_updated" => new xmlrpcval(strtotime($line["last_updated"]), "int")
191 array_push($feeds, $line_struct);
194 $reply = new xmlrpcval($feeds, "array");
197 $reply = new xmlrpcval("Login failed.");
200 return new xmlrpcresp($reply);
203 function subscribeToFeed($msg) {
208 $login_o = $msg->getParam(0);
209 $pass_o = $msg->getParam(1);
210 $feed_url_o = $msg->getParam(2);
212 $login = $login_o->scalarval();
213 $pass = $pass_o->scalarval();
214 $feed_url = $feed_url_o->scalarval();
216 if (authenticate_user($link, $login, $pass)) {
217 if (subscribe_to_feed($link, $feed_url)) {
218 $reply_msg = "Subscribed successfully.";
220 $reply_msg = "Feed already exists in the database.";
224 $reply_msg = "Login failed.";
228 if ($error_code != 0) {
229 return new xmlrpcresp(0, $error_code, $reply_msg);
231 return new xmlrpcresp(new xmlrpcval($reply_msg));
235 function getFeedHeadlines($msg) {
240 $login_o = $msg->getParam(0);
241 $pass_o = $msg->getParam(1);
242 $feed_id_o = $msg->getParam(2);
243 $limit_o = $msg->getParam(3);
244 $filter_o = $msg->getParam(4);
246 $login = $login_o->scalarval();
247 $pass = $pass_o->scalarval();
248 $feed_id = $feed_id_o->scalarval();
249 $limit = $limit_o->scalarval();
250 $filter = $filter_o->scalarval();
252 if (authenticate_user($link, $login, $pass)) {
255 $view_mode = "unread";
256 } else if ($filter == 2) {
257 $view_mode = "marked";
258 } else if ($filter == 3) {
259 $view_mode = "adaptive";
267 $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit,
268 $view_mode, $cat_view, $search, $search_mode, $match_on);
270 $result = $qfh_ret[0];
271 $feed_title = $qfh_ret[1];
275 while ($line = db_fetch_assoc($result)) {
277 $is_updated = ($line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"));
279 $headline_items = array(
280 "id" => new xmlrpcval($line["id"], "int"),
281 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
282 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
283 "updated" => new xmlrpcval(strtotime($line["updated"]), "int"),
284 "is_updated" => new xmlrpcval($is_updated, "boolean"),
286 "title" => new xmlrpcval($line["title"])
290 $headline_items["feed_id"] = new xmlrpcval($line["feed_id"], "int");
293 $line_struct = new xmlrpcval($headline_items,
296 array_push($articles, $line_struct);
299 $reply = new xmlrpcval(
301 "title" => new xmlrpcval($feed_title),
302 "headlines" => new xmlrpcval($articles, "array")
307 $reply_msg = "Login failed.";
311 if ($error_code != 0) {
312 return new xmlrpcresp(0, $error_code, $reply_msg);
314 return new xmlrpcresp($reply);
319 function getArticle($msg) {
324 $login_o = $msg->getParam(0);
325 $pass_o = $msg->getParam(1);
326 $article_id_o = $msg->getParam(2);
328 $login = $login_o->scalarval();
329 $pass = $pass_o->scalarval();
330 $article_id = $article_id_o->scalarval();
332 if (authenticate_user($link, $login, $pass)) {
334 $query = "SELECT title,link,content,feed_id,comments,int_id,
336 ".SUBSTRING_FOR_DATE
."(updated,1,16) as updated,
338 FROM ttrss_entries,ttrss_user_entries
339 WHERE id = '$article_id' AND ref_id = id AND owner_uid = " . $_SESSION["uid"] ;
341 $result = db_query($link, $query);
343 if (db_num_rows($result) == 1) {
345 $line = db_fetch_assoc($result);
347 $reply = new xmlrpcval(
349 "title" => new xmlrpcval($line["title"]),
350 "link" => new xmlrpcval($line["link"]),
351 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
352 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
353 "comments" => new xmlrpcval($line["comments"]),
354 "author" => new xmlrpcval($line["author"]),
355 "updated" => new xmlrpcval(strtotime($line["updated"], "int")),
356 "content" => new xmlrpcval($line["content"])
361 $reply_msg = "Article not found.";
366 $reply_msg = "Login failed.";
370 if ($error_code != 0) {
371 return new xmlrpcresp(0, $error_code, $reply_msg);
373 return new xmlrpcresp($reply);
377 function setArticleMarked($msg) {
382 $login_o = $msg->getParam(0);
383 $pass_o = $msg->getParam(1);
384 $article_id_o = $msg->getParam(2);
385 $marked_o = $msg->getParam(3);
387 $login = $login_o->scalarval();
388 $pass = $pass_o->scalarval();
389 $article_id = $article_id_o->scalarval();
390 $marked = $marked_o->scalarval();
392 if (authenticate_user($link, $login, $pass)) {
395 $query_strategy_part = "marked = false";
396 } else if ($marked == 1) {
397 $query_strategy_part = "marked = true";
398 } else if ($marked == 2) {
399 $query_strategy_part = "marked = NOT marked";
402 $result = db_query($link, "UPDATE ttrss_user_entries SET
403 $query_strategy_part WHERE ref_id = '$article_id' AND
404 owner_uid = " . $_SESSION["uid"]);
406 if (db_affected_rows($link, $result) == 1) {
410 $reply_msg = "Failed to update article.";
414 $reply_msg = "Login failed.";
418 if ($error_code != 0) {
419 return new xmlrpcresp(0, $error_code, $reply_msg);
421 return new xmlrpcresp(new xmlrpcval($reply_msg));
426 function setArticleRead($msg) {
431 $login_o = $msg->getParam(0);
432 $pass_o = $msg->getParam(1);
433 $article_id_o = $msg->getParam(2);
434 $read_o = $msg->getParam(3);
436 $login = $login_o->scalarval();
437 $pass = $pass_o->scalarval();
438 $article_id = $article_id_o->scalarval();
439 $read = $read_o->scalarval();
441 if (authenticate_user($link, $login, $pass)) {
444 $query_strategy_part = "unread = true";
445 } else if ($read == 1) {
446 $query_strategy_part = "unread = false";
447 } else if ($read == 2) {
448 $query_strategy_part = "unread = NOT unread";
451 $result = db_query($link, "UPDATE ttrss_user_entries SET
452 $query_strategy_part WHERE ref_id = '$article_id' AND
453 owner_uid = " . $_SESSION["uid"]);
455 if (db_affected_rows($link, $result) == 1) {
459 $reply_msg = "Failed to update article.";
463 $reply_msg = "Login failed.";
467 if ($error_code != 0) {
468 return new xmlrpcresp(0, $error_code, $reply_msg);
470 return new xmlrpcresp(new xmlrpcval($reply_msg));
475 $subscribeToFeed_sig = array(array($xmlrpcString,
476 $xmlrpcString, $xmlrpcString, $xmlrpcString));
478 $getSubscribedFeeds_sig = array(array($xmlrpcString,
479 $xmlrpcString, $xmlrpcString));
481 $getFeedHeadlines_sig = array(array($xmlrpcString,
482 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt, $xmlrpcInt));
484 $getArticle_sig = array(array($xmlrpcString,
485 $xmlrpcString, $xmlrpcString, $xmlrpcInt));
487 $setArticleMarked_sig = array(array($xmlrpcString,
488 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
490 $setArticleUnread_sig = array(array($xmlrpcString,
491 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
493 $getVersion_sig = array(array($xmlrpcString));
495 $getTotalUnread_sig = array(array($xmlrpcInt, $xmlrpcString,
498 $getCategories_sig = array(array($xmlrpcString,
499 $xmlrpcString, $xmlrpcString));
501 $getVirtualFeeds_sig = array(array($xmlrpcInt, $xmlrpcString,
504 $s = new xmlrpc_server(
506 "rss.getVirtualFeeds" => array("function" => "getVirtualFeeds",
507 "signature" => $getVirtualFeeds_sig),
508 "rss.getCategories" => array("function" => "getCategories",
509 "signature" => $getCategories_sig),
510 "rss.getTotalUnread" => array("function" => "getTotalUnread",
511 "signature" => $getTotalUnread_sig),
512 "rss.getVersion" => array("function" => "getVersion",
513 "signature" => $getVersion_sig),
514 "rss.setArticleRead" => array("function" => "setArticleRead",
515 "signature" => $setArticleRead_sig),
516 "rss.setArticleMarked" => array("function" => "setArticleMarked",
517 "signature" => $setArticleMarked_sig),
518 "rss.getArticle" => array("function" => "getArticle",
519 "signature" => $getArticle_sig),
520 "rss.getFeedHeadlines" => array("function" => "getFeedHeadlines",
521 "signature" => $getFeedHeadlines_sig),
522 "rss.getSubscribedFeeds" => array("function" => "getSubscribedFeeds",
523 "signature" => $getSubscribedFeeds_sig),
524 "rss.subscribeToFeed" => array("function" => "subscribeToFeed",
525 "signature" => $subscribeToFeed_sig)), 0
527 $s->response_charset_encoding
= "UTF-8";