Bug 1306387 - Simplify addon ID origin attribute by setting it from the moz-extension protocol handler. r=?
MozReview-Commit-ID: 3lHUGNuRgiW
--- a/caps/BasePrincipal.cpp
+++ b/caps/BasePrincipal.cpp
@@ -52,17 +52,17 @@ PrincipalOriginAttributes::InheritFromDo
}
void
PrincipalOriginAttributes::InheritFromNecko(const NeckoOriginAttributes& aAttrs)
{
mAppId = aAttrs.mAppId;
mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser;
- // addonId is computed from the principal URI and never propagated
+ mAddonId = aAttrs.mAddonId;
mUserContextId = aAttrs.mUserContextId;
mSignedPkg = aAttrs.mSignedPkg;
mPrivateBrowsingId = aAttrs.mPrivateBrowsingId;
mFirstPartyDomain = aAttrs.mFirstPartyDomain;
}
void
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -395,30 +395,16 @@ nsScriptSecurityManager::GetChannelResul
principalToInherit.forget(aPrincipal);
return NS_OK;
}
}
}
return GetChannelURIPrincipal(aChannel, aPrincipal);
}
-nsresult
-nsScriptSecurityManager::MaybeSetAddonIdFromURI(PrincipalOriginAttributes& aAttrs, nsIURI* aURI)
-{
- nsAutoCString scheme;
- nsresult rv = aURI->GetScheme(scheme);
- NS_ENSURE_SUCCESS(rv, rv);
- if (scheme.EqualsLiteral("moz-extension") && GetAddonPolicyService()) {
- rv = GetAddonPolicyService()->ExtensionURIToAddonId(aURI, aAttrs.mAddonId);
- NS_ENSURE_SUCCESS(rv, rv);
- }
-
- return NS_OK;
-}
-
/* The principal of the URI that this channel is loading. This is never
* affected by things like sandboxed loads, or loads where we forcefully
* inherit the principal. Think of this as the principal of the server
* which this channel is loading from. Most callers should use
* GetChannelResultPrincipal instead of GetChannelURIPrincipal. Only
* call GetChannelURIPrincipal if you are sure that you want the
* principal that matches the uri, even in cases when the load is
* sandboxed or when the load could be a blob or data uri (i.e even when
@@ -446,18 +432,17 @@ nsScriptSecurityManager::GetChannelURIPr
// For subresource loading, the origin attributes of the loadInfo is from
// its loadingPrincipal.
PrincipalOriginAttributes attrs;
// For addons loadInfo might be null.
if (loadInfo) {
attrs.InheritFromNecko(loadInfo->GetOriginAttributes());
}
- rv = MaybeSetAddonIdFromURI(attrs, uri);
- NS_ENSURE_SUCCESS(rv, rv);
+
nsCOMPtr<nsIPrincipal> prin = BasePrincipal::CreateCodebasePrincipal(uri, attrs);
prin.forget(aPrincipal);
return *aPrincipal ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsScriptSecurityManager::IsSystemPrincipal(nsIPrincipal* aPrincipal,
bool* aIsSystem)
@@ -1205,33 +1190,29 @@ nsScriptSecurityManager::
{
DocShellOriginAttributes docShellAttrs;
bool result = aLoadContext->GetOriginAttributes(docShellAttrs);;
NS_ENSURE_TRUE(result, NS_ERROR_FAILURE);
PrincipalOriginAttributes attrs;
attrs.InheritFromDocShellToDoc(docShellAttrs, aURI);
- nsresult rv = MaybeSetAddonIdFromURI(attrs, aURI);
- NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIPrincipal> prin = BasePrincipal::CreateCodebasePrincipal(aURI, attrs);
prin.forget(aPrincipal);
return *aPrincipal ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsScriptSecurityManager::GetDocShellCodebasePrincipal(nsIURI* aURI,
nsIDocShell* aDocShell,
nsIPrincipal** aPrincipal)
{
PrincipalOriginAttributes attrs;
attrs.InheritFromDocShellToDoc(nsDocShell::Cast(aDocShell)->GetOriginAttributes(), aURI);
- nsresult rv = MaybeSetAddonIdFromURI(attrs, aURI);
- NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIPrincipal> prin = BasePrincipal::CreateCodebasePrincipal(aURI, attrs);
prin.forget(aPrincipal);
return *aPrincipal ? NS_OK : NS_ERROR_FAILURE;
}
// static
nsIPrincipal*
nsScriptSecurityManager::doGetObjectPrincipal(JSObject *aObj)
--- a/caps/nsScriptSecurityManager.h
+++ b/caps/nsScriptSecurityManager.h
@@ -108,19 +108,16 @@ private:
InitPrefs();
inline void
ScriptSecurityPrefChanged();
inline void
AddSitesToFileURIWhitelist(const nsCString& aSiteList);
- // If aURI is a moz-extension:// URI, set mAddonId to the associated addon.
- nsresult MaybeSetAddonIdFromURI(mozilla::PrincipalOriginAttributes& aAttrs, nsIURI* aURI);
-
nsresult GetChannelResultPrincipal(nsIChannel* aChannel,
nsIPrincipal** aPrincipal,
bool aIgnoreSandboxing);
nsresult
CheckLoadURIFlags(nsIURI* aSourceURI, nsIURI* aTargetURI, nsIURI* aSourceBaseURI,
nsIURI* aTargetBaseURI, uint32_t aFlags);
@@ -128,27 +125,16 @@ private:
bool mPrefInitialized;
bool mIsJavaScriptEnabled;
nsTArray<nsCOMPtr<nsIURI>> mFileURIWhitelist;
// This machinery controls new-style domain policies. The old-style
// policy machinery will be removed soon.
nsCOMPtr<nsIDomainPolicy> mDomainPolicy;
- // Cached addon policy service. We can't generate this in Init() because
- // that's too early to get a service.
- mozilla::Maybe<nsCOMPtr<nsIAddonPolicyService>> mAddonPolicyService;
- nsIAddonPolicyService* GetAddonPolicyService()
- {
- if (mAddonPolicyService.isNothing()) {
- mAddonPolicyService.emplace(do_GetService("@mozilla.org/addons/policy-service;1"));
- }
- return mAddonPolicyService.ref();
- }
-
static bool sStrictFileOriginPolicy;
static nsIIOService *sIOService;
static nsIStringBundle *sStrBundle;
static JSContext *sContext;
};
namespace mozilla {
--- a/netwerk/protocol/res/ExtensionProtocolHandler.cpp
+++ b/netwerk/protocol/res/ExtensionProtocolHandler.cpp
@@ -112,16 +112,28 @@ ExtensionProtocolHandler::ResolveSpecial
}
nsresult
ExtensionProtocolHandler::SubstituteChannel(nsIURI* aURI,
nsILoadInfo* aLoadInfo,
nsIChannel** result)
{
nsresult rv;
+
+ // Flag all requests with the addon id in origin attributes.
+ nsCOMPtr<nsIAddonPolicyService> aps =
+ do_GetService("@mozilla.org/addons/policy-service;1");
+ if (aps) {
+ NeckoOriginAttributes nAttrs;
+ aLoadInfo->GetOriginAttributes(&nAttrs);
+ rv = aps->ExtensionURIToAddonId(aURI, nAttrs.mAddonId);
+ NS_ENSURE_SUCCESS(rv, rv);
+ aLoadInfo->SetOriginAttributes(nAttrs);
+ }
+
nsCOMPtr<nsIURL> url = do_QueryInterface(aURI, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString ext;
rv = url->GetFileExtension(ext);
NS_ENSURE_SUCCESS(rv, rv);
if (!ext.LowerCaseEqualsLiteral("css")) {