Bug 1398229 - Save-link-as feature should use the loading principal - implementation of nsIContentPolicy.TYPE_SAVE_AS_DOWNLOAD

This commit is contained in:
janekptacijarabaci 2018-06-17 09:35:48 +02:00 • committed by Roy Tam
commit 97c6ecff55
7 changed files with 25 additions and 2 deletions

View file

@ -115,6 +115,7 @@ NS_CP_ContentTypeName(uint32_t contentType)
CASE_RETURN( TYPE_FETCH ); CASE_RETURN( TYPE_FETCH );
CASE_RETURN( TYPE_IMAGESET ); CASE_RETURN( TYPE_IMAGESET );
CASE_RETURN( TYPE_WEB_MANIFEST ); CASE_RETURN( TYPE_WEB_MANIFEST );
CASE_RETURN( TYPE_SAVEAS_DOWNLOAD );
CASE_RETURN( TYPE_INTERNAL_SCRIPT ); CASE_RETURN( TYPE_INTERNAL_SCRIPT );
CASE_RETURN( TYPE_INTERNAL_WORKER ); CASE_RETURN( TYPE_INTERNAL_WORKER );
CASE_RETURN( TYPE_INTERNAL_SHARED_WORKER ); CASE_RETURN( TYPE_INTERNAL_SHARED_WORKER );
@ -236,7 +237,7 @@ NS_CheckContentLoadPolicy(uint32_t contentType,
CHECK_PRINCIPAL_AND_DATA(ShouldLoad); CHECK_PRINCIPAL_AND_DATA(ShouldLoad);
if (policyService) { if (policyService) {
CHECK_CONTENT_POLICY_WITH_SERVICE(ShouldLoad, policyService); CHECK_CONTENT_POLICY_WITH_SERVICE(ShouldLoad, policyService);
} y ?
CHECK_CONTENT_POLICY(ShouldLoad); CHECK_CONTENT_POLICY(ShouldLoad);
} }

View file

@ -181,6 +181,11 @@ interface nsIContentPolicyBase : nsISupports
*/ */
const nsContentPolicyType TYPE_WEB_MANIFEST = 22; const nsContentPolicyType TYPE_WEB_MANIFEST = 22;
/**
* Indicates an save-as link download from the front-end code.
*/
const nsContentPolicyType TYPE_SAVEAS_DOWNLOAD = 43;
/** /**
* Indicates an internal constant for scripts loaded through script * Indicates an internal constant for scripts loaded through script
* elements. * elements.

View file

@ -269,6 +269,7 @@ static_assert(nsIContentPolicy::TYPE_INVALID == 0 &&
nsIContentPolicy::TYPE_FETCH == 20 && nsIContentPolicy::TYPE_FETCH == 20 &&
nsIContentPolicy::TYPE_IMAGESET == 21 && nsIContentPolicy::TYPE_IMAGESET == 21 &&
nsIContentPolicy::TYPE_WEB_MANIFEST == 22 && nsIContentPolicy::TYPE_WEB_MANIFEST == 22 &&
nsIContentPolicy::TYPE_SAVEAS_DOWNLOAD == 43 &&
nsIContentPolicy::TYPE_INTERNAL_SCRIPT == 23 && nsIContentPolicy::TYPE_INTERNAL_SCRIPT == 23 &&
nsIContentPolicy::TYPE_INTERNAL_WORKER == 24 && nsIContentPolicy::TYPE_INTERNAL_WORKER == 24 &&
nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER == 25 && nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER == 25 &&

View file

@ -320,6 +320,9 @@ InternalRequest::MapContentPolicyTypeToRequestContext(nsContentPolicyType aConte
case nsIContentPolicy::TYPE_WEB_MANIFEST: case nsIContentPolicy::TYPE_WEB_MANIFEST:
context = RequestContext::Manifest; context = RequestContext::Manifest;
break; break;
case nsIContentPolicy::TYPE_SAVEAS_DOWNLOAD:
context = RequestContext::Internal;
break;
default: default:
MOZ_ASSERT(false, "Unhandled nsContentPolicyType value"); MOZ_ASSERT(false, "Unhandled nsContentPolicyType value");
break; break;

View file

@ -53,7 +53,7 @@ namespace dom {
* image | TYPE_INTERNAL_IMAGE, TYPE_INTERNAL_IMAGE_PRELOAD, TYPE_INTERNAL_IMAGE_FAVICON * image | TYPE_INTERNAL_IMAGE, TYPE_INTERNAL_IMAGE_PRELOAD, TYPE_INTERNAL_IMAGE_FAVICON
* imageset | TYPE_IMAGESET * imageset | TYPE_IMAGESET
* import | Not supported by Gecko * import | Not supported by Gecko
* internal | TYPE_DOCUMENT, TYPE_XBL, TYPE_OTHER * internal | TYPE_DOCUMENT, TYPE_XBL, TYPE_OTHER, TYPE_SAVEAS_DOWNLOAD
* location | * location |
* manifest | TYPE_WEB_MANIFEST * manifest | TYPE_WEB_MANIFEST
* object | TYPE_INTERNAL_OBJECT * object | TYPE_INTERNAL_OBJECT

View file

@ -471,6 +471,12 @@ DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
break; break;
} }
case nsIContentPolicy::TYPE_SAVEAS_DOWNLOAD: {
mimeTypeGuess = EmptyCString();
requestingContext = aLoadInfo->LoadingNode();
break;
}
default: default:
// nsIContentPolicy::TYPE_INVALID // nsIContentPolicy::TYPE_INVALID
MOZ_ASSERT(false, "can not perform security check without a valid contentType"); MOZ_ASSERT(false, "can not perform security check without a valid contentType");

View file

@ -468,6 +468,13 @@ nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
*aDecision = ACCEPT; *aDecision = ACCEPT;
return NS_OK; return NS_OK;
// Creating insecure connections for a save-as link download is acceptable.
// This download is completely disconnected from the docShell, but still
// using the same loading principal.
case TYPE_SAVEAS_DOWNLOAD:
*aDecision = ACCEPT;
return NS_OK;
// Static display content is considered moderate risk for mixed content so // Static display content is considered moderate risk for mixed content so
// these will be blocked according to the mixed display preference // these will be blocked according to the mixed display preference
case TYPE_IMAGE: case TYPE_IMAGE: