UrlClassifierFeatureAntiFraudAnnotation.cpp (6184B)
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/. */ 6 7 #include "UrlClassifierFeatureAntiFraudAnnotation.h" 8 9 #include "Classifier.h" 10 #include "mozilla/Logging.h" 11 #include "mozilla/StaticPrefs_privacy.h" 12 #include "mozilla/StaticPtr.h" 13 #include "mozilla/net/UrlClassifierCommon.h" 14 #include "nsIChannel.h" 15 #include "nsIClassifiedChannel.h" 16 #include "nsIWebProgressListener.h" 17 #include "nsContentUtils.h" 18 19 namespace mozilla { 20 namespace net { 21 22 namespace { 23 24 #define ANTIFRAUD_ANNOTATION_FEATURE_NAME "antifraud-annotation" 25 26 #define URLCLASSIFIER_ANTIFRAUD_ANNOTATION_BLOCKLIST \ 27 "urlclassifier.features.antifraud.annotate.blocklistTables" 28 #define URLCLASSIFIER_ANTIFRAUD_ANNOTATION_BLOCKLIST_TEST_ENTRIES \ 29 "urlclassifier.features.antifraud.annotate.blocklistHosts" 30 #define URLCLASSIFIER_ANTIFRAUD_ANNOTATION_ENTITYLIST \ 31 "urlclassifier.features.antifraud.annotate.allowlistTables" 32 #define URLCLASSIFIER_ANTIFRAUD_ANNOTATION_ENTITYLIST_TEST_ENTRIES \ 33 "urlclassifier.features.antifraud.annotate.allowlistHosts" 34 #define URLCLASSIFIER_ANTIFRAUD_ANNOTATION_EXCEPTION_URLS \ 35 "urlclassifier.features.antifraud.annotate.skipURLs" 36 #define TABLE_ANTIFRAUD_ANNOTATION_BLOCKLIST_PREF \ 37 "antifraud-annotate-blocklist-pref" 38 #define TABLE_ANTIFRAUD_ANNOTATION_ENTITYLIST_PREF \ 39 "antifraud-annotate-allowlist-pref" 40 41 static StaticRefPtr<UrlClassifierFeatureAntiFraudAnnotation> 42 gFeatureAntiFraudAnnotation; 43 44 } // namespace 45 46 UrlClassifierFeatureAntiFraudAnnotation:: 47 UrlClassifierFeatureAntiFraudAnnotation() 48 : UrlClassifierFeatureAntiTrackingBase( 49 nsLiteralCString(ANTIFRAUD_ANNOTATION_FEATURE_NAME), 50 nsLiteralCString(URLCLASSIFIER_ANTIFRAUD_ANNOTATION_BLOCKLIST), 51 nsLiteralCString(URLCLASSIFIER_ANTIFRAUD_ANNOTATION_ENTITYLIST), 52 nsLiteralCString( 53 URLCLASSIFIER_ANTIFRAUD_ANNOTATION_BLOCKLIST_TEST_ENTRIES), 54 nsLiteralCString( 55 URLCLASSIFIER_ANTIFRAUD_ANNOTATION_ENTITYLIST_TEST_ENTRIES), 56 nsLiteralCString(TABLE_ANTIFRAUD_ANNOTATION_BLOCKLIST_PREF), 57 nsLiteralCString(TABLE_ANTIFRAUD_ANNOTATION_ENTITYLIST_PREF), 58 nsLiteralCString(URLCLASSIFIER_ANTIFRAUD_ANNOTATION_EXCEPTION_URLS)) { 59 } 60 61 /* static */ const char* UrlClassifierFeatureAntiFraudAnnotation::Name() { 62 return ANTIFRAUD_ANNOTATION_FEATURE_NAME; 63 } 64 65 /* static */ 66 void UrlClassifierFeatureAntiFraudAnnotation::MaybeInitialize() { 67 MOZ_ASSERT(XRE_IsParentProcess()); 68 UC_LOG_LEAK(("UrlClassifierFeatureAntiFraudAnnotation::MaybeInitialize")); 69 70 if (!gFeatureAntiFraudAnnotation) { 71 gFeatureAntiFraudAnnotation = new UrlClassifierFeatureAntiFraudAnnotation(); 72 gFeatureAntiFraudAnnotation->InitializePreferences(); 73 } 74 } 75 76 /* static */ 77 void UrlClassifierFeatureAntiFraudAnnotation::MaybeShutdown() { 78 UC_LOG_LEAK(("UrlClassifierFeatureAntiFraudAnnotation::MaybeShutdown")); 79 80 if (gFeatureAntiFraudAnnotation) { 81 gFeatureAntiFraudAnnotation->ShutdownPreferences(); 82 gFeatureAntiFraudAnnotation = nullptr; 83 } 84 } 85 86 /* static */ 87 already_AddRefed<UrlClassifierFeatureAntiFraudAnnotation> 88 UrlClassifierFeatureAntiFraudAnnotation::MaybeCreate(nsIChannel* aChannel) { 89 MOZ_ASSERT(aChannel); 90 91 UC_LOG_LEAK( 92 ("UrlClassifierFeatureAntiFraudAnnotation::MaybeCreate - channel %p", 93 aChannel)); 94 95 if (!StaticPrefs::privacy_trackingprotection_antifraud_annotate_channels()) { 96 return nullptr; 97 } 98 99 // We also don't need to annotate the channel if we are not blocking 100 // fingerprinters 101 if (!StaticPrefs::privacy_trackingprotection_fingerprinting_enabled()) { 102 return nullptr; 103 } 104 105 MaybeInitialize(); 106 MOZ_ASSERT(gFeatureAntiFraudAnnotation); 107 108 RefPtr<UrlClassifierFeatureAntiFraudAnnotation> self = 109 gFeatureAntiFraudAnnotation; 110 return self.forget(); 111 } 112 113 /* static */ 114 already_AddRefed<nsIUrlClassifierFeature> 115 UrlClassifierFeatureAntiFraudAnnotation::GetIfNameMatches( 116 const nsACString& aName) { 117 if (!aName.EqualsLiteral(ANTIFRAUD_ANNOTATION_FEATURE_NAME)) { 118 return nullptr; 119 } 120 121 MaybeInitialize(); 122 MOZ_ASSERT(gFeatureAntiFraudAnnotation); 123 124 RefPtr<UrlClassifierFeatureAntiFraudAnnotation> self = 125 gFeatureAntiFraudAnnotation; 126 return self.forget(); 127 } 128 129 NS_IMETHODIMP 130 UrlClassifierFeatureAntiFraudAnnotation::ProcessChannel( 131 nsIChannel* aChannel, const nsTArray<nsCString>& aList, 132 const nsTArray<nsCString>& aHashes, bool* aShouldContinue) { 133 NS_ENSURE_ARG_POINTER(aChannel); 134 NS_ENSURE_ARG_POINTER(aShouldContinue); 135 136 // This is not a blocking feature. 137 *aShouldContinue = true; 138 139 UC_LOG( 140 ("UrlClassifierFeatureAntiFraudAnnotation::ProcessChannel - " 141 "annotating channel %p", 142 aChannel)); 143 144 static std::vector<UrlClassifierCommon::ClassificationData> 145 sClassificationData = { 146 {"consent-manager-track-"_ns, 147 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_ANTIFRAUD}, 148 }; 149 150 uint32_t flags = UrlClassifierCommon::TablesToClassificationFlags( 151 aList, sClassificationData, 152 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_ANTIFRAUD); 153 154 UrlClassifierCommon::SetTrackingInfo(aChannel, aList, aHashes); 155 156 UrlClassifierCommon::AnnotateChannelWithoutNotifying(aChannel, flags); 157 158 return NS_OK; 159 } 160 161 NS_IMETHODIMP 162 UrlClassifierFeatureAntiFraudAnnotation::GetURIByListType( 163 nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, 164 nsIUrlClassifierFeature::URIType* aURIType, nsIURI** aURI) { 165 NS_ENSURE_ARG_POINTER(aChannel); 166 NS_ENSURE_ARG_POINTER(aURIType); 167 NS_ENSURE_ARG_POINTER(aURI); 168 169 if (aListType == nsIUrlClassifierFeature::blocklist) { 170 *aURIType = nsIUrlClassifierFeature::blocklistURI; 171 return aChannel->GetURI(aURI); 172 } 173 174 MOZ_ASSERT(aListType == nsIUrlClassifierFeature::entitylist); 175 176 *aURIType = nsIUrlClassifierFeature::pairwiseEntitylistURI; 177 return UrlClassifierCommon::CreatePairwiseEntityListURI(aChannel, aURI); 178 } 179 180 } // namespace net 181 } // namespace mozilla