implement sharing articles by unique url

This commit is contained in:
Andrew Dolgov 2011-10-04 13:11:07 +04:00
parent 359fc686dd
commit 83cd33fcec
11 changed files with 136 additions and 8 deletions

View file

@ -59,7 +59,7 @@
} }
if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" && if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" &&
$op != "rss" && $op != "getUnread" && $op != "getProfiles" && $op != "rss" && $op != "getUnread" && $op != "getProfiles" && $op != "share" &&
$op != "fbexport" && $op != "logout" && $op != "pubsub") { $op != "fbexport" && $op != "logout" && $op != "pubsub") {
if ($op == 'pref-feeds' && $_REQUEST['subop'] == 'add') { if ($op == 'pref-feeds' && $_REQUEST['subop'] == 'add') {
@ -633,6 +633,28 @@
} }
break; // fbexport break; // fbexport
case "share":
$uuid = db_escape_string($_REQUEST["key"]);
$result = db_query($link, "SELECT ref_id, owner_uid FROM ttrss_user_entries WHERE
uuid = '$uuid'");
if (db_num_rows($result) != 0) {
header("Content-Type: text/html");
$id = db_fetch_result($result, 0, "ref_id");
$owner_uid = db_fetch_result($result, 0, "owner_uid");
$article = format_article($link, $id, false, true);
print_r($article['content']);
} else {
print "Article not found.";
}
break;
default: default:
header("Content-Type: text/plain"); header("Content-Type: text/plain");
print json_encode(array("error" => array("code" => 7))); print json_encode(array("error" => array("code" => 7)));

View file

@ -1275,9 +1275,9 @@
$result = db_query($link, $result = db_query($link,
"INSERT INTO ttrss_user_entries "INSERT INTO ttrss_user_entries
(ref_id, owner_uid, feed_id, unread, last_read, marked, (ref_id, owner_uid, feed_id, unread, last_read, marked,
published, score, tag_cache, label_cache) published, score, tag_cache, label_cache, uuid)
VALUES ('$ref_id', '$owner_uid', '$feed', $unread, VALUES ('$ref_id', '$owner_uid', '$feed', $unread,
$last_read_qpart, $marked, $published, '$score', '', '')"); $last_read_qpart, $marked, $published, '$score', '', '', '')");
if (PUBSUBHUBBUB_HUB && $published == 'true') { if (PUBSUBHUBBUB_HUB && $published == 'true') {
$rss_link = get_self_url_prefix() . $rss_link = get_self_url_prefix() .
@ -4927,6 +4927,11 @@
alt='Zoom' title='".__('Share on Twitter')."'>"; alt='Zoom' title='".__('Share on Twitter')."'>";
} }
$rv['content'] .= "<img src=\"".theme_image($link, 'images/art-share.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"shareArticle(".$line['int_id'].")\"
alt='Zoom' title='".__('Share by URL')."'>";
$rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\" $rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
class='tagsPic' style=\"cursor : pointer\" class='tagsPic' style=\"cursor : pointer\"
onclick=\"closeArticlePanel($id)\" onclick=\"closeArticlePanel($id)\"

View file

@ -783,6 +783,15 @@
return; return;
} }
// Silent
if ($subop == "clearArticleKeys") {
db_query($link, "UPDATE ttrss_user_entries SET uuid = '' WHERE
owner_uid = " . $_SESSION["uid"]);
return;
}
if ($subop == "verifyRegexp") { if ($subop == "verifyRegexp") {
$reg_exp = $_REQUEST["reg_exp"]; $reg_exp = $_REQUEST["reg_exp"];

View file

@ -1071,12 +1071,52 @@
__('Cancel')."</button></div>"; __('Cancel')."</button></div>";
return; return;
}
if ($id == "shareArticle") {
$result = db_query($link, "SELECT uuid, ref_id FROM ttrss_user_entries WHERE int_id = '$param'
AND owner_uid = " . $_SESSION['uid']);
if (db_num_rows($result) == 0) {
print "Article not found.";
} else {
$uuid = db_fetch_result($result, 0, "uuid");
$ref_id = db_fetch_result($result, 0, "ref_id");
if (!$uuid) {
$uuid = db_escape_string(sha1(uniqid(rand(), true)));
db_query($link, "UPDATE ttrss_user_entries SET uuid = '$uuid' WHERE int_id = '$param'
AND owner_uid = " . $_SESSION['uid']);
}
print __("You can share this article by the following unique URL:");
$url_path = get_self_url_prefix();
$url_path .= "/backend.php?op=share&key=$uuid";
print "<div class=\"tagCloudContainer\">";
print "<a id='pub_opml_url' href='$url_path' target='_blank'>$url_path</a>";
print "</div>";
/* if (!label_find_id($link, __('Shared'), $_SESSION["uid"]))
label_create($link, __('Shared'), $_SESSION["uid"]);
label_add_article($link, $ref_id, __('Shared'), $_SESSION['uid']); */
}
print "<div align='center'>";
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('shareArticleDlg').hide()\">".
__('Close this window')."</button>";
print "</div>";
return;
} }
print "</dlg>"; print "</dlg>";
} }
?> ?>

View file

@ -1506,7 +1506,9 @@
print "</div>"; #pane print "</div>"; #pane
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Published articles and generated feeds')."\">"; print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Published & shared articles and generated feeds')."\">";
print "<h3>" . __("Published articles and generated feeds") . "</h3>";
print "<p>".__('Published articles are exported as a public RSS feed and can be subscribed by anyone who knows the URL specified below.')."</p>"; print "<p>".__('Published articles are exported as a public RSS feed and can be subscribed by anyone who knows the URL specified below.')."</p>";
@ -1519,6 +1521,13 @@
print "<button dojoType=\"dijit.form.Button\" onclick=\"return clearFeedAccessKeys()\">". print "<button dojoType=\"dijit.form.Button\" onclick=\"return clearFeedAccessKeys()\">".
__('Clear all generated URLs')."</button> "; __('Clear all generated URLs')."</button> ";
print "<h3>" . __("Articles shared by URL") . "</h3>";
print "<p>" . __("You can disable all articles shared by unique URLs here.") . "</p>";
print "<button dojoType=\"dijit.form.Button\" onclick=\"return clearArticleAccessKeys()\">".
__('Unshare all articles')."</button> ";
print "</div>"; #pane print "</div>"; #pane
if (defined('CONSUMER_KEY') && CONSUMER_KEY != '') { if (defined('CONSUMER_KEY') && CONSUMER_KEY != '') {

View file

@ -1590,6 +1590,24 @@ function clearFeedAccessKeys() {
return false; return false;
} }
function clearArticleAccessKeys() {
var ok = confirm(__("This will invalidate all previously shared article URLs. Continue?"));
if (ok) {
notify_progress("Clearing URLs...");
var query = "?op=rpc&subop=clearArticleKeys";
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
notify_info("Shared URLs cleared.");
} });
}
return false;
}
function resetFeedOrder() { function resetFeedOrder() {
try { try {
notify_progress("Loading, please wait..."); notify_progress("Loading, please wait...");

View file

@ -2,7 +2,7 @@
require_once "functions.php"; require_once "functions.php";
define('EXPECTED_CONFIG_VERSION', 23); define('EXPECTED_CONFIG_VERSION', 23);
define('SCHEMA_VERSION', 85); define('SCHEMA_VERSION', 86);
if (!file_exists("config.php")) { if (!file_exists("config.php")) {
print "<b>Fatal Error</b>: You forgot to copy print "<b>Fatal Error</b>: You forgot to copy

View file

@ -152,6 +152,7 @@ create index ttrss_entries_updated_idx on ttrss_entries(updated);
create table ttrss_user_entries ( create table ttrss_user_entries (
int_id integer not null primary key auto_increment, int_id integer not null primary key auto_increment,
ref_id integer not null, ref_id integer not null,
uuid varchar(200) not null,
feed_id int, feed_id int,
orig_feed_id int, orig_feed_id int,
owner_uid integer not null, owner_uid integer not null,
@ -254,7 +255,7 @@ create table ttrss_tags (id integer primary key auto_increment,
create table ttrss_version (schema_version int not null) ENGINE=InnoDB DEFAULT CHARSET=UTF8; create table ttrss_version (schema_version int not null) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
insert into ttrss_version values (85); insert into ttrss_version values (86);
create table ttrss_enclosures (id integer primary key auto_increment, create table ttrss_enclosures (id integer primary key auto_increment,
content_url text not null, content_url text not null,

View file

@ -137,6 +137,7 @@ create index ttrss_entries_updated_idx on ttrss_entries(updated);
create table ttrss_user_entries ( create table ttrss_user_entries (
int_id serial not null primary key, int_id serial not null primary key,
ref_id integer not null references ttrss_entries(id) ON DELETE CASCADE, ref_id integer not null references ttrss_entries(id) ON DELETE CASCADE,
uuid varchar(200) not null,
feed_id int references ttrss_feeds(id) ON DELETE CASCADE, feed_id int references ttrss_feeds(id) ON DELETE CASCADE,
orig_feed_id integer references ttrss_archived_feeds(id) ON DELETE SET NULL, orig_feed_id integer references ttrss_archived_feeds(id) ON DELETE SET NULL,
owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE, owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
@ -225,7 +226,7 @@ create index ttrss_tags_post_int_id_idx on ttrss_tags(post_int_id);
create table ttrss_version (schema_version int not null); create table ttrss_version (schema_version int not null);
insert into ttrss_version values (85); insert into ttrss_version values (86);
create table ttrss_enclosures (id serial not null primary key, create table ttrss_enclosures (id serial not null primary key,
content_url text not null, content_url text not null,

View file

@ -1,4 +1,4 @@
body#ttrssMain, body#ttrssPrefs, body#ttrssLogin { body#ttrssMain, body#ttrssPrefs, body#ttrssLogin, body {
background : white; background : white;
color : black; color : black;
margin : 0px; margin : 0px;

View file

@ -2184,6 +2184,7 @@ function precache_headlines() {
feed_precache_timeout_id = false; feed_precache_timeout_id = false;
}, 3000); }, 3000);
x
}, 1000); }, 1000);
} }
@ -2191,3 +2192,25 @@ function precache_headlines() {
exception_error("precache_headlines", e); exception_error("precache_headlines", e);
} }
} }
function shareArticle(id) {
try {
if (dijit.byId("shareArticleDlg"))
dijit.byId("shareArticleDlg").destroyRecursive();
var query = "backend.php?op=dlg&id=shareArticle&param=" + param_escape(id);
dialog = new dijit.Dialog({
id: "shareArticleDlg",
title: __("Share article by URL"),
style: "width: 600px",
href: query});
dialog.show();
} catch (e) {
exception_error("emailArticle", e);
}
}