-- This Source Code Form is subject to the terms of the Mozilla Public -- License, v. 2.0. If a copy of the MPL was not distributed with this -- file, You can obtain one at http://mozilla.org/MPL/2.0/. CREATE TABLE IF NOT EXISTS addresses_data ( guid TEXT NOT NULL PRIMARY KEY CHECK(length(guid) != 0), name TEXT NOT NULL, -- Name organization TEXT NOT NULL, -- Company street_address TEXT NOT NULL, -- (Multiline) address_level3 TEXT NOT NULL, -- Suburb/Sublocality address_level2 TEXT NOT NULL, -- City/Town address_level1 TEXT NOT NULL, -- Province (Standardized code if possible) postal_code TEXT NOT NULL, country TEXT NOT NULL, -- ISO 3166 tel TEXT NOT NULL, -- Stored in E.164 format email TEXT NOT NULL, time_created INTEGER NOT NULL, time_last_used INTEGER NOT NULL, time_last_modified INTEGER NOT NULL, times_used INTEGER NOT NULL, sync_change_counter INTEGER NOT NULL ); -- What's on the server as the JSON payload. CREATE TABLE IF NOT EXISTS addresses_mirror ( guid TEXT NOT NULL PRIMARY KEY CHECK(length(guid) != 0), -- The plain-text sync15 payload. payload TEXT NOT NULL CHECK(length(payload) != 0) -- We could also have `modified`, which is in the server response and -- passed around in the sync code, but we don't have a use-case for using it. ); -- Tombstones are items deleted locally but not deleted in the mirror (ie, ones -- we are yet to upload) CREATE TABLE IF NOT EXISTS addresses_tombstones ( guid TEXT PRIMARY KEY CHECK(length(guid) != 0), time_deleted INTEGER NOT NULL ) WITHOUT ROWID; -- XXX There are still questions around how we implement the necessary security model for credit cards, specifically -- whether the `cc_number` and/or other details should be encrypted or stored as plain text. Currently, we are storing -- them as plain text. CREATE TABLE IF NOT EXISTS credit_cards_data ( guid TEXT NOT NULL PRIMARY KEY CHECK(length(guid) != 0), cc_name TEXT NOT NULL, -- full name -- Encrypted card number, stored as a JWE. All valid unencrypted card -- numbers are 19 chars or less, and a base64 encoded JWE is always going to -- be longer than thus, so we add a CHECK designed to ensure we don't -- accidentally store unencrypted numbers here. -- The one exception is a completely blank value, which indicates that we -- lost the key to decrypt the card number and need to refetch the value from -- the sync server. cc_number_enc TEXT NOT NULL CHECK(length(cc_number_enc) > 20 OR cc_number_enc == ''), -- last 4 digits unencrypted. Check no larger than 4 to avoid the full number. cc_number_last_4 TEXT NOT NULL CHECK(length(cc_number_last_4) <= 4), cc_exp_month INTEGER, cc_exp_year INTEGER, cc_type TEXT NOT NULL, time_created INTEGER NOT NULL, time_last_used INTEGER, time_last_modified INTEGER NOT NULL, times_used INTEGER NOT NULL, /* Same "sync change counter" strategy used by other components. */ sync_change_counter INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS credit_cards_mirror ( guid TEXT NOT NULL PRIMARY KEY CHECK(length(guid) != 0), /* Note that: * The mirror needs to have a fully-formed Sync BSO payload, which includes the plaintext cc number. * But we don't want plaintext cc numbers on disk, so we have to encrypt the numbers in this payload - and the simplest way to do that is to just encrypt the entire payload. * The JWE encryption scheme is how we encrypt data for local storage, so that's what we use here (ie, we use the same encryption scheme that we use for `credit_cards_data.cc_number_enc`, and not the scheme Sync itself uses for encrypting payloads) */ payload TEXT NOT NULL CHECK(length(payload) != 0) ); CREATE TABLE IF NOT EXISTS credit_cards_tombstones ( guid TEXT PRIMARY KEY CHECK(length(guid) != 0), time_deleted INTEGER NOT NULL ) WITHOUT ROWID; -- This table holds key-value metadata for the Autofill component and its consumers. CREATE TABLE IF NOT EXISTS moz_meta ( key TEXT PRIMARY KEY, value NOT NULL ) WITHOUT ROWID;