Răsfoiți Sursa

Waze (#39)

* Waze favorites report
* Waze places report
* Waze recent places report
* Waze favorite places improvement: show street, city, state, country
Alberto Güerere 7 ani în urmă
părinte
comite
53dd81c400

+ 4 - 1
tools/index.js

@@ -36,7 +36,10 @@ var reportTypes = {
   'speed_dial': require('./reports/speed_dial'),
   'bluetooth_devices': require('./reports/bluetooth_devices'),
   'safari_open_tabs': require('./reports/safari_open_tabs'),
-  'safari_recent_searches': require('./reports/safari_recent_searches')
+  'safari_recent_searches': require('./reports/safari_recent_searches'),
+  'waze_favorites': require('./reports/waze_favorites'),
+  'waze_places': require('./reports/waze_places'),
+  'waze_recents': require('./reports/waze_recents')
 }
 
 var formatters = {

+ 67 - 0
tools/reports/waze_favorites.js

@@ -0,0 +1,67 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const database = fileHash('Documents/user.db', 'AppDomain-com.waze.iphone')
+
+module.exports.name = 'waze_favorites'
+module.exports.description = 'List Waze app favorite places'
+
+// 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 reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  wazeReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: {
+          'Name': el => el.name,
+          'Modified Date': el => (new Date((el.modified_time) * 1000).toDateString()) + ' ' + (new Date((el.modified_time) * 1000).toTimeString()) ,
+          'Latitude': el => el.latitude / 1000000,
+          'Longitude': el => el.longitude / 1000000,
+          'Street': el => el.street,
+          'City': el => el.city,
+          'State': el => el.state,
+          'Country': el => el.country
+        }
+      })
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+function KeyValue (property, plist) {
+  this.key = property
+  this.value = plist[property] ? plist[property] : 'N/A'
+}
+
+const wazeReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var wazedb = backup.getDatabase(database)
+      try {
+        const query = `
+        select FAVORITES.name, FAVORITES.created_time, FAVORITES.modified_time, FAVORITES.rank, PLACES.latitude, PLACES.longitude, PLACES.street, PLACES.city, PLACES.state, PLACES.country from FAVORITES
+        left join PLACES on FAVORITES.place_id = PLACES.id
+        order by rank
+        `
+        wazedb.all(query, async function (err, rows) {
+          if (err) reject(err)
+
+          resolve(rows)
+        })
+      } catch (e) {
+        reject(e)
+      }
+  })
+}

+ 66 - 0
tools/reports/waze_places.js

@@ -0,0 +1,66 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const database = fileHash('Documents/user.db', 'AppDomain-com.waze.iphone')
+
+module.exports.name = 'waze_places'
+module.exports.description = 'List Waze app places'
+
+// 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 reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  wazeReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: {
+          'Name': el => el.name,
+          'Created Date': el => (new Date((el.created_time) * 1000).toDateString()) + ' ' + (new Date((el.created_time) * 1000).toTimeString()) ,
+          'Latitude': el => el.latitude / 1000000,
+          'Longitude': el => el.longitude / 1000000,
+          'Street': el => el.street,
+          'City': el => el.city,
+          'State': el => el.state,
+          'Country': el => el.country
+        }
+      })
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+function KeyValue (property, plist) {
+  this.key = property
+  this.value = plist[property] ? plist[property] : 'N/A'
+}
+
+const wazeReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var wazedb = backup.getDatabase(database)
+      try {
+        const query = `
+        select * from PLACES
+        order by id
+        `
+        wazedb.all(query, async function (err, rows) {
+          if (err) reject(err)
+
+          resolve(rows)
+        })
+      } catch (e) {
+        reject(e)
+      }
+  })
+}

+ 69 - 0
tools/reports/waze_recents.js

@@ -0,0 +1,69 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const database = fileHash('Documents/user.db', 'AppDomain-com.waze.iphone')
+
+module.exports.name = 'waze_recents'
+module.exports.description = 'List Waze app recent destinations'
+
+// 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 reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  wazeReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: {
+          'Id': el => el.id,
+          'Name': el => el.name,
+          'Created Date': el => (new Date((el.created_time) * 1000).toDateString()) + ' ' + (new Date((el.created_time) * 1000).toTimeString()) ,
+          'Access Date': el => (new Date((el.access_time) * 1000).toDateString()) + ' ' + (new Date((el.access_time) * 1000).toTimeString()) ,
+          'Latitude': el => el.latitude / 1000000,
+          'Longitude': el => el.longitude / 1000000,
+          'Street': el => el.street,
+          'City': el => el.city,
+          'State': el => el.state,
+          'Country': el => el.country
+        }
+      })
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+function KeyValue (property, plist) {
+  this.key = property
+  this.value = plist[property] ? plist[property] : 'N/A'
+}
+
+const wazeReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var wazedb = backup.getDatabase(database)
+      try {
+        const query = `
+        select RECENTS.name, RECENTS.created_time, RECENTS.access_time, RECENTS.id, PLACES.latitude, PLACES.longitude, PLACES.street, PLACES.city, PLACES.state, PLACES.country from RECENTS
+        left join PLACES on RECENTS.place_id = PLACES.id
+        order by RECENTS.id
+        `
+        wazedb.all(query, async function (err, rows) {
+          if (err) reject(err)
+
+          resolve(rows)
+        })
+      } catch (e) {
+        reject(e)
+      }
+  })
+}