Source code for plaso.parsers.sqlite_plugins.chrome_history

"""SQLite parser plugin for Google Chrome history database files."""

from dfdatetime import posix_time as dfdatetime_posix_time
from dfdatetime import webkit_time as dfdatetime_webkit_time

from plaso.containers import events
from plaso.parsers import sqlite
from plaso.parsers.sqlite_plugins import interface


[docs] class ChromeHistoryFileDownloadedEventData(events.EventData): """Chrome History file downloaded event data. Attributes: danger_type (int): assessment by Safe Browsing of the danger of the downloaded content. end_time (dfdatetime.DateTimeValues): date and time the download was finished. full_path (str): full path where the file was downloaded to. interrupt_reason (int): indication why the download was interrupted. offset (str): identifier of the row, from which the event data was extracted. opened (int): value to indicate if the downloaded file was opened from the browser. query (str): SQL query that was used to obtain the event data. received_bytes (int): number of bytes received while downloading. start_time (dfdatetime.DateTimeValues): date and time the download was started. state (int): state of the download, such as finished or cancelled. total_bytes (int): total number of bytes to download. url (str): URL of the downloaded file. """ DATA_TYPE = "chrome:history:file_downloaded"
[docs] def __init__(self): """Initializes event data.""" super().__init__(data_type=self.DATA_TYPE) self.danger_type = None self.end_time = None self.full_path = None self.interrupt_reason = None self.offset = None self.opened = None self.query = None self.received_bytes = None self.start_time = None self.state = None self.total_bytes = None self.url = None
[docs] class ChromeHistoryPageVisitedEventData(events.EventData): """Chrome History page visited event data. Attributes: from_visit (str): URL where the visit originated from. last_visited_time (dfdatetime.DateTimeValues): date and time the URL was last visited. offset (str): identifier of the row, from which the event data was extracted. page_transition_type (int): type of transitions between pages. query (str): SQL query that was used to obtain the event data. title (str): title of the visited page. typed_count (int): number of times the user has navigated to the page by typing in the address. url (str): URL of the visited page. url_hidden (bool): True if the URL is hidden. visit_count (int): number of times the user has navigated to this page. visit_source (int): source of the page visit. """ DATA_TYPE = "chrome:history:page_visited"
[docs] def __init__(self): """Initializes event data.""" super().__init__(data_type=self.DATA_TYPE) self.from_visit = None self.last_visited_time = None self.offset = None self.page_transition_type = None self.query = None self.title = None self.typed_count = None self.url = None self.url_hidden = None self.visit_count = None self.visit_source = None
[docs] class BaseGoogleChromeHistoryPlugin(interface.SQLitePlugin): """SQLite parser plugin for Google Chrome history database files. The Google Chrome history database file is typically stored in: Archived History History Note that the Archived History database does not contain the downloads table. """ _SYNC_CACHE_QUERY = "SELECT id, source FROM visit_source" _URL_CACHE_QUERY = ( "SELECT visits.id AS id, urls.url, urls.title FROM " "visits, urls WHERE urls.id = visits.url" ) # https://cs.chromium.org/chromium/src/ui/base/page_transition_types.h?l=108 _PAGE_TRANSITION_CORE_MASK = 0xFF def _GetPosixDateTimeRowValue(self, query_hash, row, value_name): """Retrieves a POSIX date and time value from the row. Args: query_hash (int): hash of the query, that uniquely identifies the query that produced the row. row (sqlite3.Row): row. value_name (str): name of the value. Returns: dfdatetime.PosixTime: date and time value or None if not available. """ timestamp = self._GetRowValue(query_hash, row, value_name) if timestamp is None: return None return dfdatetime_posix_time.PosixTime(timestamp=timestamp) def _GetWebKitDateTimeRowValue(self, query_hash, row, value_name): """Retrieves a WebKit date and time value from the row. Args: query_hash (int): hash of the query, that uniquely identifies the query that produced the row. row (sqlite3.Row): row. value_name (str): name of the value. Returns: dfdatetime.WebKitTime: date and time value or None if not available. """ timestamp = self._GetRowValue(query_hash, row, value_name) if timestamp is None: return None return dfdatetime_webkit_time.WebKitTime(timestamp=timestamp) def _GetUrl(self, url, cache, database): """Retrieves a URL from a reference to an entry in the from_visit table. Args: url (str): URL. cache (SQLiteCache): cache. database (SQLiteDatabase): database. Returns: str: URL or an empty string if no URL was found. """ if not url: return "" url_cache_results = cache.GetResults("url") if not url_cache_results: result_set = database.Query(self._URL_CACHE_QUERY) cache.CacheQueryResults(result_set, "url", "id", ("url", "title")) url_cache_results = cache.GetResults("url") reference_url, reference_title = url_cache_results.get(url, ["", ""]) if not reference_url: return "" return f"{reference_url:s} ({reference_title:s})" def _GetVisitSource(self, visit_identifier, cache, database): """Retrieves a visit source type based on the identifier. Args: visit_identifier (str): identifier from the visits table for the particular record. cache (SQLiteCache): cache which contains cached results from querying the visit_source table. database (SQLiteDatabase): database. Returns: int: visit source type or None if no visit source type was found for the identifier. """ sync_cache_results = cache.GetResults("sync") if not sync_cache_results: result_set = database.Query(self._SYNC_CACHE_QUERY) cache.CacheQueryResults(result_set, "sync", "id", ("source",)) sync_cache_results = cache.GetResults("sync") if sync_cache_results and visit_identifier: results = sync_cache_results.get(visit_identifier) if results: return results[0] return None def _ParseLastVisitedRow( self, parser_mediator, query, row, cache=None, database=None, **unused_kwargs ): """Parses a last visited row. Args: parser_mediator (ParserMediator): mediates interactions between parsers and other components, such as storage and dfVFS. query (str): query that created the row. row (sqlite3.Row): row. cache (SQLiteCache): cache which contains cached results from querying the visits and urls tables. database (Optional[SQLiteDatabase]): database. """ query_hash = hash(query) hidden = self._GetRowValue(query_hash, row, "hidden") transition = self._GetRowValue(query_hash, row, "transition") visit_identifier = self._GetRowValue(query_hash, row, "visit_id") from_visit = self._GetRowValue(query_hash, row, "from_visit") event_data = ChromeHistoryPageVisitedEventData() event_data.from_visit = self._GetUrl(from_visit, cache, database) event_data.last_visited_time = self._GetWebKitDateTimeRowValue( query_hash, row, "visit_time" ) event_data.offset = self._GetRowValue(query_hash, row, "id") event_data.query = query event_data.page_transition_type = transition & self._PAGE_TRANSITION_CORE_MASK event_data.title = self._GetRowValue(query_hash, row, "title") event_data.typed_count = self._GetRowValue(query_hash, row, "typed_count") event_data.url = self._GetRowValue(query_hash, row, "url") event_data.url_hidden = hidden == "1" event_data.visit_count = self._GetRowValue(query_hash, row, "visit_count") event_data.visit_source = self._GetVisitSource( visit_identifier, cache, database ) parser_mediator.ProduceEventData(event_data)
[docs] class GoogleChrome8HistoryPlugin(BaseGoogleChromeHistoryPlugin): """SQLite parser plugin for Google Chrome 8 - 25 history database files.""" NAME = "chrome_8_history" DATA_FORMAT = "Google Chrome 8 - 25 history SQLite database file" REQUIRED_STRUCTURE = { "downloads": frozenset( [ "id", "full_path", "received_bytes", "total_bytes", "url", "start_time", "state", ] ), "urls": frozenset( [ "id", "url", "title", "visit_count", "typed_count", "last_visit_time", "hidden", ] ), "visits": frozenset(["visit_time", "from_visit", "transition", "id"]), } QUERIES = [ ( ( "SELECT urls.id, urls.url, urls.title, urls.visit_count, " "urls.typed_count, urls.last_visit_time, urls.hidden, visits." "visit_time, visits.from_visit, visits.transition, visits.id " "AS visit_id FROM urls, visits WHERE urls.id = visits.url" ), "_ParseLastVisitedRow", ), ( ( "SELECT id, full_path, url, start_time, received_bytes, " "total_bytes, state FROM downloads" ), "_ParseFileDownloadedRow", ), ] _SCHEMA_8 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path " "LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER " "NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT " "NULL,state INTEGER NOT NULL)" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY " "KEY,value LONGVARCHAR)" ), "presentation": ( "CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index " "INTEGER NOT NULL)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN)" ), } _SCHEMA_16 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path " "LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER " "NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT " "NULL,state INTEGER NOT NULL,end_time INTEGER NOT NULL,opened " "INTEGER NOT NULL)" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY " "KEY,value LONGVARCHAR)" ), "presentation": ( "CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index " "INTEGER NOT NULL)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN)" ), } _SCHEMA_19 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path " "LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER " "NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT " "NULL,state INTEGER NOT NULL,end_time INTEGER NOT NULL,opened " "INTEGER NOT NULL)" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "presentation": ( "CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index " "INTEGER NOT NULL)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN)" ), } _SCHEMA_20 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path " "LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER " "NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT " "NULL,state INTEGER NOT NULL,end_time INTEGER NOT NULL,opened " "INTEGER NOT NULL)" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "presentation": ( "CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index " "INTEGER NOT NULL)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed " "BOOLEAN,visit_duration INTEGER DEFAULT 0 NOT NULL)" ), } SCHEMAS = [_SCHEMA_8, _SCHEMA_16, _SCHEMA_19, _SCHEMA_20] def _ParseFileDownloadedRow(self, parser_mediator, query, row, **unused_kwargs): """Parses a file downloaded row. Args: parser_mediator (ParserMediator): mediates interactions between parsers and other components, such as storage and dfVFS. query (str): query that created the row. row (sqlite3.Row): row. """ query_hash = hash(query) event_data = ChromeHistoryFileDownloadedEventData() event_data.full_path = self._GetRowValue(query_hash, row, "full_path") event_data.offset = self._GetRowValue(query_hash, row, "id") event_data.query = query event_data.received_bytes = self._GetRowValue(query_hash, row, "received_bytes") event_data.start_time = self._GetPosixDateTimeRowValue( query_hash, row, "start_time" ) event_data.state = self._GetRowValue(query_hash, row, "state") event_data.total_bytes = self._GetRowValue(query_hash, row, "total_bytes") event_data.url = self._GetRowValue(query_hash, row, "url") parser_mediator.ProduceEventData(event_data)
[docs] class GoogleChrome27HistoryPlugin(BaseGoogleChromeHistoryPlugin): """SQLite parser plugin for Google Chrome 27+ history database files.""" NAME = "chrome_27_history" DATA_FORMAT = "Google Chrome 27 and later history SQLite database file" REQUIRED_STRUCTURE = { "downloads": frozenset( [ "id", "target_path", "received_bytes", "total_bytes", "start_time", "end_time", "state", "danger_type", "interrupt_reason", "opened", ] ), "downloads_url_chains": frozenset(["id", "url"]), "urls": frozenset( [ "id", "url", "title", "visit_count", "typed_count", "last_visit_time", "hidden", ] ), "visits": frozenset(["visit_time", "from_visit", "transition", "id"]), } QUERIES = [ ( ( "SELECT urls.id, urls.url, urls.title, urls.visit_count, " "urls.typed_count, urls.last_visit_time, urls.hidden, visits." "visit_time, visits.from_visit, visits.transition, visits.id " "AS visit_id FROM urls, visits WHERE urls.id = visits.url" ), "_ParseLastVisitedRow", ), ( ( "SELECT downloads.id AS id, downloads.start_time," "downloads.target_path, downloads_url_chains.url, " "downloads.received_bytes, downloads.total_bytes, " "downloads.end_time, downloads.state, downloads.danger_type, " "downloads.interrupt_reason, downloads.opened " "FROM downloads, downloads_url_chains " "WHERE downloads.id = downloads_url_chains.id" ), "_ParseFileDownloadedRow", ), ] _SCHEMA_27 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL, interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL)" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed " "BOOLEAN,visit_duration INTEGER DEFAULT 0 NOT NULL)" ), } _SCHEMA_31 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL, interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id " "VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL)" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } _SCHEMA_37 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL,interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id " "VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL)" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } _SCHEMA_51 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT " "NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT " "NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT " "NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT " "NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT " "NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER " "NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT " "NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT " "NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT " "NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL)" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } _SCHEMA_58 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT " "NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT " "NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT " "NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT " "NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT " "NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER " "NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT " "NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT " "NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT " "NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,PRIMARY KEY " "(download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title " "LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count " "INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden " "INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } _SCHEMA_59 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT " "NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT " "NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT " "NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT " "NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT " "NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER " "NOT NULL,last_access_time INTEGER NOT NULL,transient INTEGER NOT " "NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT NULL,tab_url " "VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT NULL,http_method " "VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR " "NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT " "NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type " "VARCHAR(255) NOT NULL)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,PRIMARY KEY " "(download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url " "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } # Observed in Chrome 63.0.3239.108 meta.version 37 _SCHEMA_63 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT " "NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT " "NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT " "NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT " "NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT " "NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER " "NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT " "NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT " "NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT " "NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL, last_access_time " "INTEGER NOT NULL DEFAULT 0, transient INTEGER NOT NULL DEFAULT 0)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,PRIMARY KEY " "(download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( 'CREATE TABLE "urls"(id INTEGER PRIMARY KEY AUTOINCREMENT,url ' "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } # Observed in Chrome 65.0.3325.162 _SCHEMA_65 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL,interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id " "VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL, guid VARCHAR NOT " "NULL DEFAULT '', hash BLOB NOT NULL DEFAULT X'', http_method " "VARCHAR NOT NULL DEFAULT '', tab_url VARCHAR NOT NULL " "DEFAULT '', tab_referrer_url VARCHAR NOT NULL DEFAULT '', " "site_url VARCHAR NOT NULL DEFAULT '', last_access_time INTEGER " "NOT NULL DEFAULT 0, transient INTEGER NOT NULL DEFAULT 0)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,PRIMARY KEY " "(download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( 'CREATE TABLE "urls"(id INTEGER PRIMARY KEY AUTOINCREMENT,url ' "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } # Observed in Chrome 67.0.3396.62. _SCHEMA_67 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL, interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id " "VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL, mime_type VARCHAR(255) NOT " 'NULL DEFAULT "", original_mime_type VARCHAR(255) NOT NULL DEFAULT ' "\"\", guid VARCHAR NOT NULL DEFAULT '', hash BLOB NOT NULL DEFAULT " "X'', http_method VARCHAR NOT NULL DEFAULT '', tab_url VARCHAR " "NOT NULL DEFAULT '', tab_referrer_url VARCHAR NOT NULL DEFAULT " "'', site_url VARCHAR NOT NULL DEFAULT '', last_access_time " "INTEGER NOT NULL DEFAULT 0, transient INTEGER NOT NULL DEFAULT 0)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL, finished INTEGER " "NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( 'CREATE TABLE "urls"(id INTEGER PRIMARY KEY AUTOINCREMENT,url ' "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } # Observed in Linux Chrome 67.0.3396.99 meta.version 39 _SCHEMA_67_2 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path " "LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes " "INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT " "NULL,interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT " "NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id " "VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT " "NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT " "NULL,original_mime_type VARCHAR(255) NOT NULL, guid VARCHAR NOT " "NULL DEFAULT '', hash BLOB NOT NULL DEFAULT X'', http_method " "VARCHAR NOT NULL DEFAULT '', tab_url VARCHAR NOT NULL DEFAULT " "'', tab_referrer_url VARCHAR NOT NULL DEFAULT '', site_url " "VARCHAR NOT NULL DEFAULT '', last_access_time INTEGER NOT NULL " "DEFAULT 0, transient INTEGER NOT NULL DEFAULT 0)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL, finished INTEGER " "NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( 'CREATE TABLE "urls"(id INTEGER PRIMARY KEY AUTOINCREMENT,url ' "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } # Observed in MacOS Chrome 67.0.3396.99 meta.version 39 _SCHEMA_67_3 = { "downloads": ( "CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT " "NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT " "NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT " "NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT " "NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT " "NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER " "NOT NULL,last_access_time INTEGER NOT NULL,transient INTEGER NOT " "NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT NULL,tab_url " "VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT NULL,http_method " "VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR " "NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT " "NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type " "VARCHAR(255) NOT NULL)" ), "downloads_slices": ( "CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset " "INTEGER NOT NULL,received_bytes INTEGER NOT NULL, finished INTEGER " "NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) )" ), "downloads_url_chains": ( "CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index " "INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, " "chain_index) )" ), "keyword_search_terms": ( "CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT " "NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term " "LONGVARCHAR NOT NULL)" ), "meta": ( "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, " "value LONGVARCHAR)" ), "segment_usage": ( "CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id " "INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER " "DEFAULT 0 NOT NULL)" ), "segments": ( "CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id " "INTEGER NON NULL)" ), "typed_url_sync_metadata": ( "CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY " "KEY NOT NULL,value BLOB)" ), "urls": ( "CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url " "LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT " "NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time " "INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL)" ), "visit_source": ( "CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER " "NOT NULL)" ), "visits": ( "CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT " "NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition " "INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration " "INTEGER DEFAULT 0 NOT NULL)" ), } SCHEMAS = [ _SCHEMA_27, _SCHEMA_31, _SCHEMA_37, _SCHEMA_51, _SCHEMA_58, _SCHEMA_59, _SCHEMA_63, _SCHEMA_65, _SCHEMA_67, _SCHEMA_67_2, _SCHEMA_67_3, ] def _ParseFileDownloadedRow(self, parser_mediator, query, row, **unused_kwargs): """Parses a file downloaded row. Args: parser_mediator (ParserMediator): mediates interactions between parsers and other components, such as storage and dfVFS. query (str): query that created the row. row (sqlite3.Row): row. """ query_hash = hash(query) event_data = ChromeHistoryFileDownloadedEventData() event_data.danger_type = self._GetRowValue(query_hash, row, "danger_type") event_data.end_time = self._GetWebKitDateTimeRowValue( query_hash, row, "end_time" ) event_data.full_path = self._GetRowValue(query_hash, row, "target_path") event_data.offset = self._GetRowValue(query_hash, row, "id") event_data.interrupt_reason = self._GetRowValue( query_hash, row, "interrupt_reason" ) event_data.opened = self._GetRowValue(query_hash, row, "opened") event_data.query = query event_data.received_bytes = self._GetRowValue(query_hash, row, "received_bytes") event_data.start_time = self._GetWebKitDateTimeRowValue( query_hash, row, "start_time" ) event_data.state = self._GetRowValue(query_hash, row, "state") event_data.total_bytes = self._GetRowValue(query_hash, row, "total_bytes") event_data.url = self._GetRowValue(query_hash, row, "url") parser_mediator.ProduceEventData(event_data)
sqlite.SQLiteParser.RegisterPlugins( [GoogleChrome8HistoryPlugin, GoogleChrome27HistoryPlugin] )