]> git.wh0rd.org - tt-rss.git/blobdiff - include/functions.php
load stylesheets/scripts using helper functions in a few more places
[tt-rss.git] / include / functions.php
index 6bc52e9d95db0cf1969daca91118580b8f7f8b53..f8c614ac7078a608cb13b9943a17606f917124c7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
        define('EXPECTED_CONFIG_VERSION', 26);
-       define('SCHEMA_VERSION', 122);
+       define('SCHEMA_VERSION', 123);
 
        define('LABEL_BASE_INDEX', -1024);
        define('PLUGIN_FEED_BASE_INDEX', -128);
@@ -11,6 +11,7 @@
        $fetch_last_error_code = false;
        $fetch_last_content_type = false;
        $fetch_curl_used = false;
+       $suppress_debugging = false;
 
        mb_internal_encoding("UTF-8");
        date_default_timezone_set('UTC');
@@ -79,7 +80,8 @@
                                        "pt_BR" => "Portuguese/Brazil",
                                        "zh_CN" => "Simplified Chinese",
                                        "sv_SE" => "Svenska",
-                                       "fi_FI" => "Suomi");
+                                       "fi_FI" => "Suomi",
+                                       "tr_TR" => "Türkçe");
 
                return $tr;
        }
 
        $schema_version = false;
 
+       function _debug_suppress($suppress) {
+               global $suppress_debugging;
+
+               $suppress_debugging = $suppress;
+       }
+
        /**
         * Print a timestamped debug message.
         *
         * @return void
         */
        function _debug($msg, $show = true) {
+               global $suppress_debugging;
+
+               //echo "[$suppress_debugging] $msg $show\n";
+
+               if ($suppress_debugging) return false;
 
                $ts = strftime("%H:%M:%S", time());
                if (function_exists('posix_getpid')) {
                        $fp = fopen(LOGFILE, 'a+');
 
                        if ($fp) {
+                               $locked = false;
+
+                               if (function_exists("flock")) {
+                                       $tries = 0;
+
+                                       // try to lock logfile for writing
+                                       while ($tries < 5 && !$locked = flock($fp, LOCK_EX | LOCK_NB)) {
+                                               sleep(1);
+                                               ++$tries;
+                                       }
+
+                                       if (!$locked) {
+                                               fclose($fp);
+                                               return;
+                                       }
+                               }
+
                                fputs($fp, "[$ts] $msg\n");
+
+                               if (function_exists("flock")) {
+                                       flock($fp, LOCK_UN);
+                               }
+
                                fclose($fp);
                        }
                }
                        curl_setopt($ch, CURLOPT_ENCODING, "");
                        curl_setopt($ch, CURLOPT_REFERER, $url);
 
+                       if (!ini_get("safe_mode") && !ini_get("open_basedir")) {
+                               curl_setopt($ch, CURLOPT_COOKIEJAR, "/dev/null");
+                       }
+
+                       if (defined('_CURL_HTTP_PROXY')) {
+                               curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);
+                       }
+
                        if ($post_query) {
                                curl_setopt($ch, CURLOPT_POST, true);
                                curl_setopt($ch, CURLOPT_POSTFIELDS, $post_query);
                                $_SERVER["REDIRECT_SSL_CLIENT_V_END"] .
                                $_SERVER["REDIRECT_SSL_CLIENT_S_DN"]);
                }
+               if ($_SERVER["SSL_CLIENT_M_SERIAL"]) {
+                       return sha1($_SERVER["SSL_CLIENT_M_SERIAL"] .
+                               $_SERVER["SSL_CLIENT_V_START"] .
+                               $_SERVER["SSL_CLIENT_V_END"] .
+                               $_SERVER["SSL_CLIENT_S_DN"]);
+               }
                return "";
        }
 
 
                                $_SESSION["name"] = db_fetch_result($result, 0, "login");
                                $_SESSION["access_level"] = db_fetch_result($result, 0, "access_level");
-                               $_SESSION["csrf_token"] = sha1(uniqid(rand(), true));
+                               $_SESSION["csrf_token"] = uniqid(rand(), true);
 
                                db_query("UPDATE ttrss_users SET last_login = NOW() WHERE id = " .
                                        $_SESSION["uid"]);
                        $_SESSION["auth_module"] = false;
 
                        if (!$_SESSION["csrf_token"]) {
-                               $_SESSION["csrf_token"] = sha1(uniqid(rand(), true));
+                               $_SESSION["csrf_token"] = uniqid(rand(), true);
                        }
 
                        $_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"];
        }
 
        function load_user_plugins($owner_uid) {
-               if ($owner_uid) {
+               if ($owner_uid && SCHEMA_VERSION >= 100) {
                        $plugins = get_pref("_ENABLED_PLUGINS", $owner_uid);
 
                        PluginHost::getInstance()->load($plugins, PluginHost::KIND_USER, $owner_uid);
                if (SINGLE_USER_MODE) {
                        @session_start();
                        authenticate_user("admin", null);
+                       startup_gettext();
                        load_user_plugins($_SESSION["uid"]);
                } else {
                        if (!validate_session()) $_SESSION["uid"] = false;
 
                                                db_query("UPDATE ttrss_user_entries
                                                        SET unread = false,last_read = NOW() WHERE (SELECT COUNT(*)
-                                                               FROM ttrss_user_labels2 WHERE article_id = ref_id) > 0
-                                                               AND unread = true AND $date_qpart AND owner_uid = $owner_uid");
+                                                               FROM ttrss_user_labels2, ttrss_entries WHERE article_id = ref_id AND id = ref_id AND $date_qpart) > 0
+                                                               AND unread = true AND owner_uid = $owner_uid");
                                        }
 
                                } else if ($feed > 0) {
                        $intl = get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid);
 
                        if (DB_TYPE == "pgsql") {
-                               $match_part .= " AND updated > NOW() - INTERVAL '$intl hour' ";
+                               $match_part .= " AND date_entered > NOW() - INTERVAL '$intl hour' ";
                        } else {
-                               $match_part .= " AND updated > DATE_SUB(NOW(), INTERVAL $intl HOUR) ";
+                               $match_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) ";
                        }
 
                        $need_entries = true;
                                $from_where = "ttrss_entries.id = ttrss_user_entries.ref_id AND";
                        } else {
                                $from_qpart = "ttrss_user_entries";
+                               $from_where = "";
                        }
 
                        $query = "SELECT count(int_id) AS unread
 
                $owner_uid = $_SESSION["uid"];
 
-               $result = db_query("SELECT id,caption,COUNT(u1.unread) AS unread,COUNT(u2.unread) AS total
+               $result = db_query("SELECT id,caption,SUM(CASE WHEN u1.unread = true THEN 1 ELSE 0 END) AS unread, COUNT(u1.unread) AS total
                        FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
                                (ttrss_labels2.id = label_id)
-                               LEFT JOIN ttrss_user_entries AS u1 ON (u1.ref_id = article_id AND u1.unread = true
-                                       AND u1.owner_uid = $owner_uid)
-                               LEFT JOIN ttrss_user_entries AS u2 ON (u2.ref_id = article_id AND u2.unread = false
-                                       AND u2.owner_uid = $owner_uid)
+                               LEFT JOIN ttrss_user_entries AS u1 ON u1.ref_id = article_id
                                WHERE ttrss_labels2.owner_uid = $owner_uid GROUP BY ttrss_labels2.id,
                                        ttrss_labels2.caption");
 
 
                $search_query_part = "";
 
-               $keywords = explode(" ", $search);
+               $keywords = str_getcsv($search, " ");
                $query_keywords = array();
                $search_words = array();
 
                        }
 
 
-                       $content_query_part = "content, content AS content_preview, ";
+                       $content_query_part = "content, ";
 
 
                        if (is_numeric($feed)) {
 
                        if ($site_url) {
 
-                               if ($entry->hasAttribute('href'))
+                               if ($entry->hasAttribute('href')) {
                                        $entry->setAttribute('href',
                                                rewrite_relative_url($site_url, $entry->getAttribute('href')));
 
+                                       $entry->setAttribute('rel', 'noreferrer');
+                               }
+
                                if ($entry->hasAttribute('src')) {
                                        $src = rewrite_relative_url($site_url, $entry->getAttribute('src'));
 
                if (preg_match("/^[0-9]*$/", $tag)) return false;
                if (mb_strlen($tag) > 250) return false;
 
-               if (function_exists('iconv')) {
-                       $tag = iconv("utf-8", "utf-8", $tag);
-               }
-
                if (!$tag) return false;
 
                return true;
                $result = db_query("SELECT id,title,link,content,feed_id,comments,int_id,lang,
                        ".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
                        (SELECT site_url FROM ttrss_feeds WHERE id = feed_id) as site_url,
+                       (SELECT title FROM ttrss_feeds WHERE id = feed_id) as feed_title,
                        (SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) as hide_images,
                        (SELECT always_display_enclosures FROM ttrss_feeds WHERE id = feed_id) as always_display_enclosures,
                        num_comments,
                                } else {
                                        $comments_url = htmlspecialchars($line["link"]);
                                }
-                               $entry_comments = "<a target='_blank' href=\"$comments_url\">$num_comments comments</a>";
+                               $entry_comments = "<a class=\"postComments\"
+                                       target='_blank' href=\"$comments_url\">$num_comments ".
+                                       _ngettext("comment", "comments", $num_comments)."</a>";
+
                        } else {
                                if ($line["comments"] && $line["link"] != $line["comments"]) {
-                                       $entry_comments = "<a target='_blank' href=\"".htmlspecialchars($line["comments"])."\">comments</a>";
+                                       $entry_comments = "<a class=\"postComments\" target='_blank' href=\"".htmlspecialchars($line["comments"])."\">".__("comments")."</a>";
                                }
                        }
 
                                header("Content-Type: text/html");
                                $rv['content'] .= "<html><head>
                                                <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
-                                               <title>Tiny Tiny RSS - ".$line["title"]."</title>
-                                               <link rel=\"stylesheet\" type=\"text/css\" href=\"css/tt-rss.css\">
+                                               <title>Tiny Tiny RSS - ".$line["title"]."</title>".
+                                               stylesheet_tag("css/tt-rss.css").
+                                               stylesheet_tag("css/zoom.css").
+                                               stylesheet_tag("css/dijit.css")."
+
+                                               <link rel=\"shortcut icon\" type=\"image/png\" href=\"images/favicon.png\">
+                                               <link rel=\"icon\" type=\"image/png\" sizes=\"72x72\" href=\"images/favicon-72px.png\">
+
                                                <script type=\"text/javascript\">
                                                function openSelectedAttachment(elem) {
                                                        try {
                                $rv['content'] .= "<div class='postTitle'>" . $line["title"] . "$entry_author</div>";
                        }
 
-                       if ($zoom_mode)
+                       if ($zoom_mode) {
+                               $feed_title = "<a href=\"".htmlspecialchars($line["site_url"]).
+                                       "\" target=\"_blank\">".
+                                       htmlspecialchars($line["feed_title"])."</a>";
+
+                               $rv['content'] .= "<div class=\"postFeedTitle\">$feed_title</div>";
+
                                $rv['content'] .= "<div class=\"postDate\">$parsed_updated</div>";
+                       }
 
                        $tags_str = format_tags_string($line["tags"], $id);
                        $tags_str_full = join(", ", $line["tags"]);
 
                $cat_id = (int)getFeedCategory($feed_id);
 
+               if ($cat_id == 0)
+                       $null_cat_qpart = "cat_id IS NULL OR";
+               else
+                       $null_cat_qpart = "";
+
                $result = db_query("SELECT * FROM ttrss_filters2 WHERE
                        owner_uid = $owner_uid AND enabled = true ORDER BY order_id, title");
 
                                FROM ttrss_filters2_rules AS r,
                                ttrss_filter_types AS t
                                WHERE
-                                       (cat_id IS NULL OR cat_id IN ($check_cats)) AND
+                                       ($null_cat_qpart (cat_id IS NULL AND cat_filter = false) OR cat_id IN ($check_cats)) AND
                                        (feed_id IS NULL OR feed_id = '$feed_id') AND
                                        filter_type = t.id AND filter_id = '$filter_id'");
 
                if (db_num_rows($result) == 1) {
                        return db_fetch_result($result, 0, "access_key");
                } else {
-                       $key = db_escape_string(sha1(uniqid(rand(), true)));
+                       $key = db_escape_string(uniqid(base_convert(rand(), 10, 36)));
 
                        $result = db_query("INSERT INTO ttrss_access_keys
                                (access_key, feed_id, is_cat, owner_uid)
                                        $qpart .= " AND $cat_qpart";
                                }
 
+                               $qpart .= " AND feed_id IS NOT NULL";
+
                                array_push($query, "($qpart)");
 
                        }
                curl_setopt($curl, CURLOPT_TIMEOUT, 60);
                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 
+               if (defined('_CURL_HTTP_PROXY')) {
+                       curl_setopt($curl, CURLOPT_PROXY, _CURL_HTTP_PROXY);
+               }
+
                if ((OPENSSL_VERSION_NUMBER >= 0x0090808f) && (OPENSSL_VERSION_NUMBER < 0x10000000)) {
                        curl_setopt($curl, CURLOPT_SSLVERSION, 3);
                }
        function stylesheet_tag($filename) {
                $timestamp = filemtime($filename);
 
-               echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$filename?$timestamp\"/>\n";
+               return "<link rel=\"stylesheet\" type=\"text/css\" href=\"$filename?$timestamp\"/>\n";
        }
 
        function javascript_tag($filename) {
 
                if ($query) $timestamp .= "&$query";
 
-               echo "<script type=\"text/javascript\" charset=\"utf-8\" src=\"$filename?$timestamp\"></script>\n";
+               return "<script type=\"text/javascript\" charset=\"utf-8\" src=\"$filename?$timestamp\"></script>\n";
        }
 
        function calculate_dep_timestamp() {