UrlClassifierFeatureCryptominingAnnotation.cpp (6052B)
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 "UrlClassifierFeatureCryptominingAnnotation.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 CRYPTOMINING_ANNOTATION_FEATURE_NAME "cryptomining-annotation" 23 24 #define URLCLASSIFIER_CRYPTOMINING_ANNOTATION_BLOCKLIST \ 25 "urlclassifier.features.cryptomining.annotate.blacklistTables" 26 #define URLCLASSIFIER_CRYPTOMINING_ANNOTATION_BLOCKLIST_TEST_ENTRIES \ 27 "urlclassifier.features.cryptomining.annotate.blacklistHosts" 28 #define URLCLASSIFIER_CRYPTOMINING_ANNOTATION_ENTITYLIST \ 29 "urlclassifier.features.cryptomining.annotate.whitelistTables" 30 #define URLCLASSIFIER_CRYPTOMINING_ANNOTATION_ENTITYLIST_TEST_ENTRIES \ 31 "urlclassifier.features.cryptomining.annotate.whitelistHosts" 32 #define URLCLASSIFIER_CRYPTOMINING_ANNOTATION_EXCEPTION_URLS \ 33 "urlclassifier.features.cryptomining.annotate.skipURLs" 34 #define TABLE_CRYPTOMINING_ANNOTATION_BLOCKLIST_PREF \ 35 "cryptomining-annotate-blacklist-pref" 36 #define TABLE_CRYPTOMINING_ANNOTATION_ENTITYLIST_PREF \ 37 "cryptomining-annotate-whitelist-pref" 38 39 StaticRefPtr<UrlClassifierFeatureCryptominingAnnotation> 40 gFeatureCryptominingAnnotation; 41 42 } // namespace 43 44 UrlClassifierFeatureCryptominingAnnotation:: 45 UrlClassifierFeatureCryptominingAnnotation() 46 : UrlClassifierFeatureAntiTrackingBase( 47 nsLiteralCString(CRYPTOMINING_ANNOTATION_FEATURE_NAME), 48 nsLiteralCString(URLCLASSIFIER_CRYPTOMINING_ANNOTATION_BLOCKLIST), 49 nsLiteralCString(URLCLASSIFIER_CRYPTOMINING_ANNOTATION_ENTITYLIST), 50 nsLiteralCString( 51 URLCLASSIFIER_CRYPTOMINING_ANNOTATION_BLOCKLIST_TEST_ENTRIES), 52 nsLiteralCString( 53 URLCLASSIFIER_CRYPTOMINING_ANNOTATION_ENTITYLIST_TEST_ENTRIES), 54 nsLiteralCString(TABLE_CRYPTOMINING_ANNOTATION_BLOCKLIST_PREF), 55 nsLiteralCString(TABLE_CRYPTOMINING_ANNOTATION_ENTITYLIST_PREF), 56 nsLiteralCString( 57 URLCLASSIFIER_CRYPTOMINING_ANNOTATION_EXCEPTION_URLS)) {} 58 /* static */ const char* UrlClassifierFeatureCryptominingAnnotation::Name() { 59 return CRYPTOMINING_ANNOTATION_FEATURE_NAME; 60 } 61 62 /* static */ 63 void UrlClassifierFeatureCryptominingAnnotation::MaybeInitialize() { 64 UC_LOG_LEAK(("UrlClassifierFeatureCryptominingAnnotation::MaybeInitialize")); 65 66 if (!gFeatureCryptominingAnnotation) { 67 gFeatureCryptominingAnnotation = 68 new UrlClassifierFeatureCryptominingAnnotation(); 69 gFeatureCryptominingAnnotation->InitializePreferences(); 70 } 71 } 72 73 /* static */ 74 void UrlClassifierFeatureCryptominingAnnotation::MaybeShutdown() { 75 UC_LOG_LEAK(("UrlClassifierFeatureCryptominingAnnotation::MaybeShutdown")); 76 77 if (gFeatureCryptominingAnnotation) { 78 gFeatureCryptominingAnnotation->ShutdownPreferences(); 79 gFeatureCryptominingAnnotation = nullptr; 80 } 81 } 82 83 /* static */ 84 already_AddRefed<UrlClassifierFeatureCryptominingAnnotation> 85 UrlClassifierFeatureCryptominingAnnotation::MaybeCreate(nsIChannel* aChannel) { 86 MOZ_ASSERT(aChannel); 87 88 UC_LOG_LEAK( 89 ("UrlClassifierFeatureCryptominingAnnotation::MaybeCreate - channel %p", 90 aChannel)); 91 92 MaybeInitialize(); 93 MOZ_ASSERT(gFeatureCryptominingAnnotation); 94 95 RefPtr<UrlClassifierFeatureCryptominingAnnotation> self = 96 gFeatureCryptominingAnnotation; 97 return self.forget(); 98 } 99 100 /* static */ 101 already_AddRefed<nsIUrlClassifierFeature> 102 UrlClassifierFeatureCryptominingAnnotation::GetIfNameMatches( 103 const nsACString& aName) { 104 if (!aName.EqualsLiteral(CRYPTOMINING_ANNOTATION_FEATURE_NAME)) { 105 return nullptr; 106 } 107 108 MaybeInitialize(); 109 MOZ_ASSERT(gFeatureCryptominingAnnotation); 110 111 RefPtr<UrlClassifierFeatureCryptominingAnnotation> self = 112 gFeatureCryptominingAnnotation; 113 return self.forget(); 114 } 115 116 NS_IMETHODIMP 117 UrlClassifierFeatureCryptominingAnnotation::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 ("UrlClassifierFeatureCryptominingAnnotation::ProcessChannel - " 128 "annotating channel %p", 129 aChannel)); 130 131 static std::vector<UrlClassifierCommon::ClassificationData> 132 sClassificationData = { 133 {"content-cryptomining-track-"_ns, 134 nsIClassifiedChannel::ClassificationFlags:: 135 CLASSIFIED_CRYPTOMINING_CONTENT}, 136 }; 137 138 uint32_t flags = UrlClassifierCommon::TablesToClassificationFlags( 139 aList, sClassificationData, 140 nsIClassifiedChannel::ClassificationFlags::CLASSIFIED_CRYPTOMINING); 141 142 UrlClassifierCommon::SetTrackingInfo(aChannel, aList, aHashes); 143 144 UrlClassifierCommon::AnnotateChannel( 145 aChannel, flags, 146 nsIWebProgressListener::STATE_LOADED_CRYPTOMINING_CONTENT); 147 return NS_OK; 148 } 149 150 NS_IMETHODIMP 151 UrlClassifierFeatureCryptominingAnnotation::GetURIByListType( 152 nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, 153 nsIUrlClassifierFeature::URIType* aURIType, nsIURI** aURI) { 154 NS_ENSURE_ARG_POINTER(aChannel); 155 NS_ENSURE_ARG_POINTER(aURIType); 156 NS_ENSURE_ARG_POINTER(aURI); 157 158 if (aListType == nsIUrlClassifierFeature::blocklist) { 159 *aURIType = nsIUrlClassifierFeature::blocklistURI; 160 return aChannel->GetURI(aURI); 161 } 162 163 MOZ_ASSERT(aListType == nsIUrlClassifierFeature::entitylist); 164 165 *aURIType = nsIUrlClassifierFeature::pairwiseEntitylistURI; 166 return UrlClassifierCommon::CreatePairwiseEntityListURI(aChannel, aURI); 167 } 168 169 } // namespace net 170 } // namespace mozilla