]> git.wh0rd.org - tt-rss.git/blobdiff - classes/opml.php
implement upload-related support for open_basedir
[tt-rss.git] / classes / opml.php
index 815ae883b9f6b7665a27ba0d32203a08099d2199..2ecae42379ca5de4a7ad5a105fda8ecaf5d29f83 100644 (file)
@@ -29,8 +29,8 @@ class Opml extends Handler_Protected {
                                <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
                        </head>
                        <body>
-                       <div class=\"floatingLogo\"><img src=\"images/logo_wide.png\"></div>
-                       <h1>".__('OPML Utility')."</h1>";
+                       <div class=\"floatingLogo\"><img src=\"images/logo_small.png\"></div>
+                       <h1>".__('OPML Utility')."</h1><div class='content'>";
 
                add_feed_category($this->link, "Imported feeds");
 
@@ -41,7 +41,7 @@ class Opml extends Handler_Protected {
                        <input type=\"submit\" value=\"".__("Return to preferences")."\">
                        </form>";
 
-               print "</body></html>";
+               print "</div></body></html>";
 
 
        }
@@ -68,10 +68,10 @@ class Opml extends Handler_Protected {
                if ($cat_id) {
                        $result = db_query($this->link, "SELECT title FROM ttrss_feed_categories WHERE id = '$cat_id'
                                AND owner_uid = '$owner_uid'");
-                       $cat_title = db_fetch_result($result, 0, "title");
+                       $cat_title = htmlspecialchars(db_fetch_result($result, 0, "title"));
                }
 
-               if ($cat_title) $out .= "<outline title=\"$cat_title\">\n";
+               if ($cat_title) $out .= "<outline text=\"$cat_title\">\n";
 
                $result = db_query($this->link, "SELECT id,title
                        FROM ttrss_feed_categories WHERE
@@ -129,7 +129,7 @@ class Opml extends Handler_Protected {
                # export tt-rss settings
 
                if ($include_settings) {
-                       $out .= "<outline title=\"tt-rss-prefs\" schema-version=\"".SCHEMA_VERSION."\">";
+                       $out .= "<outline text=\"tt-rss-prefs\" schema-version=\"".SCHEMA_VERSION."\">";
 
                        $result = db_query($this->link, "SELECT pref_name, value FROM ttrss_user_prefs WHERE
                           profile IS NULL AND owner_uid = " . $_SESSION["uid"] . " ORDER BY pref_name");
@@ -143,7 +143,7 @@ class Opml extends Handler_Protected {
 
                        $out .= "</outline>";
 
-                       $out .= "<outline title=\"tt-rss-labels\" schema-version=\"".SCHEMA_VERSION."\">";
+                       $out .= "<outline text=\"tt-rss-labels\" schema-version=\"".SCHEMA_VERSION."\">";
 
                        $result = db_query($this->link, "SELECT * FROM ttrss_labels2 WHERE
                                owner_uid = " . $_SESSION['uid']);
@@ -159,7 +159,7 @@ class Opml extends Handler_Protected {
 
                        $out .= "</outline>";
 
-                       $out .= "<outline title=\"tt-rss-filters\" schema-version=\"".SCHEMA_VERSION."\">";
+                       $out .= "<outline text=\"tt-rss-filters\" schema-version=\"".SCHEMA_VERSION."\">";
 
                        $result = db_query($this->link, "SELECT * FROM ttrss_filters2
                                WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY id");
@@ -211,7 +211,7 @@ class Opml extends Handler_Protected {
                                unset($line["owner_uid"]);
                                $filter = json_encode($line);
 
-                               $out .= "<outline filter-type=\"2\">$filter</outline>";
+                               $out .= "<outline filter-type=\"2\"><![CDATA[$filter]]></outline>";
 
                        }
 
@@ -238,12 +238,12 @@ class Opml extends Handler_Protected {
 
                $res = $doc->saveXML();
 
-               // saveXML uses a two-space indent.  Change to tabs.
+/*             // saveXML uses a two-space indent.  Change to tabs.
                $res = preg_replace_callback('/^(?:  )+/mu',
                        create_function(
                                '$matches',
                                'return str_repeat("\t", intval(strlen($matches[0])/2));'),
-                       $res);
+                       $res); */
 
                print $res;
        }
@@ -253,13 +253,13 @@ class Opml extends Handler_Protected {
        private function opml_import_feed($doc, $node, $cat_id, $owner_uid) {
                $attrs = $node->attributes;
 
-               $feed_title = db_escape_string($attrs->getNamedItem('text')->nodeValue);
-               if (!$feed_title) $feed_title = db_escape_string($attrs->getNamedItem('title')->nodeValue);
+               $feed_title = db_escape_string($this->link, mb_substr($attrs->getNamedItem('text')->nodeValue, 0, 250));
+               if (!$feed_title) $feed_title = db_escape_string($this->link, mb_substr($attrs->getNamedItem('title')->nodeValue, 0, 250));
 
-               $feed_url = db_escape_string($attrs->getNamedItem('xmlUrl')->nodeValue);
-               if (!$feed_url) $feed_url = db_escape_string($attrs->getNamedItem('xmlURL')->nodeValue);
+               $feed_url = db_escape_string($this->link, mb_substr($attrs->getNamedItem('xmlUrl')->nodeValue, 0, 250));
+               if (!$feed_url) $feed_url = db_escape_string($this->link, mb_substr($attrs->getNamedItem('xmlURL')->nodeValue, 0, 250));
 
-               $site_url = db_escape_string($attrs->getNamedItem('htmlUrl')->nodeValue);
+               $site_url = db_escape_string($this->link, mb_substr($attrs->getNamedItem('htmlUrl')->nodeValue, 0, 250));
 
                if ($feed_url && $feed_title) {
                        $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
@@ -269,10 +269,12 @@ class Opml extends Handler_Protected {
                                #$this->opml_notice("[FEED] [$feed_title/$feed_url] dst_CAT=$cat_id");
                                $this->opml_notice(T_sprintf("Adding feed: %s", $feed_title));
 
+                               if (!$cat_id) $cat_id = 'NULL';
+
                                $query = "INSERT INTO ttrss_feeds
                                        (title, feed_url, owner_uid, cat_id, site_url, order_id) VALUES
                                        ('$feed_title', '$feed_url', '$owner_uid',
-                                       '$cat_id', '$site_url', 0)";
+                                       $cat_id, '$site_url', 0)";
                                db_query($this->link, $query);
 
                        } else {
@@ -283,15 +285,15 @@ class Opml extends Handler_Protected {
 
        private function opml_import_label($doc, $node, $owner_uid) {
                $attrs = $node->attributes;
-               $label_name = db_escape_string($attrs->getNamedItem('label-name')->nodeValue);
+               $label_name = db_escape_string($this->link, $attrs->getNamedItem('label-name')->nodeValue);
 
                if ($label_name) {
-                       $fg_color = db_escape_string($attrs->getNamedItem('label-fg-color')->nodeValue);
-                       $bg_color = db_escape_string($attrs->getNamedItem('label-bg-color')->nodeValue);
+                       $fg_color = db_escape_string($this->link, $attrs->getNamedItem('label-fg-color')->nodeValue);
+                       $bg_color = db_escape_string($this->link, $attrs->getNamedItem('label-bg-color')->nodeValue);
 
                        if (!label_find_id($this->link, $label_name, $_SESSION['uid'])) {
                                $this->opml_notice(T_sprintf("Adding label %s", htmlspecialchars($label_name)));
-                               label_create($this->link, $label_name, $fg_color, $bg_color);
+                               label_create($this->link, $label_name, $fg_color, $bg_color, $owner_uid);
                        } else {
                                $this->opml_notice(T_sprintf("Duplicate label: %s", htmlspecialchars($label_name)));
                        }
@@ -300,10 +302,10 @@ class Opml extends Handler_Protected {
 
        private function opml_import_preference($doc, $node, $owner_uid) {
                $attrs = $node->attributes;
-               $pref_name = db_escape_string($attrs->getNamedItem('pref-name')->nodeValue);
+               $pref_name = db_escape_string($this->link, $attrs->getNamedItem('pref-name')->nodeValue);
 
                if ($pref_name) {
-                       $pref_value = db_escape_string($attrs->getNamedItem('value')->nodeValue);
+                       $pref_value = db_escape_string($this->link, $attrs->getNamedItem('value')->nodeValue);
 
                        $this->opml_notice(T_sprintf("Setting preference key %s to %s",
                                $pref_name, $pref_value));
@@ -312,75 +314,71 @@ class Opml extends Handler_Protected {
                }
        }
 
-       /* private function opml_import_filter($doc, $node, $owner_uid) {
+       private function opml_import_filter($doc, $node, $owner_uid) {
                $attrs = $node->attributes;
 
-               $filter_name = db_escape_string($attrs->getNamedItem('filter-name')->nodeValue);
-
-               if ($filter_name) {
+               $filter_type = db_escape_string($this->link, $attrs->getNamedItem('filter-type')->nodeValue);
 
-               $filter = json_decode($node->nodeValue, true);
+               if ($filter_type == '2') {
+                       $filter = json_decode($node->nodeValue, true);
 
                        if ($filter) {
-                               $reg_exp = db_escape_string($filter['reg_exp']);
-                               $filter_type = (int)$filter['filter_type'];
-                               $action_id = (int)$filter['action_id'];
-
-                               $result = db_query($this->link, "SELECT id FROM ttrss_filters WHERE
-                                       reg_exp = '$reg_exp' AND
-                                       filter_type = '$filter_type' AND
-                                       action_id = '$action_id' AND
-                                       owner_uid = " .$_SESSION['uid']);
-
-                               if (db_num_rows($result) == 0) {
-                                       $enabled = bool_to_sql_bool($filter['enabled']);
-                                       $action_param = db_escape_string($filter['action_param']);
-                                       $inverse = bool_to_sql_bool($filter['inverse']);
-                                       $filter_param = db_escape_string($filter['filter_param']);
-                                       $cat_filter = bool_to_sql_bool($filter['cat_filter']);
-
-                                       $feed_url = db_escape_string($filter['feed_url']);
-                                       $cat_title = db_escape_string($filter['cat_title']);
-
-                                       $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE
-                                               feed_url = '$feed_url' AND owner_uid = $owner_uid");
-
-                                       if (db_num_rows($result) != 0) {
-                                               $feed_id = db_fetch_result($result, 0, "id");
-                                       } else {
-                                               $feed_id = "NULL";
-                                       }
+                               $match_any_rule = bool_to_sql_bool($filter["match_any_rule"]);
+                               $enabled = bool_to_sql_bool($filter["enabled"]);
 
-                                       $result = db_query($this->link, "SELECT id FROM ttrss_feed_categories WHERE
-                                               title = '$cat_title' AND  owner_uid = $owner_uid");
+                               db_query($this->link, "BEGIN");
 
-                                       if (db_num_rows($result) != 0) {
-                                               $cat_id = db_fetch_result($result, 0, "id");
-                                       } else {
+                               db_query($this->link, "INSERT INTO ttrss_filters2 (match_any_rule,enabled,owner_uid)
+                                       VALUES ($match_any_rule, $enabled,".$_SESSION["uid"].")");
+
+                               $result = db_query($this->link, "SELECT MAX(id) AS id FROM ttrss_filters2 WHERE
+                                       owner_uid = ".$_SESSION["uid"]);
+                               $filter_id = db_fetch_result($result, 0, "id");
+
+                               if ($filter_id) {
+                                       $this->opml_notice(T_sprintf("Adding filter..."));
+
+                                       foreach ($filter["rules"] as $rule) {
+                                               $feed_id = "NULL";
                                                $cat_id = "NULL";
-                                       }
 
-                                       $this->opml_notice(T_sprintf("Adding filter %s", htmlspecialchars($reg_exp)));
+                                               if (!$rule["cat_filter"]) {
+                                                       $tmp_result = db_query($this->link, "SELECT id FROM ttrss_feeds
+                                                               WHERE title = '".db_escape_string($this->link, $rule["feed"])."' AND owner_uid = ".$_SESSION["uid"]);
+                                                       if (db_num_rows($tmp_result) > 0) {
+                                                               $feed_id = db_fetch_result($tmp_result, 0, "id");
+                                                       }
+                                               } else {
+                                                       $tmp_result = db_query($this->link, "SELECT id FROM ttrss_feed_categories
+                                                               WHERE title = '".db_escape_string($this->link, $rule["feed"])."' AND owner_uid = ".$_SESSION["uid"]);
+
+                                                       if (db_num_rows($tmp_result) > 0) {
+                                                               $cat_id = db_fetch_result($tmp_result, 0, "id");
+                                                       }
+                                               }
+
+                                               $cat_filter = bool_to_sql_bool($rule["cat_filter"]);
+                                               $reg_exp = db_escape_string($this->link, $rule["reg_exp"]);
+                                               $filter_type = (int)$rule["filter_type"];
+
+                                               db_query($this->link, "INSERT INTO ttrss_filters2_rules (feed_id,cat_id,filter_id,filter_type,reg_exp,cat_filter)
+                                                       VALUES ($feed_id, $cat_id, $filter_id, $filter_type, '$reg_exp', $cat_filter)");
+                                       }
 
-                                       $query = "INSERT INTO ttrss_filters (filter_type, action_id,
-                                                       enabled, inverse, action_param, filter_param,
-                                                       cat_filter, feed_id,
-                                                       cat_id, reg_exp,
-                                                       owner_uid)
-                                               VALUES ($filter_type, $action_id,
-                                                       $enabled, $inverse, '$action_param', '$filter_param',
-                                                       $cat_filter, $feed_id,
-                                                       $cat_id, '$reg_exp', ".
-                                                       $_SESSION['uid'].")";
+                                       foreach ($filter["actions"] as $action) {
 
-                                       db_query($this->link, $query);
+                                               $action_id = (int)$action["action_id"];
+                                               $action_param = db_escape_string($this->link, $action["action_param"]);
 
-                               } else {
-                                       $this->opml_notice(T_sprintf("Duplicate filter %s", htmlspecialchars($reg_exp)));
+                                               db_query($this->link, "INSERT INTO ttrss_filters2_actions (filter_id,action_id,action_param)
+                                                       VALUES ($filter_id, $action_id, '$action_param')");
+                                       }
                                }
+
+                               db_query($this->link, "COMMIT");
                        }
                }
-       } */
+       }
 
        private function opml_import_category($doc, $root_node, $owner_uid, $parent_id) {
                $body = $doc->getElementsByTagName('body');
@@ -388,7 +386,10 @@ class Opml extends Handler_Protected {
                $default_cat_id = (int) get_feed_category($this->link, 'Imported feeds', false);
 
                if ($root_node) {
-                       $cat_title = db_escape_string($root_node->attributes->getNamedItem('title')->nodeValue);
+                       $cat_title = db_escape_string($this->link, mb_substr($root_node->attributes->getNamedItem('text')->nodeValue, 0, 250));
+
+                       if (!$cat_title)
+                               $cat_title = db_escape_string($this->link, mb_substr($root_node->attributes->getNamedItem('title')->nodeValue, 0, 250));
 
                        if (!in_array($cat_title, array("tt-rss-filters", "tt-rss-labels", "tt-rss-prefs"))) {
                                $cat_id = get_feed_category($this->link, $cat_title, $parent_id);
@@ -417,8 +418,12 @@ class Opml extends Handler_Protected {
                foreach ($outlines as $node) {
                        if ($node->hasAttributes() && strtolower($node->tagName) == "outline") {
                                $attrs = $node->attributes;
-                               $node_cat_title = db_escape_string($attrs->getNamedItem('title')->nodeValue);
-                               $node_feed_url = db_escape_string($attrs->getNamedItem('xmlUrl')->nodeValue);
+                               $node_cat_title = db_escape_string($this->link, $attrs->getNamedItem('text')->nodeValue);
+
+                               if (!$node_cat_title)
+                                       $node_cat_title = db_escape_string($this->link, $attrs->getNamedItem('title')->nodeValue);
+
+                               $node_feed_url = db_escape_string($this->link, $attrs->getNamedItem('xmlUrl')->nodeValue);
 
                                if ($node_cat_title && !$node_feed_url) {
                                        $this->opml_import_category($doc, $node, $owner_uid, $cat_id);
@@ -438,7 +443,7 @@ class Opml extends Handler_Protected {
                                                $this->opml_import_label($doc, $node, $owner_uid);
                                                break;
                                        case "tt-rss-filters":
-                                               //$this->opml_import_filter($doc, $node, $owner_uid);
+                                               $this->opml_import_filter($doc, $node, $owner_uid);
                                                break;
                                        default:
                                                $this->opml_import_feed($doc, $node, $dst_cat_id, $owner_uid);
@@ -454,15 +459,40 @@ class Opml extends Handler_Protected {
                $debug = isset($_REQUEST["debug"]);
                $doc = false;
 
-               #if ($debug) $doc = DOMDocument::load("/tmp/test.opml");
+#              if ($debug) $doc = DOMDocument::load("/tmp/test.opml");
 
-               if (is_file($_FILES['opml_file']['tmp_name'])) {
-                       $doc = DOMDocument::load($_FILES['opml_file']['tmp_name']);
-               } else if (!$doc) {
+               if ($_FILES['opml_file']['error'] != 0) {
+                       print_error(T_sprintf("Upload failed with error code %d",
+                               $_FILES['opml_file']['error']));
+                       return;
+               }
+
+               $tmp_file = false;
+
+               if (is_uploaded_file($_FILES['opml_file']['tmp_name'])) {
+                       $tmp_file = tempnam(CACHE_DIR . '/upload', 'opml');
+
+                       $result = move_uploaded_file($_FILES['opml_file']['tmp_name'],
+                               $tmp_file);
+
+                       if (!$result) {
+                               print_error(__("Unable to move uploaded file."));
+                               return;
+                       }
+               } else {
                        print_error(__('Error: please upload OPML file.'));
                        return;
                }
 
+               if (is_file($tmp_file)) {
+                       $doc = new DOMDocument();
+                       $doc->load($tmp_file);
+                       unlink($tmp_file);
+               } else if (!$doc) {
+                       print_error(__('Error: unable to find moved OPML file.'));
+                       return;
+               }
+
                if ($doc) {
                        $this->opml_import_category($doc, false, $owner_uid, false);
                } else {
@@ -474,5 +504,15 @@ class Opml extends Handler_Protected {
                print "$msg<br/>";
        }
 
+       static function opml_publish_url($link){
+
+               $url_path = get_self_url_prefix();
+               $url_path .= "/opml.php?op=publish&key=" .
+                       get_feed_access_key($link, 'OPML:Publish', false, $_SESSION["uid"]);
+
+               return $url_path;
+       }
+
+
 }
 ?>