OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
507 case Resource::XSLStyleSheet: | 507 case Resource::XSLStyleSheet: |
508 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); | 508 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
509 case Resource::SVGDocument: | 509 case Resource::SVGDocument: |
510 if (!securityOrigin->canRequest(url)) { | 510 if (!securityOrigin->canRequest(url)) { |
511 printAccessDeniedMessage(url); | 511 printAccessDeniedMessage(url); |
512 return ResourceRequestBlockedReasonOrigin; | 512 return ResourceRequestBlockedReasonOrigin; |
513 } | 513 } |
514 break; | 514 break; |
515 } | 515 } |
516 | 516 |
517 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved. | 517 if (contentSecurityPolicyBlocksRequest(type, resourceRequest, url, options, forPreload, redirectStatus)) |
Mike West
2016/06/02 13:39:30
Does this extraction make you happier, Yoav? :)
Yoav Weiss
2016/06/02 14:13:37
way happier :D
| |
518 bool shouldBypassMainWorldCSP = frame()->script().shouldBypassMainWorldCSP() || options.contentSecurityPolicyOption == DoNotCheckContentSecurityPolicy; | 518 return ResourceRequestBlockedReasonCSP; |
519 | |
520 // Don't send CSP messages for preloads, we might never actually display tho se items. | |
521 ContentSecurityPolicy::ReportingStatus cspReporting = forPreload ? | |
522 ContentSecurityPolicy::SuppressReport : ContentSecurityPolicy::SendRepor t; | |
523 | |
524 if (m_document) { | |
525 DCHECK(m_document->contentSecurityPolicy()); | |
526 if (!shouldBypassMainWorldCSP && !m_document->contentSecurityPolicy()->a llowRequest(resourceRequest.requestContext(), url, redirectStatus, cspReporting) ) | |
527 return ResourceRequestBlockedReasonCSP; | |
528 } | |
529 | 519 |
530 if (type == Resource::Script || type == Resource::ImportResource) { | 520 if (type == Resource::Script || type == Resource::ImportResource) { |
531 ASSERT(frame()); | 521 ASSERT(frame()); |
532 if (!frame()->loader().client()->allowScriptFromSource(!frame()->setting s() || frame()->settings()->scriptEnabled(), url)) { | 522 if (!frame()->loader().client()->allowScriptFromSource(!frame()->setting s() || frame()->settings()->scriptEnabled(), url)) { |
533 frame()->loader().client()->didNotAllowScript(); | 523 frame()->loader().client()->didNotAllowScript(); |
534 // TODO(estark): Use a different ResourceRequestBlockedReason | 524 // TODO(estark): Use a different ResourceRequestBlockedReason |
535 // here, since this check has nothing to do with | 525 // here, since this check has nothing to do with |
536 // CSP. https://crbug.com/600795 | 526 // CSP. https://crbug.com/600795 |
537 return ResourceRequestBlockedReasonCSP; | 527 return ResourceRequestBlockedReasonCSP; |
538 } | 528 } |
(...skipping 23 matching lines...) Expand all Loading... | |
562 // folks block mixed content with a CSP policy, they don't get a warning. | 552 // folks block mixed content with a CSP policy, they don't get a warning. |
563 // They'll still get a warning in the console about CSP blocking the load. | 553 // They'll still get a warning in the console about CSP blocking the load. |
564 MixedContentChecker::ReportingStatus mixedContentReporting = forPreload ? | 554 MixedContentChecker::ReportingStatus mixedContentReporting = forPreload ? |
565 MixedContentChecker::SuppressReport : MixedContentChecker::SendReport; | 555 MixedContentChecker::SuppressReport : MixedContentChecker::SendReport; |
566 if (MixedContentChecker::shouldBlockFetch(frame(), resourceRequest, url, mix edContentReporting)) | 556 if (MixedContentChecker::shouldBlockFetch(frame(), resourceRequest, url, mix edContentReporting)) |
567 return ResourceRequestBlockedReasonMixedContent; | 557 return ResourceRequestBlockedReasonMixedContent; |
568 | 558 |
569 return ResourceRequestBlockedReasonNone; | 559 return ResourceRequestBlockedReasonNone; |
570 } | 560 } |
571 | 561 |
562 bool FrameFetchContext::contentSecurityPolicyBlocksRequest(Resource::Type type, const ResourceRequest& resourceRequest, const KURL& url, const ResourceLoaderOpt ions& options, bool forPreload, ResourceRequest::RedirectStatus redirectStatus) const | |
563 { | |
564 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved. | |
565 if (!frame()->script().shouldBypassMainWorldCSP() && options.contentSecurity PolicyOption == CheckContentSecurityPolicy) { | |
566 // Don't send CSP messages for preloads, we might never actually display those items. | |
567 ContentSecurityPolicy::ReportingStatus cspReporting = forPreload ? | |
568 ContentSecurityPolicy::SuppressReport : ContentSecurityPolicy::SendR eport; | |
569 if (m_document) { | |
570 DCHECK(m_document->contentSecurityPolicy()); | |
571 if (!m_document->contentSecurityPolicy()->allowRequest(resourceReque st.requestContext(), url, redirectStatus, cspReporting)) | |
572 return true; | |
573 } else if (type == Resource::MainResource) { | |
574 // When loading the main document of an iframe, we won't have a docu ment | |
575 // yet (so |csp| will be nullptr). We instead need to grab the frame 's | |
alexmos
2016/06/02 22:21:07
nit: I don't see |csp| defined anywhere in this fu
Mike West
2016/06/06 08:40:10
Done. Too much refactoring. :)
| |
576 // parent's policy in order to perform 'frame-src' checks: | |
577 if (Frame* parentFrame = frame()->tree().parent()) { | |
dcheng
2016/06/02 21:48:56
How does CSP inheritance work? Is it always strict
Mike West
2016/06/06 08:40:10
In this case, I think pulling the policy from the
| |
578 if (!parentFrame->securityContext()->contentSecurityPolicy()->al lowChildFrameFromSource(url, redirectStatus, cspReporting)) { | |
579 // TODO(mkwst): If we cancel the request after a redirect, w e never instantiate | |
580 // a document, and therefore don't inherit the loader's sand box flags, or trigger | |
581 // a load event. This is strange. | |
582 if (redirectStatus == ResourceRequest::RedirectStatus::Follo wedRedirect) { | |
583 frame()->document()->enforceSandboxFlags(SandboxOrigin); | |
584 frame()->owner()->dispatchLoad(); | |
585 } | |
586 return true; | |
587 } | |
588 } | |
589 } | |
590 } | |
591 return false; | |
592 } | |
593 | |
572 bool FrameFetchContext::isControlledByServiceWorker() const | 594 bool FrameFetchContext::isControlledByServiceWorker() const |
573 { | 595 { |
574 ASSERT(m_documentLoader || frame()->loader().documentLoader()); | 596 ASSERT(m_documentLoader || frame()->loader().documentLoader()); |
575 if (m_documentLoader) | 597 if (m_documentLoader) |
576 return frame()->loader().client()->isControlledByServiceWorker(*m_docume ntLoader); | 598 return frame()->loader().client()->isControlledByServiceWorker(*m_docume ntLoader); |
577 // m_documentLoader is null while loading resources from an HTML import. | 599 // m_documentLoader is null while loading resources from an HTML import. |
578 // In such cases whether the request is controlled by ServiceWorker or not | 600 // In such cases whether the request is controlled by ServiceWorker or not |
579 // is determined by the document loader of the frame. | 601 // is determined by the document loader of the frame. |
580 return frame()->loader().client()->isControlledByServiceWorker(*frame()->loa der().documentLoader()); | 602 return frame()->loader().client()->isControlledByServiceWorker(*frame()->loa der().documentLoader()); |
581 } | 603 } |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
801 } | 823 } |
802 | 824 |
803 DEFINE_TRACE(FrameFetchContext) | 825 DEFINE_TRACE(FrameFetchContext) |
804 { | 826 { |
805 visitor->trace(m_document); | 827 visitor->trace(m_document); |
806 visitor->trace(m_documentLoader); | 828 visitor->trace(m_documentLoader); |
807 FetchContext::trace(visitor); | 829 FetchContext::trace(visitor); |
808 } | 830 } |
809 | 831 |
810 } // namespace blink | 832 } // namespace blink |
OLD | NEW |