Home | History | Annotate | Download | only in webdata
      1 // Copyright (c) 2011 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 CHROME_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
      6 #define CHROME_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
      7 #pragma once
      8 
      9 #include "base/gtest_prod_util.h"
     10 #include "base/string16.h"
     11 #include "chrome/browser/webdata/web_database_table.h"
     12 
     13 #include <vector>
     14 
     15 class AutofillChange;
     16 class AutofillEntry;
     17 class AutofillProfile;
     18 class AutofillTableTest;
     19 class CreditCard;
     20 
     21 namespace webkit_glue {
     22 struct FormField;
     23 }
     24 
     25 // This class manages the various autofill tables within the SQLite database
     26 // passed to the constructor. It expects the following schemas:
     27 //
     28 // Note: The database stores time in seconds, UTC.
     29 //
     30 // autofill
     31 //   name                The name of the input as specified in the html.
     32 //   value               The literal contents of the text field.
     33 //   value_lower         The contents of the text field made lower_case.
     34 //   pair_id             An ID number unique to the row in the table.
     35 //   count               How many times the user has entered the string |value|
     36 //                       in a field of name |name|.
     37 //
     38 // autofill_dates        This table associates a row to each separate time the
     39 //                       user submits a form containing a certain name/value
     40 //                       pair.  The |pair_id| should match the |pair_id| field
     41 //                       in the appropriate row of the autofill table.
     42 //   pair_id
     43 //   date_created
     44 //
     45 // autofill_profiles    This table contains Autofill profile data added by the
     46 //                      user with the Autofill dialog.  Most of the columns are
     47 //                      standard entries in a contact information form.
     48 //
     49 //   guid               A guid string to uniquely identify the profile.
     50 //                      Added in version 31.
     51 //   company_name
     52 //   address_line_1
     53 //   address_line_2
     54 //   city
     55 //   state
     56 //   zipcode
     57 //   country            The country name.  Deprecated, should be removed once
     58 //                      the stable channel reaches version 11.
     59 //   country_code
     60 //   date_modified      The date on which this profile was last modified.
     61 //                      Added in version 30.
     62 //
     63 // autofill_profile_names
     64 //                      This table contains the multi-valued name fields
     65 //                      associated with a profile.
     66 //
     67 //   guid               The guid string that identifies the profile to which
     68 //                      the name belongs.
     69 //   first_name
     70 //   middle_name
     71 //   last_name
     72 //
     73 // autofill_profile_emails
     74 //                      This table contains the multi-valued email fields
     75 //                      associated with a profile.
     76 //
     77 //   guid               The guid string that identifies the profile to which
     78 //                      the email belongs.
     79 //   email
     80 //
     81 // autofill_profile_phones
     82 //                      This table contains the multi-valued phone fields
     83 //                      associated with a profile.
     84 //
     85 //   guid               The guid string that identifies the profile to which
     86 //                      the phone or fax number belongs.
     87 //   type               An integer constant designating either phone or fax type
     88 //                      of the number.
     89 //   number
     90 //
     91 // autofill_profiles_trash
     92 //                      This table contains guids of "trashed" autofill
     93 //                      profiles.  When a profile is removed its guid is added
     94 //                      to this table so that Sync can perform deferred removal.
     95 //
     96 //   guid               The guid string that identifies the trashed profile.
     97 //
     98 // credit_cards         This table contains credit card data added by the user
     99 //                      with the Autofill dialog.  Most of the columns are
    100 //                      standard entries in a credit card form.
    101 //
    102 //   guid               A guid string to uniquely identify the profile.
    103 //                      Added in version 31.
    104 //   name_on_card
    105 //   expiration_month
    106 //   expiration_year
    107 //   card_number_encrypted Stores encrypted credit card number.
    108 //   date_modified      The date on which this entry was last modified.
    109 //                      Added in version 30.
    110 //
    111 class AutofillTable : public WebDatabaseTable {
    112  public:
    113   AutofillTable(sql::Connection* db, sql::MetaTable* meta_table)
    114       : WebDatabaseTable(db, meta_table) {}
    115   virtual ~AutofillTable() {}
    116   virtual bool Init();
    117   virtual bool IsSyncable();
    118 
    119   // Records the form elements in |elements| in the database in the
    120   // autofill table.  A list of all added and updated autofill entries
    121   // is returned in the changes out parameter.
    122   bool AddFormFieldValues(const std::vector<webkit_glue::FormField>& elements,
    123                           std::vector<AutofillChange>* changes);
    124 
    125   // Records a single form element in the database in the autofill table. A list
    126   // of all added and updated autofill entries is returned in the changes out
    127   // parameter.
    128   bool AddFormFieldValue(const webkit_glue::FormField& element,
    129                          std::vector<AutofillChange>* changes);
    130 
    131   // Retrieves a vector of all values which have been recorded in the autofill
    132   // table as the value in a form element with name |name| and which start with
    133   // |prefix|.  The comparison of the prefix is case insensitive.
    134   bool GetFormValuesForElementName(const string16& name,
    135                                    const string16& prefix,
    136                                    std::vector<string16>* values,
    137                                    int limit);
    138 
    139   // Removes rows from autofill_dates if they were created on or after
    140   // |delete_begin| and strictly before |delete_end|.  Decrements the
    141   // count of the corresponding rows in the autofill table, and
    142   // removes those rows if the count goes to 0.  A list of all changed
    143   // keys and whether each was updater or removed is returned in the
    144   // changes out parameter.
    145   bool RemoveFormElementsAddedBetween(base::Time delete_begin,
    146                                       base::Time delete_end,
    147                                       std::vector<AutofillChange>* changes);
    148 
    149   // Removes from autofill_dates rows with given pair_id where date_created lies
    150   // between delte_begin and delte_end.
    151   bool RemoveFormElementForTimeRange(int64 pair_id,
    152                                      base::Time delete_begin,
    153                                      base::Time delete_end,
    154                                      int* how_many);
    155 
    156   // Increments the count in the row corresponding to |pair_id| by
    157   // |delta|.  Removes the row from the table and sets the
    158   // |was_removed| out parameter to true if the count becomes 0.
    159   bool AddToCountOfFormElement(int64 pair_id, int delta, bool* was_removed);
    160 
    161   // Gets the pair_id and count entries from name and value specified in
    162   // |element|.  Sets *pair_id and *count to 0 if there is no such row in
    163   // the table.
    164   bool GetIDAndCountOfFormElement(const webkit_glue::FormField& element,
    165                                   int64* pair_id,
    166                                   int* count);
    167 
    168   // Gets the count only given the pair_id.
    169   bool GetCountOfFormElement(int64 pair_id, int* count);
    170 
    171   // Updates the count entry in the row corresponding to |pair_id| to |count|.
    172   bool SetCountOfFormElement(int64 pair_id, int count);
    173 
    174   // Adds a new row to the autofill table with name and value given in
    175   // |element|.  Sets *pair_id to the pair_id of the new row.
    176   bool InsertFormElement(const webkit_glue::FormField& element, int64* pair_id);
    177 
    178   // Adds a new row to the autofill_dates table.
    179   bool InsertPairIDAndDate(int64 pair_id, base::Time date_created);
    180 
    181   // Removes row from the autofill tables given |pair_id|.
    182   bool RemoveFormElementForID(int64 pair_id);
    183 
    184   // Removes row from the autofill tables for the given |name| |value| pair.
    185   virtual bool RemoveFormElement(const string16& name, const string16& value);
    186 
    187   // Retrieves all of the entries in the autofill table.
    188   virtual bool GetAllAutofillEntries(std::vector<AutofillEntry>* entries);
    189 
    190   // Retrieves a single entry from the autofill table.
    191   virtual bool GetAutofillTimestamps(const string16& name,
    192                              const string16& value,
    193                              std::vector<base::Time>* timestamps);
    194 
    195   // Replaces existing autofill entries with the entries supplied in
    196   // the argument.  If the entry does not already exist, it will be
    197   // added.
    198   virtual bool UpdateAutofillEntries(const std::vector<AutofillEntry>& entries);
    199 
    200   // Records a single Autofill profile in the autofill_profiles table.
    201   virtual bool AddAutofillProfile(const AutofillProfile& profile);
    202 
    203   // Updates the database values for the specified profile.
    204   // DEPRECATED: Use |UpdateAutofillProfileMulti| instead.
    205   virtual bool UpdateAutofillProfile(const AutofillProfile& profile);
    206 
    207   // Updates the database values for the specified profile.  Mulit-value aware.
    208   virtual bool UpdateAutofillProfileMulti(const AutofillProfile& profile);
    209 
    210   // Removes a row from the autofill_profiles table.  |guid| is the identifier
    211   // of the profile to remove.
    212   virtual bool RemoveAutofillProfile(const std::string& guid);
    213 
    214   // Retrieves a profile with guid |guid|.  The caller owns |profile|.
    215   bool GetAutofillProfile(const std::string& guid, AutofillProfile** profile);
    216 
    217   // Retrieves all profiles in the database.  Caller owns the returned profiles.
    218   virtual bool GetAutofillProfiles(std::vector<AutofillProfile*>* profiles);
    219 
    220   // Records a single credit card in the credit_cards table.
    221   bool AddCreditCard(const CreditCard& credit_card);
    222 
    223   // Updates the database values for the specified credit card.
    224   bool UpdateCreditCard(const CreditCard& credit_card);
    225 
    226   // Removes a row from the credit_cards table.  |guid| is the identifer  of the
    227   // credit card to remove.
    228   bool RemoveCreditCard(const std::string& guid);
    229 
    230   // Retrieves a credit card with guid |guid|.  The caller owns
    231   // |credit_card_id|.
    232   bool GetCreditCard(const std::string& guid, CreditCard** credit_card);
    233 
    234   // Retrieves all credit cards in the database.  Caller owns the returned
    235   // credit cards.
    236   virtual bool GetCreditCards(std::vector<CreditCard*>* credit_cards);
    237 
    238   // Removes rows from autofill_profiles and credit_cards if they were created
    239   // on or after |delete_begin| and strictly before |delete_end|.  Returns lists
    240   // of deleted guids in |profile_guids| and |credit_card_guids|.
    241   bool RemoveAutofillProfilesAndCreditCardsModifiedBetween(
    242       base::Time delete_begin,
    243       base::Time delete_end,
    244       std::vector<std::string>* profile_guids,
    245       std::vector<std::string>* credit_card_guids);
    246 
    247   // Retrieves all profiles in the database that have been deleted since last
    248   // "empty" of the trash.
    249   bool GetAutofillProfilesInTrash(std::vector<std::string>* guids);
    250 
    251   // Empties the Autofill profiles "trash can".
    252   bool EmptyAutofillProfilesTrash();
    253 
    254   // Removes empty values for autofill that were incorrectly stored in the DB
    255   // See bug http://crbug.com/6111
    256   bool ClearAutofillEmptyValueElements();
    257 
    258   // Retrieves all profiles in the database that have been deleted since last
    259   // "empty" of the trash.
    260   bool AddAutofillGUIDToTrash(const std::string& guid);
    261 
    262   // Clear all profiles.
    263   bool ClearAutofillProfiles();
    264 
    265   // Table migration functions.
    266   bool MigrateToVersion23AddCardNumberEncryptedColumn();
    267   bool MigrateToVersion24CleanupOversizedStringFields();
    268   bool MigrateToVersion27UpdateLegacyCreditCards();
    269   bool MigrateToVersion30AddDateModifed();
    270   bool MigrateToVersion31AddGUIDToCreditCardsAndProfiles();
    271   bool MigrateToVersion32UpdateProfilesAndCreditCards();
    272   bool MigrateToVersion33ProfilesBasedOnFirstName();
    273   bool MigrateToVersion34ProfilesBasedOnCountryCode();
    274   bool MigrateToVersion35GreatBritainCountryCodes();
    275   bool MigrateToVersion37MergeAndCullOlderProfiles();
    276 
    277  private:
    278   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill);
    279   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddChanges);
    280   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_RemoveBetweenChanges);
    281 
    282   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_UpdateDontReplace);
    283   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddFormFieldValues);
    284   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfile);
    285   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateAutofillProfile);
    286   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrash);
    287   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrashInteraction);
    288   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    289                            RemoveAutofillProfilesAndCreditCardsModifiedBetween);
    290   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, CreditCard);
    291   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateCreditCard);
    292   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    293                            Autofill_GetAllAutofillEntries_OneResult);
    294   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    295                            Autofill_GetAllAutofillEntries_TwoDistinct);
    296   FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
    297                            Autofill_GetAllAutofillEntries_TwoSame);
    298 
    299   // Methods for adding autofill entries at a specified time.  For
    300   // testing only.
    301   bool AddFormFieldValuesTime(
    302       const std::vector<webkit_glue::FormField>& elements,
    303       std::vector<AutofillChange>* changes,
    304       base::Time time);
    305   bool AddFormFieldValueTime(const webkit_glue::FormField& element,
    306                              std::vector<AutofillChange>* changes,
    307                              base::Time time);
    308 
    309   // Insert a single AutofillEntry into the autofill/autofill_dates tables.
    310   bool InsertAutofillEntry(const AutofillEntry& entry);
    311 
    312   // Checks if the trash is empty.
    313   bool IsAutofillProfilesTrashEmpty();
    314 
    315   // Checks if the guid is in the trash.
    316   bool IsAutofillGUIDInTrash(const std::string& guid);
    317 
    318   bool InitMainTable();
    319   bool InitCreditCardsTable();
    320   bool InitDatesTable();
    321   bool InitProfilesTable();
    322   bool InitProfileNamesTable();
    323   bool InitProfileEmailsTable();
    324   bool InitProfilePhonesTable();
    325   bool InitProfileTrashTable();
    326 
    327   DISALLOW_COPY_AND_ASSIGN(AutofillTable);
    328 };
    329 
    330 #endif  // CHROME_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
    331