]> git.wh0rd.org - tt-rss.git/blobdiff - include/functions2.php
implement cache-busting for default theme.css
[tt-rss.git] / include / functions2.php
index ed22a0623b9564401ee54294f9eb8ecd043b370c..d06a7a71003db30a945380519373c60d3b5bf285 100644 (file)
@@ -64,8 +64,6 @@
                                "toggle_publ" => __("Toggle published"),
                                "toggle_unread" => __("Toggle unread"),
                                "edit_tags" => __("Edit tags"),
-                               "dismiss_selected" => __("Dismiss selected"),
-                               "dismiss_read" => __("Dismiss read"),
                                "open_in_new_window" => __("Open in new window"),
                                "catchup_below" => __("Mark below as read"),
                                "catchup_above" => __("Mark above as read"),
@@ -91,6 +89,7 @@
                                "feed_edit" => __("Edit feed"),
                                "feed_catchup" => __("Mark as read"),
                                "feed_reverse" => __("Reverse headlines"),
+                               "feed_toggle_vgroup" => __("Toggle headline grouping"),
                                "feed_debug_update" => __("Debug feed update"),
                                "feed_debug_viewfeed" => __("Debug viewfeed()"),
                                "catchup_all" => __("Mark all feeds as read"),
                                "*s" => "toggle_publ",
                                "u" => "toggle_unread",
                                "*t" => "edit_tags",
-                               "*d" => "dismiss_selected",
-                               "*x" => "dismiss_read",
                                "o" => "open_in_new_window",
                                "c p" => "catchup_below",
                                "c n" => "catchup_above",
                                "f e" => "feed_edit",
                                "f q" => "feed_catchup",
                                "f x" => "feed_reverse",
+                               "f g" => "feed_toggle_vgroup",
                                "f *d" => "feed_debug_update",
                                "f *g" => "feed_debug_viewfeed",
                                "f *c" => "toggle_combined_mode",
 
        function check_for_update() {
                if (defined("GIT_VERSION_TIMESTAMP")) {
-                       $content = @fetch_file_contents("http://tt-rss.org/version.json");
+                       $content = @fetch_file_contents(array("url" => "http://tt-rss.org/version.json", "timeout" => 5));
 
                        if ($content) {
                                $content = json_decode($content, true);
                return "";
        }
 
-       function make_runtime_info() {
+       function make_runtime_info($disable_update_check = false) {
                $data = array();
 
                $result = db_query("SELECT MAX(id) AS mid, COUNT(*) AS nf FROM
                $data['reload_on_ts_change'] = !defined('_NO_RELOAD_ON_TS_CHANGE');
 
 
-               if (CHECK_FOR_UPDATES && $_SESSION["last_version_check"] + 86400 + rand(-1000, 1000) < time()) {
+               if (CHECK_FOR_UPDATES && !$disable_update_check && $_SESSION["last_version_check"] + 86400 + rand(-1000, 1000) < time()) {
                        $update_result = @check_for_update();
 
                        $data["update_result"] = $update_result;
                                        $entry->setAttribute('href',
                                                rewrite_relative_url($site_url, $entry->getAttribute('href')));
 
-                                       $entry->setAttribute('rel', 'noreferrer');
+                                       $entry->setAttribute('rel', 'noopener noreferrer');
                                }
 
                                if ($entry->hasAttribute('src')) {
                        }
                }
 
-               $allowed_elements = array('a', 'address', 'audio', 'article', 'aside',
+               $allowed_elements = array('a', 'address', 'acronym', 'audio', 'article', 'aside',
                        'b', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br',
                        'caption', 'cite', 'center', 'code', 'col', 'colgroup',
-                       'data', 'dd', 'del', 'details', 'description', 'div', 'dl', 'font',
+                       'data', 'dd', 'del', 'details', 'description', 'dfn', 'div', 'dl', 'font',
                        'dt', 'em', 'footer', 'figure', 'figcaption',
                        'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'html', 'i',
                        'img', 'ins', 'kbd', 'li', 'main', 'mark', 'nav', 'noscript',
 
                $res = $doc->saveHTML();
 
-               return $res;
+               /* strip everything outside of <body>...</body> */
+
+               $res_frag = array();
+               if (preg_match('/<body>(.*)<\/body>/is', $res, $res_frag)) {
+                       return $res_frag[1];
+               } else {
+                       return $res;
+               }
        }
 
        function strip_harmful_tags($doc, $allowed_elements, $disallowed_attributes) {
                                                array_push($attrs_to_remove, $attr);
                                        }
 
+                                       if ($attr->nodeName == 'href' && stripos($attr->value, 'javascript:') === 0) {
+                                               array_push($attrs_to_remove, $attr);
+                                       }
+
                                        if (in_array($attr->nodeName, $disallowed_attributes)) {
                                                array_push($attrs_to_remove, $attr);
                                        }
                        num_comments,
                        tag_cache,
                        author,
+                       guid,
                        orig_feed_id,
                        note
                        FROM ttrss_entries,ttrss_user_entries
                                $line = $p->hook_render_article($line);
                        }
 
-                       $num_comments = $line["num_comments"];
+                       $num_comments = (int) $line["num_comments"];
                        $entry_comments = "";
 
                        if ($num_comments > 0) {
                        }
 
                        if ($zoom_mode) {
-                               $feed_title = "<a href=\"".htmlspecialchars($line["site_url"]).
-                                       "\" target=\"_blank\">".
-                                       htmlspecialchars($line["feed_title"])."</a>";
+                               $feed_title = htmlspecialchars($line["feed_title"]);
 
                                $rv['content'] .= "<div class=\"postFeedTitle\">$feed_title</div>";
 
                        $url .= '/';
                }
 
+               //convert IDNA hostname to punycode if possible
+               if (function_exists("idn_to_ascii")) {
+                       $parts = parse_url($url);
+                       if (mb_detect_encoding($parts['host']) != 'ASCII')
+                       {
+                               $parts['host'] = idn_to_ascii($parts['host']);
+                               $url = build_url($parts);
+                       }
+               }
+
                if ($url != "http:///")
                        return $url;
                else
 
                                if (!$ctype) $ctype = __("unknown type");
 
-                               $filename = substr($url, strrpos($url, "/")+1);
+                               //$filename = substr($url, strrpos($url, "/")+1);
+                               $filename = basename($url);
 
                                $player = format_inline_player($url, $ctype);
 
 
                        foreach ($entries as $entry) {
                                if ($entry["title"])
-                                       $title = "&mdash; " . truncate_string($entry["title"], 30);
+                                       $title = " &mdash; " . truncate_string($entry["title"], 30);
                                else
                                        $title = "";
 
+                               if ($entry["filename"])
+                                       $filename = truncate_middle(htmlspecialchars($entry["filename"]), 60);
+                               else
+                                       $filename = "";
+
                                $rv .= "<div onclick='window.open(\"".htmlspecialchars($entry["url"])."\")'
-                                       dojoType=\"dijit.MenuItem\">".htmlspecialchars($entry["filename"])."$title</div>";
+                                       dojoType=\"dijit.MenuItem\">".$filename . $title."</div>";
 
                        };
 
         * @return string Absolute URL
         */
        function rewrite_relative_url($url, $rel_url) {
-               if (strpos($rel_url, ":") !== false) {
-                       return $rel_url;
-               } else if (strpos($rel_url, "://") !== false) {
+               if (strpos($rel_url, "://") !== false) {
                        return $rel_url;
                } else if (strpos($rel_url, "//") === 0) {
                        # protocol-relative URL (rare but they exist)
                        return $rel_url;
-               } else if (strpos($rel_url, "/") === 0)
-               {
+               } else if (preg_match("/^[a-z]+:/i", $rel_url)) {
+                       # magnet:, feed:, etc
+                       return $rel_url;
+               } else if (strpos($rel_url, "/") === 0) {
                        $parts = parse_url($url);
                        $parts['path'] = $rel_url;
 
        }
 
        function theme_valid($theme) {
-               if ($theme == "default.css" || $theme == "night.css") return true; // needed for array_filter
+               if ($theme == "default.php" || $theme == "night.css") return true; // needed for array_filter
                $file = "themes/" . basename($theme);
 
                if (!file_exists($file)) $file = "themes.local/" . basename($theme);
 
                return $tmp;
        }
+
+       function get_upload_error_message($code) {
+
+               $errors = array(
+                       0 => __('There is no error, the file uploaded with success'),
+                       1 => __('The uploaded file exceeds the upload_max_filesize directive in php.ini'),
+                       2 => __('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'),
+                       3 => __('The uploaded file was only partially uploaded'),
+                       4 => __('No file was uploaded'),
+                       6 => __('Missing a temporary folder'),
+                       7 => __('Failed to write file to disk.'),
+                       8 => __('A PHP extension stopped the file upload.'),
+               );
+
+               return $errors[$code];
+       }
 ?>