Sfoglia il codice sorgente

Add updated reporters

Rich Infante 7 anni fa
parent
commit
032880eb98

+ 29 - 9
tools/index.js

@@ -36,6 +36,7 @@ program
     .option(`-b, --backup <backup>`, 'Backup ID')
     .option(`-d, --dir <directory>`, `Backup Directory (default: ${base})`)
     .option('-r, --report <report_type>', 'Select a report type. see below for a full list.')
+    .option('-i, --id <id>', 'Specify an ID for filtering certain reports')
     .option('-f, --formatter <type>', 'Specify output format. default: table')
     .option(`-e, --extract <dir>`, 'Extract data for commands. supported by: voicemail-files')
     .option(`-f, --filter <filter>`, 'Filter output for individual reports. See the README for usage.')
@@ -79,17 +80,12 @@ if (program.verbose) console.log('Using source:', base)
 if (program.list) {
     // Shortcut for list report
   reportTypes.list.func(program, base)
-} else if (program.conversations) {
-    // Legacy shortcut for conversations report
-  reportTypes.conversations.func(program, base)
-} else if (program.messages) {
-    // Legacy shortcut for messages report
-  reportTypes.messages.func(program, base)
 } else if (program.report) {
     // If the report is valid
   if (reportTypes[program.report]) {
     var report = reportTypes[program.report]
 
+    // Check if there's a backup specified and one is required.
     if (report.requiresBackup) {
       if (!program.backup) {
         console.log('use -b or --backup <id> to specify backup.')
@@ -100,7 +96,31 @@ if (program.list) {
     // Try to use it
     if (report.func) {
       try {
-        report.func(program, base)
+        // New type of reports
+        var backup = iPhoneBackup.fromID(program.backup, base)
+        
+        if (report.supportedVersions !== undefined) {
+          if (version.versionCheck(backup.iOSVersion, report.supportedVersions)) {
+            if (report.requiresBackup) {
+              report.func(program, backup)
+            } else {
+              report.func(program, base)
+            }
+          } else {
+            console.log('[!] The report generator "' + program.report + '" does not support iOS', backup.iOSVersion)
+            console.log('')
+            console.log('    If you think it should, file an issue here:')
+            console.log('    https://github.com/richinfante/iphonebackuptools/issues')
+            console.log('')
+            process.exit(1)
+          }
+        } else {
+          if (report.requiresBackup) {
+            report.func(program, backup)
+          } else {
+            report.func(program, base)
+          }
+        }
       } catch (e) {
         console.log('[!] Encountered an error', e)
       }
@@ -120,9 +140,9 @@ if (program.list) {
       }
 
       if (!flag) {
-        console.log('[!] No compatible reporter for', backup.iOSVersion, 'and type', program.report)
+        console.log('[!] The report generator "', program.report,'" does not support iOS', backup.iOSVersion)
         console.log('')
-        console.log('    If you think one should exist, file an issue here:')
+        console.log('    If you think it should, file an issue here:')
         console.log('    https://github.com/richinfante/iphonebackuptools/issues')
         console.log('')
         process.exit(1)

+ 30 - 0
tools/reports/_example.js

@@ -0,0 +1,30 @@
+// Name of the module.
+module.exports.name = 'example module'
+
+// Description of the module
+module.exports.description = 'An example module to show how it works'
+
+// 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
+
+// Specify this only works for iOS 10+
+module.exports.supportedVersions = '>=10.0'
+
+// Reporting function
+module.exports.func = function (program, backup) {
+  // This function will be called with the `commander` program, and the iPhoneBackup instance as arguments
+}
+
+// --- OR ---
+
+// 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 = {
+    '>=10.0': function(program,backup) {
+        // This function would be called for iOS 10+
+    }, 
+    '>=9.0,<10.0': function(program,backup) {
+        // This function would be called for all iOS 9.
+    }
+}

+ 0 - 2
tools/reports/apps.js

@@ -3,8 +3,6 @@ const iPhoneBackup = require('../util/iphone_backup.js').iPhoneBackup
 module.exports.name = 'apps'
 module.exports.description = 'List all installed applications and container IDs.'
 
-module.exports.compatible_versions = [ '>=10.0' ]
-
 module.exports.func = function (program, base) {
   if (!program.backup) {
     console.log('use -b or --backup <id> to specify backup.')

+ 31 - 37
tools/reports/calls.js

@@ -1,45 +1,39 @@
 module.exports.name = 'calls'
 module.exports.description = 'List all call records contained in the backup.'
+
+// 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.functions = {
 
-  //
-  // iOS 9+ Call Log Extraction
-  //
-  '>=9.0': function (program, backup) {
-    // File ID for calls is `5a4935c78a5255723f707230a451d79c540d2741`
+// Specify this only works for iOS 10+
+module.exports.supportedVersions = '>=10.0'
 
-    backup.queryDatabase('5a4935c78a5255723f707230a451d79c540d2741',
-    `
-      SELECT *, 
-      datetime(ZDATE + 978307200, 'unixepoch') AS XFORMATTEDDATESTRING 
-      FROM ZCALLRECORD 
-      ORDER BY ZDATE ASC
-    `)
-    .then((items) => {
-      // Use the configured formatter to print the rows.
-      program.formatter.format(items, {
-        // Color formatting?
-        color: program.color,
+module.exports.func = function (program, backup) {
 
-        // Columns to be displayed in human-readable printouts.
-        // Some formatters, like raw or CSV, ignore these.
-        columns: {
-          'ID': el => el.Z_PK,
-          'Date': el => el.XFORMATTEDDATESTRING,
-          'Answered': el => el.ZANSWERED + '',
-          'Originated': el => el.ZORIGINATED + '',
-          'Call Type': el => el.ZCALLTYPE + '',
-          'Duration': el => el.ZDURATION + '',
-          'Location': el => el.ZLOCATION + '',
-          'Country': el => el.ZISO_COUNTRY_CODE + '',
-          'Service': el => el.ZSERVICE_PROVIDER + '',
-          'Address': el => (el.ZADDRESS || '').toString()
-        }
-      })
-    })
-    .catch((e) => {
-      console.log('[!] Encountered an Error:', e)
+  backup.getCallsList()
+  .then((items) => {
+    // Use the configured formatter to print the rows.
+    program.formatter.format(items, {
+      // Color formatting?
+      color: program.color,
+
+      // Columns to be displayed in human-readable printouts.
+      // Some formatters, like raw or CSV, ignore these.
+      columns: {
+        'ID': el => el.Z_PK,
+        'Date': el => el.XFORMATTEDDATESTRING,
+        'Answered': el => el.ZANSWERED + '',
+        'Originated': el => el.ZORIGINATED + '',
+        'Call Type': el => el.ZCALLTYPE + '',
+        'Duration': el => el.ZDURATION + '',
+        'Location': el => el.ZLOCATION + '',
+        'Country': el => el.ZISO_COUNTRY_CODE + '',
+        'Service': el => el.ZSERVICE_PROVIDER + '',
+        'Address': el => (el.ZADDRESS || '').toString()
+      }
     })
-  }
+  })
+  .catch((e) => {
+    console.log('[!] Encountered an Error:', e)
+  })
 }

+ 11 - 16
tools/reports/conversations.js

@@ -15,24 +15,19 @@ module.exports.func = function (program, base) {
   // Grab the backup
   var backup = iPhoneBackup.fromID(program.backup, base)
 
-  backup.getConversations(program.dump)
+  backup.getConversations()
     .then((items) => {
-      if (program.dump) return
 
-      items = items.map(el => [
-        el.ROWID + '',
-        chalk.gray(el.XFORMATTEDDATESTRING || '??'),
-        el.service_name + '', 
-        el.chat_identifier + '',
-        el.display_name + ''
-      ])
-
-      items = [['ID', 'DATE', 'Service', 'Chat Name', 'Display Name'], ['-', '-', '-', '-', '-'], ...items]
-      items = normalizeCols(items).map(el => el.join(' | ')).join('\n')
-
-      if (!program.color) { items = stripAnsi(items) }
-
-      console.log(items)
+      program.formatter.format(items, {
+        color: program.color,
+        columns: {
+          'ID': el => el.ROWID,
+          'Date': el => el.XFORMATTEDDATESTRING || '??',
+          'Service': el => el.service_name + '',
+          'Chat Name': el => el.chat_identifier + '',
+          'Display Name': el => el.display_name + '',
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 1 - 1
tools/reports/list.js

@@ -24,7 +24,7 @@ module.exports.func = function (program, base) {
       'Date': el => el.status ? new Date(el.status.Date).toLocaleString() : '',
       'Device Name': el => el.manifest ? el.manifest.Lockdown.DeviceName : 'Unknown Device',
       'Serial #': el => el.manifest.Lockdown.SerialNumber,
-      'iOS Version': el => el.status ? el.status.Version : '?',
+      'iOS Version': el => el.manifest ? el.manifest.Lockdown.ProductVersion : '?',
       'Backup Version': el => el.status ? el.status.Version : '?'
     }
   })

+ 15 - 16
tools/reports/messages.js

@@ -5,31 +5,30 @@ const normalizeCols = require('../util/normalize.js')
 
 module.exports.name = 'messages'
 module.exports.description = 'List all SMS and iMessage messages in a conversation'
+module.exports.requiresBackup = true
 
 module.exports.func = function (program, base) {
-  if (!program.backup) {
-    console.log('use -b or --backup <id> to specify backup.')
+  if (!program.id) {
+    console.log('use -i or --id <id> to specify conversation ID.')
     process.exit(1)
   }
 
   // Grab the backup
   var backup = iPhoneBackup.fromID(program.backup, base)
 
-  backup.getMessages(program.messages, program.dump)
+  backup.getMessages(program.id)
     .then((items) => {
-      if (program.dump) return
-
-      items = items.map(el => [
-        chalk.gray(el.XFORMATTEDDATESTRING + ''),
-        chalk.blue(el.x_sender + ''),
-        el.text || ''
-      ])
-
-      items = normalizeCols(items, 2).map(el => el.join(' | ')).join('\n')
-
-      if (!program.color) { items = stripAnsi(items) }
-
-      console.log(items)
+      console.log(items.length)
+
+      program.formatter.format(items, {
+        color: program.color,
+        columns: {
+          'ID' : el => el.ROWID,
+          'Date': el => el.XFORMATTEDDATESTRING,
+          'Sender': el => el.x_sender,
+          'Text': el => (el.text || '').trim()
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 20 - 33
tools/reports/notes.js

@@ -4,38 +4,25 @@ const normalizeCols = require('../util/normalize.js')
 
 module.exports.name = 'notes'
 module.exports.description = 'List all iOS notes'
+module.exports.requiresBackup = true
 
-module.exports.func = function (program, base) {
-  if (!program.backup) {
-    console.log('use -b or --backup <id> to specify backup.')
-    process.exit(1)
+module.exports.functions = {
+  '>=9.0' : function (program, backup) {
+    backup.getNotes(program.dump)
+      .then((items) => {
+        // Format the output
+        program.formatter.format(items, {
+          color: program.color,
+          columns: {
+            'Modified': el => (el.XFORMATTEDDATESTRING || el.XFORMATTEDDATESTRING1) + '',
+            'ID': el => el.Z_PK,
+            'Title2': el => (el.ZTITLE2 + '').trim().substring(0, 128),
+            'Title1': el => (el.ZTITLE1 + '').trim() || ''
+          }
+        })
+      })
+      .catch((e) => {
+        console.log('[!] Encountered an Error:', e)
+      })
   }
-
-// Grab the backup
-  var backup = iPhoneBackup.fromID(program.backup, base)
-  backup.getNotes(program.dump)
-    .then((items) => {
-        // Dump if needed
-      if (program.dump) {
-        console.log(JSON.stringify(items, null, 4))
-        return
-      }
-
-        // Otherwise, format table
-      items = items.map(el => [
-        (el.XFORMATTEDDATESTRING || el.XFORMATTEDDATESTRING1) + '',
-            (el.Z_PK + ''),
-        (el.ZTITLE2 + '').trim().substring(0, 128),
-        (el.ZTITLE1 + '').trim() || ''
-      ])
-      items = [['Modified', 'ID', 'Title2', 'Title1'], ['-', '-', '-', '-'], ...items]
-      items = normalizeCols(items, 3).map(el => el.join(' | ')).join('\n')
-
-      if (!program.color) { items = stripAnsi(items) }
-
-      console.log(items)
-    })
-    .catch((e) => {
-      console.log('[!] Encountered an Error:', e)
-    })
-}
+}

+ 8 - 18
tools/reports/oldnotes.js

@@ -15,25 +15,15 @@ module.exports.func = function (program, base) {
   var backup = iPhoneBackup.fromID(program.backup, base)
   backup.getOldNotes(program.dump)
     .then((items) => {
-      // Dump if needed
-      if (program.dump) {
-        console.log(JSON.stringify(items, null, 4))
-        return
-      }
 
-      // Otherwise, format table
-      items = items.map(el => [el.XFORMATTEDDATESTRING + '', (el.Z_PK + ''), (el.ZTITLE + '').substring(0, 128)])
-      items = [
-        ['Modified', 'ID', 'Title'],
-        ['-', '-', '-'], ...items
-      ]
-      items = normalizeCols(items).map(el => el.join(' | ')).join('\n')
-
-      if (!program.color) {
-        items = stripAnsi(items)
-      }
-
-      console.log(items)
+      program.formatter.format(items, {
+        color: program.color,
+        columns: {
+          'Modified': el => el.XFORMATTEDDATESTRING,
+          'ID': el => el.Z_PK,
+          'Title': el => (el.ZTITLE + '').substring(0, 128)
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 20 - 31
tools/reports/photolocations.js

@@ -1,40 +1,29 @@
-const stripAnsi = require('strip-ansi')
-const iPhoneBackup = require('../util/iphone_backup.js').iPhoneBackup
-const normalizeCols = require('../util/normalize.js')
-
 module.exports.name = 'photolocations'
 module.exports.description = 'List all geolocation information for iOS photos (iOS 10+)'
 
-module.exports.func = function (program, base) {
-  if (!program.backup) {
-    console.log('use -b or --backup <id> to specify backup.')
-    process.exit(1)
-  }
-
-// Grab the backup
-  var backup = iPhoneBackup.fromID(program.backup, base)
-  backup.getPhotoLocationHistory(program.dump)
-    .then((history) => {
-      if (program.dump) {
-        console.log(JSON.stringify(history, null, 4))
-        return
-      }
-
-      var items = history.map(el => [
-        el.XFORMATTEDDATESTRING + '' || '',
-        el.ZLATITUDE + '' || '',
-        el.ZLONGITUDE + '' || '',
-        el.ZFILENAME + '' || ''
-      ])
-
-      items = [['Time', 'Latitude', 'Longitude', 'Photo Name'], ['-', '-', '-'], ...items]
-      items = normalizeCols(items).map(el => el.join(' | ').replace(/\n/g, '')).join('\n')
+// 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
 
-      if (!program.color) { items = stripAnsi(items) }
+// Specify this only works for iOS 10+
+module.exports.supportedVersions = '>=10.0'
 
-      console.log(items)
+// Reporting function
+module.exports.func = function (program, backup) {
+  backup.getPhotoLocationHistory()
+    .then((history) => {
+      // Format the output according to the configured formatter.
+      program.formatter.format(history, {
+        color: program.color,
+        columns: {
+          'Time': el => el.XFORMATTEDDATESTRING,
+          'Latitude': el => el.ZLATITUDE,
+          'Longitude': el => el.ZLONGITUDE,
+          'File': el => el.ZFILENAME,
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)
     })
-}
+}

+ 22 - 32
tools/reports/voicemail.js

@@ -1,42 +1,32 @@
-const stripAnsi = require('strip-ansi')
-const iPhoneBackup = require('../util/iphone_backup.js').iPhoneBackup
-const normalizeCols = require('../util/normalize.js')
-
 module.exports.name = 'voicemail'
 module.exports.description = 'List all or extract voicemails on device'
 
-module.exports.func = function (program, base) {
-  if (!program.backup) {
-    console.log('use -b or --backup <id> to specify backup.')
-    process.exit(1)
-  }
-
-// Grab the backup
-  var backup = iPhoneBackup.fromID(program.backup, base)
-  backup.getVoicemailsList()
-    .then((items) => {
-      if (program.dump) {
-        console.log(JSON.stringify(items, null, 4))
-        return
-      }
+// 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
 
-      items = items.map(el => [
-        el.ROWID + '',
-        el.XFORMATTEDDATESTRING,
-        el.sender + '',
-        el.token + '',
-        el.duration + '',
-        el.expiration + '',
-        el.trashed_date + '',
-        el.flags + ''
-      ])
+// Specify this only works for iOS 10+
+module.exports.supportedVersions = '>=9.0'
 
-      items = [['ID', 'Date', 'Sender', 'Token', 'Duration', 'Expiration', 'Trashed', 'Flags'], ['-', '-', '-', '-', '-', '-', '-', '-'], ...items]
-      items = normalizeCols(items).map(el => el.join(' | ').replace(/\n/g, '')).join('\n')
+module.exports.func = function (program, backup) {
 
-      if (!program.color) { items = stripAnsi(items) }
+  backup.getVoicemailsList()
+    .then((items) => {
 
-      console.log(items)
+      program.formatter.format(items, {
+        color: program.color,
+        columns: {
+          'ID': el => el.ROWID,
+          'Date': el => el.XFORMATTEDDATESTRING,
+          'Sender': el => el.sender,
+          'Token': el => el.token,
+          'Duration': el => el.duration,
+          'Expiration': el => el.expiration,
+          'Duration': el => el.duration,
+          'Trashed': el => el.trashed_date,
+          'Flags': el => el.flags
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 17 - 24
tools/reports/webhistory.js

@@ -6,33 +6,26 @@ const normalizeCols = require('../util/normalize.js')
 module.exports.name = 'webhistory'
 module.exports.description = 'List all web history'
 
-module.exports.func = function (program, base) {
-  if (!program.backup) {
-    console.log('use -b or --backup <id> to specify backup.')
-    process.exit(1)
-  }
+// 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
 
-// Grab the backup
-  var backup = iPhoneBackup.fromID(program.backup, base)
-  backup.getWebHistory(program.dump)
-    .then((history) => {
-      if (program.dump) {
-        console.log(JSON.stringify(history, null, 4))
-        return
-      }
-
-      var items = history.map(el => [
-        el.XFORMATTEDDATESTRING + '' || '',
-        new URL(el.url || '').origin || '',
-        (el.title || '').substring(0, 64)
-      ])
+// Specify this only works for iOS 6+
+module.exports.supportedVersions = '>=9.0'
 
-      items = [['Time', 'URL', 'Title'], ['-', '-', '-'], ...items]
-      items = normalizeCols(items).map(el => el.join(' | ').replace(/\n/g, '')).join('\n')
+module.exports.func = function (program, backup) {
 
-      if (!program.color) { items = stripAnsi(items) }
-
-      console.log(items)
+  backup.getWebHistory(program.dump)
+    .then((history) => {
+      
+      program.formatter.format(history, {
+        color: program.color,
+        columns: {
+          'Time': el => el.XFORMATTEDDATESTRING,
+          'URL': el => new URL(el.url || '').origin || '',
+          'Title': el => (el.title || '').substring(0, 64)
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 12 - 20
tools/reports/wifi.js

@@ -15,27 +15,19 @@ module.exports.func = function (program, base) {
   var backup = iPhoneBackup.fromID(program.backup, base)
   backup.getWifiList()
     .then((items) => {
-      if (program.dump) {
-        console.log(JSON.stringify(items, null, 4))
-        return
-      }
 
-      items = items['List of known networks'].map(el => [
-        el.lastJoined + '' || '',
-        el.lastAutoJoined + '' || '',
-        el.SSID_STR + '',
-        el.BSSID + '',
-        el.SecurityMode || '',
-        el.HIDDEN_NETWORK + '',
-        el.enabled + ''
-      ]).sort((a, b) => new Date(a[0]).getTime() - new Date(b[0]).getTime())
-
-      items = [['Last Joined', 'Last AutoJoined', 'SSID', 'BSSID', 'Security', 'Hidden', 'Enabled'], ['-', '-', '-', '-', '-', '-'], ...items]
-      items = normalizeCols(items).map(el => el.join(' | ').replace(/\n/g, '')).join('\n')
-
-      if (!program.color) { items = stripAnsi(items) }
-
-      console.log(items)
+      program.formatter.format(items['List of known networks'], {
+        color: program.color,
+        columns: {
+          'Last Joined': el => el.lastJoined,
+          'Last AutoJoined': el => el.lastAutoJoined,
+          'SSID': el => el.SSID_STR,
+          'BSSID': el => el.BSSID,
+          'Security': el => el.SecurityMode || '',
+          'Hidden': el => el.HIDDEN_NETWORK || '',
+          'Enabled': el => el.enabled
+        }
+      })
     })
     .catch((e) => {
       console.log('[!] Encountered an Error:', e)

+ 10 - 16
tools/util/iphone_backup.js

@@ -143,7 +143,7 @@ class iPhoneBackup {
     })
   }
 
-  getMessagesiOS9 (chatId, dumpAll) {
+  getMessagesiOS9 (chatId) {
     var backup = this
     return new Promise((resolve, reject) => {
       var messagedb = this.getDatabase(databases.SMS)
@@ -163,7 +163,6 @@ class iPhoneBackup {
        if (err) return reject(err)
 
        chats = chats || []
-       if (dumpAll) console.log(JSON.stringify(chats, null, 4))
 
         // Compute the user's name
        for (var i in chats) {
@@ -184,7 +183,7 @@ class iPhoneBackup {
     })
   }
 
-  getMessagesiOS10iOS11 (chatId, dumpAll) {
+  getMessagesiOS10iOS11 (chatId) {
     var backup = this
     return new Promise((resolve, reject) => {
       var messagedb = this.getDatabase(databases.SMS)
@@ -204,7 +203,6 @@ class iPhoneBackup {
        if (err) return reject(err)
 
        chats = chats || []
-       if (dumpAll) console.log(JSON.stringify(chats, null, 4))
 
         // Compute the user's name
        for (var i in chats) {
@@ -225,15 +223,15 @@ class iPhoneBackup {
     })
   }
 
-  getMessages (chatId, dumpAll) {
+  getMessages (chatId) {
     if (parseInt(this.manifest.Lockdown.BuildVersion) <= 13) {
-      return this.getMessagesiOS9(chatId, dumpAll)
+      return this.getMessagesiOS9(chatId)
     } else {
-      return this.getMessagesiOS10iOS11(chatId, dumpAll)
+      return this.getMessagesiOS10iOS11(chatId)
     }
   }
 
-  getConversationsiOS9 (dumpAll) {
+  getConversationsiOS9 () {
     var backup = this
     return new Promise((resolve, reject) => {
       var messagedb = this.getDatabase(databases.SMS)
@@ -280,32 +278,28 @@ class iPhoneBackup {
           return (a.date.getTime() || 0) - (b.date.getTime() || 0)
         })
 
-        if (dumpAll) console.log(JSON.stringify(rows, null, 4))
-
         resolve(rows)
       })
     })
   }
 
-  getConversationsiOS10iOS11 (dumpAll) {
+  getConversationsiOS10iOS11 () {
     return new Promise((resolve, reject) => {
       var messagedb = this.getDatabase(databases.SMS)
       messagedb.all(`SELECT *, datetime(last_read_message_timestamp / 1000000000 + 978307200, 'unixepoch') AS XFORMATTEDDATESTRING FROM chat ORDER BY last_read_message_timestamp ASC`, async function (err, rows) {
         if (err) return reject(err)
         rows = rows || []
 
-        if (dumpAll) console.log(JSON.stringify(rows, null, 4))
-
         resolve(rows)
       })
     })
   }
 
-  getConversations (dumpAll) {
+  getConversations () {
     if (parseInt(this.manifest.Lockdown.BuildVersion) <= 14) {
-      return this.getConversationsiOS9(dumpAll)
+      return this.getConversationsiOS9()
     } else {
-      return this.getConversationsiOS10iOS11(dumpAll)
+      return this.getConversationsiOS10iOS11()
     }
   }