From f705f2065695c059e7fd5b5de875f005c1e0e006 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 11 Nov 2010 14:26:44 +0300 Subject: [PATCH] check regular expression before adding/saving filter --- functions.js | 98 ++++++++++++++++------------------------- modules/backend-rpc.php | 16 +++++++ prefs.js | 55 ++++++++++++++++++++--- tt-rss.js | 50 +++++++++++++++++++++ 4 files changed, 151 insertions(+), 68 deletions(-) diff --git a/functions.js b/functions.js index 9e65a6dce..56285b731 100644 --- a/functions.js +++ b/functions.js @@ -577,55 +577,6 @@ function parse_counters(reply, scheduled_call) { } */ -function handle_rpc_reply(transport, scheduled_call) { - try { - if (offline_mode) return false; - - if (!transport.responseText && db) { - offlineConfirmModeChange(); - return false; - } - - if (transport.responseXML) { - - if (!transport_error_check(transport)) return false; - - var message = transport.responseXML.getElementsByTagName("message")[0]; - - if (message) { - message = message.firstChild.nodeValue; - - if (message == "UPDATE_COUNTERS") { - setInitParam("last_article_id", -1); - _force_scheduled_update = true; - } - } - - var counters = transport.responseXML.getElementsByTagName("counters")[0]; - - if (counters) - parse_counters(counters, scheduled_call); - - var runtime_info = transport.responseXML.getElementsByTagName("runtime-info")[0]; - - if (runtime_info) - parse_runtime_info(runtime_info); - - if (feedsSortByUnread()) - resort_feedlist(); - - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - - } else { - notify_error("Error communicating with server."); - } - - } catch (e) { - exception_error("handle_rpc_reply", e, transport); - } - - return true; -} function get_feed_unread(id) { try { @@ -1290,20 +1241,45 @@ function createFilter() { alert(__("Can't add filter: nothing to match on.")); return false; } + + var query = "?op=rpc&subop=verifyRegexp®_exp=" + param_escape(reg_exp); + + notify_progress("Verifying regular expression..."); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + handle_rpc_reply(transport); + + var response = transport.responseXML; + + if (response) { + var s = response.getElementsByTagName("status")[0].firstChild.nodeValue; - var query = Form.serialize("filter_add_form"); - - // we can be called from some other tab in Prefs - if (typeof active_tab != 'undefined' && active_tab) { - active_tab = "filterConfig"; - } - - new Ajax.Request("backend.php?" + query, { - onComplete: function (transport) { - infobox_submit_callback2(transport); + notify(''); + + if (s == "INVALID") { + alert("Match regular expression seems to be invalid."); + return; + } else { + + var query = Form.serialize("filter_add_form"); + + // we can be called from some other tab in Prefs + if (typeof active_tab != 'undefined' && active_tab) { + active_tab = "filterConfig"; + } + + new Ajax.Request("backend.php?" + query, { + onComplete: function (transport) { + infobox_submit_callback2(transport); + } }); + + return true; + } + } + } }); - - return true; } catch (e) { exception_error("createFilter", e); diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index 8eacb199e..6792fae7f 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -1128,6 +1128,22 @@ return; } + if ($subop == "verifyRegexp") { + $reg_exp = $_REQUEST["reg_exp"]; + + print ""; + + if (@preg_match("/$reg_exp/i", "TEST") === false) { + print "INVALID"; + } else { + print "OK"; + } + + print ""; + + return; + } + print "Unknown method: $subop"; } ?> diff --git a/prefs.js b/prefs.js index ed8d1679c..2d8b02942 100644 --- a/prefs.js +++ b/prefs.js @@ -764,19 +764,44 @@ function userEditSave() { function filterEditSave() { - try { + var reg_exp = document.forms["filter_edit_form"].reg_exp.value; - notify_progress("Saving filter..."); - - var query = "?" + Form.serialize("filter_edit_form"); - - closeInfoBox(); + var query = "?op=rpc&subop=verifyRegexp®_exp=" + param_escape(reg_exp); + + notify_progress("Verifying regular expression..."); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - filterlist_callback2(transport); + handle_rpc_reply(transport); + + var response = transport.responseXML; + + if (response) { + var s = response.getElementsByTagName("status")[0].firstChild.nodeValue; + + notify(''); + + if (s == "INVALID") { + alert("Match regular expression seems to be invalid."); + return; + } else { + + var query = "?" + Form.serialize("filter_edit_form"); + + notify_progress("Saving filter..."); + + Form.disable("filter_edit_form"); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + closeInfoBox(); + filterlist_callback2(transport); + } }); + } + } } }); } catch (e) { @@ -2099,4 +2124,20 @@ function clearFeedAccessKeys() { return false; } +function handle_rpc_reply(transport, scheduled_call) { + try { + if (transport.responseXML) { + + if (!transport_error_check(transport)) return false; + + } else { + notify_error("Error communicating with server."); + } + + } catch (e) { + exception_error("handle_rpc_reply", e, transport); + } + + return true; +} diff --git a/tt-rss.js b/tt-rss.js index b97a19aa1..e755faf70 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -1250,3 +1250,53 @@ function showFeedsWithErrors() { displayDlg('feedUpdateErrors'); } +function handle_rpc_reply(transport, scheduled_call) { + try { + if (offline_mode) return false; + + if (!transport.responseText && db) { + offlineConfirmModeChange(); + return false; + } + + if (transport.responseXML) { + + if (!transport_error_check(transport)) return false; + + var message = transport.responseXML.getElementsByTagName("message")[0]; + + if (message) { + message = message.firstChild.nodeValue; + + if (message == "UPDATE_COUNTERS") { + setInitParam("last_article_id", -1); + _force_scheduled_update = true; + } + } + + var counters = transport.responseXML.getElementsByTagName("counters")[0]; + + if (counters) + parse_counters(counters, scheduled_call); + + var runtime_info = transport.responseXML.getElementsByTagName("runtime-info")[0]; + + if (runtime_info) + parse_runtime_info(runtime_info); + + if (feedsSortByUnread()) + resort_feedlist(); + + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + + } else { + notify_error("Error communicating with server."); + } + + } catch (e) { + exception_error("handle_rpc_reply", e, transport); + } + + return true; +} +