UrlClassifierFeatureTrackingAnnotation.cpp (6416B)
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 "UrlClassifierFeatureTrackingAnnotation.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 TRACKING_ANNOTATION_FEATURE_NAME "tracking-annotation" 25 26 #define URLCLASSIFIER_ANNOTATION_BLOCKLIST \ 27 "urlclassifier.trackingAnnotationTable" 28 #define URLCLASSIFIER_ANNOTATION_BLOCKLIST_TEST_ENTRIES \ 29 "urlclassifier.trackingAnnotationTable.testEntries" 30 #define URLCLASSIFIER_ANNOTATION_ENTITYLIST \ 31 "urlclassifier.trackingAnnotationWhitelistTable" 32 #define URLCLASSIFIER_ANNOTATION_ENTITYLIST_TEST_ENTRIES \ 33 "urlclassifier.trackingAnnotationWhitelistTable.testEntries" 34 #define URLCLASSIFIER_TRACKING_ANNOTATION_EXCEPTION_URLS \ 35 "urlclassifier.trackingAnnotationSkipURLs" 36 #define TABLE_ANNOTATION_BLOCKLIST_PREF "annotation-blacklist-pref" 37 #define TABLE_ANNOTATION_ENTITYLIST_PREF "annotation-whitelist-pref" 38 39 StaticRefPtr<UrlClassifierFeatureTrackingAnnotation> gFeatureTrackingAnnotation; 40 41 } // namespace 42 43 UrlClassifierFeatureTrackingAnnotation::UrlClassifierFeatureTrackingAnnotation() 44 : UrlClassifierFeatureAntiTrackingBase( 45 nsLiteralCString(TRACKING_ANNOTATION_FEATURE_NAME), 46 nsLiteralCString(URLCLASSIFIER_ANNOTATION_BLOCKLIST), 47 nsLiteralCString(URLCLASSIFIER_ANNOTATION_ENTITYLIST), 48 nsLiteralCString(URLCLASSIFIER_ANNOTATION_BLOCKLIST_TEST_ENTRIES), 49 nsLiteralCString(URLCLASSIFIER_ANNOTATION_ENTITYLIST_TEST_ENTRIES), 50 nsLiteralCString(TABLE_ANNOTATION_BLOCKLIST_PREF), 51 nsLiteralCString(TABLE_ANNOTATION_ENTITYLIST_PREF), 52 nsLiteralCString(URLCLASSIFIER_TRACKING_ANNOTATION_EXCEPTION_URLS)) {} 53 54 /* static */ const char* UrlClassifierFeatureTrackingAnnotation::Name() { 55 return TRACKING_ANNOTATION_FEATURE_NAME; 56 } 57 58 /* static */ 59 void UrlClassifierFeatureTrackingAnnotation::MaybeInitialize() { 60 MOZ_ASSERT(XRE_IsParentProcess()); 61 UC_LOG_LEAK(("UrlClassifierFeatureTrackingAnnotation::MaybeInitialize")); 62 63 if (!gFeatureTrackingAnnotation) { 64 gFeatureTrackingAnnotation = new UrlClassifierFeatureTrackingAnnotation(); 65 gFeatureTrackingAnnotation->InitializePreferences(); 66 } 67 } 68 69 /* static */ 70 void UrlClassifierFeatureTrackingAnnotation::MaybeShutdown() { 71 UC_LOG_LEAK(("UrlClassifierFeatureTrackingAnnotation::MaybeShutdown")); 72 73 if (gFeatureTrackingAnnotation) { 74 gFeatureTrackingAnnotation->ShutdownPreferences(); 75 gFeatureTrackingAnnotation = nullptr; 76 } 77 } 78 79 /* static */ 80 already_AddRefed<UrlClassifierFeatureTrackingAnnotation> 81 UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) { 82 MOZ_ASSERT(aChannel); 83 84 UC_LOG_LEAK( 85 ("UrlClassifierFeatureTrackingAnnotation::MaybeCreate - channel %p", 86 aChannel)); 87 88 if (!StaticPrefs::privacy_trackingprotection_annotate_channels()) { 89 return nullptr; 90 } 91 92 MaybeInitialize(); 93 MOZ_ASSERT(gFeatureTrackingAnnotation); 94 95 RefPtr<UrlClassifierFeatureTrackingAnnotation> self = 96 gFeatureTrackingAnnotation; 97 return self.forget(); 98 } 99 100 /* static */ 101 already_AddRefed<nsIUrlClassifierFeature> 102 UrlClassifierFeatureTrackingAnnotation::GetIfNameMatches( 103 const nsACString& aName) { 104 if (!aName.EqualsLiteral(TRACKING_ANNOTATION_FEATURE_NAME)) { 105 return nullptr; 106 } 107 108 MaybeInitialize(); 109 MOZ_ASSERT(gFeatureTrackingAnnotation); 110 111 RefPtr<UrlClassifierFeatureTrackingAnnotation> self = 112 gFeatureTrackingAnnotation; 113 return self.forget(); 114 } 115 116 NS_IMETHODIMP 117 UrlClassifierFeatureTrackingAnnotation::ProcessChannel( 118 nsIChannel* aChannel, const nsTArray<nsCString>& aList, 119 const nsTArray<nsCString>& aHashes, bool* aShouldContinue) { 120 NS_ENSURE_ARG_POINTER(aChannel); 121 NS_ENSURE_ARG_POINTER(aShouldContinue); 122 123 // This is not a blocking feature. 124 *aShouldContinue = true; 125 126 UC_LOG( 127 ("UrlClassifierFeatureTrackingAnnotation::ProcessChannel - " 128 "annotating channel %p", 129 aChannel)); 130 131 static std::vector<UrlClassifierCommon::ClassificationData> 132 sClassificationData = { 133 {"ads-track-"_ns, 134 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_TRACKING_AD}, 135 {"analytics-track-"_ns, nsIClassifiedChannel::ClassificationFlags:: 136 CLASSIFIED_TRACKING_ANALYTICS}, 137 {"social-track-"_ns, nsIClassifiedChannel::ClassificationFlags:: 138 CLASSIFIED_TRACKING_SOCIAL}, 139 {"content-track-"_ns, nsIClassifiedChannel::ClassificationFlags:: 140 CLASSIFIED_TRACKING_CONTENT}, 141 }; 142 143 uint32_t flags = UrlClassifierCommon::TablesToClassificationFlags( 144 aList, sClassificationData, 145 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_TRACKING); 146 147 UrlClassifierCommon::SetTrackingInfo(aChannel, aList, aHashes); 148 149 uint32_t notification = 150 ((flags & nsIClassifiedChannel::ClassificationFlags:: 151 CLASSIFIED_TRACKING_CONTENT) != 0) 152 ? nsIWebProgressListener::STATE_LOADED_LEVEL_2_TRACKING_CONTENT 153 : nsIWebProgressListener::STATE_LOADED_LEVEL_1_TRACKING_CONTENT; 154 155 UrlClassifierCommon::AnnotateChannel(aChannel, flags, notification); 156 157 return NS_OK; 158 } 159 160 NS_IMETHODIMP 161 UrlClassifierFeatureTrackingAnnotation::GetURIByListType( 162 nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, 163 nsIUrlClassifierFeature::URIType* aURIType, nsIURI** aURI) { 164 NS_ENSURE_ARG_POINTER(aChannel); 165 NS_ENSURE_ARG_POINTER(aURIType); 166 NS_ENSURE_ARG_POINTER(aURI); 167 168 if (aListType == nsIUrlClassifierFeature::blocklist) { 169 *aURIType = nsIUrlClassifierFeature::blocklistURI; 170 return aChannel->GetURI(aURI); 171 } 172 173 MOZ_ASSERT(aListType == nsIUrlClassifierFeature::entitylist); 174 175 *aURIType = nsIUrlClassifierFeature::pairwiseEntitylistURI; 176 return UrlClassifierCommon::CreatePairwiseEntityListURI(aChannel, aURI); 177 } 178 179 } // namespace net 180 } // namespace mozilla