diff --git a/.gitignore b/.gitignore
index ac3c24319..e7e5407d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,13 +2,13 @@
*~
*.DS_Store
#*
-lib/floIcon.php
.idea/*
config.php
feed-icons/*
cache/*/*
lock/*
tags
+plugins/fever
cache/htmlpurifier/*/*ser
lib/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/*/*ser
web.config
diff --git a/README.md b/README.md
index 3aeea3319..0c3176f13 100644
--- a/README.md
+++ b/README.md
@@ -4,12 +4,25 @@ Tiny Tiny RSS
Web-based news feed aggregator, designed to allow you to read news from
any location, while feeling as close to a real desktop application as possible.
-http://tt-rss.org
+http://tt-rss.org (http://mirror.tt-rss.org)
-Licensed under GNU GPL version 2
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
This feed has been exported from diff --git a/classes/api.php b/classes/api.php index 23866072f..730e20ab9 100644 --- a/classes/api.php +++ b/classes/api.php @@ -2,7 +2,7 @@ class API extends Handler { - const API_LEVEL = 7; + const API_LEVEL = 9; const STATUS_OK = 0; const STATUS_ERR = 1; @@ -77,6 +77,7 @@ class API extends Handler { $this->wrap(self::STATUS_OK, array("session_id" => session_id(), "api_level" => self::API_LEVEL)); } else { // else we are not logged in + user_error("Failed login attempt for $login from {$_SERVER['REMOTE_ADDR']}", E_USER_WARNING); $this->wrap(self::STATUS_ERR, array("error" => "LOGIN_ERROR")); } } else { @@ -199,11 +200,15 @@ class API extends Handler { $include_nested = sql_bool_to_bool($_REQUEST["include_nested"]); $sanitize_content = !isset($_REQUEST["sanitize"]) || sql_bool_to_bool($_REQUEST["sanitize"]); + $force_update = sql_bool_to_bool($_REQUEST["force_update"]); $override_order = false; switch ($_REQUEST["order_by"]) { + case "title": + $override_order = "ttrss_entries.title"; + break; case "date_reverse": - $override_order = "date_entered, updated"; + $override_order = "score DESC, date_entered, updated"; break; case "feed_dates": $override_order = "updated DESC"; @@ -218,7 +223,7 @@ class API extends Handler { $headlines = $this->api_get_headlines($feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $override_order, $include_attachments, $since_id, $search, $search_mode, - $include_nested, $sanitize_content); + $include_nested, $sanitize_content, $force_update); $this->wrap(self::STATUS_OK, $headlines); } else { @@ -309,8 +314,8 @@ class API extends Handler { if ($article_id) { - $query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id, - marked,unread,published,score, + $query = "SELECT id,title,link,content,feed_id,comments,int_id, + marked,unread,published,score,note,lang, ".SUBSTRING_FOR_DATE."(updated,1,16) as updated, author,(SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title FROM ttrss_entries,ttrss_user_entries @@ -338,11 +343,13 @@ class API extends Handler { "comments" => $line["comments"], "author" => $line["author"], "updated" => (int) strtotime($line["updated"]), - "content" => $line["cached_content"] != "" ? $line["cached_content"] : $line["content"], + "content" => $line["content"], "feed_id" => $line["feed_id"], "attachments" => $attachments, "score" => (int)$line["score"], - "feed_title" => $line["feed_title"] + "feed_title" => $line["feed_title"], + "note" => $line["note"], + "lang" => $line["lang"] ); foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { @@ -423,14 +430,14 @@ class API extends Handler { $checked = false; foreach ($article_labels as $al) { - if ($al[0] == $line['id']) { + if (feed_to_label_id($al[0]) == $line['id']) { $checked = true; break; } } array_push($rv, array( - "id" => (int)$line['id'], + "id" => (int)label_to_feed_id($line['id']), "caption" => $line['caption'], "fg_color" => $line['fg_color'], "bg_color" => $line['bg_color'], @@ -447,7 +454,7 @@ class API extends Handler { $assign = (bool) $this->dbh->escape_string($_REQUEST['assign']) == "true"; $label = $this->dbh->escape_string(label_find_caption( - $label_id, $_SESSION["uid"])); + feed_to_label_id($label_id), $_SESSION["uid"])); $num_updated = 0; @@ -511,7 +518,7 @@ class API extends Handler { if ($unread || !$unread_only) { $row = array( - "id" => $cv["id"], + "id" => (int) $cv["id"], "title" => $cv["description"], "unread" => $cv["counter"], "cat_id" => -2, @@ -557,7 +564,7 @@ class API extends Handler { if ($unread || !$unread_only) { $row = array( - "id" => $line["id"], + "id" => (int) $line["id"], "title" => $line["title"], "unread" => $unread, "is_cat" => true, @@ -626,7 +633,28 @@ class API extends Handler { $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, $include_attachments, $since_id, $search = "", $search_mode = "", - $include_nested = false, $sanitize_content = true) { + $include_nested = false, $sanitize_content = true, $force_update = false) { + + if ($force_update && $feed_id > 0 && is_numeric($feed_id)) { + // Update the feed if required with some basic flood control + + $result = db_query( + "SELECT cache_images,".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated + FROM ttrss_feeds WHERE id = '$feed_id'"); + + if (db_num_rows($result) != 0) { + $last_updated = strtotime(db_fetch_result($result, 0, "last_updated")); + $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); + + if (!$cache_images && time() - $last_updated > 120) { + include "rssfuncs.php"; + update_rss_feed($feed_id, true, true); + } else { + db_query("UPDATE ttrss_feeds SET last_updated = '1970-01-01', last_update_started = '1970-01-01' + WHERE id = '$feed_id'"); + } + } + } $qfh_ret = queryFeedHeadlines($feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, @@ -638,11 +666,31 @@ class API extends Handler { $headlines = array(); while ($line = db_fetch_assoc($result)) { + $line["content_preview"] = truncate_string(strip_tags($line["content"]), 100); + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { + $line = $p->hook_query_headlines($line, 100, true); + } + $is_updated = ($line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1")); $tags = explode(",", $line["tag_cache"]); - $labels = json_decode($line["label_cache"], true); + + $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; + } + } + + if (!is_array($labels)) $labels = get_article_labels($line["id"]); //if (!$tags) $tags = get_article_tags($line["id"]); //if (!$labels) $labels = get_article_labels($line["id"]); @@ -660,28 +708,22 @@ class API extends Handler { "tags" => $tags, ); - if ($include_attachments) - $headline_row['attachments'] = get_article_enclosures( - $line['id']); + if ($include_attachments) + $headline_row['attachments'] = get_article_enclosures( + $line['id']); - if ($show_excerpt) { - $excerpt = truncate_string(strip_tags($line["content_preview"]), 100); - $headline_row["excerpt"] = $excerpt; - } + if ($show_excerpt) + $headline_row["excerpt"] = $line["content_preview"]; if ($show_content) { - if ($line["cached_content"] != "") { - $line["content_preview"] =& $line["cached_content"]; - } - if ($sanitize_content) { $headline_row["content"] = sanitize( - $line["content_preview"], + $line["content"], sql_bool_to_bool($line['hide_images']), - false, $line["site_url"]); + false, $line["site_url"], false, $line["id"]); } else { - $headline_row["content"] = $line["content_preview"]; + $headline_row["content"] = $line["content"]; } } @@ -699,7 +741,10 @@ class API extends Handler { $headline_row["always_display_attachments"] = sql_bool_to_bool($line["always_display_enclosures"]); $headline_row["author"] = $line["author"]; + $headline_row["score"] = (int)$line["score"]; + $headline_row["note"] = $line["note"]; + $headline_row["lang"] = $line["lang"]; foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { $headline_row = $p->hook_render_article_api(array("headline" => $headline_row)); diff --git a/classes/article.php b/classes/article.php index 398132d12..9aef107ec 100644 --- a/classes/article.php +++ b/classes/article.php @@ -30,7 +30,6 @@ class Article extends Handler_Protected { $id = $this->dbh->escape_string($_REQUEST["id"]); $cids = explode(",", $this->dbh->escape_string($_REQUEST["cids"])); $mode = $this->dbh->escape_string($_REQUEST["mode"]); - $omode = $this->dbh->escape_string($_REQUEST["omode"]); // in prefetch mode we only output requested cids, main article // just gets marked as read (it already exists in client cache) @@ -108,7 +107,7 @@ class Article extends Handler_Protected { // only check for our user data here, others might have shared this with different content etc $result = db_query("SELECT id FROM ttrss_entries, ttrss_user_entries WHERE - link = '$url' AND ref_id = id AND owner_uid = '$owner_uid' LIMIT 1"); + guid = '$guid' AND ref_id = id AND owner_uid = '$owner_uid' LIMIT 1"); if (db_num_rows($result) != 0) { $ref_id = db_fetch_result($result, 0, "id"); diff --git a/classes/db/mysql.php b/classes/db/mysql.php index aab05aca2..d4b45b98c 100644 --- a/classes/db/mysql.php +++ b/classes/db/mysql.php @@ -26,9 +26,12 @@ class Db_Mysql implements IDb { } function query($query, $die_on_error = true) { - $result = mysql_query($query, $this->link); + $result = @mysql_query($query, $this->link); if (!$result) { - user_error("Query $query failed: " . ($this->link ? mysql_error($this->link) : "No connection"), + $error = @mysql_error($this->link); + + @mysql_query("ROLLBACK", $this->link); + user_error("Query $query failed: " . ($this->link ? $error : "No connection"), $die_on_error ? E_USER_ERROR : E_USER_WARNING); } return $result; diff --git a/classes/db/mysqli.php b/classes/db/mysqli.php index a41ebf8ec..c685b75a0 100644 --- a/classes/db/mysqli.php +++ b/classes/db/mysqli.php @@ -24,9 +24,12 @@ class Db_Mysqli implements IDb { } function query($query, $die_on_error = true) { - $result = mysqli_query($this->link, $query); + $result = @mysqli_query($this->link, $query); if (!$result) { - user_error("Query $query failed: " . ($this->link ? mysqli_error($this->link) : "No connection"), + $error = @mysqli_error($this->link); + + @mysqli_query($this->link, "ROLLBACK"); + user_error("Query $query failed: " . ($this->link ? $error : "No connection"), $die_on_error ? E_USER_ERROR : E_USER_WARNING); } diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php index 4d860790b..ba37f83a6 100644 --- a/classes/db/pgsql.php +++ b/classes/db/pgsql.php @@ -35,11 +35,14 @@ class Db_Pgsql implements IDb { } function query($query, $die_on_error = true) { - $result = pg_query($query); + $result = @pg_query($this->link, $query); if (!$result) { + $error = @pg_last_error($this->link); + + @pg_query($this->link, "ROLLBACK"); $query = htmlspecialchars($query); // just in case - user_error("Query $query failed: " . ($this->link ? pg_last_error($this->link) : "No connection"), + user_error("Query $query failed: " . ($this->link ? $error : "No connection"), $die_on_error ? E_USER_ERROR : E_USER_WARNING); } return $result; diff --git a/classes/dlg.php b/classes/dlg.php index cfa960d9a..25a194bed 100644 --- a/classes/dlg.php +++ b/classes/dlg.php @@ -16,7 +16,6 @@ class Dlg extends Handler_Protected { print __("If you have imported labels and/or filters, you might need to reload preferences to see your new data.") . "
"; print ""; - - if ($feed_id) { - print "
"; - } - - print ""; - - print ""; - } - function index() { header("Content-Type: text/plain"); print json_encode(array("error" => array("code" => 7))); @@ -747,11 +713,15 @@ class Handler_Public extends Handler { function forgotpass() { startup_gettext(); + @$hash = $_REQUEST["hash"]; + header('Content-Type: text/html; charset=utf-8'); - print ""."Completed."."
"; + + } else { + print_error("Some of the information provided is missing or incorrect."); + } + } else { + print_error("Some of the information provided is missing or incorrect."); + } + } else { + print_error("Some of the information provided is missing or incorrect."); + } + + print ""; + + } else if (!$method) { + print_notice(__("You will need to provide valid account name and email. A password reset link will be sent to your email address.")); print ""; + + print ""; - print __('From:'); - - print " | "; - - print "\">"; - - print " |
"; + $addresslist = explode(",", $this->host->get($this, "addresslist")); print __('To:'); print " | "; - print ""; + name=\"destination\" id=\"emailArticleDlg_destination\">"; */ + + print_select("destination", "", $addresslist, 'style="width: 30em" dojoType="dijit.form.ComboBox"'); - print ""; +/* print ""; */ print " |
";
@@ -139,8 +182,8 @@ class Mail extends Plugin {
$mail = new ttrssMailer();
- $mail->From = strip_tags($_REQUEST['from_email']);
- $mail->FromName = strip_tags($_REQUEST['from_name']);
+ $mail->AddReplyTo(strip_tags($_REQUEST['from_email']),
+ strip_tags($_REQUEST['from_name']));
//$mail->AddAddress($_REQUEST['destination']);
$addresses = explode(';', $_REQUEST['destination']);
foreach($addresses as $nextaddr)
@@ -155,14 +198,14 @@ class Mail extends Plugin {
if (!$rc) {
$reply['error'] = $mail->ErrorInfo;
} else {
- save_email_address(db_escape_string($destination));
+ //save_email_address(db_escape_string($destination));
$reply['message'] = "UPDATE_COUNTERS";
}
print json_encode($reply);
}
- function completeEmails() {
+ /* function completeEmails() {
$search = db_escape_string($_REQUEST["search"]);
print "
"; + + print " "; + + print " "; + + } + } + + // Silent + function clearArticleKeys() { + db_query("UPDATE ttrss_user_entries SET uuid = '' WHERE + owner_uid = " . $_SESSION["uid"]); + + return; + } + + + function newkey() { + $id = db_escape_string($_REQUEST['id']); + + $uuid = db_escape_string(uniqid(base_convert(rand(), 10, 36))); + + db_query("UPDATE ttrss_user_entries SET uuid = '$uuid' WHERE int_id = '$id' + AND owner_uid = " . $_SESSION['uid']); + + print json_encode(array("link" => $uuid)); + } + function hook_article_button($line) { - return ""; @@ -39,7 +91,7 @@ class Share extends Plugin { $ref_id = db_fetch_result($result, 0, "ref_id"); if (!$uuid) { - $uuid = db_escape_string(sha1(uniqid(rand(), true))); + $uuid = db_escape_string(uniqid(base_convert(rand(), 10, 36))); db_query("UPDATE ttrss_user_entries SET uuid = '$uuid' WHERE int_id = '$param' AND owner_uid = " . $_SESSION['uid']); } @@ -50,7 +102,7 @@ class Share extends Plugin { $url_path .= "/public.php?op=share&key=$uuid"; print ""; /* if (!label_find_id(__('Shared'), $_SESSION["uid"])) @@ -61,6 +113,12 @@ class Share extends Plugin { print "";
+ print "";
+
+ print "";
+
print "";
diff --git a/plugins/share/notshared.png b/plugins/share/notshared.png
new file mode 100644
index 000000000..523575306
Binary files /dev/null and b/plugins/share/notshared.png differ
diff --git a/plugins/share/share.js b/plugins/share/share.js
index 6752189ea..09c973ed8 100644
--- a/plugins/share/share.js
+++ b/plugins/share/share.js
@@ -9,12 +9,79 @@ function shareArticle(id) {
id: "shareArticleDlg",
title: __("Share article by URL"),
style: "width: 600px",
+ newurl: function() {
+
+ var ok = confirm(__("Generate new share URL for this article?"));
+
+ if (ok) {
+
+ notify_progress("Trying to change URL...", true);
+
+ var query = "op=pluginhandler&plugin=share&method=newkey&id=" + param_escape(id);
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ var reply = JSON.parse(transport.responseText);
+ var new_link = reply.link;
+
+ var e = $('gen_article_url');
+
+ if (new_link) {
+
+ e.innerHTML = e.innerHTML.replace(/\&key=.*$/,
+ "&key=" + new_link);
+
+ e.href = e.href.replace(/\&key=.*$/,
+ "&key=" + new_link);
+
+ new Effect.Highlight(e);
+
+ var img = $("SHARE-IMG-" + id);
+ if (img) img.src = img.src.replace("notshared.png", "share.png");
+
+ notify('');
+
+ } else {
+ notify_error("Could not change URL.");
+ }
+ } });
+
+ }
+
+ },
+ unshare: function() {
+
+ var ok = confirm(__("Remove sharing for this article?"));
+
+ if (ok) {
+
+ notify_progress("Trying to unshare...", true);
+
+ var query = "op=pluginhandler&plugin=share&method=unshare&id=" + param_escape(id);
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ notify("Article unshared.");
+
+ var img = $("SHARE-IMG-" + id);
+ if (img) img.src = img.src.replace("share.png", "notshared.png");
+
+ dialog.hide();
+ } });
+ }
+
+ },
href: query});
dialog.show();
+ var img = $("SHARE-IMG-" + id);
+ if (img) img.src = img.src.replace("notshared.png", "share.png");
+
} catch (e) {
- exception_error("emailArticle", e);
+ exception_error("shareArticle", e);
}
}
diff --git a/plugins/share/share.png b/plugins/share/share.png
index 3b6398f4a..25eacb7c2 100644
Binary files a/plugins/share/share.png and b/plugins/share/share.png differ
diff --git a/plugins/share/share_prefs.js b/plugins/share/share_prefs.js
new file mode 100644
index 000000000..9efe291f9
--- /dev/null
+++ b/plugins/share/share_prefs.js
@@ -0,0 +1,21 @@
+function clearArticleAccessKeys() {
+
+ var ok = confirm(__("This will invalidate all previously shared article URLs. Continue?"));
+
+ if (ok) {
+ notify_progress("Clearing URLs...");
+
+ var query = "?op=pluginhandler&plugin=share&method=clearArticleKeys";
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ notify_info("Shared URLs cleared.");
+ } });
+ }
+
+ return false;
+}
+
+
+
diff --git a/plugins/shorten_expanded/init.css b/plugins/shorten_expanded/init.css
new file mode 100644
index 000000000..5e1bfa8f3
--- /dev/null
+++ b/plugins/shorten_expanded/init.css
@@ -0,0 +1,9 @@
+div.contentSizeWrapper {
+ overflow : hidden;
+ text-overflow: ellipsis;
+ height : 700px;
+}
+
+button.expandPrompt {
+ margin-top : 20px;
+}
diff --git a/plugins/shorten_expanded/init.js b/plugins/shorten_expanded/init.js
new file mode 100644
index 000000000..ba82b643b
--- /dev/null
+++ b/plugins/shorten_expanded/init.js
@@ -0,0 +1,45 @@
+var _shorten_expanded_threshold = 900; //px, longer than css height so that we would only clip articles significantly longer than limit
+
+function expandSizeWrapper(id) {
+ try {
+ var row = $(id);
+
+ console.log(row);
+
+ if (row) {
+ var content = row.select(".contentSizeWrapper")[0];
+ var link = row.select(".expandPrompt")[0];
+
+ if (content) content.removeClassName("contentSizeWrapper");
+ if (link) Element.hide(link);
+
+ }
+ } catch (e) {
+ exception_error("expandSizeWrapper", e);
+ }
+
+ return false;
+
+}
+
+dojo.addOnLoad(function() {
+ PluginHost.register(PluginHost.HOOK_ARTICLE_RENDERED_CDM, function(row) {
+ if (getInitParam('cdm_expanded')) {
+
+ window.setTimeout(function() {
+ if (row) {
+ if (row.offsetHeight >= _shorten_expanded_threshold) {
+ var content = row.select(".cdmContentInner")[0];
+
+ if (content) {
+ content.innerHTML = " "; #pane
diff --git a/plugins/vf_shared/init.php b/plugins/vf_shared/init.php
new file mode 100644
index 000000000..c7eac9659
--- /dev/null
+++ b/plugins/vf_shared/init.php
@@ -0,0 +1,60 @@
+host = $host;
+
+ $host->add_feed(-1, __("Shared articles"), 'plugins/vf_shared/share.png', $this);
+ }
+
+ function api_version() {
+ return 2;
+ }
+
+ function get_unread($feed_id) {
+ $result = db_query("select count(int_id) AS count from ttrss_user_entries where owner_uid = ".$_SESSION["uid"]." and unread = true and uuid != ''");
+
+ return db_fetch_result($result, 0, "count");
+ }
+
+ function get_total($feed_id) {
+ $result = db_query("select count(int_id) AS count from ttrss_user_entries where owner_uid = ".$_SESSION["uid"]." and uuid != ''");
+
+ return db_fetch_result($result, 0, "count");
+ }
+
+ //function queryFeedHeadlines($feed, $limit, $view_mode, $cat_view, $search, $search_mode, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false) {
+
+ function get_headlines($feed_id, $options) {
+ $qfh_ret = queryFeedHeadlines(-4,
+ $options['limit'],
+ $this->get_unread(-1) > 0 ? "adaptive" : "all_articles",
+ false,
+ $options['search'],
+ $options['search_mode'],
+ $options['override_order'],
+ $options['offset'],
+ $options['owner_uid'],
+ $options['filter'],
+ $options['since_id'],
+ $options['include_children'],
+ false,
+ "uuid != ''",
+ "ttrss_feeds.title AS feed_title,");
+
+ $qfh_ret[1] = __("Shared articles");
+
+ return $qfh_ret;
+ }
+
+}
+?>
diff --git a/plugins/vf_shared/share.png b/plugins/vf_shared/share.png
new file mode 100644
index 000000000..25eacb7c2
Binary files /dev/null and b/plugins/vf_shared/share.png differ
diff --git a/prefs.php b/prefs.php
index fcf21cf2e..cc6267798 100644
--- a/prefs.php
+++ b/prefs.php
@@ -32,15 +32,19 @@
" +
+ content.innerHTML + " ";
+
+ }
+ }
+ }
+ }, 150);
+ }
+ });
+});
diff --git a/plugins/shorten_expanded/init.php b/plugins/shorten_expanded/init.php
new file mode 100644
index 000000000..1d0c99eca
--- /dev/null
+++ b/plugins/shorten_expanded/init.php
@@ -0,0 +1,29 @@
+host = $host;
+
+ }
+
+ function get_css() {
+ return file_get_contents(__DIR__ . "/init.css");
+ }
+
+ function get_js() {
+ return file_get_contents(__DIR__ . "/init.js");
+ }
+
+ function api_version() {
+ return 2;
+ }
+
+}
+?>
diff --git a/plugins/updater/init.php b/plugins/updater/init.php
index fa283c8be..6ee018f74 100644
--- a/plugins/updater/init.php
+++ b/plugins/updater/init.php
@@ -24,6 +24,8 @@ class Updater extends Plugin {
// __FILE__ is in plugins/updater so we need to go one level up
$work_dir = dirname(dirname(dirname(__FILE__)));
$parent_dir = dirname($work_dir);
+ // Set PATH to run "which"
+ putenv('PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"');
$log = array();
if (!is_array($params)) $params = array();
@@ -61,6 +63,20 @@ class Updater extends Plugin {
putenv("PATH=" . getenv("PATH") . PATH_SEPARATOR . "/bin" .
PATH_SEPARATOR . "/usr/bin");
+ array_push($log, "Checking for system() call...");
+
+ $disabled = explode(',', ini_get('disable_functions'));
+ foreach ($disabled as $function) {
+ if ( trim($function) == 'system' ) {
+ array_push($log, "Can not execute commands with PHP's system() function.");
+ $stop = true;
+ }
+ }
+
+ if ( $stop == true ) {
+ break;
+ }
+
array_push($log, "Checking for tar...");
$system_rc = 0;
@@ -234,6 +250,7 @@ class Updater extends Plugin {
CACHE_DIR . "/images",
CACHE_DIR . "/js",
CACHE_DIR . "/simplepie",
+ CACHE_DIR . "/upload",
ICONS_DIR,
LOCK_DIRECTORY);
@@ -339,6 +356,10 @@ class Updater extends Plugin {
} else {
print_notice(__("Your Tiny Tiny RSS installation is up to date."));
+
+ print ""; + } print " |