From 5b18c93622e97b9a251f3b85bdb088022fd5c0f3 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 18 Mar 2013 20:59:48 +0400 Subject: tweak hotkey map notation to allow stuff like shift-arrows --- classes/backend.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'classes') diff --git a/classes/backend.php b/classes/backend.php index 5473c5c79..7848b0714 100644 --- a/classes/backend.php +++ b/classes/backend.php @@ -45,6 +45,28 @@ class Backend extends Handler { $sequence = substr($sequence, strpos($sequence, "|")+1, strlen($sequence)); + } else { + $keys = explode(" ", $sequence); + + for ($i = 0; $i < count($keys); $i++) { + if (strlen($keys[$i]) > 1) { + $tmp = ''; + foreach (str_split($keys[$i]) as $c) { + switch ($c) { + case '*': + $tmp .= __('Shift') . '+'; + break; + case '^': + $tmp .= __('Ctrl') . '+'; + break; + default: + $tmp .= $c; + } + } + $keys[$i] = $tmp; + } + } + $sequence = join(" ", $keys); } print "
  • "; -- cgit v1.2.3-54-g00ecf From 2130fe7a18d7e1863575feda9ec39654541eee77 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 18 Mar 2013 22:26:36 +0400 Subject: add experimental HOOK_SANITIZE --- classes/pluginhost.php | 1 + include/functions.php | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) (limited to 'classes') diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 592629881..79544b01b 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -21,6 +21,7 @@ class PluginHost { const HOOK_RENDER_ARTICLE = 10; const HOOK_RENDER_ARTICLE_CDM = 11; const HOOK_FEED_FETCHED = 12; + const HOOK_SANITIZE = 13; const KIND_ALL = 1; const KIND_SYSTEM = 2; diff --git a/include/functions.php b/include/functions.php index 2120a96b9..ae9561337 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2597,12 +2597,25 @@ //$node = $doc->getElementsByTagName('body')->item(0); - $doc->removeChild($doc->firstChild); //remove doctype - $res = $doc->saveHTML(); - $config = array('safe' => 1, 'deny_attribute' => 'style, width, height, class, id', 'comment' => 1, 'cdata' => 1, 'balance' => 0); - $spec = 'img=width,height'; - $res = htmLawed($res, $config, $spec); + $beforehooks = $res; + + global $pluginhost; + if ($pluginhost) { + foreach ($pluginhost->get_hooks($pluginhost::HOOK_SANITIZE) as $p) { + $res = $p->hook_sanitize($res); + } + } + + // nothing changed, use standard filters + if ($beforehooks == $res) { + $doc->removeChild($doc->firstChild); //remove doctype + $res = $doc->saveHTML(); + + $config = array('safe' => 1, 'deny_attribute' => 'style, width, height, class, id', 'comment' => 1, 'cdata' => 1, 'balance' => 0); + $spec = 'img=width,height'; + $res = htmLawed($res, $config, $spec); + } return $res; } -- cgit v1.2.3-54-g00ecf From b5459be1f29084bcd345688ba110ef55bc837332 Mon Sep 17 00:00:00 2001 From: Daniel Andersson Date: Mon, 18 Mar 2013 20:57:41 +0100 Subject: Enable styling of author in feed item title by adding span class. --- 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 d6cd2a255..b33faa474 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -539,7 +539,7 @@ class Feeds extends Handler_Protected { target=\"_blank\" href=\"". htmlspecialchars($line["link"])."\">". $line["title"] . - " $entry_author"; + " $entry_author"; $reply['content'] .= $labels_str; -- cgit v1.2.3-54-g00ecf From be124dc2361539455121fa29c77bf60a85014b13 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 00:00:13 +0400 Subject: Revert "add experimental HOOK_SANITIZE" This reverts commit 2130fe7a18d7e1863575feda9ec39654541eee77. --- classes/pluginhost.php | 1 - include/functions.php | 23 +++++------------------ 2 files changed, 5 insertions(+), 19 deletions(-) (limited to 'classes') diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 79544b01b..592629881 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -21,7 +21,6 @@ class PluginHost { const HOOK_RENDER_ARTICLE = 10; const HOOK_RENDER_ARTICLE_CDM = 11; const HOOK_FEED_FETCHED = 12; - const HOOK_SANITIZE = 13; const KIND_ALL = 1; const KIND_SYSTEM = 2; diff --git a/include/functions.php b/include/functions.php index ae9561337..2120a96b9 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2597,25 +2597,12 @@ //$node = $doc->getElementsByTagName('body')->item(0); + $doc->removeChild($doc->firstChild); //remove doctype + $res = $doc->saveHTML(); - $beforehooks = $res; - - global $pluginhost; - if ($pluginhost) { - foreach ($pluginhost->get_hooks($pluginhost::HOOK_SANITIZE) as $p) { - $res = $p->hook_sanitize($res); - } - } - - // nothing changed, use standard filters - if ($beforehooks == $res) { - $doc->removeChild($doc->firstChild); //remove doctype - $res = $doc->saveHTML(); - - $config = array('safe' => 1, 'deny_attribute' => 'style, width, height, class, id', 'comment' => 1, 'cdata' => 1, 'balance' => 0); - $spec = 'img=width,height'; - $res = htmLawed($res, $config, $spec); - } + $config = array('safe' => 1, 'deny_attribute' => 'style, width, height, class, id', 'comment' => 1, 'cdata' => 1, 'balance' => 0); + $spec = 'img=width,height'; + $res = htmLawed($res, $config, $spec); return $res; } -- cgit v1.2.3-54-g00ecf From 82d69730cb660d2d81ac7bdadb7faddb5d2363b2 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 00:50:20 +0400 Subject: rename titleAuthor to author to unify class names with normal mode --- 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 b33faa474..4857cca78 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -539,7 +539,7 @@ class Feeds extends Handler_Protected { target=\"_blank\" href=\"". htmlspecialchars($line["link"])."\">". $line["title"] . - " $entry_author"; + " $entry_author"; $reply['content'] .= $labels_str; -- cgit v1.2.3-54-g00ecf From 98c39afc06cd191bfbaa7f4d709dcd4cf2537825 Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Mon, 18 Mar 2013 17:55:03 -0400 Subject: Fix strict standards issue-- DOMDocument::load isn't static --- classes/opml.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/opml.php b/classes/opml.php index b91e395d1..34067e017 100644 --- a/classes/opml.php +++ b/classes/opml.php @@ -462,7 +462,8 @@ class Opml extends Handler_Protected { # if ($debug) $doc = DOMDocument::load("/tmp/test.opml"); if (is_file($_FILES['opml_file']['tmp_name'])) { - $doc = DOMDocument::load($_FILES['opml_file']['tmp_name']); + $doc = new DOMDocument(); + $doc->load($_FILES['opml_file']['tmp_name']); } else if (!$doc) { print_error(__('Error: please upload OPML file.')); return; -- cgit v1.2.3-54-g00ecf From 4f7d69e1856a611025f53eef273e5af039d9aa16 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 12:49:55 +0400 Subject: detect whether browser supports iframe.sandbox and allow iframes accordingly; allow object and embed elements --- classes/rpc.php | 1 + include/functions.php | 4 +++- js/tt-rss.js | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/rpc.php b/classes/rpc.php index 5d77b1ae8..b297bbade 100644 --- a/classes/rpc.php +++ b/classes/rpc.php @@ -285,6 +285,7 @@ class RPC extends Handler_Protected { function sanityCheck() { $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true"; + $_SESSION["hasSandbox"] = $_REQUEST["hasSandbox"] === "true"; $reply = array(); diff --git a/include/functions.php b/include/functions.php index 0e5d15eaf..50bdc13ae 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2626,7 +2626,9 @@ $allowed_elements = array('p', 'br', 'div', 'table', 'tr', 'td', 'th', 'ul', 'ol', 'li', 'blockquote', 'span', 'html', 'body', 'a', 'img', - 'iframe', 'video', 'audio', 'source'); + 'video', 'audio', 'source', 'object', 'embed'); + + if ($_SESSION['hasSandbox']) array_push($allowed_elements, 'iframe'); $disallowed_attributes = array('id', 'style', 'class'); diff --git a/js/tt-rss.js b/js/tt-rss.js index 5ada64d31..5968f58eb 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -244,9 +244,11 @@ function init() { loading_set_progress(20); var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType); + var hasSandbox = "sandbox" in document.createElement("iframe"); new Ajax.Request("backend.php", { - parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio}, + parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio, + hasSandbox: hasSandbox}, onComplete: function(transport) { backend_sanity_check_callback(transport); } }); -- cgit v1.2.3-54-g00ecf From 1d5cf085a37e8e016242c9cfea631a90861ab306 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 18:32:49 +0400 Subject: implement mail plugin using mailto: links; deprecate mail plugin --- classes/feeds.php | 5 ++ js/tt-rss.js | 2 + plugins/mail/init.php | 9 ++-- plugins/mailto/init.js | 32 ++++++++++++ plugins/mailto/init.php | 93 +++++++++++++++++++++++++++++++++++ plugins/mailto/mail.png | Bin 0 -> 192 bytes templates/email_article_template.txt | 2 - 7 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 plugins/mailto/init.js create mode 100644 plugins/mailto/init.php create mode 100644 plugins/mailto/mail.png (limited to 'classes') diff --git a/classes/feeds.php b/classes/feeds.php index 4857cca78..5fa51768c 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -126,6 +126,11 @@ class Feeds extends Handler_Protected { ""; } + if ($pluginhost->get_plugin("mailto")) { + $reply .= ""; + } + $reply .= ""; $reply .= ""; diff --git a/js/tt-rss.js b/js/tt-rss.js index 357e07780..a8552d173 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -670,6 +670,8 @@ function hotkey_handler(e) { case "email_article": if (typeof emailArticle != "undefined") { emailArticle(); + } else if (typeof mailtoArticle != "undefined") { + mailtoArticle(); } else { alert(__("Please enable mail plugin first.")); } diff --git a/plugins/mail/init.php b/plugins/mail/init.php index 2e972cf61..0c8bc40aa 100644 --- a/plugins/mail/init.php +++ b/plugins/mail/init.php @@ -6,7 +6,7 @@ class Mail extends Plugin { function about() { return array(1.0, - "Share article via email", + "Share article via email (deprecated)", "fox"); } @@ -59,10 +59,9 @@ class Mail extends Plugin { $tpl->readTemplateFromFile("templates/email_article_template.txt"); - $tpl->setVariable('USER_NAME', $_SESSION["name"]); - $tpl->setVariable('USER_EMAIL', $user_email); - $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]); - + $tpl->setVariable('USER_NAME', $_SESSION["name"], true); + $tpl->setVariable('USER_EMAIL', $user_email, true); + $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"], true); $result = db_query($this->link, "SELECT link, content, title FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND diff --git a/plugins/mailto/init.js b/plugins/mailto/init.js new file mode 100644 index 000000000..8f7656a07 --- /dev/null +++ b/plugins/mailto/init.js @@ -0,0 +1,32 @@ +function mailtoArticle(id) { + try { + if (!id) { + var ids = getSelectedArticleIds2(); + + if (ids.length == 0) { + alert(__("No articles are selected.")); + return; + } + + id = ids.toString(); + } + + if (dijit.byId("emailArticleDlg")) + dijit.byId("emailArticleDlg").destroyRecursive(); + + var query = "backend.php?op=pluginhandler&plugin=mailto&method=emailArticle¶m=" + param_escape(id); + + dialog = new dijit.Dialog({ + id: "emailArticleDlg", + title: __("Forward article by email"), + style: "width: 600px", + href: query}); + + dialog.show(); + + } catch (e) { + exception_error("emailArticle", e); + } +} + + diff --git a/plugins/mailto/init.php b/plugins/mailto/init.php new file mode 100644 index 000000000..bbc0dffa4 --- /dev/null +++ b/plugins/mailto/init.php @@ -0,0 +1,93 @@ +link = $host->get_link(); + $this->host = $host; + + $host->add_hook($host::HOOK_ARTICLE_BUTTON, $this); + } + + function get_js() { + return file_get_contents(dirname(__FILE__) . "/init.js"); + } + + function hook_article_button($line) { + return "Zoom"; + } + + function emailArticle() { + + $param = db_escape_string($_REQUEST['param']); + + require_once "lib/MiniTemplator.class.php"; + + $tpl = new MiniTemplator; + $tpl_t = new MiniTemplator; + + $tpl->readTemplateFromFile("templates/email_article_template.txt"); + + $tpl->setVariable('USER_NAME', $_SESSION["name"], true); + $tpl->setVariable('USER_EMAIL', $user_email, true); + $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"], true); + + + $result = db_query($this->link, "SELECT link, content, title + FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND + id IN ($param) AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) > 1) { + $subject = __("[Forwarded]") . " " . __("Multiple articles"); + } + + while ($line = db_fetch_assoc($result)) { + + if (!$subject) + $subject = __("[Forwarded]") . " " . htmlspecialchars($line["title"]); + + $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"])); + $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"])); + + $tpl->addBlock('article'); + } + + $tpl->addBlock('email'); + + $content = ""; + $tpl->generateOutputToString($content); + + $mailto_link = htmlspecialchars("mailto: ?subject=".urlencode($subject). + "&body=".urlencode($content)); + + print __("Clicking the following link to invoke your mail client:"); + + print ""; + + print __("You should be able to edit the message before sending in your mail client."); + + print "

    "; + + print "

    "; + print ""; + print "
    "; + + //return; + } + +} +?> diff --git a/plugins/mailto/mail.png b/plugins/mailto/mail.png new file mode 100644 index 000000000..4d3fe7751 Binary files /dev/null and b/plugins/mailto/mail.png differ diff --git a/templates/email_article_template.txt b/templates/email_article_template.txt index 0d151d18c..5cf2b2750 100644 --- a/templates/email_article_template.txt +++ b/templates/email_article_template.txt @@ -6,8 +6,6 @@ I've been reading this and thought it might interest you: * ${ARTICLE_TITLE} ${ARTICLE_URL} -Sincerely yours, - ${USER_NAME} <${USER_EMAIL}>. -- This message has been sent by Tiny Tiny RSS installation at ${TTRSS_HOST}. -- cgit v1.2.3-54-g00ecf From e9b86f0a1c6165f4f06b1f7909889abfea96b620 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 18:58:42 +0400 Subject: reimplement HOOK_SANITIZE (plugs before final removal of harmful tags) --- classes/pluginhost.php | 1 + include/functions.php | 8 ++++++++ 2 files changed, 9 insertions(+) (limited to 'classes') diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 592629881..79544b01b 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -21,6 +21,7 @@ class PluginHost { const HOOK_RENDER_ARTICLE = 10; const HOOK_RENDER_ARTICLE_CDM = 11; const HOOK_FEED_FETCHED = 12; + const HOOK_SANITIZE = 13; const KIND_ALL = 1; const KIND_SYSTEM = 2; diff --git a/include/functions.php b/include/functions.php index 3793e0426..d1743af7a 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2615,6 +2615,14 @@ $entry->setAttribute('sandbox', true); } + global $pluginhost; + + if (isset($pluginhost)) { + foreach ($pluginhost->get_hooks($pluginhost::HOOK_SANITIZE) as $plugin) { + $doc = $plugin->hook_sanitize($doc, $site_url); + } + } + $doc->removeChild($doc->firstChild); //remove doctype $doc = strip_harmful_tags($doc); $res = $doc->saveHTML(); -- cgit v1.2.3-54-g00ecf From 36b4cf2f642d1308f18ba7e7107f74a8bbce0261 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 20:37:04 +0400 Subject: tweak vfeed grouped title display a bit to make it more similar to other modes --- cdm.css | 13 +++++++++++++ classes/feeds.php | 8 ++++---- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'classes') diff --git a/cdm.css b/cdm.css index 411bbe633..bcba40538 100644 --- a/cdm.css +++ b/cdm.css @@ -101,6 +101,19 @@ div.cdmFeedTitle { background-repeat : repeat-x; } +div.cdmFeedTitle a.title { + color : gray; + font-style : italic; + font-weight : bold; +} +div.cdmFeedTitle a { + color : gray; +} + +div.cdmFeedTitle a:hover { + color : #4684ff; +} + div.articleNote { border-style : dashed none dashed none; } diff --git a/classes/feeds.php b/classes/feeds.php index 5fa51768c..d598a9e4f 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -405,11 +405,11 @@ class Feeds extends Handler_Protected { $cur_feed_title = htmlspecialchars($cur_feed_title); - $vf_catchup_link = "(".__('mark as read').")"; + $vf_catchup_link = "(".__('Mark as read').")"; $reply['content'] .= "
    ". "
    $feed_icon_img
    ". - "". + "". $line["feed_title"]." $vf_catchup_link
    "; } @@ -495,7 +495,7 @@ class Feeds extends Handler_Protected { $cur_feed_title = htmlspecialchars($cur_feed_title); - $vf_catchup_link = "(".__('mark as read').")"; + $vf_catchup_link = "(".__('mark as read').")"; $has_feed_icon = feed_has_icon($feed_id); @@ -507,7 +507,7 @@ class Feeds extends Handler_Protected { $reply['content'] .= "
    ". "
    $feed_icon_img
    ". - "". + "". $line["feed_title"]." $vf_catchup_link
    "; } } -- cgit v1.2.3-54-g00ecf