UrlClassifierFeatureSocialTrackingAnnotation.cpp (6444B)
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 "UrlClassifierFeatureSocialTrackingAnnotation.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 SOCIALTRACKING_ANNOTATION_FEATURE_NAME "socialtracking-annotation" 23 24 #define URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_BLOCKLIST \ 25 "urlclassifier.features.socialtracking.annotate.blacklistTables" 26 #define URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_BLOCKLIST_TEST_ENTRIES \ 27 "urlclassifier.features.socialtracking.annotate.blacklistHosts" 28 #define URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_ENTITYLIST \ 29 "urlclassifier.features.socialtracking.annotate.whitelistTables" 30 #define URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_ENTITYLIST_TEST_ENTRIES \ 31 "urlclassifier.features.socialtracking.annotate.whitelistHosts" 32 #define URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_EXCEPTION_URLS \ 33 "urlclassifier.features.socialtracking.annotate.skipURLs" 34 #define TABLE_SOCIALTRACKING_ANNOTATION_BLOCKLIST_PREF \ 35 "socialtracking-annotate-blacklist-pref" 36 #define TABLE_SOCIALTRACKING_ANNOTATION_ENTITYLIST_PREF \ 37 "socialtracking-annotate-whitelist-pref" 38 39 StaticRefPtr<UrlClassifierFeatureSocialTrackingAnnotation> 40 gFeatureSocialTrackingAnnotation; 41 42 } // namespace 43 44 UrlClassifierFeatureSocialTrackingAnnotation:: 45 UrlClassifierFeatureSocialTrackingAnnotation() 46 : UrlClassifierFeatureAntiTrackingBase( 47 nsLiteralCString(SOCIALTRACKING_ANNOTATION_FEATURE_NAME), 48 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_BLOCKLIST), 49 nsLiteralCString(URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_ENTITYLIST), 50 nsLiteralCString( 51 URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_BLOCKLIST_TEST_ENTRIES), 52 nsLiteralCString( 53 URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_ENTITYLIST_TEST_ENTRIES), 54 nsLiteralCString(TABLE_SOCIALTRACKING_ANNOTATION_BLOCKLIST_PREF), 55 nsLiteralCString(TABLE_SOCIALTRACKING_ANNOTATION_ENTITYLIST_PREF), 56 nsLiteralCString( 57 URLCLASSIFIER_SOCIALTRACKING_ANNOTATION_EXCEPTION_URLS)) {} 58 59 /* static */ const char* UrlClassifierFeatureSocialTrackingAnnotation::Name() { 60 return SOCIALTRACKING_ANNOTATION_FEATURE_NAME; 61 } 62 63 /* static */ 64 void UrlClassifierFeatureSocialTrackingAnnotation::MaybeInitialize() { 65 UC_LOG_LEAK( 66 ("UrlClassifierFeatureSocialTrackingAnnotation::MaybeInitialize")); 67 68 if (!gFeatureSocialTrackingAnnotation) { 69 gFeatureSocialTrackingAnnotation = 70 new UrlClassifierFeatureSocialTrackingAnnotation(); 71 gFeatureSocialTrackingAnnotation->InitializePreferences(); 72 } 73 } 74 75 /* static */ 76 void UrlClassifierFeatureSocialTrackingAnnotation::MaybeShutdown() { 77 UC_LOG_LEAK(("UrlClassifierFeatureSocialTrackingAnnotation::MaybeShutdown")); 78 79 if (gFeatureSocialTrackingAnnotation) { 80 gFeatureSocialTrackingAnnotation->ShutdownPreferences(); 81 gFeatureSocialTrackingAnnotation = nullptr; 82 } 83 } 84 85 /* static */ 86 already_AddRefed<UrlClassifierFeatureSocialTrackingAnnotation> 87 UrlClassifierFeatureSocialTrackingAnnotation::MaybeCreate( 88 nsIChannel* aChannel) { 89 MOZ_ASSERT(aChannel); 90 91 UC_LOG_LEAK( 92 ("UrlClassifierFeatureSocialTrackingAnnotation::MaybeCreate - channel %p", 93 aChannel)); 94 95 MaybeInitialize(); 96 MOZ_ASSERT(gFeatureSocialTrackingAnnotation); 97 98 RefPtr<UrlClassifierFeatureSocialTrackingAnnotation> self = 99 gFeatureSocialTrackingAnnotation; 100 return self.forget(); 101 } 102 103 /* static */ 104 already_AddRefed<nsIUrlClassifierFeature> 105 UrlClassifierFeatureSocialTrackingAnnotation::GetIfNameMatches( 106 const nsACString& aName) { 107 if (!aName.EqualsLiteral(SOCIALTRACKING_ANNOTATION_FEATURE_NAME)) { 108 return nullptr; 109 } 110 111 MaybeInitialize(); 112 MOZ_ASSERT(gFeatureSocialTrackingAnnotation); 113 114 RefPtr<UrlClassifierFeatureSocialTrackingAnnotation> self = 115 gFeatureSocialTrackingAnnotation; 116 return self.forget(); 117 } 118 119 NS_IMETHODIMP 120 UrlClassifierFeatureSocialTrackingAnnotation::ProcessChannel( 121 nsIChannel* aChannel, const nsTArray<nsCString>& aList, 122 const nsTArray<nsCString>& aHashes, bool* aShouldContinue) { 123 NS_ENSURE_ARG_POINTER(aChannel); 124 NS_ENSURE_ARG_POINTER(aShouldContinue); 125 126 // This is not a blocking feature. 127 *aShouldContinue = true; 128 129 UC_LOG( 130 ("UrlClassifierFeatureSocialTrackingAnnotation::ProcessChannel" 131 "annotating channel %p", 132 aChannel)); 133 134 static std::vector<UrlClassifierCommon::ClassificationData> 135 sClassificationData = { 136 {"social-tracking-protection-facebook-"_ns, 137 nsIClassifiedChannel::ClassificationFlags:: 138 CLASSIFIED_SOCIALTRACKING_FACEBOOK}, 139 {"social-tracking-protection-linkedin-"_ns, 140 nsIClassifiedChannel::ClassificationFlags:: 141 CLASSIFIED_SOCIALTRACKING_LINKEDIN}, 142 {"social-tracking-protection-twitter-"_ns, 143 nsIClassifiedChannel::ClassificationFlags:: 144 CLASSIFIED_SOCIALTRACKING_TWITTER}, 145 }; 146 147 uint32_t flags = UrlClassifierCommon::TablesToClassificationFlags( 148 aList, sClassificationData, 149 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_SOCIALTRACKING); 150 151 UrlClassifierCommon::AnnotateChannel( 152 aChannel, flags, 153 nsIWebProgressListener::STATE_LOADED_SOCIALTRACKING_CONTENT); 154 155 return NS_OK; 156 } 157 158 NS_IMETHODIMP 159 UrlClassifierFeatureSocialTrackingAnnotation::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