2 require "xmlrpc/lib/xmlrpc.inc";
3 require "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 if (DB_TYPE
== "pgsql") {
23 pg_query("set client_encoding = 'utf-8'");
24 pg_set_client_encoding("UNICODE");
26 // db_query($link, "SET NAMES utf8");
27 // db_query($link, "SET CHARACTER SET utf8");
30 function getVirtualFeeds($msg) {
35 $login_o = $msg->getParam(0);
36 $pass_o = $msg->getParam(1);
38 $login = $login_o->scalarval();
39 $pass = $pass_o->scalarval();
41 $user_id = authenticate_user($link, $login, $pass);
43 $counters_ret = array();
45 if (authenticate_user($link, $login, $pass)) {
47 $counters = getLabelCounters($link, false, true);
49 foreach (array_keys($counters) as $id) {
50 $line_struct = new xmlrpcval(
52 "id" => new xmlrpcval($id, "int"),
53 "title" => new xmlrpcval($counters[$id]["description"]),
54 "unread" => new xmlrpcval($counters[$id]["counter"], "int")
58 array_push($counters_ret, $line_struct);
61 $reply = new xmlrpcval($counters_ret, "array");
64 $reply_msg = "Login failed.";
68 if ($error_code != 0) {
69 return new xmlrpcresp(0, $error_code, $reply_msg);
71 return new xmlrpcresp($reply);
76 function getCategories($msg) {
79 $login_o = $msg->getParam(0);
80 $pass_o = $msg->getParam(1);
82 $login = $login_o->scalarval();
83 $pass = $pass_o->scalarval();
85 $user_id = authenticate_user($link, $login, $pass);
89 if (authenticate_user($link, $login, $pass)) {
91 $result = db_query($link, "SELECT
92 id, title FROM ttrss_feed_categories
98 while ($line = db_fetch_assoc($result)) {
100 $unread = getFeedUnread($link, $line["id"]);
102 $line_struct = new xmlrpcval(
104 "title" => new xmlrpcval($line["title"]),
105 "id" => new xmlrpcval($line["id"], "int")
109 array_push($feeds, $line_struct);
112 $reply = new xmlrpcval($feeds, "array");
115 $reply = "Login failed.";
119 if ($error_code != 0) {
120 return new xmlrpcresp(0, $error_code, $reply_msg);
122 return new xmlrpcresp($reply);
127 function getTotalUnread($msg) {
132 $login_o = $msg->getParam(0);
133 $pass_o = $msg->getParam(1);
135 $login = $login_o->scalarval();
136 $pass = $pass_o->scalarval();
138 $user_id = authenticate_user($link, $login, $pass);
141 if (authenticate_user($link, $login, $pass)) {
143 $reply_msg = getGlobalUnread($link);
146 $reply_msg = "Login failed.";
150 if ($error_code != 0) {
151 return new xmlrpcresp(0, $error_code, $reply_msg);
153 return new xmlrpcresp(new xmlrpcval($reply_msg));
158 function getVersion() {
159 return new xmlrpcval(VERSION
);
162 function getSubscribedFeeds($msg) {
165 $login_o = $msg->getParam(0);
166 $pass_o = $msg->getParam(1);
168 $login = $login_o->scalarval();
169 $pass = $pass_o->scalarval();
171 $user_id = authenticate_user($link, $login, $pass);
173 if (authenticate_user($link, $login, $pass)) {
175 $result = db_query($link, "SELECT
176 id, feed_url, cat_id, title, SUBSTRING(last_updated,1,19) AS last_updated
177 FROM ttrss_feeds WHERE owner_uid = " .
182 while ($line = db_fetch_assoc($result)) {
184 $unread = getFeedUnread($link, $line["id"]);
186 $line_struct = new xmlrpcval(
188 "feed_url" => new xmlrpcval($line["feed_url"]),
189 "title" => new xmlrpcval($line["title"]),
190 "id" => new xmlrpcval($line["id"], "int"),
191 "unread" => new xmlrpcval($unread, "int"),
192 "cat_id" => new xmlrpcval($line["cat_id"], "int"),
193 "last_updated" => new xmlrpcval(strtotime($line["last_updated"]), "int")
197 array_push($feeds, $line_struct);
200 $reply = new xmlrpcval($feeds, "array");
203 $reply = new xmlrpcval("Login failed.");
206 return new xmlrpcresp($reply);
209 function subscribeToFeed($msg) {
214 $login_o = $msg->getParam(0);
215 $pass_o = $msg->getParam(1);
216 $feed_url_o = $msg->getParam(2);
218 $login = $login_o->scalarval();
219 $pass = $pass_o->scalarval();
220 $feed_url = $feed_url_o->scalarval();
222 if (authenticate_user($link, $login, $pass)) {
223 if (subscribe_to_feed($link, $feed_url)) {
224 $reply_msg = "Subscribed successfully.";
226 $reply_msg = "Feed already exists in the database.";
230 $reply_msg = "Login failed.";
234 if ($error_code != 0) {
235 return new xmlrpcresp(0, $error_code, $reply_msg);
237 return new xmlrpcresp(new xmlrpcval($reply_msg));
241 function getFeedHeadlines($msg) {
246 $login_o = $msg->getParam(0);
247 $pass_o = $msg->getParam(1);
248 $feed_id_o = $msg->getParam(2);
249 $limit_o = $msg->getParam(3);
250 $filter_o = $msg->getParam(4);
252 $login = $login_o->scalarval();
253 $pass = $pass_o->scalarval();
254 $feed_id = $feed_id_o->scalarval();
255 $limit = $limit_o->scalarval();
256 $filter = $filter_o->scalarval();
258 if (authenticate_user($link, $login, $pass)) {
261 $view_mode = "unread";
262 } else if ($filter == 2) {
263 $view_mode = "marked";
264 } else if ($filter == 3) {
265 $view_mode = "adaptive";
273 $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit,
274 $view_mode, $cat_view, $search, $search_mode, $match_on);
276 $result = $qfh_ret[0];
277 $feed_title = $qfh_ret[1];
281 while ($line = db_fetch_assoc($result)) {
283 $is_updated = ($line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"));
285 $headline_items = array(
286 "id" => new xmlrpcval($line["id"], "int"),
287 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
288 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
289 "updated" => new xmlrpcval(strtotime($line["updated"]), "int"),
290 "is_updated" => new xmlrpcval($is_updated, "boolean"),
292 "title" => new xmlrpcval($line["title"])
296 $headline_items["feed_id"] = new xmlrpcval($line["feed_id"], "int");
299 $line_struct = new xmlrpcval($headline_items,
302 array_push($articles, $line_struct);
305 $reply = new xmlrpcval(
307 "title" => new xmlrpcval($feed_title),
308 "headlines" => new xmlrpcval($articles, "array")
313 $reply_msg = "Login failed.";
317 if ($error_code != 0) {
318 return new xmlrpcresp(0, $error_code, $reply_msg);
320 return new xmlrpcresp($reply);
325 function getArticle($msg) {
330 $login_o = $msg->getParam(0);
331 $pass_o = $msg->getParam(1);
332 $article_id_o = $msg->getParam(2);
334 $login = $login_o->scalarval();
335 $pass = $pass_o->scalarval();
336 $article_id = $article_id_o->scalarval();
338 if (authenticate_user($link, $login, $pass)) {
340 $query = "SELECT title,link,content,feed_id,comments,int_id,
342 SUBSTRING(updated,1,16) as updated,
344 FROM ttrss_entries,ttrss_user_entries
345 WHERE id = '$article_id' AND ref_id = id AND owner_uid = " . $_SESSION["uid"] ;
347 $result = db_query($link, $query);
349 if (db_num_rows($result) == 1) {
351 $line = db_fetch_assoc($result);
353 $reply = new xmlrpcval(
355 "title" => new xmlrpcval($line["title"]),
356 "link" => new xmlrpcval($line["link"]),
357 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
358 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
359 "comments" => new xmlrpcval($line["comments"]),
360 "author" => new xmlrpcval($line["author"]),
361 "updated" => new xmlrpcval(strtotime($line["updated"], "int")),
362 "content" => new xmlrpcval($line["content"])
367 $reply_msg = "Article not found.";
372 $reply_msg = "Login failed.";
376 if ($error_code != 0) {
377 return new xmlrpcresp(0, $error_code, $reply_msg);
379 return new xmlrpcresp($reply);
383 function setArticleMarked($msg) {
388 $login_o = $msg->getParam(0);
389 $pass_o = $msg->getParam(1);
390 $article_id_o = $msg->getParam(2);
391 $marked_o = $msg->getParam(3);
393 $login = $login_o->scalarval();
394 $pass = $pass_o->scalarval();
395 $article_id = $article_id_o->scalarval();
396 $marked = $marked_o->scalarval();
398 if (authenticate_user($link, $login, $pass)) {
401 $query_strategy_part = "marked = false";
402 } else if ($marked == 1) {
403 $query_strategy_part = "marked = true";
404 } else if ($marked == 2) {
405 $query_strategy_part = "marked = NOT marked";
408 $result = db_query($link, "UPDATE ttrss_user_entries SET
409 $query_strategy_part WHERE ref_id = '$article_id' AND
410 owner_uid = " . $_SESSION["uid"]);
412 if (db_affected_rows($link, $result) == 1) {
416 $reply_msg = "Failed to update article.";
420 $reply_msg = "Login failed.";
424 if ($error_code != 0) {
425 return new xmlrpcresp(0, $error_code, $reply_msg);
427 return new xmlrpcresp(new xmlrpcval($reply_msg));
432 function setArticleRead($msg) {
437 $login_o = $msg->getParam(0);
438 $pass_o = $msg->getParam(1);
439 $article_id_o = $msg->getParam(2);
440 $read_o = $msg->getParam(3);
442 $login = $login_o->scalarval();
443 $pass = $pass_o->scalarval();
444 $article_id = $article_id_o->scalarval();
445 $read = $read_o->scalarval();
447 if (authenticate_user($link, $login, $pass)) {
450 $query_strategy_part = "unread = true";
451 } else if ($read == 1) {
452 $query_strategy_part = "unread = false";
453 } else if ($read == 2) {
454 $query_strategy_part = "unread = NOT unread";
457 $result = db_query($link, "UPDATE ttrss_user_entries SET
458 $query_strategy_part WHERE ref_id = '$article_id' AND
459 owner_uid = " . $_SESSION["uid"]);
461 if (db_affected_rows($link, $result) == 1) {
465 $reply_msg = "Failed to update article.";
469 $reply_msg = "Login failed.";
473 if ($error_code != 0) {
474 return new xmlrpcresp(0, $error_code, $reply_msg);
476 return new xmlrpcresp(new xmlrpcval($reply_msg));
481 $subscribeToFeed_sig = array(array($xmlrpcString,
482 $xmlrpcString, $xmlrpcString, $xmlrpcString));
484 $getSubscribedFeeds_sig = array(array($xmlrpcString,
485 $xmlrpcString, $xmlrpcString));
487 $getFeedHeadlines_sig = array(array($xmlrpcString,
488 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt, $xmlrpcInt));
490 $getArticle_sig = array(array($xmlrpcString,
491 $xmlrpcString, $xmlrpcString, $xmlrpcInt));
493 $setArticleMarked_sig = array(array($xmlrpcString,
494 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
496 $setArticleUnread_sig = array(array($xmlrpcString,
497 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
499 $getVersion_sig = array(array($xmlrpcString));
501 $getTotalUnread_sig = array(array($xmlrpcInt, $xmlrpcString,
504 $getCategories_sig = array(array($xmlrpcString,
505 $xmlrpcString, $xmlrpcString));
507 $getVirtualFeeds_sig = array(array($xmlrpcInt, $xmlrpcString,
510 $s = new xmlrpc_server(
512 "rss.getVirtualFeeds" => array("function" => "getVirtualFeeds",
513 "signature" => $getVirtualFeeds_sig),
514 "rss.getCategories" => array("function" => "getCategories",
515 "signature" => $getCategories_sig),
516 "rss.getTotalUnread" => array("function" => "getTotalUnread",
517 "signature" => $getTotalUnread_sig),
518 "rss.getVersion" => array("function" => "getVersion",
519 "signature" => $getVersion_sig),
520 "rss.setArticleRead" => array("function" => "setArticleRead",
521 "signature" => $setArticleRead_sig),
522 "rss.setArticleMarked" => array("function" => "setArticleMarked",
523 "signature" => $setArticleMarked_sig),
524 "rss.getArticle" => array("function" => "getArticle",
525 "signature" => $getArticle_sig),
526 "rss.getFeedHeadlines" => array("function" => "getFeedHeadlines",
527 "signature" => $getFeedHeadlines_sig),
528 "rss.getSubscribedFeeds" => array("function" => "getSubscribedFeeds",
529 "signature" => $getSubscribedFeeds_sig),
530 "rss.subscribeToFeed" => array("function" => "subscribeToFeed",
531 "signature" => $subscribeToFeed_sig)), 0
533 $s->response_charset_encoding
= "UTF-8";