LookupCacheV4::Has implements safebrowsing v4 caching logic. 1. Check if fullhash match any prefix in local database: - If not, the URL is safe. 2. Check if prefix is in the cache(prefix is always the first 4-byte of the fullhash, Bug 1323953): - If not, send fullhash request 3. Check if fullhash is in the positive cache: - If fullhash is found and it is not expired, the URL is not safe. - If fullhash is found and it is expired, send fullhash request. 4. If fullhash is not found, check negative cache expired time: - If negative cache time is not expired, the URL is safe. - If negative cache time is expired, send fullhash request. MozReview-Commit-ID: GRX7CP8ig49
82 lines
2.4 KiB
C++
82 lines
2.4 KiB
C++
/* 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 "LookupCacheV4.h"
|
|
#include "Common.h"
|
|
|
|
#define GTEST_SAFEBROWSING_DIR NS_LITERAL_CSTRING("safebrowsing")
|
|
#define GTEST_TABLE NS_LITERAL_CSTRING("gtest-malware-proto")
|
|
|
|
typedef nsCString _Fragment;
|
|
typedef nsTArray<nsCString> _PrefixArray;
|
|
|
|
static UniquePtr<LookupCacheV4>
|
|
SetupLookupCacheV4(const _PrefixArray& prefixArray)
|
|
{
|
|
nsCOMPtr<nsIFile> file;
|
|
NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(file));
|
|
|
|
file->AppendNative(GTEST_SAFEBROWSING_DIR);
|
|
|
|
UniquePtr<LookupCacheV4> cache = MakeUnique<LookupCacheV4>(GTEST_TABLE, EmptyCString(), file);
|
|
nsresult rv = cache->Init();
|
|
EXPECT_EQ(rv, NS_OK);
|
|
|
|
PrefixStringMap map;
|
|
PrefixArrayToPrefixStringMap(prefixArray, map);
|
|
rv = cache->Build(map);
|
|
EXPECT_EQ(rv, NS_OK);
|
|
|
|
return Move(cache);
|
|
}
|
|
|
|
void
|
|
TestHasPrefix(const _Fragment& aFragment, bool aExpectedHas, bool aExpectedComplete)
|
|
{
|
|
_PrefixArray array = { GeneratePrefix(_Fragment("bravo.com/"), 32),
|
|
GeneratePrefix(_Fragment("browsing.com/"), 8),
|
|
GeneratePrefix(_Fragment("gound.com/"), 5),
|
|
GeneratePrefix(_Fragment("small.com/"), 4)
|
|
};
|
|
|
|
RunTestInNewThread([&] () -> void {
|
|
UniquePtr<LookupCache> cache = SetupLookupCacheV4(array);
|
|
|
|
Completion lookupHash;
|
|
nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
|
|
lookupHash.FromPlaintext(aFragment, cryptoHash);
|
|
|
|
bool has, confirmed, fromCache;
|
|
uint32_t matchLength;
|
|
// Freshness is not used in V4 so we just put dummy values here.
|
|
TableFreshnessMap dummy;
|
|
nsresult rv = cache->Has(lookupHash, dummy, 0,
|
|
&has, &matchLength, &confirmed, &fromCache);
|
|
|
|
EXPECT_EQ(rv, NS_OK);
|
|
EXPECT_EQ(has, aExpectedHas);
|
|
EXPECT_EQ(matchLength == COMPLETE_SIZE, aExpectedComplete);
|
|
EXPECT_EQ(confirmed, false);
|
|
EXPECT_EQ(fromCache, false);
|
|
|
|
cache->ClearAll();
|
|
});
|
|
|
|
}
|
|
|
|
TEST(LookupCacheV4, HasComplete)
|
|
{
|
|
TestHasPrefix(_Fragment("bravo.com/"), true, true);
|
|
}
|
|
|
|
TEST(LookupCacheV4, HasPrefix)
|
|
{
|
|
TestHasPrefix(_Fragment("browsing.com/"), true, false);
|
|
}
|
|
|
|
TEST(LookupCacheV4, Nomatch)
|
|
{
|
|
TestHasPrefix(_Fragment("nomatch.com/"), false, false);
|
|
}
|