From b405ba900303236aca15b853be202ce714a2066a Mon Sep 17 00:00:00 2001 From: Devdatta Akhawe Date: Mon, 2 Jul 2012 16:16:11 -0700 Subject: [PATCH] Bug 767134 - Stuff the source principal into nsIContentPolicy (r=bz, sr=jst) --- content/base/public/nsContentPolicyUtils.h | 6 ++++-- content/base/public/nsIContentPolicy.idl | 9 ++++++--- content/base/src/nsCSPService.cpp | 2 ++ content/base/src/nsContentPolicy.cpp | 12 +++++++++--- content/base/src/nsContentPolicy.h | 4 +++- content/base/src/nsDataDocumentContentPolicy.cpp | 5 ++++- content/base/src/nsNoDataProtocolContentPolicy.cpp | 5 ++++- docshell/base/nsDocShell.cpp | 6 +++--- .../browser/webBrowser/nsWebBrowserContentPolicy.cpp | 2 ++ extensions/permissions/nsContentBlocker.cpp | 10 +++++++--- 10 files changed, 44 insertions(+), 17 deletions(-) diff --git a/content/base/public/nsContentPolicyUtils.h b/content/base/public/nsContentPolicyUtils.h index 702dbdd02d2..df3cc731aa8 100644 --- a/content/base/public/nsContentPolicyUtils.h +++ b/content/base/public/nsContentPolicyUtils.h @@ -125,14 +125,16 @@ NS_CP_ContentTypeName(PRUint32 contentType) return NS_ERROR_FAILURE; \ \ return policy-> action (contentType, contentLocation, requestOrigin, \ - context, mimeType, extra, decision); \ + context, mimeType, extra, originPrincipal, \ + decision); \ PR_END_MACRO /* Passes on parameters from its "caller"'s context. */ #define CHECK_CONTENT_POLICY_WITH_SERVICE(action, _policy) \ PR_BEGIN_MACRO \ return _policy-> action (contentType, contentLocation, requestOrigin, \ - context, mimeType, extra, decision); \ + context, mimeType, extra, originPrincipal, \ + decision); \ PR_END_MACRO /** diff --git a/content/base/public/nsIContentPolicy.idl b/content/base/public/nsIContentPolicy.idl index 3102ba8696a..d703ab21709 100644 --- a/content/base/public/nsIContentPolicy.idl +++ b/content/base/public/nsIContentPolicy.idl @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsISupports.idl" +#include "nsIPrincipal.idl" interface nsIURI; interface nsIDOMNode; @@ -18,7 +19,7 @@ interface nsIDOMNode; * by launching a dialog to prompt the user for something). */ -[scriptable,uuid(344f9cb0-9a17-44c5-ab96-ee707884266c)] +[scriptable,uuid(e590e74f-bac7-4876-8c58-54dde92befb2)] interface nsIContentPolicy : nsISupports { const unsigned long TYPE_OTHER = 1; @@ -209,7 +210,8 @@ interface nsIContentPolicy : nsISupports in nsIURI aRequestOrigin, in nsISupports aContext, in ACString aMimeTypeGuess, - in nsISupports aExtra); + in nsISupports aExtra, + [optional] in nsIPrincipal aRequestPrincipal); /** * Should the resource be processed? @@ -251,6 +253,7 @@ interface nsIContentPolicy : nsISupports in nsIURI aRequestOrigin, in nsISupports aContext, in ACString aMimeType, - in nsISupports aExtra); + in nsISupports aExtra, + [optional] in nsIPrincipal aRequestPrincipal); }; diff --git a/content/base/src/nsCSPService.cpp b/content/base/src/nsCSPService.cpp index 18be0669787..fc059275071 100644 --- a/content/base/src/nsCSPService.cpp +++ b/content/base/src/nsCSPService.cpp @@ -57,6 +57,7 @@ CSPService::ShouldLoad(PRUint32 aContentType, nsISupports *aRequestContext, const nsACString &aMimeTypeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { if (!aContentLocation) @@ -123,6 +124,7 @@ CSPService::ShouldProcess(PRUint32 aContentType, nsISupports *aRequestContext, const nsACString &aMimeTypeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { if (!aContentLocation) diff --git a/content/base/src/nsContentPolicy.cpp b/content/base/src/nsContentPolicy.cpp index 874d3cbbf21..02f1a653b38 100644 --- a/content/base/src/nsContentPolicy.cpp +++ b/content/base/src/nsContentPolicy.cpp @@ -76,6 +76,7 @@ nsContentPolicy::CheckPolicy(CPMethod policyMethod, nsISupports *requestingContext, const nsACString &mimeType, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *decision) { //sanity-check passed-through parameters @@ -122,7 +123,8 @@ nsContentPolicy::CheckPolicy(CPMethod policyMethod, /* check the appropriate policy */ rv = (entries[i]->*policyMethod)(contentType, contentLocation, requestingLocation, requestingContext, - mimeType, extra, decision); + mimeType, extra, requestPrincipal, + decision); if (NS_SUCCEEDED(rv) && NS_CP_REJECTED(*decision)) { /* policy says no, no point continuing to check */ @@ -177,13 +179,15 @@ nsContentPolicy::ShouldLoad(PRUint32 contentType, nsISupports *requestingContext, const nsACString &mimeType, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *decision) { // ShouldProcess does not need a content location, but we do NS_PRECONDITION(contentLocation, "Must provide request location"); nsresult rv = CheckPolicy(&nsIContentPolicy::ShouldLoad, contentType, contentLocation, requestingLocation, - requestingContext, mimeType, extra, decision); + requestingContext, mimeType, extra, + requestPrincipal, decision); LOG_CHECK("ShouldLoad"); return rv; @@ -196,11 +200,13 @@ nsContentPolicy::ShouldProcess(PRUint32 contentType, nsISupports *requestingContext, const nsACString &mimeType, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *decision) { nsresult rv = CheckPolicy(&nsIContentPolicy::ShouldProcess, contentType, contentLocation, requestingLocation, - requestingContext, mimeType, extra, decision); + requestingContext, mimeType, extra, + requestPrincipal, decision); LOG_CHECK("ShouldProcess"); return rv; diff --git a/content/base/src/nsContentPolicy.h b/content/base/src/nsContentPolicy.h index 5a781ca71de..3ddf7be5d55 100644 --- a/content/base/src/nsContentPolicy.h +++ b/content/base/src/nsContentPolicy.h @@ -31,7 +31,8 @@ class nsContentPolicy : public nsIContentPolicy NS_STDCALL_FUNCPROTO(nsresult, CPMethod, nsIContentPolicy, ShouldProcess, (PRUint32, nsIURI*, nsIURI*, nsISupports*, - const nsACString &, nsISupports*, PRInt16*)); + const nsACString &, nsISupports*, nsIPrincipal*, + PRInt16*)); //Helper method that applies policyMethod across all policies in mPolicies // with the given parameters @@ -39,6 +40,7 @@ class nsContentPolicy : public nsIContentPolicy nsIURI *aURI, nsIURI *origURI, nsISupports *requestingContext, const nsACString &mimeGuess, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *decision); }; diff --git a/content/base/src/nsDataDocumentContentPolicy.cpp b/content/base/src/nsDataDocumentContentPolicy.cpp index 8bb5c60c7a6..b44d48a510b 100644 --- a/content/base/src/nsDataDocumentContentPolicy.cpp +++ b/content/base/src/nsDataDocumentContentPolicy.cpp @@ -37,6 +37,7 @@ nsDataDocumentContentPolicy::ShouldLoad(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { *aDecision = nsIContentPolicy::ACCEPT; @@ -129,8 +130,10 @@ nsDataDocumentContentPolicy::ShouldProcess(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { return ShouldLoad(aContentType, aContentLocation, aRequestingLocation, - aRequestingContext, aMimeGuess, aExtra, aDecision); + aRequestingContext, aMimeGuess, aExtra, aRequestPrincipal, + aDecision); } diff --git a/content/base/src/nsNoDataProtocolContentPolicy.cpp b/content/base/src/nsNoDataProtocolContentPolicy.cpp index 29931280f8e..cc61b9966cd 100644 --- a/content/base/src/nsNoDataProtocolContentPolicy.cpp +++ b/content/base/src/nsNoDataProtocolContentPolicy.cpp @@ -26,6 +26,7 @@ nsNoDataProtocolContentPolicy::ShouldLoad(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { *aDecision = nsIContentPolicy::ACCEPT; @@ -70,8 +71,10 @@ nsNoDataProtocolContentPolicy::ShouldProcess(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { return ShouldLoad(aContentType, aContentLocation, aRequestingLocation, - aRequestingContext, aMimeGuess, aExtra, aDecision); + aRequestingContext, aMimeGuess, aExtra, aRequestPrincipal, + aDecision); } diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 1a1a3ec3b75..c497410e776 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -8162,8 +8162,8 @@ nsDocShell::InternalLoad(nsIURI * aURI, } // XXXbz would be nice to know the loading principal here... but we don't - nsCOMPtr loadingPrincipal; - if (aReferrer) { + nsCOMPtr loadingPrincipal = do_QueryInterface(aOwner); + if (!loadingPrincipal && aReferrer) { nsCOMPtr secMan = do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); @@ -8171,7 +8171,7 @@ nsDocShell::InternalLoad(nsIURI * aURI, rv = secMan->GetCodebasePrincipal(aReferrer, getter_AddRefs(loadingPrincipal)); } - + rv = NS_CheckContentLoadPolicy(contentType, aURI, loadingPrincipal, diff --git a/embedding/browser/webBrowser/nsWebBrowserContentPolicy.cpp b/embedding/browser/webBrowser/nsWebBrowserContentPolicy.cpp index 0b84ba41738..4dae95a4d91 100644 --- a/embedding/browser/webBrowser/nsWebBrowserContentPolicy.cpp +++ b/embedding/browser/webBrowser/nsWebBrowserContentPolicy.cpp @@ -75,6 +75,7 @@ nsWebBrowserContentPolicy::ShouldLoad(PRUint32 contentType, nsISupports *requestingContext, const nsACString &mimeGuess, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *shouldLoad) { return PerformPolicyCheck(contentType, requestingContext, shouldLoad); @@ -87,6 +88,7 @@ nsWebBrowserContentPolicy::ShouldProcess(PRUint32 contentType, nsISupports *requestingContext, const nsACString &mimeGuess, nsISupports *extra, + nsIPrincipal *requestPrincipal, PRInt16 *shouldProcess) { *shouldProcess = nsIContentPolicy::ACCEPT; diff --git a/extensions/permissions/nsContentBlocker.cpp b/extensions/permissions/nsContentBlocker.cpp index b4e60718538..93d52f6a725 100644 --- a/extensions/permissions/nsContentBlocker.cpp +++ b/extensions/permissions/nsContentBlocker.cpp @@ -127,6 +127,7 @@ nsContentBlocker::ShouldLoad(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { *aDecision = nsIContentPolicy::ACCEPT; @@ -188,12 +189,13 @@ nsContentBlocker::ShouldLoad(PRUint32 aContentType, } NS_ASSERTION(aContentType != nsIContentPolicy::TYPE_OBJECT, - "Shouldn't happen. Infinite loops are bad!"); + "Shouldn't happen. Infinite loops are bad!"); // Found a type that tells us more about what we're loading. Try // the permissions check again! return ShouldLoad(aContentType, aContentLocation, aRequestingLocation, - aRequestingContext, aMimeGuess, aExtra, aDecision); + aRequestingContext, aMimeGuess, aExtra, aRequestPrincipal, + aDecision); } NS_IMETHODIMP @@ -203,6 +205,7 @@ nsContentBlocker::ShouldProcess(PRUint32 aContentType, nsISupports *aRequestingContext, const nsACString &aMimeGuess, nsISupports *aExtra, + nsIPrincipal *aRequestPrincipal, PRInt16 *aDecision) { // For loads where aRequestingContext is chrome, we should just @@ -223,7 +226,8 @@ nsContentBlocker::ShouldProcess(PRUint32 aContentType, // This isn't a load from chrome. Just do a ShouldLoad() check -- // we want the same answer here return ShouldLoad(aContentType, aContentLocation, aRequestingLocation, - aRequestingContext, aMimeGuess, aExtra, aDecision); + aRequestingContext, aMimeGuess, aExtra, aRequestPrincipal, + aDecision); } nsresult