]> git.wh0rd.org - tt-rss.git/blobdiff - functions.php
experimental split of public calls into public.php (refs #389)
[tt-rss.git] / functions.php
index 9ef45cd3f2a4b91cf4ab4698e275cc030fe183eb..83159e62cabbefe1f79576f7bd34ee75ec6849a2 100644 (file)
        @$config->set('HTML', 'Allowed', $allowed);
        $config->set('Output.FlashCompat', true);
        $config->set('Attr.EnableID', true);
-       @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier");
+       if (!defined('MOBILE_VERSION')) {
+               @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier");
+       } else {
+               @$config->set('Cache', 'SerializerPath', "../" . CACHE_DIR . "/htmlpurifier");
+       }
 
        $purifier = new HTMLPurifier($config);
 
+       $tz_offset = -1;
+       $utc_tz = new DateTimeZone('UTC');
+       $schema_version = false;
+
        /**
         * Print a timestamped debug message.
         *
                $login = urlencode($login);
                $pass = urlencode($pass);
 
-               if (function_exists('curl_init')) {
+               if (function_exists('curl_init') && !ini_get("open_basedir")) {
                        $ch = curl_init($url);
 
                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                        curl_setopt($ch, CURLOPT_USERAGENT, SELF_USER_AGENT);
+                       curl_setopt($ch, CURLOPT_ENCODING , "gzip");
 
                        if ($post_query) {
                                curl_setopt($ch, CURLOPT_POST, true);
                                curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass");
 
                        $contents = @curl_exec($ch);
+
                        if ($contents === false) {
                                curl_close($ch);
                                return false;
 
                        return $contents;
                } else {
-                       if ($login && $pass && $updated != 3) {
+                       if ($login && $pass ){
                                $url_parts = array();
 
                                preg_match("/(^[^:]*):\/\/(.*)/", $url, $url_parts);
        } // function get_favicon_url
 
        function check_feed_favicon($site_url, $feed, $link) {
-               $favicon_url = get_favicon_url($site_url);
-
 #              print "FAVICON [$site_url]: $favicon_url\n";
 
                $icon_file = ICONS_DIR . "/$feed.ico";
 
-               if ($favicon_url && !file_exists($icon_file)) {
-                       $contents = fetch_file_contents($favicon_url, "image");
-                       if ($contents) {
-                               $fp = fopen($icon_file, "w");
+               if (!file_exists($icon_file)) {
+                       $favicon_url = get_favicon_url($site_url);
 
-                               if ($fp) {
-                                       fwrite($fp, $contents);
-                                       fclose($fp);
-                                       chmod($icon_file, 0644);
+                       if ($favicon_url) {
+                               $contents = fetch_file_contents($favicon_url, "image");
+
+                               if ($contents) {
+                                       $fp = @fopen($icon_file, "w");
+
+                                       if ($fp) {
+                                               fwrite($fp, $contents);
+                                               fclose($fp);
+                                               chmod($icon_file, 0644);
+                                       }
                                }
                        }
                }
                }
        }
 
-       function update_rss_feed_real($link, $feed, $ignore_daemon = false, $no_cache = false) {
+       function update_rss_feed_real($link, $feed, $ignore_daemon = false, $no_cache = false,
+               $override_url = false) {
 
                global $memcache;
 
                $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images"));
                $fetch_url = db_fetch_result($result, 0, "feed_url");
 
-               if ($update_interval < 0) { return; }
+               if ($update_interval < 0) { return false; }
 
                $feed = db_escape_string($feed);
 
-               if ($auth_login && $auth_pass && $updated != 3) {
+               if ($auth_login && $auth_pass ){
                        $url_parts = array();
                        preg_match("/(^[^:]*):\/\/(.*)/", $fetch_url, $url_parts);
 
 
                }
 
+               if ($override_url)
+                       $fetch_url = $override_url;
+
                if ($debug_enabled) {
                        _debug("update_rss_feed: fetching [$fetch_url]...");
                }
        #                       $rss->set_timeout(10);
                                $rss->set_feed_url($fetch_url);
                                $rss->set_output_encoding('UTF-8');
+                               $rss->force_feed(true);
 
                                if (SIMPLEPIE_CACHE_IMAGES && $cache_images) {
 
                                $site_url = $rss->channel["link"];
                        }
 
+                       $site_url = rewrite_relative_url($fetch_url, $site_url);
+
                        if ($debug_enabled) {
                                _debug("update_rss_feed: checking favicon...");
                        }
 
                                if ($debug_enabled) _debug("update_rss_feed: feed hub url: $feed_hub_url");
 
-                               if ($feed_hub_url && function_exists('curl_init')) {
+                               if ($feed_hub_url && function_exists('curl_init') &&
+                                       !ini_get("open_basedir")) {
 
                                        $callback_url = get_self_url_prefix() .
-                                               "/backend.php?op=pubsub&id=$feed";
+                                               "/public.php?op=pubsub&id=$feed";
 
                                        $s = new Subscriber($feed_hub_url, $callback_url);
 
                                        if (!$entry_link) $entry_link = $item["link"];
                                }
 
+                               $entry_link = rewrite_relative_url($site_url, $entry_link);
+
                                if ($debug_enabled) {
                                        _debug("update_rss_feed: title $entry_title");
+                                       _debug("update_rss_feed: link $entry_link");
                                }
 
                                if (!$entry_title) $entry_title = date("Y-m-d H:i:s", $entry_timestamp);;
                                                $result = db_query($link,
                                                        "INSERT INTO ttrss_user_entries
                                                                (ref_id, owner_uid, feed_id, unread, last_read, marked,
-                                                                       published, score, tag_cache, label_cache)
+                                                                       published, score, tag_cache, label_cache, uuid)
                                                        VALUES ('$ref_id', '$owner_uid', '$feed', $unread,
-                                                               $last_read_qpart, $marked, $published, '$score', '', '')");
+                                                               $last_read_qpart, $marked, $published, '$score', '', '', '')");
 
                                                if (PUBSUBHUBBUB_HUB && $published == 'true') {
                                                        $rss_link = get_self_url_prefix() .
-                                                               "/backend.php?op=rss&id=-2&key=" .
+                                                               "/public.php?op=rss&id=-2&key=" .
                                                                get_feed_access_key($link, -2, false, $owner_uid);
 
                                                        $p = new Publisher(PUBSUBHUBBUB_HUB);
                                foreach ($article_filters as $f) {
                                        if ($f[0] == "tag") {
 
-                                               $manual_tags = trim_array(split(",", $f[1]));
+                                               $manual_tags = trim_array(explode(",", $f[1]));
 
                                                foreach ($manual_tags as $tag) {
                                                        if (tag_is_valid($tag)) {
 
                                // Skip boring tags
 
-                               $boring_tags = trim_array(split(",", mb_strtolower(get_pref($link,
+                               $boring_tags = trim_array(explode(",", mb_strtolower(get_pref($link,
                                        'BLACKLISTED_TAGS', $owner_uid, ''), 'utf-8')));
 
                                $filtered_tags = array();
 
        function lookup_user_id($link, $user) {
 
-               $result = db_query($link, "SELECT id FROM ttrss_users WHERE
-                       login = '$login'");
+               $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$user'");
 
                if (db_num_rows($result) == 1) {
                        return db_fetch_result($result, 0, "id");
 
                                        // First login ?
                                        if (db_num_rows($result) == 0) {
-                                               $query = "INSERT INTO ttrss_users
+                                               $query2 = "INSERT INTO ttrss_users
                                                                (login,access_level,last_login,created)
                                                                VALUES ('$login', 0, null, NOW())";
-                                               db_query($link, $query);
+                                               db_query($link, $query2);
                                        }
                                }
 
                                // LemonLDAP can send user informations via HTTP HEADER
                                if (defined('AUTO_CREATE_USER') && AUTO_CREATE_USER){
                                        // update user name
-                                       if ($_SERVER['HTTP_USER_NAME']){
-                                               $fullname = db_escape_string($_SERVER['HTTP_USER_NAME']);
+                                       $fullname = $_SERVER['HTTP_USER_NAME'] ? $_SERVER['HTTP_USER_NAME'] : $_SERVER['AUTHENTICATE_CN'];
+                                       if ($fullname){
+                                               $fullname = db_escape_string($fullname);
                                                db_query($link, "UPDATE ttrss_users SET full_name = '$fullname' WHERE id = " .
                                                        $_SESSION["uid"]);
                                        }
                                        // update user mail
-                                       if ($_SERVER['HTTP_USER_MAIL']){
-                                               $email = db_escape_string($_SERVER['HTTP_USER_MAIL']);
+                                       $email = $_SERVER['HTTP_USER_MAIL'] ? $_SERVER['HTTP_USER_MAIL'] : $_SERVER['AUTHENTICATE_MAIL'];
+                                       if ($email){
+                                               $email = db_escape_string($email);
                                                db_query($link, "UPDATE ttrss_users SET email = '$email' WHERE id = " .
                                                        $_SESSION["uid"]);
                                        }
        }
 
        function login_sequence($link, $mobile = false) {
+               $_SESSION["prefs_cache"] = array();
+
                if (!SINGLE_USER_MODE) {
 
                        $login_action = $_POST["login_action"];
                                        setcookie("ttrss_lang", $_SESSION["language"],
                                                time() + SESSION_COOKIE_LIFETIME);
                                }
+
+                               // try to remove possible duplicates from feed counter cache
+//                             ccache_cleanup($link, $_SESSION["uid"]);
                        }
 
                } else {
                if (!$owner_uid) $owner_uid = $_SESSION['uid'];
                if (!$timestamp) $timestamp = '1970-01-01 0:00';
 
-               $user_tz_string = get_pref($link, 'USER_TIMEZONE', $owner_uid);
+               global $utc_tz;
+               global $tz_offset;
 
-               try {
-                       $user_tz = new DateTimeZone($user_tz_string);
-               } catch (Exception $e) {
-                       $user_tz = new DateTimeZone('UTC');
+               # We store date in UTC internally
+               $dt = new DateTime($timestamp, $utc_tz);
+
+               if ($tz_offset == -1) {
+
+                       $user_tz_string = get_pref($link, 'USER_TIMEZONE', $owner_uid);
+
+                       try {
+                               $user_tz = new DateTimeZone($user_tz_string);
+                       } catch (Exception $e) {
+                               $user_tz = $utc_tz;
+                       }
+
+                       $tz_offset = $user_tz->getOffset($dt);
                }
 
-               # We store date in UTC internally
-               $dt = new DateTime($timestamp, new DateTimeZone('UTC'));
-               $user_timestamp = $dt->format('U') + $user_tz->getOffset($dt);
+               $user_timestamp = $dt->format('U') + $tz_offset;
 
                if (!$no_smart_dt) {
                        return smart_date_time($link, $user_timestamp,
-                               $user_tz->getOffset($dt), $owner_uid);
+                               $tz_offset, $owner_uid);
                } else {
                        if ($long)
                                $format = get_pref($link, 'LONG_DATE_FORMAT', $owner_uid);
        // script when get_schema_version() is called on an obsolete session
        // created on a previous schema version.
        function get_schema_version($link, $nocache = false) {
-//             if (!$_SESSION["schema_version"] || $nocache) {
+               global $schema_version;
+
+               if (!$schema_version) {
                        $result = db_query($link, "SELECT schema_version FROM ttrss_version");
                        $version = db_fetch_result($result, 0, "schema_version");
-                       $_SESSION["schema_version"] = $version;
+                       $schema_version = $version;
                        return $version;
-//             } else {
-//                     return $_SESSION["schema_version"];
-//             }
+               } else {
+                       return $schema_version;
+               }
        }
 
        function sanity_check($link) {
                global $ERRORS;
 
                $error_code = 0;
-               $schema_version = get_schema_version($link);
+               $schema_version = get_schema_version($link, true);
 
                if ($schema_version != SCHEMA_VERSION) {
                        $error_code = 5;
 
                        if (!$owner_uid) $owner_uid = $_SESSION['uid'];
 
-                       if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
+                       //if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
 
+                       if (is_numeric($feed)) {
                                if ($cat_view) {
 
                                        if ($feed >= 0) {
                                                }
                                        } else if ($feed == -2) {
 
-
                                                db_query($link, "UPDATE ttrss_user_entries
                                                        SET unread = false,last_read = NOW() WHERE (SELECT COUNT(*)
                                                                FROM ttrss_user_labels2 WHERE article_id = ref_id) > 0
 
        function get_pgsql_version($link) {
                $result = db_query($link, "SELECT version() AS version");
-               $version = split(" ", db_fetch_result($result, 0, "version"));
+               $version = explode(" ", db_fetch_result($result, 0, "version"));
                return $version[1];
        }
 
                                return "Unknown label ($label_id)";
                        }
 
-               } else if ($id > 0) {
+               } else if (is_numeric($id) && $id > 0) {
                        $result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$id'");
                        if (db_num_rows($result) == 1) {
                                return db_fetch_result($result, 0, "title");
 
                $search_query_part = "";
 
-               $keywords = split(" ", $search);
+               $keywords = explode(" ", $search);
                $query_keywords = array();
 
                foreach ($keywords as $k) {
                                $not = "";
                        }
 
-                       $commandpair = split(":", mb_strtolower($k), 2);
+                       $commandpair = explode(":", mb_strtolower($k), 2);
 
                        if ($commandpair[0] == "note" && $commandpair[1]) {
 
                return $search_query_part;
        }
 
-       function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false) {
+
+       function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0) {
 
                if (!$owner_uid) $owner_uid = $_SESSION["uid"];
 
                                $filter_query_part = "";
                        }
 
+                       if ($since_id) {
+                               $since_id_part = "ttrss_entries.id > $since_id AND ";
+                       } else {
+                               $since_id_part = "";
+                       }
+
                        $view_query_part = "";
 
                        if ($view_mode == "adaptive" || $view_query_part == "noscores") {
                                if ($cat_view) {
                                        $feed_title = getCategoryTitle($link, $feed);
                                } else {
-                                       if ((int)$feed == $feed && $feed > 0) {
+                                       if (is_numeric($feed) && $feed > 0) {
                                                $result = db_query($link, "SELECT title,site_url,last_error
                                                        FROM ttrss_feeds WHERE id = '$feed' AND owner_uid = $owner_uid");
 
                                                guid,
                                                ttrss_entries.id,ttrss_entries.title,
                                                updated,
+                                               label_cache,
+                                               tag_cache,
+                                               always_display_enclosures,
+                                               site_url,
                                                note,
+                                               num_comments,
+                                               comments,
                                                unread,feed_id,marked,published,link,last_read,orig_feed_id,
                                                ".SUBSTRING_FOR_DATE."(last_read,1,19) as last_read_noms,
                                                $vfeed_query_part
                                        $search_query_part
                                        $filter_query_part
                                        $view_query_part
+                                       $since_id_part
                                        $query_strategy_part ORDER BY $order_by
                                        $limit_query_part $offset_query_part";
 
                        } else {
                                // browsing by tag
 
+                               $select_qpart = "SELECT DISTINCT " .
+                                                               "date_entered," .
+                                                               "guid," .
+                                                               "note," .
+                                                               "ttrss_entries.id as id," .
+                                                               "title," .
+                                                               "updated," .
+                                                               "unread," .
+                                                               "feed_id," .
+                                                               "orig_feed_id," .
+                                                               "site_url," .
+                                                               "always_display_enclosures, ".
+                                                               "marked," .
+                                                               "num_comments, " .
+                                                               "comments, " .
+                                                               "tag_cache," .
+                                                               "label_cache," .
+                                                               "link," .
+                                                               "last_read," .
+                                                               SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms," .
+                                                               $since_id_part .
+                                                               $vfeed_query_part .
+                                                               $content_query_part .
+                                                               SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms," .
+                                                               "score ";
+
                                $feed_kind = "Tags";
+                               $all_tags = explode(",", $feed);
+                               if ($search_mode == 'any') {
+                                       $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")";
+                                       $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags ";
+                                       $where_qpart = " WHERE " .
+                                                                  "ref_id = ttrss_entries.id AND " .
+                                                                  "ttrss_user_entries.owner_uid = $owner_uid AND " .
+                                                                  "post_int_id = int_id AND $tag_sql AND " .
+                                                                  $view_query_part .
+                                                                  $search_query_part .
+                                                                  $query_strategy_part . " ORDER BY $order_by " .
+                                                                  $limit_query_part;
 
-                               $result = db_query($link, "SELECT DISTINCT
-                                       date_entered,
-                                       guid,
-                                       note,
-                                       ttrss_entries.id as id,title,
-                                       updated,
-                                       unread,feed_id,orig_feed_id,
-                                       marked,link,last_read,
-                                       ".SUBSTRING_FOR_DATE."(last_read,1,19) as last_read_noms,
-                                       $vfeed_query_part
-                                       $content_query_part
-                                       ".SUBSTRING_FOR_DATE."(updated,1,19) as updated_noms,
-                                       score
-                                       FROM
-                                               ttrss_entries,ttrss_user_entries,ttrss_tags
-                                       WHERE
-                                               ref_id = ttrss_entries.id AND
-                                               ttrss_user_entries.owner_uid = '$owner_uid' AND
-                                               post_int_id = int_id AND tag_name = '$feed' AND
-                                               $view_query_part
-                                               $search_query_part
-                                               $query_strategy_part ORDER BY $order_by
-                                       $limit_query_part");
+                               } else {
+                                       $i = 1;
+                                       $sub_selects = array();
+                                       $sub_ands = array();
+                                       foreach ($all_tags as $term) {
+                                               array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = $owner_uid) as A$i");
+                                               $i++;
+                                       }
+                                       if ($i > 2) {
+                                               $x = 1;
+                                               $y = 2;
+                                               do {
+                                                       array_push($sub_ands, "A$x.post_int_id = A$y.post_int_id");
+                                                       $x++;
+                                                       $y++;
+                                               } while ($y < $i);
+                                       }
+                                       array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = $owner_uid");
+                                       array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id");
+                                       $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries";
+                                       $where_qpart = " WHERE " . implode(" AND ", $sub_ands);
+                               }
+                               //                              error_log("TAG SQL: " . $tag_sql);
+                               // $tag_sql = "tag_name = '$feed'";   DEFAULT way
+
+                               //                              error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]");
+                               $result = db_query($link, $select_qpart . $from_qpart . $where_qpart);
                        }
 
                        return array($result, $feed_title, $feed_site_url, $last_error);
                $last_error = $qfh_ret[3];
 
                $feed_self_url = get_self_url_prefix() .
-                       "/backend.php?op=rss&id=-2&key=" .
+                       "/public.php?op=rss&id=-2&key=" .
                        get_feed_access_key($link, -2, false);
 
                if (!$feed_site_url) $feed_site_url = get_self_url_prefix();
 
                if (PUBSUBHUBBUB_HUB) {
                        $rss_link = get_self_url_prefix() .
-                               "/backend.php?op=rss&id=-2&key=" .
+                               "/public.php?op=rss&id=-2&key=" .
                                get_feed_access_key($link, -2, false);
 
                        $p = new Publisher(PUBSUBHUBBUB_HUB);
 
                if ($is_cat) $cat_q = "&is_cat=$is_cat";
 
+               if ($search) {
+                       $search_q = "&q=$search&m=$match_on&smode=$search_mode";
+               } else {
+                       $search_q = "";
+               }
+
                $rss_link = htmlspecialchars(get_self_url_prefix() .
-                       "/backend.php?op=rss&id=$feed_id$cat_q$search_q");
+                       "/public.php?op=rss&id=$feed_id$cat_q$search_q");
 
                $reply .= "<option value=\"0\" disabled=\"1\">".__('Feed:')."</option>";
 
                                        $fg_color = db_fetch_result($result, 0, "fg_color");
                                        $bg_color = db_fetch_result($result, 0, "bg_color");
 
-                                       $reply .= "<span style='background : $bg_color; color : $fg_color'>";
+                                       $reply .= "<span style=\"background : $bg_color; color : $fg_color\" >";
                                        $reply .= $feed_title;
                                        $reply .= "</span>";
                                } else {
                        }
                }
 
-               if ($search) {
-                       $search_q = "&q=$search&m=$match_on&smode=$search_mode";
-               } else {
-                       $search_q = "";
-               }
-
                $reply .= "
                        <a href=\"#\"
                                title=\"".__("View as RSS feed")."\"
                return $feedlist;
        }
 
-       function get_article_tags($link, $id, $owner_uid = 0) {
+       function get_article_tags($link, $id, $owner_uid = 0, $tag_cache = false) {
 
                global $memcache;
 
                } else {
                        /* check cache first */
 
-                       $result = db_query($link, "SELECT tag_cache FROM ttrss_user_entries
-                               WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+                       if ($tag_cache === false) {
+                               $result = db_query($link, "SELECT tag_cache FROM ttrss_user_entries
+                                       WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
 
-                       $tag_cache = db_fetch_result($result, 0, "tag_cache");
+                               $tag_cache = db_fetch_result($result, 0, "tag_cache");
+                       }
 
                        if ($tag_cache) {
                                $tags = explode(",", $tag_cache);
                return $entry;
        }
 
-       function format_article($link, $id, $feed_id, $mark_as_read = true,
-               $zoom_mode = false) {
+       function format_article($link, $id, $mark_as_read = true, $zoom_mode = false) {
 
                $rv = array();
 
                        (SELECT icon_url FROM ttrss_feeds WHERE id = feed_id) as icon_url,
                        (SELECT site_url FROM ttrss_feeds WHERE id = feed_id) as site_url,
                        num_comments,
+                       tag_cache,
                        author,
                        orig_feed_id,
                        note
                                $rv['content'] .= "<div clear='both'>" . $line["title"] . "$entry_author</div>";
                        }
 
-                       $tags = get_article_tags($link, $id);
+                       $tag_cache = $line["tag_cache"];
+
+                       if (!$tag_cache)
+                               $tags = get_article_tags($link, $id);
+                       else
+                               $tags = explode(",", $tag_cache);
+
                        $tags_str = format_tags_string($tags, $id);
                        $tags_str_full = join(", ", $tags);
 
                                                        alt='Zoom' title='".__('Share on Twitter')."'>";
                                }
 
+                               $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-share.png')."\"
+                                       class='tagsPic' style=\"cursor : pointer\"
+                                       onclick=\"shareArticle(".$line['int_id'].")\"
+                                       alt='Zoom' title='".__('Share by URL')."'>";
+
                                $rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
                                                class='tagsPic' style=\"cursor : pointer\"
                                                onclick=\"closeArticlePanel($id)\"
 
                $topmost_article_ids = array();
 
-               if (!$offset) {
-                       $offset = 0;
-               }
-
+               if (!$offset) $offset = 0;
                if ($subop == "undefined") $subop = "";
 
-               $subop_split = split(":", $subop);
+               $subop_split = explode(":", $subop);
 
-               if ($subop == "CatchupSelected") {
-                       $ids = split(",", db_escape_string($_REQUEST["ids"]));
+/*             if ($subop == "CatchupSelected") {
+                       $ids = explode(",", db_escape_string($_REQUEST["ids"]));
                        $cmode = sprintf("%d", $_REQUEST["cmode"]);
 
                        catchupArticlesById($link, $ids, $cmode);
-               }
+               } */
 
-               if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
+               if ($subop == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
                        update_rss_feed($link, $feed, true);
                }
 
 
                // FIXME: might break tag display?
 
-               if ($feed > 0 && !$cat_view) {
+               if (is_numeric($feed) && $feed > 0 && !$cat_view) {
                        $result = db_query($link,
                                "SELECT id FROM ttrss_feeds WHERE id = '$feed' LIMIT 1");
 
                        $rtl_content = false;
                }
 
-               /// START /////////////////////////////////////////////////////////////////////////////////
-
                @$search = db_escape_string($_REQUEST["query"]);
 
                if ($search) {
                        $match_on = "both";
                }
 
-               $real_offset = $offset * $limit;
-
                if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H0", $timing_info);
 
+//             error_log("format_headlines_list: [" . $feed . "] subop [" . $subop . "]");
+               if( $search_mode == '' && $subop != '' ){
+                   $search_mode = $subop;
+               }
+//             error_log("search_mode: " . $search_mode);
                $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view,
-                       $search, $search_mode, $match_on, $override_order, $real_offset);
+                       $search, $search_mode, $match_on, $override_order, $offset);
 
                if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H1", $timing_info);
 
 
                $vgroup_last_feed = $vgr_last_feed;
 
-               /// STOP //////////////////////////////////////////////////////////////////////////////////
-
-               if (!$offset) {
+//             if (!$offset) {
 
                        if (db_num_rows($result) > 0) {
-                               $reply['toolbar'] = format_headline_subtoolbar($link, $feed_site_url, $feed_title,
+                               $reply['toolbar'] = format_headline_subtoolbar($link, $feed_site_url,
+                                       $feed_title,
                                        $feed, $cat_view, $search, $match_on, $search_mode, $view_mode,
                                        $last_error);
                        }
-               }
+//             }
 
                $headlines_count = db_num_rows($result);
 
                if (db_num_rows($result) > 0) {
 
-                       $lnum = $limit*$offset;
+                       $lnum = $offset;
 
                        $num_unread = 0;
                        $cur_feed_title = '';
 
                        $fresh_intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60;
 
+                       if ($_REQUEST["debug"]) $timing_info = print_checkpoint("PS", $timing_info);
+
                        while ($line = db_fetch_assoc($result)) {
 
                                $class = ($lnum % 2) ? "even" : "odd";
 
                                $id = $line["id"];
                                $feed_id = $line["feed_id"];
+                               $label_cache = $line["label_cache"];
+                               $labels = false;
+
+                               if ($label_cache) {
+                                       $label_cache = json_decode($label_cache, true);
+
+                                       if ($label_cache) {
+                                               if ($label_cache["no-labels"] == 1)
+                                                       $labels = array();
+                                               else
+                                                       $labels = $label_cache;
+                                       }
+                               }
 
-                               $labels = get_article_labels($link, $id);
+                               if (!is_array($labels)) $labels = get_article_labels($link, $id);
 
                                $labels_str = "<span id=\"HLLCTR-$id\">";
                                $labels_str .= format_article_labels($labels, $id);
                                        $reply['content'] .= "<a id=\"RTITLE-$id\"
                                                href=\"" . htmlspecialchars($line["link"]) . "\"
                                                onclick=\"\">" .
-                                               $line["title"];
+                                               truncate_string($line["title"], 200);
 
                                        if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
                                                if ($content_preview) {
 
                                        $reply['content'] .= $labels_str;
 
-                                       /* if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) {
+                                       if (!get_pref($link, 'VFEED_GROUP_BY_FEED') &&
+                                               defined('_SHOW_FEED_TITLE_IN_VFEEDS')) {
                                                if (@$line["feed_title"]) {
-                                                       print "<span class=\"hlFeed\">
+                                                       $reply['content'] .= "<span class=\"hlFeed\">
                                                                (<a href=\"#\" onclick=\"viewfeed($feed_id)\">".
                                                                $line["feed_title"]."</a>)
                                                        </span>";
                                                }
-                                       } */
+                                       }
 
                                        $reply['content'] .= "</div>";
 
 
                                        $reply['content'] .= "<div class=\"cdmHeader\">";
 
-                                       $reply['content'] .= "<div style='float : right'>";
-                                       $reply['content'] .= "<span class='updated'>$updated_fmt</span>";
-                                       $reply['content'] .= "$score_pic";
-
-                                       if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
-                                               $reply['content'] .= "<span style=\"cursor : pointer\"
-                                                       title=\"".htmlspecialchars($line["feed_title"])."\"
-                                                       onclick=\"viewfeed($feed_id)\">$feed_icon_img</span>";
-                                       }
-                                       $reply['content'] .= "<div class=\"updPic\">$update_pic</div>";
-
-                                       $reply['content'] .= "</div>";
+                                       $reply['content'] .= "<div>";
 
                                        $reply['content'] .= "<input type=\"checkbox\" onclick=\"toggleSelectRowById(this,
                                                        'RROW-$id')\" id=\"RCHK-$id\"/>";
                                        $reply['content'] .= "$marked_pic";
                                        $reply['content'] .= "$published_pic";
 
+                                       $reply['content'] .= "</div>";
+
                                        $reply['content'] .= "<span id=\"RTITLE-$id\"
                                                onclick=\"return cdmClicked(event, $id);\"
                                                class=\"titleWrap$hlc_suffix\">
 
                                        $reply['content'] .= $labels_str;
 
+                                       if (!get_pref($link, 'VFEED_GROUP_BY_FEED') &&
+                                               defined('_SHOW_FEED_TITLE_IN_VFEEDS')) {
+                                               if (@$line["feed_title"]) {
+                                                       $reply['content'] .= "<span class=\"hlFeed\">
+                                                               (<a href=\"#\" onclick=\"viewfeed($feed_id)\">".
+                                                               $line["feed_title"]."</a>)
+                                                       </span>";
+                                               }
+                                       }
+
                                        if (!$expand_cdm)
                                                $content_hidden = "style=\"display : none\"";
                                        else
 
                                        $reply['content'] .= "</span>";
 
+                                       $reply['content'] .= "<div>";
+                                       $reply['content'] .= "<span class='updated'>$updated_fmt</span>";
+                                       $reply['content'] .= "$score_pic";
+
+                                       if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
+                                               $reply['content'] .= "<span style=\"cursor : pointer\"
+                                                       title=\"".htmlspecialchars($line["feed_title"])."\"
+                                                       onclick=\"viewfeed($feed_id)\">$feed_icon_img</span>";
+                                       }
+                                       $reply['content'] .= "<div class=\"updPic\">$update_pic</div>";
+                                       $reply['content'] .= "</div>";
+
                                        $reply['content'] .= "</div>";
 
                                        $reply['content'] .= "<div class=\"cdmContent\" $content_hidden
                                                }
                                        }
 
-                                       // FIXME: make this less of a hack
-
-                                       $feed_site_url = false;
+                                       $feed_site_url = $line["site_url"];
 
-                                       if ($line["feed_id"]) {
-                                               $tmp_result = db_query($link, "SELECT site_url FROM ttrss_feeds
-                                                       WHERE id = " . $line["feed_id"]);
-
-                                               if (db_num_rows($tmp_result) == 1) {
-                                                       $feed_site_url = db_fetch_result($tmp_result, 0, "site_url");
-                                               }
-                                       }
-
-                                       if ($expand_cdm) {
-                                               $article_content = sanitize_rss($link, $line["content_preview"],
+                                       $article_content = sanitize_rss($link, $line["content_preview"],
                                                        false, false, $feed_site_url);
 
-                                               if (!$article_content) $article_content = "&nbsp;";
-                                       } else {
-                                               $article_content = '';
-                                       }
-
                                        $reply['content'] .= "<div id=\"POSTNOTE-$id\">";
                                        if ($line['note']) {
                                                $reply['content'] .= format_article_note($id, $line['note']);
                                        }
                                        $reply['content'] .= "</div>";
 
-                                       $reply['content'] .= "<span id=\"CWRAP-$id\">$article_content</span>";
+                                       $reply['content'] .= "<span id=\"CWRAP-$id\">";
+                                       $reply['content'] .= $expand_cdm ? $article_content : '';
+                                       $reply['content'] .= "</span>";
 
-                                       $tmp_result = db_query($link, "SELECT always_display_enclosures FROM
+/*                                     $tmp_result = db_query($link, "SELECT always_display_enclosures FROM
                                                ttrss_feeds WHERE id = ".
                                                (($line['feed_id'] == null) ? $line['orig_feed_id'] :
-                                                               $line['feed_id'])." AND owner_uid = ".$_SESSION["uid"]);
+                                                       $line['feed_id'])." AND owner_uid = ".$_SESSION["uid"]);
 
                                        $always_display_enclosures = sql_bool_to_bool(db_fetch_result($tmp_result,
-                                               0, "always_display_enclosures"));
+                                               0, "always_display_enclosures")); */
+
+                                       $always_display_enclosures = sql_bool_to_bool($line["always_display_enclosures"]);
 
                                        $reply['content'] .= format_article_enclosures($link, $id, $always_display_enclosures,
                                                $article_content);
 
                                        $reply['content'] .= "<div class=\"cdmFooter\">";
 
-                                       $tags_str = format_tags_string(get_article_tags($link, $id), $id);
+                                       $tag_cache = $line["tag_cache"];
+
+                                       $tags_str = format_tags_string(
+                                               get_article_tags($link, $id, $_SESSION["uid"], $tag_cache),
+                                               $id);
 
                                        $reply['content'] .= "<img src='".theme_image($link,
                                                        'images/tag.png')."' alt='Tags' title='Tags'>
                                                <a title=\"".__('Edit tags for this article')."\"
                                                href=\"#\" onclick=\"editArticleTags($id, $feed_id, true)\">(+)</a>";
 
+                                       $num_comments = $line["num_comments"];
+                                       $entry_comments = "";
+
+                                       if ($num_comments > 0) {
+                                               if ($line["comments"]) {
+                                                       $comments_url = $line["comments"];
+                                               } else {
+                                                       $comments_url = $line["link"];
+                                               }
+                                               $entry_comments = "<a target='_blank' href=\"$comments_url\">$num_comments comments</a>";
+                                       } else {
+                                               if ($line["comments"] && $line["link"] != $line["comments"]) {
+                                                       $entry_comments = "<a target='_blank' href=\"".$line["comments"]."\">comments</a>";
+                                               }
+                                       }
+
+                                       if ($entry_comments) $reply['content'] .= "&nbsp;($entry_comments)";
+
                                        $reply['content'] .= "<div style=\"float : right\">";
 
                                        $reply['content'] .= "<img src=\"images/art-zoom.png\"
                                ++$lnum;
                        }
 
+                       if ($_REQUEST["debug"]) $timing_info = print_checkpoint("PE", $timing_info);
+
                } else {
                        $message = "";
 
                        }
                }
 
-#              if (!$offset) {
-#                      if ($headlines_count > 0) print "</div>";
-#                      print "</div>";
-#              }
-
-               #print "]]></content>";
+               if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H2", $timing_info);
 
                return array($topmost_article_ids, $headlines_count, $feed, $disable_cache,
-                       $vgroup_last_feed, $reply['content'], $reply['toolbar']);
+                       $vgroup_last_feed, $reply);
        }
 
 // from here: http://www.roscripts.com/Create_tag_cloud-71.html
                        $tags[$line["tag_name"]] = $line["count"];
                }
 
+        if( count($tags) == 0 ){ return; }
+
                ksort($tags);
 
                $max_size = 32; // max font size in pixels
        }
 
        function get_self_url_prefix() {
-
-               /* $url_path = "";
-
-               if ($_SERVER['HTTPS'] != "on") {
-                       $url_path = "http://";
-               } else {
-                       $url_path = "https://";
-               }
-
-               $url_path .= $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
-
-               return $url_path; */
-
                return SELF_URL_PATH;
-
        }
+
        function opml_publish_url($link){
 
                $url_path = get_self_url_prefix();
 
                // Test if feed is currently being updated by another process.
                if (DB_TYPE == "pgsql") {
-                       $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '120 seconds')";
+                       $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')";
                } else {
-                       $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 120 SECOND))";
+                       $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))";
                }
 
                // Test if there is a limit to number of updated feeds
                return $unread;
        }
 
+       function ccache_cleanup($link, $owner_uid) {
+
+               if (DB_TYPE == "pgsql") {
+                       db_query($link, "DELETE FROM ttrss_counters_cache AS c1 WHERE
+                               (SELECT count(*) FROM ttrss_counters_cache AS c2
+                                       WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
+                                       AND owner_uid = '$owner_uid'");
+
+                       db_query($link, "DELETE FROM ttrss_cat_counters_cache AS c1 WHERE
+                               (SELECT count(*) FROM ttrss_cat_counters_cache AS c2
+                                       WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
+                                       AND owner_uid = '$owner_uid'");
+               } else {
+                       db_query($link, "DELETE c1 FROM
+                                       ttrss_counters_cache AS c1,
+                                       ttrss_counters_cache AS c2
+                               WHERE
+                                       c1.owner_uid = '$owner_uid' AND
+                                       c1.owner_uid = c2.owner_uid AND
+                                       c1.feed_id = c2.feed_id");
+
+                       db_query($link, "DELETE c1 FROM
+                                       ttrss_cat_counters_cache AS c1,
+                                       ttrss_cat_counters_cache AS c2
+                               WHERE
+                                       c1.owner_uid = '$owner_uid' AND
+                                       c1.owner_uid = c2.owner_uid AND
+                                       c1.feed_id = c2.feed_id");
+
+               }
+       }
+
        function label_find_id($link, $label, $owner_uid) {
                $result = db_query($link,
                        "SELECT id FROM ttrss_labels2 WHERE caption = '$label'
 
                $num_tags = 0;
 
-/*             if (get_user_theme($link) == "3pane") {
-                       $tag_limit = 3;
-               } else {
-                       $tag_limit = 6;
-               } */
-
                $tag_limit = 6;
 
                $formatted_tags = array();
 
                        db_query($link, "COMMIT");
 
-/*                     if (file_exists(ICONS_DIR . "/$id.ico")) {
+                       if (file_exists(ICONS_DIR . "/$id.ico")) {
                                unlink(ICONS_DIR . "/$id.ico");
-                       } */
+                       }
 
                        ccache_remove($link, $id, $owner_uid);
 
 
        function api_get_headlines($link, $feed_id, $limit, $offset,
                                $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order,
-                               $include_attachments) {
+                               $include_attachments, $since_id) {
 
                        /* do not rely on params below */
 
 
                        $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit,
                                $view_mode, $is_cat, $search, $search_mode, $match_on,
-                               $order, $offset);
+                               $order, $offset, 0, false, $since_id);
 
                        $result = $qfh_ret[0];
                        $feed_title = $qfh_ret[1];
 
                        _debug("Updating: " . $line['access_url'] . " ($id)");
 
-                       $fetch_url = $line['access_url'] . '/backend.php?op=fbexport';
+                       $fetch_url = $line['access_url'] . '/public.php?op=fbexport';
                        $post_query = 'key=' . $line['access_key'];
 
                        $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query);
 
+                       // try doing it the old way
+                       if (!$feeds) {
+                               $fetch_url = $line['access_url'] . '/backend.php?op=fbexport';
+                               $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query);
+                       }
+
                        if ($feeds) {
                                $feeds = json_decode($feeds, true);
 
                                last_status_out = '$status', last_connected = NOW() WHERE id = '$id'");
 
                }
+       }
+
+       function handle_public_request($link, $op) {
+               switch ($op) {
+
+               case "getUnread":
+                       $login = db_escape_string($_REQUEST["login"]);
+                       $fresh = $_REQUEST["fresh"] == "1";
+
+                       $result = db_query($link, "SELECT id FROM ttrss_users WHERE login = '$login'");
+
+                       if (db_num_rows($result) == 1) {
+                               $uid = db_fetch_result($result, 0, "id");
+
+                               print getGlobalUnread($link, $uid);
+
+                               if ($fresh) {
+                                       print ";";
+                                       print getFeedArticles($link, -3, false, true, $uid);
+                               }
+
+                       } else {
+                               print "-1;User not found";
+                       }
+
+               break; // getUnread
+
+               case "getProfiles":
+                       $login = db_escape_string($_REQUEST["login"]);
+                       $password = db_escape_string($_REQUEST["password"]);
+
+                       if (authenticate_user($link, $login, $password)) {
+                               $result = db_query($link, "SELECT * FROM ttrss_settings_profiles
+                                       WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title");
+
+                               print "<select style='width: 100%' name='profile'>";
+
+                               print "<option value='0'>" . __("Default profile") . "</option>";
+
+                               while ($line = db_fetch_assoc($result)) {
+                                       $id = $line["id"];
+                                       $title = $line["title"];
+
+                                       print "<option value='$id'>$title</option>";
+                               }
+
+                               print "</select>";
+
+                               $_SESSION = array();
+                       }
+               break; // getprofiles
+
+               case "pubsub":
+                       $mode = db_escape_string($_REQUEST['hub_mode']);
+                       $feed_id = (int) db_escape_string($_REQUEST['id']);
+                       $feed_url = db_escape_string($_REQUEST['hub_topic']);
+
+                       if (!PUBSUBHUBBUB_ENABLED) {
+                               header('HTTP/1.0 404 Not Found');
+                               echo "404 Not found";
+                               return;
+                       }
+
+                       // TODO: implement hub_verifytoken checking
+
+                       $result = db_query($link, "SELECT feed_url FROM ttrss_feeds
+                               WHERE id = '$feed_id'");
+
+                       if (db_num_rows($result) != 0) {
+
+                               $check_feed_url = db_fetch_result($result, 0, "feed_url");
+
+                               if ($check_feed_url && ($check_feed_url == $feed_url || !$feed_url)) {
+                                       if ($mode == "subscribe") {
 
+                                               db_query($link, "UPDATE ttrss_feeds SET pubsub_state = 2
+                                                       WHERE id = '$feed_id'");
+
+                                               print $_REQUEST['hub_challenge'];
+                                               return;
+
+                                       } else if ($mode == "unsubscribe") {
+
+                                               db_query($link, "UPDATE ttrss_feeds SET pubsub_state = 0
+                                                       WHERE id = '$feed_id'");
+
+                                               print $_REQUEST['hub_challenge'];
+                                               return;
+
+                                       } else if (!$mode) {
+
+                                               // Received update ping, schedule feed update.
+                                               //update_rss_feed($link, $feed_id, true, true);
+
+                                               db_query($link, "UPDATE ttrss_feeds SET
+                                                       last_update_started = '1970-01-01',
+                                                       last_updated = '1970-01-01' WHERE id = '$feed_id' AND
+                                                       owner_uid = ".$_SESSION["uid"]);
+
+                                       }
+                               } else {
+                                       header('HTTP/1.0 404 Not Found');
+                                       echo "404 Not found";
+                               }
+                       } else {
+                               header('HTTP/1.0 404 Not Found');
+                               echo "404 Not found";
+                       }
+
+               break; // pubsub
+
+               case "logout":
+                       logout_user();
+                       header("Location: tt-rss.php");
+               break; // logout
+
+               case "fbexport":
+
+                       $access_key = db_escape_string($_POST["key"]);
+
+                       // TODO: rate limit checking using last_connected
+                       $result = db_query($link, "SELECT id FROM ttrss_linked_instances
+                               WHERE access_key = '$access_key'");
+
+                       if (db_num_rows($result) == 1) {
+
+                               $instance_id = db_fetch_result($result, 0, "id");
+
+                               $result = db_query($link, "SELECT feed_url, site_url, title, subscribers
+                                       FROM ttrss_feedbrowser_cache ORDER BY subscribers DESC LIMIT 100");
+
+                               $feeds = array();
+
+                               while ($line = db_fetch_assoc($result)) {
+                                       array_push($feeds, $line);
+                               }
+
+                               db_query($link, "UPDATE ttrss_linked_instances SET
+                                       last_status_in = 1 WHERE id = '$instance_id'");
+
+                               print json_encode(array("feeds" => $feeds));
+                       } else {
+                               print json_encode(array("error" => array("code" => 6)));
+                       }
+               break; // fbexport
+
+               case "share":
+                       $uuid = db_escape_string($_REQUEST["key"]);
+
+                       $result = db_query($link, "SELECT ref_id, owner_uid FROM ttrss_user_entries WHERE
+                               uuid = '$uuid'");
+
+                       if (db_num_rows($result) != 0) {
+                               header("Content-Type: text/html");
+
+                               $id = db_fetch_result($result, 0, "ref_id");
+                               $owner_uid = db_fetch_result($result, 0, "owner_uid");
+
+                               $_SESSION["uid"] = $owner_uid;
+                               $article = format_article($link, $id, false, true);
+                               $_SESSION["uid"] = "";
+
+                               print_r($article['content']);
+
+                       } else {
+                               print "Article not found.";
+                       }
+
+                       break;
+
+               case "rss":
+                       $feed = db_escape_string($_REQUEST["id"]);
+                       $key = db_escape_string($_REQUEST["key"]);
+                       $is_cat = $_REQUEST["is_cat"] != false;
+                       $limit = (int)db_escape_string($_REQUEST["limit"]);
+
+                       $search = db_escape_string($_REQUEST["q"]);
+                       $match_on = db_escape_string($_REQUEST["m"]);
+                       $search_mode = db_escape_string($_REQUEST["smode"]);
+                       $view_mode = db_escape_string($_REQUEST["view-mode"]);
+
+                       if (SINGLE_USER_MODE) {
+                               authenticate_user($link, "admin", null);
+                       }
+
+                       $owner_id = false;
+
+                       if ($key) {
+                               $result = db_query($link, "SELECT owner_uid FROM
+                                       ttrss_access_keys WHERE access_key = '$key' AND feed_id = '$feed'");
+
+                               if (db_num_rows($result) == 1)
+                                       $owner_id = db_fetch_result($result, 0, "owner_uid");
+                       }
+
+                       if ($owner_id) {
+                               $_SESSION['uid'] = $owner_id;
+
+                               generate_syndicated_feed($link, 0, $feed, $is_cat, $limit,
+                                       $search, $search_mode, $match_on, $view_mode);
+                       } else {
+                               header('HTTP/1.1 403 Forbidden');
+                       }
+               break; // rss
+
+
+               case "globalUpdateFeeds":
+                       // Update all feeds needing a update.
+                       update_daemon_common($link, 0, true, true);
+               break; // globalUpdateFeeds
+
+
+               default:
+                       header("Content-Type: text/plain");
+                       print json_encode(array("error" => array("code" => 7)));
+               break; // fallback
+
+               }
        }
 ?>