Home | History | Annotate | Download | only in webdata
      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 //   pair_id             An ID number unique to the row in the table.
     42 //   count               How many times the user has entered the string |value|
     43 //                       in a field of name |name|.
     44 //
     45 // autofill_dates        This table associates a row to each separate time the
     46 //                       user submits a form containing a certain name/value
     47 //                       pair.  The |pair_id| should match the |pair_id| field
     48 //                       in the appropriate row of the autofill table.
     49 //   pair_id
     50 //   date_created
     51 //
     52 // autofill_profiles    This table contains Autofill profile data added by the
     53 //                      user with the Autofill dialog.  Most of the columns are
     54 //                      standard entries in a contact information form.
     55 //
     56 //   guid               A guid string to uniquely identify the profile.
     57 //                      Added in version 31.
     58 //   company_name
     59 //   address_line_1
     60 //   address_line_2
     61 //   city
     62 //   state
     63 //   zipcode
     64 //   country            The country name.  Deprecated, should be removed once
     65 //                      the stable channel reaches version 11.
     66 //   country_code
     67 //   date_modified      The date on which this profile was last modified.
     68 //                      Added in version 30.
     69 //   origin             The domain of origin for this profile.
     70 //                      Added in version 50.
     71 //
     72 // autofill_profile_names
     73 //                      This table contains the multi-valued name fields
     74 //                      associated with a profile.
     75 //
     76 //   guid               The guid string that identifies the profile to which
     77 //                      the name belongs.
     78 //   first_name
     79 //   middle_name
     80 //   last_name
     81 //
     82 // autofill_profile_emails
     83 //                      This table contains the multi-valued email fields
     84 //                      associated with a profile.
     85 //
     86 //   guid               The guid string that identifies the profile to which
     87 //                      the email belongs.
     88 //   email
     89 //
     90 // autofill_profile_phones
     91 //                      This table contains the multi-valued phone fields
     92 //                      associated with a profile.
     93 //
     94 //   guid               The guid string that identifies the profile to which
     95 //                      the phone number belongs.
     96 //   type               An integer constant designating either phone type of the
     97 //                      number.
     98 //                      TODO(jhawkins): Remove the type column and migrate the
     99 //                      database.
    100 //   number
    101 //
    102 // autofill_profiles_trash
    103 //                      This table contains guids of "trashed" autofill
    104 //                      profiles.  When a profile is removed its guid is added
    105 //                      to this table so that Sync can perform deferred removal.
    106 //
    107 //   guid               The guid string that identifies the trashed profile.
    108 //
    109 // credit_cards         This table contains credit card data added by the user
    110 //                      with the Autofill dialog.  Most of the columns are
    111 //                      standard entries in a credit card form.
    112 //
    113 //   guid               A guid string to uniquely identify the profile.
    114 //                      Added in version 31.
    115 //   name_on_card
    116 //   expiration_month
    117 //   expiration_year
    118 //   card_number_encrypted Stores encrypted credit card number.
    119 //   date_modified      The date on which this entry was last modified.
    120 //                      Added in version 30.
    121 //   origin             The domain of origin for this profile.
    122 //                      Added in version 50.
    123 //
    124 class AutofillTable : public WebDatabaseTable {
    125  public:
    126   explicit AutofillTable(const std::string& app_locale);
    127   virtual ~AutofillTable();
    128 
    129   // Retrieves the AutofillTable* owned by |database|.
    130   static AutofillTable* FromWebDatabase(WebDatabase* db);
    131 
    132   virtual WebDatabaseTable::TypeKey GetTypeKey() const OVERRIDE;
    133   virtual bool Init(sql::Connection* db, sql::MetaTable* meta_table) OVERRIDE;
    134   virtual bool IsSyncable() OVERRIDE;
    135   virtual bool MigrateToVersion(int version,
    136                                 bool* update_compatible_version) OVERRIDE;
    137 
    138   // Records the form elements in |elements| in the database in the
    139   // autofill table.  A list of all added and updated autofill entries
    140   // is returned in the changes out parameter.
    141   bool AddFormFieldValues(const std::vector<FormFieldData>& elements,
    142                           std::vector<AutofillChange>* changes);
    143 
    144   // Records a single form element in the database in the autofill table. A list
    145   // of all added and updated autofill entries is returned in the changes out
    146   // parameter.
    147   bool AddFormFieldValue(const FormFieldData& element,
    148                          std::vector<AutofillChange>* changes);
    149 
    150   // Retrieves a vector of all values which have been recorded in the autofill
    151   // table as the value in a form element with name |name| and which start with
    152   // |prefix|.  The comparison of the prefix is case insensitive.
    153   bool GetFormValuesForElementName(const base::string16& name,
    154                                    const base::string16& prefix,
    155                                    std::vector<base::string16>* values,
    156                                    int limit);
    157 
    158   // Returns whether any form elements are stored in the database.
    159   bool HasFormElements();
    160 
    161   // Removes rows from autofill_dates if they were created on or after
    162   // |delete_begin| and strictly before |delete_end|.  Decrements the
    163   // count of the corresponding rows in the autofill table, and
    164   // removes those rows if the count goes to 0.  A list of all changed
    165   // keys and whether each was updater or removed is returned in the
    166   // changes out parameter.
    167   bool RemoveFormElementsAddedBetween(const base::Time& delete_begin,
    168                                       const base::Time& delete_end,
    169                                       std::vector<AutofillChange>* changes);
    170 
    171   // Removes rows from autofill_dates if they were accessed strictly before
    172   // |AutofillEntry::ExpirationTime()|. Removes the corresponding row from the
    173   // autofill table. Also culls timestamps to only two. TODO(georgey): remove
    174   // culling in future versions.
    175   bool RemoveExpiredFormElements(std::vector<AutofillChange>* changes);
    176 
    177   // Removes from autofill_dates rows with given pair_id where date_created lies
    178   // between |delete_begin| and |delete_end|.
    179   bool RemoveFormElementForTimeRange(int64 pair_id,
    180                                      const base::Time& delete_begin,
    181                                      const base::Time& delete_end,
    182                                      int* how_many);
    183 
    184   // Increments the count in the row corresponding to |pair_id| by |delta|.
    185   bool AddToCountOfFormElement(int64 pair_id, int delta);
    186 
    187   // Counts how many timestamp data rows are in the |autofill_dates| table for
    188   // a given |pair_id|. GetCountOfFormElement() on the other hand gives the
    189   // |count| property for a given id.
    190   int CountTimestampsData(int64 pair_id);
    191 
    192   // Gets the pair_id and count entries from name and value specified in
    193   // |element|.  Sets *pair_id and *count to 0 if there is no such row in
    194   // the table.
    195   bool GetIDAndCountOfFormElement(const FormFieldData& element,
    196                                   int64* pair_id,
    197                                   int* count);
    198 
    199   // Gets the count only given the pair_id.
    200   bool GetCountOfFormElement(int64 pair_id, int* count);
    201 
    202   // Updates the count entry in the row corresponding to |pair_id| to |count|.
    203   bool SetCountOfFormElement(int64 pair_id, int count);
    204 
    205   // Adds a new row to the autofill table with name and value given in
    206   // |element|.  Sets *pair_id to the pair_id of the new row.
    207   bool InsertFormElement(const FormFieldData& element,
    208                          int64* pair_id);
    209 
    210   // Adds a new row to the autofill_dates table.
    211   bool InsertPairIDAndDate(int64 pair_id, const base::Time& date_created);
    212 
    213   // Deletes last access to the Autofill data from the autofill_dates table.
    214   bool DeleteLastAccess(int64 pair_id);
    215 
    216   // Removes row from the autofill tables given |pair_id|.
    217   bool RemoveFormElementForID(int64 pair_id);
    218 
    219   // Removes row from the autofill tables for the given |name| |value| pair.
    220   virtual bool RemoveFormElement(const base::string16& name,
    221                                  const base::string16& value);
    222 
    223   // Retrieves all of the entries in the autofill table.
    224   virtual bool GetAllAutofillEntries(std::vector<AutofillEntry>* entries);
    225 
    226   // Retrieves a single entry from the autofill table.
    227   virtual bool GetAutofillTimestamps(const base::string16& name,
    228                                      const base::string16& value,
    229                                      std::vector<base::Time>* timestamps);
    230 
    231   // Replaces existing autofill entries with the entries supplied in
    232   // the argument.  If the entry does not already exist, it will be
    233   // added.
    234   virtual bool UpdateAutofillEntries(const std::vector<AutofillEntry>& entries);
    235 
    236   // Records a single Autofill profile in the autofill_profiles table.
    237   virtual bool AddAutofillProfile(const AutofillProfile& profile);
    238 
    239   // Updates the database values for the specified profile.  Mulit-value aware.
    240   virtual bool UpdateAutofillProfile(const AutofillProfile& profile);
    241 
    242   // Removes a row from the autofill_profiles table.  |guid| is the identifier
    243   // of the profile to remove.
    244   virtual bool RemoveAutofillProfile(const std::string& guid);
    245 
    246   // Retrieves a profile with guid |guid|.  The caller owns |profile|.
    247   bool GetAutofillProfile(const std::string& guid, AutofillProfile** profile);
    248 
    249   // Retrieves all profiles in the database.  Caller owns the returned profiles.
    250   virtual bool GetAutofillProfiles(std::vector<AutofillProfile*>* profiles);
    251 
    252   // Records a single credit card in the credit_cards table.
    253   bool AddCreditCard(const CreditCard& credit_card);
    254 
    255   // Updates the database values for the specified credit card.
    256   bool UpdateCreditCard(const CreditCard& credit_card);
    257 
    258   // Removes a row from the credit_cards table.  |guid| is the identifer  of the
    259   // credit card to remove.
    260   bool RemoveCreditCard(const std::string& guid);
    261 
    262   // Retrieves a credit card with guid |guid|.  The caller owns
    263   // |credit_card_id|.
    264   bool GetCreditCard(const std::string& guid, CreditCard** credit_card);
    265 
    266   // Retrieves all credit cards in the database.  Caller owns the returned
    267   // credit cards.
    268   virtual bool GetCreditCards(std::vector<CreditCard*>* credit_cards);
    269 
    270   // Removes rows from autofill_profiles and credit_cards if they were created
    271   // on or after |delete_begin| and strictly before |delete_end|.  Returns the
    272   // list of deleted profile guids in |profile_guids|.  Return value is true if
    273   // all rows were successfully removed.  Returns false on database error.  In
    274   // that case, the output vector state is undefined, and may be partially
    275   // filled.
    276   bool RemoveAutofillDataModifiedBetween(
    277       const base::Time& delete_begin,
    278       const base::Time& delete_end,
    279       std::vector<std::string>* profile_guids,
    280       std::vector<std::string>* credit_card_guids);
    281 
    282   // Removes origin URLs from the autofill_profiles and credit_cards tables if
    283   // they were written on or after |delete_begin| and strictly before
    284   // |delete_end|.  Returns the list of modified profiles in |profiles|.  Return
    285   // value is true if all rows were successfully updated.  Returns false on
    286   // database error.  In that case, the output vector state is undefined, and
    287   // may be partially filled.
    288   bool RemoveOriginURLsModifiedBetween(
    289       const base::Time& delete_begin,
    290       const base::Time& delete_end,
    291       ScopedVector<AutofillProfile>* profiles);
    292 
    293   // Retrieves all profiles in the database that have been deleted since last
    294   // "empty" of the trash.
    295   bool GetAutofillProfilesInTrash(std::vector<std::string>* guids);
    296 
    297   // Empties the Autofill profiles "trash can".
    298   bool EmptyAutofillProfilesTrash();
    299 
    300   // Removes empty values for autofill that were incorrectly stored in the DB
    301   // See bug http://crbug.com/6111
    302   bool ClearAutofillEmptyValueElements();
    303 
    304   // Retrieves all profiles in the database that have been deleted since last
    305   // "empty" of the trash.
    306   bool AddAutofillGUIDToTrash(const std::string& guid);
    307 
    308   // Clear all profiles.
    309   bool ClearAutofillProfiles();
    310 
    311   // Table migration functions.
    312   bool MigrateToVersion23AddCardNumberEncryptedColumn();
    313   bool MigrateToVersion24CleanupOversizedStringFields();
    314   bool MigrateToVersion27UpdateLegacyCreditCards();
    315   bool MigrateToVersion30AddDateModifed();
    316   bool MigrateToVersion31AddGUIDToCreditCardsAndProfiles();
    317   bool MigrateToVersion32UpdateProfilesAndCreditCards();
    318   bool MigrateToVersion33ProfilesBasedOnFirstName();
    319   bool MigrateToVersion34ProfilesBasedOnCountryCode();
    320   bool MigrateToVersion35GreatBritainCountryCodes();
    321   bool MigrateToVersion37MergeAndCullOlderProfiles();
    322   bool MigrateToVersion51AddOriginColumn();
    323 
    324   // Max data length saved in the table;
    325   static const size_t kMaxDataLength;
    326 
    327  private:
    328   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill);
    329   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddChanges);
    330   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_RemoveBetweenChanges);
    331 
    332   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_UpdateDontReplace);
    333   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddFormFieldValues);
    334   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfile);
    335   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateAutofillProfile);
    336   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrash);
    337   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrashInteraction);
    338   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    339                            RemoveAutofillDataModifiedBetween);
    340   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, CreditCard);
    341   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateCreditCard);
    342   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    343                            Autofill_GetAllAutofillEntries_OneResult);
    344   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    345                            Autofill_GetAllAutofillEntries_TwoDistinct);
    346   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    347                            Autofill_GetAllAutofillEntries_TwoSame);
    348 
    349   // Methods for adding autofill entries at a specified time.  For
    350   // testing only.
    351   bool AddFormFieldValuesTime(
    352       const std::vector<FormFieldData>& elements,
    353       std::vector<AutofillChange>* changes,
    354       base::Time time);
    355   bool AddFormFieldValueTime(const FormFieldData& element,
    356                              std::vector<AutofillChange>* changes,
    357                              base::Time time);
    358 
    359   // Insert a single AutofillEntry into the autofill/autofill_dates tables.
    360   bool InsertAutofillEntry(const AutofillEntry& entry);
    361 
    362   // Checks if the trash is empty.
    363   bool IsAutofillProfilesTrashEmpty();
    364 
    365   // Checks if the guid is in the trash.
    366   bool IsAutofillGUIDInTrash(const std::string& guid);
    367 
    368   bool InitMainTable();
    369   bool InitCreditCardsTable();
    370   bool InitDatesTable();
    371   bool InitProfilesTable();
    372   bool InitProfileNamesTable();
    373   bool InitProfileEmailsTable();
    374   bool InitProfilePhonesTable();
    375   bool InitProfileTrashTable();
    376 
    377   // The application locale.  The locale is needed for the migration to version
    378   // 35. Since it must be read on the UI thread, it is set when the table is
    379   // created (on the UI thread), and cached here so that it can be used for
    380   // migrations (on the DB thread).
    381   std::string app_locale_;
    382 
    383   DISALLOW_COPY_AND_ASSIGN(AutofillTable);
    384 };
    385 
    386 }  // namespace autofill
    387 
    388 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
    389