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