From ea4d9b0f35b77273809da83f9103af130c99d82b Mon Sep 17 00:00:00 2001 From: Shahar Talmi Date: Tue, 23 Sep 2014 10:38:45 +0300 Subject: [PATCH] fix($browser): do not decode cookies that do not appear encoded Closes #9211 --- src/ng/browser.js | 12 ++++++++++-- test/ng/browserSpecs.js | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index e769c4535f15..5c1d603acab0 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -266,6 +266,14 @@ function Browser(window, document, $log, $sniffer) { var lastCookieString = ''; var cookiePath = self.baseHref(); + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + /** * @name $browser#cookies * @@ -319,12 +327,12 @@ function Browser(window, document, $log, $sniffer) { cookie = cookieArray[i]; index = cookie.indexOf('='); if (index > 0) { //ignore nameless cookies - name = decodeURIComponent(cookie.substring(0, index)); + name = safeDecodeURIComponent(cookie.substring(0, index)); // the first value that is seen for a cookie is the most // specific one. values for the same cookie name that // follow are for less specific paths. if (lastCookies[name] === undefined) { - lastCookies[name] = decodeURIComponent(cookie.substring(index + 1)); + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); } } } diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index f5a4359625c2..e6082b25f178 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -236,7 +236,7 @@ describe('browser', function() { expect(oldVal).not.toBeDefined(); }); - it('should escape both name and value', function() { + it('should encode both name and value', function() { browser.cookies('cookie1=', 'val;ue'); browser.cookies('cookie2=bar;baz', 'val=ue'); @@ -312,7 +312,7 @@ describe('browser', function() { expect(browser.cookies()['foo']).toBe('"first"'); }); - it ('should unescape cookie values that were escaped by puts', function() { + it ('should decode cookie values that were encoded by puts', function() { document.cookie = "cookie2%3Dbar%3Bbaz=val%3Due;path=/"; expect(browser.cookies()['cookie2=bar;baz']).toEqual('val=ue'); }); @@ -324,10 +324,15 @@ describe('browser', function() { expect(browser.cookies()['cookie name']).not.toBeDefined(); }); - it('should unscape special characters in cookie values', function() { + it('should decode special characters in cookie values', function() { document.cookie = 'cookie_name=cookie_value_%E2%82%AC'; expect(browser.cookies()['cookie_name']).toEqual('cookie_value_€'); }); + + it('should not decode cookie values that do not appear to be encoded', function() { + document.cookie = 'cookie_name=cookie_value_%XX'; + expect(browser.cookies()['cookie_name']).toEqual('cookie_value_%XX'); + }); });