From d51124689d199ef3796c09f4353ef595bd3827b0 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 12 Dec 2011 23:32:29 +0400 Subject: [PATCH] add tiny-OOP style backend RPC --- backend.php | 26 +- classes/handler.php | 15 + classes/rpc.php | 792 ++++++++++++++++++++++++++++++++++ js/digest.js | 10 +- modules/backend-rpc.php | 911 ---------------------------------------- 5 files changed, 832 insertions(+), 922 deletions(-) create mode 100644 classes/handler.php create mode 100644 classes/rpc.php delete mode 100644 modules/backend-rpc.php diff --git a/backend.php b/backend.php index 0e485de70..c9eed0e9a 100644 --- a/backend.php +++ b/backend.php @@ -16,6 +16,13 @@ $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } + function __autoload($class) { + $file = "classes/".strtolower(basename($class)).".php"; + if (file_exists($file)) { + require $file; + } + } + $op = $_REQUEST["op"]; require_once "functions.php"; @@ -43,7 +50,7 @@ init_connection($link); - $method = $_REQUEST["method"]; + $method = strtolower($_REQUEST["method"]); $mode = $_REQUEST["mode"]; if ((!$op || $op == "rss" || $op == "dlg") && !$_REQUEST["noxml"]) { @@ -136,12 +143,19 @@ return; } - switch($op) { // Select action according to $op value. - case "rpc": - require_once "modules/backend-rpc.php"; - handle_rpc_request($link); - break; // rpc + if (class_exists($op)) { + $handler = new $op($link, $_REQUEST); + if ($handler) { + if ($handler->before()) { + if (method_exists($handler, $method)) { + return $handler->$method(); + } + } + } + } + + switch($op) { // Select action according to $op value. case "feeds": $method = $_REQUEST["method"]; $root = (bool)$_REQUEST["root"]; diff --git a/classes/handler.php b/classes/handler.php new file mode 100644 index 000000000..3bd82c725 --- /dev/null +++ b/classes/handler.php @@ -0,0 +1,15 @@ +link = $link; + $this->args = $args; + } + + function before() { + return true; + } +} +?> diff --git a/classes/rpc.php b/classes/rpc.php new file mode 100644 index 000000000..8f03381f8 --- /dev/null +++ b/classes/rpc.php @@ -0,0 +1,792 @@ +link, "DELETE FROM ttrss_settings_profiles WHERE id = '$id' AND + owner_uid = " . $_SESSION["uid"]); + } + } + } + + // Silent + function addprofile() { + $title = db_escape_string(trim($_REQUEST["title"])); + if ($title) { + db_query($this->link, "BEGIN"); + + $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles + WHERE title = '$title' AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) == 0) { + + db_query($this->link, "INSERT INTO ttrss_settings_profiles (title, owner_uid) + VALUES ('$title', ".$_SESSION["uid"] .")"); + + $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles WHERE + title = '$title'"); + + if (db_num_rows($result) != 0) { + $profile_id = db_fetch_result($result, 0, "id"); + + if ($profile_id) { + initialize_user_prefs($this->link, $_SESSION["uid"], $profile_id); + } + } + } + + db_query($this->link, "COMMIT"); + } + } + + // Silent + function saveprofile() { + $id = db_escape_string($_REQUEST["id"]); + $title = db_escape_string(trim($_REQUEST["value"])); + + if ($id == 0) { + print __("Default profile"); + return; + } + + if ($title) { + db_query($this->link, "BEGIN"); + + $result = db_query($this->link, "SELECT id FROM ttrss_settings_profiles + WHERE title = '$title' AND owner_uid =" . $_SESSION["uid"]); + + if (db_num_rows($result) == 0) { + db_query($this->link, "UPDATE ttrss_settings_profiles + SET title = '$title' WHERE id = '$id' AND + owner_uid = " . $_SESSION["uid"]); + print $title; + } else { + $result = db_query($this->link, "SELECT title FROM ttrss_settings_profiles + WHERE id = '$id' AND owner_uid =" . $_SESSION["uid"]); + print db_fetch_result($result, 0, "title"); + } + + db_query($this->link, "COMMIT"); + } + } + + // Silent + function remarchive() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + + foreach ($ids as $id) { + $result = db_query($this->link, "DELETE FROM ttrss_archived_feeds WHERE + (SELECT COUNT(*) FROM ttrss_user_entries + WHERE orig_feed_id = '$id') = 0 AND + id = '$id' AND owner_uid = ".$_SESSION["uid"]); + + $rc = db_affected_rows($this->link, $result); + } + } + + function addfeed() { + $feed = db_escape_string($_REQUEST['feed']); + $cat = db_escape_string($_REQUEST['cat']); + $login = db_escape_string($_REQUEST['login']); + $pass = db_escape_string($_REQUEST['pass']); + + $rc = subscribe_to_feed($this->link, $feed, $cat, $login, $pass); + + print json_encode(array("result" => $rc)); + } + + function extractfeedurls() { + $urls = get_feeds_from_html($_REQUEST['url']); + + print json_encode(array("urls" => $urls)); + } + + function togglepref() { + $key = db_escape_string($_REQUEST["key"]); + set_pref($this->link, $key, !get_pref($this->link, $key)); + $value = get_pref($this->link, $key); + + print json_encode(array("param" =>$key, "value" => $value)); + } + + function setpref() { + $value = str_replace("\n", "
", $_REQUEST['value']); + + $key = db_escape_string($_REQUEST["key"]); + $value = db_escape_string($value); + + set_pref($this->link, $key, $value); + + print json_encode(array("param" =>$key, "value" => $value)); + } + + function mark() { + $mark = $_REQUEST["mark"]; + $id = db_escape_string($_REQUEST["id"]); + + if ($mark == "1") { + $mark = "true"; + } else { + $mark = "false"; + } + + $result = db_query($this->link, "UPDATE ttrss_user_entries SET marked = $mark + WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function delete() { + $ids = db_escape_string($_REQUEST["ids"]); + + $result = db_query($this->link, "DELETE FROM ttrss_user_entries + WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function unarchive() { + $ids = db_escape_string($_REQUEST["ids"]); + + $result = db_query($this->link, "UPDATE ttrss_user_entries + SET feed_id = orig_feed_id, orig_feed_id = NULL + WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function archive() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + + foreach ($ids as $id) { + archive_article($this->link, $id, $_SESSION["uid"]); + } + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function publ() { + $pub = $_REQUEST["pub"]; + $id = db_escape_string($_REQUEST["id"]); + $note = trim(strip_tags(db_escape_string($_REQUEST["note"]))); + + if ($pub == "1") { + $pub = "true"; + } else { + $pub = "false"; + } + + $result = db_query($this->link, "UPDATE ttrss_user_entries SET + published = $pub + WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); + + $pubsub_result = false; + + if (PUBSUBHUBBUB_HUB) { + $rss_link = get_self_url_prefix() . + "/public.php?op=rss&id=-2&key=" . + get_feed_access_key($this->link, -2, false); + + $p = new Publisher(PUBSUBHUBBUB_HUB); + + $pubsub_result = $p->publish_update($rss_link); + } + + print json_encode(array("message" => "UPDATE_COUNTERS", + "pubsub_result" => $pubsub_result)); + } + + function getAllCounters() { + $last_article_id = (int) $_REQUEST["last_article_id"]; + + $reply = array(); + + if ($seq) $reply['seq'] = $seq; + + if ($last_article_id != getLastArticleId($this->link)) { + $omode = $_REQUEST["omode"]; + + if ($omode != "T") + $reply['counters'] = getAllCounters($this->link, $omode); + else + $reply['counters'] = getGlobalCounters($this->link); + } + + $reply['runtime-info'] = make_runtime_info($this->link); + + print json_encode($reply); + } + + /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */ + function catchupSelected() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $cmode = sprintf("%d", $_REQUEST["cmode"]); + + catchupArticlesById($this->link, $ids, $cmode); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function markSelected() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $cmode = sprintf("%d", $_REQUEST["cmode"]); + + markArticlesById($this->link, $ids, $cmode); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function publishSelected() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $cmode = sprintf("%d", $_REQUEST["cmode"]); + + publishArticlesById($this->link, $ids, $cmode); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function sanityCheck() { + $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true"; + + $reply = array(); + + $reply['error'] = sanity_check($this->link); + + if ($reply['error']['code'] == 0) { + $reply['init-params'] = make_init_params($this->link); + $reply['runtime-info'] = make_runtime_info($this->link); + } + + print json_encode($reply); + } + + function setArticleTags() { + global $memcache; + + $id = db_escape_string($_REQUEST["id"]); + + $tags_str = db_escape_string($_REQUEST["tags_str"]); + $tags = array_unique(trim_array(explode(",", $tags_str))); + + db_query($this->link, "BEGIN"); + + $result = db_query($this->link, "SELECT int_id FROM ttrss_user_entries WHERE + ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1"); + + if (db_num_rows($result) == 1) { + + $tags_to_cache = array(); + + $int_id = db_fetch_result($result, 0, "int_id"); + + db_query($this->link, "DELETE FROM ttrss_tags WHERE + post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'"); + + foreach ($tags as $tag) { + $tag = sanitize_tag($tag); + + if (!tag_is_valid($tag)) { + continue; + } + + if (preg_match("/^[0-9]*$/", $tag)) { + continue; + } + + // print ""; + + if ($tag != '') { + db_query($this->link, "INSERT INTO ttrss_tags + (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')"); + } + + array_push($tags_to_cache, $tag); + } + + /* update tag cache */ + + sort($tags_to_cache); + $tags_str = join(",", $tags_to_cache); + + db_query($this->link, "UPDATE ttrss_user_entries + SET tag_cache = '$tags_str' WHERE ref_id = '$id' + AND owner_uid = " . $_SESSION["uid"]); + } + + db_query($this->link, "COMMIT"); + + if ($memcache) { + $obj_id = md5("TAGS:".$_SESSION["uid"].":$id"); + $memcache->delete($obj_id); + } + + $tags = get_article_tags($this->link, $id); + $tags_str = format_tags_string($tags, $id); + $tags_str_full = join(", ", $tags); + + if (!$tags_str_full) $tags_str_full = __("no tags"); + + print json_encode(array("tags_str" => array("id" => $id, + "content" => $tags_str, "content_full" => $tags_str_full))); + } + + function regenOPMLKey() { + update_feed_access_key($this->link, 'OPML:Publish', + false, $_SESSION["uid"]); + + $new_link = opml_publish_url($this->link); + + print json_encode(array("link" => $new_link)); + } + + function completeTags() { + $search = db_escape_string($_REQUEST["search"]); + + $result = db_query($this->link, "SELECT DISTINCT tag_name FROM ttrss_tags + WHERE owner_uid = '".$_SESSION["uid"]."' AND + tag_name LIKE '$search%' ORDER BY tag_name + LIMIT 10"); + + print ""; + } + + function purge() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $days = sprintf("%d", $_REQUEST["days"]); + + foreach ($ids as $id) { + + $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE + id = '$id' AND owner_uid = ".$_SESSION["uid"]); + + if (db_num_rows($result) == 1) { + purge_feed($this->link, $id, $days); + } + } + } + + function getArticles() { + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $articles = array(); + + foreach ($ids as $id) { + if ($id) { + array_push($articles, format_article($this->link, $id, 0, false)); + } + } + + print json_encode($articles); + } + + function checkDate() { + $date = db_escape_string($_REQUEST["date"]); + $date_parsed = strtotime($date); + + print json_encode(array("result" => (bool)$date_parsed, + "date" => date("c", $date_parsed))); + } + + function assigntolabel() { + return labelops(true); + } + + function removefromlabel() { + return labelops(false); + } + + function labelops($assign) { + $reply = array(); + + $ids = explode(",", db_escape_string($_REQUEST["ids"])); + $label_id = db_escape_string($_REQUEST["lid"]); + + $label = db_escape_string(label_find_caption($this->link, $label_id, + $_SESSION["uid"])); + + $reply["info-for-headlines"] = array(); + + if ($label) { + + foreach ($ids as $id) { + + if ($assign) + label_add_article($this->link, $id, $label, $_SESSION["uid"]); + else + label_remove_article($this->link, $id, $label, $_SESSION["uid"]); + + $labels = get_article_labels($this->link, $id, $_SESSION["uid"]); + + array_push($reply["info-for-headlines"], + array("id" => $id, "labels" => format_article_labels($labels, $id))); + + } + } + + $reply["message"] = "UPDATE_COUNTERS"; + + print json_encode($reply); + } + + function updateFeedBrowser() { + $search = db_escape_string($_REQUEST["search"]); + $limit = db_escape_string($_REQUEST["limit"]); + $mode = (int) db_escape_string($_REQUEST["mode"]); + + print json_encode(array("content" => + make_feed_browser($this->link, $search, $limit, $mode), + "mode" => $mode)); + } + + // Silent + function massSubscribe() { + + $payload = json_decode($_REQUEST["payload"], false); + $mode = $_REQUEST["mode"]; + + if (!$payload || !is_array($payload)) return; + + if ($mode == 1) { + foreach ($payload as $feed) { + + $title = db_escape_string($feed[0]); + $feed_url = db_escape_string($feed[1]); + + $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE + feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) == 0) { + $result = db_query($this->link, "INSERT INTO ttrss_feeds + (owner_uid,feed_url,title,cat_id,site_url) + VALUES ('".$_SESSION["uid"]."', + '$feed_url', '$title', NULL, '')"); + } + } + } else if ($mode == 2) { + // feed archive + foreach ($payload as $id) { + $result = db_query($this->link, "SELECT * FROM ttrss_archived_feeds + WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) != 0) { + $site_url = db_escape_string(db_fetch_result($result, 0, "site_url")); + $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url")); + $title = db_escape_string(db_fetch_result($result, 0, "title")); + + $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE + feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) == 0) { + $result = db_query($this->link, "INSERT INTO ttrss_feeds + (owner_uid,feed_url,title,cat_id,site_url) + VALUES ('$id','".$_SESSION["uid"]."', + '$feed_url', '$title', NULL, '$site_url')"); + } + } + } + } + } + + function digestgetcontents() { + $article_id = db_escape_string($_REQUEST['article_id']); + + $result = db_query($this->link, "SELECT content,title,link,marked,published + FROM ttrss_entries, ttrss_user_entries + WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']); + + $content = sanitize_rss($this->link, db_fetch_result($result, 0, "content")); + $title = strip_tags(db_fetch_result($result, 0, "title")); + $article_url = htmlspecialchars(db_fetch_result($result, 0, "link")); + $marked = sql_bool_to_bool(db_fetch_result($result, 0, "marked")); + $published = sql_bool_to_bool(db_fetch_result($result, 0, "published")); + + print json_encode(array("article" => + array("id" => $article_id, "url" => $article_url, + "tags" => get_article_tags($this->link, $article_id), + "marked" => $marked, "published" => $published, + "title" => $title, "content" => $content))); + } + + function digestupdate() { + $feed_id = db_escape_string($_REQUEST['feed_id']); + $offset = db_escape_string($_REQUEST['offset']); + $seq = db_escape_string($_REQUEST['seq']); + + if (!$feed_id) $feed_id = -4; + if (!$offset) $offset = 0; + + $reply = array(); + + $reply['seq'] = $seq; + + $headlines = api_get_headlines($this->link, $feed_id, 30, $offset, + '', ($feed_id == -4), true, false, "unread", "updated DESC", 0, 0); + + $reply['headlines'] = array(); + $reply['headlines']['title'] = getFeedTitle($this->link, $feed_id); + $reply['headlines']['content'] = $headlines; + + print json_encode($reply); + } + + function digestinit() { + $tmp_feeds = api_get_feeds($this->link, -4, true, false, 0); + + $feeds = array(); + + foreach ($tmp_feeds as $f) { + if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f); + } + + print json_encode(array("feeds" => $feeds)); + } + + function catchupFeed() { + $feed_id = db_escape_string($_REQUEST['feed_id']); + $is_cat = db_escape_string($_REQUEST['is_cat']) == "true"; + + catchup_feed($this->link, $feed_id, $is_cat); + + print json_encode(array("message" => "UPDATE_COUNTERS")); + } + + function sendEmail() { + $secretkey = $_REQUEST['secretkey']; + + require_once 'lib/phpmailer/class.phpmailer.php'; + + $reply = array(); + + if (DIGEST_ENABLE && $_SESSION['email_secretkey'] && + $secretkey == $_SESSION['email_secretkey']) { + + $_SESSION['email_secretkey'] = ''; + + $destination = $_REQUEST['destination']; + $subject = $_REQUEST['subject']; + $content = $_REQUEST['content']; + + $replyto = strip_tags($_SESSION['email_replyto']); + $fromname = strip_tags($_SESSION['email_fromname']); + + $mail = new PHPMailer(); + + $mail->PluginDir = "lib/phpmailer/"; + $mail->SetLanguage("en", "lib/phpmailer/language/"); + + $mail->CharSet = "UTF-8"; + + $mail->From = $replyto; + $mail->FromName = $fromname; + $mail->AddAddress($destination); + + if (DIGEST_SMTP_HOST) { + $mail->Host = DIGEST_SMTP_HOST; + $mail->Mailer = "smtp"; + $mail->SMTPAuth = DIGEST_SMTP_LOGIN != ''; + $mail->Username = DIGEST_SMTP_LOGIN; + $mail->Password = DIGEST_SMTP_PASSWORD; + } + + $mail->IsHTML(false); + $mail->Subject = $subject; + $mail->Body = $content; + + $rc = $mail->Send(); + + if (!$rc) { + $reply['error'] = $mail->ErrorInfo; + } else { + save_email_address($this->link, db_escape_string($destination)); + $reply['message'] = "UPDATE_COUNTERS"; + } + + } else { + $reply['error'] = "Not authorized."; + } + + print json_encode($reply); + } + + function completeEmails() { + $search = db_escape_string($_REQUEST["search"]); + + print ""; + } + + function quickAddCat() { + $cat = db_escape_string($_REQUEST["cat"]); + + add_feed_category($this->link, $cat); + + $result = db_query($this->link, "SELECT id FROM ttrss_feed_categories WHERE + title = '$cat' AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) == 1) { + $id = db_fetch_result($result, 0, "id"); + } else { + $id = 0; + } + + print_feed_cat_select($this->link, "cat_id", $id); + } + + function regenFeedKey() { + $feed_id = db_escape_string($_REQUEST['id']); + $is_cat = db_escape_string($_REQUEST['is_cat']) == "true"; + + $new_key = update_feed_access_key($this->link, $feed_id, $is_cat); + + print json_encode(array("link" => $new_key)); + } + + // Silent + function clearKeys() { + db_query($this->link, "DELETE FROM ttrss_access_keys WHERE + owner_uid = " . $_SESSION["uid"]); + } + + // Silent + function clearArticleKeys() { + db_query($this->link, "UPDATE ttrss_user_entries SET uuid = '' WHERE + owner_uid = " . $_SESSION["uid"]); + + return; + } + + + function verifyRegexp() { + $reg_exp = $_REQUEST["reg_exp"]; + + $status = @preg_match("/$reg_exp/i", "TEST") !== false; + + print json_encode(array("status" => $status)); + } + + // TODO: unify with digest-get-contents? + function cdmGetArticle() { + $ids = array(db_escape_string($_REQUEST["id"])); + $cids = explode(",", $_REQUEST["cids"]); + + $ids = array_merge($ids, $cids); + + $rv = array(); + + foreach ($ids as $id) { + $id = (int)$id; + + $result = db_query($this->link, "SELECT content, + ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds, + ttrss_entries + WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND + ttrss_entries.id = ref_id AND + ttrss_user_entries.owner_uid = ".$_SESSION["uid"]); + + if (db_num_rows($result) != 0) { + $line = db_fetch_assoc($result); + + $article_content = sanitize_rss($this->link, $line["content"], + false, false, $line['site_url']); + + array_push($rv, + array("id" => $id, "content" => $article_content)); + } + } + + print json_encode($rv); + } + + function scheduleFeedUpdate() { + $feed_id = db_escape_string($_REQUEST["id"]); + $is_cat = db_escape_string($_REQUEST['is_cat']) == 'true'; + + $message = __("Your request could not be completed."); + + if ($feed_id >= 0) { + if (!$is_cat) { + $message = __("Feed update has been scheduled."); + + db_query($this->link, "UPDATE ttrss_feeds SET + last_update_started = '1970-01-01', + last_updated = '1970-01-01' WHERE id = '$feed_id' AND + owner_uid = ".$_SESSION["uid"]); + + } else { + $message = __("Category update has been scheduled."); + + if ($feed_id) + $cat_query = "cat_id = '$feed_id'"; + else + $cat_query = "cat_id IS NULL"; + + db_query($this->link, "UPDATE ttrss_feeds SET + last_update_started = '1970-01-01', + last_updated = '1970-01-01' WHERE $cat_query AND + owner_uid = ".$_SESSION["uid"]); + } + } else { + $message = __("Can't update this kind of feed."); + } + + print json_encode(array("message" => $message)); + return; + } + + function getTweetInfo() { + $id = db_escape_string($_REQUEST['id']); + + $result = db_query($this->link, "SELECT title, link + FROM ttrss_entries, ttrss_user_entries + WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']); + + if (db_num_rows($result) != 0) { + $title = truncate_string(strip_tags(db_fetch_result($result, 0, 'title')), + 100, '...'); + $article_link = db_fetch_result($result, 0, 'link'); + } + + print json_encode(array("title" => $title, "link" => $article_link, + "id" => $id)); + } + + function setNote() { + $id = db_escape_string($_REQUEST["id"]); + $note = trim(strip_tags(db_escape_string($_REQUEST["note"]))); + + db_query($this->link, "UPDATE ttrss_user_entries SET note = '$note' + WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); + + $formatted_note = format_article_note($id, $note); + + print json_encode(array("note" => $formatted_note, + "raw_length" => mb_strlen($note))); + } + + function genHash() { + $hash = sha1(uniqid(rand(), true)); + + print json_encode(array("hash" => $hash)); + } +} +?> diff --git a/js/digest.js b/js/digest.js index c1cbf8762..fc0446d83 100644 --- a/js/digest.js +++ b/js/digest.js @@ -169,7 +169,7 @@ function update(callback) { window.clearTimeout(_update_timeout); new Ajax.Request("backend.php", { - parameters: "?op=rpc&method=digest-init", + parameters: "?op=rpc&method=digestinit", onComplete: function(transport) { fatal_error_check(transport); parse_feeds(transport); @@ -220,7 +220,7 @@ function view(article_id) { }, 500); new Ajax.Request("backend.php", { - parameters: "?op=rpc&method=digest-get-contents&article_id=" + + parameters: "?op=rpc&method=digestgetcontents&article_id=" + article_id, onComplete: function(transport) { fatal_error_check(transport); @@ -315,14 +315,14 @@ function viewfeed(feed_id, offset, replace, no_effects, no_indicator, callback) if (!offset) $("headlines").scrollTop = 0; - var query = "backend.php?op=rpc&method=digest-update&feed_id=" + + var query = "backend.php?op=rpc&method=digestupdate&feed_id=" + param_escape(feed_id) + "&offset=" + offset + "&seq=" + _update_seq; console.log(query); var img = false; - + if ($("F-" + feed_id)) { img = $("F-" + feed_id).getElementsByTagName("IMG")[0]; @@ -648,7 +648,7 @@ function parse_headlines(transport, replace, no_effects) { function init_second_stage() { try { new Ajax.Request("backend.php", { - parameters: "backend.php?op=rpc&method=digest-init", + parameters: "backend.php?op=rpc&method=digestinit", onComplete: function(transport) { parse_feeds(transport); Element.hide("overlay"); diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php deleted file mode 100644 index 341353480..000000000 --- a/modules/backend-rpc.php +++ /dev/null @@ -1,911 +0,0 @@ - $rc)); - - return; - - } - - if ($method == "extractfeedurls") { - - $urls = get_feeds_from_html($_REQUEST['url']); - - print json_encode(array("urls" => $urls)); - return; - } - - if ($method == "togglepref") { - $key = db_escape_string($_REQUEST["key"]); - set_pref($link, $key, !get_pref($link, $key)); - $value = get_pref($link, $key); - - print json_encode(array("param" =>$key, "value" => $value)); - return; - } - - if ($method == "setpref") { - $value = str_replace("\n", "
", $_REQUEST['value']); - - $key = db_escape_string($_REQUEST["key"]); - $value = db_escape_string($value); - - set_pref($link, $key, $value); - - print json_encode(array("param" =>$key, "value" => $value)); - return; - } - - if ($method == "mark") { - $mark = $_REQUEST["mark"]; - $id = db_escape_string($_REQUEST["id"]); - - if ($mark == "1") { - $mark = "true"; - } else { - $mark = "false"; - } - - $result = db_query($link, "UPDATE ttrss_user_entries SET marked = $mark - WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "delete") { - $ids = db_escape_string($_REQUEST["ids"]); - - $result = db_query($link, "DELETE FROM ttrss_user_entries - WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "unarchive") { - $ids = db_escape_string($_REQUEST["ids"]); - - $result = db_query($link, "UPDATE ttrss_user_entries - SET feed_id = orig_feed_id, orig_feed_id = NULL - WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "archive") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - - foreach ($ids as $id) { - archive_article($link, $id, $_SESSION["uid"]); - } - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "publ") { - $pub = $_REQUEST["pub"]; - $id = db_escape_string($_REQUEST["id"]); - $note = trim(strip_tags(db_escape_string($_REQUEST["note"]))); - - if ($pub == "1") { - $pub = "true"; - } else { - $pub = "false"; - } - - $result = db_query($link, "UPDATE ttrss_user_entries SET - published = $pub - WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); - - $pubsub_result = false; - - if (PUBSUBHUBBUB_HUB) { - $rss_link = get_self_url_prefix() . - "/public.php?op=rss&id=-2&key=" . - get_feed_access_key($link, -2, false); - - $p = new Publisher(PUBSUBHUBBUB_HUB); - - $pubsub_result = $p->publish_update($rss_link); - } - - print json_encode(array("message" => "UPDATE_COUNTERS", - "pubsub_result" => $pubsub_result)); - return; - } - - // Silent - /* if ($method == "update") { - $feed_id = db_escape_string($_REQUEST["feed"]); - update_rss_feed($link, $feed_id); - return; - } */ - - if ($method == "updateAllFeeds" || $method == "getAllCounters") { - $last_article_id = (int) $_REQUEST["last_article_id"]; - - $reply = array(); - - if ($seq) $reply['seq'] = $seq; - - if ($last_article_id != getLastArticleId($link)) { - $omode = $_REQUEST["omode"]; - - if ($omode != "T") - $reply['counters'] = getAllCounters($link, $omode); - else - $reply['counters'] = getGlobalCounters($link); - } - - $reply['runtime-info'] = make_runtime_info($link); - - - print json_encode($reply); - return; - } - - /* GET["cmode"] = 0 - mark as read, 1 - as unread, 2 - toggle */ - if ($method == "catchupSelected") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $cmode = sprintf("%d", $_REQUEST["cmode"]); - - catchupArticlesById($link, $ids, $cmode); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "markSelected") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $cmode = sprintf("%d", $_REQUEST["cmode"]); - - markArticlesById($link, $ids, $cmode); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "publishSelected") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $cmode = sprintf("%d", $_REQUEST["cmode"]); - - publishArticlesById($link, $ids, $cmode); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "sanityCheck") { - $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true"; - - $reply = array(); - - $reply['error'] = sanity_check($link); - - if ($reply['error']['code'] == 0) { - $reply['init-params'] = make_init_params($link); - $reply['runtime-info'] = make_runtime_info($link); - } - - print json_encode($reply); - return; - } - - if ($method == "setArticleTags") { - global $memcache; - - $id = db_escape_string($_REQUEST["id"]); - - $tags_str = db_escape_string($_REQUEST["tags_str"]); - $tags = array_unique(trim_array(explode(",", $tags_str))); - - db_query($link, "BEGIN"); - - $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE - ref_id = '$id' AND owner_uid = '".$_SESSION["uid"]."' LIMIT 1"); - - if (db_num_rows($result) == 1) { - - $tags_to_cache = array(); - - $int_id = db_fetch_result($result, 0, "int_id"); - - db_query($link, "DELETE FROM ttrss_tags WHERE - post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'"); - - foreach ($tags as $tag) { - $tag = sanitize_tag($tag); - - if (!tag_is_valid($tag)) { - continue; - } - - if (preg_match("/^[0-9]*$/", $tag)) { - continue; - } - -// print ""; - - if ($tag != '') { - db_query($link, "INSERT INTO ttrss_tags - (post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')"); - } - - array_push($tags_to_cache, $tag); - } - - /* update tag cache */ - - sort($tags_to_cache); - $tags_str = join(",", $tags_to_cache); - - db_query($link, "UPDATE ttrss_user_entries - SET tag_cache = '$tags_str' WHERE ref_id = '$id' - AND owner_uid = " . $_SESSION["uid"]); - } - - db_query($link, "COMMIT"); - - if ($memcache) { - $obj_id = md5("TAGS:".$_SESSION["uid"].":$id"); - $memcache->delete($obj_id); - } - - $tags = get_article_tags($link, $id); - $tags_str = format_tags_string($tags, $id); - $tags_str_full = join(", ", $tags); - - if (!$tags_str_full) $tags_str_full = __("no tags"); - - print json_encode(array("tags_str" => array("id" => $id, - "content" => $tags_str, "content_full" => $tags_str_full))); - - return; - } - - if ($method == "regenOPMLKey") { - update_feed_access_key($link, 'OPML:Publish', - false, $_SESSION["uid"]); - - $new_link = opml_publish_url($link); - - print json_encode(array("link" => $new_link)); - return; - } - - if ($method == "completeTags") { - $search = db_escape_string($_REQUEST["search"]); - - $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags - WHERE owner_uid = '".$_SESSION["uid"]."' AND - tag_name LIKE '$search%' ORDER BY tag_name - LIMIT 10"); - - print ""; - - return; - } - - if ($method == "purge") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $days = sprintf("%d", $_REQUEST["days"]); - - foreach ($ids as $id) { - - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - id = '$id' AND owner_uid = ".$_SESSION["uid"]); - - if (db_num_rows($result) == 1) { - purge_feed($link, $id, $days); - } - } - - return; - } - -/* if ($method == "setScore") { - $id = db_escape_string($_REQUEST["id"]); - $score = sprintf("%d", $_REQUEST["score"]); - - $result = db_query($link, "UPDATE ttrss_user_entries SET score = '$score' - WHERE ref_id = '$id' AND owner_uid = ".$_SESSION["uid"]); - - print "Acknowledged."; - - return; - - } */ - - if ($method == "getArticles") { - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $articles = array(); - - foreach ($ids as $id) { - if ($id) { - array_push($articles, format_article($link, $id, 0, false)); - } - } - - print json_encode($articles); - return; - } - - if ($method == "checkDate") { - $date = db_escape_string($_REQUEST["date"]); - $date_parsed = strtotime($date); - - print json_encode(array("result" => (bool)$date_parsed, - "date" => date("c", $date_parsed))); - return; - } - - if ($method == "assignToLabel" || $method == "removeFromLabel") { - $reply = array(); - - $ids = explode(",", db_escape_string($_REQUEST["ids"])); - $label_id = db_escape_string($_REQUEST["lid"]); - - $label = db_escape_string(label_find_caption($link, $label_id, - $_SESSION["uid"])); - - $reply["info-for-headlines"] = array(); - - if ($label) { - - foreach ($ids as $id) { - - if ($method == "assignToLabel") - label_add_article($link, $id, $label, $_SESSION["uid"]); - else - label_remove_article($link, $id, $label, $_SESSION["uid"]); - - $labels = get_article_labels($link, $id, $_SESSION["uid"]); - - array_push($reply["info-for-headlines"], - array("id" => $id, "labels" => format_article_labels($labels, $id))); - - } - } - - $reply["message"] = "UPDATE_COUNTERS"; - - print json_encode($reply); - - return; - } - - if ($method == "updateFeedBrowser") { - $search = db_escape_string($_REQUEST["search"]); - $limit = db_escape_string($_REQUEST["limit"]); - $mode = (int) db_escape_string($_REQUEST["mode"]); - - print json_encode(array("content" => - make_feed_browser($link, $search, $limit, $mode), - "mode" => $mode)); - return; - } - - // Silent - if ($method == "massSubscribe") { - - $payload = json_decode($_REQUEST["payload"], false); - $mode = $_REQUEST["mode"]; - - if (!$payload || !is_array($payload)) return; - - if ($mode == 1) { - foreach ($payload as $feed) { - - $title = db_escape_string($feed[0]); - $feed_url = db_escape_string($feed[1]); - - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]); - - if (db_num_rows($result) == 0) { - $result = db_query($link, "INSERT INTO ttrss_feeds - (owner_uid,feed_url,title,cat_id,site_url) - VALUES ('".$_SESSION["uid"]."', - '$feed_url', '$title', NULL, '')"); - } - } - } else if ($mode == 2) { - // feed archive - foreach ($payload as $id) { - $result = db_query($link, "SELECT * FROM ttrss_archived_feeds - WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]); - - if (db_num_rows($result) != 0) { - $site_url = db_escape_string(db_fetch_result($result, 0, "site_url")); - $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url")); - $title = db_escape_string(db_fetch_result($result, 0, "title")); - - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]); - - if (db_num_rows($result) == 0) { - $result = db_query($link, "INSERT INTO ttrss_feeds - (owner_uid,feed_url,title,cat_id,site_url) - VALUES ('$id','".$_SESSION["uid"]."', - '$feed_url', '$title', NULL, '$site_url')"); - } - } - } - } - -/* $ids = explode(",", db_escape_string($_REQUEST["ids"])); - - $subscribed = array(); - - foreach ($ids as $id) { - - if ($mode == 1) { - $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds - WHERE id = '$id'"); - } else if ($mode == 2) { - $result = db_query($link, "SELECT * FROM ttrss_archived_feeds - WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]); - $orig_id = db_escape_string(db_fetch_result($result, 0, "id")); - $site_url = db_escape_string(db_fetch_result($result, 0, "site_url")); - } - - $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url")); - $title = db_escape_string(db_fetch_result($result, 0, "title")); - - $title_orig = db_fetch_result($result, 0, "title"); - - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]); - - if (db_num_rows($result) == 0) { - if ($mode == 1) { - $result = db_query($link, - "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id) - VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)"); - } else if ($mode == 2) { - $result = db_query($link, - "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url) - VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')"); - } - array_push($subscribed, $title_orig); - } - } */ - - return; - } - - if ($method == "digest-get-contents") { - $article_id = db_escape_string($_REQUEST['article_id']); - - $result = db_query($link, "SELECT content,title,link,marked,published - FROM ttrss_entries, ttrss_user_entries - WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']); - - $content = sanitize_rss($link, db_fetch_result($result, 0, "content")); - $title = strip_tags(db_fetch_result($result, 0, "title")); - $article_url = htmlspecialchars(db_fetch_result($result, 0, "link")); - $marked = sql_bool_to_bool(db_fetch_result($result, 0, "marked")); - $published = sql_bool_to_bool(db_fetch_result($result, 0, "published")); - - - print json_encode(array("article" => - array("id" => $article_id, "url" => $article_url, - "tags" => get_article_tags($link, $article_id), - "marked" => $marked, "published" => $published, - "title" => $title, "content" => $content))); - return; - } - - if ($method == "digest-update") { - $feed_id = db_escape_string($_REQUEST['feed_id']); - $offset = db_escape_string($_REQUEST['offset']); - $seq = db_escape_string($_REQUEST['seq']); - - if (!$feed_id) $feed_id = -4; - if (!$offset) $offset = 0; - - $reply = array(); - - $reply['seq'] = $seq; - - $headlines = api_get_headlines($link, $feed_id, 30, $offset, - '', ($feed_id == -4), true, false, "unread", "updated DESC", 0, 0); - - //function api_get_headlines($link, $feed_id, $limit, $offset, - // $filter, $is_cat, $show_excerpt, $show_content, $view_mode) { - - $reply['headlines'] = array(); - $reply['headlines']['title'] = getFeedTitle($link, $feed_id); - $reply['headlines']['content'] = $headlines; - - print json_encode($reply); - return; - } - - if ($method == "digest-init") { - $tmp_feeds = api_get_feeds($link, -4, true, false, 0); - - $feeds = array(); - - foreach ($tmp_feeds as $f) { - if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f); - } - - print json_encode(array("feeds" => $feeds)); - - return; - } - - if ($method == "catchupFeed") { - $feed_id = db_escape_string($_REQUEST['feed_id']); - $is_cat = db_escape_string($_REQUEST['is_cat']) == "true"; - - catchup_feed($link, $feed_id, $is_cat); - - print json_encode(array("message" => "UPDATE_COUNTERS")); - return; - } - - if ($method == "sendEmail") { - $secretkey = $_REQUEST['secretkey']; - - require_once 'lib/phpmailer/class.phpmailer.php'; - - $reply = array(); - - if (DIGEST_ENABLE && $_SESSION['email_secretkey'] && - $secretkey == $_SESSION['email_secretkey']) { - - $_SESSION['email_secretkey'] = ''; - - $destination = $_REQUEST['destination']; - $subject = $_REQUEST['subject']; - $content = $_REQUEST['content']; - - $replyto = strip_tags($_SESSION['email_replyto']); - $fromname = strip_tags($_SESSION['email_fromname']); - - $mail = new PHPMailer(); - - $mail->PluginDir = "lib/phpmailer/"; - $mail->SetLanguage("en", "lib/phpmailer/language/"); - - $mail->CharSet = "UTF-8"; - - $mail->From = $replyto; - $mail->FromName = $fromname; - $mail->AddAddress($destination); - - if (DIGEST_SMTP_HOST) { - $mail->Host = DIGEST_SMTP_HOST; - $mail->Mailer = "smtp"; - $mail->SMTPAuth = DIGEST_SMTP_LOGIN != ''; - $mail->Username = DIGEST_SMTP_LOGIN; - $mail->Password = DIGEST_SMTP_PASSWORD; - } - - $mail->IsHTML(false); - $mail->Subject = $subject; - $mail->Body = $content; - - $rc = $mail->Send(); - - if (!$rc) { - $reply['error'] = $mail->ErrorInfo; - } else { - save_email_address($link, db_escape_string($destination)); - $reply['message'] = "UPDATE_COUNTERS"; - } - - } else { - $reply['error'] = "Not authorized."; - } - - print json_encode($reply); - return; - } - - if ($method == "completeEmails") { - $search = db_escape_string($_REQUEST["search"]); - - print ""; - - return; - } - - if ($method == "quickAddCat") { - $cat = db_escape_string($_REQUEST["cat"]); - - add_feed_category($link, $cat); - - $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE - title = '$cat' AND owner_uid = " . $_SESSION["uid"]); - - if (db_num_rows($result) == 1) { - $id = db_fetch_result($result, 0, "id"); - } else { - $id = 0; - } - - print_feed_cat_select($link, "cat_id", $id); - - return; - } - - if ($method == "regenFeedKey") { - $feed_id = db_escape_string($_REQUEST['id']); - $is_cat = db_escape_string($_REQUEST['is_cat']) == "true"; - - $new_key = update_feed_access_key($link, $feed_id, $is_cat); - - print json_encode(array("link" => $new_key)); - return; - } - - // Silent - if ($method == "clearKeys") { - db_query($link, "DELETE FROM ttrss_access_keys WHERE - owner_uid = " . $_SESSION["uid"]); - - return; - } - - // Silent - if ($method == "clearArticleKeys") { - db_query($link, "UPDATE ttrss_user_entries SET uuid = '' WHERE - owner_uid = " . $_SESSION["uid"]); - - return; - } - - - if ($method == "verifyRegexp") { - $reg_exp = $_REQUEST["reg_exp"]; - - $status = @preg_match("/$reg_exp/i", "TEST") !== false; - - print json_encode(array("status" => $status)); - return; - } - - // TODO: unify with digest-get-contents? - if ($method == "cdmGetArticle") { - $ids = array(db_escape_string($_REQUEST["id"])); - $cids = explode(",", $_REQUEST["cids"]); - - $ids = array_merge($ids, $cids); - - $rv = array(); - - foreach ($ids as $id) { - $id = (int)$id; - - $result = db_query($link, "SELECT content, - ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds, - ttrss_entries - WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND - ttrss_entries.id = ref_id AND - ttrss_user_entries.owner_uid = ".$_SESSION["uid"]); - - if (db_num_rows($result) != 0) { - $line = db_fetch_assoc($result); - - $article_content = sanitize_rss($link, $line["content"], - false, false, $line['site_url']); - - array_push($rv, - array("id" => $id, "content" => $article_content)); - } - } - - print json_encode($rv); - - return; - } - - if ($method == "scheduleFeedUpdate") { - $feed_id = db_escape_string($_REQUEST["id"]); - $is_cat = db_escape_string($_REQUEST['is_cat']) == 'true'; - - $message = __("Your request could not be completed."); - - if ($feed_id >= 0) { - if (!$is_cat) { - $message = __("Feed update has been scheduled."); - - db_query($link, "UPDATE ttrss_feeds SET - last_update_started = '1970-01-01', - last_updated = '1970-01-01' WHERE id = '$feed_id' AND - owner_uid = ".$_SESSION["uid"]); - - } else { - $message = __("Category update has been scheduled."); - - if ($feed_id) - $cat_query = "cat_id = '$feed_id'"; - else - $cat_query = "cat_id IS NULL"; - - db_query($link, "UPDATE ttrss_feeds SET - last_update_started = '1970-01-01', - last_updated = '1970-01-01' WHERE $cat_query AND - owner_uid = ".$_SESSION["uid"]); - } - } else { - $message = __("Can't update this kind of feed."); - } - - print json_encode(array("message" => $message)); - return; - } - - if ($method == "getTweetInfo") { - $id = db_escape_string($_REQUEST['id']); - - $result = db_query($link, "SELECT title, link - FROM ttrss_entries, ttrss_user_entries - WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']); - - if (db_num_rows($result) != 0) { - $title = truncate_string(strip_tags(db_fetch_result($result, 0, 'title')), - 100, '...'); - $article_link = db_fetch_result($result, 0, 'link'); - } - - print json_encode(array("title" => $title, "link" => $article_link, - "id" => $id)); - - return; - } - - if ($method == "setNote") { - $id = db_escape_string($_REQUEST["id"]); - $note = trim(strip_tags(db_escape_string($_REQUEST["note"]))); - - db_query($link, "UPDATE ttrss_user_entries SET note = '$note' - WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]); - - $formatted_note = format_article_note($id, $note); - - print json_encode(array("note" => $formatted_note, - "raw_length" => mb_strlen($note))); - return; - } - - if ($method == "genHash") { - $hash = sha1(uniqid(rand(), true)); - - print json_encode(array("hash" => $hash)); - return; - } - - print json_encode(array("error" => array("code" => 7, - "message" => "Unknown method: $method"))); - } -?>