OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google, Inc. All rights reserved. | 2 * Copyright (C) 2011 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 return UseCounter::NumberOfFeatures; | 123 return UseCounter::NumberOfFeatures; |
124 } | 124 } |
125 | 125 |
126 static ReferrerPolicy mergeReferrerPolicies(ReferrerPolicy a, ReferrerPolicy b) | 126 static ReferrerPolicy mergeReferrerPolicies(ReferrerPolicy a, ReferrerPolicy b) |
127 { | 127 { |
128 if (a != b) | 128 if (a != b) |
129 return ReferrerPolicyNever; | 129 return ReferrerPolicyNever; |
130 return a; | 130 return a; |
131 } | 131 } |
132 | 132 |
133 ContentSecurityPolicy::ContentSecurityPolicy(ExecutionContextClient* client) | 133 ContentSecurityPolicy::ContentSecurityPolicy(ExecutionContext* executionContext) |
134 : m_client(client) | 134 : m_executionContext(executionContext) |
135 , m_overrideInlineStyleAllowed(false) | 135 , m_overrideInlineStyleAllowed(false) |
136 , m_scriptHashAlgorithmsUsed(ContentSecurityPolicyHashAlgorithmNone) | 136 , m_scriptHashAlgorithmsUsed(ContentSecurityPolicyHashAlgorithmNone) |
137 , m_styleHashAlgorithmsUsed(ContentSecurityPolicyHashAlgorithmNone) | 137 , m_styleHashAlgorithmsUsed(ContentSecurityPolicyHashAlgorithmNone) |
138 { | 138 { |
139 } | 139 } |
140 | 140 |
141 ContentSecurityPolicy::~ContentSecurityPolicy() | 141 ContentSecurityPolicy::~ContentSecurityPolicy() |
142 { | 142 { |
143 } | 143 } |
144 | 144 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 const UChar* position = begin; | 191 const UChar* position = begin; |
192 while (position < end) { | 192 while (position < end) { |
193 skipUntil<UChar>(position, end, ','); | 193 skipUntil<UChar>(position, end, ','); |
194 | 194 |
195 // header1,header2 OR header1 | 195 // header1,header2 OR header1 |
196 // ^ ^ | 196 // ^ ^ |
197 OwnPtr<CSPDirectiveList> policy = CSPDirectiveList::create(this, begin,
position, type, source); | 197 OwnPtr<CSPDirectiveList> policy = CSPDirectiveList::create(this, begin,
position, type, source); |
198 | 198 |
199 // We disable 'eval()' even in the case of report-only policies, and rel
y on the check in the V8Initializer::codeGenerationCheckCallbackInMainThread cal
lback to determine whether the call should execute or not. | 199 // We disable 'eval()' even in the case of report-only policies, and rel
y on the check in the V8Initializer::codeGenerationCheckCallbackInMainThread cal
lback to determine whether the call should execute or not. |
200 if (!policy->allowEval(0, SuppressReport)) | 200 if (!policy->allowEval(0, SuppressReport)) |
201 m_client->disableEval(policy->evalDisabledErrorMessage()); | 201 m_executionContext->disableEval(policy->evalDisabledErrorMessage()); |
202 | 202 |
203 m_policies.append(policy.release()); | 203 m_policies.append(policy.release()); |
204 | 204 |
205 // Skip the comma, and begin the next header from the current position. | 205 // Skip the comma, and begin the next header from the current position. |
206 ASSERT(position == end || *position == ','); | 206 ASSERT(position == end || *position == ','); |
207 skipExactly<UChar>(position, end, ','); | 207 skipExactly<UChar>(position, end, ','); |
208 begin = position; | 208 begin = position; |
209 } | 209 } |
210 | 210 |
211 if (document && type != ContentSecurityPolicyHeaderTypeReport && didSetRefer
rerPolicy()) | 211 if (document && type != ContentSecurityPolicyHeaderTypeReport && didSetRefer
rerPolicy()) |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 } | 467 } |
468 | 468 |
469 bool ContentSecurityPolicy::allowChildContextFromSource(const KURL& url, Content
SecurityPolicy::ReportingStatus reportingStatus) const | 469 bool ContentSecurityPolicy::allowChildContextFromSource(const KURL& url, Content
SecurityPolicy::ReportingStatus reportingStatus) const |
470 { | 470 { |
471 return isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>
(m_policies, url, reportingStatus); | 471 return isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>
(m_policies, url, reportingStatus); |
472 } | 472 } |
473 | 473 |
474 bool ContentSecurityPolicy::allowWorkerContextFromSource(const KURL& url, Conten
tSecurityPolicy::ReportingStatus reportingStatus) const | 474 bool ContentSecurityPolicy::allowWorkerContextFromSource(const KURL& url, Conten
tSecurityPolicy::ReportingStatus reportingStatus) const |
475 { | 475 { |
476 // CSP 1.1 moves workers from 'script-src' to the new 'child-src'. Measure t
he impact of this backwards-incompatible change. | 476 // CSP 1.1 moves workers from 'script-src' to the new 'child-src'. Measure t
he impact of this backwards-incompatible change. |
477 if (m_client->isDocument()) { | 477 if (m_executionContext->isDocument()) { |
478 Document* document = static_cast<Document*>(m_client); | 478 Document* document = static_cast<Document*>(m_executionContext); |
479 UseCounter::count(*document, UseCounter::WorkerSubjectToCSP); | 479 UseCounter::count(*document, UseCounter::WorkerSubjectToCSP); |
480 if (isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource
>(m_policies, url, SuppressReport) && !isAllowedByAllWithURL<&CSPDirectiveList::
allowScriptFromSource>(m_policies, url, SuppressReport)) | 480 if (isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource
>(m_policies, url, SuppressReport) && !isAllowedByAllWithURL<&CSPDirectiveList::
allowScriptFromSource>(m_policies, url, SuppressReport)) |
481 UseCounter::count(*document, UseCounter::WorkerAllowedByChildBlocked
ByScript); | 481 UseCounter::count(*document, UseCounter::WorkerAllowedByChildBlocked
ByScript); |
482 } | 482 } |
483 | 483 |
484 return experimentalFeaturesEnabled() ? | 484 return experimentalFeaturesEnabled() ? |
485 isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>(m_
policies, url, reportingStatus) : | 485 isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>(m_
policies, url, reportingStatus) : |
486 isAllowedByAllWithURL<&CSPDirectiveList::allowScriptFromSource>(m_polici
es, url, reportingStatus); | 486 isAllowedByAllWithURL<&CSPDirectiveList::allowScriptFromSource>(m_polici
es, url, reportingStatus); |
487 } | 487 } |
488 | 488 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 { | 520 { |
521 for (size_t i = 0; i < m_policies.size(); ++i) { | 521 for (size_t i = 0; i < m_policies.size(); ++i) { |
522 if (m_policies[i]->didSetReferrerPolicy()) | 522 if (m_policies[i]->didSetReferrerPolicy()) |
523 return true; | 523 return true; |
524 } | 524 } |
525 return false; | 525 return false; |
526 } | 526 } |
527 | 527 |
528 SecurityOrigin* ContentSecurityPolicy::securityOrigin() const | 528 SecurityOrigin* ContentSecurityPolicy::securityOrigin() const |
529 { | 529 { |
530 return m_client->securityContext().securityOrigin(); | 530 return m_executionContext->securityContext().securityOrigin(); |
531 } | 531 } |
532 | 532 |
533 const KURL ContentSecurityPolicy::url() const | 533 const KURL ContentSecurityPolicy::url() const |
534 { | 534 { |
535 return m_client->contextURL(); | 535 return m_executionContext->contextURL(); |
536 } | 536 } |
537 | 537 |
538 KURL ContentSecurityPolicy::completeURL(const String& url) const | 538 KURL ContentSecurityPolicy::completeURL(const String& url) const |
539 { | 539 { |
540 return m_client->contextCompleteURL(url); | 540 return m_executionContext->contextCompleteURL(url); |
541 } | 541 } |
542 | 542 |
543 void ContentSecurityPolicy::enforceSandboxFlags(SandboxFlags mask) const | 543 void ContentSecurityPolicy::enforceSandboxFlags(SandboxFlags mask) const |
544 { | 544 { |
545 if (Document* document = this->document()) | 545 if (Document* document = this->document()) |
546 document->enforceSandboxFlags(mask); | 546 document->enforceSandboxFlags(mask); |
547 } | 547 } |
548 | 548 |
549 static String stripURLForUseInReport(Document* document, const KURL& url) | 549 static String stripURLForUseInReport(Document* document, const KURL& url) |
550 { | 550 { |
(...skipping 30 matching lines...) Expand all Loading... |
581 KURL source = KURL(ParsedURLString, callFrame.sourceURL()); | 581 KURL source = KURL(ParsedURLString, callFrame.sourceURL()); |
582 init.sourceFile = stripURLForUseInReport(document, source); | 582 init.sourceFile = stripURLForUseInReport(document, source); |
583 init.lineNumber = callFrame.lineNumber(); | 583 init.lineNumber = callFrame.lineNumber(); |
584 init.columnNumber = callFrame.columnNumber(); | 584 init.columnNumber = callFrame.columnNumber(); |
585 } | 585 } |
586 } | 586 } |
587 | 587 |
588 void ContentSecurityPolicy::reportViolation(const String& directiveText, const S
tring& effectiveDirective, const String& consoleMessage, const KURL& blockedURL,
const Vector<KURL>& reportURIs, const String& header) | 588 void ContentSecurityPolicy::reportViolation(const String& directiveText, const S
tring& effectiveDirective, const String& consoleMessage, const KURL& blockedURL,
const Vector<KURL>& reportURIs, const String& header) |
589 { | 589 { |
590 // FIXME: Support sending reports from worker. | 590 // FIXME: Support sending reports from worker. |
591 if (!m_client->isDocument()) | 591 if (!m_executionContext->isDocument()) |
592 return; | 592 return; |
593 | 593 |
594 Document* document = this->document(); | 594 Document* document = this->document(); |
595 LocalFrame* frame = document->frame(); | 595 LocalFrame* frame = document->frame(); |
596 if (!frame) | 596 if (!frame) |
597 return; | 597 return; |
598 | 598 |
599 SecurityPolicyViolationEventInit violationData; | 599 SecurityPolicyViolationEventInit violationData; |
600 gatherSecurityPolicyViolationEventData(violationData, document, directiveTex
t, effectiveDirective, blockedURL, header); | 600 gatherSecurityPolicyViolationEventData(violationData, document, directiveTex
t, effectiveDirective, blockedURL, header); |
601 | 601 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 logToConsole(message); | 742 logToConsole(message); |
743 } | 743 } |
744 | 744 |
745 void ContentSecurityPolicy::reportMissingReportURI(const String& policy) const | 745 void ContentSecurityPolicy::reportMissingReportURI(const String& policy) const |
746 { | 746 { |
747 logToConsole("The Content Security Policy '" + policy + "' was delivered in
report-only mode, but does not specify a 'report-uri'; the policy will have no e
ffect. Please either add a 'report-uri' directive, or deliver the policy via the
'Content-Security-Policy' header."); | 747 logToConsole("The Content Security Policy '" + policy + "' was delivered in
report-only mode, but does not specify a 'report-uri'; the policy will have no e
ffect. Please either add a 'report-uri' directive, or deliver the policy via the
'Content-Security-Policy' header."); |
748 } | 748 } |
749 | 749 |
750 void ContentSecurityPolicy::logToConsole(const String& message) const | 750 void ContentSecurityPolicy::logToConsole(const String& message) const |
751 { | 751 { |
752 m_client->addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, messag
e); | 752 m_executionContext->addConsoleMessage(SecurityMessageSource, ErrorMessageLev
el, message); |
753 } | 753 } |
754 | 754 |
755 void ContentSecurityPolicy::reportBlockedScriptExecutionToInspector(const String
& directiveText) const | 755 void ContentSecurityPolicy::reportBlockedScriptExecutionToInspector(const String
& directiveText) const |
756 { | 756 { |
757 m_client->reportBlockedScriptExecutionToInspector(directiveText); | 757 m_executionContext->reportBlockedScriptExecutionToInspector(directiveText); |
758 } | 758 } |
759 | 759 |
760 bool ContentSecurityPolicy::experimentalFeaturesEnabled() const | 760 bool ContentSecurityPolicy::experimentalFeaturesEnabled() const |
761 { | 761 { |
762 return RuntimeEnabledFeatures::experimentalContentSecurityPolicyFeaturesEnab
led(); | 762 return RuntimeEnabledFeatures::experimentalContentSecurityPolicyFeaturesEnab
led(); |
763 } | 763 } |
764 | 764 |
765 bool ContentSecurityPolicy::shouldBypassMainWorld(ExecutionContext* context) | 765 bool ContentSecurityPolicy::shouldBypassMainWorld(ExecutionContext* context) |
766 { | 766 { |
767 if (context && context->isDocument()) { | 767 if (context && context->isDocument()) { |
768 Document* document = toDocument(context); | 768 Document* document = toDocument(context); |
769 if (document->frame()) | 769 if (document->frame()) |
770 return document->frame()->script().shouldBypassMainWorldContentSecur
ityPolicy(); | 770 return document->frame()->script().shouldBypassMainWorldContentSecur
ityPolicy(); |
771 } | 771 } |
772 return false; | 772 return false; |
773 } | 773 } |
774 | 774 |
775 bool ContentSecurityPolicy::shouldSendViolationReport(const String& report) cons
t | 775 bool ContentSecurityPolicy::shouldSendViolationReport(const String& report) cons
t |
776 { | 776 { |
777 // Collisions have no security impact, so we can save space by storing only
the string's hash rather than the whole report. | 777 // Collisions have no security impact, so we can save space by storing only
the string's hash rather than the whole report. |
778 return !m_violationReportsSent.contains(report.impl()->hash()); | 778 return !m_violationReportsSent.contains(report.impl()->hash()); |
779 } | 779 } |
780 | 780 |
781 void ContentSecurityPolicy::didSendViolationReport(const String& report) | 781 void ContentSecurityPolicy::didSendViolationReport(const String& report) |
782 { | 782 { |
783 m_violationReportsSent.add(report.impl()->hash()); | 783 m_violationReportsSent.add(report.impl()->hash()); |
784 } | 784 } |
785 | 785 |
786 } // namespace WebCore | 786 } // namespace WebCore |
OLD | NEW |