forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			177 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 | |
|  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "QuotaCommon.h"
 | |
| 
 | |
| #include "mozilla/Logging.h"  // LazyLogModule
 | |
| #include "nsIFile.h"
 | |
| #include "nsXPCOM.h"
 | |
| #include "nsXULAppAPI.h"
 | |
| #ifdef XP_WIN
 | |
| #  include "mozilla/ipc/BackgroundParent.h"
 | |
| #  include "mozilla/StaticPrefs_dom.h"
 | |
| #  include "nsILocalFileWin.h"
 | |
| #endif
 | |
| #include "nsXPCOM.h"
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace dom {
 | |
| namespace quota {
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| #ifdef DEBUG
 | |
| constexpr auto kDSStoreFileName = u".DS_Store"_ns;
 | |
| constexpr auto kDesktopFileName = u".desktop"_ns;
 | |
| constexpr auto kDesktopIniFileName = u"desktop.ini"_ns;
 | |
| constexpr auto kThumbsDbFileName = u"thumbs.db"_ns;
 | |
| #endif
 | |
| 
 | |
| #ifdef XP_WIN
 | |
| Atomic<int32_t> gUseDOSDevicePathSyntax(-1);
 | |
| #endif
 | |
| 
 | |
| LazyLogModule gLogger("QuotaManager");
 | |
| 
 | |
| void AnonymizeCString(nsACString& aCString, uint32_t aStart) {
 | |
|   MOZ_ASSERT(!aCString.IsEmpty());
 | |
|   MOZ_ASSERT(aStart < aCString.Length());
 | |
| 
 | |
|   char* iter = aCString.BeginWriting() + aStart;
 | |
|   char* end = aCString.EndWriting();
 | |
| 
 | |
|   while (iter != end) {
 | |
|     char c = *iter;
 | |
| 
 | |
|     if (IsAsciiAlpha(c)) {
 | |
|       *iter = 'a';
 | |
|     } else if (IsAsciiDigit(c)) {
 | |
|       *iter = 'D';
 | |
|     }
 | |
| 
 | |
|     ++iter;
 | |
|   }
 | |
| }
 | |
| 
 | |
| }  // namespace
 | |
| 
 | |
| const char kQuotaGenericDelimiter = '|';
 | |
| 
 | |
| #ifdef NIGHTLY_BUILD
 | |
| const nsLiteralCString kQuotaInternalError = "internal"_ns;
 | |
| const nsLiteralCString kQuotaExternalError = "external"_ns;
 | |
| #endif
 | |
| 
 | |
| LogModule* GetQuotaManagerLogger() { return gLogger; }
 | |
| 
 | |
| void AnonymizeCString(nsACString& aCString) {
 | |
|   if (aCString.IsEmpty()) {
 | |
|     return;
 | |
|   }
 | |
|   AnonymizeCString(aCString, /* aStart */ 0);
 | |
| }
 | |
| 
 | |
| void AnonymizeOriginString(nsACString& aOriginString) {
 | |
|   if (aOriginString.IsEmpty()) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   int32_t start = aOriginString.FindChar(':');
 | |
|   if (start < 0) {
 | |
|     start = 0;
 | |
|   }
 | |
| 
 | |
|   AnonymizeCString(aOriginString, start);
 | |
| }
 | |
| 
 | |
| #ifdef XP_WIN
 | |
| void CacheUseDOSDevicePathSyntaxPrefValue() {
 | |
|   MOZ_ASSERT(XRE_IsParentProcess());
 | |
|   AssertIsOnBackgroundThread();
 | |
| 
 | |
|   if (gUseDOSDevicePathSyntax == -1) {
 | |
|     bool useDOSDevicePathSyntax =
 | |
|         StaticPrefs::dom_quotaManager_useDOSDevicePathSyntax_DoNotUseDirectly();
 | |
|     gUseDOSDevicePathSyntax = useDOSDevicePathSyntax ? 1 : 0;
 | |
|   }
 | |
| }
 | |
| #endif
 | |
| 
 | |
| Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) {
 | |
|   nsCOMPtr<nsIFile> file;
 | |
|   nsresult rv =
 | |
|       NS_NewLocalFile(aPath, /* aFollowLinks */ false, getter_AddRefs(file));
 | |
|   if (NS_WARN_IF(NS_FAILED(rv))) {
 | |
|     QM_WARNING("Failed to construct a file for path (%s)",
 | |
|                NS_ConvertUTF16toUTF8(aPath).get());
 | |
|     return Err(rv);
 | |
|   }
 | |
| 
 | |
| #ifdef XP_WIN
 | |
|   MOZ_ASSERT(gUseDOSDevicePathSyntax != -1);
 | |
| 
 | |
|   if (gUseDOSDevicePathSyntax) {
 | |
|     nsCOMPtr<nsILocalFileWin> winFile = do_QueryInterface(file, &rv);
 | |
|     if (NS_WARN_IF(NS_FAILED(rv))) {
 | |
|       return Err(rv);
 | |
|     }
 | |
| 
 | |
|     MOZ_ASSERT(winFile);
 | |
|     winFile->SetUseDOSDevicePathSyntax(true);
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   return file;
 | |
| }
 | |
| 
 | |
| #ifdef DEBUG
 | |
| Result<bool, nsresult> WarnIfFileIsUnknown(nsIFile& aFile,
 | |
|                                            const char* aSourceFile,
 | |
|                                            const int32_t aSourceLine) {
 | |
|   nsString leafName;
 | |
|   nsresult rv = aFile.GetLeafName(leafName);
 | |
|   if (NS_WARN_IF(NS_FAILED(rv))) {
 | |
|     return Err(rv);
 | |
|   }
 | |
| 
 | |
|   bool isDirectory;
 | |
|   rv = aFile.IsDirectory(&isDirectory);
 | |
|   if (NS_WARN_IF(NS_FAILED(rv))) {
 | |
|     return Err(rv);
 | |
|   }
 | |
| 
 | |
|   if (!isDirectory) {
 | |
|     // Don't warn about OS metadata files. These files are only used in
 | |
|     // different platforms, but the profile can be shared across different
 | |
|     // operating systems, so we check it on all platforms.
 | |
|     if (leafName.Equals(kDSStoreFileName) ||
 | |
|         leafName.Equals(kDesktopFileName) ||
 | |
|         leafName.Equals(kDesktopIniFileName,
 | |
|                         nsCaseInsensitiveStringComparator) ||
 | |
|         leafName.Equals(kThumbsDbFileName, nsCaseInsensitiveStringComparator)) {
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     // Don't warn about files starting with ".".
 | |
|     if (leafName.First() == char16_t('.')) {
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   NS_DebugBreak(
 | |
|       NS_DEBUG_WARNING,
 | |
|       nsPrintfCString("Something (%s) in the directory that doesn't belong!",
 | |
|                       NS_ConvertUTF16toUTF8(leafName).get())
 | |
|           .get(),
 | |
|       nullptr, aSourceFile, aSourceLine);
 | |
| 
 | |
|   return true;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| }  // namespace quota
 | |
| }  // namespace dom
 | |
| }  // namespace mozilla
 | 
