cookies.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Cookie Parser
  2. const cookieParser = require('../../util/cookies.js')
  3. module.exports = {
  4. version: 4,
  5. name: 'safari.cookies',
  6. description: `List all iOS cookies`,
  7. requiresBackup: true,
  8. // Run on a v3 lib / backup object
  9. run (lib, { backup }) {
  10. return new Promise(async (resolve, reject) => {
  11. let files = await lib.run('backup.files', { backup, raw: true })
  12. files = files.filter(el => {
  13. return el.filename.indexOf('Library/Cookies/Cookies.binarycookies') > -1
  14. })
  15. resolve(getCookies(backup, files))
  16. })
  17. },
  18. // Available fields.
  19. output: {
  20. domain: el => el.domain,
  21. url: el => el.cookie.url,
  22. path: el => el.cookie.name,
  23. value: el => el.cookie.value,
  24. creation: el => el.cookie.creation,
  25. expiration: el => el.cookie.expiration,
  26. flags: el => el.cookie.flags
  27. }
  28. }
  29. // Find all the cookies in a set of files in a backup
  30. function getCookies (backup, files) {
  31. return new Promise(async (resolve, reject) => {
  32. // Cookies result
  33. let cookiesResult = []
  34. const iterateElements = (elements, index, callback) => {
  35. if (index === elements.length) { return callback() }
  36. // do parse call with element
  37. var ele = elements[index]
  38. cookieParser.parse(backup.getFileName(ele.fileID))
  39. .then(cookies => {
  40. // Map to include domain
  41. let formatted = cookies.map(el => { return { domain: ele.domain, cookie: el } })
  42. // Append result
  43. cookiesResult = [...cookiesResult, ...formatted]
  44. // Next file.
  45. iterateElements(elements, index + 1, callback)
  46. })
  47. }
  48. iterateElements(files, 0, () => {
  49. resolve(cookiesResult)
  50. })
  51. })
  52. }