]> git.wh0rd.org - tt-rss.git/blame - xml-rpc.php
obsolete cookie storage for collapsed status of feedlist and special categories ...
[tt-rss.git] / xml-rpc.php
CommitLineData
1d3a17c7 1<?php
ba5e1808
AD
2 require "lib/xmlrpc/lib/xmlrpc.inc";
3 require "lib/xmlrpc/lib/xmlrpcs.inc";
956c7629
AD
4
5 require_once "sanity_check.php";
6 require_once "config.php";
7
8 require_once "db.php";
9 require_once "db-prefs.php";
10 require_once "functions.php";
11
2e58d4e5
AD
12 $GLOBALS['xmlrpc_internalencoding'] = "UTF-8";
13
956c7629
AD
14 $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
15
16 if (!$link) {
17 if (DB_TYPE == "mysql") {
18 print mysql_error();
19 }
20 // PG seems to display its own errors just fine by default.
21 return;
22 }
23
f29ba148 24 init_connection($link);
956c7629 25
ef393de7
AD
26 function getVirtualFeeds($msg) {
27 global $link;
28
29 $error_code = 0;
30
31 $login_o = $msg->getParam(0);
32 $pass_o = $msg->getParam(1);
33
34 $login = $login_o->scalarval();
35 $pass = $pass_o->scalarval();
36
37 $user_id = authenticate_user($link, $login, $pass);
38
39 $counters_ret = array();
40
41 if (authenticate_user($link, $login, $pass)) {
42
43 $counters = getLabelCounters($link, false, true);
44
45 foreach (array_keys($counters) as $id) {
46 $line_struct = new xmlrpcval(
47 array(
48 "id" => new xmlrpcval($id, "int"),
5ba41c31
AD
49 "title" => new xmlrpcval($counters[$id]["description"]),
50 "unread" => new xmlrpcval($counters[$id]["counter"], "int")
ef393de7
AD
51 ),
52 "struct");
53
54 array_push($counters_ret, $line_struct);
55 }
56
57 $reply = new xmlrpcval($counters_ret, "array");
58
59 } else {
60 $reply_msg = "Login failed.";
61 $error_code = 1;
62 }
63
64 if ($error_code != 0) {
65 return new xmlrpcresp(0, $error_code, $reply_msg);
66 } else {
67 return new xmlrpcresp($reply);
68 }
69
70 }
71
bd907fe2
AD
72 function getCategories($msg) {
73 global $link;
74
75 $login_o = $msg->getParam(0);
76 $pass_o = $msg->getParam(1);
77
78 $login = $login_o->scalarval();
79 $pass = $pass_o->scalarval();
80
81 $user_id = authenticate_user($link, $login, $pass);
82
83 $error_code = 0;
84
85 if (authenticate_user($link, $login, $pass)) {
86
87 $result = db_query($link, "SELECT
88 id, title FROM ttrss_feed_categories
89 WHERE owner_uid = " .
90 $_SESSION["uid"]);
91
92 $feeds = array();
93
94 while ($line = db_fetch_assoc($result)) {
95
e36f43d2 96 $unread = getFeedUnread($link, $line["id"], true);
bd907fe2
AD
97
98 $line_struct = new xmlrpcval(
99 array(
100 "title" => new xmlrpcval($line["title"]),
e36f43d2
AD
101 "id" => new xmlrpcval($line["id"], "int"),
102 "unread" => new xmlrpcval($unread, "int")
bd907fe2
AD
103 ),
104 "struct");
105
106 array_push($feeds, $line_struct);
107 }
108
109 $reply = new xmlrpcval($feeds, "array");
110
111 } else {
112 $reply = "Login failed.";
113 $error_code = 1;
114 }
115
116 if ($error_code != 0) {
117 return new xmlrpcresp(0, $error_code, $reply_msg);
118 } else {
119 return new xmlrpcresp($reply);
120 }
121
122 }
123
9e62a175
AD
124 function getTotalUnread($msg) {
125 global $link;
126
127 $error_code = 0;
128
129 $login_o = $msg->getParam(0);
130 $pass_o = $msg->getParam(1);
131
132 $login = $login_o->scalarval();
133 $pass = $pass_o->scalarval();
134
135 $user_id = authenticate_user($link, $login, $pass);
136
137
138 if (authenticate_user($link, $login, $pass)) {
139
140 $reply_msg = getGlobalUnread($link);
141
142 } else {
143 $reply_msg = "Login failed.";
144 $error_code = 1;
145 }
146
147 if ($error_code != 0) {
148 return new xmlrpcresp(0, $error_code, $reply_msg);
149 } else {
150 return new xmlrpcresp(new xmlrpcval($reply_msg));
151 }
152
153 }
154
a3c0ae7c
AD
155 function getVersion() {
156 return new xmlrpcval(VERSION);
157 }
158
7fb32341
AD
159 function getSubscribedFeeds($msg) {
160 global $link;
161
162 $login_o = $msg->getParam(0);
163 $pass_o = $msg->getParam(1);
164
165 $login = $login_o->scalarval();
166 $pass = $pass_o->scalarval();
167
168 $user_id = authenticate_user($link, $login, $pass);
169
170 if (authenticate_user($link, $login, $pass)) {
171
172 $result = db_query($link, "SELECT
fc2b26a6 173 id, feed_url, cat_id, title, ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
7fb32341
AD
174 FROM ttrss_feeds WHERE owner_uid = " .
175 $_SESSION["uid"]);
956c7629 176
7fb32341
AD
177 $feeds = array();
178
179 while ($line = db_fetch_assoc($result)) {
e359d44b
AD
180
181 $unread = getFeedUnread($link, $line["id"]);
7fb32341
AD
182
183 $line_struct = new xmlrpcval(
184 array(
185 "feed_url" => new xmlrpcval($line["feed_url"]),
186 "title" => new xmlrpcval($line["title"]),
68d3cf5a 187 "id" => new xmlrpcval($line["id"], "int"),
e359d44b 188 "unread" => new xmlrpcval($unread, "int"),
400efc65 189 "cat_id" => new xmlrpcval($line["cat_id"], "int"),
68d3cf5a 190 "last_updated" => new xmlrpcval(strtotime($line["last_updated"]), "int")
7fb32341
AD
191 ),
192 "struct");
193
194 array_push($feeds, $line_struct);
195 }
196
197 $reply = new xmlrpcval($feeds, "array");
198
199 } else {
200 $reply = new xmlrpcval("Login failed.");
201 }
202
203 return new xmlrpcresp($reply);
204 }
205
206 function subscribeToFeed($msg) {
956c7629
AD
207 global $link;
208
68d3cf5a
AD
209 $error_code = 0;
210
956c7629
AD
211 $login_o = $msg->getParam(0);
212 $pass_o = $msg->getParam(1);
213 $feed_url_o = $msg->getParam(2);
214
215 $login = $login_o->scalarval();
216 $pass = $pass_o->scalarval();
217 $feed_url = $feed_url_o->scalarval();
956c7629
AD
218
219 if (authenticate_user($link, $login, $pass)) {
220 if (subscribe_to_feed($link, $feed_url)) {
221 $reply_msg = "Subscribed successfully.";
222 } else {
223 $reply_msg = "Feed already exists in the database.";
68d3cf5a 224 $error_code = 2;
956c7629
AD
225 }
226 } else {
227 $reply_msg = "Login failed.";
68d3cf5a
AD
228 $error_code = 1;
229 }
230
231 if ($error_code != 0) {
232 return new xmlrpcresp(0, $error_code, $reply_msg);
233 } else {
234 return new xmlrpcresp(new xmlrpcval($reply_msg));
235 }
236 }
237
238 function getFeedHeadlines($msg) {
239 global $link;
240
241 $error_code = 0;
242
243 $login_o = $msg->getParam(0);
244 $pass_o = $msg->getParam(1);
245 $feed_id_o = $msg->getParam(2);
246 $limit_o = $msg->getParam(3);
247 $filter_o = $msg->getParam(4);
248
249 $login = $login_o->scalarval();
250 $pass = $pass_o->scalarval();
251 $feed_id = $feed_id_o->scalarval();
252 $limit = $limit_o->scalarval();
253 $filter = $filter_o->scalarval();
254
255 if (authenticate_user($link, $login, $pass)) {
256
68d3cf5a 257 if ($filter == 1) {
ef393de7 258 $view_mode = "unread";
68d3cf5a 259 } else if ($filter == 2) {
ef393de7 260 $view_mode = "marked";
5ba41c31
AD
261 } else if ($filter == 3) {
262 $view_mode = "adaptive";
68d3cf5a 263 }
ef393de7
AD
264
265 $cat_view = false;
266 $search = "";
267 $search_mode = "";
268 $match_on = "";
269
270 $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit,
271 $view_mode, $cat_view, $search, $search_mode, $match_on);
68d3cf5a 272
ef393de7
AD
273 $result = $qfh_ret[0];
274 $feed_title = $qfh_ret[1];
275
68d3cf5a
AD
276 $articles = array();
277
278 while ($line = db_fetch_assoc($result)) {
279
632c6741
AD
280 $is_updated = ($line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"));
281
ef393de7 282 $headline_items = array(
68d3cf5a
AD
283 "id" => new xmlrpcval($line["id"], "int"),
284 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
285 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
286 "updated" => new xmlrpcval(strtotime($line["updated"]), "int"),
632c6741
AD
287 "is_updated" => new xmlrpcval($is_updated, "boolean"),
288
68d3cf5a 289 "title" => new xmlrpcval($line["title"])
ef393de7
AD
290 );
291
292 if ($feed_id < 0) {
293 $headline_items["feed_id"] = new xmlrpcval($line["feed_id"], "int");
294 }
295
296 $line_struct = new xmlrpcval($headline_items,
68d3cf5a
AD
297 "struct");
298
299 array_push($articles, $line_struct);
68d3cf5a
AD
300 }
301
ef393de7
AD
302 $reply = new xmlrpcval(
303 array(
304 "title" => new xmlrpcval($feed_title),
305 "headlines" => new xmlrpcval($articles, "array")
306 ),
307 "struct");
68d3cf5a
AD
308
309 } else {
310 $reply_msg = "Login failed.";
311 $error_code = 1;
312 }
313
314 if ($error_code != 0) {
315 return new xmlrpcresp(0, $error_code, $reply_msg);
316 } else {
317 return new xmlrpcresp($reply);
956c7629 318 }
68d3cf5a
AD
319
320 }
321
322 function getArticle($msg) {
323 global $link;
324
325 $error_code = 0;
326
327 $login_o = $msg->getParam(0);
328 $pass_o = $msg->getParam(1);
329 $article_id_o = $msg->getParam(2);
330
331 $login = $login_o->scalarval();
332 $pass = $pass_o->scalarval();
333 $article_id = $article_id_o->scalarval();
334
335 if (authenticate_user($link, $login, $pass)) {
336
337 $query = "SELECT title,link,content,feed_id,comments,int_id,
338 marked,unread,
fc2b26a6 339 ".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
68d3cf5a
AD
340 author
341 FROM ttrss_entries,ttrss_user_entries
342 WHERE id = '$article_id' AND ref_id = id AND owner_uid = " . $_SESSION["uid"] ;
343
344 $result = db_query($link, $query);
345
346 if (db_num_rows($result) == 1) {
347
348 $line = db_fetch_assoc($result);
349
350 $reply = new xmlrpcval(
351 array(
352 "title" => new xmlrpcval($line["title"]),
353 "link" => new xmlrpcval($line["link"]),
354 "unread" => new xmlrpcval(sql_bool_to_bool($line["unread"]), "boolean"),
355 "marked" => new xmlrpcval(sql_bool_to_bool($line["marked"]), "boolean"),
356 "comments" => new xmlrpcval($line["comments"]),
357 "author" => new xmlrpcval($line["author"]),
358 "updated" => new xmlrpcval(strtotime($line["updated"], "int")),
359 "content" => new xmlrpcval($line["content"])
360 ),
361 "struct");
362
363 } else {
364 $reply_msg = "Article not found.";
365 $error_code = 2;
366 }
956c7629 367
68d3cf5a
AD
368 } else {
369 $reply_msg = "Login failed.";
370 $error_code = 1;
371 }
372
373 if ($error_code != 0) {
374 return new xmlrpcresp(0, $error_code, $reply_msg);
375 } else {
376 return new xmlrpcresp($reply);
377 }
378 }
379
380 function setArticleMarked($msg) {
381 global $link;
382
383 $error_code = 0;
384
385 $login_o = $msg->getParam(0);
386 $pass_o = $msg->getParam(1);
387 $article_id_o = $msg->getParam(2);
388 $marked_o = $msg->getParam(3);
389
390 $login = $login_o->scalarval();
391 $pass = $pass_o->scalarval();
392 $article_id = $article_id_o->scalarval();
393 $marked = $marked_o->scalarval();
394
395 if (authenticate_user($link, $login, $pass)) {
396
397 if ($marked == 0) {
398 $query_strategy_part = "marked = false";
399 } else if ($marked == 1) {
400 $query_strategy_part = "marked = true";
401 } else if ($marked == 2) {
402 $query_strategy_part = "marked = NOT marked";
403 }
404
405 $result = db_query($link, "UPDATE ttrss_user_entries SET
406 $query_strategy_part WHERE ref_id = '$article_id' AND
407 owner_uid = " . $_SESSION["uid"]);
408
409 if (db_affected_rows($link, $result) == 1) {
410 $reply_msg = "OK";
411 } else {
412 $error_code = 2;
413 $reply_msg = "Failed to update article.";
414 }
415
416 } else {
417 $reply_msg = "Login failed.";
418 $error_code = 1;
419 }
420
421 if ($error_code != 0) {
422 return new xmlrpcresp(0, $error_code, $reply_msg);
423 } else {
424 return new xmlrpcresp(new xmlrpcval($reply_msg));
425 }
426
427 }
428
429 function setArticleRead($msg) {
430 global $link;
431
432 $error_code = 0;
433
434 $login_o = $msg->getParam(0);
435 $pass_o = $msg->getParam(1);
436 $article_id_o = $msg->getParam(2);
437 $read_o = $msg->getParam(3);
438
439 $login = $login_o->scalarval();
440 $pass = $pass_o->scalarval();
441 $article_id = $article_id_o->scalarval();
442 $read = $read_o->scalarval();
443
444 if (authenticate_user($link, $login, $pass)) {
445
446 if ($read == 0) {
447 $query_strategy_part = "unread = true";
448 } else if ($read == 1) {
449 $query_strategy_part = "unread = false";
450 } else if ($read == 2) {
451 $query_strategy_part = "unread = NOT unread";
452 }
453
454 $result = db_query($link, "UPDATE ttrss_user_entries SET
455 $query_strategy_part WHERE ref_id = '$article_id' AND
456 owner_uid = " . $_SESSION["uid"]);
457
458 if (db_affected_rows($link, $result) == 1) {
459 $reply_msg = "OK";
460 } else {
461 $error_code = 2;
462 $reply_msg = "Failed to update article.";
463 }
464
465 } else {
466 $reply_msg = "Login failed.";
467 $error_code = 1;
468 }
469
470 if ($error_code != 0) {
471 return new xmlrpcresp(0, $error_code, $reply_msg);
472 } else {
473 return new xmlrpcresp(new xmlrpcval($reply_msg));
474 }
475
956c7629
AD
476 }
477
478 $subscribeToFeed_sig = array(array($xmlrpcString,
479 $xmlrpcString, $xmlrpcString, $xmlrpcString));
7fb32341
AD
480
481 $getSubscribedFeeds_sig = array(array($xmlrpcString,
482 $xmlrpcString, $xmlrpcString));
483
68d3cf5a
AD
484 $getFeedHeadlines_sig = array(array($xmlrpcString,
485 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt, $xmlrpcInt));
486
487 $getArticle_sig = array(array($xmlrpcString,
488 $xmlrpcString, $xmlrpcString, $xmlrpcInt));
489
490 $setArticleMarked_sig = array(array($xmlrpcString,
491 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
492
493 $setArticleUnread_sig = array(array($xmlrpcString,
494 $xmlrpcString, $xmlrpcString, $xmlrpcInt, $xmlrpcInt));
495
a3c0ae7c 496 $getVersion_sig = array(array($xmlrpcString));
9e62a175
AD
497
498 $getTotalUnread_sig = array(array($xmlrpcInt, $xmlrpcString,
499 $xmlrpcString));
a3c0ae7c 500
bd907fe2
AD
501 $getCategories_sig = array(array($xmlrpcString,
502 $xmlrpcString, $xmlrpcString));
503
ef393de7
AD
504 $getVirtualFeeds_sig = array(array($xmlrpcInt, $xmlrpcString,
505 $xmlrpcString));
506
956c7629
AD
507 $s = new xmlrpc_server(
508 array(
ef393de7
AD
509 "rss.getVirtualFeeds" => array("function" => "getVirtualFeeds",
510 "signature" => $getVirtualFeeds_sig),
bd907fe2
AD
511 "rss.getCategories" => array("function" => "getCategories",
512 "signature" => $getCategories_sig),
9e62a175
AD
513 "rss.getTotalUnread" => array("function" => "getTotalUnread",
514 "signature" => $getTotalUnread_sig),
a3c0ae7c
AD
515 "rss.getVersion" => array("function" => "getVersion",
516 "signature" => $getVersion_sig),
68d3cf5a
AD
517 "rss.setArticleRead" => array("function" => "setArticleRead",
518 "signature" => $setArticleRead_sig),
519 "rss.setArticleMarked" => array("function" => "setArticleMarked",
520 "signature" => $setArticleMarked_sig),
521 "rss.getArticle" => array("function" => "getArticle",
522 "signature" => $getArticle_sig),
523 "rss.getFeedHeadlines" => array("function" => "getFeedHeadlines",
524 "signature" => $getFeedHeadlines_sig),
7fb32341
AD
525 "rss.getSubscribedFeeds" => array("function" => "getSubscribedFeeds",
526 "signature" => $getSubscribedFeeds_sig),
956c7629 527 "rss.subscribeToFeed" => array("function" => "subscribeToFeed",
e359d44b 528 "signature" => $subscribeToFeed_sig)), 0
956c7629 529 );
e359d44b
AD
530 $s->response_charset_encoding = "UTF-8";
531 $s->service();
956c7629 532?>