diff options
Diffstat (limited to 'toolkit/components/url-classifier/Classifier.h')
-rw-r--r-- | toolkit/components/url-classifier/Classifier.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/toolkit/components/url-classifier/Classifier.h b/toolkit/components/url-classifier/Classifier.h new file mode 100644 index 000000000..58c49fce5 --- /dev/null +++ b/toolkit/components/url-classifier/Classifier.h @@ -0,0 +1,167 @@ +//* -*- Mode: C++; tab-width: 8; 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 Classifier_h__ +#define Classifier_h__ + +#include "Entries.h" +#include "HashStore.h" +#include "ProtocolParser.h" +#include "LookupCache.h" +#include "nsCOMPtr.h" +#include "nsString.h" +#include "nsIFile.h" +#include "nsICryptoHash.h" +#include "nsDataHashtable.h" + +namespace mozilla { +namespace safebrowsing { + +/** + * Maintains the stores and LookupCaches for the url classifier. + */ +class Classifier { +public: + typedef nsClassHashtable<nsCStringHashKey, nsCString> ProviderDictType; + +public: + Classifier(); + ~Classifier(); + + nsresult Open(nsIFile& aCacheDirectory); + void Close(); + void Reset(); + + /** + * Clear data for specific tables. + * If ClearType is Clear_Cache, this function will only clear cache in lookup + * cache, otherwise, it will clear data in lookup cache and data stored on disk. + */ + enum ClearType { + Clear_Cache, + Clear_All, + }; + void ResetTables(ClearType aType, const nsTArray<nsCString>& aTables); + + /** + * Get the list of active tables and their chunks in a format + * suitable for an update request. + */ + void TableRequest(nsACString& aResult); + + /* + * Get all tables that we know about. + */ + nsresult ActiveTables(nsTArray<nsCString>& aTables); + + /** + * Check a URL against the specified tables. + */ + nsresult Check(const nsACString& aSpec, + const nsACString& tables, + uint32_t aFreshnessGuarantee, + LookupResultArray& aResults); + + /** + * Apply the table updates in the array. Takes ownership of + * the updates in the array and clears it. Wacky! + */ + nsresult ApplyUpdates(nsTArray<TableUpdate*>* aUpdates); + + /** + * Apply full hashes retrived from gethash to cache. + */ + nsresult ApplyFullHashes(nsTArray<TableUpdate*>* aUpdates); + + void SetLastUpdateTime(const nsACString& aTableName, uint64_t updateTime); + int64_t GetLastUpdateTime(const nsACString& aTableName); + nsresult CacheCompletions(const CacheResultArray& aResults); + uint32_t GetHashKey(void) { return mHashKey; } + /* + * Get a bunch of extra prefixes to query for completion + * and mask the real entry being requested + */ + nsresult ReadNoiseEntries(const Prefix& aPrefix, + const nsACString& aTableName, + uint32_t aCount, + PrefixArray* aNoiseEntries); + +#ifdef MOZ_SAFEBROWSING_DUMP_FAILED_UPDATES + nsresult DumpRawTableUpdates(const nsACString& aRawUpdates); +#endif + + static void SplitTables(const nsACString& str, nsTArray<nsCString>& tables); + + // Given a root store directory, return a private store directory + // based on the table name. To avoid migration issue, the private + // store directory is only different from root directory for V4 tables. + // + // For V4 tables (suffixed by '-proto'), the private directory would + // be [root directory path]/[provider]. The provider of V4 tables is + // 'google4'. + // + // Note that if the table name is not owned by any provider, just use + // the root directory. + static nsresult GetPrivateStoreDirectory(nsIFile* aRootStoreDirectory, + const nsACString& aTableName, + const nsACString& aProvider, + nsIFile** aPrivateStoreDirectory); + +private: + void DropStores(); + void DeleteTables(nsIFile* aDirectory, const nsTArray<nsCString>& aTables); + void AbortUpdateAndReset(const nsCString& aTable); + + nsresult CreateStoreDirectory(); + nsresult SetupPathNames(); + nsresult RecoverBackups(); + nsresult CleanToDelete(); + nsresult BackupTables(); + nsresult RemoveBackupTables(); + nsresult RegenActiveTables(); + +#ifdef MOZ_SAFEBROWSING_DUMP_FAILED_UPDATES + already_AddRefed<nsIFile> GetFailedUpdateDirectroy(); + nsresult DumpFailedUpdate(); +#endif + + nsresult ScanStoreDir(nsTArray<nsCString>& aTables); + + nsresult UpdateHashStore(nsTArray<TableUpdate*>* aUpdates, + const nsACString& aTable); + + nsresult UpdateTableV4(nsTArray<TableUpdate*>* aUpdates, + const nsACString& aTable); + + nsresult UpdateCache(TableUpdate* aUpdates); + + LookupCache *GetLookupCache(const nsACString& aTable); + + bool CheckValidUpdate(nsTArray<TableUpdate*>* aUpdates, + const nsACString& aTable); + + nsresult LoadMetadata(nsIFile* aDirectory, nsACString& aResult); + + nsCString GetProvider(const nsACString& aTableName); + + // Root dir of the Local profile. + nsCOMPtr<nsIFile> mCacheDirectory; + // Main directory where to store the databases. + nsCOMPtr<nsIFile> mRootStoreDirectory; + // Used for atomically updating the other dirs. + nsCOMPtr<nsIFile> mBackupDirectory; + nsCOMPtr<nsIFile> mToDeleteDirectory; + nsCOMPtr<nsICryptoHash> mCryptoHash; + nsTArray<LookupCache*> mLookupCaches; + nsTArray<nsCString> mActiveTablesCache; + uint32_t mHashKey; + // Stores the last time a given table was updated (seconds). + nsDataHashtable<nsCStringHashKey, int64_t> mTableFreshness; +}; + +} // namespace safebrowsing +} // namespace mozilla + +#endif |