implement sharing of arbitrary stuff using bookmarklet and API call, bump API version
This commit is contained in:
parent
b8386ad3d1
commit
8361e72478
6 changed files with 145 additions and 4 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
class API extends Handler {
|
class API extends Handler {
|
||||||
|
|
||||||
const API_LEVEL = 3;
|
const API_LEVEL = 4;
|
||||||
|
|
||||||
const STATUS_OK = 0;
|
const STATUS_OK = 0;
|
||||||
const STATUS_ERR = 1;
|
const STATUS_ERR = 1;
|
||||||
|
@ -419,6 +419,17 @@ class API extends Handler {
|
||||||
print $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD'));
|
print $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shareToPublished() {
|
||||||
|
$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 (create_published_article($this->link, $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'));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -306,5 +306,75 @@ class Handler_Public extends Handler {
|
||||||
// Update all feeds needing a update.
|
// Update all feeds needing a update.
|
||||||
update_daemon_common($this->link, 0, true, false);
|
update_daemon_common($this->link, 0, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sharepopup() {
|
||||||
|
header('Content-Type: text/html; charset=utf-8');
|
||||||
|
print "<html>
|
||||||
|
<head>
|
||||||
|
<title>Tiny Tiny RSS</title>
|
||||||
|
<link rel=\"stylesheet\" type=\"text/css\" href=\"utility.css\">
|
||||||
|
<script type=\"text/javascript\" src=\"lib/prototype.js\"></script>
|
||||||
|
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
|
||||||
|
</head>
|
||||||
|
<body id='sharepopup'>";
|
||||||
|
|
||||||
|
$action = $_REQUEST["action"];
|
||||||
|
|
||||||
|
if ($_SESSION["uid"]) {
|
||||||
|
|
||||||
|
if (!$action) {
|
||||||
|
|
||||||
|
print "<table height='100%' width='100%'><tr><td colspan='2'>";
|
||||||
|
print "<h1>Publish with Tiny Tiny RSS</h1>";
|
||||||
|
print "</td></tr>";
|
||||||
|
|
||||||
|
print "<form id='share_form' name='share_form'>";
|
||||||
|
|
||||||
|
print "<input type=\"hidden\" name=\"op\" value=\"sharepopup\">";
|
||||||
|
print "<input type=\"hidden\" name=\"action\" value=\"share\">";
|
||||||
|
|
||||||
|
$title = htmlspecialchars($_REQUEST["title"]);
|
||||||
|
$url = htmlspecialchars($_REQUEST["url"]);
|
||||||
|
|
||||||
|
print "<tr><td>".__("Title:")."</td><td width='80%'><input name='title' value=\"$title\"></td></tr>";
|
||||||
|
print "<tr><td>".__("URL:")."</td><td><input name='url' value=\"$url\"></td></tr>";
|
||||||
|
print "<tr><td>".__("Content:")."</td><td><input name='content' value=\"\"></td></tr>";
|
||||||
|
|
||||||
|
print "<script type='text/javascript'>";
|
||||||
|
print "document.forms[0].title.focus();";
|
||||||
|
print "</script>";
|
||||||
|
|
||||||
|
print "<tr><td colspan='2'>
|
||||||
|
<button type=\"submit\">".
|
||||||
|
__('Publish')."</button>
|
||||||
|
<button onclick=\"return window.close()\">".
|
||||||
|
__('Cancel')."</button>
|
||||||
|
</div>";
|
||||||
|
|
||||||
|
print "</form>";
|
||||||
|
print "</td></tr></table>";
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$title = db_escape_string(strip_tags($_REQUEST["title"]));
|
||||||
|
$url = db_escape_string(strip_tags($_REQUEST["url"]));
|
||||||
|
$content = db_escape_string(strip_tags($_REQUEST["content"]));
|
||||||
|
|
||||||
|
create_published_article($this->link, $title, $url, $content, $_SESSION["uid"]);
|
||||||
|
|
||||||
|
print "<script type='text/javascript'>";
|
||||||
|
print "window.close();";
|
||||||
|
print "</script>";
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
print "<table><tr><td>" . __("Not logged in.") . "</td></tr></table>";
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -1557,7 +1557,7 @@ class Pref_Feeds extends Handler_Protected {
|
||||||
print "</div>"; # pane
|
print "</div>"; # pane
|
||||||
}
|
}
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Subscribing using bookmarklet')."\">";
|
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Bookmarklets')."\">";
|
||||||
|
|
||||||
print "<p>" . __("Drag the link below to your browser toolbar, open the feed you're interested in in your browser and click on the link to subscribe to it.") . "</p>";
|
print "<p>" . __("Drag the link below to your browser toolbar, open the feed you're interested in in your browser and click on the link to subscribe to it.") . "</p>";
|
||||||
|
|
||||||
|
@ -1569,6 +1569,12 @@ class Pref_Feeds extends Handler_Protected {
|
||||||
|
|
||||||
print "<a href=\"$bm_url\" class='bookmarklet'>" . __('Subscribe in Tiny Tiny RSS'). "</a>";
|
print "<a href=\"$bm_url\" class='bookmarklet'>" . __('Subscribe in Tiny Tiny RSS'). "</a>";
|
||||||
|
|
||||||
|
print "<p>" . __("Use this bookmarklet to publish arbitrary pages using Tiny Tiny RSS") . "</p>";
|
||||||
|
|
||||||
|
$bm_url = htmlspecialchars("javascript:(function(){var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f='".SELF_URL_PATH."/public.php?op=sharepopup',l=d.location,e=encodeURIComponent,g=f+'&title='+((e(s))?e(s):e(document.title))+'&url='+e(l.href);function a(){if(!w.open(g,'t','toolbar=0,resizable=0,scrollbars=1,status=1,width=500,height=200')){l.href=g;}}a();})()");
|
||||||
|
|
||||||
|
print "<a href=\"$bm_url\" class='bookmarklet'>" . __('Share with Tiny Tiny RSS'). "</a>";
|
||||||
|
|
||||||
print "</div>"; #pane
|
print "</div>"; #pane
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Published & shared articles / Generated feeds')."\">";
|
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Published & shared articles / Generated feeds')."\">";
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
class RPC extends Handler_Protected {
|
class RPC extends Handler_Protected {
|
||||||
|
|
||||||
function csrf_ignore($method) {
|
function csrf_ignore($method) {
|
||||||
$csrf_ignored = array("sanitycheck", "buttonplugin", "exportget");
|
$csrf_ignored = array("sanitycheck", "buttonplugin", "exportget", "sharepopup");
|
||||||
|
|
||||||
return array_search($method, $csrf_ignored) !== false;
|
return array_search($method, $csrf_ignored) !== false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2326,6 +2326,8 @@
|
||||||
$limit_query_part = "LIMIT " . $limit;
|
$limit_query_part = "LIMIT " . $limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$allow_archived = false;
|
||||||
|
|
||||||
$vfeed_query_part = "";
|
$vfeed_query_part = "";
|
||||||
|
|
||||||
// override query strategy and enable feed display when searching globally
|
// override query strategy and enable feed display when searching globally
|
||||||
|
@ -2397,6 +2399,7 @@
|
||||||
}
|
}
|
||||||
} else if ($feed == 0 && !$cat_view) { // archive virtual feed
|
} else if ($feed == 0 && !$cat_view) { // archive virtual feed
|
||||||
$query_strategy_part = "feed_id IS NULL";
|
$query_strategy_part = "feed_id IS NULL";
|
||||||
|
$allow_archived = true;
|
||||||
} else if ($feed == 0 && $cat_view) { // uncategorized
|
} else if ($feed == 0 && $cat_view) { // uncategorized
|
||||||
$query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL";
|
$query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL";
|
||||||
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
||||||
|
@ -2408,6 +2411,7 @@
|
||||||
if (!$cat_view) {
|
if (!$cat_view) {
|
||||||
$query_strategy_part = "published = true";
|
$query_strategy_part = "published = true";
|
||||||
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
||||||
|
$allow_archived = true;
|
||||||
} else {
|
} else {
|
||||||
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
$vfeed_query_part = "ttrss_feeds.title AS feed_title,";
|
||||||
|
|
||||||
|
@ -2511,7 +2515,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($feed != "0") {
|
if (!$allow_archived) {
|
||||||
$from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds$ext_tables_part";
|
$from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds$ext_tables_part";
|
||||||
$feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND";
|
$feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND";
|
||||||
|
|
||||||
|
@ -5574,4 +5578,30 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function create_published_article($link, $title, $url, $content, $owner_uid) {
|
||||||
|
$guid = 'tt-rss-share:' . uniqid();
|
||||||
|
$content_hash = sha1($content);
|
||||||
|
|
||||||
|
$result = db_query($link, "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'");
|
||||||
|
|
||||||
|
if (db_num_rows($result) != 0) {
|
||||||
|
$ref_id = db_fetch_result($result, 0, "id");
|
||||||
|
|
||||||
|
db_query($link, "INSERT INTO ttrss_user_entries
|
||||||
|
(ref_id, uuid, feed_id, orig_feed_id, owner_uid, published, tag_cache, label_cache, last_read, note, unread)
|
||||||
|
VALUES
|
||||||
|
('$ref_id', '', NULL, NULL, $owner_uid, true, '', '', NOW(), '', false)");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
24
utility.css
24
utility.css
|
@ -118,4 +118,28 @@ div.rss hr {
|
||||||
border-color : #e0e0e0;
|
border-color : #e0e0e0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body#sharepopup {
|
||||||
|
background : #88b0f0;
|
||||||
|
margin : 10px;
|
||||||
|
padding : 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#sharepopup h1 {
|
||||||
|
font-size : 14px;
|
||||||
|
margin : 0px;
|
||||||
|
color : #88b0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#sharepopup table {
|
||||||
|
background : white;
|
||||||
|
border : 1px solid black;
|
||||||
|
padding : 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#sharepopup form {
|
||||||
|
height : 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#sharepopup input {
|
||||||
|
width : 100%;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue