Commit 67bb274e authored by avayvod@chromium.org's avatar avayvod@chromium.org

Backup keywords, sign all backup settings together.

R=sky@chromium.org
BUG=94447
TEST=Verify that migration to this build of Chrome goes smoothly and changing any search engine in Web Data file triggers the bubble.

Review URL: http://codereview.chromium.org/8567004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112884 0039d316-1c4b-4281-b951-d872f2087c98
parent a4674842
......@@ -14,11 +14,6 @@ namespace protector {
const char kProtectorHistogramDefaultSearchProvider[] =
"Protector.DefaultSearchProvider";
const char kProtectorBackupInvalidCounter[] =
"Protector.BackupInvalidCounter";
const char kProtectorValueChangedCounter[] = "Protector.ValueChangedCounter";
const char kProtectorValueValidCounter[] = "Protector.ValueValidCounter";
const char kProtectorHistogramNewSearchProvider[] =
"Protector.SearchProvider.New";
const char kProtectorHistogramSearchProviderApplied[] =
......
......@@ -14,18 +14,12 @@ namespace protector {
// provider. Values are below.
extern const char kProtectorHistogramDefaultSearchProvider[];
// Histogram value to report that the backup value is invalid or missing.
extern const char kProtectorBackupInvalidCounter[];
// Histogram value to report that the value does not match the backup.
extern const char kProtectorValueChangedCounter[];
// Histogram value to report that the value matches the backup.
extern const char kProtectorValueValidCounter[];
// Protector histogram values.
enum ProtectorError {
kProtectorErrorBackupInvalid,
kProtectorErrorValueChanged,
kProtectorErrorValueValid,
kProtectorErrorValueValidZero,
// This is for convenience only, must always be the last.
kProtectorErrorCount
......
This diff is collapsed.
......@@ -16,6 +16,10 @@
class TemplateURL;
namespace sql {
class Statement;
} // namespace sql
// This class manages the |keywords| MetaTable within the SQLite database
// passed to the constructor. It expects the following schema:
//
......@@ -50,6 +54,24 @@ class TemplateURL;
// sync_guid See TemplateURL::sync_guid. This was added in
// version 39.
//
// This class also manages some fields in the |meta| table:
// Default Search Provider ID The id of the default search provider.
// Default Search Provider ID Backup
// Backup copy of the above for restoring it
// in case the setting was hijacked or
// corrupted. This was added in version 40.
// Default Search Provider Backup Backup copy of the raw in |keywords|
// with the default search provider ID to
// restore all provider info. This was added
// in version 42.
// Default Search Provider ID Backup Signature
// The signature of backup data and
// |keywords| table contents to be able to
// verify the backup and understand when the
// settings were changed. This was added
// in version 40.
// Builtin Keyword Version The version of builtin keywords data.
//
class KeywordTable : public WebDatabaseTable {
public:
KeywordTable(sql::Connection* db, sql::MetaTable* meta_table)
......@@ -101,17 +123,35 @@ class KeywordTable : public WebDatabaseTable {
bool MigrateToVersion39AddSyncGUIDColumn();
bool MigrateToVersion40AddDefaultSearchProviderBackup();
bool MigrateToVersion41RewriteDefaultSearchProviderBackup();
bool MigrateToVersion42AddKeywordsBackupTable();
private:
FRIEND_TEST_ALL_PREFIXES(KeywordTableTest, DefaultSearchProviderBackup);
// Sets backup for id of the default search provider.
// Backup value is used to notice when unexpected change of the id
// occurred (i.e. by third-party process trying to modify user settings).
bool SetDefaultSearchProviderBackupID(int64 id);
// Returns contents of |keywords| table and default search provider backup
// as a string.
std::string GetSignatureData();
// Updates settings backup, signs it and stores the signature in the
// database. Returns true on success.
bool UpdateBackupSignature();
// Checks the signature for the current settings backup. Returns true
// if signature is valid, false otherwise.
bool IsBackupSignatureValid();
// Parses TemplateURL out of SQL statement result.
void GetURLFromStatement(const sql::Statement& s, TemplateURL* url);
// Gets a string representation for TemplateURL with id specified.
// Used to store its result in |meta| table or to compare with this
// backup. Returns true on success, false otherwise.
bool GetTemplateURLBackup(TemplateURLID id, std::string* result);
// Sets signature for the backup field.
bool SetDefaultSearchProviderBackupIDSignature(int64 id);
// Updates default search provider backup with TemplateURL data with
// specified id. Returns true on success.
// If id is 0, sets an empty string as a backup.
bool UpdateDefaultSearchProviderBackup(TemplateURLID id);
DISALLOW_COPY_AND_ASSIGN(KeywordTable);
};
......
......@@ -11,6 +11,7 @@
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/webdata/keyword_table.h"
#include "chrome/browser/webdata/web_database.h"
#include "sql/statement.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::Time;
......@@ -149,6 +150,30 @@ TEST_F(KeywordTableTest, KeywordMisc) {
ASSERT_EQ(0, db.GetKeywordTable()->GetDefaultSearchProviderID());
ASSERT_EQ(0, db.GetKeywordTable()->GetBuiltinKeywordVersion());
TemplateURL template_url;
template_url.set_short_name(ASCIIToUTF16("short_name"));
template_url.set_keyword(ASCIIToUTF16("keyword"));
GURL favicon_url("http://favicon.url/");
GURL originating_url("http://google.com/");
template_url.SetFaviconURL(favicon_url);
template_url.SetURL("http://url/", 0, 0);
template_url.set_safe_for_autoreplace(true);
Time created_time = Time::Now();
template_url.set_date_created(created_time);
Time last_modified_time = created_time + TimeDelta::FromSeconds(10);
template_url.set_last_modified(last_modified_time);
template_url.set_show_in_default_list(true);
template_url.set_originating_url(originating_url);
template_url.set_usage_count(32);
template_url.add_input_encoding("UTF-8");
template_url.add_input_encoding("UTF-16");
set_prepopulate_id(&template_url, 10);
set_logo_id(&template_url, 1000);
template_url.set_created_by_policy(true);
template_url.SetInstantURL("http://instant/", 0, 0);
SetID(10, &template_url);
ASSERT_TRUE(db.GetKeywordTable()->AddKeyword(template_url));
ASSERT_TRUE(db.GetKeywordTable()->SetDefaultSearchProviderID(10));
ASSERT_TRUE(db.GetKeywordTable()->SetBuiltinKeywordVersion(11));
......@@ -163,14 +188,62 @@ TEST_F(KeywordTableTest, DefaultSearchProviderBackup) {
EXPECT_EQ(0, db.GetKeywordTable()->GetDefaultSearchProviderID());
ASSERT_TRUE(db.GetKeywordTable()->SetDefaultSearchProviderID(10));
EXPECT_EQ(10, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(10, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
TemplateURL template_url;
template_url.set_short_name(ASCIIToUTF16("short_name"));
template_url.set_keyword(ASCIIToUTF16("keyword"));
GURL favicon_url("http://favicon.url/");
GURL originating_url("http://originating.url/");
template_url.SetFaviconURL(favicon_url);
template_url.SetURL("http://url/", 0, 0);
template_url.set_safe_for_autoreplace(true);
template_url.set_show_in_default_list(true);
template_url.SetSuggestionsURL("url2", 0, 0);
SetID(1, &template_url);
EXPECT_TRUE(db.GetKeywordTable()->AddKeyword(template_url));
ASSERT_TRUE(db.GetKeywordTable()->SetDefaultSearchProviderID(1));
EXPECT_TRUE(db.GetKeywordTable()->IsBackupSignatureValid());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
EXPECT_FALSE(db.GetKeywordTable()->DidDefaultSearchProviderChange());
ASSERT_TRUE(db.GetKeywordTable()->SetDefaultSearchProviderBackupID(11));
EXPECT_EQ(10, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(11, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
// Change the actual setting.
ASSERT_TRUE(db.GetKeywordTable()->meta_table_->SetValue(
"Default Search Provider ID", 2));
EXPECT_TRUE(db.GetKeywordTable()->IsBackupSignatureValid());
EXPECT_EQ(2, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
EXPECT_TRUE(db.GetKeywordTable()->DidDefaultSearchProviderChange());
// Change the backup.
ASSERT_TRUE(db.GetKeywordTable()->meta_table_->SetValue(
"Default Search Provider ID", 1));
ASSERT_TRUE(db.GetKeywordTable()->meta_table_->SetValue(
"Default Search Provider ID Backup", 2));
EXPECT_FALSE(db.GetKeywordTable()->IsBackupSignatureValid());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(0, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
EXPECT_TRUE(db.GetKeywordTable()->DidDefaultSearchProviderChange());
// Change the signature.
ASSERT_TRUE(db.GetKeywordTable()->meta_table_->SetValue(
"Default Search Provider ID Backup", 1));
ASSERT_TRUE(db.GetKeywordTable()->meta_table_->SetValue(
"Default Search Provider ID Backup Signature", ""));
EXPECT_FALSE(db.GetKeywordTable()->IsBackupSignatureValid());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(0, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
EXPECT_TRUE(db.GetKeywordTable()->DidDefaultSearchProviderChange());
// Change keywords.
ASSERT_TRUE(db.GetKeywordTable()->UpdateBackupSignature());
sql::Statement remove_keyword(db.GetKeywordTable()->db_->GetUniqueStatement(
"DELETE FROM keywords WHERE id=1"));
ASSERT_TRUE(remove_keyword.Run());
EXPECT_FALSE(db.GetKeywordTable()->IsBackupSignatureValid());
EXPECT_EQ(1, db.GetKeywordTable()->GetDefaultSearchProviderID());
EXPECT_EQ(0, db.GetKeywordTable()->GetDefaultSearchProviderIDBackup());
EXPECT_TRUE(db.GetKeywordTable()->DidDefaultSearchProviderChange());
}
......
......@@ -22,8 +22,8 @@ namespace {
// Current version number. Note: when changing the current version number,
// corresponding changes must happen in the unit tests, and new migration test
// added. See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|.
const int kCurrentVersionNumber = 41;
const int kCompatibleVersionNumber = 41;
const int kCurrentVersionNumber = 42;
const int kCompatibleVersionNumber = 42;
// Change the version number and possibly the compatibility version of
// |meta_table_|.
......@@ -319,6 +319,13 @@ sql::InitStatus WebDatabase::MigrateOldVersionsAsNeeded() {
ChangeVersion(&meta_table_, 41, true);
// FALL THROUGH
case 41:
if (!keyword_table_->MigrateToVersion42AddKeywordsBackupTable())
return FailedMigrationTo(42);
ChangeVersion(&meta_table_, 42, true);
// FALL THROUGH
// Add successive versions here. Each should set the version number and
// compatible version number as appropriate, then fall through to the next
// case.
......
......@@ -196,7 +196,7 @@ class WebDatabaseMigrationTest : public testing::Test {
DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
};
const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 41;
const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 42;
void WebDatabaseMigrationTest::LoadDatabase(const FilePath::StringType& file) {
std::string contents;
......@@ -1655,3 +1655,104 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion40ToCurrent) {
}
}
// Tests that all keywords are backed up and signed.
TEST_F(WebDatabaseMigrationTest, MigrateVersion41ToCurrent) {
ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_41.sql")));
// Verify pre-conditions. These are expectations for version 40 of the
// database.
{
sql::Connection connection;
ASSERT_TRUE(connection.Open(GetDatabasePath()));
ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
sql::MetaTable meta_table;
ASSERT_TRUE(meta_table.Init(&connection, 41, 41));
int64 default_search_provider_id = 0;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID",
&default_search_provider_id));
int64 default_search_provider_id_backup = 0;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID Backup",
&default_search_provider_id_backup));
std::string default_search_provider_id_backup_signature;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID Backup Signature",
&default_search_provider_id_backup_signature));
EXPECT_FALSE(default_search_provider_id_backup_signature.empty());
std::string default_search_provider_backup;
EXPECT_FALSE(meta_table.GetValue(
"Default Search Provider Backup",
&default_search_provider_backup));
}
// Load the database via the WebDatabase class and migrate the database to
// the current version.
{
WebDatabase db;
ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath()));
}
// Verify post-conditions. These are expectations for current version of the
// database.
{
sql::Connection connection;
ASSERT_TRUE(connection.Open(GetDatabasePath()));
ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
// Check version.
EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
sql::MetaTable meta_table;
ASSERT_TRUE(meta_table.Init(
&connection,
kCurrentTestedVersionNumber,
kCurrentTestedVersionNumber));
int64 default_search_provider_id = 0;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID",
&default_search_provider_id));
EXPECT_NE(0, default_search_provider_id);
int64 default_search_provider_id_backup = 0;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID Backup",
&default_search_provider_id_backup));
EXPECT_EQ(default_search_provider_id, default_search_provider_id_backup);
std::string default_search_provider_id_backup_signature;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider ID Backup Signature",
&default_search_provider_id_backup_signature));
EXPECT_FALSE(default_search_provider_id_backup_signature.empty());
std::string default_search_provider_backup;
EXPECT_TRUE(meta_table.GetValue(
"Default Search Provider Backup",
&default_search_provider_backup));
EXPECT_EQ("2"
"Google"
"google.com"
"http://www.google.com/favicon.ico"
"{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"
"{google:originalQueryForSuggestion}sourceid=chrome&"
"ie={inputEncoding}&q={searchTerms}"
"100"
"UTF-8"
"1"
"{google:baseSuggestURL}search?client=chrome&hl={language}&"
"q={searchTerms}"
"1162620"
"{google:baseURL}webhp?{google:RLZ}sourceid=chrome-instant&"
"ie={inputEncoding}&ion=1{searchTerms}&nord=10"
"{1234-5678-90AB-CDEF}",
default_search_provider_backup);
}
}
......@@ -3,7 +3,6 @@ BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR);
INSERT INTO "meta" VALUES('version','24');
INSERT INTO "meta" VALUES('last_compatible_version','24');
INSERT INTO "meta" VALUES('Default Search Provider ID','2');
INSERT INTO "meta" VALUES('Builtin Keyword Version','29');
CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,show_in_default_list INTEGER,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,autogenerate_keyword INTEGER DEFAULT 0);
CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR,username_element VARCHAR, username_value VARCHAR,password_element VARCHAR, password_value BLOB, submit_element VARCHAR,signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element,username_value, password_element, submit_element, signon_realm));
......
......@@ -3,7 +3,6 @@ BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR);
INSERT INTO "meta" VALUES('version','25');
INSERT INTO "meta" VALUES('last_compatible_version','25');
INSERT INTO "meta" VALUES('Default Search Provider ID','2');
INSERT INTO "meta" VALUES('Builtin Keyword Version','29');
CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,show_in_default_list INTEGER,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,autogenerate_keyword INTEGER DEFAULT 0,logo_id INTEGER DEFAULT 0);
CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR,username_element VARCHAR, username_value VARCHAR,password_element VARCHAR, password_value BLOB, submit_element VARCHAR,signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element,username_value, password_element, submit_element, signon_realm));
......
......@@ -3,7 +3,6 @@ BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR);
INSERT INTO "meta" VALUES('version','26');
INSERT INTO "meta" VALUES('last_compatible_version','26');
INSERT INTO "meta" VALUES('Default Search Provider ID','2');
INSERT INTO "meta" VALUES('Builtin Keyword Version','29');
CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,show_in_default_list INTEGER,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,autogenerate_keyword INTEGER DEFAULT 0,logo_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0);
CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR,username_element VARCHAR, username_value VARCHAR,password_element VARCHAR, password_value BLOB, submit_element VARCHAR,signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element,username_value, password_element, submit_element, signon_realm));
......
......@@ -3,7 +3,6 @@ BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR);
INSERT INTO "meta" VALUES('version','27');
INSERT INTO "meta" VALUES('last_compatible_version','27');
INSERT INTO "meta" VALUES('Default Search Provider ID','2');
INSERT INTO "meta" VALUES('Builtin Keyword Version','29');
CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,show_in_default_list INTEGER,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,autogenerate_keyword INTEGER DEFAULT 0,logo_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0);
INSERT INTO "keywords" VALUES(2,'Google','google.com','http://www.google.com/favicon.ico','{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&q={searchTerms}',1,1,'',0,0,'UTF-8','{google:baseSuggestURL}search?client=chrome&hl={language}&q={searchTerms}',1,1,6245,0);
......
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR);
INSERT INTO "meta" VALUES('version','40');
INSERT INTO "meta" VALUES('last_compatible_version','40');
INSERT INTO "meta" VALUES('Default Search Provider ID','2');
INSERT INTO "meta" VALUES('Default Search Provider ID Backup','2');
INSERT INTO "meta" VALUES('Default Search Provider ID Backup Signature','Signature');
INSERT INTO "meta" VALUES('Builtin Keyword Version','33');
CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,show_in_default_list INTEGER,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,autogenerate_keyword INTEGER DEFAULT 0,logo_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0,instant_url VARCHAR,last_modified INTEGER DEFAULT 0, sync_guid VARCHAR);
INSERT INTO "keywords" VALUES(2,'Google','google.com','http://www.google.com/favicon.ico','{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&q={searchTerms}',1,1,'',0,0,'UTF-8','{google:baseSuggestURL}search?client=chrome&hl={language}&q={searchTerms}',1,1,6262,0,'{google:baseURL}webhp?{google:RLZ}sourceid=chrome-instant&ie={inputEncoding}&ion=1{searchTerms}&nord=1',0,'{1234-5678-90AB-CDEF}');
CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR, username_element VARCHAR, username_value VARCHAR, password_element VARCHAR, password_value BLOB, submit_element VARCHAR, signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element, username_value, password_element, submit_element, signon_realm));
CREATE TABLE web_app_icons (url LONGVARCHAR,width int,height int,image BLOB, UNIQUE (url, width, height));
CREATE TABLE web_apps (url LONGVARCHAR UNIQUE,has_all_images INTEGER NOT NULL);
CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, pair_id INTEGER PRIMARY KEY, count INTEGER DEFAULT 1);
CREATE TABLE autofill_dates ( pair_id INTEGER DEFAULT 0, date_created INTEGER DEFAULT 0);
CREATE TABLE autofill_profiles ( guid VARCHAR PRIMARY KEY, company_name VARCHAR, address_line_1 VARCHAR, address_line_2 VARCHAR, city VARCHAR, state VARCHAR, zipcode VARCHAR, country VARCHAR, country_code VARCHAR, date_modified INTEGER NOT NULL DEFAULT 0);
CREATE TABLE autofill_profile_names ( guid VARCHAR, first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR);
CREATE TABLE autofill_profile_emails ( guid VARCHAR, email VARCHAR);
CREATE TABLE autofill_profile_phones ( guid VARCHAR, type INTEGER DEFAULT 0, number VARCHAR);
CREATE TABLE credit_cards ( guid VARCHAR PRIMARY KEY, name_on_card VARCHAR, expiration_month INTEGER, expiration_year INTEGER, card_number_encrypted BLOB, date_modified INTEGER NOT NULL DEFAULT 0);
CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB);
CREATE INDEX logins_signon ON logins (signon_realm);
CREATE INDEX web_apps_url_index ON web_apps (url);
CREATE INDEX autofill_name ON autofill (name);
CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);
CREATE INDEX autofill_dates_pair_id ON autofill_dates (pair_id);
COMMIT;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment