";
-
- if ($line["link"]) {
- $rv .= "
";
- } else {
- $rv .= "
" . $line["title"] . " ";
- }
-
- $rv .= "
";
-
- /* header */
-
- $rv .= ""; # header
-
- /* content */
-
- $lang = $line['lang'] ? $line['lang'] : "en";
- $rv .= "
";
-
- /* content body */
-
- $rv .= $line["content"];
-
- /* $rv .= Article::format_article_enclosures($id,
- $line["always_display_enclosures"],
- $line["content"],
- $line["hide_images"]); */
-
- $rv .= "
"; # content
-
- $rv .= "
"; # post
-
- }
-
- PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_FORMAT_ARTICLE,
- function ($result) use (&$rv) {
- $rv = $result;
- },
- $rv, $line);
-
- return $rv;
-
- }
-
function rss() {
$feed = clean($_REQUEST["id"]);
$key = clean($_REQUEST["key"]);
diff --git a/classes/pluginhost.php b/classes/pluginhost.php
index 6f223ee11..097bf987c 100755
--- a/classes/pluginhost.php
+++ b/classes/pluginhost.php
@@ -18,6 +18,7 @@ class PluginHost {
private static $instance;
const API_VERSION = 2;
+ const PUBLIC_METHOD_DELIMITER = "--";
// Hooks marked with *1 are run in global context and available
// to plugins loaded in config.php only
@@ -617,9 +618,7 @@ class PluginHost {
http_build_query(
array_merge(
[
- "op" => "pluginhandler",
- "plugin" => strtolower(get_class($sender)),
- "pmethod" => $method
+ "op" => strtolower(get_class($sender) . PluginHost::PUBLIC_METHOD_DELIMITER . $method),
],
$params));
} else {
diff --git a/plugins/share/init.php b/plugins/share/init.php
index a569393fe..6b7b81a2d 100644
--- a/plugins/share/init.php
+++ b/plugins/share/init.php
@@ -16,6 +16,10 @@ class Share extends Plugin {
$host->add_hook($host::HOOK_PREFS_TAB_SECTION, $this);
}
+ function is_public_method($method) {
+ return $method == "get";
+ }
+
function get_js() {
return file_get_contents(__DIR__ . "/share.js");
}
@@ -78,6 +82,168 @@ class Share extends Plugin {
title='".__('Share by URL')."'>link";
}
+ function get() {
+ $uuid = clean($_REQUEST["key"] ?? "");
+
+ if ($uuid) {
+ $sth = $this->pdo->prepare("SELECT ref_id, owner_uid
+ FROM ttrss_user_entries WHERE uuid = ?");
+ $sth->execute([$uuid]);
+
+ if ($row = $sth->fetch()) {
+ header("Content-Type: text/html");
+
+ $id = $row["ref_id"];
+ $owner_uid = $row["owner_uid"];
+
+ print $this->format_article($id, $owner_uid);
+
+ return;
+ }
+ }
+
+ header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
+ print "Article not found.";
+ }
+
+ private function format_article($id, $owner_uid) {
+
+ $pdo = Db::pdo();
+
+ $sth = $pdo->prepare("SELECT id,title,link,content,feed_id,comments,int_id,lang,
+ ".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
+ (SELECT site_url FROM ttrss_feeds WHERE id = feed_id) as site_url,
+ (SELECT title FROM ttrss_feeds WHERE id = feed_id) as feed_title,
+ (SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) as hide_images,
+ (SELECT always_display_enclosures FROM ttrss_feeds WHERE id = feed_id) as always_display_enclosures,
+ num_comments,
+ tag_cache,
+ author,
+ guid,
+ note
+ FROM ttrss_entries,ttrss_user_entries
+ WHERE id = ? AND ref_id = id AND owner_uid = ?");
+ $sth->execute([$id, $owner_uid]);
+
+ $rv = '';
+
+ if ($line = $sth->fetch()) {
+
+ $line["tags"] = Article::_get_tags($id, $owner_uid, $line["tag_cache"]);
+ unset($line["tag_cache"]);
+
+ $line["content"] = Sanitizer::sanitize($line["content"],
+ $line['hide_images'],
+ $owner_uid, $line["site_url"], false, $line["id"]);
+
+ PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_RENDER_ARTICLE,
+ function ($result) use (&$line) {
+ $line = $result;
+ },
+ $line);
+
+ $line['content'] = DiskCache::rewrite_urls($line['content']);
+
+ header("Content-Type: text/html");
+
+ $rv .= "
+
+
+
".$line["title"]." ".
+ javascript_tag("lib/prototype.js").
+ javascript_tag("js/utility.js")."
+
+
+
";
+
+ $rv .= "
\n";
+ $rv .= "
\n";
+
+ $rv .= "";
+
+ $enclosures = Article::_get_enclosures($line["id"]);
+ list ($og_image, $og_stream) = Article::_get_image($enclosures, $line['content'], $line["site_url"]);
+
+ if ($og_image) {
+ $rv .= "
";
+ }
+
+ $rv .= "";
+ $rv .= "
";
+
+ if ($line["link"]) {
+ $rv .= "
";
+ } else {
+ $rv .= "
" . $line["title"] . " ";
+ }
+
+ $rv .= "
";
+
+ /* header */
+
+ $rv .= ""; # header
+
+ /* content */
+
+ $lang = $line['lang'] ? $line['lang'] : "en";
+ $rv .= "
";
+
+ /* content body */
+
+ $rv .= $line["content"];
+
+ /* $rv .= Article::format_article_enclosures($id,
+ $line["always_display_enclosures"],
+ $line["content"],
+ $line["hide_images"]); */
+
+ $rv .= "
"; # content
+
+ $rv .= "
"; # post
+
+ }
+
+ PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_FORMAT_ARTICLE,
+ function ($result) use (&$rv) {
+ $rv = $result;
+ },
+ $rv, $line);
+
+ return $rv;
+
+ }
+
function shareDialog() {
$id = (int)clean($_REQUEST['id'] ?? 0);
@@ -96,8 +262,7 @@ class Share extends Plugin {
$sth->execute([$uuid, $id, $_SESSION['uid']]);
}
- $url_path = get_self_url_prefix() . "/public.php?op=share&key=$uuid";
-
+ $url_path = $this->host->get_public_method_url($this, "get", ["key" => $uuid]);
?>
= __("You can share this article by the following unique URL:") ?>
diff --git a/public.php b/public.php
index 59b5a499c..fadb2f14d 100644
--- a/public.php
+++ b/public.php
@@ -17,6 +17,17 @@
$method = (string)clean($_REQUEST["op"]);
+ // shortcut syntax for public (exposed) methods (?op=plugin--pmethod&...params)
+ if (strpos($method, PluginHost::PUBLIC_METHOD_DELIMITER) !== false) {
+ list ($plugin, $pmethod) = explode(PluginHost::PUBLIC_METHOD_DELIMITER, $method, 2);
+
+ // TODO: better implementation that won't modify $_REQUEST
+ $_REQUEST["plugin"] = $plugin;
+ $_REQUEST["pmethod"] = $pmethod;
+
+ $method = "pluginhandler";
+ }
+
$override = PluginHost::getInstance()->lookup_handler("public", $method);
if ($override) {
--
cgit v1.2.3-54-g00ecf
From 4325c30a3f7574ed2b1cc3fcf41a08d92c0ccc49 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Wed, 17 Feb 2021 12:10:19 +0300
Subject: share: markup cleanup
---
plugins/share/init.php | 148 ++++++++++++++++++++++---------------------------
1 file changed, 65 insertions(+), 83 deletions(-)
(limited to 'plugins/share/init.php')
diff --git a/plugins/share/init.php b/plugins/share/init.php
index 6b7b81a2d..4c47e29d3 100644
--- a/plugins/share/init.php
+++ b/plugins/share/init.php
@@ -96,7 +96,7 @@ class Share extends Plugin {
$id = $row["ref_id"];
$owner_uid = $row["owner_uid"];
- print $this->format_article($id, $owner_uid);
+ $this->format_article($id, $owner_uid);
return;
}
@@ -125,8 +125,6 @@ class Share extends Plugin {
WHERE id = ? AND ref_id = id AND owner_uid = ?");
$sth->execute([$id, $owner_uid]);
- $rv = '';
-
if ($line = $sth->fetch()) {
$line["tags"] = Article::_get_tags($id, $owner_uid, $line["tag_cache"]);
@@ -142,106 +140,90 @@ class Share extends Plugin {
},
$line);
+ $enclosures = Article::_get_enclosures($line["id"]);
+ list ($og_image, $og_stream) = Article::_get_image($enclosures, $line['content'], $line["site_url"]);
+
+ $content_decoded = html_entity_decode($line["title"], ENT_NOQUOTES | ENT_HTML401);
+ $parsed_updated = TimeHelper::make_local_datetime($line["updated"], true, $owner_uid, true);
+
$line['content'] = DiskCache::rewrite_urls($line['content']);
- header("Content-Type: text/html");
+ ob_start();
- $rv .= "
-
-
- ".$line["title"]." ".
- javascript_tag("lib/prototype.js").
- javascript_tag("js/utility.js")."
+ ?>
+
+
+
+
+ = $line["title"] ?>
+ = javascript_tag("lib/prototype.js") ?>
+ = javascript_tag("js/utility.js") ?>
-
- ";
-
- $rv .= " \n";
- $rv .= "
+
+
+
+ \n";
-
- $rv .= "";
-
- $enclosures = Article::_get_enclosures($line["id"]);
- list ($og_image, $og_stream) = Article::_get_image($enclosures, $line['content'], $line["site_url"]);
-
- if ($og_image) {
- $rv .= " ";
- }
-
- $rv .= "";
- $rv .= "";
-
- if ($line["link"]) {
- $rv .= "
";
- } else {
- $rv .= "
" . $line["title"] . " ";
- }
-
- $rv .= "
";
-
- /* header */
-
- $rv .= ""; # header
-
- /* content */
-
- $lang = $line['lang'] ? $line['lang'] : "en";
- $rv .= "
";
-
- /* content body */
-
- $rv .= $line["content"];
-
- /* $rv .= Article::format_article_enclosures($id,
- $line["always_display_enclosures"],
- $line["content"],
- $line["hide_images"]); */
-
- $rv .= "
"; # content
+ ), 500, "...")) ?>">
+
+
+
+
+
+
+
+
+
+
+
+
+
= $line["title"] ?>
+
+
+
+
+
+
">
+ = $line["content"] ?>
+
+
+
+
+ "; # post
+ $rv = ob_get_contents();
+ ob_end_clean();
- }
-
- PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_FORMAT_ARTICLE,
+ PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_FORMAT_ARTICLE,
function ($result) use (&$rv) {
$rv = $result;
},
$rv, $line);
- return $rv;
-
+ print $rv;
+ }
}
function shareDialog() {
--
cgit v1.2.3-54-g00ecf
From c088e9d9d8296fe154763da3b5297bf85c3cc3a1 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov
Date: Thu, 18 Feb 2021 22:23:06 +0300
Subject: get rid of a few more prototype-isms
---
classes/feeds.php | 1 -
classes/handler/public.php | 4 -
include/login_form.php | 6 +-
index.php | 3 +-
js/utility.js | 8 +-
lib/prototype.js | 7590 --------------------------------------------
plugins/share/init.php | 1 -
prefs.php | 3 +-
8 files changed, 8 insertions(+), 7608 deletions(-)
delete mode 100644 lib/prototype.js
(limited to 'plugins/share/init.php')
diff --git a/classes/feeds.php b/classes/feeds.php
index 30478ae39..04553451c 100755
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -640,7 +640,6 @@ class Feeds extends Handler_Protected {
};
= __("Share with Tiny Tiny RSS") ?>
Tiny Tiny RSS
@@ -946,7 +943,6 @@ class Handler_Public extends Handler {
diff --git a/include/login_form.php b/include/login_form.php
index c3660bced..d1af23459 100755
--- a/include/login_form.php
+++ b/include/login_form.php
@@ -6,10 +6,8 @@
{
+ reply.forEach((p) => {
profile
.attr("disabled", false)
.addOption(p);
diff --git a/index.php b/index.php
index 4a4d336ca..4494082dd 100644
--- a/index.php
+++ b/index.php
@@ -76,8 +76,7 @@
-1,
- Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
- MobileSafari: /Apple.*Mobile/.test(ua)
- }
- })(),
-
- BrowserFeatures: {
- XPath: !!document.evaluate,
-
- SelectorsAPI: !!document.querySelector,
-
- ElementExtensions: (function() {
- var constructor = window.Element || window.HTMLElement;
- return !!(constructor && constructor.prototype);
- })(),
- SpecificElementExtensions: (function() {
- if (typeof window.HTMLDivElement !== 'undefined')
- return true;
-
- var div = document.createElement('div'),
- form = document.createElement('form'),
- isSupported = false;
-
- if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
- isSupported = true;
- }
-
- div = form = null;
-
- return isSupported;
- })()
- },
-
- ScriptFragment: '
Date: Fri, 19 Feb 2021 19:29:43 +0300
Subject: modify classname helpers to use element.classList; fix feed debugger
& share--get
---
classes/feeds.php | 9 ++++-----
js/common.js | 6 +++---
plugins/share/init.php | 1 +
3 files changed, 8 insertions(+), 8 deletions(-)
(limited to 'plugins/share/init.php')
diff --git a/classes/feeds.php b/classes/feeds.php
index 98a9ed249..0c01ff25a 100755
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -626,11 +626,10 @@ class Feeds extends Handler_Protected {
]
};
-
+ = javascript_tag("js/utility.js") ?>
+ = javascript_tag("js/common.js") ?>
+ = javascript_tag("lib/dojo/dojo.js") ?>
+ = javascript_tag("lib/dojo/tt-rss-layer.js") ?>