1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "UrlClassifierFeatureSocialTrackingProtection.h"
9 #include "mozilla/AntiTrackingUtils.h"
10 #include "mozilla/net/UrlClassifierCommon.h"
11 #include "ChannelClassifierService.h"
12 #include "mozilla/StaticPrefs_privacy.h"
13 #include "nsNetUtil.h"
14 #include "mozilla/StaticPtr.h"
15 #include "nsIWebProgressListener.h"
16 #include "nsIHttpChannelInternal.h"
17 #include "nsIChannel.h"
24 #define SOCIALTRACKING_FEATURE_NAME "socialtracking-protection"
26 #define URLCLASSIFIER_SOCIALTRACKING_BLOCKLIST \
27 "urlclassifier.features.socialtracking.blacklistTables"
28 #define URLCLASSIFIER_SOCIALTRACKING_BLOCKLIST_TEST_ENTRIES \
29 "urlclassifier.features.socialtracking.blacklistHosts"
30 #define URLCLASSIFIER_SOCIALTRACKING_ENTITYLIST \
31 "urlclassifier.features.socialtracking.whitelistTables"
32 #define URLCLASSIFIER_SOCIALTRACKING_ENTITYLIST_TEST_ENTRIES \
33 "urlclassifier.features.socialtracking.whitelistHosts"
34 #define URLCLASSIFIER_SOCIALTRACKING_EXCEPTION_URLS \
35 "urlclassifier.features.socialtracking.skipURLs"
36 #define TABLE_SOCIALTRACKING_BLOCKLIST_PREF "socialtracking-blocklist-pref"
37 #define TABLE_SOCIALTRACKING_ENTITYLIST_PREF "socialtracking-entitylist-pref"
39 StaticRefPtr
<UrlClassifierFeatureSocialTrackingProtection
>
40 gFeatureSocialTrackingProtection
;
44 UrlClassifierFeatureSocialTrackingProtection::
45 UrlClassifierFeatureSocialTrackingProtection()
46 : UrlClassifierFeatureAntiTrackingBase(
47 nsLiteralCString(SOCIALTRACKING_FEATURE_NAME
),
48 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_BLOCKLIST
),
49 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_ENTITYLIST
),
50 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_BLOCKLIST_TEST_ENTRIES
),
52 URLCLASSIFIER_SOCIALTRACKING_ENTITYLIST_TEST_ENTRIES
),
53 nsLiteralCString(TABLE_SOCIALTRACKING_BLOCKLIST_PREF
),
54 nsLiteralCString(TABLE_SOCIALTRACKING_ENTITYLIST_PREF
),
55 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_EXCEPTION_URLS
)) {}
57 /* static */ const char* UrlClassifierFeatureSocialTrackingProtection::Name() {
58 return SOCIALTRACKING_FEATURE_NAME
;
62 void UrlClassifierFeatureSocialTrackingProtection::MaybeInitialize() {
64 ("UrlClassifierFeatureSocialTrackingProtection::MaybeInitialize"));
66 if (!gFeatureSocialTrackingProtection
) {
67 gFeatureSocialTrackingProtection
=
68 new UrlClassifierFeatureSocialTrackingProtection();
69 gFeatureSocialTrackingProtection
->InitializePreferences();
74 void UrlClassifierFeatureSocialTrackingProtection::MaybeShutdown() {
75 UC_LOG_LEAK(("UrlClassifierFeatureSocialTrackingProtection::MaybeShutdown"));
77 if (gFeatureSocialTrackingProtection
) {
78 gFeatureSocialTrackingProtection
->ShutdownPreferences();
79 gFeatureSocialTrackingProtection
= nullptr;
84 already_AddRefed
<UrlClassifierFeatureSocialTrackingProtection
>
85 UrlClassifierFeatureSocialTrackingProtection::MaybeCreate(
86 nsIChannel
* aChannel
) {
90 ("UrlClassifierFeatureSocialTrackingProtection::MaybeCreate - channel %p",
93 if (!StaticPrefs::privacy_trackingprotection_socialtracking_enabled()) {
97 bool isThirdParty
= AntiTrackingUtils::IsThirdPartyChannel(aChannel
);
100 ("UrlClassifierFeatureSocialTrackingProtection::MaybeCreate - "
101 "skipping first party or top-level load for channel %p",
106 if (!UrlClassifierCommon::ShouldEnableProtectionForChannel(aChannel
)) {
111 MOZ_ASSERT(gFeatureSocialTrackingProtection
);
113 RefPtr
<UrlClassifierFeatureSocialTrackingProtection
> self
=
114 gFeatureSocialTrackingProtection
;
115 return self
.forget();
119 already_AddRefed
<nsIUrlClassifierFeature
>
120 UrlClassifierFeatureSocialTrackingProtection::GetIfNameMatches(
121 const nsACString
& aName
) {
122 if (!aName
.EqualsLiteral(SOCIALTRACKING_FEATURE_NAME
)) {
127 MOZ_ASSERT(gFeatureSocialTrackingProtection
);
129 RefPtr
<UrlClassifierFeatureSocialTrackingProtection
> self
=
130 gFeatureSocialTrackingProtection
;
131 return self
.forget();
135 UrlClassifierFeatureSocialTrackingProtection::ProcessChannel(
136 nsIChannel
* aChannel
, const nsTArray
<nsCString
>& aList
,
137 const nsTArray
<nsCString
>& aHashes
, bool* aShouldContinue
) {
138 NS_ENSURE_ARG_POINTER(aChannel
);
139 NS_ENSURE_ARG_POINTER(aShouldContinue
);
141 bool isAllowListed
= UrlClassifierCommon::IsAllowListed(aChannel
);
143 // This is a blocking feature.
144 *aShouldContinue
= isAllowListed
;
151 UrlClassifierCommon::TablesToString(aList
, list
);
153 ChannelBlockDecision decision
=
154 ChannelClassifierService::OnBeforeBlockChannel(aChannel
, mName
, list
);
155 if (decision
!= ChannelBlockDecision::Blocked
) {
157 decision
== ChannelBlockDecision::Replaced
158 ? nsIWebProgressListener::STATE_REPLACED_TRACKING_CONTENT
159 : nsIWebProgressListener::STATE_ALLOWED_TRACKING_CONTENT
;
160 ContentBlockingNotifier::OnEvent(aChannel
, event
, false);
162 *aShouldContinue
= true;
166 UrlClassifierCommon::SetBlockedContent(aChannel
, NS_ERROR_SOCIALTRACKING_URI
,
170 ("UrlClassifierFeatureSocialTrackingProtection::ProcessChannel - "
171 "cancelling channel %p",
173 nsCOMPtr
<nsIHttpChannelInternal
> httpChannel
= do_QueryInterface(aChannel
);
176 Unused
<< httpChannel
->CancelByURLClassifier(NS_ERROR_SOCIALTRACKING_URI
);
178 Unused
<< aChannel
->Cancel(NS_ERROR_SOCIALTRACKING_URI
);
185 UrlClassifierFeatureSocialTrackingProtection::GetURIByListType(
186 nsIChannel
* aChannel
, nsIUrlClassifierFeature::listType aListType
,
187 nsIUrlClassifierFeature::URIType
* aURIType
, nsIURI
** aURI
) {
188 NS_ENSURE_ARG_POINTER(aChannel
);
189 NS_ENSURE_ARG_POINTER(aURIType
);
190 NS_ENSURE_ARG_POINTER(aURI
);
192 if (aListType
== nsIUrlClassifierFeature::blocklist
) {
193 *aURIType
= nsIUrlClassifierFeature::blocklistURI
;
194 return aChannel
->GetURI(aURI
);
197 MOZ_ASSERT(aListType
== nsIUrlClassifierFeature::entitylist
);
199 *aURIType
= nsIUrlClassifierFeature::pairwiseEntitylistURI
;
200 return UrlClassifierCommon::CreatePairwiseEntityListURI(aChannel
, aURI
);
204 } // namespace mozilla