]> git.wh0rd.org Git - tt-rss.git/blob - opml.php
implement filter import
[tt-rss.git] / opml.php
1 <?php
2         set_include_path(get_include_path() . PATH_SEPARATOR .
3                 dirname(__FILE__) . "/include");
4
5         require_once "functions.php";
6         require_once "sessions.php";
7         require_once "sanity_check.php";
8         require_once "config.php";
9         require_once "db.php";
10         require_once "db-prefs.php";
11
12         $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
13
14         if (!init_connection($link)) return;
15
16         function opml_import_domdoc($link, $owner_uid) {
17
18                 if (is_file($_FILES['opml_file']['tmp_name'])) {
19                         $doc = DOMDocument::load($_FILES['opml_file']['tmp_name']);
20
21                         $result = db_query($link, "SELECT id FROM
22                                 ttrss_feed_categories WHERE title = 'Imported feeds' AND
23                                 owner_uid = '$owner_uid' LIMIT 1");
24
25                         if (db_num_rows($result) == 1) {
26                                 $default_cat_id = db_fetch_result($result, 0, "id");
27                         } else {
28                                 $default_cat_id = 0;
29                         }
30
31                         if ($doc) {
32                                 $body = $doc->getElementsByTagName('body');
33
34                                 $xpath = new DOMXpath($doc);
35                                 $query = "/opml/body//outline";
36
37                                 $outlines = $xpath->query($query);
38
39                                 foreach ($outlines as $outline) {
40
41                                         $attributes = $outline->attributes;
42
43                                         $feed_title = db_escape_string($attributes->getNamedItem('text')->nodeValue);
44                                         if (!$feed_title) $feed_title = db_escape_string($attributes->getNamedItem('title')->nodeValue);
45
46                                         $cat_title = db_escape_string($attributes->getNamedItem('title')->nodeValue);
47                                         if (!$cat_title) $cat_title = db_escape_string($attributes->getNamedItem('text')->nodeValue);
48
49                                         $feed_url = db_escape_string($attributes->getNamedItem('xmlUrl')->nodeValue);
50                                         if (!$feed_url) $feed_url = db_escape_string($attributes->getNamedItem('xmlURL')->nodeValue);
51
52                                         $site_url = db_escape_string($attributes->getNamedItem('htmlUrl')->nodeValue);
53
54                                         $pref_name = db_escape_string($attributes->getNamedItem('pref-name')->nodeValue);
55                                         $label_name = db_escape_string($attributes->getNamedItem('label-name')->nodeValue);
56                                         $filter_name = db_escape_string($attributes->getNamedItem('filter-name')->nodeValue);
57
58                                         if ($cat_title && !$feed_url) {
59
60                                                 if ($cat_title != "tt-rss-prefs" && $cat_title != 'tt-rss-labels' && $cat_title != 'tt-rss-filters') {
61
62                                                         db_query($link, "BEGIN");
63
64                                                         $result = db_query($link, "SELECT id FROM
65                                                                         ttrss_feed_categories WHERE title = '$cat_title' AND
66                                                                         owner_uid = '$owner_uid' LIMIT 1");
67
68                                                         if (db_num_rows($result) == 0) {
69
70                                                                 printf(__("<li>Adding category <b>%s</b>.</li>"), $cat_title);
71
72                                                                 db_query($link, "INSERT INTO ttrss_feed_categories
73                                                                                 (title,owner_uid)
74                                                                                 VALUES ('$cat_title', '$owner_uid')");
75                                                         }
76
77                                                         db_query($link, "COMMIT");
78                                                 }
79                                         }
80
81                                         //                                              print "$active_category : $feed_title : $feed_url<br>";
82
83                                         if ($pref_name) {
84                                                 $parent_node = $outline->parentNode;
85
86                                                 if ($parent_node && $parent_node->nodeName == "outline") {
87                                                         $cat_check = $parent_node->attributes->getNamedItem('title')->nodeValue;
88                                                         if ($cat_check == "tt-rss-prefs") {
89                                                                 $pref_value = db_escape_string($outline->attributes->getNamedItem('value')->nodeValue);
90
91                                                                 printf("<li>".
92                                                                         __("Setting preference key %s to %s")."</li>",
93                                                                                 $pref_name, $pref_value);
94
95                                                                 set_pref($link, $pref_name, $pref_value);
96
97                                                         }
98                                                 }
99                                         }
100
101                                         if ($label_name) {
102                                                 $parent_node = $outline->parentNode;
103
104                                                 if ($parent_node && $parent_node->nodeName == "outline") {
105                                                         $cat_check = $parent_node->attributes->getNamedItem('title')->nodeValue;
106                                                         if ($cat_check == "tt-rss-labels") {
107
108                                                                 $fg_color = db_escape_string($attributes->getNamedItem('label-fg-color')->nodeValue);
109                                                                 $bg_color = db_escape_string($attributes->getNamedItem('label-bg-color')->nodeValue);
110
111                                                                 if (!label_find_id($link, $label_name, $_SESSION['uid'])) {
112                                                                         printf("<li>".__("Adding label %s")."</li>", htmlspecialchars($label_name));
113                                                                         label_create($link, $label_name, $fg_color, $bg_color);
114                                                                 } else {
115                                                                         printf("<li>".__("Duplicate label: %s")."</li>",
116                                                                                 htmlspecialchars($label_name));
117                                                                 }
118                                                         }
119                                                 }
120                                         }
121
122                                         if ($filter_name) {
123                                                 $parent_node = $outline->parentNode;
124
125                                                 if ($parent_node && $parent_node->nodeName == "outline") {
126                                                         $cat_check = $parent_node->attributes->getNamedItem('title')->nodeValue;
127                                                         if ($cat_check == "tt-rss-filters") {
128                                                                 $filter = json_decode($outline->nodeValue, true);
129
130                                                                 if ($filter) {
131                                                                         $reg_exp = db_escape_string($filter['reg_exp']);
132                                                                         $filter_type = (int)$filter['filter_type'];
133                                                                         $action_id = (int)$filter['action_id'];
134
135                                                                         $result = db_query($link, "SELECT id FROM ttrss_filters WHERE
136                                                                                 reg_exp = '$reg_exp' AND
137                                                                                 filter_type = '$filter_type' AND
138                                                                                 action_id = '$action_id' AND
139                                                                                 owner_uid = " .$_SESSION['uid']);
140
141                                                                         if (db_num_rows($result) == 0) {
142                                                                                 $enabled = bool_to_sql_bool($filter['enabled']);
143                                                                                 $action_param = db_escape_string($filter['action_param']);
144                                                                                 $inverse = bool_to_sql_bool($filter['inverse']);
145                                                                                 $filter_param = db_escape_string($filter['filter_param']);
146                                                                                 $cat_filter = bool_to_sql_bool($filter['cat_filter']);
147
148                                                                                 $feed_url = db_escape_string($filter['feed_url']);
149                                                                                 $cat_title = db_escape_string($filter['cat_title']);
150
151                                                                                 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
152                                                                                         feed_url = '$feed_url' AND owner_uid = ".$_SESSION['uid']);
153
154                                                                                 if (db_num_rows($result) != 0) {
155                                                                                         $feed_id = db_fetch_result($result, 0, "id");
156                                                                                 } else {
157                                                                                         $feed_id = "NULL";
158                                                                                 }
159
160                                                                                 $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE
161                                                                                         title = '$cat_title' AND  owner_uid = ".$_SESSION['uid']);
162
163                                                                                 if (db_num_rows($result) != 0) {
164                                                                                         $cat_id = db_fetch_result($result, 0, "id");
165                                                                                 } else {
166                                                                                         $cat_id = "NULL";
167                                                                                 }
168
169                                                                                 printf("<li>".__("Adding filter %s")."</li>", htmlspecialchars($reg_exp));
170
171                                                                                 $query = "INSERT INTO ttrss_filters (filter_type, action_id,
172                                                                                                 enabled, inverse, action_param, filter_param,
173                                                                                                 cat_filter, feed_id,
174                                                                                                 cat_id, reg_exp,
175                                                                                                 owner_uid)
176                                                                                         VALUES ($filter_type, $action_id,
177                                                                                                 $enabled, $inverse, '$action_param', '$filter_param',
178                                                                                                 $cat_filter, $feed_id,
179                                                                                                 $cat_id, '$reg_exp', ".
180                                                                                                 $_SESSION['uid'].")";
181
182                                                                                 db_query($link, $query);
183
184                                                                         } else {
185                                                                                 printf("<li>".__("Duplicate filter %s")."</li>", htmlspecialchars($reg_exp));
186
187                                                                         }
188                                                                 }
189                                                         }
190                                                 }
191                                         }
192
193                                         if (!$feed_title || !$feed_url) continue;
194
195                                         db_query($link, "BEGIN");
196
197                                         $cat_id = null;
198
199                                         $parent_node = $outline->parentNode;
200
201                                         if ($parent_node && $parent_node->nodeName == "outline") {
202                                                 $element_category = $parent_node->attributes->getNamedItem('title')->nodeValue;
203                                                 if (!$element_category) $element_category = $parent_node->attributes->getNamedItem('text')->nodeValue;
204
205                                         } else {
206                                                 $element_category = '';
207                                         }
208
209                                         if ($element_category) {
210
211                                                 $element_category = db_escape_string($element_category);
212
213                                                 $result = db_query($link, "SELECT id FROM
214                                                                 ttrss_feed_categories WHERE title = '$element_category' AND
215                                                                 owner_uid = '$owner_uid' LIMIT 1");
216
217                                                         if (db_num_rows($result) == 1) {
218                                                                 $cat_id = db_fetch_result($result, 0, "id");
219                                                         }
220                                         }
221
222                                         $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
223                                                         feed_url = '$feed_url'
224                                                         AND owner_uid = '$owner_uid'");
225
226                                         print "<li><a target='_blank' href='$site_url'><b>$feed_title</b></a></b>
227                                                 (<a target='_blank' href=\"$feed_url\">rss</a>)&nbsp;";
228
229                                         if (db_num_rows($result) > 0) {
230                                                 print __('is already imported.');
231                                         } else {
232
233                                                 if ($cat_id) {
234                                                         $add_query = "INSERT INTO ttrss_feeds
235                                                                 (title, feed_url, owner_uid, cat_id, site_url) VALUES
236                                                                 ('$feed_title', '$feed_url', '$owner_uid',
237                                                                  '$cat_id', '$site_url')";
238
239                                                 } else {
240                                                         $add_query = "INSERT INTO ttrss_feeds
241                                                                 (title, feed_url, owner_uid, cat_id, site_url) VALUES
242                                                                 ('$feed_title', '$feed_url', '$owner_uid', '$default_cat_id',
243                                                                         '$site_url')";
244
245                                                 }
246
247                                                 //print $add_query;
248                                                 db_query($link, $add_query);
249
250                                                 print __('OK');
251                                         }
252
253                                         print "</li>";
254
255                                         db_query($link, "COMMIT");
256                                 }
257
258                         } else {
259                                 print_error(__('Error while parsing document.'));
260                         }
261
262                 } else {
263                         print_error(__('Error: please upload OPML file.'));
264                 }
265
266
267         }
268
269         function opml_export($link, $name, $owner_uid, $hide_private_feeds=false, $include_settings=true) {
270                 if (!$_REQUEST["debug"]) {
271                         header("Content-type: application/xml+opml");
272                         header("Content-Disposition: attachment; filename=" . $name );
273                 } else {
274                         header("Content-type: text/xml");
275                 }
276
277                 print "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
278
279                 print "<opml version=\"1.0\">";
280                 print "<head>
281                         <dateCreated>" . date("r", time()) . "</dateCreated>
282                         <title>Tiny Tiny RSS Feed Export</title>
283                 </head>";
284                 print "<body>";
285
286                 $cat_mode = false;
287
288                 $select = "SELECT * ";
289                 $where = "WHERE owner_uid = '$owner_uid'";
290                 $orderby = "ORDER BY title";
291                 if ($hide_private_feeds){
292                         $where = "WHERE owner_uid = '$owner_uid' AND private IS false AND
293                                 auth_login = '' AND auth_pass = ''";
294                 }
295
296
297
298                 if (get_pref($link, 'ENABLE_FEED_CATS', $owner_uid) == true) {
299                         $cat_mode = true;
300                         $select = "SELECT
301                                 title, feed_url, site_url,
302                                 (SELECT title FROM ttrss_feed_categories WHERE id = cat_id) as cat_title";
303                         $orderby = "ORDER BY cat_title, title";
304
305                 }
306                 else{
307                         $cat_feed = get_pref($link, 'ENABLE_FEED_CATS');
308                         print "<!-- feeding cats is not enabled -->";
309                         print "<!-- $cat_feed -->";
310
311                 }
312
313
314                 $result = db_query($link, $select." FROM ttrss_feeds ".$where." ".$orderby);
315
316                 $old_cat_title = "";
317
318                 while ($line = db_fetch_assoc($result)) {
319                         $title = htmlspecialchars($line["title"]);
320                         $url = htmlspecialchars($line["feed_url"]);
321                         $site_url = htmlspecialchars($line["site_url"]);
322
323                         if ($cat_mode) {
324                                 $cat_title = htmlspecialchars($line["cat_title"]);
325
326                                 if ($old_cat_title != $cat_title) {
327                                         if ($old_cat_title) {
328                                                 print "</outline>\n";
329                                         }
330
331                                         if ($cat_title) {
332                                                 print "<outline title=\"$cat_title\" text=\"$cat_title\" >\n";
333                                         }
334
335                                         $old_cat_title = $cat_title;
336                                 }
337                         }
338
339                         if ($site_url) {
340                                 $html_url_qpart = "htmlUrl=\"$site_url\"";
341                         } else {
342                                 $html_url_qpart = "";
343                         }
344
345                         print "<outline text=\"$title\" xmlUrl=\"$url\" $html_url_qpart/>\n";
346                 }
347
348                 if ($cat_mode && $old_cat_title) {
349                         print "</outline>\n";
350                 }
351
352                 # export tt-rss settings
353
354                 if ($include_settings) {
355                         print "<outline title=\"tt-rss-prefs\" schema-version=\"".SCHEMA_VERSION."\">";
356
357                         $result = db_query($link, "SELECT pref_name, value FROM ttrss_user_prefs WHERE
358                            profile IS NULL AND owner_uid = " . $_SESSION["uid"]);
359
360                         while ($line = db_fetch_assoc($result)) {
361
362                                 $name = $line["pref_name"];
363                                 $value = htmlspecialchars($line["value"]);
364
365                                 print "<outline pref-name=\"$name\" value=\"$value\">";
366
367                                 print "</outline>";
368
369                         }
370
371                         print "</outline>";
372
373                         print "<outline title=\"tt-rss-labels\" schema-version=\"".SCHEMA_VERSION."\">";
374
375                         $result = db_query($link, "SELECT * FROM ttrss_labels2 WHERE
376                                 owner_uid = " . $_SESSION['uid']);
377
378                         while ($line = db_fetch_assoc($result)) {
379                                 $name = htmlspecialchars($line['caption']);
380                                 $fg_color = htmlspecialchars($line['fg_color']);
381                                 $bg_color = htmlspecialchars($line['bg_color']);
382
383                                 print "<outline label-name=\"$name\" label-fg-color=\"$fg_color\" label-bg-color=\"$bg_color\"/>";
384
385                         }
386
387                         print "</outline>";
388
389                         print "<outline title=\"tt-rss-filters\" schema-version=\"".SCHEMA_VERSION."\">";
390
391                         $result = db_query($link, "SELECT filter_type,
392                                         reg_exp,
393                                         action_id,
394                                         enabled,
395                                         action_param,
396                                         inverse,
397                                         filter_param,
398                                         cat_filter,
399                                         ttrss_feeds.feed_url AS feed_url,
400                                         ttrss_feed_categories.title AS cat_title
401                                         FROM ttrss_filters
402                                                 LEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)
403                                                 LEFT JOIN ttrss_feed_categories ON (ttrss_filters.cat_id = ttrss_feed_categories.id)
404                                         WHERE
405                                                 ttrss_filters.owner_uid = " . $_SESSION['uid']);
406
407                         while ($line = db_fetch_assoc($result)) {
408                                 $name = htmlspecialchars($line['reg_exp']);
409
410                                 foreach (array('enabled', 'inverse', 'cat_filter') as $b) {
411                                         $line[$b] = sql_bool_to_bool($line[$b]);
412                                 }
413
414                                 $filter = json_encode($line);
415
416                                 print "<outline filter-name=\"$name\">$filter</outline>";
417
418                         }
419
420
421                         print "</outline>";
422                 }
423
424                 print "</body></opml>";
425         }
426
427         // FIXME there are some brackets issues here
428
429         $op = $_REQUEST["op"];
430     if (!$op) $op = "Export";
431
432     $output_name = $_REQUEST["filename"];
433         if (!$output_name) $output_name = "TinyTinyRSS.opml";
434
435     $show_settings = $_REQUEST["settings"];
436
437         if ($op == "Export") {
438
439                 login_sequence($link);
440                 $owner_uid = $_SESSION["uid"];
441                 return opml_export($link, $output_name, $owner_uid, false, ($show_settings == 1));
442         }
443
444         if ($op == "publish"){
445                 $key = db_escape_string($_REQUEST["key"]);
446
447                 $result = db_query($link, "SELECT owner_uid
448                                 FROM ttrss_access_keys WHERE
449                                 access_key = '$key' AND feed_id = 'OPML:Publish'");
450
451                 if (db_num_rows($result) == 1) {
452                         $owner_uid = db_fetch_result($result, 0, "owner_uid");
453                         return opml_export($link, "", $owner_uid, true, false);
454                 } else {
455                         print "<error>User not found</error>";
456                 }
457         }
458
459         if ($op == "Import") {
460
461                 login_sequence($link);
462                 $owner_uid = $_SESSION["uid"];
463
464                 header('Content-Type: text/html; charset=utf-8');
465
466                 print "<html>
467                         <head>
468                                 <link rel=\"stylesheet\" href=\"utility.css\" type=\"text/css\">
469                                 <title>".__("OPML Utility")."</title>
470                                 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
471                         </head>
472                         <body>
473                         <div class=\"floatingLogo\"><img src=\"images/logo_wide.png\"></div>
474                         <h1>".__('OPML Utility')."</h1>";
475
476                 db_query($link, "BEGIN");
477
478                 /* create Imported feeds category just in case */
479
480                 $result = db_query($link, "SELECT id FROM
481                         ttrss_feed_categories WHERE title = 'Imported feeds' AND
482                         owner_uid = '$owner_uid' LIMIT 1");
483
484                 if (db_num_rows($result) == 0) {
485                                 db_query($link, "INSERT INTO ttrss_feed_categories
486                                         (title,owner_uid)
487                                                 VALUES ('Imported feeds', '$owner_uid')");
488                 }
489
490                 db_query($link, "COMMIT");
491
492                 print "<p>".__("Importing OPML...")."</p>";
493                 opml_import_domdoc($link, $owner_uid);
494
495                 print "<br><form method=\"GET\" action=\"prefs.php\">
496                         <input type=\"submit\" value=\"".__("Return to preferences")."\">
497                         </form>";
498
499                 print "</body></html>";
500
501         }
502
503 //      if ($link) db_close($link);
504
505 ?>