|
1 //* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef LookupCache_h__ |
|
7 #define LookupCache_h__ |
|
8 |
|
9 #include "Entries.h" |
|
10 #include "nsString.h" |
|
11 #include "nsTArray.h" |
|
12 #include "nsAutoPtr.h" |
|
13 #include "nsCOMPtr.h" |
|
14 #include "nsIFile.h" |
|
15 #include "nsIFileStreams.h" |
|
16 #include "nsUrlClassifierPrefixSet.h" |
|
17 #include "prlog.h" |
|
18 |
|
19 namespace mozilla { |
|
20 namespace safebrowsing { |
|
21 |
|
22 #define MAX_HOST_COMPONENTS 5 |
|
23 #define MAX_PATH_COMPONENTS 4 |
|
24 |
|
25 class LookupResult { |
|
26 public: |
|
27 LookupResult() : mComplete(false), mNoise(false), mFresh(false), mProtocolConfirmed(false) {} |
|
28 |
|
29 // The fragment that matched in the LookupCache |
|
30 union { |
|
31 Prefix prefix; |
|
32 Completion complete; |
|
33 } hash; |
|
34 |
|
35 const Prefix &PrefixHash() { return hash.prefix; } |
|
36 const Completion &CompleteHash() { return hash.complete; } |
|
37 |
|
38 bool Confirmed() const { return (mComplete && mFresh) || mProtocolConfirmed; } |
|
39 bool Complete() const { return mComplete; } |
|
40 |
|
41 // True if we have a complete match for this hash in the table. |
|
42 bool mComplete; |
|
43 |
|
44 // True if this is a noise entry, i.e. an extra entry |
|
45 // that is inserted to mask the true URL we are requesting |
|
46 bool mNoise; |
|
47 |
|
48 // True if we've updated this table recently-enough. |
|
49 bool mFresh; |
|
50 |
|
51 bool mProtocolConfirmed; |
|
52 |
|
53 nsCString mTableName; |
|
54 }; |
|
55 |
|
56 typedef nsTArray<LookupResult> LookupResultArray; |
|
57 |
|
58 struct CacheResult { |
|
59 AddComplete entry; |
|
60 nsCString table; |
|
61 }; |
|
62 typedef nsTArray<CacheResult> CacheResultArray; |
|
63 |
|
64 class LookupCache { |
|
65 public: |
|
66 // Check for a canonicalized IP address. |
|
67 static bool IsCanonicalizedIP(const nsACString& aHost); |
|
68 |
|
69 // take a lookup string (www.hostname.com/path/to/resource.html) and |
|
70 // expand it into the set of fragments that should be searched for in an |
|
71 // entry |
|
72 static nsresult GetLookupFragments(const nsACString& aSpec, |
|
73 nsTArray<nsCString>* aFragments); |
|
74 // Similar to GetKey(), but if the domain contains three or more components, |
|
75 // two keys will be returned: |
|
76 // hostname.com/foo/bar -> [hostname.com] |
|
77 // mail.hostname.com/foo/bar -> [hostname.com, mail.hostname.com] |
|
78 // www.mail.hostname.com/foo/bar -> [hostname.com, mail.hostname.com] |
|
79 static nsresult GetHostKeys(const nsACString& aSpec, |
|
80 nsTArray<nsCString>* aHostKeys); |
|
81 // Get the database key for a given URI. This is the top three |
|
82 // domain components if they exist, otherwise the top two. |
|
83 // hostname.com/foo/bar -> hostname.com |
|
84 // mail.hostname.com/foo/bar -> mail.hostname.com |
|
85 // www.mail.hostname.com/foo/bar -> mail.hostname.com |
|
86 static nsresult GetKey(const nsACString& aSpec, Completion* aHash, |
|
87 nsCOMPtr<nsICryptoHash>& aCryptoHash); |
|
88 |
|
89 LookupCache(const nsACString& aTableName, nsIFile* aStoreFile); |
|
90 ~LookupCache(); |
|
91 |
|
92 const nsCString &TableName() const { return mTableName; } |
|
93 |
|
94 nsresult Init(); |
|
95 nsresult Open(); |
|
96 // The directory handle where we operate will |
|
97 // be moved away when a backup is made. |
|
98 nsresult UpdateDirHandle(nsIFile* aStoreDirectory); |
|
99 // This will Clear() the passed arrays when done. |
|
100 nsresult Build(AddPrefixArray& aAddPrefixes, |
|
101 AddCompleteArray& aAddCompletes); |
|
102 nsresult GetPrefixes(nsTArray<uint32_t>* aAddPrefixes); |
|
103 void ClearCompleteCache(); |
|
104 |
|
105 #if DEBUG && defined(PR_LOGGING) |
|
106 void Dump(); |
|
107 #endif |
|
108 nsresult WriteFile(); |
|
109 nsresult Has(const Completion& aCompletion, |
|
110 bool* aHas, bool* aComplete); |
|
111 bool IsPrimed(); |
|
112 |
|
113 private: |
|
114 void ClearAll(); |
|
115 nsresult Reset(); |
|
116 void UpdateHeader(); |
|
117 nsresult ReadHeader(nsIInputStream* aInputStream); |
|
118 nsresult ReadCompletions(nsIInputStream* aInputStream); |
|
119 nsresult EnsureSizeConsistent(); |
|
120 nsresult LoadPrefixSet(); |
|
121 // Construct a Prefix Set with known prefixes. |
|
122 // This will Clear() aAddPrefixes when done. |
|
123 nsresult ConstructPrefixSet(AddPrefixArray& aAddPrefixes); |
|
124 |
|
125 struct Header { |
|
126 uint32_t magic; |
|
127 uint32_t version; |
|
128 uint32_t numCompletions; |
|
129 }; |
|
130 Header mHeader; |
|
131 |
|
132 bool mPrimed; |
|
133 nsCString mTableName; |
|
134 nsCOMPtr<nsIFile> mStoreDirectory; |
|
135 CompletionArray mCompletions; |
|
136 // Set of prefixes known to be in the database |
|
137 nsRefPtr<nsUrlClassifierPrefixSet> mPrefixSet; |
|
138 }; |
|
139 |
|
140 } |
|
141 } |
|
142 |
|
143 #endif |