mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 23:38:38 +09:00
Issue #2402 - Fix SecurityPolicyViolationEvent.violatedDirective. https://bugzilla.mozilla.org/show_bug.cgi?id=1418243
This commit is contained in:
parent
ec29404083
commit
1e0851158e
3 changed files with 80 additions and 12 deletions
|
|
@ -3,6 +3,9 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsContentPolicyUtils.h"
|
||||
#include "nsContentUtils.h"
|
||||
|
|
@ -58,6 +61,29 @@ GetCspContextLog()
|
|||
|
||||
static const uint32_t CSP_CACHE_URI_CUTOFF_SIZE = 512;
|
||||
|
||||
#ifdef DEBUG
|
||||
/**
|
||||
* This function is only used for verification purposes within
|
||||
* GatherSecurityPolicyViolationEventData.
|
||||
*/
|
||||
static bool
|
||||
ValidateDirectiveName(const nsAString& aDirective)
|
||||
{
|
||||
static const auto directives = [] () {
|
||||
std::unordered_set<std::string> directives;
|
||||
constexpr size_t dirLen = sizeof(CSPStrDirectives) / sizeof(CSPStrDirectives[0]);
|
||||
for (size_t i = 0; i < dirLen; ++i) {
|
||||
directives.insert(CSPStrDirectives[i]);
|
||||
}
|
||||
return directives;
|
||||
} ();
|
||||
|
||||
nsAutoString directive(aDirective);
|
||||
auto itr = directives.find(NS_ConvertUTF16toUTF8(directive).get());
|
||||
return itr != directives.end();
|
||||
}
|
||||
#endif // DEBUG
|
||||
|
||||
/**
|
||||
* Creates a key for use in the ShouldLoad cache.
|
||||
* Looks like: <uri>!<nsIContentPolicy::LOAD_TYPE>
|
||||
|
|
@ -812,6 +838,8 @@ nsCSPContext::GatherSecurityPolicyViolationEventData(
|
|||
{
|
||||
NS_ENSURE_ARG_MAX(aViolatedPolicyIndex, mPolicies.Length() - 1);
|
||||
|
||||
MOZ_ASSERT(ValidateDirectiveName(aViolatedDirective), "Invalid directive name");
|
||||
|
||||
if (!CSPService::sCSPReportingEnabled) {
|
||||
// Reporting is pref-disabled. Don't do any actual work and return success.
|
||||
nsContentUtils::ReportToConsoleNonLocalized(
|
||||
|
|
@ -853,12 +881,15 @@ nsCSPContext::GatherSecurityPolicyViolationEventData(
|
|||
aViolationEventInit.mBlockedURI = NS_ConvertUTF8toUTF16(reportBlockedURI);
|
||||
}
|
||||
|
||||
// violated-directive
|
||||
aViolationEventInit.mViolatedDirective = aViolatedDirective;
|
||||
|
||||
// effective-directive
|
||||
// The name of the policy directive that was violated.
|
||||
aViolationEventInit.mEffectiveDirective = aViolatedDirective;
|
||||
|
||||
// violated-directive
|
||||
// In CSP2, the policy directive that was violated, as it appears in the policy.
|
||||
// In CSP3, the same as effective-directive.
|
||||
aViolationEventInit.mViolatedDirective = aViolatedDirective;
|
||||
|
||||
// original-policy
|
||||
nsAutoString originalPolicy;
|
||||
rv = this->GetPolicyString(aViolatedPolicyIndex, originalPolicy);
|
||||
|
|
@ -1163,20 +1194,23 @@ class CSPReportSenderRunnable final : public Runnable
|
|||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
nsresult rv;
|
||||
|
||||
// 0) prepare violation data
|
||||
mozilla::dom::SecurityPolicyViolationEventInit init;
|
||||
mCSPContext->GatherSecurityPolicyViolationEventData(
|
||||
rv = mCSPContext->GatherSecurityPolicyViolationEventData(
|
||||
mBlockedContentSource, mOriginalURI,
|
||||
mViolatedDirective, mViolatedPolicyIndex,
|
||||
mSourceFile, mScriptSample, mLineNum,
|
||||
init);
|
||||
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// 1) notify observers
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
NS_ASSERTION(observerService, "needs observer service");
|
||||
nsresult rv = observerService->NotifyObservers(mObserverSubject,
|
||||
CSP_VIOLATION_TOPIC,
|
||||
mViolatedDirective.get());
|
||||
rv = observerService->NotifyObservers(mObserverSubject,
|
||||
CSP_VIOLATION_TOPIC,
|
||||
mViolatedDirective.get());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// 2) send reports for the policy that was violated
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue