From 3306daecf4450555961490c11e70e7cf7fe7b86e Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 11 Apr 2013 19:12:00 +0400 Subject: implement upload-related support for open_basedir --- classes/opml.php | 30 +++++++++++++++++++++++++++--- classes/pref/feeds.php | 25 +++++++++++++++++++++---- 2 files changed, 48 insertions(+), 7 deletions(-) (limited to 'classes') diff --git a/classes/opml.php b/classes/opml.php index 7a49f757c..2ecae4237 100644 --- a/classes/opml.php +++ b/classes/opml.php @@ -461,11 +461,35 @@ class Opml extends Handler_Protected { # if ($debug) $doc = DOMDocument::load("/tmp/test.opml"); - if (is_file($_FILES['opml_file']['tmp_name'])) { + if ($_FILES['opml_file']['error'] != 0) { + print_error(T_sprintf("Upload failed with error code %d", + $_FILES['opml_file']['error'])); + return; + } + + $tmp_file = false; + + if (is_uploaded_file($_FILES['opml_file']['tmp_name'])) { + $tmp_file = tempnam(CACHE_DIR . '/upload', 'opml'); + + $result = move_uploaded_file($_FILES['opml_file']['tmp_name'], + $tmp_file); + + if (!$result) { + print_error(__("Unable to move uploaded file.")); + return; + } + } else { + print_error(__('Error: please upload OPML file.')); + return; + } + + if (is_file($tmp_file)) { $doc = new DOMDocument(); - $doc->load($_FILES['opml_file']['tmp_name']); + $doc->load($tmp_file); + unlink($tmp_file); } else if (!$doc) { - print_error(__('Error: please upload OPML file.')); + print_error(__('Error: unable to find moved OPML file.')); return; } diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index 469ca1111..f57cc37d6 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -463,7 +463,7 @@ class Pref_Feeds extends Handler_Protected { WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]); if (db_num_rows($result) != 0) { - unlink(ICONS_DIR . "/$feed_id.ico"); + @unlink(ICONS_DIR . "/$feed_id.ico"); } return; @@ -472,7 +472,22 @@ class Pref_Feeds extends Handler_Protected { function uploadicon() { header("Content-type: text/html"); - $icon_file = $_FILES['icon_file']['tmp_name']; + $tmp_file = false; + + if (is_uploaded_file($_FILES['icon_file']['tmp_name'])) { + $tmp_file = tempnam(CACHE_DIR . '/upload', 'icon'); + + $result = move_uploaded_file($_FILES['icon_file']['tmp_name'], + $tmp_file); + + if (!$result) { + return; + } + } else { + return; + } + + $icon_file = $tmp_file; $feed_id = db_escape_string($this->link, $_REQUEST["feed_id"]); if (is_file($icon_file) && $feed_id) { @@ -482,8 +497,8 @@ class Pref_Feeds extends Handler_Protected { WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]); if (db_num_rows($result) != 0) { - unlink(ICONS_DIR . "/$feed_id.ico"); - move_uploaded_file($icon_file, ICONS_DIR . "/$feed_id.ico"); + @unlink(ICONS_DIR . "/$feed_id.ico"); + rename($icon_file, ICONS_DIR . "/$feed_id.ico"); $rc = 0; } else { $rc = 2; @@ -495,6 +510,8 @@ class Pref_Feeds extends Handler_Protected { $rc = 2; } + @unlink($icon_file); + print ""; -- cgit v1.2.3 From 0192ffe5a5f8254d723cf46e4bda839220191c2c Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Thu, 11 Apr 2013 16:25:37 +0100 Subject: Add new API method: `getFeedStats' `getFeedStats' calls the new static function `api_get_feed_stats' to return an array of real feeds of the following form: [{ "first" : 1127, "unread" : 873, "last" : 15460, "title" : "Some feed", "id" : 31, "total" : 1513 }] where "first", "last", "total" are the first, last and total number of articles in the feed. This adds the ability to nntp-oriented clients to efficiently retrieve an "active file" without having to resort to `getHeadlines(limit=-1)' --- classes/api.php | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index 4427834eb..6f95db0be 100644 --- a/classes/api.php +++ b/classes/api.php @@ -110,6 +110,11 @@ class API extends Handler { print $this->wrap(self::STATUS_OK, getAllCounters($this->link)); } + function getFeedStats() { + $feeds = $this->api_get_feed_stats($this->link); + print $this->wrap(self::STATUS_OK, $feeds); + } + function getFeeds() { $cat_id = db_escape_string($this->link, $_REQUEST["cat_id"]); $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]); @@ -480,6 +485,38 @@ class API extends Handler { } } + static function api_get_feed_stats($link) { + + $feeds = array(); + + $result = db_query($link, "SELECT ttrss_feeds.id, ttrss_feeds.title,". + " MIN(ttrss_entries.id) AS first, MAX(ttrss_entries.id) AS last,". + " COUNT(ttrss_entries.id) AS total". + " FROM ttrss_entries, ttrss_user_entries, ttrss_feeds". + " WHERE ttrss_user_entries.feed_id = ttrss_feeds.id". + " AND ttrss_user_entries.ref_id = ttrss_entries.id". + " AND ttrss_user_entries.owner_uid = ".$_SESSION["uid"]. + " GROUP BY ttrss_feeds.title"); + + while ($line = db_fetch_assoc($result)) { + + $unread = getFeedUnread($link, $line["id"]); + + $row = array( + "id" => (int)$line["id"], + "title" => $line["title"], + "first" => (int)$line["first"], + "last" => (int)$line["last"], + "total" => (int)$line["total"], + "unread" => (int)$unread + ); + + array_push($feeds, $row); + } + + return $feeds; +} + static function api_get_feeds($link, $cat_id, $unread_only, $limit, $offset, $include_nested = false) { $feeds = array(); -- cgit v1.2.3 From b91a1e4deb510252485044f8856d9eb178f822ae Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 11 Apr 2013 20:06:07 +0400 Subject: bump api level --- classes/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index 6f95db0be..a347237c9 100644 --- a/classes/api.php +++ b/classes/api.php @@ -2,7 +2,7 @@ class API extends Handler { - const API_LEVEL = 5; + const API_LEVEL = 6; const STATUS_OK = 0; const STATUS_ERR = 1; -- cgit v1.2.3 From e1f76af0068bd2cf5ce4a4203b7727d5b3111c04 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 11 Apr 2013 22:01:02 +0400 Subject: block listing of several util directories; deny access to config.php --- classes/.htaccess | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 classes/.htaccess (limited to 'classes') diff --git a/classes/.htaccess b/classes/.htaccess new file mode 100644 index 000000000..93169e4eb --- /dev/null +++ b/classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all -- cgit v1.2.3 From 8096a20a95cf9873ad31650521908467e719b1bb Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 12 Apr 2013 07:53:14 +0400 Subject: Revert "Add new API method: `getFeedStats'" This reverts commit 0192ffe5a5f8254d723cf46e4bda839220191c2c. --- classes/api.php | 37 ------------------------------------- 1 file changed, 37 deletions(-) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index a347237c9..aaeb86dcf 100644 --- a/classes/api.php +++ b/classes/api.php @@ -110,11 +110,6 @@ class API extends Handler { print $this->wrap(self::STATUS_OK, getAllCounters($this->link)); } - function getFeedStats() { - $feeds = $this->api_get_feed_stats($this->link); - print $this->wrap(self::STATUS_OK, $feeds); - } - function getFeeds() { $cat_id = db_escape_string($this->link, $_REQUEST["cat_id"]); $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]); @@ -485,38 +480,6 @@ class API extends Handler { } } - static function api_get_feed_stats($link) { - - $feeds = array(); - - $result = db_query($link, "SELECT ttrss_feeds.id, ttrss_feeds.title,". - " MIN(ttrss_entries.id) AS first, MAX(ttrss_entries.id) AS last,". - " COUNT(ttrss_entries.id) AS total". - " FROM ttrss_entries, ttrss_user_entries, ttrss_feeds". - " WHERE ttrss_user_entries.feed_id = ttrss_feeds.id". - " AND ttrss_user_entries.ref_id = ttrss_entries.id". - " AND ttrss_user_entries.owner_uid = ".$_SESSION["uid"]. - " GROUP BY ttrss_feeds.title"); - - while ($line = db_fetch_assoc($result)) { - - $unread = getFeedUnread($link, $line["id"]); - - $row = array( - "id" => (int)$line["id"], - "title" => $line["title"], - "first" => (int)$line["first"], - "last" => (int)$line["last"], - "total" => (int)$line["total"], - "unread" => (int)$unread - ); - - array_push($feeds, $row); - } - - return $feeds; -} - static function api_get_feeds($link, $cat_id, $unread_only, $limit, $offset, $include_nested = false) { $feeds = array(); -- cgit v1.2.3 From 79f9bef767ba0e0a35c8bf8411bb90feac35a551 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 12 Apr 2013 08:18:43 +0400 Subject: add support for plugins adding API methods --- classes/api.php | 15 +++++++++++++-- classes/pluginhost.php | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index aaeb86dcf..0fcd65eb3 100644 --- a/classes/api.php +++ b/classes/api.php @@ -464,8 +464,19 @@ class API extends Handler { } - function index() { - print $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD')); + function index($method) { + global $pluginhost; + + $plugin = $pluginhost->get_api_method(strtolower($method)); + + if ($plugin && method_exists($plugin, $method)) { + $reply = $plugin->$method(); + + print $this->wrap($reply[0], $reply[1]); + + } else { + print $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD', "method" => $method)); + } } function shareToPublished() { diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 9ae7b809e..7c6fab9a0 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -7,6 +7,7 @@ class PluginHost { private $commands = array(); private $storage = array(); private $feeds = array(); + private $api_methods = array(); private $owner_uid; private $debug; @@ -347,5 +348,14 @@ class PluginHost { return PLUGIN_FEED_BASE_INDEX - 1 + abs($feed); } + function add_api_method($name, $sender) { + if ($this->is_system($sender)) { + $this->api_methods[strtolower($name)] = $sender; + } + } + + function get_api_method($name) { + return $this->api_methods[$name]; + } } ?> -- cgit v1.2.3 From 3ab417c2775b95e5ad4896b0a2c54ef19550f4c4 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 12 Apr 2013 15:02:44 +0400 Subject: remove label gradients --- classes/feeds.php | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 6427559e1..c3b5225a1 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -9,18 +9,6 @@ class Feeds extends Handler_Protected { return array_search($method, $csrf_ignored) !== false; } - private function make_gradient($end, $class) { - $start = $class == "even" ? "#f0f0f0" : "#ffffff"; - - return "style='background: linear-gradient(left , $start 6%, $end 100%); - background: -o-linear-gradient(left , $start 6%, $end 100%); - background: -moz-linear-gradient(left , $start 6%, $end 100%); - background: -webkit-linear-gradient(left , $start 6%, $end 100%); - background: -ms-linear-gradient(left , $start 6%, $end 100%); - background: -webkit-gradient(linear, left top, right top, - color-stop(0.06, $start), color-stop(1, $end));'"; - } - private function format_headline_subtoolbar($feed_site_url, $feed_title, $feed_id, $is_cat, $search, $search_mode, $view_mode, $error) { @@ -304,7 +292,6 @@ class Feeds extends Handler_Protected { $feed_id = $line["feed_id"]; $label_cache = $line["label_cache"]; $labels = false; - $label_row_style = ""; if ($label_cache) { $label_cache = json_decode($label_cache, true); @@ -319,22 +306,6 @@ class Feeds extends Handler_Protected { if (!is_array($labels)) $labels = get_article_labels($this->link, $id); - if (count($labels) > 0) { - for ($i = 0; $i < min(4, count($labels)); $i++) { - $bg = rgb2hsl(_color_unpack($labels[$i][3])); - - if ($bg && $bg[1] > 0) { - $bg[1] = 0.1; - $bg[2] = 1; - - $bg = _color_pack(hsl2rgb($bg)); - $label_row_style = $this->make_gradient($bg, $class);; - - break; - } - } - } - $labels_str = ""; $labels_str .= format_article_labels($labels, $id); $labels_str .= ""; @@ -450,7 +421,7 @@ class Feeds extends Handler_Protected { $mouseover_attrs = "onmouseover='postMouseIn(event, $id)' onmouseout='postMouseOut($id)'"; - $reply['content'] .= "
"; + $reply['content'] .= "
"; $reply['content'] .= "
"; -- cgit v1.2.3 From 5aaae215e8bf51d56227f216d2cf80bd4266c52f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sat, 13 Apr 2013 10:59:26 +0400 Subject: api: add score to getHeadlines/getArticle --- classes/api.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index 0fcd65eb3..958256be4 100644 --- a/classes/api.php +++ b/classes/api.php @@ -307,7 +307,7 @@ class API extends Handler { $article_id = join(",", array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_id"])), is_numeric)); $query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id, - marked,unread,published, + marked,unread,published,score, ".SUBSTRING_FOR_DATE."(updated,1,16) as updated, author FROM ttrss_entries,ttrss_user_entries @@ -337,7 +337,8 @@ class API extends Handler { "updated" => (int) strtotime($line["updated"]), "content" => $line["cached_content"] != "" ? $line["cached_content"] : $line["content"], "feed_id" => $line["feed_id"], - "attachments" => $attachments + "attachments" => $attachments, + "score" => (int)$line["score"] ); global $pluginhost; @@ -694,6 +695,7 @@ 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"]; global $pluginhost; foreach ($pluginhost->get_hooks($pluginhost::HOOK_RENDER_ARTICLE_API) as $p) { -- cgit v1.2.3 From 044cff2d74ece46256201695346d1a0d1d66c746 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sat, 13 Apr 2013 18:24:27 +0400 Subject: implement basic feed authentication parameter encryption in the database (FEED_CRYPT_KEY) --- classes/pref/feeds.php | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'classes') diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index f57cc37d6..4a77ed8cf 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -528,6 +528,9 @@ class Pref_Feeds extends Handler_Protected { "SELECT * FROM ttrss_feeds WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]); + $auth_pass_encrypted = sql_bool_to_bool(db_fetch_result($result, 0, + "auth_pass_encrypted")); + $title = htmlspecialchars(db_fetch_result($result, 0, "title")); @@ -613,7 +616,14 @@ class Pref_Feeds extends Handler_Protected { placeHolder=\"".__("Login")."\" name=\"auth_login\" value=\"$auth_login\">
"; - $auth_pass = htmlspecialchars(db_fetch_result($result, 0, "auth_pass")); + $auth_pass = db_fetch_result($result, 0, "auth_pass"); + + if ($auth_pass_encrypted) { + require_once "crypt.php"; + $auth_pass = decrypt_string($auth_pass); + } + + $auth_pass = htmlspecialchars($auth_pass); print "link, $_POST["mark_unread_on_update"])); + if (strlen(FEED_CRYPT_KEY) > 0) { + require_once "crypt.php"; + $auth_pass = substr(encrypt_string($auth_pass), 0, 250); + $auth_pass_encrypted = 'true'; + } else { + $auth_pass_encrypted = 'false'; + } + if (get_pref($this->link, 'ENABLE_FEED_CATS')) { if ($cat_id && $cat_id != 0) { $category_qpart = "cat_id = '$cat_id',"; @@ -958,6 +976,7 @@ class Pref_Feeds extends Handler_Protected { purge_interval = '$purge_intl', auth_login = '$auth_login', auth_pass = '$auth_pass', + auth_pass_encrypted = $auth_pass_encrypted, private = $private, cache_images = $cache_images, hide_images = $hide_images, @@ -1003,7 +1022,8 @@ class Pref_Feeds extends Handler_Protected { break; case "auth_pass": - $qpart = "auth_pass = '$auth_pass'"; + $qpart = "auth_pass = '$auth_pass' AND + auth_pass_encrypted = $auth_pass_encrypted"; break; case "private": @@ -1841,12 +1861,20 @@ class Pref_Feeds extends Handler_Protected { "SELECT id FROM ttrss_feeds WHERE feed_url = '$feed' AND owner_uid = ".$_SESSION["uid"]); + if (strlen(FEED_CRYPT_KEY) > 0) { + require_once "crypt.php"; + $pass = substr(encrypt_string($pass), 0, 250); + $auth_pass_encrypted = 'true'; + } else { + $auth_pass_encrypted = 'false'; + } + if (db_num_rows($result) == 0) { $result = db_query($this->link, "INSERT INTO ttrss_feeds - (owner_uid,feed_url,title,cat_id,auth_login,auth_pass,update_method) + (owner_uid,feed_url,title,cat_id,auth_login,auth_pass,update_method,auth_pass_encrypted) VALUES ('".$_SESSION["uid"]."', '$feed', - '[Unknown]', $cat_qpart, '$login', '$pass', 0)"); + '[Unknown]', $cat_qpart, '$login', '$pass', 0, $auth_pass_encrypted)"); } db_query($this->link, "COMMIT"); -- cgit v1.2.3 From 41694a956d4cbe4da633a967c06908b69e942c17 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sat, 13 Apr 2013 18:58:09 +0400 Subject: fix double-escaping possible with encrypted passwords --- classes/pref/feeds.php | 8 ++++++-- classes/rpc.php | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'classes') diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index 4a77ed8cf..c57cccc44 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -932,7 +932,7 @@ class Pref_Feeds extends Handler_Protected { $feed_ids = db_escape_string($this->link, $_POST["ids"]); /* batchEditSave */ $cat_id = (int) db_escape_string($this->link, $_POST["cat_id"]); $auth_login = db_escape_string($this->link, trim($_POST["auth_login"])); - $auth_pass = db_escape_string($this->link, trim($_POST["auth_pass"])); + $auth_pass = trim($_POST["auth_pass"]); $private = checkbox_to_sql_bool(db_escape_string($this->link, $_POST["private"])); $include_in_digest = checkbox_to_sql_bool( db_escape_string($this->link, $_POST["include_in_digest"])); @@ -954,6 +954,8 @@ class Pref_Feeds extends Handler_Protected { $auth_pass_encrypted = 'false'; } + $auth_pass = db_escape_string($this->link, $auth_pass); + if (get_pref($this->link, 'ENABLE_FEED_CATS')) { if ($cat_id && $cat_id != 0) { $category_qpart = "cat_id = '$cat_id',"; @@ -1842,7 +1844,7 @@ class Pref_Feeds extends Handler_Protected { $cat_id = db_escape_string($this->link, $_REQUEST['cat']); $feeds = explode("\n", $_REQUEST['feeds']); $login = db_escape_string($this->link, $_REQUEST['login']); - $pass = db_escape_string($this->link, $_REQUEST['pass']); + $pass = trim($_REQUEST['pass']); foreach ($feeds as $feed) { $feed = db_escape_string($this->link, trim($feed)); @@ -1869,6 +1871,8 @@ class Pref_Feeds extends Handler_Protected { $auth_pass_encrypted = 'false'; } + $pass = db_escape_string($this->link, $pass); + if (db_num_rows($result) == 0) { $result = db_query($this->link, "INSERT INTO ttrss_feeds diff --git a/classes/rpc.php b/classes/rpc.php index 508dd8d41..1569a9a35 100644 --- a/classes/rpc.php +++ b/classes/rpc.php @@ -104,7 +104,7 @@ class RPC extends Handler_Protected { $feed = db_escape_string($this->link, $_REQUEST['feed']); $cat = db_escape_string($this->link, $_REQUEST['cat']); $login = db_escape_string($this->link, $_REQUEST['login']); - $pass = db_escape_string($this->link, $_REQUEST['pass']); + $pass = trim($_REQUEST['pass']); // escaped later $rc = subscribe_to_feed($this->link, $feed, $cat, $login, $pass); -- cgit v1.2.3 From 884f2aee91b18080938f862a980c3a9b2b95484f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 12:57:52 +0400 Subject: use mdash as a separator between title and author --- classes/feeds.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index c3b5225a1..2f8dcb5ec 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -385,7 +385,7 @@ class Feeds extends Handler_Protected { $entry_author = $line["author"]; if ($entry_author) { - $entry_author = " - $entry_author"; + $entry_author = " — $entry_author"; } $has_feed_icon = feed_has_icon($feed_id); -- cgit v1.2.3 From e43a9c4a01bf095b740e35711c79f6a0ca3374ba Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 13:16:14 +0400 Subject: add a %d articles selected element --- classes/feeds.php | 1 + 1 file changed, 1 insertion(+) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 2f8dcb5ec..c7b7a83e6 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -49,6 +49,7 @@ class Feeds extends Handler_Protected { // right part $reply .= ""; + $reply .= ""; $reply .= ""; if ($feed_site_url) { -- cgit v1.2.3 From 2cfbb448fb197837c063c377c042beb3ba704a52 Mon Sep 17 00:00:00 2001 From: moontear Date: Mon, 15 Apr 2013 12:28:52 +0200 Subject: Added average color calculation of feeds' favicons for banded display. --- classes/feeds.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index c7b7a83e6..64d1d8786 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -528,8 +528,9 @@ class Feeds extends Handler_Protected { $reply['content'] .= "
"; - $reply['content'] .= "
"; - + //setting feed headline background color, needs to change text color based on dark/light + $favColor = explode("|", $line['favicon_avg_color']); + $reply['content'] .= "
"; $reply['content'] .= "
"; $reply['content'] .= " Date: Mon, 15 Apr 2013 15:17:12 +0400 Subject: only enable colored favicons in vfeeds; fix RGB triplet packing --- classes/feeds.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 64d1d8786..22c3497d4 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -529,8 +529,8 @@ class Feeds extends Handler_Protected { id=\"RROW-$id\" $mouseover_attrs'>"; //setting feed headline background color, needs to change text color based on dark/light - $favColor = explode("|", $line['favicon_avg_color']); - $reply['content'] .= "
"; + $fav_color = $line['favicon_avg_color']; + $reply['content'] .= "
"; $reply['content'] .= "
"; $reply['content'] .= " Date: Mon, 15 Apr 2013 15:27:35 +0400 Subject: implement basic moz gradient for feedicon color --- classes/feeds.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 22c3497d4..07cc427a9 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -150,6 +150,8 @@ class Feeds extends Handler_Protected { $reply = array(); + $rgba_cache = array(); + $timing_info = microtime(true); $topmost_article_ids = array(); @@ -530,7 +532,22 @@ class Feeds extends Handler_Protected { //setting feed headline background color, needs to change text color based on dark/light $fav_color = $line['favicon_avg_color']; - $reply['content'] .= "
"; + + require_once "colors.php"; + + if ($fav_color) { + if (!isset($rgba_cache[$feed_id])) + $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color)); + + $rgba = $rgba_cache[$feed_id]; + + $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 95%"; + + } else { + $row_background = ""; + } + + $reply['content'] .= "
"; $reply['content'] .= "
"; $reply['content'] .= " Date: Mon, 15 Apr 2013 15:34:47 +0400 Subject: use w3c gradient definition --- classes/feeds.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 07cc427a9..10877bad5 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -541,7 +541,13 @@ class Feeds extends Handler_Protected { $rgba = $rgba_cache[$feed_id]; - $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 95%"; + // W3C definition seems to work in FF and Chrome + $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; + + /* $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);". + "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; + "background-image : -webkit-gradient(linear, left top, right top, color-stop( 50%, rgba(255,255,255,0)), + color-stop(100%, rgba($rgba, 0.2)));"; */ } else { $row_background = ""; -- cgit v1.2.3 From bfaf90e364e883790af2b354cfbb9db250a5a516 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 15:38:05 +0400 Subject: add row backgrounds in normal mode --- classes/feeds.php | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 10877bad5..79edca5d9 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -401,6 +401,28 @@ class Feeds extends Handler_Protected { $entry_site_url = $line["site_url"]; + //setting feed headline background color, needs to change text color based on dark/light + $fav_color = $line['favicon_avg_color']; + + require_once "colors.php"; + + if ($fav_color) { + if (!isset($rgba_cache[$feed_id])) + $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color)); + + $rgba = $rgba_cache[$feed_id]; + + // W3C definition seems to work in FF and Chrome + $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; + + /* $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);". + "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; + "background-image : -webkit-gradient(linear, left top, right top, color-stop( 50%, rgba(255,255,255,0)), + color-stop(100%, rgba($rgba, 0.2)));"; */ + } else { + $row_background = ""; + } + if (!get_pref($this->link, 'COMBINED_DISPLAY_MODE')) { if (get_pref($this->link, 'VFEED_GROUP_BY_FEED')) { @@ -424,7 +446,7 @@ class Feeds extends Handler_Protected { $mouseover_attrs = "onmouseover='postMouseIn(event, $id)' onmouseout='postMouseOut($id)'"; - $reply['content'] .= "
"; + $reply['content'] .= "
"; $reply['content'] .= "
"; @@ -530,29 +552,6 @@ class Feeds extends Handler_Protected { $reply['content'] .= "
"; - //setting feed headline background color, needs to change text color based on dark/light - $fav_color = $line['favicon_avg_color']; - - require_once "colors.php"; - - if ($fav_color) { - if (!isset($rgba_cache[$feed_id])) - $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color)); - - $rgba = $rgba_cache[$feed_id]; - - // W3C definition seems to work in FF and Chrome - $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; - - /* $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);". - "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; - "background-image : -webkit-gradient(linear, left top, right top, color-stop( 50%, rgba(255,255,255,0)), - color-stop(100%, rgba($rgba, 0.2)));"; */ - - } else { - $row_background = ""; - } - $reply['content'] .= "
"; $reply['content'] .= "
"; -- cgit v1.2.3 From e7480cc13b55162510001b5b9d91af289606a9f1 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 15:56:08 +0400 Subject: do not color predominantly white/black rows --- classes/feeds.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 79edca5d9..81729aacc 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -407,13 +407,22 @@ class Feeds extends Handler_Protected { require_once "colors.php"; if ($fav_color) { - if (!isset($rgba_cache[$feed_id])) - $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color)); + if (!isset($rgba_cache[$feed_id])) { + $hsl = rgb2hsl(_color_unpack($fav_color)); + + if ($hsl[1] < 0.1) + $hsl[2] = 1; + else if ($hsl[2] < 0.25) + $hsl[2] = 0.25; + + $rgba_cache[$feed_id] = join(",", hsl2rgb($hsl)); + + } $rgba = $rgba_cache[$feed_id]; // W3C definition seems to work in FF and Chrome - $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; + $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba($rgba, 0.3) 100%);"; /* $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);". "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; -- cgit v1.2.3 From 12a6bd28ace16ff20f1f920831cffe1041b36d5c Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 17:07:06 +0400 Subject: remove hsl stuff from classes/feeds, we take care of this when choosing the color --- classes/feeds.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 81729aacc..6d15c99e8 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -408,15 +408,7 @@ class Feeds extends Handler_Protected { if ($fav_color) { if (!isset($rgba_cache[$feed_id])) { - $hsl = rgb2hsl(_color_unpack($fav_color)); - - if ($hsl[1] < 0.1) - $hsl[2] = 1; - else if ($hsl[2] < 0.25) - $hsl[2] = 0.25; - - $rgba_cache[$feed_id] = join(",", hsl2rgb($hsl)); - + $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color)); } $rgba = $rgba_cache[$feed_id]; -- cgit v1.2.3 From 86f7d2a9f2b6468a34b20d7a26c7cfc3afbe00ee Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 18:09:48 +0400 Subject: make gradient less visible on read headlines --- classes/feeds.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 6d15c99e8..6ee5bad0b 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -413,8 +413,13 @@ class Feeds extends Handler_Protected { $rgba = $rgba_cache[$feed_id]; + if (sql_bool_to_bool($line["unread"])) + $endalpha = '0.3'; + else + $endalpha = '0.1'; + // W3C definition seems to work in FF and Chrome - $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba($rgba, 0.3) 100%);"; + $row_background = "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba($rgba, $endalpha) 100%);"; /* $row_background = "background-image : -moz-linear-gradient(left, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);". "background-image : linear-gradient(to right, rgba(255, 255, 255, 0) 50%, rgba($rgba, 0.2) 100%);"; -- cgit v1.2.3 From bc7a144dd589302025c3b024d6da71f2e53d6496 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 18:22:48 +0400 Subject: properly remove and replace favicon color when favicon gets manually removed/uploaded --- classes/pref/feeds.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index c57cccc44..c5d6245fe 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -464,6 +464,9 @@ class Pref_Feeds extends Handler_Protected { if (db_num_rows($result) != 0) { @unlink(ICONS_DIR . "/$feed_id.ico"); + + db_query($this->link, "UPDATE ttrss_feeds SET favicon_avg_color = NULL + where id = '$feed_id'"); } return; @@ -498,8 +501,19 @@ class Pref_Feeds extends Handler_Protected { if (db_num_rows($result) != 0) { @unlink(ICONS_DIR . "/$feed_id.ico"); - rename($icon_file, ICONS_DIR . "/$feed_id.ico"); - $rc = 0; + if (rename($icon_file, ICONS_DIR . "/$feed_id.ico")) { + + require_once "colors.php"; + + $favicon_color = db_escape_string($this->link, + calculate_avg_color(ICONS_DIR . "/$feed_id.ico")); + + db_query($this->link, "UPDATE ttrss_feeds SET + favicon_avg_color = '$favicon_color' + WHERE id = '$feed_id'"); + + $rc = 0; + } } else { $rc = 2; } -- cgit v1.2.3 From 5e3d5480f7e154a897363770327001fe1b72f504 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 19:28:11 +0400 Subject: use hashed guids in a hopefully backwards compatible fashion --- classes/article.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/article.php b/classes/article.php index 9a0970140..f31a225d1 100644 --- a/classes/article.php +++ b/classes/article.php @@ -88,7 +88,7 @@ class Article extends Handler_Protected { static function create_published_article($link, $title, $url, $content, $labels_str, $owner_uid) { - $guid = sha1($url . $owner_uid); // include owner_uid to prevent global GUID clash + $guid = 'SHA1:' . sha1("ttshared:" . $url . $owner_uid); // include owner_uid to prevent global GUID clash $content_hash = sha1($content); if ($labels_str != "") { -- cgit v1.2.3 From 40fe2d73821788e7c202191dc7b94b025585d338 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 15:44:38 +0400 Subject: remove js-based player, better mp3 support detection for html5 audio --- classes/rpc.php | 1 + 1 file changed, 1 insertion(+) (limited to 'classes') diff --git a/classes/rpc.php b/classes/rpc.php index 1569a9a35..b6d552868 100644 --- a/classes/rpc.php +++ b/classes/rpc.php @@ -334,6 +334,7 @@ class RPC extends Handler_Protected { function sanityCheck() { $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true"; $_SESSION["hasSandbox"] = $_REQUEST["hasSandbox"] === "true"; + $_SESSION["hasMp3"] = $_REQUEST["hasMp3"] === "true"; $reply = array(); -- cgit v1.2.3 From b9863a153c4a9295c3ddd214c1c1d21aa4807221 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 16:40:04 +0400 Subject: unify SMTP_HOST and SMTP_PORT as SMTP_SERVER --- classes/ttrssmailer.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'classes') diff --git a/classes/ttrssmailer.php b/classes/ttrssmailer.php index 1eb9f1d3a..1f365c22e 100644 --- a/classes/ttrssmailer.php +++ b/classes/ttrssmailer.php @@ -25,17 +25,20 @@ class ttrssMailer extends PHPMailer { function __construct() { $this->SetLanguage("en", "lib/phpmailer/language/"); - //if SMTP_HOST is specified, use SMTP to send mail directly + if (SMTP_HOST) { - $Host = SMTP_HOST; + $pair = explode(":", SMTP_HOST, 2); $Mailer = "smtp"; + + $Host = $pair[0]; + $Port = $pair[1]; + + if (!$Port) $Port = 25; + } else { + $Host = ''; + $Port = ''; } - //if SMTP_PORT is specified, assign it. Otherwise default to port 25 - if(SMTP_PORT){ - $Port = SMTP_PORT; - }else{ - $Port = "25"; - } + //if SMTP_LOGIN is specified, set credentials and enable auth if(SMTP_LOGIN){ -- cgit v1.2.3 From 90df27a4c12d3be57744d0bb4cde048ff3174591 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 16:43:15 +0400 Subject: ttrssMailer: fix typo --- classes/ttrssmailer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/ttrssmailer.php b/classes/ttrssmailer.php index 1f365c22e..54d180620 100644 --- a/classes/ttrssmailer.php +++ b/classes/ttrssmailer.php @@ -26,8 +26,8 @@ class ttrssMailer extends PHPMailer { function __construct() { $this->SetLanguage("en", "lib/phpmailer/language/"); - if (SMTP_HOST) { - $pair = explode(":", SMTP_HOST, 2); + if (SMTP_SERVER) { + $pair = explode(":", SMTP_SERVER, 2); $Mailer = "smtp"; $Host = $pair[0]; -- cgit v1.2.3 From 4f032700dbfbbfa35798e05497c8a868eb73476f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 16:50:22 +0400 Subject: ttrssMailer: actually use OOP properly --- classes/ttrssmailer.php | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'classes') diff --git a/classes/ttrssmailer.php b/classes/ttrssmailer.php index 54d180620..fd7f969aa 100644 --- a/classes/ttrssmailer.php +++ b/classes/ttrssmailer.php @@ -17,34 +17,29 @@ class ttrssMailer extends PHPMailer { public $CharSet = "UTF-8"; public $PluginDir = "lib/phpmailer/"; public $ContentType = "text/html"; //default email type is HTML - public $Host; - public $Port; - public $SMTPAuth=False; - public $Username; - public $Password; function __construct() { $this->SetLanguage("en", "lib/phpmailer/language/"); if (SMTP_SERVER) { $pair = explode(":", SMTP_SERVER, 2); - $Mailer = "smtp"; + $this->Mailer = "smtp"; - $Host = $pair[0]; - $Port = $pair[1]; + $this->Host = $pair[0]; + $this->Port = $pair[1]; if (!$Port) $Port = 25; } else { - $Host = ''; - $Port = ''; + $this->Host = ''; + $this->Port = ''; } //if SMTP_LOGIN is specified, set credentials and enable auth if(SMTP_LOGIN){ - $SMTPAuth = true; - $Username = SMTP_LOGIN; - $Password = SMTP_PASSWORD; + $this->SMTPAuth = true; + $this->Username = SMTP_LOGIN; + $this->Password = SMTP_PASSWORD; } } /* @brief a simple mail function to send email using the defaults -- cgit v1.2.3 From 889a5f9f195309df5842f142986b3166212d8a58 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 19:41:31 +0400 Subject: experimental SQL-based error logger --- classes/logger.php | 24 ++++++++++++++++++++++++ classes/logger/sql.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 classes/logger.php create mode 100644 classes/logger/sql.php (limited to 'classes') diff --git a/classes/logger.php b/classes/logger.php new file mode 100644 index 000000000..6370e1425 --- /dev/null +++ b/classes/logger.php @@ -0,0 +1,24 @@ + 'E_WARNING', + 8 => 'E_NOTICE', + 256 => 'E_USER_ERROR', + 512 => 'E_USER_WARNING', + 1024 => 'E_USER_NOTICE', + 2048 => 'E_STRICT', + 4096 => 'E_RECOVERABLE_ERROR', + 8192 => 'E_DEPRECATED', + 16384 => 'E_USER_DEPRECATED', + 32767 => 'E_ALL'); + + function log_error($errno, $errstr, $file, $line, $context) { + return false; + } + + function log($string) { + return false; + } +} +?> diff --git a/classes/logger/sql.php b/classes/logger/sql.php new file mode 100644 index 000000000..7ee22844e --- /dev/null +++ b/classes/logger/sql.php @@ -0,0 +1,35 @@ +link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); + } + + function log_error($errno, $errstr, $file, $line, $context) { + + if ($errno == E_NOTICE) return false; + + if ($this->link) { + $errno = db_escape_string($this->link, $errno); + $errstr = db_escape_string($this->link, $errstr); + $file = db_escape_string($this->link, $file); + $line = db_escape_string($this->link, $line); + $context = db_escape_string($this->link, json_encode($context)); + + $owner_uid = $_SESSION["uid"] ? $_SESSION["uid"] : "NULL"; + + $result = db_query($this->link, + "INSERT INTO ttrss_error_log + (errno, errstr, filename, lineno, context, owner_uid, created_at) VALUES + ($errno, '$errstr', '$file', '$line', '$context', $owner_uid, NOW())"); + + return db_affected_rows($this->link, $result) != 0; + + } + return false; + } + +} +?> -- cgit v1.2.3 From 4e53956addb597d99a76d10d302ab56faad88bf8 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 20:16:15 +0400 Subject: implement error log viewer --- classes/logger.php | 3 ++- classes/logger/sql.php | 3 ++- classes/pref/prefs.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/logger.php b/classes/logger.php index 6370e1425..e0ca37363 100644 --- a/classes/logger.php +++ b/classes/logger.php @@ -1,7 +1,8 @@ 'E_ERROR', 2 => 'E_WARNING', 8 => 'E_NOTICE', 256 => 'E_USER_ERROR', diff --git a/classes/logger/sql.php b/classes/logger/sql.php index 7ee22844e..a478e8928 100644 --- a/classes/logger/sql.php +++ b/classes/logger/sql.php @@ -16,7 +16,8 @@ class Logger_SQL { $errstr = db_escape_string($this->link, $errstr); $file = db_escape_string($this->link, $file); $line = db_escape_string($this->link, $line); - $context = db_escape_string($this->link, json_encode($context)); + $context = ''; // backtrace is a lot of data which is not really critical to store + //$context = db_escape_string($this->link, serialize($context)); $owner_uid = $_SESSION["uid"] ? $_SESSION["uid"] : "NULL"; diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index 29541e04d..c6d41c15b 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -723,6 +723,51 @@ class Pref_Prefs extends Handler_Protected { print "
"; #pane + if ($_SESSION["access_level"] == 10) { + + print "
"; + print "

".__("Error Log")."

"; + + $result = db_query($this->link, "SELECT errno, errstr, filename, lineno, + created_at, login FROM ttrss_error_log + LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id) + ORDER BY ttrss_error_log.id DESC + LIMIT 100"); + + print "

"; + + print " + + + + + + "; + + while ($line = db_fetch_assoc($result)) { + print ""; + + foreach ($line as $k => $v) { + $line[$k] = htmlspecialchars($v); + } + + print ""; + print ""; + print ""; + print ""; + + print ""; + + print ""; + } + + print "
".__("Error")."".__("Filename")."".__("Message")."".__("User")."".__("Date")."
" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")" . $line["filename"] . ":" . $line["lineno"] . "" . $line["errstr"] . "" . + make_local_datetime($this->link, + $line["created_at"], false) . "
"; + + print "

"; + } + print "
"; print "

".__("Plugins")."

"; -- cgit v1.2.3 From b8c7f8357d4858ec1bf42bd8c990413ce75dd080 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 20:20:38 +0400 Subject: do not try to load plugins which aren't directories --- classes/pluginhost.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'classes') diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 7c6fab9a0..bbfa2ca2a 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -103,6 +103,9 @@ class PluginHost { foreach ($plugins as $class) { $class = trim($class); $class_file = strtolower(basename($class)); + + if (!is_dir(dirname(__FILE__)."/../plugins/$class_file")) continue; + $file = dirname(__FILE__)."/../plugins/$class_file/init.php"; if (!isset($this->plugins[$class])) { -- cgit v1.2.3 From e2261e177bc9f5308185d91783ca128000c6fd87 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 20:34:20 +0400 Subject: implement old log entry purging in update_daemon_common; add some more error types; tweak error log display --- classes/logger.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'classes') diff --git a/classes/logger.php b/classes/logger.php index e0ca37363..3c501eb92 100644 --- a/classes/logger.php +++ b/classes/logger.php @@ -4,7 +4,12 @@ class Logger { public static $errornames = array( 1 => 'E_ERROR', 2 => 'E_WARNING', + 4 => 'E_PARSE', 8 => 'E_NOTICE', + 16 => 'E_CORE_ERROR', + 32 => 'E_CORE_WARNING', + 64 => 'E_COMPILE_ERROR', + 128 => 'E_COMPILE_WARNING', 256 => 'E_USER_ERROR', 512 => 'E_USER_WARNING', 1024 => 'E_USER_NOTICE', -- cgit v1.2.3 From a5680acbe86c0e01295f9f3a475f6ae0e7e1bdb0 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 20:40:23 +0400 Subject: replace split with explode --- classes/pref/feeds.php | 8 ++++---- classes/pref/filters.php | 2 +- classes/pref/labels.php | 6 +++--- classes/pref/users.php | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) (limited to 'classes') diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index c5d6245fe..9dc515556 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -1097,7 +1097,7 @@ class Pref_Feeds extends Handler_Protected { function remove() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { Pref_Feeds::remove_feed($this->link, $id, $_SESSION["uid"]); @@ -1114,7 +1114,7 @@ class Pref_Feeds extends Handler_Protected { function rescore() { require_once "rssfuncs.php"; - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { @@ -1220,7 +1220,7 @@ class Pref_Feeds extends Handler_Protected { } function categorize() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); $cat_id = db_escape_string($this->link, $_REQUEST["cat_id"]); @@ -1244,7 +1244,7 @@ class Pref_Feeds extends Handler_Protected { } function removeCat() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { $this->remove_feed_category($this->link, $id, $_SESSION["uid"]); } diff --git a/classes/pref/filters.php b/classes/pref/filters.php index 4be1cdae5..586626dd7 100644 --- a/classes/pref/filters.php +++ b/classes/pref/filters.php @@ -482,7 +482,7 @@ class Pref_Filters extends Handler_Protected { function remove() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { db_query($this->link, "DELETE FROM ttrss_filters2 WHERE id = '$id' AND owner_uid = ". $_SESSION["uid"]); diff --git a/classes/pref/labels.php b/classes/pref/labels.php index b45354c94..15fa7b20b 100644 --- a/classes/pref/labels.php +++ b/classes/pref/labels.php @@ -119,7 +119,7 @@ class Pref_Labels extends Handler_Protected { function colorset() { $kind = db_escape_string($this->link, $_REQUEST["kind"]); - $ids = split(',', db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(',', db_escape_string($this->link, $_REQUEST["ids"])); $color = db_escape_string($this->link, $_REQUEST["color"]); $fg = db_escape_string($this->link, $_REQUEST["fg"]); $bg = db_escape_string($this->link, $_REQUEST["bg"]); @@ -149,7 +149,7 @@ class Pref_Labels extends Handler_Protected { } function colorreset() { - $ids = split(',', db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(',', db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { db_query($this->link, "UPDATE ttrss_labels2 SET @@ -213,7 +213,7 @@ class Pref_Labels extends Handler_Protected { function remove() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { label_remove($this->link, $id, $_SESSION["uid"]); diff --git a/classes/pref/users.php b/classes/pref/users.php index 891a69a52..bd2fff735 100644 --- a/classes/pref/users.php +++ b/classes/pref/users.php @@ -202,7 +202,7 @@ class Pref_Users extends Handler_Protected { } function remove() { - $ids = split(",", db_escape_string($this->link, $_REQUEST["ids"])); + $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); foreach ($ids as $id) { if ($id != $_SESSION["uid"] && $id != 1) { @@ -367,7 +367,7 @@ class Pref_Users extends Handler_Protected { if ($user_search) { - $user_search = split(" ", $user_search); + $user_search = explode(" ", $user_search); $tokens = array(); foreach ($user_search as $token) { -- cgit v1.2.3 From 9deca86d96ba34253f05a4c5d5f1e48c543062be Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 16 Apr 2013 21:07:26 +0400 Subject: require entering current one time code to enable otp --- classes/pref/prefs.php | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'classes') diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index c6d41c15b..dcd83ae26 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -399,8 +399,8 @@ class Pref_Prefs extends Handler_Protected { parameters: dojo.objectToQuery(this.getValues()), onComplete: function(transport) { notify(''); - if (transport.responseText.indexOf('ERROR: ') == 0) { - notify_error(transport.responseText.replace('ERROR: ', '')); + if (transport.responseText.indexOf('ERROR:') == 0) { + notify_error(transport.responseText.replace('ERROR:', '')); } else { window.location.reload(); } @@ -416,11 +416,13 @@ class Pref_Prefs extends Handler_Protected { print ""; - print ""; + print "".__("Enter the generated one time password").""; + + print ""; - print " "; - print ""; + print ""; print ""; @@ -957,22 +959,39 @@ class Pref_Prefs extends Handler_Protected { } function otpenable() { - $password = db_escape_string($this->link, $_REQUEST["password"]); - $enable_otp = $_REQUEST["enable_otp"] == "on"; + require_once "lib/otphp/vendor/base32.php"; + require_once "lib/otphp/lib/otp.php"; + require_once "lib/otphp/lib/totp.php"; + + $password = $_REQUEST["password"]; + $otp = $_REQUEST["otp"]; global $pluginhost; $authenticator = $pluginhost->get_plugin($_SESSION["auth_module"]); if ($authenticator->check_password($_SESSION["uid"], $password)) { - if ($enable_otp) { + $result = db_query($this->link, "SELECT salt + FROM ttrss_users + WHERE id = ".$_SESSION["uid"]); + + $base32 = new Base32(); + + $secret = $base32->encode(sha1(db_fetch_result($result, 0, "salt"))); + $topt = new \OTPHP\TOTP($secret); + + $otp_check = $topt->now(); + + if ($otp == $otp_check) { db_query($this->link, "UPDATE ttrss_users SET otp_enabled = true WHERE id = " . $_SESSION["uid"]); print "OK"; + } else { + print "ERROR:".__("Incorrect one time password"); } } else { - print "ERROR: ".__("Incorrect password"); + print "ERROR:".__("Incorrect password"); } } -- cgit v1.2.3 From 2cbdc95bb00faad46df8976cf9b33e1bc188ec91 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 17 Apr 2013 08:42:39 +0400 Subject: add a separate tab for the logger --- classes/pref/prefs.php | 45 ---------------------------- classes/pref/system.php | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 45 deletions(-) create mode 100644 classes/pref/system.php (limited to 'classes') diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index dcd83ae26..2f316b48b 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -725,51 +725,6 @@ class Pref_Prefs extends Handler_Protected { print "
"; #pane - if ($_SESSION["access_level"] == 10) { - - print "
"; - print "

".__("Error Log")."

"; - - $result = db_query($this->link, "SELECT errno, errstr, filename, lineno, - created_at, login FROM ttrss_error_log - LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id) - ORDER BY ttrss_error_log.id DESC - LIMIT 100"); - - print "

"; - - print " - - - - - - "; - - while ($line = db_fetch_assoc($result)) { - print ""; - - foreach ($line as $k => $v) { - $line[$k] = htmlspecialchars($v); - } - - print ""; - print ""; - print ""; - print ""; - - print ""; - - print ""; - } - - print "
".__("Error")."".__("Filename")."".__("Message")."".__("User")."".__("Date")."
" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")" . $line["filename"] . ":" . $line["lineno"] . "" . $line["errstr"] . "" . - make_local_datetime($this->link, - $line["created_at"], false) . "
"; - - print "

"; - } - print "
"; print "

".__("Plugins")."

"; diff --git a/classes/pref/system.php b/classes/pref/system.php new file mode 100644 index 000000000..2957b7b96 --- /dev/null +++ b/classes/pref/system.php @@ -0,0 +1,78 @@ +"; + print "
"; + + $result = db_query($this->link, "SELECT errno, errstr, filename, lineno, + created_at, login FROM ttrss_error_log + LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id) + ORDER BY ttrss_error_log.id DESC + LIMIT 100"); + + print "

"; + + print " + + + + + + "; + + while ($line = db_fetch_assoc($result)) { + print ""; + + foreach ($line as $k => $v) { + $line[$k] = htmlspecialchars($v); + } + + print ""; + print ""; + print ""; + print ""; + + print ""; + + print ""; + } + + print "
".__("Error")."".__("Filename")."".__("Message")."".__("User")."".__("Date")."
" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")" . $line["filename"] . ":" . $line["lineno"] . "" . $line["errstr"] . "" . + make_local_datetime($this->link, + $line["created_at"], false) . "
"; + + print "

"; + + global $pluginhost; + $pluginhost->run_hooks($pluginhost::HOOK_PREFS_TAB, + "hook_prefs_tab", "prefSystem"); + + print "
"; #container + } + +} +?> -- cgit v1.2.3 From 9594791782bb9adbf29018c444ea427fbaeb5ee4 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 17 Apr 2013 13:08:36 +0400 Subject: experimental singleton-based Db connection --- classes/db.php | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ classes/db/mysql.php | 59 ++++++++++++++++++++++++++++++++++++++++ classes/db/pgsql.php | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ classes/idb.php | 13 +++++++++ classes/logger/sql.php | 20 +++++--------- 5 files changed, 225 insertions(+), 13 deletions(-) create mode 100644 classes/db.php create mode 100644 classes/db/mysql.php create mode 100644 classes/db/pgsql.php create mode 100644 classes/idb.php (limited to 'classes') diff --git a/classes/db.php b/classes/db.php new file mode 100644 index 000000000..403cbc93a --- /dev/null +++ b/classes/db.php @@ -0,0 +1,73 @@ +adapter = new Db_Mysql(); + break; + case "pgsql": + $this->adapter = new Db_Pgsql(); + break; + default: + die("Unknown DB_TYPE: " . DB_TYPE); + } + + $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); + } + + private function __clone() { + // + } + + public static function get() { + if (self::$instance == null) + self::$instance = new self(); + + return self::$instance; + } + + static function quote($str){ + return("'$str'"); + } + + function connect($host, $user, $pass, $db, $port) { + //return $this->adapter->connect($host, $user, $pass, $db, $port); + } + + function escape_string($s, $strip_tags = true) { + return $this->adapter->escape_string($s, $strip_tags); + } + + function query($query, $die_on_error = true) { + return $this->adapter->query($query, $die_on_error); + } + + function fetch_assoc($result) { + return $this->adapter->fetch_assoc($result); + } + + function num_rows($result) { + return $this->adapter->num_rows($result); + } + + function fetch_result($result, $row, $param) { + return $this->adapter->fetch_result($result, $row, $param); + } + + function close() { + return $this->adapter->close(); + } + + function affected_rows($result) { + return $this->adapter->affected_rows($result); + } + + function last_error() { + return $this->adapter->last_error(); + } + +} +?> diff --git a/classes/db/mysql.php b/classes/db/mysql.php new file mode 100644 index 000000000..512ea3894 --- /dev/null +++ b/classes/db/mysql.php @@ -0,0 +1,59 @@ +link = mysql_connect($host, $user, $pass); + if ($this->link) { + $result = mysql_select_db($db, $this->link); + if (!$result) { + die("Can't select DB: " . mysql_error($this->link)); + } + return $this->link; + } else { + die("Unable to connect to database (as $user to $host, database $db): " . mysql_error()); + } + } + + function escape_string($s, $strip_tags = true) { + return mysql_real_escape_string($s, $this->link); + } + + function query($query, $die_on_error = true) { + $result = mysql_query($query, $this->link); + if (!$result) { + $query = htmlspecialchars($query); + if ($die_on_error) { + die("Query $query failed: " . ($this->link ? mysql_error($link) : "No connection")); + } + } + return $result; + } + + function fetch_assoc($result) { + return mysql_fetch_assoc($result); + } + + + function num_rows($result) { + return mysql_num_rows($result); + } + + function fetch_result($result, $row, $param) { + return mysql_result($result, $row, $param); + } + + function close() { + return mysql_close($this->link); + } + + function affected_rows($result) { + return mysql_affected_rows($this->link); + } + + function last_error() { + return mysql_affected_rows($this->link); + } + +} +?> diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php new file mode 100644 index 000000000..87c2abefd --- /dev/null +++ b/classes/db/pgsql.php @@ -0,0 +1,73 @@ + 0) { + $string = "$string port=" . $port; + } + + $this->link = pg_connect($string); + + if (!$this->link) { + die("Unable to connect to database (as $user to $host, database $db):" . pg_last_error()); + } + + return $this->link; + } + + function escape_string($s, $strip_tags = true) { + if ($strip_tags) $s = strip_tags($s); + + return pg_escape_string($this->link, $s); + } + + function query($query, $die_on_error = true) { + $result = pg_query($this->link, $query); + + if (!$result) { + $query = htmlspecialchars($query); // just in case + if ($die_on_error) { + die("Query $query failed [$result]: " . ($this->link ? pg_last_error($this->link) : "No connection")); + } + } + return $result; + } + + function fetch_assoc($result) { + return pg_fetch_assoc($result); + } + + + function num_rows($result) { + return pg_num_rows($result); + } + + function fetch_result($result, $row, $param) { + return pg_fetch_result($result, $row, $param); + } + + function close() { + return pg_close($this->link); + } + + function affected_rows($result) { + return pg_affected_rows($result); + } + + function last_error() { + return pg_last_error($this->link); + } + +} +?> diff --git a/classes/idb.php b/classes/idb.php new file mode 100644 index 000000000..16f760bf6 --- /dev/null +++ b/classes/idb.php @@ -0,0 +1,13 @@ + diff --git a/classes/logger/sql.php b/classes/logger/sql.php index a478e8928..c45841600 100644 --- a/classes/logger/sql.php +++ b/classes/logger/sql.php @@ -1,32 +1,26 @@ link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); - } - function log_error($errno, $errstr, $file, $line, $context) { if ($errno == E_NOTICE) return false; - if ($this->link) { - $errno = db_escape_string($this->link, $errno); - $errstr = db_escape_string($this->link, $errstr); - $file = db_escape_string($this->link, $file); - $line = db_escape_string($this->link, $line); + if (Db::get()) { + $errno = Db::get()->escape_string($errno); + $errstr = Db::get()->escape_string($errstr); + $file = Db::get()->escape_string($file); + $line = Db::get()->escape_string($line); $context = ''; // backtrace is a lot of data which is not really critical to store //$context = db_escape_string($this->link, serialize($context)); $owner_uid = $_SESSION["uid"] ? $_SESSION["uid"] : "NULL"; - $result = db_query($this->link, + $result = Db::get()->query( "INSERT INTO ttrss_error_log (errno, errstr, filename, lineno, context, owner_uid, created_at) VALUES ($errno, '$errstr', '$file', '$line', '$context', $owner_uid, NOW())"); - return db_affected_rows($this->link, $result) != 0; + return Db::get()->affected_rows($result) != 0; } return false; -- cgit v1.2.3 From ba68b6815ab31d17cda113e7990eeb07558b02a9 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 17 Apr 2013 14:23:35 +0400 Subject: db updates, remove init_connection() --- classes/db.php | 5 +++++ classes/db/mysql.php | 10 ++++++++++ classes/db/pgsql.php | 8 ++++++++ classes/idb.php | 1 + 4 files changed, 24 insertions(+) (limited to 'classes') diff --git a/classes/db.php b/classes/db.php index 403cbc93a..71fc01ae1 100644 --- a/classes/db.php +++ b/classes/db.php @@ -16,6 +16,7 @@ class Db implements IDb { } $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); + $this->adapter->init(); } private function __clone() { @@ -33,6 +34,10 @@ class Db implements IDb { return("'$str'"); } + function init() { + // + } + function connect($host, $user, $pass, $db, $port) { //return $this->adapter->connect($host, $user, $pass, $db, $port); } diff --git a/classes/db/mysql.php b/classes/db/mysql.php index 512ea3894..fa97dcff1 100644 --- a/classes/db/mysql.php +++ b/classes/db/mysql.php @@ -55,5 +55,15 @@ class Db_Mysql implements IDb { return mysql_affected_rows($this->link); } + function init() { + $this->query("SET time_zone = '+0:0'"); + + if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) { + $this->query("SET NAMES " . MYSQL_CHARSET); + } + + return true; + } + } ?> diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php index 87c2abefd..c9ec33887 100644 --- a/classes/db/pgsql.php +++ b/classes/db/pgsql.php @@ -69,5 +69,13 @@ class Db_Pgsql implements IDb { return pg_last_error($this->link); } + function init() { + $this->query("set client_encoding = 'UTF-8'"); + pg_set_client_encoding("UNICODE"); + $this->query("set datestyle = 'ISO, european'"); + $this->query("set TIME ZONE 0"); + + return true; + } } ?> diff --git a/classes/idb.php b/classes/idb.php index 16f760bf6..1ca6925b4 100644 --- a/classes/idb.php +++ b/classes/idb.php @@ -1,6 +1,7 @@ Date: Wed, 17 Apr 2013 15:36:34 +0400 Subject: more work on singleton-based DB --- classes/db.php | 8 +++-- classes/db/mysql.php | 3 ++ classes/db/pgsql.php | 2 ++ classes/sessionhandler.php | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 classes/sessionhandler.php (limited to 'classes') diff --git a/classes/db.php b/classes/db.php index 71fc01ae1..558d3e6b7 100644 --- a/classes/db.php +++ b/classes/db.php @@ -2,6 +2,7 @@ class Db implements IDb { private static $instance; private $adapter; + private $link; private function __construct() { switch (DB_TYPE) { @@ -12,11 +13,11 @@ class Db implements IDb { $this->adapter = new Db_Pgsql(); break; default: - die("Unknown DB_TYPE: " . DB_TYPE); + user_error("Unknown DB_TYPE: " . DB_TYPE); } - $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); - $this->adapter->init(); + $this->link = $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); + } private function __clone() { @@ -40,6 +41,7 @@ class Db implements IDb { function connect($host, $user, $pass, $db, $port) { //return $this->adapter->connect($host, $user, $pass, $db, $port); + return $this->link; } function escape_string($s, $strip_tags = true) { diff --git a/classes/db/mysql.php b/classes/db/mysql.php index fa97dcff1..64c35ebdc 100644 --- a/classes/db/mysql.php +++ b/classes/db/mysql.php @@ -9,6 +9,9 @@ class Db_Mysql implements IDb { if (!$result) { die("Can't select DB: " . mysql_error($this->link)); } + + $this->init(); + return $this->link; } else { die("Unable to connect to database (as $user to $host, database $db): " . mysql_error()); diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php index c9ec33887..0f38fb8cb 100644 --- a/classes/db/pgsql.php +++ b/classes/db/pgsql.php @@ -23,6 +23,8 @@ class Db_Pgsql implements IDb { die("Unable to connect to database (as $user to $host, database $db):" . pg_last_error()); } + $this->init(); + return $this->link; } diff --git a/classes/sessionhandler.php b/classes/sessionhandler.php new file mode 100644 index 000000000..66d8dd86c --- /dev/null +++ b/classes/sessionhandler.php @@ -0,0 +1,73 @@ +db = Db::get(); + + session_set_save_handler("SessionHandler::open", "SessionHandler::close", + "SessionHandler::read", "SessionHandler::write", "SessionHandler::destroy", + "SessionHandler::gc"); + } + + public static function open($save_path, $name) { } + + + public static function read ($id){ + + $query = "SELECT data FROM ttrss_sessions WHERE id='$id'"; + + $res = $this->db->query("SELECT data FROM ttrss_sessions WHERE id='$id'"); + + if ($this->db->num_rows($res) != 1) { + + "INSERT INTO ttrss_sessions (id, data, expire) + VALUES ('$id', '$data', '$expire')"; + + + + } else { + $data = $this->db->fetch_result($res, 0, "data"); + return base64_decode($data); + } + + } + + public static function write($id, $data) { + if (! $data) { + return false; + } + + $data = $this->db->escape_string( base64_encode($data), false); + + $expire = time() + max(SESSION_COOKIE_LIFETIME, 86400); + + $query = "UPDATE ttrss_sessions SET data='$data', + expire = '$expire' WHERE id='$id'"; + + $this->db->query( $query); + return true; + } + + public static function close () { } + + public static function destroy($session_id) { + $this->db->query("DELETE FROM ttrss_sessions WHERE id = '$session_id'"); + return true; + } + + public static function gc($maxLifeTime) { + $this->db->query("DELETE FROM ttrss_sessions WHERE expire < " time() - $maxLifeTime); + return true; + } + +} +?> -- cgit v1.2.3 From aca75cb5cb323535099c7aef46a78ea3cec082f2 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 17 Apr 2013 16:05:52 +0400 Subject: reinstate error handlers; better DB error reporting on failed queries --- classes/db.php | 7 +------ classes/db/mysql.php | 6 ++---- classes/db/pgsql.php | 5 ++--- classes/idb.php | 1 - classes/logger/sql.php | 3 ++- 5 files changed, 7 insertions(+), 15 deletions(-) (limited to 'classes') diff --git a/classes/db.php b/classes/db.php index 558d3e6b7..c3b627096 100644 --- a/classes/db.php +++ b/classes/db.php @@ -13,11 +13,10 @@ class Db implements IDb { $this->adapter = new Db_Pgsql(); break; default: - user_error("Unknown DB_TYPE: " . DB_TYPE); + die("Unknown DB_TYPE: " . DB_TYPE); } $this->link = $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); - } private function __clone() { @@ -35,10 +34,6 @@ class Db implements IDb { return("'$str'"); } - function init() { - // - } - function connect($host, $user, $pass, $db, $port) { //return $this->adapter->connect($host, $user, $pass, $db, $port); return $this->link; diff --git a/classes/db/mysql.php b/classes/db/mysql.php index 64c35ebdc..241d2a063 100644 --- a/classes/db/mysql.php +++ b/classes/db/mysql.php @@ -25,10 +25,8 @@ class Db_Mysql implements IDb { function query($query, $die_on_error = true) { $result = mysql_query($query, $this->link); if (!$result) { - $query = htmlspecialchars($query); - if ($die_on_error) { - die("Query $query failed: " . ($this->link ? mysql_error($link) : "No connection")); - } + user_error("Query $query failed: " . ($this->link ? mysql_error($this->link) : "No connection"), + $die_on_error ? E_USER_ERROR : E_USER_WARNING); } return $result; } diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php index 0f38fb8cb..bafd54ab2 100644 --- a/classes/db/pgsql.php +++ b/classes/db/pgsql.php @@ -39,9 +39,8 @@ class Db_Pgsql implements IDb { if (!$result) { $query = htmlspecialchars($query); // just in case - if ($die_on_error) { - die("Query $query failed [$result]: " . ($this->link ? pg_last_error($this->link) : "No connection")); - } + user_error("Query $query failed: " . ($this->link ? pg_last_error($this->link) : "No connection"), + $die_on_error ? E_USER_ERROR : E_USER_WARNING); } return $result; } diff --git a/classes/idb.php b/classes/idb.php index 1ca6925b4..16f760bf6 100644 --- a/classes/idb.php +++ b/classes/idb.php @@ -1,7 +1,6 @@ escape_string($errno); $errstr = Db::get()->escape_string($errstr); $file = Db::get()->escape_string($file); @@ -21,8 +22,8 @@ class Logger_SQL { ($errno, '$errstr', '$file', '$line', '$context', $owner_uid, NOW())"); return Db::get()->affected_rows($result) != 0; - } + return false; } -- cgit v1.2.3 From 6322ac79a020ab584d412d782d62b2ee77d7c6cf Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 17 Apr 2013 16:23:15 +0400 Subject: remove $link --- classes/api.php | 180 ++++++++++++++-------------- classes/article.php | 104 ++++++++-------- classes/auth/base.php | 14 +-- classes/backend.php | 6 +- classes/db.php | 2 +- classes/db/pgsql.php | 4 +- classes/dbupdater.php | 16 +-- classes/dlg.php | 20 ++-- classes/feeds.php | 134 ++++++++++----------- classes/handler.php | 6 +- classes/handler/public.php | 140 +++++++++++----------- classes/logger/sql.php | 2 +- classes/opml.php | 102 ++++++++-------- classes/plugin.php | 4 +- classes/pluginhost.php | 31 +++-- classes/pref/feeds.php | 290 ++++++++++++++++++++++----------------------- classes/pref/filters.php | 132 ++++++++++----------- classes/pref/labels.php | 66 +++++------ classes/pref/prefs.php | 56 ++++----- classes/pref/system.php | 8 +- classes/pref/users.php | 54 ++++----- classes/rpc.php | 224 +++++++++++++++++----------------- 22 files changed, 795 insertions(+), 800 deletions(-) (limited to 'classes') diff --git a/classes/api.php b/classes/api.php index 958256be4..10e511919 100644 --- a/classes/api.php +++ b/classes/api.php @@ -18,7 +18,7 @@ class API extends Handler { return false; } - if ($_SESSION["uid"] && $method != "logout" && !get_pref($this->link, 'ENABLE_API_ACCESS')) { + if ($_SESSION["uid"] && $method != "logout" && !get_pref( 'ENABLE_API_ACCESS')) { print $this->wrap(self::STATUS_ERR, array("error" => 'API_DISABLED')); return false; } @@ -50,13 +50,13 @@ class API extends Handler { @session_destroy(); @session_start(); - $login = db_escape_string($this->link, $_REQUEST["user"]); + $login = db_escape_string( $_REQUEST["user"]); $password = $_REQUEST["password"]; $password_base64 = base64_decode($_REQUEST["password"]); if (SINGLE_USER_MODE) $login = "admin"; - $result = db_query($this->link, "SELECT id FROM ttrss_users WHERE login = '$login'"); + $result = db_query( "SELECT id FROM ttrss_users WHERE login = '$login'"); if (db_num_rows($result) != 0) { $uid = db_fetch_result($result, 0, "id"); @@ -69,11 +69,11 @@ class API extends Handler { return; } - if (get_pref($this->link, "ENABLE_API_ACCESS", $uid)) { - if (authenticate_user($this->link, $login, $password)) { // try login with normal password + if (get_pref( "ENABLE_API_ACCESS", $uid)) { + if (authenticate_user( $login, $password)) { // try login with normal password print $this->wrap(self::STATUS_OK, array("session_id" => session_id(), "api_level" => self::API_LEVEL)); - } else if (authenticate_user($this->link, $login, $password_base64)) { // else try with base64_decoded password + } else if (authenticate_user( $login, $password_base64)) { // else try with base64_decoded password print $this->wrap(self::STATUS_OK, array("session_id" => session_id(), "api_level" => self::API_LEVEL)); } else { // else we are not logged in @@ -95,29 +95,29 @@ class API extends Handler { } function getUnread() { - $feed_id = db_escape_string($this->link, $_REQUEST["feed_id"]); - $is_cat = db_escape_string($this->link, $_REQUEST["is_cat"]); + $feed_id = db_escape_string( $_REQUEST["feed_id"]); + $is_cat = db_escape_string( $_REQUEST["is_cat"]); if ($feed_id) { - print $this->wrap(self::STATUS_OK, array("unread" => getFeedUnread($this->link, $feed_id, $is_cat))); + print $this->wrap(self::STATUS_OK, array("unread" => getFeedUnread( $feed_id, $is_cat))); } else { - print $this->wrap(self::STATUS_OK, array("unread" => getGlobalUnread($this->link))); + print $this->wrap(self::STATUS_OK, array("unread" => getGlobalUnread())); } } /* Method added for ttrss-reader for Android */ function getCounters() { - print $this->wrap(self::STATUS_OK, getAllCounters($this->link)); + print $this->wrap(self::STATUS_OK, getAllCounters()); } function getFeeds() { - $cat_id = db_escape_string($this->link, $_REQUEST["cat_id"]); + $cat_id = db_escape_string( $_REQUEST["cat_id"]); $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]); - $limit = (int) db_escape_string($this->link, $_REQUEST["limit"]); - $offset = (int) db_escape_string($this->link, $_REQUEST["offset"]); + $limit = (int) db_escape_string( $_REQUEST["limit"]); + $offset = (int) db_escape_string( $_REQUEST["offset"]); $include_nested = sql_bool_to_bool($_REQUEST["include_nested"]); - $feeds = $this->api_get_feeds($this->link, $cat_id, $unread_only, $limit, $offset, $include_nested); + $feeds = $this->api_get_feeds( $cat_id, $unread_only, $limit, $offset, $include_nested); print $this->wrap(self::STATUS_OK, $feeds); } @@ -134,7 +134,7 @@ class API extends Handler { else $nested_qpart = "true"; - $result = db_query($this->link, "SELECT + $result = db_query( "SELECT id, title, order_id, (SELECT COUNT(id) FROM ttrss_feeds WHERE ttrss_feed_categories.id IS NOT NULL AND cat_id = ttrss_feed_categories.id) AS num_feeds, @@ -149,10 +149,10 @@ class API extends Handler { while ($line = db_fetch_assoc($result)) { if ($include_empty || $line["num_feeds"] > 0 || $line["num_cats"] > 0) { - $unread = getFeedUnread($this->link, $line["id"], true); + $unread = getFeedUnread( $line["id"], true); if ($enable_nested) - $unread += getCategoryChildrenUnread($this->link, $line["id"]); + $unread += getCategoryChildrenUnread( $line["id"]); if ($unread || !$unread_only) { array_push($cats, array("id" => $line["id"], @@ -166,11 +166,11 @@ class API extends Handler { foreach (array(-2,-1,0) as $cat_id) { if ($include_empty || !$this->isCategoryEmpty($cat_id)) { - $unread = getFeedUnread($this->link, $cat_id, true); + $unread = getFeedUnread( $cat_id, true); if ($unread || !$unread_only) { array_push($cats, array("id" => $cat_id, - "title" => getCategoryTitle($this->link, $cat_id), + "title" => getCategoryTitle( $cat_id), "unread" => $unread)); } } @@ -180,22 +180,22 @@ class API extends Handler { } function getHeadlines() { - $feed_id = db_escape_string($this->link, $_REQUEST["feed_id"]); + $feed_id = db_escape_string( $_REQUEST["feed_id"]); if ($feed_id != "") { - $limit = (int)db_escape_string($this->link, $_REQUEST["limit"]); + $limit = (int)db_escape_string( $_REQUEST["limit"]); if (!$limit || $limit >= 60) $limit = 60; - $offset = (int)db_escape_string($this->link, $_REQUEST["skip"]); - $filter = db_escape_string($this->link, $_REQUEST["filter"]); + $offset = (int)db_escape_string( $_REQUEST["skip"]); + $filter = db_escape_string( $_REQUEST["filter"]); $is_cat = sql_bool_to_bool($_REQUEST["is_cat"]); $show_excerpt = sql_bool_to_bool($_REQUEST["show_excerpt"]); $show_content = sql_bool_to_bool($_REQUEST["show_content"]); /* all_articles, unread, adaptive, marked, updated */ - $view_mode = db_escape_string($this->link, $_REQUEST["view_mode"]); + $view_mode = db_escape_string( $_REQUEST["view_mode"]); $include_attachments = sql_bool_to_bool($_REQUEST["include_attachments"]); - $since_id = (int)db_escape_string($this->link, $_REQUEST["since_id"]); + $since_id = (int)db_escape_string( $_REQUEST["since_id"]); $include_nested = sql_bool_to_bool($_REQUEST["include_nested"]); $sanitize_content = true; @@ -211,10 +211,10 @@ class API extends Handler { /* do not rely on params below */ - $search = db_escape_string($this->link, $_REQUEST["search"]); - $search_mode = db_escape_string($this->link, $_REQUEST["search_mode"]); + $search = db_escape_string( $_REQUEST["search"]); + $search_mode = db_escape_string( $_REQUEST["search_mode"]); - $headlines = $this->api_get_headlines($this->link, $feed_id, $limit, $offset, + $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); @@ -226,10 +226,10 @@ class API extends Handler { } function updateArticle() { - $article_ids = array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_ids"])), is_numeric); - $mode = (int) db_escape_string($this->link, $_REQUEST["mode"]); - $data = db_escape_string($this->link, $_REQUEST["data"]); - $field_raw = (int)db_escape_string($this->link, $_REQUEST["field"]); + $article_ids = array_filter(explode(",", db_escape_string( $_REQUEST["article_ids"])), is_numeric); + $mode = (int) db_escape_string( $_REQUEST["mode"]); + $data = db_escape_string( $_REQUEST["data"]); + $field_raw = (int)db_escape_string( $_REQUEST["field"]); $field = ""; $set_to = ""; @@ -269,16 +269,16 @@ class API extends Handler { $article_ids = join(", ", $article_ids); - $result = db_query($this->link, "UPDATE ttrss_user_entries SET $field = $set_to $additional_fields WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]); + $result = db_query( "UPDATE ttrss_user_entries SET $field = $set_to $additional_fields WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]); - $num_updated = db_affected_rows($this->link, $result); + $num_updated = db_affected_rows( $result); if ($num_updated > 0 && $field == "unread") { - $result = db_query($this->link, "SELECT DISTINCT feed_id FROM ttrss_user_entries + $result = db_query( "SELECT DISTINCT feed_id FROM ttrss_user_entries WHERE ref_id IN ($article_ids)"); while ($line = db_fetch_assoc($result)) { - ccache_update($this->link, $line["feed_id"], $_SESSION["uid"]); + ccache_update( $line["feed_id"], $_SESSION["uid"]); } } @@ -286,7 +286,7 @@ class API extends Handler { if (PUBSUBHUBBUB_HUB) { $rss_link = get_self_url_prefix() . "/public.php?op=rss&id=-2&key=" . - get_feed_access_key($this->link, -2, false); + get_feed_access_key( -2, false); $p = new Publisher(PUBSUBHUBBUB_HUB); $pubsub_result = $p->publish_update($rss_link); @@ -304,7 +304,7 @@ class API extends Handler { function getArticle() { - $article_id = join(",", array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_id"])), is_numeric)); + $article_id = join(",", array_filter(explode(",", db_escape_string( $_REQUEST["article_id"])), is_numeric)); $query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id, marked,unread,published,score, @@ -314,7 +314,7 @@ class API extends Handler { WHERE id IN ($article_id) AND ref_id = id AND owner_uid = " . $_SESSION["uid"] ; - $result = db_query($this->link, $query); + $result = db_query( $query); $articles = array(); @@ -322,13 +322,13 @@ class API extends Handler { while ($line = db_fetch_assoc($result)) { - $attachments = get_article_enclosures($this->link, $line['id']); + $attachments = get_article_enclosures( $line['id']); $article = array( "id" => $line["id"], "title" => $line["title"], "link" => $line["link"], - "labels" => get_article_labels($this->link, $line['id']), + "labels" => get_article_labels( $line['id']), "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), @@ -363,7 +363,7 @@ class API extends Handler { $config["daemon_is_running"] = file_is_locked("update_daemon.lock"); - $result = db_query($this->link, "SELECT COUNT(*) AS cf FROM + $result = db_query( "SELECT COUNT(*) AS cf FROM ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]); $num_feeds = db_fetch_result($result, 0, "cf"); @@ -376,41 +376,41 @@ class API extends Handler { function updateFeed() { require_once "include/rssfuncs.php"; - $feed_id = (int) db_escape_string($this->link, $_REQUEST["feed_id"]); + $feed_id = (int) db_escape_string( $_REQUEST["feed_id"]); - update_rss_feed($this->link, $feed_id, true); + update_rss_feed( $feed_id, true); print $this->wrap(self::STATUS_OK, array("status" => "OK")); } function catchupFeed() { - $feed_id = db_escape_string($this->link, $_REQUEST["feed_id"]); - $is_cat = db_escape_string($this->link, $_REQUEST["is_cat"]); + $feed_id = db_escape_string( $_REQUEST["feed_id"]); + $is_cat = db_escape_string( $_REQUEST["is_cat"]); - catchup_feed($this->link, $feed_id, $is_cat); + catchup_feed( $feed_id, $is_cat); print $this->wrap(self::STATUS_OK, array("status" => "OK")); } function getPref() { - $pref_name = db_escape_string($this->link, $_REQUEST["pref_name"]); + $pref_name = db_escape_string( $_REQUEST["pref_name"]); - print $this->wrap(self::STATUS_OK, array("value" => get_pref($this->link, $pref_name))); + print $this->wrap(self::STATUS_OK, array("value" => get_pref( $pref_name))); } function getLabels() { - //$article_ids = array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_ids"])), is_numeric); + //$article_ids = array_filter(explode(",", db_escape_string( $_REQUEST["article_ids"])), is_numeric); $article_id = (int)$_REQUEST['article_id']; $rv = array(); - $result = db_query($this->link, "SELECT id, caption, fg_color, bg_color + $result = db_query( "SELECT id, caption, fg_color, bg_color FROM ttrss_labels2 WHERE owner_uid = '".$_SESSION['uid']."' ORDER BY caption"); if ($article_id) - $article_labels = get_article_labels($this->link, $article_id); + $article_labels = get_article_labels( $article_id); else $article_labels = array(); @@ -437,11 +437,11 @@ class API extends Handler { function setArticleLabel() { - $article_ids = array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_ids"])), is_numeric); - $label_id = (int) db_escape_string($this->link, $_REQUEST['label_id']); - $assign = (bool) db_escape_string($this->link, $_REQUEST['assign']) == "true"; + $article_ids = array_filter(explode(",", db_escape_string( $_REQUEST["article_ids"])), is_numeric); + $label_id = (int) db_escape_string( $_REQUEST['label_id']); + $assign = (bool) db_escape_string( $_REQUEST['assign']) == "true"; - $label = db_escape_string($this->link, label_find_caption($this->link, + $label = db_escape_string( label_find_caption( $label_id, $_SESSION["uid"])); $num_updated = 0; @@ -451,9 +451,9 @@ class API extends Handler { foreach ($article_ids as $id) { if ($assign) - label_add_article($this->link, $id, $label, $_SESSION["uid"]); + label_add_article( $id, $label, $_SESSION["uid"]); else - label_remove_article($this->link, $id, $label, $_SESSION["uid"]); + label_remove_article( $id, $label, $_SESSION["uid"]); ++$num_updated; @@ -481,25 +481,25 @@ class API extends Handler { } function shareToPublished() { - $title = db_escape_string($this->link, strip_tags($_REQUEST["title"])); - $url = db_escape_string($this->link, strip_tags($_REQUEST["url"])); - $content = db_escape_string($this->link, strip_tags($_REQUEST["content"])); + $title = db_escape_string( strip_tags($_REQUEST["title"])); + $url = db_escape_string( strip_tags($_REQUEST["url"])); + $content = db_escape_string( strip_tags($_REQUEST["content"])); - if (Article::create_published_article($this->link, $title, $url, $content, "", $_SESSION["uid"])) { + if (Article::create_published_article( $title, $url, $content, "", $_SESSION["uid"])) { print $this->wrap(self::STATUS_OK, array("status" => 'OK')); } else { print $this->wrap(self::STATUS_ERR, array("error" => 'Publishing failed')); } } - static function api_get_feeds($link, $cat_id, $unread_only, $limit, $offset, $include_nested = false) { + static function api_get_feeds( $cat_id, $unread_only, $limit, $offset, $include_nested = false) { $feeds = array(); /* Labels */ if ($cat_id == -4 || $cat_id == -2) { - $counters = getLabelCounters($link, true); + $counters = getLabelCounters( true); foreach (array_values($counters) as $cv) { @@ -523,10 +523,10 @@ class API extends Handler { if ($cat_id == -4 || $cat_id == -1) { foreach (array(-1, -2, -3, -4, -6, 0) as $i) { - $unread = getFeedUnread($link, $i); + $unread = getFeedUnread( $i); if ($unread || !$unread_only) { - $title = getFeedTitle($link, $i); + $title = getFeedTitle( $i); $row = array( "id" => $i, @@ -543,14 +543,14 @@ class API extends Handler { /* Child cats */ if ($include_nested && $cat_id) { - $result = db_query($link, "SELECT + $result = db_query( "SELECT id, title FROM ttrss_feed_categories WHERE parent_cat = '$cat_id' AND owner_uid = " . $_SESSION["uid"] . " ORDER BY id, title"); while ($line = db_fetch_assoc($result)) { - $unread = getFeedUnread($link, $line["id"], true) + - getCategoryChildrenUnread($link, $line["id"]); + $unread = getFeedUnread( $line["id"], true) + + getCategoryChildrenUnread( $line["id"]); if ($unread || !$unread_only) { $row = array( @@ -573,7 +573,7 @@ class API extends Handler { } if ($cat_id == -4 || $cat_id == -3) { - $result = db_query($link, "SELECT + $result = db_query( "SELECT id, feed_url, cat_id, title, order_id, ". SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated FROM ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] . @@ -585,7 +585,7 @@ class API extends Handler { else $cat_qpart = "cat_id IS NULL"; - $result = db_query($link, "SELECT + $result = db_query( "SELECT id, feed_url, cat_id, title, order_id, ". SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated FROM ttrss_feeds WHERE @@ -595,7 +595,7 @@ class API extends Handler { while ($line = db_fetch_assoc($result)) { - $unread = getFeedUnread($link, $line["id"]); + $unread = getFeedUnread( $line["id"]); $has_icon = feed_has_icon($line['id']); @@ -619,13 +619,13 @@ class API extends Handler { return $feeds; } - static function api_get_headlines($link, $feed_id, $limit, $offset, + static function api_get_headlines( $feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, $include_attachments, $since_id, $search = "", $search_mode = "", $include_nested = false, $sanitize_content = true) { - $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit, + $qfh_ret = queryFeedHeadlines( $feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, $order, $offset, 0, false, $since_id, $include_nested); @@ -641,8 +641,8 @@ class API extends Handler { $tags = explode(",", $line["tag_cache"]); $labels = json_decode($line["label_cache"], true); - //if (!$tags) $tags = get_article_tags($link, $line["id"]); - //if (!$labels) $labels = get_article_labels($link, $line["id"]); + //if (!$tags) $tags = get_article_tags( $line["id"]); + //if (!$labels) $labels = get_article_labels( $line["id"]); $headline_row = array( "id" => (int)$line["id"], @@ -658,7 +658,7 @@ class API extends Handler { ); if ($include_attachments) - $headline_row['attachments'] = get_article_enclosures($link, + $headline_row['attachments'] = get_article_enclosures( $line['id']); if ($show_excerpt) { @@ -673,7 +673,7 @@ class API extends Handler { } if ($sanitize_content) { - $headline_row["content"] = sanitize($link, + $headline_row["content"] = sanitize( $line["content_preview"], sql_bool_to_bool($line['hide_images']), false, $line["site_url"]); @@ -709,13 +709,13 @@ class API extends Handler { } function unsubscribeFeed() { - $feed_id = (int) db_escape_string($this->link, $_REQUEST["feed_id"]); + $feed_id = (int) db_escape_string( $_REQUEST["feed_id"]); - $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE + $result = db_query( "SELECT id FROM ttrss_feeds WHERE id = '$feed_id' AND owner_uid = ".$_SESSION["uid"]); if (db_num_rows($result) != 0) { - Pref_Feeds::remove_feed($this->link, $feed_id, $_SESSION["uid"]); + Pref_Feeds::remove_feed( $feed_id, $_SESSION["uid"]); print $this->wrap(self::STATUS_OK, array("status" => "OK")); } else { print $this->wrap(self::STATUS_ERR, array("error" => "FEED_NOT_FOUND")); @@ -723,13 +723,13 @@ class API extends Handler { } function subscribeToFeed() { - $feed_url = db_escape_string($this->link, $_REQUEST["feed_url"]); - $category_id = (int) db_escape_string($this->link, $_REQUEST["category_id"]); - $login = db_escape_string($this->link, $_REQUEST["login"]); - $password = db_escape_string($this->link, $_REQUEST["password"]); + $feed_url = db_escape_string( $_REQUEST["feed_url"]); + $category_id = (int) db_escape_string( $_REQUEST["category_id"]); + $login = db_escape_string( $_REQUEST["login"]); + $password = db_escape_string( $_REQUEST["password"]); if ($feed_url) { - $rc = subscribe_to_feed($this->link, $feed_url, $category_id, + $rc = subscribe_to_feed( $feed_url, $category_id, $login, $password, false); print $this->wrap(self::STATUS_OK, array("status" => $rc)); @@ -741,7 +741,7 @@ class API extends Handler { function getFeedTree() { $include_empty = sql_bool_to_bool($_REQUEST['include_empty']); - $pf = new Pref_Feeds($this->link, $_REQUEST); + $pf = new Pref_Feeds( $_REQUEST); $_REQUEST['mode'] = 2; $_REQUEST['force_show_empty'] = $include_empty; @@ -760,13 +760,13 @@ class API extends Handler { private function isCategoryEmpty($id) { if ($id == -2) { - $result = db_query($this->link, "SELECT COUNT(*) AS count FROM ttrss_labels2 + $result = db_query( "SELECT COUNT(*) AS count FROM ttrss_labels2 WHERE owner_uid = " . $_SESSION["uid"]); return db_fetch_result($result, 0, "count") == 0; } else if ($id == 0) { - $result = db_query($this->link, "SELECT COUNT(*) AS count FROM ttrss_feeds + $result = db_query( "SELECT COUNT(*) AS count FROM ttrss_feeds WHERE cat_id IS NULL AND owner_uid = " . $_SESSION["uid"]); return db_fetch_result($result, 0, "count") == 0; diff --git a/classes/article.php b/classes/article.php index f31a225d1..9917d4d06 100644 --- a/classes/article.php +++ b/classes/article.php @@ -8,9 +8,9 @@ class Article extends Handler_Protected { } function redirect() { - $id = db_escape_string($this->link, $_REQUEST['id']); + $id = db_escape_string( $_REQUEST['id']); - $result = db_query($this->link, "SELECT link FROM ttrss_entries, ttrss_user_entries + $result = db_query( "SELECT link FROM ttrss_entries, ttrss_user_entries WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."' LIMIT 1"); @@ -27,10 +27,10 @@ class Article extends Handler_Protected { } function view() { - $id = db_escape_string($this->link, $_REQUEST["id"]); - $cids = explode(",", db_escape_string($this->link, $_REQUEST["cids"])); - $mode = db_escape_string($this->link, $_REQUEST["mode"]); - $omode = db_escape_string($this->link, $_REQUEST["omode"]); + $id = db_escape_string( $_REQUEST["id"]); + $cids = explode(",", db_escape_string( $_REQUEST["cids"])); + $mode = db_escape_string( $_REQUEST["mode"]); + $omode = db_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) @@ -38,26 +38,26 @@ class Article extends Handler_Protected { $articles = array(); if ($mode == "") { - array_push($articles, format_article($this->link, $id, false)); + array_push($articles, format_article( $id, false)); } else if ($mode == "zoom") { - array_push($articles, format_article($this->link, $id, true, true)); + array_push($articles, format_article( $id, true, true)); } else if ($mode == "raw") { if ($_REQUEST['html']) { header("Content-Type: text/html"); print ''; } - $article = format_article($this->link, $id, false); + $article = format_article( $id, false); print $article['content']; return; } - $this->catchupArticleById($this->link, $id, 0); + $this->catchupArticleById( $id, 0); if (!$_SESSION["bw_limit"]) { foreach ($cids as $cid) { if ($cid) { - array_push($articles, format_article($this->link, $cid, false, false)); + array_push($articles, format_article( $cid, false, false)); } } } @@ -65,27 +65,27 @@ class Article extends Handler_Protected { print json_encode($articles); } - private function catchupArticleById($link, $id, $cmode) { + private function catchupArticleById( $id, $cmode) { if ($cmode == 0) { - db_query($link, "UPDATE ttrss_user_entries SET + db_query( "UPDATE ttrss_user_entries SET unread = false,last_read = NOW() WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); } else if ($cmode == 1) { - db_query($link, "UPDATE ttrss_user_entries SET + db_query( "UPDATE ttrss_user_entries SET unread = true WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); } else { - db_query($link, "UPDATE ttrss_user_entries SET + db_query( "UPDATE ttrss_user_entries SET unread = NOT unread,last_read = NOW() WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); } - $feed_id = getArticleFeed($link, $id); - ccache_update($link, $feed_id, $_SESSION["uid"]); + $feed_id = getArticleFeed( $id); + ccache_update( $feed_id, $_SESSION["uid"]); } - static function create_published_article($link, $title, $url, $content, $labels_str, + static function create_published_article( $title, $url, $content, $labels_str, $owner_uid) { $guid = 'SHA1:' . sha1("ttshared:" . $url . $owner_uid); // include owner_uid to prevent global GUID clash @@ -104,30 +104,30 @@ class Article extends Handler_Protected { if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) return false; - db_query($link, "BEGIN"); + db_query( "BEGIN"); // only check for our user data here, others might have shared this with different content etc - $result = db_query($link, "SELECT id FROM ttrss_entries, ttrss_user_entries WHERE + $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"); if (db_num_rows($result) != 0) { $ref_id = db_fetch_result($result, 0, "id"); - $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE + $result = db_query( "SELECT int_id FROM ttrss_user_entries WHERE ref_id = '$ref_id' AND owner_uid = '$owner_uid' LIMIT 1"); if (db_num_rows($result) != 0) { $int_id = db_fetch_result($result, 0, "int_id"); - db_query($link, "UPDATE ttrss_entries SET + db_query( "UPDATE ttrss_entries SET content = '$content', content_hash = '$content_hash' WHERE id = '$ref_id'"); - db_query($link, "UPDATE ttrss_user_entries SET published = true, + db_query( "UPDATE ttrss_user_entries SET published = true, last_published = NOW() WHERE int_id = '$int_id' AND owner_uid = '$owner_uid'"); } else { - db_query($link, "INSERT INTO ttrss_user_entries + db_query( "INSERT INTO ttrss_user_entries (ref_id, uuid, feed_id, orig_feed_id, owner_uid, published, tag_cache, label_cache, last_read, note, unread, last_published) VALUES @@ -136,24 +136,24 @@ class Article extends Handler_Protected { if (count($labels) != 0) { foreach ($labels as $label) { - label_add_article($link, $ref_id, trim($label), $owner_uid); + label_add_article( $ref_id, trim($label), $owner_uid); } } $rc = true; } else { - $result = db_query($link, "INSERT INTO ttrss_entries + $result = db_query( "INSERT INTO ttrss_entries (title, guid, link, updated, content, content_hash, date_entered, date_updated) VALUES ('$title', '$guid', '$url', NOW(), '$content', '$content_hash', NOW(), NOW())"); - $result = db_query($link, "SELECT id FROM ttrss_entries WHERE guid = '$guid'"); + $result = db_query( "SELECT id FROM ttrss_entries WHERE guid = '$guid'"); if (db_num_rows($result) != 0) { $ref_id = db_fetch_result($result, 0, "id"); - db_query($link, "INSERT INTO ttrss_user_entries + db_query( "INSERT INTO ttrss_user_entries (ref_id, uuid, feed_id, orig_feed_id, owner_uid, published, tag_cache, label_cache, last_read, note, unread, last_published) VALUES @@ -161,7 +161,7 @@ class Article extends Handler_Protected { if (count($labels) != 0) { foreach ($labels as $label) { - label_add_article($link, $ref_id, trim($label), $owner_uid); + label_add_article( $ref_id, trim($label), $owner_uid); } } @@ -169,7 +169,7 @@ class Article extends Handler_Protected { } } - db_query($link, "COMMIT"); + db_query( "COMMIT"); return $rc; } @@ -178,9 +178,9 @@ class Article extends Handler_Protected { print __("Tags for this article (separated by commas):")."
"; - $param = db_escape_string($this->link, $_REQUEST['param']); + $param = db_escape_string( $_REQUEST['param']); - $tags = get_article_tags($this->link, db_escape_string($this->link, $param)); + $tags = get_article_tags( db_escape_string( $param)); $tags_str = join(", ", $tags); @@ -209,10 +209,10 @@ class Article extends Handler_Protected { } function setScore() { - $ids = db_escape_string($this->link, $_REQUEST['id']); - $score = (int)db_escape_string($this->link, $_REQUEST['score']); + $ids = db_escape_string( $_REQUEST['id']); + $score = (int)db_escape_string( $_REQUEST['score']); - db_query($this->link, "UPDATE ttrss_user_entries SET + db_query( "UPDATE ttrss_user_entries SET score = '$score' WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]); print json_encode(array("id" => $id, @@ -222,14 +222,14 @@ class Article extends Handler_Protected { function setArticleTags() { - $id = db_escape_string($this->link, $_REQUEST["id"]); + $id = db_escape_string( $_REQUEST["id"]); - $tags_str = db_escape_string($this->link, $_REQUEST["tags_str"]); + $tags_str = db_escape_string( $_REQUEST["tags_str"]); $tags = array_unique(trim_array(explode(",", $tags_str))); - db_query($this->link, "BEGIN"); + db_query( "BEGIN"); - $result = db_query($this->link, "SELECT int_id FROM ttrss_user_entries WHERE + $result = db_query( "SELECT int_id FROM ttrss_user_entries WHERE ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1"); if (db_num_rows($result) == 1) { @@ -238,7 +238,7 @@ class Article extends Handler_Protected { $int_id = db_fetch_result($result, 0, "int_id"); - db_query($this->link, "DELETE FROM ttrss_tags WHERE + db_query( "DELETE FROM ttrss_tags WHERE post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'"); foreach ($tags as $tag) { @@ -255,7 +255,7 @@ class Article extends Handler_Protected { // print ""; if ($tag != '') { - db_query($this->link, "INSERT INTO ttrss_tags + db_query( "INSERT INTO ttrss_tags (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')"); } @@ -267,14 +267,14 @@ class Article extends Handler_Protected { sort($tags_to_cache); $tags_str = join(",", $tags_to_cache); - db_query($this->link, "UPDATE ttrss_user_entries + db_query( "UPDATE ttrss_user_entries SET tag_cache = '$tags_str' WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); } - db_query($this->link, "COMMIT"); + db_query( "COMMIT"); - $tags = get_article_tags($this->link, $id); + $tags = get_article_tags( $id); $tags_str = format_tags_string($tags, $id); $tags_str_full = join(", ", $tags); @@ -286,9 +286,9 @@ class Article extends Handler_Protected { function completeTags() { - $search = db_escape_string($this->link, $_REQUEST["search"]); + $search = db_escape_string( $_REQUEST["search"]); - $result = db_query($this->link, "SELECT DISTINCT tag_name FROM ttrss_tags + $result = db_query( "SELECT DISTINCT tag_name FROM ttrss_tags WHERE owner_uid = '".$_SESSION["uid"]."' AND tag_name LIKE '$search%' ORDER BY tag_name LIMIT 10"); @@ -311,10 +311,10 @@ class Article extends Handler_Protected { private function labelops($assign) { $reply = array(); - $ids = explode(",", db_escape_string($this->link, $_REQUEST["ids"])); - $label_id = db_escape_string($this->link, $_REQUEST["lid"]); + $ids = explode(",", db_escape_string( $_REQUEST["ids"])); + $label_id = db_escape_string( $_REQUEST["lid"]); - $label = db_escape_string($this->link, label_find_caption($this->link, $label_id, + $label = db_escape_string( label_find_caption( $label_id, $_SESSION["uid"])); $reply["info-for-headlines"] = array(); @@ -324,11 +324,11 @@ class Article extends Handler_Protected { foreach ($ids as $id) { if ($assign) - label_add_article($this->link, $id, $label, $_SESSION["uid"]); + label_add_article( $id, $label, $_SESSION["uid"]); else - label_remove_article($this->link, $id, $label, $_SESSION["uid"]); + label_remove_article( $id, $label, $_SESSION["uid"]); - $labels = get_article_labels($this->link, $id, $_SESSION["uid"]); + $labels = get_article_labels( $id, $_SESSION["uid"]); array_push($reply["info-for-headlines"], array("id" => $id, "labels" => format_article_labels($labels, $id))); diff --git a/classes/auth/base.php b/classes/auth/base.php index ad7ff3646..c2a6bd704 100644 --- a/classes/auth/base.php +++ b/classes/auth/base.php @@ -1,9 +1,9 @@ link = $link; + function __construct($dbh) { + $this->dbh = $dbh; } function check_password($owner_uid, $password) { @@ -21,7 +21,7 @@ class Auth_Base { $user_id = $this->find_user_by_login($login); if (!$user_id) { - $login = db_escape_string($this->link, $login); + $login = db_escape_string( $login); $salt = substr(bin2hex(get_random_bytes(125)), 0, 250); $pwd_hash = encrypt_password($password, $salt, true); @@ -29,7 +29,7 @@ class Auth_Base { (login,access_level,last_login,created,pwd_hash,salt) VALUES ('$login', 0, null, NOW(), '$pwd_hash','$salt')"; - db_query($this->link, $query); + db_query( $query); return $this->find_user_by_login($login); @@ -42,9 +42,9 @@ class Auth_Base { } function find_user_by_login($login) { - $login = db_escape_string($this->link, $login); + $login = db_escape_string( $login); - $result = db_query($this->link, "SELECT id FROM ttrss_users WHERE + $result = db_query( "SELECT id FROM ttrss_users WHERE login = '$login'"); if (db_num_rows($result) > 0) { diff --git a/classes/backend.php b/classes/backend.php index c03d583db..a04168108 100644 --- a/classes/backend.php +++ b/classes/backend.php @@ -11,7 +11,7 @@ class Backend extends Handler { require_once "digest.php"; - $rv = prepare_headlines_digest($this->link, $_SESSION['uid'], 1, 1000); + $rv = prepare_headlines_digest( $_SESSION['uid'], 1, 1000); $rv[3] = "
" . $rv[3] . "
"; @@ -19,8 +19,8 @@ class Backend extends Handler { } private function display_main_help() { - $info = get_hotkeys_info($this->link); - $imap = get_hotkeys_map($this->link); + $info = get_hotkeys_info(); + $imap = get_hotkeys_map(); $omap = array(); foreach ($imap[1] as $sequence => $action) { diff --git a/classes/db.php b/classes/db.php index c3b627096..6dc31a22e 100644 --- a/classes/db.php +++ b/classes/db.php @@ -36,7 +36,7 @@ class Db implements IDb { function connect($host, $user, $pass, $db, $port) { //return $this->adapter->connect($host, $user, $pass, $db, $port); - return $this->link; + return ; } function escape_string($s, $strip_tags = true) { diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php index bafd54ab2..0cb737978 100644 --- a/classes/db/pgsql.php +++ b/classes/db/pgsql.php @@ -31,11 +31,11 @@ class Db_Pgsql implements IDb { function escape_string($s, $strip_tags = true) { if ($strip_tags) $s = strip_tags($s); - return pg_escape_string($this->link, $s); + return pg_escape_string( $s); } function query($query, $die_on_error = true) { - $result = pg_query($this->link, $query); + $result = pg_query( $query); if (!$result) { $query = htmlspecialchars($query); // just in case diff --git a/classes/dbupdater.php b/classes/dbupdater.php index a9a713273..ffcac7cf7 100644 --- a/classes/dbupdater.php +++ b/classes/dbupdater.php @@ -1,18 +1,18 @@ link = $link; + function __construct($dbh, $db_type, $need_version) { + $this->dbh = $dbh; $this->db_type = $db_type; $this->need_version = (int) $need_version; } function getSchemaVersion() { - $result = db_query($this->link, "SELECT schema_version FROM ttrss_version"); + $result = db_query( "SELECT schema_version FROM ttrss_version"); return (int) db_fetch_result($result, 0, "schema_version"); } @@ -37,21 +37,21 @@ class DbUpdater { if (is_array($lines)) { - db_query($this->link, "BEGIN"); + db_query( "BEGIN"); foreach ($lines as $line) { if (strpos($line, "--") !== 0 && $line) { - db_query($this->link, $line); + db_query( $line); } } $db_version = $this->getSchemaVersion(); if ($db_version == $version) { - db_query($this->link, "COMMIT"); + db_query( "COMMIT"); return true; } else { - db_query($this->link, "ROLLBACK"); + db_query( "ROLLBACK"); return false; } } else { diff --git a/classes/dlg.php b/classes/dlg.php index e56560a47..99cd7cffa 100644 --- a/classes/dlg.php +++ b/classes/dlg.php @@ -6,7 +6,7 @@ class Dlg extends Handler_Protected { if (parent::before($method)) { header("Content-Type: text/html"); # required for iframe - $this->param = db_escape_string($this->link, $_REQUEST["param"]); + $this->param = db_escape_string( $_REQUEST["param"]); return true; } return false; @@ -18,15 +18,15 @@ class Dlg extends Handler_Protected { print "
"; $owner_uid = $_SESSION["uid"]; - db_query($this->link, "BEGIN"); + db_query( "BEGIN"); print "
    "; - $opml = new Opml($this->link, $_REQUEST); + $opml = new Opml( $_REQUEST); $opml->opml_import($_SESSION["uid"]); - db_query($this->link, "COMMIT"); + db_query( "COMMIT"); print "
"; print "
"; @@ -43,7 +43,7 @@ class Dlg extends Handler_Protected { } function pubOPMLUrl() { - $url_path = Opml::opml_publish_url($this->link); + $url_path = Opml::opml_publish_url(); print __("Your Public OPML URL is:"); @@ -106,7 +106,7 @@ class Dlg extends Handler_Protected { FROM ttrss_tags WHERE owner_uid = ".$_SESSION["uid"]." GROUP BY tag_name ORDER BY count DESC LIMIT 50"; - $result = db_query($this->link, $query); + $result = db_query( $query); $tags = array(); @@ -171,7 +171,7 @@ class Dlg extends Handler_Protected { print "