• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
6 #define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
7 
8 #include <vector>
9 
10 #include "base/compiler_specific.h"
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_vector.h"
13 #include "base/strings/string16.h"
14 #include "components/webdata/common/web_database_table.h"
15 
16 class WebDatabase;
17 
18 namespace base {
19 class Time;
20 }
21 
22 namespace autofill {
23 
24 class AutofillChange;
25 class AutofillEntry;
26 class AutofillProfile;
27 class AutofillTableTest;
28 class CreditCard;
29 
30 struct FormFieldData;
31 
32 // This class manages the various Autofill tables within the SQLite database
33 // passed to the constructor. It expects the following schemas:
34 //
35 // Note: The database stores time in seconds, UTC.
36 //
37 // autofill
38 //   name               The name of the input as specified in the html.
39 //   value              The literal contents of the text field.
40 //   value_lower        The contents of the text field made lower_case.
41 //   date_created       The date on which the user first entered the string
42 //                      |value| into a field of name |name|.
43 //   date_last_used     The date on which the user last entered the string
44 //                      |value| into a field of name |name|.
45 //   count              How many times the user has entered the string |value|
46 //                      in a field of name |name|.
47 //
48 // autofill_profiles    This table contains Autofill profile data added by the
49 //                      user with the Autofill dialog.  Most of the columns are
50 //                      standard entries in a contact information form.
51 //
52 //   guid               A guid string to uniquely identify the profile.
53 //                      Added in version 31.
54 //   company_name
55 //   street_address     The combined lines of the street address.
56 //                      Added in version 54.
57 //   dependent_locality
58 //                      A sub-classification beneath the city, e.g. an
59 //                      inner-city district or suburb.  Added in version 54.
60 //   city
61 //   state
62 //   zipcode
63 //   sorting_code       Similar to the zipcode column, but used for businesses
64 //                      or organizations that might not be geographically
65 //                      contiguous.  The canonical example is CEDEX in France.
66 //                      Added in version 54.
67 //   country_code
68 //   date_modified      The date on which this profile was last modified.
69 //                      Added in version 30.
70 //   origin             The domain of origin for this profile.
71 //                      Added in version 50.
72 //   language_code      The BCP 47 language code used to format the address for
73 //                      display. For example, a JP address with "ja" language
74 //                      code starts with the postal code, but a JP address with
75 //                      "ja-latn" language code starts with the recipient name.
76 //                      Added in version 56.
77 //
78 // autofill_profile_names
79 //                      This table contains the multi-valued name fields
80 //                      associated with a profile.
81 //
82 //   guid               The guid string that identifies the profile to which
83 //                      the name belongs.
84 //   first_name
85 //   middle_name
86 //   last_name
87 //   full_name
88 //
89 // autofill_profile_emails
90 //                      This table contains the multi-valued email fields
91 //                      associated with a profile.
92 //
93 //   guid               The guid string that identifies the profile to which
94 //                      the email belongs.
95 //   email
96 //
97 // autofill_profile_phones
98 //                      This table contains the multi-valued phone fields
99 //                      associated with a profile.
100 //
101 //   guid               The guid string that identifies the profile to which the
102 //                      phone number belongs.
103 //   number
104 //
105 // autofill_profiles_trash
106 //                      This table contains guids of "trashed" autofill
107 //                      profiles.  When a profile is removed its guid is added
108 //                      to this table so that Sync can perform deferred removal.
109 //
110 //   guid               The guid string that identifies the trashed profile.
111 //
112 // credit_cards         This table contains credit card data added by the user
113 //                      with the Autofill dialog.  Most of the columns are
114 //                      standard entries in a credit card form.
115 //
116 //   guid               A guid string to uniquely identify the profile.
117 //                      Added in version 31.
118 //   name_on_card
119 //   expiration_month
120 //   expiration_year
121 //   card_number_encrypted
122 //                      Stores encrypted credit card number.
123 //   date_modified      The date on which this entry was last modified.
124 //                      Added in version 30.
125 //   origin             The domain of origin for this profile.
126 //                      Added in version 50.
127 //
128 class AutofillTable : public WebDatabaseTable {
129  public:
130   explicit AutofillTable(const std::string& app_locale);
131   virtual ~AutofillTable();
132 
133   // Retrieves the AutofillTable* owned by |database|.
134   static AutofillTable* FromWebDatabase(WebDatabase* db);
135 
136   virtual WebDatabaseTable::TypeKey GetTypeKey() const OVERRIDE;
137   virtual bool CreateTablesIfNecessary() OVERRIDE;
138   virtual bool IsSyncable() OVERRIDE;
139   virtual bool MigrateToVersion(int version,
140                                 bool* update_compatible_version) OVERRIDE;
141 
142   // Records the form elements in |elements| in the database in the
143   // autofill table.  A list of all added and updated autofill entries
144   // is returned in the changes out parameter.
145   bool AddFormFieldValues(const std::vector<FormFieldData>& elements,
146                           std::vector<AutofillChange>* changes);
147 
148   // Records a single form element in the database in the autofill table. A list
149   // of all added and updated autofill entries is returned in the changes out
150   // parameter.
151   bool AddFormFieldValue(const FormFieldData& element,
152                          std::vector<AutofillChange>* changes);
153 
154   // Retrieves a vector of all values which have been recorded in the autofill
155   // table as the value in a form element with name |name| and which start with
156   // |prefix|.  The comparison of the prefix is case insensitive.
157   bool GetFormValuesForElementName(const base::string16& name,
158                                    const base::string16& prefix,
159                                    std::vector<base::string16>* values,
160                                    int limit);
161 
162   // Returns whether any form elements are stored in the database.
163   bool HasFormElements();
164 
165   // Removes rows from the autofill table if they were created on or after
166   // |delete_begin| and last used strictly before |delete_end|.  For rows where
167   // the time range [date_created, date_last_used] overlaps with [delete_begin,
168   // delete_end), but is not entirely contained within the latter range, updates
169   // the rows so that their resulting time range [new_date_created,
170   // new_date_last_used] lies entirely outside of [delete_begin, delete_end),
171   // updating the count accordingly.  A list of all changed keys and whether
172   // each was updater or removed is returned in the changes out parameter.
173   bool RemoveFormElementsAddedBetween(const base::Time& delete_begin,
174                                       const base::Time& delete_end,
175                                       std::vector<AutofillChange>* changes);
176 
177   // Removes rows from the autofill table if they were last accessed strictly
178   // before |AutofillEntry::ExpirationTime()|.
179   bool RemoveExpiredFormElements(std::vector<AutofillChange>* changes);
180 
181   // Removes the row from the autofill table for the given |name| |value| pair.
182   virtual bool RemoveFormElement(const base::string16& name,
183                                  const base::string16& value);
184 
185   // Retrieves all of the entries in the autofill table.
186   virtual bool GetAllAutofillEntries(std::vector<AutofillEntry>* entries);
187 
188   // Retrieves a single entry from the autofill table.
189   virtual bool GetAutofillTimestamps(const base::string16& name,
190                                      const base::string16& value,
191                                      base::Time* date_created,
192                                      base::Time* date_last_used);
193 
194   // Replaces existing autofill entries with the entries supplied in
195   // the argument.  If the entry does not already exist, it will be
196   // added.
197   virtual bool UpdateAutofillEntries(const std::vector<AutofillEntry>& entries);
198 
199   // Records a single Autofill profile in the autofill_profiles table.
200   virtual bool AddAutofillProfile(const AutofillProfile& profile);
201 
202   // Updates the database values for the specified profile.  Mulit-value aware.
203   virtual bool UpdateAutofillProfile(const AutofillProfile& profile);
204 
205   // Removes a row from the autofill_profiles table.  |guid| is the identifier
206   // of the profile to remove.
207   virtual bool RemoveAutofillProfile(const std::string& guid);
208 
209   // Retrieves a profile with guid |guid|.  The caller owns |profile|.
210   bool GetAutofillProfile(const std::string& guid, AutofillProfile** profile);
211 
212   // Retrieves all profiles in the database.  Caller owns the returned profiles.
213   virtual bool GetAutofillProfiles(std::vector<AutofillProfile*>* profiles);
214 
215   // Records a single credit card in the credit_cards table.
216   bool AddCreditCard(const CreditCard& credit_card);
217 
218   // Updates the database values for the specified credit card.
219   bool UpdateCreditCard(const CreditCard& credit_card);
220 
221   // Removes a row from the credit_cards table.  |guid| is the identifer  of the
222   // credit card to remove.
223   bool RemoveCreditCard(const std::string& guid);
224 
225   // Retrieves a credit card with guid |guid|.  The caller owns
226   // |credit_card_id|.
227   bool GetCreditCard(const std::string& guid, CreditCard** credit_card);
228 
229   // Retrieves all credit cards in the database.  Caller owns the returned
230   // credit cards.
231   virtual bool GetCreditCards(std::vector<CreditCard*>* credit_cards);
232 
233   // Removes rows from autofill_profiles and credit_cards if they were created
234   // on or after |delete_begin| and strictly before |delete_end|.  Returns the
235   // list of deleted profile guids in |profile_guids|.  Return value is true if
236   // all rows were successfully removed.  Returns false on database error.  In
237   // that case, the output vector state is undefined, and may be partially
238   // filled.
239   bool RemoveAutofillDataModifiedBetween(
240       const base::Time& delete_begin,
241       const base::Time& delete_end,
242       std::vector<std::string>* profile_guids,
243       std::vector<std::string>* credit_card_guids);
244 
245   // Removes origin URLs from the autofill_profiles and credit_cards tables if
246   // they were written on or after |delete_begin| and strictly before
247   // |delete_end|.  Returns the list of modified profiles in |profiles|.  Return
248   // value is true if all rows were successfully updated.  Returns false on
249   // database error.  In that case, the output vector state is undefined, and
250   // may be partially filled.
251   bool RemoveOriginURLsModifiedBetween(
252       const base::Time& delete_begin,
253       const base::Time& delete_end,
254       ScopedVector<AutofillProfile>* profiles);
255 
256   // Retrieves all profiles in the database that have been deleted since last
257   // "empty" of the trash.
258   bool GetAutofillProfilesInTrash(std::vector<std::string>* guids);
259 
260   // Empties the Autofill profiles "trash can".
261   bool EmptyAutofillProfilesTrash();
262 
263   // Retrieves all profiles in the database that have been deleted since last
264   // "empty" of the trash.
265   bool AddAutofillGUIDToTrash(const std::string& guid);
266 
267   // Clear all profiles.
268   bool ClearAutofillProfiles();
269 
270   // Table migration functions.
271   // Removes empty values for autofill that were incorrectly stored in the DB
272   // See bug http://crbug.com/6111
273   bool MigrateToVersion22ClearAutofillEmptyValueElements();
274   bool MigrateToVersion23AddCardNumberEncryptedColumn();
275   bool MigrateToVersion24CleanupOversizedStringFields();
276   bool MigrateToVersion27UpdateLegacyCreditCards();
277   bool MigrateToVersion30AddDateModifed();
278   bool MigrateToVersion31AddGUIDToCreditCardsAndProfiles();
279   bool MigrateToVersion32UpdateProfilesAndCreditCards();
280   bool MigrateToVersion33ProfilesBasedOnFirstName();
281   bool MigrateToVersion34ProfilesBasedOnCountryCode();
282   bool MigrateToVersion35GreatBritainCountryCodes();
283   bool MigrateToVersion37MergeAndCullOlderProfiles();
284   bool MigrateToVersion51AddOriginColumn();
285   bool MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields();
286   bool MigrateToVersion55MergeAutofillDatesTable();
287   bool MigrateToVersion56AddProfileLanguageCodeForFormatting();
288   bool MigrateToVersion57AddFullNameField();
289 
290   // Max data length saved in the table;
291   static const size_t kMaxDataLength;
292 
293  private:
294   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill);
295   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddChanges);
296   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_RemoveBetweenChanges);
297   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_UpdateDontReplace);
298   FRIEND_TEST_ALL_PREFIXES(
299       AutofillTableTest,
300       Autofill_RemoveFormElementsAddedBetween_UsedOnlyBefore);
301   FRIEND_TEST_ALL_PREFIXES(
302       AutofillTableTest,
303       Autofill_RemoveFormElementsAddedBetween_UsedOnlyAfter);
304   FRIEND_TEST_ALL_PREFIXES(
305       AutofillTableTest,
306       Autofill_RemoveFormElementsAddedBetween_UsedOnlyDuring);
307   FRIEND_TEST_ALL_PREFIXES(
308       AutofillTableTest,
309       Autofill_RemoveFormElementsAddedBetween_UsedBeforeAndDuring);
310   FRIEND_TEST_ALL_PREFIXES(
311       AutofillTableTest,
312       Autofill_RemoveFormElementsAddedBetween_UsedDuringAndAfter);
313   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddFormFieldValues);
314   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfile);
315   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateAutofillProfile);
316   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrash);
317   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrashInteraction);
318   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
319                            RemoveAutofillDataModifiedBetween);
320   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, CreditCard);
321   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateCreditCard);
322   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
323                            Autofill_GetAllAutofillEntries_OneResult);
324   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
325                            Autofill_GetAllAutofillEntries_TwoDistinct);
326   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
327                            Autofill_GetAllAutofillEntries_TwoSame);
328 
329   // Methods for adding autofill entries at a specified time.  For
330   // testing only.
331   bool AddFormFieldValuesTime(
332       const std::vector<FormFieldData>& elements,
333       std::vector<AutofillChange>* changes,
334       base::Time time);
335   bool AddFormFieldValueTime(const FormFieldData& element,
336                              std::vector<AutofillChange>* changes,
337                              base::Time time);
338 
339   // Insert a single AutofillEntry into the autofill table.
340   bool InsertAutofillEntry(const AutofillEntry& entry);
341 
342   // Checks if the trash is empty.
343   bool IsAutofillProfilesTrashEmpty();
344 
345   // Checks if the guid is in the trash.
346   bool IsAutofillGUIDInTrash(const std::string& guid);
347 
348   bool InitMainTable();
349   bool InitCreditCardsTable();
350   bool InitDatesTable();
351   bool InitProfilesTable();
352   bool InitProfileNamesTable();
353   bool InitProfileEmailsTable();
354   bool InitProfilePhonesTable();
355   bool InitProfileTrashTable();
356 
357   // The application locale.  The locale is needed for the migration to version
358   // 35. Since it must be read on the UI thread, it is set when the table is
359   // created (on the UI thread), and cached here so that it can be used for
360   // migrations (on the DB thread).
361   std::string app_locale_;
362 
363   DISALLOW_COPY_AND_ASSIGN(AutofillTable);
364 };
365 
366 }  // namespace autofill
367 
368 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
369