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