diff --git a/classes/api.php b/classes/api.php index 2e9c1b90..cce1d2a7 100644 --- a/classes/api.php +++ b/classes/api.php @@ -2,7 +2,7 @@ class API extends Handler { - const API_LEVEL = 3; + const API_LEVEL = 4; const STATUS_OK = 0; const STATUS_ERR = 1; @@ -419,6 +419,17 @@ class API extends Handler { 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')); + } + } } ?> diff --git a/classes/handler/public.php b/classes/handler/public.php index 983f0aaa..cd46fa03 100644 --- a/classes/handler/public.php +++ b/classes/handler/public.php @@ -306,5 +306,75 @@ class Handler_Public extends Handler { // Update all feeds needing a update. update_daemon_common($this->link, 0, true, false); } + + function sharepopup() { + header('Content-Type: text/html; charset=utf-8'); + print " + + Tiny Tiny RSS + + + + + "; + + $action = $_REQUEST["action"]; + + if ($_SESSION["uid"]) { + + if (!$action) { + + print ""; + + print ""; + + print ""; + print ""; + + $title = htmlspecialchars($_REQUEST["title"]); + $url = htmlspecialchars($_REQUEST["url"]); + + print ""; + print ""; + print ""; + + print ""; + + print "
"; + print "

Publish with Tiny Tiny RSS

"; + print "
".__("Title:")."
".__("URL:")."
".__("Content:")."
+ + + "; + + print ""; + print "
"; + + print ""; + + } 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 ""; + } + + } else { + + print "
" . __("Not logged in.") . "
"; + + } + } + } ?> diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index ef308ee1..d6bb94eb 100644 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -1557,7 +1557,7 @@ class Pref_Feeds extends Handler_Protected { print ""; # pane } - print "
"; + print "
"; print "

" . __("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.") . "

"; @@ -1569,6 +1569,12 @@ class Pref_Feeds extends Handler_Protected { print "" . __('Subscribe in Tiny Tiny RSS'). ""; + print "

" . __("Use this bookmarklet to publish arbitrary pages using Tiny Tiny RSS") . "

"; + + $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 "" . __('Share with Tiny Tiny RSS'). ""; + print "
"; #pane print "
"; diff --git a/classes/rpc.php b/classes/rpc.php index db34a6c9..73364913 100644 --- a/classes/rpc.php +++ b/classes/rpc.php @@ -2,7 +2,7 @@ class RPC extends Handler_Protected { function csrf_ignore($method) { - $csrf_ignored = array("sanitycheck", "buttonplugin", "exportget"); + $csrf_ignored = array("sanitycheck", "buttonplugin", "exportget", "sharepopup"); return array_search($method, $csrf_ignored) !== false; } diff --git a/include/functions.php b/include/functions.php index b9383790..bbf7dd8d 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2326,6 +2326,8 @@ $limit_query_part = "LIMIT " . $limit; } + $allow_archived = false; + $vfeed_query_part = ""; // override query strategy and enable feed display when searching globally @@ -2397,6 +2399,7 @@ } } else if ($feed == 0 && !$cat_view) { // archive virtual feed $query_strategy_part = "feed_id IS NULL"; + $allow_archived = true; } else if ($feed == 0 && $cat_view) { // uncategorized $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; @@ -2408,6 +2411,7 @@ if (!$cat_view) { $query_strategy_part = "published = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + $allow_archived = true; } else { $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"; $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; + } + ?> diff --git a/utility.css b/utility.css index 14357b4d..c4fd63fc 100644 --- a/utility.css +++ b/utility.css @@ -118,4 +118,28 @@ div.rss hr { 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%; +}