author | Carsten "Tomcat" Book <cbook@mozilla.com> |
Mon, 20 Feb 2017 15:26:36 +0100 | |
changeset 343899 | 1fa61f7d1186a2db0e78b80a0e7fc3aff521293c |
parent 343898 | 9c5f58a4c7dd529126a0eb401af98633e7feec06 |
child 343900 | d3feeb492d8f260a90ef0b6637c91e97e7659473 |
push id | 31391 |
push user | philringnalda@gmail.com |
push date | Tue, 21 Feb 2017 04:29:09 +0000 |
treeherder | mozilla-central@d84beb192e57 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 1339823 |
milestone | 54.0a1 |
backs out | 59e30ba1b38fafefaf72865e43a9e3e969db6da5 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -1204,38 +1204,39 @@ private: loadInfo.mScriptTextLength); if (NS_SUCCEEDED(rv) && IsMainWorkerScript()) { nsCOMPtr<nsIURI> finalURI; rv = NS_NewURI(getter_AddRefs(finalURI), loadInfo.mFullURL, nullptr, nullptr); if (NS_SUCCEEDED(rv)) { mWorkerPrivate->SetBaseURI(finalURI); } + nsILoadGroup* loadGroup = mWorkerPrivate->GetLoadGroup(); + MOZ_DIAGNOSTIC_ASSERT(loadGroup); + #if defined(DEBUG) || !defined(RELEASE_OR_BETA) nsIPrincipal* principal = mWorkerPrivate->GetPrincipal(); MOZ_DIAGNOSTIC_ASSERT(principal); bool equal = false; MOZ_ALWAYS_SUCCEEDS(responsePrincipal->Equals(principal, &equal)); MOZ_DIAGNOSTIC_ASSERT(equal); nsCOMPtr<nsIContentSecurityPolicy> csp; MOZ_ALWAYS_SUCCEEDS(responsePrincipal->GetCsp(getter_AddRefs(csp))); MOZ_DIAGNOSTIC_ASSERT(!csp); #endif mWorkerPrivate->InitChannelInfo(aChannelInfo); - nsILoadGroup* loadGroup = mWorkerPrivate->GetLoadGroup(); - MOZ_DIAGNOSTIC_ASSERT(loadGroup); - - // Override the principal on the WorkerPrivate. This is only necessary - // in order to get a principal with exactly the correct URL. The fetch - // referrer logic depends on the WorkerPrivate principal having a URL - // that matches the worker script URL. + // Override the principal on the WorkerPrivate. We just asserted that + // this is the same as our current WorkerPrivate principal, so this is + // almost a no-op. We must do, it though, in order to avoid accidentally + // propagating the CSP object back to the ServiceWorkerRegistration + // principal. If bug 965637 is fixed then this can be removed. rv = mWorkerPrivate->SetPrincipalOnMainThread(responsePrincipal, loadGroup); MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv)); rv = mWorkerPrivate->SetCSPFromHeaderValues(aCSPHeaderValue, aCSPReportOnlyHeaderValue); MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv)); }
--- a/dom/workers/ServiceWorkerManager.cpp +++ b/dom/workers/ServiceWorkerManager.cpp @@ -3214,18 +3214,45 @@ ServiceWorkerManager::CreateNewRegistrat rv = NS_NewURI(getter_AddRefs(scopeURI), aScope, nullptr, nullptr); MOZ_ASSERT(NS_SUCCEEDED(rv)); RefPtr<ServiceWorkerRegistrationInfo> tmp = GetRegistration(aPrincipal, aScope); MOZ_ASSERT(!tmp); #endif + // The environment that registers the document may have some CSP applied + // to its principal. This should not be inherited by the registration + // itself or the worker it creates. To avoid confusion in callsites + // downstream we strip the CSP from the principal now. + // + // Unfortunately there is no API to clone a principal without its CSP. To + // achieve the same thing we serialize to the IPC PrincipalInfo type and + // back to an nsIPrincipal. + PrincipalInfo principalInfo; + rv = PrincipalToPrincipalInfo(aPrincipal, &principalInfo); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + nsCOMPtr<nsIPrincipal> cleanPrincipal = + PrincipalInfoToPrincipal(principalInfo, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + // Verify that we do not have any CSP set on our principal "clone". +#if defined(DEBUG) || !defined(RELEASE_OR_BETA) + nsCOMPtr<nsIContentSecurityPolicy> csp; + MOZ_ALWAYS_SUCCEEDS(cleanPrincipal->GetCsp(getter_AddRefs(csp))); + MOZ_DIAGNOSTIC_ASSERT(!csp); +#endif + RefPtr<ServiceWorkerRegistrationInfo> registration = - new ServiceWorkerRegistrationInfo(aScope, aPrincipal, aLoadFlags); + new ServiceWorkerRegistrationInfo(aScope, cleanPrincipal, aLoadFlags); // From now on ownership of registration is with // mServiceWorkerRegistrationInfos. AddScopeAndRegistration(aScope, registration); return registration.forget(); } void ServiceWorkerManager::MaybeRemoveRegistration(ServiceWorkerRegistrationInfo* aRegistration)
--- a/dom/workers/ServiceWorkerPrivate.cpp +++ b/dom/workers/ServiceWorkerPrivate.cpp @@ -1731,45 +1731,33 @@ ServiceWorkerPrivate::SpawnWorkerIfNeede info.mLoadFlags = mInfo->GetLoadFlags() | nsIChannel::LOAD_BYPASS_SERVICE_WORKER; rv = info.mBaseURI->GetHost(info.mDomain); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - nsCOMPtr<nsIURI> uri; - rv = mInfo->GetPrincipal()->GetURI(getter_AddRefs(uri)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - if (NS_WARN_IF(!uri)) { - return NS_ERROR_FAILURE; - } - - // Create a pristine codebase principal to avoid any possibility of inheriting - // CSP values. The principal on the registration may be polluted with CSP - // from the registering page or other places the principal is passed. If - // bug 965637 is ever fixed this can be removed. - info.mPrincipal = - BasePrincipal::CreateCodebasePrincipal(uri, mInfo->GetOriginAttributes()); - if (NS_WARN_IF(!info.mPrincipal)) { - return NS_ERROR_FAILURE; - } + info.mPrincipal = mInfo->GetPrincipal(); nsContentUtils::StorageAccess access = nsContentUtils::StorageAllowedForPrincipal(info.mPrincipal); info.mStorageAllowed = access > nsContentUtils::StorageAccess::ePrivateBrowsing; info.mOriginAttributes = mInfo->GetOriginAttributes(); - // Verify that we don't have any CSP on pristine principal. + // The ServiceWorkerRegistration principal should never have any CSP + // set. The CSP from the page that registered the SW should not be + // inherited. Verify this is the case in non-release builds #if defined(DEBUG) || !defined(RELEASE_OR_BETA) nsCOMPtr<nsIContentSecurityPolicy> csp; - Unused << info.mPrincipal->GetCsp(getter_AddRefs(csp)); + rv = info.mPrincipal->GetCsp(getter_AddRefs(csp)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + MOZ_DIAGNOSTIC_ASSERT(!csp); #endif // Default CSP permissions for now. These will be overrided if necessary // based on the script CSP headers during load in ScriptLoader. info.mEvalAllowed = true; info.mReportCSPViolations = false;