From e35cf3d5b5696853d2260460729a86fcd9eea624 Mon Sep 17 00:00:00 2001 From: Honza Bambas Date: Wed, 18 Feb 2009 14:31:31 +0100 Subject: [PATCH] Bug 452401 - Create tests for mixed content, r=kaie --HG-- rename : security/manager/ssl/tests/mochitest/test_bug413909.html => security/manager/ssl/tests/mochitest/bugs/test_bug413909.html --- build/automation.py.in | 4 +- .../manager/ssl/tests/mochitest/Makefile.in | 15 +- .../ssl/tests/mochitest/bugs/Makefile.in | 53 +++++ .../mochitest/{ => bugs}/test_bug413909.html | 0 .../tests/mochitest/mixedcontent/Makefile.in | 106 +++++++++ .../mochitest/mixedcontent/alloworigin.sjs | 6 + .../mochitest/mixedcontent/backward.html | 20 ++ .../tests/mochitest/mixedcontent/bug329869.js | 3 + .../mixedcontent/bug383369step2.html | 30 +++ .../mixedcontent/bug383369step3.html | 29 +++ .../mochitest/mixedcontent/download.auto | 1 + .../mixedcontent/download.auto^headers^ | 2 + .../mochitest/mixedcontent/emptyimage.sjs | 5 + .../tests/mochitest/mixedcontent/hugebmp.sjs | 13 ++ .../tests/mochitest/mixedcontent/iframe.html | 12 + .../tests/mochitest/mixedcontent/iframe2.html | 13 ++ .../mixedcontent/iframeMetaRedirect.html | 8 + .../mixedcontent/iframesecredirect.sjs | 5 + .../mixedcontent/iframeunsecredirect.sjs | 5 + .../mochitest/mixedcontent/imgsecredirect.sjs | 5 + .../mixedcontent/imgunsecredirect.sjs | 5 + .../mixedcontent/mixedContentTest.js | 210 ++++++++++++++++++ .../mochitest/mixedcontent/moonsurface.jpg | Bin 0 -> 52159 bytes .../mixedcontent/redirecttoemptyimage.sjs | 5 + .../mochitest/mixedcontent/somestyle.css | 4 + .../mixedcontent/test_bug329869.html | 34 +++ .../mixedcontent/test_bug383369.html | 91 ++++++++ .../mixedcontent/test_bug455367.html | 30 +++ .../mixedcontent/test_bug472986.html | 42 ++++ .../mixedcontent/test_cssBefore1.html | 38 ++++ .../mixedcontent/test_cssContent1.html | 37 +++ .../mixedcontent/test_cssContent2.html | 37 +++ .../mixedcontent/test_documentWrite1.html | 33 +++ .../mixedcontent/test_documentWrite2.html | 33 +++ .../test_dynDelayedUnsecurePicture.html | 42 ++++ .../test_dynDelayedUnsecureXHR.html | 46 ++++ .../test_dynUnsecureBackground.html | 40 ++++ .../test_dynUnsecureIframeRedirect.html | 38 ++++ .../mixedcontent/test_dynUnsecurePicture.html | 41 ++++ .../test_dynUnsecurePicturePreload.html | 32 +++ .../test_dynUnsecureRedirect.html | 39 ++++ .../test_innerHtmlDelayedUnsecurePicture.html | 40 ++++ .../test_innerHtmlUnsecurePicture.html | 36 +++ .../mixedcontent/test_secureAll.html | 38 ++++ .../mixedcontent/test_securePicture.html | 32 +++ .../mixedcontent/test_unsecureBackground.html | 31 +++ .../mixedcontent/test_unsecureCSS.html | 32 +++ .../mixedcontent/test_unsecureIframe.html | 30 +++ .../mixedcontent/test_unsecureIframe2.html | 30 +++ .../test_unsecureIframeMetaRedirect.html | 37 +++ .../test_unsecureIframeRedirect.html | 31 +++ .../mixedcontent/test_unsecurePicture.html | 30 +++ .../mixedcontent/test_unsecurePictureDup.html | 20 ++ .../test_unsecurePictureInIframe.html | 30 +++ .../mixedcontent/test_unsecureRedirect.html | 30 +++ .../mixedcontent/unsecureIframe.html | 9 + .../mixedcontent/unsecurePictureDup.html | 30 +++ 57 files changed, 1688 insertions(+), 10 deletions(-) create mode 100644 security/manager/ssl/tests/mochitest/bugs/Makefile.in rename security/manager/ssl/tests/mochitest/{ => bugs}/test_bug413909.html (100%) create mode 100755 security/manager/ssl/tests/mochitest/mixedcontent/Makefile.in create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/alloworigin.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/backward.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/bug329869.js create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/bug383369step2.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/bug383369step3.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/download.auto create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/download.auto^headers^ create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/emptyimage.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/hugebmp.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/iframe.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/iframe2.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/iframeMetaRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/iframesecredirect.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/iframeunsecredirect.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/imgsecredirect.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/imgunsecredirect.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/mixedContentTest.js create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/moonsurface.jpg create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/redirecttoemptyimage.sjs create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/somestyle.css create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_bug329869.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_bug383369.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_bug455367.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_bug472986.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_cssBefore1.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent1.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent2.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecurePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecureXHR.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureBackground.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureIframeRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicturePreload.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlDelayedUnsecurePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlUnsecurePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_secureAll.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_securePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureBackground.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureCSS.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframe.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframe2.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeMetaRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePicture.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureDup.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureInIframe.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureRedirect.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/unsecureIframe.html create mode 100644 security/manager/ssl/tests/mochitest/mixedcontent/unsecurePictureDup.html diff --git a/build/automation.py.in b/build/automation.py.in index 7e57216335fb..475a5cd5a986 100644 --- a/build/automation.py.in +++ b/build/automation.py.in @@ -241,9 +241,11 @@ user_pref("javascript.options.jit.content", true); user_pref("gfx.color_management.force_srgb", true); user_pref("network.manage-offline-status", false); user_pref("security.default_personal_cert", "Select Automatically"); // Need to client auth test be w/o any dialogs +user_pref("security.warn_viewing_mixed", false); user_pref("camino.warn_when_closing", false); // Camino-only, harmless to others -""" +""" % { "downloadDir": (os.path.join(profileDir, "downloads")) } + prefs.append(part) # Increase the max script run time 10-fold for debug builds diff --git a/security/manager/ssl/tests/mochitest/Makefile.in b/security/manager/ssl/tests/mochitest/Makefile.in index 6828453be9dc..f35a4f68889a 100644 --- a/security/manager/ssl/tests/mochitest/Makefile.in +++ b/security/manager/ssl/tests/mochitest/Makefile.in @@ -40,14 +40,11 @@ DEPTH = ../../../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ -relativesrcdir = security/ssl -include $(DEPTH)/config/autoconf.mk +MODULE = pipnss +DIRS = \ + bugs \ + mixedcontent \ + $(NULL) + include $(topsrcdir)/config/rules.mk - - _CHROME_FILES = \ - test_bug413909.html \ - $(NULL) - - libs:: $(_CHROME_FILES) - $(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir) diff --git a/security/manager/ssl/tests/mochitest/bugs/Makefile.in b/security/manager/ssl/tests/mochitest/bugs/Makefile.in new file mode 100644 index 000000000000..e27909cd87fc --- /dev/null +++ b/security/manager/ssl/tests/mochitest/bugs/Makefile.in @@ -0,0 +1,53 @@ +# +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Mozilla Foundation. +# Portions created by the Initial Developer are Copyright (C) 2007 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Jan Bambas +# +# Alternatively, the contents of this file may be used under the terms of +# either of the GNU General Public License Version 2 or later (the "GPL"), +# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +DEPTH = ../../../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +relativesrcdir = security/ssl + +include $(DEPTH)/config/autoconf.mk +include $(topsrcdir)/config/rules.mk + + _CHROME_FILES = \ + test_bug413909.html \ + $(NULL) + + libs:: $(_CHROME_FILES) + $(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir) diff --git a/security/manager/ssl/tests/mochitest/test_bug413909.html b/security/manager/ssl/tests/mochitest/bugs/test_bug413909.html similarity index 100% rename from security/manager/ssl/tests/mochitest/test_bug413909.html rename to security/manager/ssl/tests/mochitest/bugs/test_bug413909.html diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/Makefile.in b/security/manager/ssl/tests/mochitest/mixedcontent/Makefile.in new file mode 100755 index 000000000000..46f53249dd5f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/Makefile.in @@ -0,0 +1,106 @@ +# +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Mozilla Foundation. +# Portions created by the Initial Developer are Copyright (C) 2007 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Jan Bambas +# +# Alternatively, the contents of this file may be used under the terms of +# either of the GNU General Public License Version 2 or later (the "GPL"), +# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +DEPTH = ../../../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +relativesrcdir = security/ssl/mixedcontent + +include $(DEPTH)/config/autoconf.mk +include $(topsrcdir)/config/rules.mk + +_TEST_FILES = \ + alloworigin.sjs \ + backward.html \ + bug329869.js \ + bug383369step2.html \ + bug383369step3.html \ + download.auto \ + download.auto^headers^ \ + emptyimage.sjs \ + hugebmp.sjs \ + iframe.html \ + iframe2.html \ + iframeMetaRedirect.html \ + iframesecredirect.sjs \ + iframeunsecredirect.sjs \ + imgsecredirect.sjs \ + imgunsecredirect.sjs \ + mixedContentTest.js \ + moonsurface.jpg \ + redirecttoemptyimage.sjs \ + somestyle.css \ + test_bug383369.html \ + test_bug455367.html \ + test_bug472986.html \ + test_cssBefore1.html \ + test_cssContent1.html \ + test_cssContent2.html \ + test_documentWrite1.html \ + test_documentWrite2.html \ + test_dynDelayedUnsecurePicture.html \ + test_dynDelayedUnsecureXHR.html \ + test_dynUnsecureBackground.html \ + test_dynUnsecureIframeRedirect.html \ + test_dynUnsecurePicture.html \ + test_dynUnsecurePicturePreload.html \ + test_dynUnsecureRedirect.html \ + test_innerHtmlDelayedUnsecurePicture.html \ + test_innerHtmlUnsecurePicture.html \ + test_secureAll.html \ + test_securePicture.html \ + test_unsecureBackground.html \ + test_unsecureCSS.html \ + test_unsecureIframe.html \ + test_unsecureIframe2.html \ + test_unsecureIframeMetaRedirect.html \ + test_unsecureIframeRedirect.html \ + test_unsecurePicture.html \ + test_unsecurePictureDup.html \ + test_unsecurePictureInIframe.html \ + test_unsecureRedirect.html \ + unsecureIframe.html \ + unsecurePictureDup.html \ + $(NULL) + +# test_bug329869.html \ leaks, bug 452401 + + +libs:: $(_TEST_FILES) + $(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir) diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/alloworigin.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/alloworigin.sjs new file mode 100644 index 000000000000..8e9afb098c2d --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/alloworigin.sjs @@ -0,0 +1,6 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 200, "OK"); + response.setHeader("Access-Control-Allow-Origin", "*"); + response.write("hello!"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/backward.html b/security/manager/ssl/tests/mochitest/mixedcontent/backward.html new file mode 100644 index 000000000000..177416d3c889 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/backward.html @@ -0,0 +1,20 @@ + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/bug329869.js b/security/manager/ssl/tests/mochitest/mixedcontent/bug329869.js new file mode 100644 index 000000000000..b246f5ff31d8 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/bug329869.js @@ -0,0 +1,3 @@ +document.write("This is insecure XSS script " + document.cookie); +todoSecurityState("broken", "security broken after document write from unsecure script"); +finish(); diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step2.html b/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step2.html new file mode 100644 index 000000000000..6bca7b7f8820 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step2.html @@ -0,0 +1,30 @@ + + + + Bug 383369 test, step 2 + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step3.html b/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step3.html new file mode 100644 index 000000000000..d4e6afa9516a --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/bug383369step3.html @@ -0,0 +1,29 @@ + + + + Bug 383369 test, final step + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/download.auto b/security/manager/ssl/tests/mochitest/mixedcontent/download.auto new file mode 100644 index 000000000000..4d2fb7d5aeef --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/download.auto @@ -0,0 +1 @@ +Temporary file for security/mixedconent tests \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/download.auto^headers^ b/security/manager/ssl/tests/mochitest/mixedcontent/download.auto^headers^ new file mode 100644 index 000000000000..9c3159e15387 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/download.auto^headers^ @@ -0,0 +1,2 @@ +Content-disposition: "attachment" +Content-type: application/x-auto-download diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/emptyimage.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/emptyimage.sjs new file mode 100644 index 000000000000..5cce2826f878 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/emptyimage.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 200, "OK"); + //response.setHeader("Content-type", "image/gif"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/hugebmp.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/hugebmp.sjs new file mode 100644 index 000000000000..20d9dea8299a --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/hugebmp.sjs @@ -0,0 +1,13 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 200, "OK"); + response.setHeader("Content-type", "image/bitmap"); + + let bmpheader = "\x42\x4D\x36\x10\x0E\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\xE0\x01\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x00\x10\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + let bmpdatapiece = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + + response.bodyOutputStream.write(bmpheader, 54); + // Fill 640*480*3 nulls + for (let i = 0; i < (640 * 480 * 3) / 64; ++i) + response.bodyOutputStream.write(bmpdatapiece, 64); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/iframe.html b/security/manager/ssl/tests/mochitest/mixedcontent/iframe.html new file mode 100644 index 000000000000..9f80f2fd8428 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/iframe.html @@ -0,0 +1,12 @@ + + + + + + + This is frame 1: + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/iframe2.html b/security/manager/ssl/tests/mochitest/mixedcontent/iframe2.html new file mode 100644 index 000000000000..efe92e346f85 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/iframe2.html @@ -0,0 +1,13 @@ + + + + + + + This is frame 2: + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/iframeMetaRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/iframeMetaRedirect.html new file mode 100644 index 000000000000..ccc3bddef131 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/iframeMetaRedirect.html @@ -0,0 +1,8 @@ + + + + + Redirecting by meta tag... + + \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/iframesecredirect.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/iframesecredirect.sjs new file mode 100644 index 000000000000..ab58786d9240 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/iframesecredirect.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 307, "Moved temporarly"); + response.setHeader("Location", "https://example.com/tests/security/ssl/mixedcontent/iframe.html"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/iframeunsecredirect.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/iframeunsecredirect.sjs new file mode 100644 index 000000000000..5cb51671e1a4 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/iframeunsecredirect.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 307, "Moved temporarly"); + response.setHeader("Location", "http://example.com/tests/security/ssl/mixedcontent/iframe.html"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/imgsecredirect.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/imgsecredirect.sjs new file mode 100644 index 000000000000..1a5bcc62d1b6 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/imgsecredirect.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 307, "Moved temporarly"); + response.setHeader("Location", "https://example.com/tests/security/ssl/mixedcontent/moonsurface.jpg"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/imgunsecredirect.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/imgunsecredirect.sjs new file mode 100644 index 000000000000..ba15359c1bad --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/imgunsecredirect.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 307, "Moved temporarly"); + response.setHeader("Location", "http://example.com/tests/security/ssl/mixedcontent/moonsurface.jpg"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/mixedContentTest.js b/security/manager/ssl/tests/mochitest/mixedcontent/mixedContentTest.js new file mode 100644 index 000000000000..888b56c2936e --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/mixedContentTest.js @@ -0,0 +1,210 @@ +/** + * Helper script for mixed content testing. It opens a new top-level window + * from a secure origin and '?runtest' query. That tells us to run the test + * body, function runTest(). Then we wait for call of finish(). On its first + * call it loads helper page 'backward.html' that immediately navigates + * back to the test secure test. This checks the bfcache. We got second call + * to onload and this time we call afterNavigationTest() function to let the + * test check security state after re-navigation back. Then we again wait for + * finish() call, that this time finishes completelly the test. + */ + +// Tells the framework if to load the test in an insecure page (http://) +var loadAsInsecure = false; +// Set true to bypass the navigation forward/back test +var bypassNavigationTest = false; +// Set true to do forward/back navigation over an http:// page, test state leaks +var navigateToInsecure = false; +// Open the test in two separate windows, test requests sharing among windows +var openTwoWindows = false; +// Override the name of the test page to load, useful e.g. to prevent load +// of images or other content before the test starts; this is actually +// a 'redirect' to a different test page. +var testPage = ""; +// Assign a function to this variable to have a clean up at the end +var testCleanUp = null; + + +// Internal variables +var _windowCount = 0; + +window.onload = function onLoad() +{ + if (location.search == "?runtest") + { + try + { + if (history.length == 1) + runTest(); + else + afterNavigationTest(); + } + catch (ex) + { + ok(false, "Exception thrown during test: " + ex); + finish(); + } + } + else + { + window.addEventListener("message", onMessageReceived, false); + + var secureTestLocation; + if (loadAsInsecure) + secureTestLocation = "http://example.com"; + else + secureTestLocation = "https://example.com"; + secureTestLocation += location.pathname + if (testPage != "") + { + array = secureTestLocation.split("/"); + array.pop(); + array.push(testPage); + secureTestLocation = array.join("/"); + } + secureTestLocation += "?runtest"; + + if (openTwoWindows) + { + _windowCount = 2; + window.open(secureTestLocation, "_new1", ""); + window.open(secureTestLocation, "_new2", ""); + } + else + { + _windowCount = 1; + window.open(secureTestLocation); + } + } +} + +function onMessageReceived(event) +{ + switch (event.data) + { + // Indication of all test parts finish (from any of the frames) + case "done": + if (--_windowCount == 0) + { + if (testCleanUp) + testCleanUp(); + + SimpleTest.finish(); + } + break; + + // Any other message indicates error or succes message of a test + default: + var failureRegExp = new RegExp("^FAILURE"); + var todoRegExp = new RegExp("^TODO"); + if (event.data.match(todoRegExp)) + SimpleTest.todo(false, event.data); + else + SimpleTest.ok(!event.data.match(failureRegExp), event.data); + break; + } +} + +function postMsg(message) +{ + opener.postMessage(message, "http://localhost:8888"); +} + +function finish() +{ + if (history.length == 1 && !bypassNavigationTest) + { + window.setTimeout(function() + { + window.location.assign(navigateToInsecure ? + "http://example.com/tests/security/ssl/mixedcontent/backward.html" : + "https://example.com/tests/security/ssl/mixedcontent/backward.html"); + }, 0); + } + else + { + postMsg("done"); + window.close(); + } +} + +function ok(a, message) +{ + if (!a) + postMsg("FAILURE: " + message); + else + postMsg(message); +} + +function is(a, b, message) +{ + if (a != b) + postMsg("FAILURE: " + message + ", expected "+b+" got "+a); + else + postMsg(message + ", expected "+b+" got "+a); +} + +function todo(a, message) +{ + if (a) + postMsg("FAILURE: TODO works? " + message); + else + postMsg("TODO: " + message); +} + +function todoSecurityState(expectedState, message) +{ + isSecurityState(expectedState, message, todo); +} + +function isSecurityState(expectedState, message, test) +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + if (!test) + test = ok; + + // Quit nasty but working :) + var ui = window + .QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebNavigation) + .QueryInterface(Components.interfaces.nsIDocShell) + .securityUI; + + var isInsecure = !ui || + (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IS_INSECURE); + var isBroken = ui && + (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IS_BROKEN); + var isEV = ui && + (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL); + + var gotState; + if (isInsecure) + gotState = "insecure"; + else if (isBroken) + gotState = "broken"; + else if (isEV) + gotState = "EV"; + else + gotState = "secure"; + + test(gotState == expectedState, (message || "") + ", " + "expected " + expectedState + " got " + gotState); + + switch (expectedState) + { + case "insecure": + test(isInsecure && !isBroken && !isEV, "for 'insecure' excpected flags [1,0,0], " + (message || "")); + break; + case "broken": + test(ui && !isInsecure && isBroken && !isEV, "for 'broken' expected flags [0,1,0], " + (message || "")); + break; + case "secure": + test(ui && !isInsecure && !isBroken && !isEV, "for 'secure' expected flags [0,0,0], " + (message || "")); + break; + case "EV": + test(ui && !isInsecure && !isBroken && isEV, "for 'EV' expected flags [0,0,1], " + (message || "")); + break; + default: + throw "Invalid isSecurityState state"; + } +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/moonsurface.jpg b/security/manager/ssl/tests/mochitest/mixedcontent/moonsurface.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0ffca256a9cf8dc390187ad55e2babe2bff1434 GIT binary patch literal 52159 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 OQ@oCGj-4wgKmXYqb*)nX literal 0 HcmV?d00001 diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/redirecttoemptyimage.sjs b/security/manager/ssl/tests/mochitest/mixedcontent/redirecttoemptyimage.sjs new file mode 100644 index 000000000000..1f9a520f5162 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/redirecttoemptyimage.sjs @@ -0,0 +1,5 @@ +function handleRequest(request, response) +{ + response.setStatusLine(request.httpVersion, 307, "Moved temporarly"); + response.setHeader("Location", "http://example.com/tests/security/ssl/mixedcontent/emptyimage.sjs"); +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/somestyle.css b/security/manager/ssl/tests/mochitest/mixedcontent/somestyle.css new file mode 100644 index 000000000000..9867e3c41eed --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/somestyle.css @@ -0,0 +1,4 @@ +body +{ + background-color: lightBlue; +} diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_bug329869.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug329869.html new file mode 100644 index 000000000000..f69d9514974d --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug329869.html @@ -0,0 +1,34 @@ + + + + dymanic script load + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_bug383369.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug383369.html new file mode 100644 index 000000000000..835906dd14c9 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug383369.html @@ -0,0 +1,91 @@ + + + + Bug 383369 test + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_bug455367.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug455367.html new file mode 100644 index 000000000000..f24ca177b7e0 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug455367.html @@ -0,0 +1,30 @@ + + + + No content image doesn't break security + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_bug472986.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug472986.html new file mode 100644 index 000000000000..8b3cc025191f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_bug472986.html @@ -0,0 +1,42 @@ + + + + img.src replace + + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_cssBefore1.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssBefore1.html new file mode 100644 index 000000000000..1ee573aa4ff4 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssBefore1.html @@ -0,0 +1,38 @@ + + + + CSS :before styling 1 + + + + + + + + + + +

+ There is a moon surface left to this text +

+ + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent1.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent1.html new file mode 100644 index 000000000000..3f43d35a02ee --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent1.html @@ -0,0 +1,37 @@ + + + + CSS conent styling 1 + + + + + + + + + + + +

+ + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent2.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent2.html new file mode 100644 index 000000000000..ccc8862a1162 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_cssContent2.html @@ -0,0 +1,37 @@ + + + + CSS conent styling 2 + + + + + + + + + +

+ + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html new file mode 100644 index 000000000000..df7ca9b0c641 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html @@ -0,0 +1,33 @@ + + + + document.write('<img src="http://">') + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html new file mode 100644 index 000000000000..c7a320949ab3 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html @@ -0,0 +1,33 @@ + + + + document.write('<iframe src="http://">') + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecurePicture.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecurePicture.html new file mode 100644 index 000000000000..a6977abc3e5c --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecurePicture.html @@ -0,0 +1,42 @@ + + + + img.src changes to unsecure test + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecureXHR.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecureXHR.html new file mode 100644 index 000000000000..7bfab94f50c7 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynDelayedUnsecureXHR.html @@ -0,0 +1,46 @@ + + + + unsecure XHR test + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureBackground.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureBackground.html new file mode 100644 index 000000000000..25a071843a1f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureBackground.html @@ -0,0 +1,40 @@ + + + + body.background changes to unsecure test + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureIframeRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureIframeRedirect.html new file mode 100644 index 000000000000..f92240b1e7b3 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureIframeRedirect.html @@ -0,0 +1,38 @@ + + + + iframe.src changes to unsecure redirect test + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicture.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicture.html new file mode 100644 index 000000000000..8391f719fe64 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicture.html @@ -0,0 +1,41 @@ + + + + img.src changes to unsecure test + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicturePreload.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicturePreload.html new file mode 100644 index 000000000000..ed1962278930 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecurePicturePreload.html @@ -0,0 +1,32 @@ + + + + img.src changes to unsecure test + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureRedirect.html new file mode 100644 index 000000000000..f5d29a9c6cc2 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_dynUnsecureRedirect.html @@ -0,0 +1,39 @@ + + + + img.src changes to unsecure redirect test + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlDelayedUnsecurePicture.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlDelayedUnsecurePicture.html new file mode 100644 index 000000000000..bd188addbf5b --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlDelayedUnsecurePicture.html @@ -0,0 +1,40 @@ + + + + innerHTML changes to unsecure test + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlUnsecurePicture.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlUnsecurePicture.html new file mode 100644 index 000000000000..057a3d6ab532 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_innerHtmlUnsecurePicture.html @@ -0,0 +1,36 @@ + + + + innerHTML changes to unsecure test + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_secureAll.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_secureAll.html new file mode 100644 index 000000000000..852de827c72b --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_secureAll.html @@ -0,0 +1,38 @@ + + + + All secure anti-regression check + + + + + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframe2.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframe2.html new file mode 100644 index 000000000000..9fc485fa26a0 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframe2.html @@ -0,0 +1,30 @@ + + + + Unsecure iframe load + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeMetaRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeMetaRedirect.html new file mode 100644 index 000000000000..25b403affce3 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeMetaRedirect.html @@ -0,0 +1,37 @@ + + + + Unsecure redirect iframe load + + + + + + + + + + + + + \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeRedirect.html new file mode 100644 index 000000000000..f50d1aac7f8f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureIframeRedirect.html @@ -0,0 +1,31 @@ + + + + Unsecure redirect iframe load + + + + + + + + + + + + + \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePicture.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePicture.html new file mode 100644 index 000000000000..d0cd198a320f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePicture.html @@ -0,0 +1,30 @@ + + + + Unsecure img load + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureDup.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureDup.html new file mode 100644 index 000000000000..6054702f9dd1 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureDup.html @@ -0,0 +1,20 @@ + + + + Unsecure img load in two windows + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureInIframe.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureInIframe.html new file mode 100644 index 000000000000..3b7fabc1213f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecurePictureInIframe.html @@ -0,0 +1,30 @@ + + + + Unsecure img in iframe load + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureRedirect.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureRedirect.html new file mode 100644 index 000000000000..6e49f6065c22 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_unsecureRedirect.html @@ -0,0 +1,30 @@ + + + + Redirect from secure to unsecure img + + + + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/unsecureIframe.html b/security/manager/ssl/tests/mochitest/mixedcontent/unsecureIframe.html new file mode 100644 index 000000000000..6fec95b04de3 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/unsecureIframe.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/unsecurePictureDup.html b/security/manager/ssl/tests/mochitest/mixedcontent/unsecurePictureDup.html new file mode 100644 index 000000000000..6eed4e9a36be --- /dev/null +++ b/security/manager/ssl/tests/mochitest/mixedcontent/unsecurePictureDup.html @@ -0,0 +1,30 @@ + + + + Unsecure img load in two windows + + + + + + + + + + + +