tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DatabaseFileManager.h (4763B)


      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 #ifndef DOM_INDEXEDDB_DATABASEFILEMANAGER_H_
      8 #define DOM_INDEXEDDB_DATABASEFILEMANAGER_H_
      9 
     10 #include "FileInfoManager.h"
     11 #include "IndexedDBCipherKeyManager.h"
     12 #include "mozilla/InitializedOnce.h"
     13 #include "mozilla/dom/FlippedOnce.h"
     14 #include "mozilla/dom/quota/CommonMetadata.h"
     15 #include "mozilla/dom/quota/PersistenceType.h"
     16 #include "mozilla/dom/quota/UsageInfo.h"
     17 
     18 class nsIFile;
     19 class mozIStorageConnection;
     20 
     21 namespace mozilla::dom::indexedDB {
     22 
     23 // Implemented in ActorsParent.cpp.
     24 class DatabaseFileManager final
     25    : public FileInfoManager<DatabaseFileManager>,
     26      public AtomicSafeRefCounted<DatabaseFileManager> {
     27  using PersistenceType = mozilla::dom::quota::PersistenceType;
     28  using FileInfoManager<DatabaseFileManager>::MutexType;
     29 
     30  const PersistenceType mPersistenceType;
     31  const quota::OriginMetadata mOriginMetadata;
     32  const nsString mDatabaseName;
     33  const nsCString mDatabaseID;
     34  const nsString mDatabaseFilePath;
     35 
     36  RefPtr<IndexedDBCipherKeyManager> mCipherKeyManager;
     37 
     38  LazyInitializedOnce<const nsString> mDirectoryPath;
     39  LazyInitializedOnce<const nsString> mJournalDirectoryPath;
     40 
     41  uint64_t mDatabaseVersion;
     42 
     43  const bool mEnforcingQuota;
     44  const bool mIsInPrivateBrowsingMode;
     45 
     46  FlippedOnce<false> mInitialized;
     47 
     48  // Lock protecting DatabaseFileManager.mFileInfos.
     49  // It's s also used to atomically update DatabaseFileInfo.mRefCnt and
     50  // DatabaseFileInfo.mDBRefCnt
     51  static MutexType sMutex;
     52 
     53 public:
     54  [[nodiscard]] static nsCOMPtr<nsIFile> GetFileForId(nsIFile* aDirectory,
     55                                                      int64_t aId);
     56 
     57  [[nodiscard]] static nsCOMPtr<nsIFile> GetCheckedFileForId(
     58      nsIFile* aDirectory, int64_t aId);
     59 
     60  static nsresult InitDirectory(nsIFile& aDirectory, nsIFile& aDatabaseFile,
     61                                const nsACString& aOrigin,
     62                                uint32_t aTelemetryId);
     63 
     64  template <typename KnownDirEntryOp, typename UnknownDirEntryOp>
     65  static Result<Ok, nsresult> TraverseFiles(
     66      nsIFile& aDirectory, KnownDirEntryOp&& aKnownDirEntryOp,
     67      UnknownDirEntryOp&& aUnknownDirEntryOp);
     68 
     69  static Result<quota::FileUsageType, nsresult> GetUsage(nsIFile* aDirectory);
     70 
     71  DatabaseFileManager(PersistenceType aPersistenceType,
     72                      const quota::OriginMetadata& aOriginMetadata,
     73                      const nsAString& aDatabaseName,
     74                      const nsCString& aDatabaseID,
     75                      const nsAString& aDatabaseFilePath, bool aEnforcingQuota,
     76                      bool aIsInPrivateBrowsingMode);
     77 
     78  PersistenceType Type() const { return mPersistenceType; }
     79 
     80  const quota::OriginMetadata& OriginMetadata() const {
     81    return mOriginMetadata;
     82  }
     83 
     84  const nsACString& Origin() const { return mOriginMetadata.mOrigin; }
     85 
     86  const nsAString& DatabaseName() const { return mDatabaseName; }
     87 
     88  const nsCString& DatabaseID() const { return mDatabaseID; }
     89 
     90  const nsAString& DatabaseFilePath() const { return mDatabaseFilePath; }
     91 
     92  uint64_t DatabaseVersion() const;
     93 
     94  void UpdateDatabaseVersion(uint64_t aDatabaseVersion);
     95 
     96  IndexedDBCipherKeyManager& MutableCipherKeyManagerRef() const {
     97    MOZ_ASSERT(mIsInPrivateBrowsingMode);
     98    MOZ_ASSERT(mCipherKeyManager);
     99 
    100    return *mCipherKeyManager;
    101  }
    102 
    103  auto IsInPrivateBrowsingMode() const { return mIsInPrivateBrowsingMode; }
    104 
    105  bool EnforcingQuota() const { return mEnforcingQuota; }
    106 
    107  bool Initialized() const { return mInitialized; }
    108 
    109  nsresult Init(nsIFile* aDirectory, const uint64_t aDatabaseVersion,
    110                mozIStorageConnection& aConnection);
    111 
    112  [[nodiscard]] nsCOMPtr<nsIFile> GetDirectory();
    113 
    114  [[nodiscard]] nsCOMPtr<nsIFile> GetCheckedDirectory();
    115 
    116  [[nodiscard]] nsCOMPtr<nsIFile> GetJournalDirectory();
    117 
    118  [[nodiscard]] nsCOMPtr<nsIFile> EnsureJournalDirectory();
    119 
    120  [[nodiscard]] nsresult SyncDeleteFile(int64_t aId);
    121 
    122  // XXX When getting rid of FileHelper, this method should be removed/made
    123  // private.
    124  [[nodiscard]] nsresult SyncDeleteFile(nsIFile& aFile,
    125                                        nsIFile& aJournalFile) const;
    126 
    127  [[nodiscard]] nsresult AsyncDeleteFile(int64_t aFileId);
    128 
    129  nsresult Invalidate() override;
    130 
    131  MOZ_DECLARE_REFCOUNTED_TYPENAME(DatabaseFileManager)
    132 
    133  static StaticMutex& MutexInstance() MOZ_RETURN_CAPABILITY(sMutex) {
    134    return sMutex;
    135  }
    136 
    137  ~DatabaseFileManager() = default;
    138 };
    139 
    140 }  // namespace mozilla::dom::indexedDB
    141 
    142 #endif  // DOM_INDEXEDDB_DATABASEFILEMANAGER_H_