OLD | NEW |
1 # -*- coding:utf-8 -*- | 1 # -*- coding:utf-8 -*- |
2 """Parser for Twitter on iOS 8+ database. | 2 """Parser for Twitter on iOS 8+ database. |
3 | 3 |
4 SQLite database path: | 4 SQLite database path: |
5 /private/var/mobile/Containers/Data/Application/Library/Caches/databases/ | 5 /private/var/mobile/Containers/Data/Application/Library/Caches/databases/ |
6 SQLite database name: twitter.db | 6 SQLite database name: twitter.db |
7 """ | 7 """ |
8 | 8 |
9 from dfdatetime import posix_time as dfdatetime_posix_time | 9 from dfdatetime import posix_time as dfdatetime_posix_time |
10 | 10 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 u'AS user_id, Users.name AS name, Statuses.retweetCount AS ' | 85 u'AS user_id, Users.name AS name, Statuses.retweetCount AS ' |
86 u'retweetCount, Statuses.favoriteCount AS favoriteCount, ' | 86 u'retweetCount, Statuses.favoriteCount AS favoriteCount, ' |
87 u'Statuses.favorited AS favorited, Statuses.updatedAt AS updatedAt ' | 87 u'Statuses.favorited AS favorited, Statuses.updatedAt AS updatedAt ' |
88 u'FROM Statuses LEFT join Users ON Statuses.userId = Users.id ORDER ' | 88 u'FROM Statuses LEFT join Users ON Statuses.userId = Users.id ORDER ' |
89 u'BY date'), u'ParseStatusRow')] | 89 u'BY date'), u'ParseStatusRow')] |
90 | 90 |
91 REQUIRED_TABLES = frozenset([ | 91 REQUIRED_TABLES = frozenset([ |
92 u'Lists', u'MyRetweets', u'StatusesShadow', u'UsersShadow', | 92 u'Lists', u'MyRetweets', u'StatusesShadow', u'UsersShadow', |
93 u'ListsShadow', u'Statuses', u'Users']) | 93 u'ListsShadow', u'Statuses', u'Users']) |
94 | 94 |
| 95 SCHEMAS = [{ |
| 96 u'Lists': ( |
| 97 u'CREATE TABLE Lists ( \'id\' INTEGER PRIMARY KEY, \'name\' TEXT, ' |
| 98 u'\'slug\' TEXT, \'desc\' TEXT, \'private\' INTEGER, ' |
| 99 u'\'subscriberCount\' INTEGER, \'memberCount\' INTEGER, \'userId\' ' |
| 100 u'INTEGER, \'updatedAt\' REAL )'), |
| 101 u'ListsShadow': ( |
| 102 u'CREATE TABLE ListsShadow ( \'id\' INTEGER PRIMARY KEY, \'name\' ' |
| 103 u'TEXT, \'slug\' TEXT, \'desc\' TEXT, \'private\' INTEGER, ' |
| 104 u'\'subscriberCount\' INTEGER, \'memberCount\' INTEGER, \'userId\' ' |
| 105 u'INTEGER, \'updatedAt\' REAL )'), |
| 106 u'MyRetweets': ( |
| 107 u'CREATE TABLE MyRetweets ( \'statusId\' INTEGER PRIMARY KEY, ' |
| 108 u'\'myRetweetId\' INTEGER )'), |
| 109 u'Statuses': ( |
| 110 u'CREATE TABLE Statuses ( \'id\' INTEGER PRIMARY KEY, \'text\' TEXT, ' |
| 111 u'\'date\' REAL, \'userId\' INTEGER, \'inReplyToStatusId\' INTEGER, ' |
| 112 u'\'retweetedStatusId\' INTEGER, \'geotag\' BLOB, \'entities\' BLOB, ' |
| 113 u'\'card\' BLOB, \'cardUsers\' BLOB, \'primaryCardType\' INTEGER, ' |
| 114 u'\'cardVersion\' INTEGER, \'retweetCount\' INTEGER, ' |
| 115 u'\'favoriteCount\' INTEGER, \'favorited\' INTEGER, \'updatedAt\' ' |
| 116 u'REAL, \'extraScribeItem\' BLOB, \'withheldScope\' TEXT, ' |
| 117 u'\'withheldInCountries\' TEXT, \'inReplyToUsername\' TEXT, ' |
| 118 u'\'possiblySensitive\' INTEGER, \'isPossiblySensitiveAppealable\' ' |
| 119 u'INTEGER, \'isLifelineAlert\' INTEGER, \'isTruncated\' INTEGER, ' |
| 120 u'\'previewLength\' INTEGER, \'fullTextLength\' INTEGER, \'lang\' ' |
| 121 u'TEXT, \'supplmentalLanguage\' TEXT, \'includeInProfileTimeline\' ' |
| 122 u'INTEGER, \'quotedStatusId\' INTEGER, \'source\' TEXT )'), |
| 123 u'StatusesShadow': ( |
| 124 u'CREATE TABLE StatusesShadow ( \'id\' INTEGER PRIMARY KEY, \'text\' ' |
| 125 u'TEXT, \'date\' REAL, \'userId\' INTEGER, \'inReplyToStatusId\' ' |
| 126 u'INTEGER, \'retweetedStatusId\' INTEGER, \'geotag\' BLOB, ' |
| 127 u'\'entities\' BLOB, \'card\' BLOB, \'cardUsers\' BLOB, ' |
| 128 u'\'primaryCardType\' INTEGER, \'cardVersion\' INTEGER, ' |
| 129 u'\'retweetCount\' INTEGER, \'favoriteCount\' INTEGER, \'favorited\' ' |
| 130 u'INTEGER, \'updatedAt\' REAL, \'extraScribeItem\' BLOB, ' |
| 131 u'\'withheldScope\' TEXT, \'withheldInCountries\' TEXT, ' |
| 132 u'\'inReplyToUsername\' TEXT, \'possiblySensitive\' INTEGER, ' |
| 133 u'\'isPossiblySensitiveAppealable\' INTEGER, \'isLifelineAlert\' ' |
| 134 u'INTEGER, \'isTruncated\' INTEGER, \'previewLength\' INTEGER, ' |
| 135 u'\'fullTextLength\' INTEGER, \'lang\' TEXT, ' |
| 136 u'\'supplementalLanguage\' TEXT, \'includeInProfileTimeline\' ' |
| 137 u'INTEGER, \'quotedStatusId\' INTEGER, \'source\' TEXT )'), |
| 138 u'Users': ( |
| 139 u'CREATE TABLE Users ( \'id\' INTEGER PRIMARY KEY, \'screenName\' ' |
| 140 u'TEXT COLLATE NOCASE, \'profileImageUrl\' TEXT, ' |
| 141 u'\'profileBannerUrl\' TEXT, \'profileLinkColorHexTriplet\' INTEGER, ' |
| 142 u'\'name\' TEXT, \'location\' TEXT, \'structuredLocation\' BLOB, ' |
| 143 u'\'description\' TEXT, \'url\' TEXT, \'urlEntities\' BLOB, ' |
| 144 u'\'bioEntities\' BLOB, \'protected\' INTEGER, \'verified\' INTEGER, ' |
| 145 u'\'following\' INTEGER, \'deviceFollowing\' INTEGER, ' |
| 146 u'\'advertiserAccountType\' INTEGER, \'statusesCount\' INTEGER, ' |
| 147 u'\'mediaCount\' INTEGER, \'favoritesCount\' INTEGER, ' |
| 148 u'\'followingCount\' INTEGER, \'followersCount\' INTEGER, ' |
| 149 u'\'followersCountFast\' INTEGER, \'followersCountNormal\' INTEGER, ' |
| 150 u'\'couldBeStale\' INTEGER, \'isLifelineInstitution\' INTEGER, ' |
| 151 u'\'hasCollections\' INTEGER, \'updatedAt\' REAL, \'createdDate\' ' |
| 152 u'REAL, \'isTranslator\' INTEGER, \'hasExtendedProfileFields\' ' |
| 153 u'INTEGER, \'extendedProfileFields\' BLOB, \'pinnedTweetId\' ' |
| 154 u'INTEGER, \'businessProfileState\' INTEGER, \'analyticsType\' ' |
| 155 u'INTEGER )'), |
| 156 u'UsersShadow': ( |
| 157 u'CREATE TABLE UsersShadow ( \'id\' INTEGER PRIMARY KEY, ' |
| 158 u'\'screenName\' TEXT COLLATE NOCASE, \'profileImageUrl\' TEXT, ' |
| 159 u'\'profileBannerUrl\' TEXT, \'profileLinkColorHexTriplet\' INTEGER, ' |
| 160 u'\'name\' TEXT, \'location\' TEXT, \'structuredLocation\' BLOB, ' |
| 161 u'\'description\' TEXT, \'url\' TEXT, \'urlEntities\' BLOB, ' |
| 162 u'\'bioEntities\' BLOB, \'protected\' INTEGER, \'verified\' INTEGER, ' |
| 163 u'\'following\' INTEGER, \'deviceFollowing\' INTEGER, ' |
| 164 u'\'advertiserAccountType\' INTEGER, \'statusesCount\' INTEGER, ' |
| 165 u'\'mediaCount\' INTEGER, \'favoritesCount\' INTEGER, ' |
| 166 u'\'followingCount\' INTEGER, \'followersCount\' INTEGER, ' |
| 167 u'\'followersCountFast\' INTEGER, \'followersCountNormal\' INTEGER, ' |
| 168 u'\'couldBeStale\' INTEGER, \'isLifelineInstitution\' INTEGER, ' |
| 169 u'\'hasCollections\' INTEGER, \'updatedAt\' REAL, \'createdDate\' ' |
| 170 u'REAL, \'isTranslator\' INTEGER, \'hasExtendedProfileFields\' ' |
| 171 u'INTEGER, \'extendedProfileFields\' BLOB, \'pinnedTweetId\' ' |
| 172 u'INTEGER, \'businessProfileState\' INTEGER, \'analyticsType\' ' |
| 173 u'INTEGER )')}] |
| 174 |
95 def ParseContactRow(self, parser_mediator, row, query=None, **unused_kwargs): | 175 def ParseContactRow(self, parser_mediator, row, query=None, **unused_kwargs): |
96 """Parses a contact row from the database. | 176 """Parses a contact row from the database. |
97 | 177 |
98 Args: | 178 Args: |
99 parser_mediator (ParserMediator): mediates interactions between parsers | 179 parser_mediator (ParserMediator): mediates interactions between parsers |
100 and other components, such as storage and dfvfs. | 180 and other components, such as storage and dfvfs. |
101 row (sqlite3.Row): row resulting from query. | 181 row (sqlite3.Row): row resulting from query. |
102 query (Optional[str]): query. | 182 query (Optional[str]): query. |
103 """ | 183 """ |
104 # Note that pysqlite does not accept a Unicode string in row['string'] and | 184 # Note that pysqlite does not accept a Unicode string in row['string'] and |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 if timestamp: | 248 if timestamp: |
169 # Convert the floating point value to an integer. | 249 # Convert the floating point value to an integer. |
170 timestamp = int(timestamp) | 250 timestamp = int(timestamp) |
171 date_time = dfdatetime_posix_time.PosixTime(timestamp=timestamp) | 251 date_time = dfdatetime_posix_time.PosixTime(timestamp=timestamp) |
172 event = time_events.DateTimeValuesEvent( | 252 event = time_events.DateTimeValuesEvent( |
173 date_time, eventdata.EventTimestamp.UPDATE_TIME) | 253 date_time, eventdata.EventTimestamp.UPDATE_TIME) |
174 parser_mediator.ProduceEventWithEventData(event, event_data) | 254 parser_mediator.ProduceEventWithEventData(event, event_data) |
175 | 255 |
176 | 256 |
177 sqlite.SQLiteParser.RegisterPlugin(TwitterIOSPlugin) | 257 sqlite.SQLiteParser.RegisterPlugin(TwitterIOSPlugin) |
OLD | NEW |