sqlite-cookie-parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +164 -0
  2. package/dist/bravoLinuxCookie.d.ts +5 -0
  3. package/dist/bravoLinuxCookie.js +12 -0
  4. package/dist/bravoLinuxCookie.js.map +1 -0
  5. package/dist/bravoMacCookie.d.ts +5 -0
  6. package/dist/bravoMacCookie.js +12 -0
  7. package/dist/bravoMacCookie.js.map +1 -0
  8. package/dist/bravoWindowsCookie.d.ts +5 -0
  9. package/dist/bravoWindowsCookie.js +12 -0
  10. package/dist/bravoWindowsCookie.js.map +1 -0
  11. package/dist/browsers/bravo.d.ts +5 -0
  12. package/dist/browsers/bravo.js +17 -0
  13. package/dist/browsers/bravo.js.map +1 -0
  14. package/dist/browsers/chrome.d.ts +5 -0
  15. package/dist/browsers/chrome.js +17 -0
  16. package/dist/browsers/chrome.js.map +1 -0
  17. package/dist/browsers/edge.d.ts +5 -0
  18. package/dist/browsers/edge.js +17 -0
  19. package/dist/browsers/edge.js.map +1 -0
  20. package/dist/browsers/firefoxCookie.d.ts +12 -0
  21. package/dist/browsers/firefoxCookie.js +8 -0
  22. package/dist/browsers/firefoxCookie.js.map +1 -0
  23. package/dist/browsers/opera.d.ts +5 -0
  24. package/dist/browsers/opera.js +17 -0
  25. package/dist/browsers/opera.js.map +1 -0
  26. package/dist/browsers/safariCookie.d.ts +12 -0
  27. package/dist/browsers/safariCookie.js +8 -0
  28. package/dist/browsers/safariCookie.js.map +1 -0
  29. package/dist/browsers/vivaldi.d.ts +5 -0
  30. package/dist/browsers/vivaldi.js +17 -0
  31. package/dist/browsers/vivaldi.js.map +1 -0
  32. package/dist/chromeLinuxCookie.d.ts +5 -0
  33. package/dist/chromeLinuxCookie.js +12 -0
  34. package/dist/chromeLinuxCookie.js.map +1 -0
  35. package/dist/chromeMacCookie.d.ts +5 -0
  36. package/dist/chromeMacCookie.js +12 -0
  37. package/dist/chromeMacCookie.js.map +1 -0
  38. package/dist/chromeWindowsCookie.d.ts +5 -0
  39. package/dist/chromeWindowsCookie.js +12 -0
  40. package/dist/chromeWindowsCookie.js.map +1 -0
  41. package/dist/chunk-2ILP4UJD.js +69 -0
  42. package/dist/chunk-2ILP4UJD.js.map +1 -0
  43. package/dist/chunk-4G6NLIPV.js +98 -0
  44. package/dist/chunk-4G6NLIPV.js.map +1 -0
  45. package/dist/chunk-5AEUDMIX.js +68 -0
  46. package/dist/chunk-5AEUDMIX.js.map +1 -0
  47. package/dist/chunk-5AJFPLWB.js +98 -0
  48. package/dist/chunk-5AJFPLWB.js.map +1 -0
  49. package/dist/chunk-6OYYWSIJ.js +58 -0
  50. package/dist/chunk-6OYYWSIJ.js.map +1 -0
  51. package/dist/chunk-A3YGBITD.js +221 -0
  52. package/dist/chunk-A3YGBITD.js.map +1 -0
  53. package/dist/chunk-AR5Q6KM4.js +37 -0
  54. package/dist/chunk-AR5Q6KM4.js.map +1 -0
  55. package/dist/chunk-D23AYBOE.js +35 -0
  56. package/dist/chunk-D23AYBOE.js.map +1 -0
  57. package/dist/chunk-E6CQFEXM.js +98 -0
  58. package/dist/chunk-E6CQFEXM.js.map +1 -0
  59. package/dist/chunk-EPL3V4O3.js +41 -0
  60. package/dist/chunk-EPL3V4O3.js.map +1 -0
  61. package/dist/chunk-EZBYP7NP.js +58 -0
  62. package/dist/chunk-EZBYP7NP.js.map +1 -0
  63. package/dist/chunk-GRIZYEBN.js +58 -0
  64. package/dist/chunk-GRIZYEBN.js.map +1 -0
  65. package/dist/chunk-HOGGS6QP.js +35 -0
  66. package/dist/chunk-HOGGS6QP.js.map +1 -0
  67. package/dist/chunk-IXZPT56H.js +35 -0
  68. package/dist/chunk-IXZPT56H.js.map +1 -0
  69. package/dist/chunk-J2UYSXFG.js +69 -0
  70. package/dist/chunk-J2UYSXFG.js.map +1 -0
  71. package/dist/chunk-JTBFDYPY.js +244 -0
  72. package/dist/chunk-JTBFDYPY.js.map +1 -0
  73. package/dist/chunk-LTLRZZW3.js +41 -0
  74. package/dist/chunk-LTLRZZW3.js.map +1 -0
  75. package/dist/chunk-MLKERL3L.js +98 -0
  76. package/dist/chunk-MLKERL3L.js.map +1 -0
  77. package/dist/chunk-NGBAATI3.js +35 -0
  78. package/dist/chunk-NGBAATI3.js.map +1 -0
  79. package/dist/chunk-PT5JK5UI.js +98 -0
  80. package/dist/chunk-PT5JK5UI.js.map +1 -0
  81. package/dist/chunk-Q2LDNBEA.js +35 -0
  82. package/dist/chunk-Q2LDNBEA.js.map +1 -0
  83. package/dist/chunk-QCW7AUP6.js +62 -0
  84. package/dist/chunk-QCW7AUP6.js.map +1 -0
  85. package/dist/chunk-SRZIPU62.js +69 -0
  86. package/dist/chunk-SRZIPU62.js.map +1 -0
  87. package/dist/chunk-SSXWHBKV.js +69 -0
  88. package/dist/chunk-SSXWHBKV.js.map +1 -0
  89. package/dist/chunk-TWA6YYS5.js +58 -0
  90. package/dist/chunk-TWA6YYS5.js.map +1 -0
  91. package/dist/chunk-TYLH6G3Z.js +52 -0
  92. package/dist/chunk-TYLH6G3Z.js.map +1 -0
  93. package/dist/chunk-U4G74MHA.js +69 -0
  94. package/dist/chunk-U4G74MHA.js.map +1 -0
  95. package/dist/chunk-UR6BPQ2T.js +103 -0
  96. package/dist/chunk-UR6BPQ2T.js.map +1 -0
  97. package/dist/chunk-XDL34EPI.js +35 -0
  98. package/dist/chunk-XDL34EPI.js.map +1 -0
  99. package/dist/chunk-YD3PNZMV.js +447 -0
  100. package/dist/chunk-YD3PNZMV.js.map +1 -0
  101. package/dist/common.d.ts +15 -0
  102. package/dist/common.js +9 -0
  103. package/dist/common.js.map +1 -0
  104. package/dist/edgeLinuxCookie.d.ts +5 -0
  105. package/dist/edgeLinuxCookie.js +12 -0
  106. package/dist/edgeLinuxCookie.js.map +1 -0
  107. package/dist/edgeMacCookie.d.ts +5 -0
  108. package/dist/edgeMacCookie.js +12 -0
  109. package/dist/edgeMacCookie.js.map +1 -0
  110. package/dist/edgeWindowsCookie.d.ts +5 -0
  111. package/dist/edgeWindowsCookie.js +12 -0
  112. package/dist/edgeWindowsCookie.js.map +1 -0
  113. package/dist/index.d.ts +2 -0
  114. package/dist/index.js +38 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/operaLinuxCookie.d.ts +5 -0
  117. package/dist/operaLinuxCookie.js +12 -0
  118. package/dist/operaLinuxCookie.js.map +1 -0
  119. package/dist/operaMacCookie.d.ts +5 -0
  120. package/dist/operaMacCookie.js +12 -0
  121. package/dist/operaMacCookie.js.map +1 -0
  122. package/dist/operaWindowsCookie.d.ts +5 -0
  123. package/dist/operaWindowsCookie.js +12 -0
  124. package/dist/operaWindowsCookie.js.map +1 -0
  125. package/dist/publicApi.d.ts +20 -0
  126. package/dist/publicApi.js +38 -0
  127. package/dist/publicApi.js.map +1 -0
  128. package/dist/types.d.ts +98 -0
  129. package/dist/types.js +1 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/util/crypto.d.ts +9 -0
  132. package/dist/util/crypto.js +11 -0
  133. package/dist/util/crypto.js.map +1 -0
  134. package/dist/util/fileHelper.d.ts +4 -0
  135. package/dist/util/fileHelper.js +9 -0
  136. package/dist/util/fileHelper.js.map +1 -0
  137. package/dist/util/linuxKeyring.d.ts +11 -0
  138. package/dist/util/linuxKeyring.js +8 -0
  139. package/dist/util/linuxKeyring.js.map +1 -0
  140. package/dist/util/macKeyChain.d.ts +16 -0
  141. package/dist/util/macKeyChain.js +10 -0
  142. package/dist/util/macKeyChain.js.map +1 -0
  143. package/dist/util/processExecutor.d.ts +7 -0
  144. package/dist/util/processExecutor.js +7 -0
  145. package/dist/util/processExecutor.js.map +1 -0
  146. package/dist/util/windowsDpapi.d.ts +9 -0
  147. package/dist/util/windowsDpapi.js +8 -0
  148. package/dist/util/windowsDpapi.js.map +1 -0
  149. package/dist/vivaldiLinuxCookie.d.ts +5 -0
  150. package/dist/vivaldiLinuxCookie.js +12 -0
  151. package/dist/vivaldiLinuxCookie.js.map +1 -0
  152. package/dist/vivaldiMacCookie.d.ts +5 -0
  153. package/dist/vivaldiMacCookie.js +12 -0
  154. package/dist/vivaldiMacCookie.js.map +1 -0
  155. package/dist/vivaldiWindowsCookie.d.ts +5 -0
  156. package/dist/vivaldiWindowsCookie.js +12 -0
  157. package/dist/vivaldiWindowsCookie.js.map +1 -0
  158. package/package.json +56 -0
@@ -0,0 +1,62 @@
1
+ import {
2
+ findLinuxChromiumPassword
3
+ } from "./chunk-EPL3V4O3.js";
4
+ import {
5
+ decryptChomiumAES128CBCCookieValue,
6
+ getAES128CBCKey
7
+ } from "./chunk-UR6BPQ2T.js";
8
+ import {
9
+ resolveBrowserDefaultorSpecificDBPath
10
+ } from "./chunk-TYLH6G3Z.js";
11
+ import {
12
+ getCookiesFromChromiumSqliteDB
13
+ } from "./chunk-JTBFDYPY.js";
14
+
15
+ // src/edgeLinuxCookie.ts
16
+ import { homedir } from "os";
17
+ async function getCookiesFromEdgeLinuxSqlite(options, origins, cookieNames) {
18
+ const sqlDBPath = resolveEdgeLinuxDBPath(options.profile);
19
+ if (!sqlDBPath) {
20
+ return {
21
+ cookies: [],
22
+ warnings: ["Could not resolve Edge cookie database path on Linux."]
23
+ };
24
+ }
25
+ const warnings = [];
26
+ const passwordResult = await findLinuxChromiumPassword(
27
+ "chromium",
28
+ "Microsoft Edge Safe Storage",
29
+ 5e3
30
+ );
31
+ if (passwordResult.warnings.length > 0) {
32
+ warnings.push(...passwordResult.warnings);
33
+ }
34
+ const key = getAES128CBCKey(passwordResult.password, 1);
35
+ const decryptFn = (encryptedValue) => {
36
+ return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);
37
+ };
38
+ const fileOptions = {
39
+ cookieFilePath: sqlDBPath
40
+ };
41
+ fileOptions.profile = options.profile;
42
+ fileOptions.includeExpired = options.includeExpired;
43
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
44
+ fileOptions,
45
+ origins,
46
+ cookieNames,
47
+ "edge",
48
+ decryptFn
49
+ );
50
+ warnings.push(...dbWarnings);
51
+ return { cookies, warnings };
52
+ }
53
+ function resolveEdgeLinuxDBPath(profile) {
54
+ const homeDir = homedir();
55
+ const roots = [`${homeDir}/.config/microsoft-edge`];
56
+ return resolveBrowserDefaultorSpecificDBPath(roots, profile);
57
+ }
58
+
59
+ export {
60
+ getCookiesFromEdgeLinuxSqlite
61
+ };
62
+ //# sourceMappingURL=chunk-QCW7AUP6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edgeLinuxCookie.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { getAES128CBCKey, decryptChomiumAES128CBCCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\nimport { findLinuxChromiumPassword } from './util/linuxKeyring';\n\nexport async function getCookiesFromEdgeLinuxSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveEdgeLinuxDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Edge cookie database path on Linux.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findLinuxChromiumPassword(\n 'chromium',\n 'Microsoft Edge Safe Storage',\n 5000\n );\n if (passwordResult.warnings.length > 0) {\n warnings.push(...passwordResult.warnings);\n }\n\n // iterations is 1 for Linux Edge (same as Linux Chrome)\n const key = getAES128CBCKey(passwordResult.password, 1);\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);\n };\n\n const fileOptions: GetCookiesFromFileOptions = {\n cookieFilePath: sqlDBPath,\n };\n fileOptions.profile = options.profile;\n fileOptions.includeExpired = options.includeExpired;\n\n const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(\n fileOptions,\n origins,\n cookieNames,\n 'edge',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveEdgeLinuxDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const roots = [`${homeDir}/.config/microsoft-edge`];\n return resolveBrowserDefaultorSpecificDBPath(roots, profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAOxB,eAAsB,8BACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,uBAAuB,QAAQ,OAAO;AACxD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,uDAAuD;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,eAAe,SAAS,SAAS,GAAG;AACtC,aAAS,KAAK,GAAG,eAAe,QAAQ;AAAA,EAC1C;AAGA,QAAM,MAAM,gBAAgB,eAAe,UAAU,CAAC;AACtD,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,mCAAmC,gBAAgB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,cAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,cAAY,UAAU,QAAQ;AAC9B,cAAY,iBAAiB,QAAQ;AAErC,QAAM,EAAE,SAAS,UAAU,WAAW,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,KAAK,GAAG,UAAU;AAE3B,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,uBAAuB,SAAiC;AAC/D,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,CAAC,GAAG,OAAO,yBAAyB;AAClD,SAAO,sCAAsC,OAAO,OAAO;AAC7D;","names":[]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ findFirstMacKeyChainPassword
3
+ } from "./chunk-Q2LDNBEA.js";
4
+ import {
5
+ decryptChomiumAES128CBCCookieValue,
6
+ getAES128CBCKey
7
+ } from "./chunk-UR6BPQ2T.js";
8
+ import {
9
+ resolveBrowserDefaultorSpecificDBPath
10
+ } from "./chunk-TYLH6G3Z.js";
11
+ import {
12
+ getCookiesFromChromiumSqliteDB
13
+ } from "./chunk-JTBFDYPY.js";
14
+
15
+ // src/edgeMacCookie.ts
16
+ import { homedir } from "os";
17
+ async function getCookiesFromEdgeSqlite(options, origins, cookieNames) {
18
+ const sqlDBPath = resolveEdgeDBPath(options.profile);
19
+ if (!sqlDBPath) {
20
+ return {
21
+ cookies: [],
22
+ warnings: ["Could not resolve Edge cookie database path."]
23
+ };
24
+ }
25
+ const warnings = [];
26
+ const passwordResult = await findFirstMacKeyChainPassword(
27
+ ["Microsoft Edge Safe Storage", "Microsoft Edge"],
28
+ "Microsoft Edge",
29
+ 5e3,
30
+ "Microsoft Edge Safe Storage"
31
+ );
32
+ if (!passwordResult.success) {
33
+ warnings.push(`Failed to get Edge decryption key: ${passwordResult.error}`);
34
+ return { cookies: [], warnings };
35
+ }
36
+ const edgePassword = passwordResult.password.trim();
37
+ if (!edgePassword) {
38
+ warnings.push("Edge decryption key is empty.");
39
+ return { cookies: [], warnings };
40
+ }
41
+ const key = getAES128CBCKey(edgePassword, 1003);
42
+ const decryptFn = (encryptedValue) => {
43
+ return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);
44
+ };
45
+ const fileOptions = {
46
+ cookieFilePath: sqlDBPath
47
+ };
48
+ fileOptions.profile = options.profile;
49
+ fileOptions.includeExpired = options.includeExpired;
50
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
51
+ fileOptions,
52
+ origins,
53
+ cookieNames,
54
+ "edge",
55
+ decryptFn
56
+ );
57
+ warnings.push(...dbWarnings);
58
+ return { cookies, warnings };
59
+ }
60
+ function resolveEdgeDBPath(profile) {
61
+ const homeDir = homedir();
62
+ const rootPath = `${homeDir}/Library/Application Support/Microsoft Edge`;
63
+ return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);
64
+ }
65
+
66
+ export {
67
+ getCookiesFromEdgeSqlite
68
+ };
69
+ //# sourceMappingURL=chunk-SRZIPU62.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edgeMacCookie.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { homedir } from 'os';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { findFirstMacKeyChainPassword } from './util/macKeyChain';\nimport { getAES128CBCKey, decryptChomiumAES128CBCCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\n\nexport async function getCookiesFromEdgeSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveEdgeDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Edge cookie database path.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findFirstMacKeyChainPassword(\n ['Microsoft Edge Safe Storage', 'Microsoft Edge'],\n 'Microsoft Edge',\n 5000,\n 'Microsoft Edge Safe Storage'\n );\n if (!passwordResult.success) {\n warnings.push(`Failed to get Edge decryption key: ${passwordResult.error}`);\n return { cookies: [], warnings };\n }\n\n const edgePassword = passwordResult.password.trim();\n if (!edgePassword) {\n warnings.push('Edge decryption key is empty.');\n return { cookies: [], warnings };\n }\n\n // iterations is 1003 for macOS Edge (same as Chrome)\n const key = getAES128CBCKey(edgePassword, 1003);\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);\n };\n\n const fileOptions: GetCookiesFromFileOptions = {\n cookieFilePath: sqlDBPath,\n };\n fileOptions.profile = options.profile;\n fileOptions.includeExpired = options.includeExpired;\n\n const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(\n fileOptions,\n origins,\n cookieNames,\n 'edge',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveEdgeDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const rootPath = `${homeDir}/Library/Application Support/Microsoft Edge`;\n return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AACA,SAAS,eAAe;AAMxB,eAAsB,yBACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,kBAAkB,QAAQ,OAAO;AACnD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,8CAA8C;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,+BAA+B,gBAAgB;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,eAAe,SAAS;AAC3B,aAAS,KAAK,sCAAsC,eAAe,KAAK,EAAE;AAC1E,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,eAAe,eAAe,SAAS,KAAK;AAClD,MAAI,CAAC,cAAc;AACjB,aAAS,KAAK,+BAA+B;AAC7C,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAGA,QAAM,MAAM,gBAAgB,cAAc,IAAI;AAC9C,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,mCAAmC,gBAAgB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,cAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,cAAY,UAAU,QAAQ;AAC9B,cAAY,iBAAiB,QAAQ;AAErC,QAAM,EAAE,SAAS,UAAU,WAAW,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,KAAK,GAAG,UAAU;AAE3B,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,kBAAkB,SAAiC;AAC1D,QAAM,UAAU,QAAQ;AACxB,QAAM,WAAW,GAAG,OAAO;AAC3B,SAAO,sCAAsC,CAAC,QAAQ,GAAG,OAAO;AAClE;","names":[]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ findFirstMacKeyChainPassword
3
+ } from "./chunk-Q2LDNBEA.js";
4
+ import {
5
+ decryptChomiumAES128CBCCookieValue,
6
+ getAES128CBCKey
7
+ } from "./chunk-UR6BPQ2T.js";
8
+ import {
9
+ resolveBrowserDefaultorSpecificDBPath
10
+ } from "./chunk-TYLH6G3Z.js";
11
+ import {
12
+ getCookiesFromChromiumSqliteDB
13
+ } from "./chunk-JTBFDYPY.js";
14
+
15
+ // src/bravoMacCookie.ts
16
+ import { homedir } from "os";
17
+ async function getCookiesFromBraveMacSqlite(options, origins, cookieNames) {
18
+ const sqlDBPath = resolveBraveMacDBPath(options.profile);
19
+ if (!sqlDBPath) {
20
+ return {
21
+ cookies: [],
22
+ warnings: ["Could not resolve Brave cookie database path."]
23
+ };
24
+ }
25
+ const warnings = [];
26
+ const passwordResult = await findFirstMacKeyChainPassword(
27
+ ["Brave Safe Storage"],
28
+ "Brave",
29
+ 5e3,
30
+ "Brave Safe Storage"
31
+ );
32
+ if (!passwordResult.success) {
33
+ warnings.push(`Failed to get Brave decryption key: ${passwordResult.error}`);
34
+ return { cookies: [], warnings };
35
+ }
36
+ const bravePassword = passwordResult.password.trim();
37
+ if (!bravePassword) {
38
+ warnings.push("Brave decryption key is empty.");
39
+ return { cookies: [], warnings };
40
+ }
41
+ const key = getAES128CBCKey(bravePassword, 1003);
42
+ const decryptFn = (encryptedValue) => {
43
+ return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);
44
+ };
45
+ const fileOptions = {
46
+ cookieFilePath: sqlDBPath
47
+ };
48
+ fileOptions.profile = options.profile;
49
+ fileOptions.includeExpired = options.includeExpired;
50
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
51
+ fileOptions,
52
+ origins,
53
+ cookieNames,
54
+ "brave",
55
+ decryptFn
56
+ );
57
+ warnings.push(...dbWarnings);
58
+ return { cookies, warnings };
59
+ }
60
+ function resolveBraveMacDBPath(profile) {
61
+ const homeDir = homedir();
62
+ const rootPath = `${homeDir}/Library/Application Support/BraveSoftware/Brave-Browser`;
63
+ return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);
64
+ }
65
+
66
+ export {
67
+ getCookiesFromBraveMacSqlite
68
+ };
69
+ //# sourceMappingURL=chunk-SSXWHBKV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bravoMacCookie.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { findFirstMacKeyChainPassword } from './util/macKeyChain';\nimport { getAES128CBCKey, decryptChomiumAES128CBCCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\n\nexport async function getCookiesFromBraveMacSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveBraveMacDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Brave cookie database path.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findFirstMacKeyChainPassword(\n ['Brave Safe Storage'],\n 'Brave',\n 5000,\n 'Brave Safe Storage'\n );\n if (!passwordResult.success) {\n warnings.push(`Failed to get Brave decryption key: ${passwordResult.error}`);\n return { cookies: [], warnings };\n }\n\n const bravePassword = passwordResult.password.trim();\n if (!bravePassword) {\n warnings.push('Brave decryption key is empty.');\n return { cookies: [], warnings };\n }\n\n // iterations is 1003 for macOS Brave (same as Chrome)\n const key = getAES128CBCKey(bravePassword, 1003);\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);\n };\n\n const fileOptions: GetCookiesFromFileOptions = {\n cookieFilePath: sqlDBPath,\n };\n fileOptions.profile = options.profile;\n fileOptions.includeExpired = options.includeExpired;\n\n const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(\n fileOptions,\n origins,\n cookieNames,\n 'brave',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveBraveMacDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const rootPath = `${homeDir}/Library/Application Support/BraveSoftware/Brave-Browser`;\n return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAOxB,eAAsB,6BACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,sBAAsB,QAAQ,OAAO;AACvD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,+CAA+C;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,oBAAoB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,eAAe,SAAS;AAC3B,aAAS,KAAK,uCAAuC,eAAe,KAAK,EAAE;AAC3E,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,gBAAgB,eAAe,SAAS,KAAK;AACnD,MAAI,CAAC,eAAe;AAClB,aAAS,KAAK,gCAAgC;AAC9C,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAGA,QAAM,MAAM,gBAAgB,eAAe,IAAI;AAC/C,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,mCAAmC,gBAAgB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,cAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,cAAY,UAAU,QAAQ;AAC9B,cAAY,iBAAiB,QAAQ;AAErC,QAAM,EAAE,SAAS,UAAU,WAAW,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,KAAK,GAAG,UAAU;AAE3B,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,sBAAsB,SAAiC;AAC9D,QAAM,UAAU,QAAQ;AACxB,QAAM,WAAW,GAAG,OAAO;AAC3B,SAAO,sCAAsC,CAAC,QAAQ,GAAG,OAAO;AAClE;","names":[]}
@@ -0,0 +1,58 @@
1
+ import {
2
+ findLinuxChromiumPassword
3
+ } from "./chunk-EPL3V4O3.js";
4
+ import {
5
+ decryptChomiumAES128CBCCookieValue,
6
+ getAES128CBCKey
7
+ } from "./chunk-UR6BPQ2T.js";
8
+ import {
9
+ resolveBrowserDefaultorSpecificDBPath
10
+ } from "./chunk-TYLH6G3Z.js";
11
+ import {
12
+ getCookiesFromChromiumSqliteDB
13
+ } from "./chunk-JTBFDYPY.js";
14
+
15
+ // src/operaLinuxCookie.ts
16
+ import { homedir } from "os";
17
+ async function getCookiesFromOperaLinuxSqlite(options, origins, cookieNames) {
18
+ const sqlDBPath = resolveOperaLinuxDBPath(options.profile);
19
+ if (!sqlDBPath) {
20
+ return {
21
+ cookies: [],
22
+ warnings: ["Could not resolve Opera cookie database path on Linux."]
23
+ };
24
+ }
25
+ const warnings = [];
26
+ const passwordResult = await findLinuxChromiumPassword("opera", "Opera Safe Storage", 5e3);
27
+ if (passwordResult.warnings.length > 0) {
28
+ warnings.push(...passwordResult.warnings);
29
+ }
30
+ const key = getAES128CBCKey(passwordResult.password, 1);
31
+ const decryptFn = (encryptedValue) => {
32
+ return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);
33
+ };
34
+ const fileOptions = {
35
+ cookieFilePath: sqlDBPath
36
+ };
37
+ fileOptions.profile = options.profile;
38
+ fileOptions.includeExpired = options.includeExpired;
39
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
40
+ fileOptions,
41
+ origins,
42
+ cookieNames,
43
+ "opera",
44
+ decryptFn
45
+ );
46
+ warnings.push(...dbWarnings);
47
+ return { cookies, warnings };
48
+ }
49
+ function resolveOperaLinuxDBPath(profile) {
50
+ const homeDir = homedir();
51
+ const roots = [`${homeDir}/.config/opera`];
52
+ return resolveBrowserDefaultorSpecificDBPath(roots, profile);
53
+ }
54
+
55
+ export {
56
+ getCookiesFromOperaLinuxSqlite
57
+ };
58
+ //# sourceMappingURL=chunk-TWA6YYS5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/operaLinuxCookie.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { getAES128CBCKey, decryptChomiumAES128CBCCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\nimport { findLinuxChromiumPassword } from './util/linuxKeyring';\n\nexport async function getCookiesFromOperaLinuxSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveOperaLinuxDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Opera cookie database path on Linux.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findLinuxChromiumPassword('opera', 'Opera Safe Storage', 5000);\n if (passwordResult.warnings.length > 0) {\n warnings.push(...passwordResult.warnings);\n }\n\n // iterations is 1 for Linux Opera (same as Linux Chrome)\n const key = getAES128CBCKey(passwordResult.password, 1);\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);\n };\n\n const fileOptions: GetCookiesFromFileOptions = {\n cookieFilePath: sqlDBPath,\n };\n fileOptions.profile = options.profile;\n fileOptions.includeExpired = options.includeExpired;\n\n const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(\n fileOptions,\n origins,\n cookieNames,\n 'opera',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveOperaLinuxDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const roots = [`${homeDir}/.config/opera`];\n return resolveBrowserDefaultorSpecificDBPath(roots, profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAOxB,eAAsB,+BACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,wBAAwB,QAAQ,OAAO;AACzD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,wDAAwD;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM,0BAA0B,SAAS,sBAAsB,GAAI;AAC1F,MAAI,eAAe,SAAS,SAAS,GAAG;AACtC,aAAS,KAAK,GAAG,eAAe,QAAQ;AAAA,EAC1C;AAGA,QAAM,MAAM,gBAAgB,eAAe,UAAU,CAAC;AACtD,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,mCAAmC,gBAAgB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,cAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,cAAY,UAAU,QAAQ;AAC9B,cAAY,iBAAiB,QAAQ;AAErC,QAAM,EAAE,SAAS,UAAU,WAAW,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,KAAK,GAAG,UAAU;AAE3B,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,wBAAwB,SAAiC;AAChE,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,CAAC,GAAG,OAAO,gBAAgB;AACzC,SAAO,sCAAsC,OAAO,OAAO;AAC7D;","names":[]}
@@ -0,0 +1,52 @@
1
+ // src/util/fileHelper.ts
2
+ import path from "path";
3
+ import { homedir } from "os";
4
+ import { existsSync, statSync } from "fs";
5
+ function normalizePath(pathStr) {
6
+ if (pathStr.startsWith("~/")) {
7
+ return path.join(homedir(), pathStr.slice(2));
8
+ }
9
+ if (path.isAbsolute(pathStr)) {
10
+ return pathStr;
11
+ }
12
+ return path.resolve(process.cwd(), pathStr);
13
+ }
14
+ function resolveBrowserDefaultorSpecificDBPath(roots, profile) {
15
+ const candidates = [];
16
+ let isProfileDir = false;
17
+ profile = profile?.trim();
18
+ if (profile) {
19
+ const stat = statSync(profile, { throwIfNoEntry: false });
20
+ if (stat && stat.isFile()) {
21
+ return profile;
22
+ }
23
+ if (stat && stat.isDirectory()) {
24
+ isProfileDir = true;
25
+ const candidate1 = path.join(profile, "Cookies");
26
+ candidates.push(candidate1);
27
+ const candidate2 = path.join(profile, "Network", "Cookies");
28
+ candidates.push(candidate2);
29
+ }
30
+ }
31
+ if (!isProfileDir) {
32
+ const profileDir = profile || "Default";
33
+ for (const root of roots) {
34
+ const candidate1 = path.join(root, profileDir, "Cookies");
35
+ candidates.push(candidate1);
36
+ const candidate2 = path.join(root, profileDir, "Network", "Cookies");
37
+ candidates.push(candidate2);
38
+ }
39
+ }
40
+ for (const candidate of candidates) {
41
+ if (existsSync(candidate)) {
42
+ return candidate;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+
48
+ export {
49
+ normalizePath,
50
+ resolveBrowserDefaultorSpecificDBPath
51
+ };
52
+ //# sourceMappingURL=chunk-TYLH6G3Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/fileHelper.ts"],"sourcesContent":["import path from 'path';\nimport { homedir } from 'os';\nimport { existsSync, statSync } from 'fs';\n\nexport function normalizePath(pathStr: string): string {\n if (pathStr.startsWith('~/')) {\n return path.join(homedir(), pathStr.slice(2));\n }\n if (path.isAbsolute(pathStr)) {\n return pathStr;\n }\n return path.resolve(process.cwd(), pathStr);\n}\n\nexport function resolveBrowserDefaultorSpecificDBPath(\n roots: string[],\n profile?: string\n): string | null {\n const candidates: string[] = [];\n let isProfileDir = false;\n profile = profile?.trim();\n if (profile) {\n const stat = statSync(profile, { throwIfNoEntry: false });\n if (stat && stat.isFile()) {\n return profile;\n }\n if (stat && stat.isDirectory()) {\n isProfileDir = true;\n const candidate1 = path.join(profile, 'Cookies');\n candidates.push(candidate1);\n const candidate2 = path.join(profile, 'Network', 'Cookies');\n candidates.push(candidate2);\n }\n }\n if (!isProfileDir) {\n const profileDir = profile || 'Default';\n for (const root of roots) {\n const candidate1 = path.join(root, profileDir, 'Cookies');\n candidates.push(candidate1);\n const candidate2 = path.join(root, profileDir, 'Network', 'Cookies');\n candidates.push(candidate2);\n }\n }\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,SAAS,eAAe;AACxB,SAAS,YAAY,gBAAgB;AAE9B,SAAS,cAAc,SAAyB;AACrD,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,WAAO,KAAK,KAAK,QAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC9C;AACA,MAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO;AAC5C;AAEO,SAAS,sCACd,OACA,SACe;AACf,QAAM,aAAuB,CAAC;AAC9B,MAAI,eAAe;AACnB,YAAU,SAAS,KAAK;AACxB,MAAI,SAAS;AACX,UAAM,OAAO,SAAS,SAAS,EAAE,gBAAgB,MAAM,CAAC;AACxD,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,KAAK,YAAY,GAAG;AAC9B,qBAAe;AACf,YAAM,aAAa,KAAK,KAAK,SAAS,SAAS;AAC/C,iBAAW,KAAK,UAAU;AAC1B,YAAM,aAAa,KAAK,KAAK,SAAS,WAAW,SAAS;AAC1D,iBAAW,KAAK,UAAU;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,CAAC,cAAc;AACjB,UAAM,aAAa,WAAW;AAC9B,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,KAAK,KAAK,MAAM,YAAY,SAAS;AACxD,iBAAW,KAAK,UAAU;AAC1B,YAAM,aAAa,KAAK,KAAK,MAAM,YAAY,WAAW,SAAS;AACnE,iBAAW,KAAK,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ findFirstMacKeyChainPassword
3
+ } from "./chunk-Q2LDNBEA.js";
4
+ import {
5
+ decryptChomiumAES128CBCCookieValue,
6
+ getAES128CBCKey
7
+ } from "./chunk-UR6BPQ2T.js";
8
+ import {
9
+ resolveBrowserDefaultorSpecificDBPath
10
+ } from "./chunk-TYLH6G3Z.js";
11
+ import {
12
+ getCookiesFromChromiumSqliteDB
13
+ } from "./chunk-JTBFDYPY.js";
14
+
15
+ // src/chromeMacCookie.ts
16
+ import { homedir } from "os";
17
+ async function getCookiesFromChromeSqlite(options, origins, cookieNames) {
18
+ const sqlDBPath = resolveChromeDBPath(options.profile);
19
+ if (!sqlDBPath) {
20
+ return {
21
+ cookies: [],
22
+ warnings: ["Could not resolve Chrome cookie database path."]
23
+ };
24
+ }
25
+ const warnings = [];
26
+ const passwordResult = await findFirstMacKeyChainPassword(
27
+ ["Chrome Safe Storage"],
28
+ "Chrome",
29
+ 5e3,
30
+ "Chrome Safe Storage"
31
+ );
32
+ if (!passwordResult.success) {
33
+ warnings.push(`Failed to get Chrome decryption key: ${passwordResult.error}`);
34
+ return { cookies: [], warnings };
35
+ }
36
+ const chromePassword = passwordResult.password.trim();
37
+ if (!chromePassword) {
38
+ warnings.push("Chrome decryption key is empty.");
39
+ return { cookies: [], warnings };
40
+ }
41
+ const key = getAES128CBCKey(chromePassword, 1003);
42
+ const decryptFn = (encryptedValue) => {
43
+ return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);
44
+ };
45
+ const fileOptions = {
46
+ cookieFilePath: sqlDBPath
47
+ };
48
+ fileOptions.profile = options.profile;
49
+ fileOptions.includeExpired = options.includeExpired;
50
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
51
+ fileOptions,
52
+ origins,
53
+ cookieNames,
54
+ "chrome",
55
+ decryptFn
56
+ );
57
+ warnings.push(...dbWarnings);
58
+ return { cookies, warnings };
59
+ }
60
+ function resolveChromeDBPath(profile) {
61
+ const homeDir = homedir();
62
+ const rootPath = `${homeDir}/Library/Application Support/Google/Chrome`;
63
+ return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);
64
+ }
65
+
66
+ export {
67
+ getCookiesFromChromeSqlite
68
+ };
69
+ //# sourceMappingURL=chunk-U4G74MHA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chromeMacCookie.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { findFirstMacKeyChainPassword } from './util/macKeyChain';\nimport { getAES128CBCKey, decryptChomiumAES128CBCCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\n\nexport async function getCookiesFromChromeSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveChromeDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Chrome cookie database path.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findFirstMacKeyChainPassword(\n ['Chrome Safe Storage'],\n 'Chrome',\n 5000,\n 'Chrome Safe Storage'\n );\n if (!passwordResult.success) {\n warnings.push(`Failed to get Chrome decryption key: ${passwordResult.error}`);\n return { cookies: [], warnings };\n }\n\n const chromePassword = passwordResult.password.trim();\n if (!chromePassword) {\n warnings.push('Chrome decryption key is empty.');\n return { cookies: [], warnings };\n }\n\n // iterations is 1003 for macOS Chrome\n const key = getAES128CBCKey(chromePassword, 1003);\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChomiumAES128CBCCookieValue(encryptedValue, [key]);\n };\n\n const fileOptions: GetCookiesFromFileOptions = {\n cookieFilePath: sqlDBPath,\n };\n fileOptions.profile = options.profile;\n fileOptions.includeExpired = options.includeExpired;\n\n const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(\n fileOptions,\n origins,\n cookieNames,\n 'chrome',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveChromeDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const rootPath = `${homeDir}/Library/Application Support/Google/Chrome`;\n return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAOxB,eAAsB,2BACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,oBAAoB,QAAQ,OAAO;AACrD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,gDAAgD;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,qBAAqB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,eAAe,SAAS;AAC3B,aAAS,KAAK,wCAAwC,eAAe,KAAK,EAAE;AAC5E,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,iBAAiB,eAAe,SAAS,KAAK;AACpD,MAAI,CAAC,gBAAgB;AACnB,aAAS,KAAK,iCAAiC;AAC/C,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAGA,QAAM,MAAM,gBAAgB,gBAAgB,IAAI;AAChD,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,mCAAmC,gBAAgB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,cAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,cAAY,UAAU,QAAQ;AAC9B,cAAY,iBAAiB,QAAQ;AAErC,QAAM,EAAE,SAAS,UAAU,WAAW,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,KAAK,GAAG,UAAU;AAE3B,SAAO,EAAE,SAAS,SAAS;AAC7B;AAEA,SAAS,oBAAoB,SAAiC;AAC5D,QAAM,UAAU,QAAQ;AACxB,QAAM,WAAW,GAAG,OAAO;AAC3B,SAAO,sCAAsC,CAAC,QAAQ,GAAG,OAAO;AAClE;","names":[]}
@@ -0,0 +1,103 @@
1
+ // src/util/crypto.ts
2
+ import { createDecipheriv, pbkdf2Sync } from "crypto";
3
+ var UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
4
+ function getAES128CBCKey(password, iterations) {
5
+ const key = pbkdf2Sync(password, "saltysalt", iterations, 16, "sha1");
6
+ return key;
7
+ }
8
+ function decryptChomiumAES128CBCCookieValue(encryptedValue, keyCandidates) {
9
+ const buffer = Buffer.from(encryptedValue);
10
+ if (buffer.length < 3) {
11
+ return null;
12
+ }
13
+ const prefix = buffer.subarray(0, 3).toString("utf8");
14
+ const hasPrefix = prefix === "v10" || prefix === "v11";
15
+ if (!hasPrefix) {
16
+ return decodeCookieValue(buffer, false);
17
+ }
18
+ const text = buffer.subarray(3);
19
+ if (!text.length) {
20
+ return "";
21
+ }
22
+ for (const key of keyCandidates) {
23
+ const decryptedBuffer = tryDecryptAES128CBC(text, key);
24
+ if (!decryptedBuffer) {
25
+ continue;
26
+ }
27
+ const decryptedValue = decodeCookieValue(decryptedBuffer, true);
28
+ if (decryptedValue !== null) {
29
+ return decryptedValue;
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ function tryDecryptAES128CBC(text, key) {
35
+ try {
36
+ const iv = Buffer.alloc(16, " ");
37
+ const decipher = createDecipheriv("aes-128-cbc", key, iv);
38
+ decipher.setAutoPadding(false);
39
+ let decrypted = Buffer.concat([decipher.update(text), decipher.final()]);
40
+ const paddingLength = decrypted[decrypted.length - 1];
41
+ if (paddingLength > 0 && paddingLength <= 16) {
42
+ decrypted = decrypted.subarray(0, decrypted.length - paddingLength);
43
+ }
44
+ return decrypted;
45
+ } catch (error) {
46
+ return null;
47
+ }
48
+ }
49
+ function decodeCookieValue(value, removePrefix = true) {
50
+ const bytes = removePrefix && value.length >= 32 ? value.subarray(32) : value;
51
+ let decrypted;
52
+ try {
53
+ decrypted = UTF8_DECODER.decode(bytes);
54
+ } catch (error) {
55
+ return null;
56
+ }
57
+ return removeLeadingControlChars(decrypted);
58
+ }
59
+ function removeLeadingControlChars(value) {
60
+ let index = 0;
61
+ while (index < value.length && value.charCodeAt(index) <= 31) {
62
+ index++;
63
+ }
64
+ return value.substring(index);
65
+ }
66
+ function decryptChromiumAES256GCMCookieValue(encryptedValue, key) {
67
+ const buffer = Buffer.from(encryptedValue);
68
+ if (buffer.length < 3) {
69
+ return null;
70
+ }
71
+ const prefix = buffer.subarray(0, 3).toString("utf8");
72
+ const hasPrefix = prefix === "v10" || prefix === "v20";
73
+ if (!hasPrefix) {
74
+ try {
75
+ return UTF8_DECODER.decode(buffer);
76
+ } catch {
77
+ return null;
78
+ }
79
+ }
80
+ const payload = buffer.subarray(3);
81
+ if (payload.length < 12 + 16) {
82
+ return null;
83
+ }
84
+ const nonce = payload.subarray(0, 12);
85
+ const ciphertextWithTag = payload.subarray(12);
86
+ const authTag = ciphertextWithTag.subarray(ciphertextWithTag.length - 16);
87
+ const ciphertext = ciphertextWithTag.subarray(0, ciphertextWithTag.length - 16);
88
+ try {
89
+ const decipher = createDecipheriv("aes-256-gcm", key, nonce);
90
+ decipher.setAuthTag(authTag);
91
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
92
+ return UTF8_DECODER.decode(decrypted);
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+
98
+ export {
99
+ getAES128CBCKey,
100
+ decryptChomiumAES128CBCCookieValue,
101
+ decryptChromiumAES256GCMCookieValue
102
+ };
103
+ //# sourceMappingURL=chunk-UR6BPQ2T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/crypto.ts"],"sourcesContent":["import { createDecipheriv, pbkdf2Sync } from 'crypto';\n\nconst UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });\n\nexport function getAES128CBCKey(password: string, iterations: number): Buffer {\n const key = pbkdf2Sync(password, 'saltysalt', iterations, 16, 'sha1');\n return key;\n}\n\nexport function decryptChomiumAES128CBCCookieValue(\n encryptedValue: Uint8Array,\n keyCandidates: Buffer[]\n): string | null {\n const buffer = Buffer.from(encryptedValue);\n if (buffer.length < 3) {\n return null;\n }\n\n // check whether it is prefixed with \"v10\" or \"v11\"\n const prefix = buffer.subarray(0, 3).toString('utf8');\n const hasPrefix = prefix === 'v10' || prefix === 'v11';\n if (!hasPrefix) {\n return decodeCookieValue(buffer, false);\n }\n\n const text = buffer.subarray(3);\n if (!text.length) {\n return '';\n }\n\n for (const key of keyCandidates) {\n const decryptedBuffer = tryDecryptAES128CBC(text, key);\n if (!decryptedBuffer) {\n continue;\n }\n const decryptedValue = decodeCookieValue(decryptedBuffer, true);\n if (decryptedValue !== null) {\n return decryptedValue;\n }\n }\n\n return null;\n}\n\nfunction tryDecryptAES128CBC(text: Buffer, key: Buffer): Buffer | null {\n try {\n const iv = Buffer.alloc(16, ' ');\n const decipher = createDecipheriv('aes-128-cbc', key, iv);\n decipher.setAutoPadding(false);\n let decrypted = Buffer.concat([decipher.update(text), decipher.final()]);\n // Remove PKCS#7 padding\n const paddingLength = decrypted[decrypted.length - 1];\n if (paddingLength > 0 && paddingLength <= 16) {\n decrypted = decrypted.subarray(0, decrypted.length - paddingLength);\n }\n return decrypted;\n } catch (error) {\n return null;\n }\n}\n\nfunction decodeCookieValue(value: Buffer, removePrefix = true): string | null {\n const bytes = removePrefix && value.length >= 32 ? value.subarray(32) : value;\n let decrypted: string;\n try {\n decrypted = UTF8_DECODER.decode(bytes);\n } catch (error) {\n return null;\n }\n return removeLeadingControlChars(decrypted);\n}\n\nfunction removeLeadingControlChars(value: string): string {\n let index = 0;\n while (index < value.length && value.charCodeAt(index) <= 0x1f) {\n index++;\n }\n return value.substring(index);\n}\n\n/**\n * Decrypt a Windows Chromium cookie value encrypted with AES-256-GCM.\n * Format: v10/v20 prefix (3 bytes) + nonce (12 bytes) + ciphertext + auth tag (16 bytes)\n */\nexport function decryptChromiumAES256GCMCookieValue(\n encryptedValue: Uint8Array,\n key: Buffer\n): string | null {\n const buffer = Buffer.from(encryptedValue);\n if (buffer.length < 3) {\n return null;\n }\n\n const prefix = buffer.subarray(0, 3).toString('utf8');\n const hasPrefix = prefix === 'v10' || prefix === 'v20';\n if (!hasPrefix) {\n // Not encrypted, try to return as plain text\n try {\n return UTF8_DECODER.decode(buffer);\n } catch {\n return null;\n }\n }\n\n const payload = buffer.subarray(3);\n if (payload.length < 12 + 16) {\n // Need at least nonce (12) + auth tag (16)\n return null;\n }\n\n const nonce = payload.subarray(0, 12);\n const ciphertextWithTag = payload.subarray(12);\n const authTag = ciphertextWithTag.subarray(ciphertextWithTag.length - 16);\n const ciphertext = ciphertextWithTag.subarray(0, ciphertextWithTag.length - 16);\n\n try {\n const decipher = createDecipheriv('aes-256-gcm', key, nonce);\n decipher.setAuthTag(authTag);\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return UTF8_DECODER.decode(decrypted);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ getCookiesFromBraveLinuxSqlite
3
+ } from "./chunk-EZBYP7NP.js";
4
+ import {
5
+ getCookiesFromBraveMacSqlite
6
+ } from "./chunk-SSXWHBKV.js";
7
+ import {
8
+ getCookiesFromBraveWindowsSqlite
9
+ } from "./chunk-PT5JK5UI.js";
10
+
11
+ // src/browsers/bravo.ts
12
+ async function getCookiesFromBrave(options, origins, cookieNames) {
13
+ const warnings = [];
14
+ if (process.platform === "darwin") {
15
+ const result = await getCookiesFromBraveMacSqlite(options, origins, cookieNames);
16
+ warnings.push(...result.warnings);
17
+ return { cookies: result.cookies, warnings };
18
+ }
19
+ if (process.platform === "win32") {
20
+ const result = await getCookiesFromBraveWindowsSqlite(options, origins, cookieNames);
21
+ warnings.push(...result.warnings);
22
+ return { cookies: result.cookies, warnings };
23
+ }
24
+ if (process.platform === "linux") {
25
+ const result = await getCookiesFromBraveLinuxSqlite(options, origins, cookieNames);
26
+ warnings.push(...result.warnings);
27
+ return { cookies: result.cookies, warnings };
28
+ }
29
+ return { cookies: [], warnings };
30
+ }
31
+
32
+ export {
33
+ getCookiesFromBrave
34
+ };
35
+ //# sourceMappingURL=chunk-XDL34EPI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browsers/bravo.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult } from '../types';\nimport { getCookiesFromBraveMacSqlite } from '../bravoMacCookie';\nimport { getCookiesFromBraveWindowsSqlite } from '../bravoWindowsCookie';\nimport { getCookiesFromBraveLinuxSqlite } from '../bravoLinuxCookie';\n\nexport async function getCookiesFromBrave(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const warnings: string[] = [];\n\n if (process.platform === 'darwin') {\n const result = await getCookiesFromBraveMacSqlite(options, origins, cookieNames);\n warnings.push(...result.warnings);\n return { cookies: result.cookies, warnings };\n }\n\n if (process.platform === 'win32') {\n const result = await getCookiesFromBraveWindowsSqlite(options, origins, cookieNames);\n warnings.push(...result.warnings);\n return { cookies: result.cookies, warnings };\n }\n\n if (process.platform === 'linux') {\n const result = await getCookiesFromBraveLinuxSqlite(options, origins, cookieNames);\n warnings.push(...result.warnings);\n return { cookies: result.cookies, warnings };\n }\n\n return { cookies: [], warnings };\n}\n"],"mappings":";;;;;;;;;;;AAKA,eAAsB,oBACpB,SACA,SACA,aAC2B;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,SAAS,MAAM,6BAA6B,SAAS,SAAS,WAAW;AAC/E,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,iCAAiC,SAAS,SAAS,WAAW;AACnF,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,+BAA+B,SAAS,SAAS,WAAW;AACjF,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,SAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AACjC;","names":[]}