|
@@ -5,27 +5,29 @@ const fileHash = require('../../../util/backup_filehash')
|
|
|
|
|
|
const domain = 'AppDomainGroup-group.com.facebook.Messenger'
|
|
|
|
|
|
-module.exports.name = 'facebook_messenger_friends'
|
|
|
-module.exports.description = 'Show Facebook Messenger friends'
|
|
|
|
|
|
-// Specify this only works for iOS 9+
|
|
|
-module.exports.supportedVersions = '>=10.0'
|
|
|
|
|
|
-// Specify this reporter requires a backup.
|
|
|
-// The second parameter to func() is now a backup instead of the path to one.
|
|
|
-module.exports.requiresBackup = true
|
|
|
+module.exports = {
|
|
|
+ version: 4,
|
|
|
+ name: 'facebook_messenger_friends',
|
|
|
+ description: `Show Facebook Messenger friends`,
|
|
|
+ requiresBackup: true,
|
|
|
|
|
|
-// Specify this reporter supports the promises API for allowing chaining of reports.
|
|
|
-module.exports.usesPromises = true
|
|
|
+ // Run on a v3 lib / backup object.
|
|
|
+ run (lib, { backup }) {
|
|
|
+ return facebookMessengerFriendsReport(backup)
|
|
|
+ },
|
|
|
|
|
|
-// You can also provide an array of functions instead of using `module.exports.func`.
|
|
|
-// These functions *should* be independent ranges to ensure reliable execution
|
|
|
-module.exports.functions = {
|
|
|
+ // Fields for apps report
|
|
|
+ output: {
|
|
|
+ 'Facebook Friend Username': el => el.field_value
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- '>=10.0': function (program, backup, resolve, reject) {
|
|
|
- // This function would be called for iOS 10+
|
|
|
|
|
|
- backup.getFileManifest()
|
|
|
+const facebookMessengerFriendsReport = (backup, file) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ backup.getManifest()
|
|
|
.then((items) => {
|
|
|
let filename = 'fbomnistore.db'
|
|
|
let fileitem = items.find((file) => {
|
|
@@ -35,68 +37,29 @@ module.exports.functions = {
|
|
|
if (fileitem) {
|
|
|
let filepath = fileitem.relativePath
|
|
|
let file = fileHash(filepath, domain)
|
|
|
- return facebookMessengerFriendsReport(backup, file)
|
|
|
- } else return [] // Return an empty array to the formatter, since no fbomnistore.db file can be found in the manifest
|
|
|
- })
|
|
|
- .then((items) => {
|
|
|
- var result = program.formatter.format(items, {
|
|
|
- program: program,
|
|
|
- columns: {
|
|
|
- 'Facebook Friend Usernames': el => el.field_value
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- resolve(result)
|
|
|
- })
|
|
|
- .catch((e) => {
|
|
|
- log.error('[!] Encountered an Error:', e)
|
|
|
- })
|
|
|
- },
|
|
|
-
|
|
|
- '>=5.0,<10.0': function (program, backup, resolve, reject) {
|
|
|
- // This function would be called for all iOS 5 up to iOS 9.x.
|
|
|
- // TODO
|
|
|
- /* backup.getOldFileManifest()
|
|
|
- .then((items) => {
|
|
|
- var result = program.formatter.format(items, {
|
|
|
- program: program,
|
|
|
- columns: {
|
|
|
- 'Facebook Friend Username': el => el.field_value
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- resolve(result)
|
|
|
- })
|
|
|
- .catch(reject) */
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const facebookMessengerFriendsReport = (backup, file) => {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- var database = backup.getDatabase(file)
|
|
|
- try {
|
|
|
- database.get(`
|
|
|
- SELECT name
|
|
|
- FROM sqlite_master
|
|
|
- WHERE type='table'
|
|
|
- AND name LIKE 'collection_index#messenger_contacts_ios%'
|
|
|
- LIMIT 1
|
|
|
- `,
|
|
|
- (err, tableName) => {
|
|
|
- if (err) return reject(err)
|
|
|
- tableName = tableName.name
|
|
|
- log.verbose('Table', tableName)
|
|
|
- database.all(`
|
|
|
- SELECT field_value
|
|
|
- FROM '${tableName}'
|
|
|
- WHERE field_name='username'
|
|
|
- `, (err, rows) => {
|
|
|
- if (err) return reject(err)
|
|
|
- resolve(rows)
|
|
|
- })
|
|
|
+ backup.openDatabase(file).then(database => {
|
|
|
+ database.get(`
|
|
|
+ SELECT name
|
|
|
+ FROM sqlite_master
|
|
|
+ WHERE type='table'
|
|
|
+ AND name LIKE 'collection_index#messenger_contacts_ios%'
|
|
|
+ LIMIT 1
|
|
|
+ `,
|
|
|
+ (err, tableName) => {
|
|
|
+ if (err) return reject(err)
|
|
|
+ tableName = tableName.name
|
|
|
+ log.verbose('Table', tableName)
|
|
|
+ database.all(`
|
|
|
+ SELECT field_value
|
|
|
+ FROM '${tableName}'
|
|
|
+ WHERE field_name='username'
|
|
|
+ `, (err, rows) => {
|
|
|
+ if (err) return reject(err)
|
|
|
+ resolve(rows)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }).catch(reject)
|
|
|
+ } else reject("Cannot find fbomnistore.db") // Return an empty array to the formatter, since no fbomnistore.db file can be found in the manifest
|
|
|
})
|
|
|
- } catch (e) {
|
|
|
- reject(e)
|
|
|
- }
|
|
|
})
|
|
|
}
|