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
16class WebDatabase;
17
18namespace base {
19class Time;
20}
21
22namespace autofill {
23
24class AutofillChange;
25class AutofillEntry;
26class AutofillProfile;
27class AutofillTableTest;
28class CreditCard;
29
30struct 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//
128class 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