From 7b4c3a2cdbc0f5ac9d237f91164ee8fea8210095 Mon Sep 17 00:00:00 2001 From: Einar Egilsson Date: Mon, 19 Oct 2009 09:56:04 +0000 Subject: Check for loop redirects implemented git-svn-id: http://einaregilsson.googlecode.com/svn/mozilla/redirector/trunk@280 119bf307-c92d-0410-89bd-8f53e6181181 --- chrome/content/code/redirect.js | 5 ++++- chrome/content/code/redirector.prototype.js | 21 ++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) (limited to 'chrome/content') diff --git a/chrome/content/code/redirect.js b/chrome/content/code/redirect.js index 02e975d..7016715 100644 --- a/chrome/content/code/redirect.js +++ b/chrome/content/code/redirect.js @@ -163,11 +163,14 @@ Redirect.prototype = { for (var i = 1; i < matches.length; i++) { resultUrl = resultUrl.replace(new RegExp('\\$' + i, 'gi'), this.unescapeMatches ? unescape(matches[i]) : matches[i]); } + this._rxInclude.lastIndex = 0; return resultUrl; }, _excludeMatch : function(url) { - return !!(this._rxExclude && this._rxExclude.exec(url)); + var shouldExclude = !!(this._rxExclude && this._rxExclude.exec(url)); + this._rxExclude.lastIndex = 0; + return shouldExclude; }, clone : function() { diff --git a/chrome/content/code/redirector.prototype.js b/chrome/content/code/redirector.prototype.js index 9135e50..991c289 100644 --- a/chrome/content/code/redirector.prototype.js +++ b/chrome/content/code/redirector.prototype.js @@ -97,7 +97,6 @@ Redirector.prototype = { //Get the redirect url for the given url. This will not check if we are enabled, and //not do any verification on the url, just assume that it is a good string url that is for http/s getRedirectUrl : function(url) { - //This is also done in getRedirectUrl, but we want to exit as quickly as possible for performance this.debug("Checking " + url); for each (var redirect in this.list) { @@ -108,8 +107,20 @@ Redirector.prototype = { this.debug(url + ' matched pattern ' + redirect.includePattern + ' but the redirect is disabled'); } else if (result.isMatch) { redirectUrl = this.makeAbsoluteUrl(url, result.redirectTo); - this.debug('Redirecting ' + url + ' to ' + redirectUrl); - return redirectUrl; + + //check for loops... + result = redirect.getMatch(redirectUrl); + if (result.isMatch) { + var title = this.getString('invalidRedirectTitle'); + var msg = this.getFormattedString('invalidRedirectText', [redirect.includePattern, url, redirectUrl]); + this.debug(msg); + redirect.disabled = true; + this.save(); + this.msgBox(title, msg); + } else { + this.debug('Redirecting ' + url + ' to ' + redirectUrl); + return redirectUrl; + } } } return null; @@ -249,6 +260,10 @@ Redirector.prototype = { return this.strings.GetStringFromName(name); }, + getFormattedString : function(name, params) { + return this.strings.formatStringFromName(name, params, params.length); + }, + msgBox : function(title, text) { Cc["@mozilla.org/embedcomp/prompt-service;1"] .getService(Ci.nsIPromptService) -- cgit v1.2.3-70-g09d2