/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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/. */ #ifndef mozilla_net_CookiePersistentStorage_h #define mozilla_net_CookiePersistentStorage_h #include "CookieStorage.h" #include "mozilla/Atomics.h" #include "mozilla/Monitor.h" #include "mozilla/net/NeckoChannelParams.h" #include "mozIStorageBindingParamsArray.h" #include "mozIStorageCompletionCallback.h" #include "mozIStorageStatement.h" #include "mozIStorageStatementCallback.h" class mozIStorageAsyncStatement; class mozIStorageService; class nsICookieTransactionCallback; class nsIEffectiveTLDService; namespace mozilla { namespace net { class CookiePersistentStorage final : public CookieStorage { public: // Result codes for TryInitDB() and Read(). enum OpenDBResult { RESULT_OK, RESULT_RETRY, RESULT_FAILURE }; static already_AddRefed Create(); void HandleCorruptDB(); void RemoveCookiesWithOriginAttributes( const OriginAttributesPattern& aPattern, const nsACString& aBaseDomain) override; void RemoveCookiesFromExactHost( const nsACString& aHost, const nsACString& aBaseDomain, const OriginAttributesPattern& aPattern) override; void StaleCookies(const nsTArray& aCookieList, int64_t aCurrentTimeInUsec) override; void Close() override; void EnsureReadComplete(); void CleanupCachedStatements(); void CleanupDBConnection(); void Activate(); void RebuildCorruptDB(); void HandleDBClosed(); nsresult RunInTransaction(nsICookieTransactionCallback* aCallback); // State of the database connection. enum CorruptFlag { OK, // normal CLOSING_FOR_REBUILD, // corruption detected, connection closing REBUILDING // close complete, rebuilding database from memory }; CorruptFlag GetCorruptFlag() const { return mCorruptFlag; } void SetCorruptFlag(CorruptFlag aFlag) { mCorruptFlag = aFlag; } protected: const char* NotificationTopic() const override { return "cookie-changed"; } void NotifyChangedInternal(nsISupports* aSubject, const char16_t* aData, bool aOldCOokieIsSession) override; void RemoveAllInternal() override; void RemoveCookieFromDB(const CookieListIter& aIter) override; void StoreCookie(const nsACString& aBaseDomain, const OriginAttributes& aOriginAttributes, Cookie* aCookie) override; private: CookiePersistentStorage(); static void UpdateCookieInList(Cookie* aCookie, int64_t aLastAccessed, mozIStorageBindingParamsArray* aParamsArray); void PrepareCookieRemoval(const CookieListIter& aIter, mozIStorageBindingParamsArray* aParamsArray); void InitDBConn(); nsresult InitDBConnInternal(); OpenDBResult TryInitDB(bool aRecreateDB); OpenDBResult Read(); nsresult CreateTableWorker(const char* aName); nsresult CreateTable(); nsresult CreateTableForSchemaVersion6(); nsresult CreateTableForSchemaVersion5(); static UniquePtr GetCookieFromRow(mozIStorageStatement* aRow); already_AddRefed PurgeCookies(int64_t aCurrentTimeInUsec, uint16_t aMaxNumberOfCookies, int64_t aCookiePurgeAge) override; void DeleteFromDB(mozIStorageBindingParamsArray* aParamsArray); void MaybeStoreCookiesToDB(mozIStorageBindingParamsArray* aParamsArray); nsCOMPtr mThread; nsCOMPtr mStorageService; nsCOMPtr mTLDService; // encapsulates a (key, Cookie) tuple for temporary storage purposes. struct CookieDomainTuple { CookieKey key; OriginAttributes originAttributes; UniquePtr cookie; }; // thread TimeStamp mEndInitDBConn; nsTArray mReadArray; Monitor mMonitor; Atomic mInitialized; Atomic mInitializedDBConn; nsCOMPtr mCookieFile; nsCOMPtr mDBConn; nsCOMPtr mStmtInsert; nsCOMPtr mStmtDelete; nsCOMPtr mStmtUpdate; CorruptFlag mCorruptFlag; // Various parts representing asynchronous read state. These are useful // while the background read is taking place. nsCOMPtr mSyncConn; // DB completion handlers. nsCOMPtr mInsertListener; nsCOMPtr mUpdateListener; nsCOMPtr mRemoveListener; nsCOMPtr mCloseListener; }; } // namespace net } // namespace mozilla #endif // mozilla_net_CookiePersistentStorage_h