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,244 @@
1
+ // src/common.ts
2
+ import { tmpdir } from "os";
3
+ import { copyFileSync, mkdtempSync, rmSync } from "fs";
4
+ import path from "path";
5
+ import Database from "better-sqlite3";
6
+ async function getCookiesFromChromiumSqliteDB(options, origins, cookieNames, browser, decrypytFn) {
7
+ const warnings = [];
8
+ const tmpdirPath = mkdtempSync(path.join(tmpdir(), "sqlite-cookie-chromium-db-"));
9
+ const tempDbPath = path.join(tmpdirPath, "Cookies");
10
+ try {
11
+ copyFileSync(options.cookieFilePath, tempDbPath);
12
+ } catch (error) {
13
+ rmSync(tmpdirPath, { recursive: true, force: true });
14
+ warnings.push(`Failed to copy cookie database: ${error.message}`);
15
+ return { cookies: [], warnings };
16
+ }
17
+ try {
18
+ const hosts = origins.map((origin) => new URL(origin).hostname);
19
+ const whereClause = buildHostWhereClause(hosts, "host_key");
20
+ const rowsResult = await getRawCookiesFromChromiumDb(tempDbPath, whereClause);
21
+ if (!rowsResult.success) {
22
+ rmSync(tmpdirPath, { recursive: true, force: true });
23
+ warnings.push(rowsResult.error);
24
+ return { cookies: [], warnings };
25
+ }
26
+ const cookies = decryptRawCookiesFromChromiumRows(
27
+ rowsResult.rows,
28
+ options,
29
+ hosts,
30
+ cookieNames,
31
+ browser,
32
+ decrypytFn,
33
+ warnings
34
+ );
35
+ rmSync(tmpdirPath, { recursive: true, force: true });
36
+ return { cookies, warnings };
37
+ } catch (error) {
38
+ rmSync(tmpdirPath, { recursive: true, force: true });
39
+ warnings.push(`Failed to get cookies: ${error.message}`);
40
+ return { cookies: [], warnings };
41
+ }
42
+ }
43
+ function decryptRawCookiesFromChromiumRows(rows, options, hosts, cookieNames, browser, decryptFn, warnings = []) {
44
+ const cookies = [];
45
+ for (const row of rows) {
46
+ const name = typeof row.name === "string" ? row.name : "";
47
+ if (cookieNames && !cookieNames.has(name)) {
48
+ continue;
49
+ }
50
+ const hostString = typeof row.host_key === "string" ? row.host_key : "";
51
+ if (!hostString) {
52
+ continue;
53
+ }
54
+ const host = hostString.startsWith(".") ? hostString.substring(1) : hostString;
55
+ const domainLower = host.toLowerCase();
56
+ if (!hosts.some((host2) => {
57
+ const hostLower = host2.toLowerCase();
58
+ return hostLower === domainLower || hostLower.endsWith(`.${domainLower}`);
59
+ })) {
60
+ continue;
61
+ }
62
+ const partitionKey = typeof row.top_frame_site_key === "string" && row.top_frame_site_key ? row.top_frame_site_key : void 0;
63
+ if (!options.includePartitioned && partitionKey) {
64
+ continue;
65
+ }
66
+ const valueTemp = typeof row.value === "string" ? row.value : null;
67
+ let value = valueTemp;
68
+ if (!value) {
69
+ const encryptedValue = row.encrypted_value;
70
+ if (encryptedValue instanceof Uint8Array) {
71
+ const decrypted = decryptFn(encryptedValue);
72
+ value = decrypted;
73
+ }
74
+ }
75
+ if (value === null) {
76
+ warnings.push(`Failed to decrypt cookie value for cookie "${name}" at host "${host}"`);
77
+ continue;
78
+ }
79
+ const expiresUtc = typeof row.expires_utc === "number" || typeof row.expires_utc === "bigint" ? row.expires_utc : tryParseInt(row.expires_utc);
80
+ const expires = normalizeExpiration(expiresUtc, "chromium");
81
+ if (!options.includeExpired && expires && expires < Date.now()) {
82
+ continue;
83
+ }
84
+ const secure = row.is_secure === 1 || row.is_secure === true || row.is_secure === 1n || row.is_secure === "1";
85
+ const httpOnly = row.is_httponly === 1 || row.is_httponly === true || row.is_httponly === 1n || row.is_httponly === "1";
86
+ const sameSite = normalizeSameSite(row.samesite);
87
+ const rowPath = typeof row.path === "string" ? row.path : "";
88
+ const cookie = {
89
+ name,
90
+ value,
91
+ domain: host,
92
+ path: rowPath || "/",
93
+ expires,
94
+ secure,
95
+ httpOnly,
96
+ sameSite,
97
+ partitionKey,
98
+ source: {
99
+ browser,
100
+ cookieFilePath: options.cookieFilePath
101
+ }
102
+ };
103
+ cookies.push(cookie);
104
+ }
105
+ return cookies;
106
+ }
107
+ function normalizeSameSite(value) {
108
+ if (typeof value === "bigint") {
109
+ const intValue = Number(value);
110
+ return Number.isFinite(intValue) ? normalizeSameSite(intValue) : void 0;
111
+ } else if (typeof value === "number") {
112
+ switch (value) {
113
+ case 0:
114
+ return "none";
115
+ case 1:
116
+ return "lax";
117
+ case 2:
118
+ return "strict";
119
+ default:
120
+ return void 0;
121
+ }
122
+ } else if (typeof value === "string") {
123
+ const parsed = Number.parseInt(value, 10);
124
+ if (!Number.isNaN(parsed)) {
125
+ return normalizeSameSite(parsed);
126
+ }
127
+ const lower = value.toLowerCase();
128
+ switch (lower) {
129
+ case "none":
130
+ case "no_restriction":
131
+ return "none";
132
+ case "lax":
133
+ return "lax";
134
+ case "strict":
135
+ return "strict";
136
+ default:
137
+ return void 0;
138
+ }
139
+ }
140
+ }
141
+ function tryParseInt(value) {
142
+ if (typeof value === "string") {
143
+ const parsed = parseInt(value, 10);
144
+ return isNaN(parsed) ? null : parsed;
145
+ }
146
+ return null;
147
+ }
148
+ var CHROME_EPOCH_OFFSET_MS = 11644473600000n;
149
+ var SAFARI_EPOCH_OFFSET_S = 978307200;
150
+ function normalizeExpiration(timestamp, browser) {
151
+ if (timestamp === null || timestamp === 0 || timestamp === 0n) {
152
+ return void 0;
153
+ }
154
+ try {
155
+ switch (browser) {
156
+ case "chromium": {
157
+ const microsBigInt = typeof timestamp === "bigint" ? timestamp : BigInt(Math.floor(timestamp));
158
+ const millisFrom1601 = microsBigInt / 1000n;
159
+ const millisFrom1970 = millisFrom1601 - CHROME_EPOCH_OFFSET_MS;
160
+ return Number(millisFrom1970);
161
+ }
162
+ case "firefox": {
163
+ return typeof timestamp === "bigint" ? Number(timestamp) : timestamp;
164
+ }
165
+ case "safari": {
166
+ const seconds = typeof timestamp === "bigint" ? Number(timestamp) : timestamp;
167
+ return (seconds + SAFARI_EPOCH_OFFSET_S) * 1e3;
168
+ }
169
+ default:
170
+ return void 0;
171
+ }
172
+ } catch {
173
+ return void 0;
174
+ }
175
+ }
176
+ function expandHostCandidates(hostname) {
177
+ const parts = hostname.split(".");
178
+ if (parts.length <= 1) {
179
+ return [hostname];
180
+ }
181
+ const candidates = /* @__PURE__ */ new Set();
182
+ for (let i = 0; i <= parts.length - 2; i++) {
183
+ const candidate = parts.slice(i).join(".");
184
+ candidates.add(candidate);
185
+ }
186
+ return Array.from(candidates);
187
+ }
188
+ function buildHostWhereClause(hosts, column) {
189
+ const clauses = [];
190
+ for (const host of hosts) {
191
+ const candidates = expandHostCandidates(host);
192
+ for (const candidate of candidates) {
193
+ const escaped = sqlEscape(candidate);
194
+ const escapedDot = sqlEscape(`.${candidate}`);
195
+ const escapedLike = sqlEscape(`%.${candidate}`);
196
+ clauses.push(`${column} = ${escaped}`);
197
+ clauses.push(`${column} = ${escapedDot}`);
198
+ clauses.push(`${column} LIKE ${escapedLike}`);
199
+ }
200
+ }
201
+ return clauses.length ? clauses.join(" OR ") : "1=0";
202
+ }
203
+ function sqlEscape(value) {
204
+ return `'${value.replace(/'/g, "''")}'`;
205
+ }
206
+ async function getRawCookiesFromChromiumDb(dbPath, whereClause) {
207
+ try {
208
+ const db = new Database(dbPath, { readonly: true });
209
+ try {
210
+ const sql = `
211
+ SELECT
212
+ name,
213
+ value,
214
+ encrypted_value,
215
+ host_key,
216
+ path,
217
+ expires_utc,
218
+ is_secure,
219
+ is_httponly,
220
+ samesite,
221
+ top_frame_site_key,
222
+ has_cross_site_ancestor
223
+ FROM cookies
224
+ WHERE ${whereClause}
225
+ ORDER BY expires_utc DESC
226
+ `;
227
+ const stmt = db.prepare(sql);
228
+ const rows = stmt.all();
229
+ return { success: true, rows };
230
+ } catch (error) {
231
+ return { success: false, error: `SQL query failed: ${error.message}` };
232
+ } finally {
233
+ db.close();
234
+ }
235
+ } catch (error) {
236
+ return { success: false, error: `Failed to open database: ${error.message}` };
237
+ }
238
+ }
239
+
240
+ export {
241
+ getCookiesFromChromiumSqliteDB,
242
+ normalizeExpiration
243
+ };
244
+ //# sourceMappingURL=chunk-JTBFDYPY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common.ts"],"sourcesContent":["import {\n GetCookiesResult,\n Cookie,\n SameSiteValue,\n GetCookiesFromFileOptions,\n BrowserName,\n BrowserType,\n} from './types';\nimport { tmpdir } from 'os';\nimport { copyFileSync, existsSync, mkdtempSync, rmSync } from 'fs';\nimport path from 'path';\nimport Database from 'better-sqlite3';\n\ntype ChromeCookieRow = {\n name?: unknown;\n value?: unknown;\n encrypted_value?: unknown;\n host_key?: unknown;\n path?: unknown;\n expires_utc?: unknown;\n is_secure?: unknown;\n is_httponly?: unknown;\n samesite?: unknown;\n top_frame_site_key?: unknown;\n has_cross_site_ancestor?: unknown;\n};\n\nexport async function getCookiesFromChromiumSqliteDB(\n options: GetCookiesFromFileOptions,\n origins: string[],\n cookieNames: Set<string> | null,\n browser: BrowserName,\n decrypytFn: (encryptedValue: Uint8Array) => string | null\n): Promise<GetCookiesResult> {\n const warnings: string[] = [];\n\n const tmpdirPath = mkdtempSync(path.join(tmpdir(), 'sqlite-cookie-chromium-db-'));\n const tempDbPath = path.join(tmpdirPath, 'Cookies');\n try {\n copyFileSync(options.cookieFilePath, tempDbPath);\n } catch (error) {\n rmSync(tmpdirPath, { recursive: true, force: true });\n warnings.push(`Failed to copy cookie database: ${(error as Error).message}`);\n return { cookies: [], warnings };\n }\n\n try {\n const hosts = origins.map((origin) => new URL(origin).hostname);\n const whereClause = buildHostWhereClause(hosts, 'host_key');\n const rowsResult = await getRawCookiesFromChromiumDb(tempDbPath, whereClause);\n\n if (!rowsResult.success) {\n rmSync(tmpdirPath, { recursive: true, force: true });\n warnings.push(rowsResult.error);\n return { cookies: [], warnings };\n }\n\n const cookies = decryptRawCookiesFromChromiumRows(\n rowsResult.rows,\n options,\n hosts,\n cookieNames,\n browser,\n decrypytFn,\n warnings\n );\n\n rmSync(tmpdirPath, { recursive: true, force: true });\n return { cookies, warnings };\n } catch (error) {\n rmSync(tmpdirPath, { recursive: true, force: true });\n warnings.push(`Failed to get cookies: ${(error as Error).message}`);\n return { cookies: [], warnings };\n }\n}\n\nfunction decryptRawCookiesFromChromiumRows(\n rows: ChromeCookieRow[],\n options: GetCookiesFromFileOptions,\n hosts: string[],\n cookieNames: Set<string> | null,\n browser: BrowserName,\n decryptFn: (encryptedValue: Uint8Array) => string | null,\n warnings: string[] = []\n): Cookie[] {\n const cookies: Cookie[] = [];\n for (const row of rows) {\n const name = typeof row.name === 'string' ? row.name : '';\n if (cookieNames && !cookieNames.has(name)) {\n continue;\n }\n const hostString = typeof row.host_key === 'string' ? row.host_key : '';\n if (!hostString) {\n continue;\n }\n const host = hostString.startsWith('.') ? hostString.substring(1) : hostString;\n const domainLower = host.toLowerCase();\n if (\n !hosts.some((host) => {\n const hostLower = host.toLowerCase();\n return hostLower === domainLower || hostLower.endsWith(`.${domainLower}`);\n })\n ) {\n continue;\n }\n\n const partitionKey =\n typeof row.top_frame_site_key === 'string' && row.top_frame_site_key\n ? row.top_frame_site_key\n : undefined;\n\n // Filter out partitioned cookies by default\n if (!options.includePartitioned && partitionKey) {\n continue;\n }\n\n const valueTemp = typeof row.value === 'string' ? row.value : null;\n let value = valueTemp;\n if (!value) {\n const encryptedValue = row.encrypted_value;\n if (encryptedValue instanceof Uint8Array) {\n const decrypted = decryptFn(encryptedValue);\n value = decrypted;\n }\n }\n if (value === null) {\n warnings.push(`Failed to decrypt cookie value for cookie \"${name}\" at host \"${host}\"`);\n continue;\n }\n\n const expiresUtc =\n typeof row.expires_utc === 'number' || typeof row.expires_utc === 'bigint'\n ? row.expires_utc\n : tryParseInt(row.expires_utc);\n\n // Convert Chrome timestamp to JavaScript timestamp (milliseconds)\n const expires = normalizeExpiration(expiresUtc, 'chromium');\n\n // Check if cookie is expired (if not including expired cookies)\n if (!options.includeExpired && expires && expires < Date.now()) {\n continue;\n }\n\n const secure =\n row.is_secure === 1 ||\n row.is_secure === true ||\n row.is_secure === 1n ||\n row.is_secure === '1';\n const httpOnly =\n row.is_httponly === 1 ||\n row.is_httponly === true ||\n row.is_httponly === 1n ||\n row.is_httponly === '1';\n\n const sameSite = normalizeSameSite(row.samesite);\n const rowPath = typeof row.path === 'string' ? row.path : '';\n\n // Create Cookie object\n const cookie: Cookie = {\n name,\n value,\n domain: host,\n path: rowPath || '/',\n expires,\n secure,\n httpOnly,\n sameSite,\n partitionKey,\n source: {\n browser,\n cookieFilePath: options.cookieFilePath,\n },\n };\n\n cookies.push(cookie);\n }\n return cookies;\n}\n\nfunction normalizeSameSite(value: unknown): SameSiteValue | undefined {\n if (typeof value === 'bigint') {\n const intValue = Number(value);\n return Number.isFinite(intValue) ? normalizeSameSite(intValue) : undefined;\n } else if (typeof value === 'number') {\n switch (value) {\n case 0:\n return 'none';\n case 1:\n return 'lax';\n case 2:\n return 'strict';\n default:\n return undefined;\n }\n } else if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return normalizeSameSite(parsed);\n }\n const lower = value.toLowerCase();\n switch (lower) {\n case 'none':\n case 'no_restriction':\n return 'none';\n case 'lax':\n return 'lax';\n case 'strict':\n return 'strict';\n default:\n return undefined;\n }\n }\n}\n\nfunction tryParseInt(value: unknown): number | null {\n if (typeof value === 'string') {\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\n// Offset between 1601-01-01 and 1970-01-01 in milliseconds\nconst CHROME_EPOCH_OFFSET_MS = 11644473600000n;\n// Offset between 2001-01-01 and 1970-01-01 in seconds\nconst SAFARI_EPOCH_OFFSET_S = 978307200;\n\n/**\n * Normalize browser-specific timestamp to JavaScript milliseconds (since 1970-01-01 UTC)\n * @param timestamp - The raw timestamp value from the browser database\n * @param browser - The browser type (determines timestamp format)\n * - chrome/edge: microseconds since 1601-01-01\n * - firefox: seconds since 1970-01-01\n * - safari: seconds since 2001-01-01 (CFAbsoluteTime)\n * @returns Milliseconds since epoch (1970-01-01), or undefined if conversion fails\n */\nexport function normalizeExpiration(\n timestamp: number | bigint | null,\n browser: BrowserType\n): number | undefined {\n if (timestamp === null || timestamp === 0 || timestamp === 0n) {\n return undefined;\n }\n\n try {\n switch (browser) {\n case 'chromium': {\n // Chrome/Edge: microseconds since 1601-01-01\n // Use bigint arithmetic to avoid precision loss\n const microsBigInt =\n typeof timestamp === 'bigint' ? timestamp : BigInt(Math.floor(timestamp));\n const millisFrom1601 = microsBigInt / 1000n;\n const millisFrom1970 = millisFrom1601 - CHROME_EPOCH_OFFSET_MS;\n return Number(millisFrom1970);\n }\n\n case 'firefox': {\n // Firefox: milliseconds since 1970-01-01 (already in JavaScript timestamp format)\n return typeof timestamp === 'bigint' ? Number(timestamp) : timestamp;\n }\n\n case 'safari': {\n // Safari: seconds since 2001-01-01 (CFAbsoluteTime)\n const seconds = typeof timestamp === 'bigint' ? Number(timestamp) : timestamp;\n return (seconds + SAFARI_EPOCH_OFFSET_S) * 1000;\n }\n\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n\nfunction expandHostCandidates(hostname: string): string[] {\n const parts = hostname.split('.');\n if (parts.length <= 1) {\n return [hostname];\n }\n const candidates: Set<string> = new Set();\n for (let i = 0; i <= parts.length - 2; i++) {\n const candidate = parts.slice(i).join('.');\n candidates.add(candidate);\n }\n return Array.from(candidates);\n}\n\nfunction buildHostWhereClause(hosts: string[], column: 'host_key'): string {\n const clauses: string[] = [];\n for (const host of hosts) {\n const candidates = expandHostCandidates(host);\n for (const candidate of candidates) {\n const escaped = sqlEscape(candidate);\n const escapedDot = sqlEscape(`.${candidate}`);\n const escapedLike = sqlEscape(`%.${candidate}`);\n clauses.push(`${column} = ${escaped}`);\n clauses.push(`${column} = ${escapedDot}`);\n clauses.push(`${column} LIKE ${escapedLike}`);\n }\n }\n return clauses.length ? clauses.join(' OR ') : '1=0';\n}\n\nfunction sqlEscape(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nasync function getRawCookiesFromChromiumDb(\n dbPath: string,\n whereClause: string\n): Promise<{ success: true; rows: ChromeCookieRow[] } | { success: false; error: string }> {\n try {\n const db = new Database(dbPath, { readonly: true });\n\n try {\n const sql = `\n SELECT\n name,\n value,\n encrypted_value,\n host_key,\n path,\n expires_utc,\n is_secure,\n is_httponly,\n samesite,\n top_frame_site_key,\n has_cross_site_ancestor\n FROM cookies\n WHERE ${whereClause}\n ORDER BY expires_utc DESC\n `;\n\n const stmt = db.prepare(sql);\n const rows = stmt.all() as ChromeCookieRow[];\n return { success: true, rows };\n } catch (error) {\n return { success: false, error: `SQL query failed: ${(error as Error).message}` };\n } finally {\n db.close();\n }\n } catch (error) {\n return { success: false, error: `Failed to open database: ${(error as Error).message}` };\n }\n}\n"],"mappings":"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","names":["host"]}
@@ -0,0 +1,41 @@
1
+ // src/util/processExecutor.ts
2
+ import { spawn } from "child_process";
3
+ async function executeProcess(file, args, timeoutMs) {
4
+ const runPromise = new Promise((resolve) => {
5
+ const child = spawn(file, args, { stdio: ["ignore", "pipe", "pipe"] });
6
+ let stdout = "";
7
+ let stderr = "";
8
+ child.stdout.setEncoding("utf8");
9
+ child.stderr.setEncoding("utf8");
10
+ child.stdout.on("data", (chunk) => {
11
+ stdout += chunk;
12
+ });
13
+ child.stderr.on("data", (chunk) => {
14
+ stderr += chunk;
15
+ });
16
+ const timer = setTimeout(() => {
17
+ try {
18
+ child.kill();
19
+ } catch {
20
+ }
21
+ resolve({ code: 124, stdout, stderr: `${stderr}
22
+ Process time out after ${timeoutMs} ms` });
23
+ }, timeoutMs);
24
+ child.on("close", (code) => {
25
+ clearTimeout(timer);
26
+ resolve({ code: code ?? 0, stdout, stderr });
27
+ });
28
+ child.on("error", (err) => {
29
+ clearTimeout(timer);
30
+ resolve({ code: 127, stdout, stderr: `${stderr}
31
+ Process execution error: ${err.message}` });
32
+ });
33
+ });
34
+ const result = await runPromise;
35
+ return result;
36
+ }
37
+
38
+ export {
39
+ executeProcess
40
+ };
41
+ //# sourceMappingURL=chunk-LTLRZZW3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/processExecutor.ts"],"sourcesContent":["import { spawn } from 'child_process';\n\nexport async function executeProcess(\n file: string,\n args: string[],\n timeoutMs: number\n): Promise<{ code: number; stdout: string; stderr: string }> {\n const runPromise = new Promise<{ code: number; stdout: string; stderr: string }>((resolve) => {\n const child = spawn(file, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n });\n const timer = setTimeout(() => {\n try {\n child.kill();\n } catch {}\n resolve({ code: 124, stdout, stderr: `${stderr}\\nProcess time out after ${timeoutMs} ms` });\n }, timeoutMs);\n child.on('close', (code) => {\n clearTimeout(timer);\n resolve({ code: code ?? 0, stdout, stderr });\n });\n child.on('error', (err) => {\n clearTimeout(timer);\n resolve({ code: 127, stdout, stderr: `${stderr}\\nProcess execution error: ${err.message}` });\n });\n });\n const result = await runPromise;\n return result;\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAEtB,eAAsB,eACpB,MACA,MACA,WAC2D;AAC3D,QAAM,aAAa,IAAI,QAA0D,CAAC,YAAY;AAC5F,UAAM,QAAQ,MAAM,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACrE,QAAI,SAAS;AACb,QAAI,SAAS;AACb,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AAAA,IACZ,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AAAA,IACZ,CAAC;AACD,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI;AACF,cAAM,KAAK;AAAA,MACb,QAAQ;AAAA,MAAC;AACT,cAAQ,EAAE,MAAM,KAAK,QAAQ,QAAQ,GAAG,MAAM;AAAA,yBAA4B,SAAS,MAAM,CAAC;AAAA,IAC5F,GAAG,SAAS;AACZ,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,mBAAa,KAAK;AAClB,cAAQ,EAAE,MAAM,QAAQ,GAAG,QAAQ,OAAO,CAAC;AAAA,IAC7C,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,mBAAa,KAAK;AAClB,cAAQ,EAAE,MAAM,KAAK,QAAQ,QAAQ,GAAG,MAAM;AAAA,2BAA8B,IAAI,OAAO,GAAG,CAAC;AAAA,IAC7F,CAAC;AAAA,EACH,CAAC;AACD,QAAM,SAAS,MAAM;AACrB,SAAO;AACT;","names":[]}
@@ -0,0 +1,98 @@
1
+ import {
2
+ decryptWindowsDpapi
3
+ } from "./chunk-AR5Q6KM4.js";
4
+ import {
5
+ decryptChromiumAES256GCMCookieValue
6
+ } from "./chunk-UR6BPQ2T.js";
7
+ import {
8
+ resolveBrowserDefaultorSpecificDBPath
9
+ } from "./chunk-TYLH6G3Z.js";
10
+ import {
11
+ getCookiesFromChromiumSqliteDB
12
+ } from "./chunk-JTBFDYPY.js";
13
+
14
+ // src/chromeWindowsCookie.ts
15
+ import path from "path";
16
+ import { readFileSync } from "fs";
17
+ async function getCookiesFromChromeWindowsSqlite(options, origins, cookieNames) {
18
+ const chromeUserDataDir = resolveChromeWindowsUserDataDir();
19
+ const sqlDBPath = resolveChromeWindowsDBPath(chromeUserDataDir, options.profile);
20
+ if (!sqlDBPath) {
21
+ return {
22
+ cookies: [],
23
+ warnings: ["Could not resolve Chrome cookie database path on Windows."]
24
+ };
25
+ }
26
+ const warnings = [];
27
+ const keyResult = await extractChromeWindowsEncryptionKey(chromeUserDataDir);
28
+ if (!keyResult.success) {
29
+ warnings.push(`Failed to get Chrome decryption key: ${keyResult.error}`);
30
+ return { cookies: [], warnings };
31
+ }
32
+ const key = keyResult.key;
33
+ const decryptFn = (encryptedValue) => {
34
+ return decryptChromiumAES256GCMCookieValue(encryptedValue, key);
35
+ };
36
+ const fileOptions = {
37
+ cookieFilePath: sqlDBPath
38
+ };
39
+ fileOptions.profile = options.profile;
40
+ fileOptions.includeExpired = options.includeExpired;
41
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
42
+ fileOptions,
43
+ origins,
44
+ cookieNames,
45
+ "chrome",
46
+ decryptFn
47
+ );
48
+ warnings.push(...dbWarnings);
49
+ return { cookies, warnings };
50
+ }
51
+ function resolveChromeWindowsUserDataDir() {
52
+ const localAppData = process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || "", "AppData", "Local");
53
+ return path.join(localAppData, "Google", "Chrome", "User Data");
54
+ }
55
+ function resolveChromeWindowsDBPath(userDataDir, profile) {
56
+ return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);
57
+ }
58
+ async function extractChromeWindowsEncryptionKey(userDataDir) {
59
+ const localStatePath = path.join(userDataDir, "Local State");
60
+ let localStateContent;
61
+ try {
62
+ localStateContent = readFileSync(localStatePath, "utf8");
63
+ } catch (error) {
64
+ return {
65
+ success: false,
66
+ error: `Failed to read Local State file: ${error.message}`
67
+ };
68
+ }
69
+ let localState;
70
+ try {
71
+ localState = JSON.parse(localStateContent);
72
+ } catch (error) {
73
+ return {
74
+ success: false,
75
+ error: `Failed to parse Local State JSON: ${error.message}`
76
+ };
77
+ }
78
+ const encryptedKeyBase64 = localState?.os_crypt?.encrypted_key;
79
+ if (!encryptedKeyBase64) {
80
+ return { success: false, error: "No encrypted_key found in Local State" };
81
+ }
82
+ const encryptedKeyWithPrefix = Buffer.from(encryptedKeyBase64, "base64");
83
+ const dpapiPrefix = encryptedKeyWithPrefix.subarray(0, 5).toString("utf8");
84
+ if (dpapiPrefix !== "DPAPI") {
85
+ return { success: false, error: "Encrypted key does not have expected DPAPI prefix" };
86
+ }
87
+ const encryptedKey = encryptedKeyWithPrefix.subarray(5);
88
+ const dpapiResult = await decryptWindowsDpapi(encryptedKey);
89
+ if (!dpapiResult.success) {
90
+ return { success: false, error: `DPAPI decryption failed: ${dpapiResult.error}` };
91
+ }
92
+ return { success: true, key: dpapiResult.decrypted };
93
+ }
94
+
95
+ export {
96
+ getCookiesFromChromeWindowsSqlite
97
+ };
98
+ //# sourceMappingURL=chunk-MLKERL3L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chromeWindowsCookie.ts"],"sourcesContent":["import path from 'path';\nimport { readFileSync } from 'fs';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { decryptWindowsDpapi } from './util/windowsDpapi';\nimport { decryptChromiumAES256GCMCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\n\nexport async function getCookiesFromChromeWindowsSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const chromeUserDataDir = resolveChromeWindowsUserDataDir();\n const sqlDBPath = resolveChromeWindowsDBPath(chromeUserDataDir, options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Chrome cookie database path on Windows.'],\n };\n }\n\n const warnings: string[] = [];\n\n const keyResult = await extractChromeWindowsEncryptionKey(chromeUserDataDir);\n if (!keyResult.success) {\n warnings.push(`Failed to get Chrome decryption key: ${keyResult.error}`);\n return { cookies: [], warnings };\n }\n\n const key = keyResult.key;\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChromiumAES256GCMCookieValue(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 resolveChromeWindowsUserDataDir(): string {\n const localAppData =\n process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || '', 'AppData', 'Local');\n return path.join(localAppData, 'Google', 'Chrome', 'User Data');\n}\n\nfunction resolveChromeWindowsDBPath(userDataDir: string, profile?: string): string | null {\n return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);\n}\n\nasync function extractChromeWindowsEncryptionKey(\n userDataDir: string\n): Promise<{ success: true; key: Buffer } | { success: false; error: string }> {\n const localStatePath = path.join(userDataDir, 'Local State');\n\n let localStateContent: string;\n try {\n localStateContent = readFileSync(localStatePath, 'utf8');\n } catch (error) {\n return {\n success: false,\n error: `Failed to read Local State file: ${(error as Error).message}`,\n };\n }\n\n let localState: { os_crypt?: { encrypted_key?: string } };\n try {\n localState = JSON.parse(localStateContent);\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse Local State JSON: ${(error as Error).message}`,\n };\n }\n\n const encryptedKeyBase64 = localState?.os_crypt?.encrypted_key;\n if (!encryptedKeyBase64) {\n return { success: false, error: 'No encrypted_key found in Local State' };\n }\n\n const encryptedKeyWithPrefix = Buffer.from(encryptedKeyBase64, 'base64');\n\n // The key is prefixed with \"DPAPI\" (5 bytes)\n const dpapiPrefix = encryptedKeyWithPrefix.subarray(0, 5).toString('utf8');\n if (dpapiPrefix !== 'DPAPI') {\n return { success: false, error: 'Encrypted key does not have expected DPAPI prefix' };\n }\n\n const encryptedKey = encryptedKeyWithPrefix.subarray(5);\n const dpapiResult = await decryptWindowsDpapi(encryptedKey);\n if (!dpapiResult.success) {\n return { success: false, error: `DPAPI decryption failed: ${dpapiResult.error}` };\n }\n\n return { success: true, key: dpapiResult.decrypted };\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAO7B,eAAsB,kCACpB,SACA,SACA,aAC2B;AAC3B,QAAM,oBAAoB,gCAAgC;AAC1D,QAAM,YAAY,2BAA2B,mBAAmB,QAAQ,OAAO;AAC/E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,2DAA2D;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,YAAY,MAAM,kCAAkC,iBAAiB;AAC3E,MAAI,CAAC,UAAU,SAAS;AACtB,aAAS,KAAK,wCAAwC,UAAU,KAAK,EAAE;AACvE,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,MAAM,UAAU;AACtB,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,oCAAoC,gBAAgB,GAAG;AAAA,EAChE;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,kCAA0C;AACjD,QAAM,eACJ,QAAQ,IAAI,gBAAgB,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAI,WAAW,OAAO;AACzF,SAAO,KAAK,KAAK,cAAc,UAAU,UAAU,WAAW;AAChE;AAEA,SAAS,2BAA2B,aAAqB,SAAiC;AACxF,SAAO,sCAAsC,CAAC,WAAW,GAAG,OAAO;AACrE;AAEA,eAAe,kCACb,aAC6E;AAC7E,QAAM,iBAAiB,KAAK,KAAK,aAAa,aAAa;AAE3D,MAAI;AACJ,MAAI;AACF,wBAAoB,aAAa,gBAAgB,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,oCAAqC,MAAgB,OAAO;AAAA,IACrE;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,iBAAiB;AAAA,EAC3C,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,qCAAsC,MAAgB,OAAO;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,qBAAqB,YAAY,UAAU;AACjD,MAAI,CAAC,oBAAoB;AACvB,WAAO,EAAE,SAAS,OAAO,OAAO,wCAAwC;AAAA,EAC1E;AAEA,QAAM,yBAAyB,OAAO,KAAK,oBAAoB,QAAQ;AAGvE,QAAM,cAAc,uBAAuB,SAAS,GAAG,CAAC,EAAE,SAAS,MAAM;AACzE,MAAI,gBAAgB,SAAS;AAC3B,WAAO,EAAE,SAAS,OAAO,OAAO,oDAAoD;AAAA,EACtF;AAEA,QAAM,eAAe,uBAAuB,SAAS,CAAC;AACtD,QAAM,cAAc,MAAM,oBAAoB,YAAY;AAC1D,MAAI,CAAC,YAAY,SAAS;AACxB,WAAO,EAAE,SAAS,OAAO,OAAO,4BAA4B,YAAY,KAAK,GAAG;AAAA,EAClF;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,YAAY,UAAU;AACrD;","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ getCookiesFromChromeLinuxSqlite
3
+ } from "./chunk-6OYYWSIJ.js";
4
+ import {
5
+ getCookiesFromChromeSqlite
6
+ } from "./chunk-U4G74MHA.js";
7
+ import {
8
+ getCookiesFromChromeWindowsSqlite
9
+ } from "./chunk-MLKERL3L.js";
10
+
11
+ // src/browsers/chrome.ts
12
+ async function getCookiesFromChrome(options, origins, cookieNames) {
13
+ const warnings = [];
14
+ if (process.platform === "darwin") {
15
+ const result = await getCookiesFromChromeSqlite(options, origins, cookieNames);
16
+ warnings.push(...result.warnings);
17
+ return { cookies: result.cookies, warnings };
18
+ }
19
+ if (process.platform === "win32") {
20
+ const result = await getCookiesFromChromeWindowsSqlite(options, origins, cookieNames);
21
+ warnings.push(...result.warnings);
22
+ return { cookies: result.cookies, warnings };
23
+ }
24
+ if (process.platform === "linux") {
25
+ const result = await getCookiesFromChromeLinuxSqlite(options, origins, cookieNames);
26
+ warnings.push(...result.warnings);
27
+ return { cookies: result.cookies, warnings };
28
+ }
29
+ return { cookies: [], warnings };
30
+ }
31
+
32
+ export {
33
+ getCookiesFromChrome
34
+ };
35
+ //# sourceMappingURL=chunk-NGBAATI3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browsers/chrome.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult } from '../types';\nimport { getCookiesFromChromeSqlite } from '../chromeMacCookie';\nimport { getCookiesFromChromeWindowsSqlite } from '../chromeWindowsCookie';\nimport { getCookiesFromChromeLinuxSqlite } from '../chromeLinuxCookie';\n\nexport async function getCookiesFromChrome(\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 getCookiesFromChromeSqlite(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 getCookiesFromChromeWindowsSqlite(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 getCookiesFromChromeLinuxSqlite(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,qBACpB,SACA,SACA,aAC2B;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,SAAS,MAAM,2BAA2B,SAAS,SAAS,WAAW;AAC7E,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,kCAAkC,SAAS,SAAS,WAAW;AACpF,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,gCAAgC,SAAS,SAAS,WAAW;AAClF,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,SAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AACjC;","names":[]}
@@ -0,0 +1,98 @@
1
+ import {
2
+ decryptWindowsDpapi
3
+ } from "./chunk-AR5Q6KM4.js";
4
+ import {
5
+ decryptChromiumAES256GCMCookieValue
6
+ } from "./chunk-UR6BPQ2T.js";
7
+ import {
8
+ resolveBrowserDefaultorSpecificDBPath
9
+ } from "./chunk-TYLH6G3Z.js";
10
+ import {
11
+ getCookiesFromChromiumSqliteDB
12
+ } from "./chunk-JTBFDYPY.js";
13
+
14
+ // src/bravoWindowsCookie.ts
15
+ import path from "path";
16
+ import { readFileSync } from "fs";
17
+ async function getCookiesFromBraveWindowsSqlite(options, origins, cookieNames) {
18
+ const braveUserDataDir = resolveBraveWindowsUserDataDir();
19
+ const sqlDBPath = resolveBraveWindowsDBPath(braveUserDataDir, options.profile);
20
+ if (!sqlDBPath) {
21
+ return {
22
+ cookies: [],
23
+ warnings: ["Could not resolve Brave cookie database path on Windows."]
24
+ };
25
+ }
26
+ const warnings = [];
27
+ const keyResult = await extractBraveWindowsEncryptionKey(braveUserDataDir);
28
+ if (!keyResult.success) {
29
+ warnings.push(`Failed to get Brave decryption key: ${keyResult.error}`);
30
+ return { cookies: [], warnings };
31
+ }
32
+ const key = keyResult.key;
33
+ const decryptFn = (encryptedValue) => {
34
+ return decryptChromiumAES256GCMCookieValue(encryptedValue, key);
35
+ };
36
+ const fileOptions = {
37
+ cookieFilePath: sqlDBPath
38
+ };
39
+ fileOptions.profile = options.profile;
40
+ fileOptions.includeExpired = options.includeExpired;
41
+ const { cookies, warnings: dbWarnings } = await getCookiesFromChromiumSqliteDB(
42
+ fileOptions,
43
+ origins,
44
+ cookieNames,
45
+ "brave",
46
+ decryptFn
47
+ );
48
+ warnings.push(...dbWarnings);
49
+ return { cookies, warnings };
50
+ }
51
+ function resolveBraveWindowsUserDataDir() {
52
+ const localAppData = process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || "", "AppData", "Local");
53
+ return path.join(localAppData, "BraveSoftware", "Brave-Browser", "User Data");
54
+ }
55
+ function resolveBraveWindowsDBPath(userDataDir, profile) {
56
+ return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);
57
+ }
58
+ async function extractBraveWindowsEncryptionKey(userDataDir) {
59
+ const localStatePath = path.join(userDataDir, "Local State");
60
+ let localStateContent;
61
+ try {
62
+ localStateContent = readFileSync(localStatePath, "utf8");
63
+ } catch (error) {
64
+ return {
65
+ success: false,
66
+ error: `Failed to read Local State file: ${error.message}`
67
+ };
68
+ }
69
+ let localState;
70
+ try {
71
+ localState = JSON.parse(localStateContent);
72
+ } catch (error) {
73
+ return {
74
+ success: false,
75
+ error: `Failed to parse Local State JSON: ${error.message}`
76
+ };
77
+ }
78
+ const encryptedKeyBase64 = localState?.os_crypt?.encrypted_key;
79
+ if (!encryptedKeyBase64) {
80
+ return { success: false, error: "No encrypted_key found in Local State" };
81
+ }
82
+ const encryptedKeyWithPrefix = Buffer.from(encryptedKeyBase64, "base64");
83
+ const dpapiPrefix = encryptedKeyWithPrefix.subarray(0, 5).toString("utf8");
84
+ if (dpapiPrefix !== "DPAPI") {
85
+ return { success: false, error: "Encrypted key does not have expected DPAPI prefix" };
86
+ }
87
+ const encryptedKey = encryptedKeyWithPrefix.subarray(5);
88
+ const dpapiResult = await decryptWindowsDpapi(encryptedKey);
89
+ if (!dpapiResult.success) {
90
+ return { success: false, error: `DPAPI decryption failed: ${dpapiResult.error}` };
91
+ }
92
+ return { success: true, key: dpapiResult.decrypted };
93
+ }
94
+
95
+ export {
96
+ getCookiesFromBraveWindowsSqlite
97
+ };
98
+ //# sourceMappingURL=chunk-PT5JK5UI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bravoWindowsCookie.ts"],"sourcesContent":["import path from 'path';\nimport { readFileSync } from 'fs';\nimport { resolveBrowserDefaultorSpecificDBPath } from './util/fileHelper';\nimport { GetCookiesOptions, GetCookiesResult, GetCookiesFromFileOptions } from './types';\nimport { decryptWindowsDpapi } from './util/windowsDpapi';\nimport { decryptChromiumAES256GCMCookieValue } from './util/crypto';\nimport { getCookiesFromChromiumSqliteDB } from './common';\n\nexport async function getCookiesFromBraveWindowsSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const braveUserDataDir = resolveBraveWindowsUserDataDir();\n const sqlDBPath = resolveBraveWindowsDBPath(braveUserDataDir, options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Brave cookie database path on Windows.'],\n };\n }\n\n const warnings: string[] = [];\n\n const keyResult = await extractBraveWindowsEncryptionKey(braveUserDataDir);\n if (!keyResult.success) {\n warnings.push(`Failed to get Brave decryption key: ${keyResult.error}`);\n return { cookies: [], warnings };\n }\n\n const key = keyResult.key;\n const decryptFn = (encryptedValue: Uint8Array): string | null => {\n return decryptChromiumAES256GCMCookieValue(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 resolveBraveWindowsUserDataDir(): string {\n const localAppData =\n process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || '', 'AppData', 'Local');\n return path.join(localAppData, 'BraveSoftware', 'Brave-Browser', 'User Data');\n}\n\nfunction resolveBraveWindowsDBPath(userDataDir: string, profile?: string): string | null {\n return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);\n}\n\nasync function extractBraveWindowsEncryptionKey(\n userDataDir: string\n): Promise<{ success: true; key: Buffer } | { success: false; error: string }> {\n const localStatePath = path.join(userDataDir, 'Local State');\n\n let localStateContent: string;\n try {\n localStateContent = readFileSync(localStatePath, 'utf8');\n } catch (error) {\n return {\n success: false,\n error: `Failed to read Local State file: ${(error as Error).message}`,\n };\n }\n\n let localState: { os_crypt?: { encrypted_key?: string } };\n try {\n localState = JSON.parse(localStateContent);\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse Local State JSON: ${(error as Error).message}`,\n };\n }\n\n const encryptedKeyBase64 = localState?.os_crypt?.encrypted_key;\n if (!encryptedKeyBase64) {\n return { success: false, error: 'No encrypted_key found in Local State' };\n }\n\n const encryptedKeyWithPrefix = Buffer.from(encryptedKeyBase64, 'base64');\n\n // The key is prefixed with \"DPAPI\" (5 bytes)\n const dpapiPrefix = encryptedKeyWithPrefix.subarray(0, 5).toString('utf8');\n if (dpapiPrefix !== 'DPAPI') {\n return { success: false, error: 'Encrypted key does not have expected DPAPI prefix' };\n }\n\n const encryptedKey = encryptedKeyWithPrefix.subarray(5);\n const dpapiResult = await decryptWindowsDpapi(encryptedKey);\n if (!dpapiResult.success) {\n return { success: false, error: `DPAPI decryption failed: ${dpapiResult.error}` };\n }\n\n return { success: true, key: dpapiResult.decrypted };\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAO7B,eAAsB,iCACpB,SACA,SACA,aAC2B;AAC3B,QAAM,mBAAmB,+BAA+B;AACxD,QAAM,YAAY,0BAA0B,kBAAkB,QAAQ,OAAO;AAC7E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,0DAA0D;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,YAAY,MAAM,iCAAiC,gBAAgB;AACzE,MAAI,CAAC,UAAU,SAAS;AACtB,aAAS,KAAK,uCAAuC,UAAU,KAAK,EAAE;AACtE,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,MAAM,UAAU;AACtB,QAAM,YAAY,CAAC,mBAA8C;AAC/D,WAAO,oCAAoC,gBAAgB,GAAG;AAAA,EAChE;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,iCAAyC;AAChD,QAAM,eACJ,QAAQ,IAAI,gBAAgB,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAI,WAAW,OAAO;AACzF,SAAO,KAAK,KAAK,cAAc,iBAAiB,iBAAiB,WAAW;AAC9E;AAEA,SAAS,0BAA0B,aAAqB,SAAiC;AACvF,SAAO,sCAAsC,CAAC,WAAW,GAAG,OAAO;AACrE;AAEA,eAAe,iCACb,aAC6E;AAC7E,QAAM,iBAAiB,KAAK,KAAK,aAAa,aAAa;AAE3D,MAAI;AACJ,MAAI;AACF,wBAAoB,aAAa,gBAAgB,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,oCAAqC,MAAgB,OAAO;AAAA,IACrE;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,iBAAiB;AAAA,EAC3C,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,qCAAsC,MAAgB,OAAO;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,qBAAqB,YAAY,UAAU;AACjD,MAAI,CAAC,oBAAoB;AACvB,WAAO,EAAE,SAAS,OAAO,OAAO,wCAAwC;AAAA,EAC1E;AAEA,QAAM,yBAAyB,OAAO,KAAK,oBAAoB,QAAQ;AAGvE,QAAM,cAAc,uBAAuB,SAAS,GAAG,CAAC,EAAE,SAAS,MAAM;AACzE,MAAI,gBAAgB,SAAS;AAC3B,WAAO,EAAE,SAAS,OAAO,OAAO,oDAAoD;AAAA,EACtF;AAEA,QAAM,eAAe,uBAAuB,SAAS,CAAC;AACtD,QAAM,cAAc,MAAM,oBAAoB,YAAY;AAC1D,MAAI,CAAC,YAAY,SAAS;AACxB,WAAO,EAAE,SAAS,OAAO,OAAO,4BAA4B,YAAY,KAAK,GAAG;AAAA,EAClF;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,YAAY,UAAU;AACrD;","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ executeProcess
3
+ } from "./chunk-LTLRZZW3.js";
4
+
5
+ // src/util/macKeyChain.ts
6
+ async function findMacKeyChainPassword(service, account, timeoutMs) {
7
+ const result = await executeProcess(
8
+ "security",
9
+ ["find-generic-password", "-w", "-s", service, "-a", account],
10
+ timeoutMs
11
+ );
12
+ if (result.code === 0) {
13
+ return { success: true, password: result.stdout.trim() };
14
+ } else {
15
+ return { success: false, error: result.stderr.trim() || `exit ${result.code}` };
16
+ }
17
+ }
18
+ async function findFirstMacKeyChainPassword(services, account, timeoutMs, label) {
19
+ let lastError = null;
20
+ for (const service of services) {
21
+ const result = await findMacKeyChainPassword(service, account, timeoutMs);
22
+ if (result.success) {
23
+ return result;
24
+ } else {
25
+ lastError = result.error;
26
+ }
27
+ }
28
+ return { success: false, error: lastError ?? `Failed to find password for label ${label}` };
29
+ }
30
+
31
+ export {
32
+ findMacKeyChainPassword,
33
+ findFirstMacKeyChainPassword
34
+ };
35
+ //# sourceMappingURL=chunk-Q2LDNBEA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/macKeyChain.ts"],"sourcesContent":["// macos Chrome / Edge cookie decryption keychain access\nimport { executeProcess } from './processExecutor';\n\nexport async function findMacKeyChainPassword(\n service: string,\n account: string,\n timeoutMs: number\n): Promise<{ success: true; password: string } | { success: false; error: string }> {\n const result = await executeProcess(\n 'security',\n ['find-generic-password', '-w', '-s', service, '-a', account],\n timeoutMs\n );\n if (result.code === 0) {\n return { success: true, password: result.stdout.trim() };\n } else {\n return { success: false, error: result.stderr.trim() || `exit ${result.code}` };\n }\n}\n\nexport async function findFirstMacKeyChainPassword(\n services: string[],\n account: string,\n timeoutMs: number,\n label: string\n): Promise<{ success: true; password: string } | { success: false; error: string }> {\n let lastError: string | null = null;\n for (const service of services) {\n const result = await findMacKeyChainPassword(service, account, timeoutMs);\n if (result.success) {\n return result;\n } else {\n lastError = result.error;\n }\n }\n return { success: false, error: lastError ?? `Failed to find password for label ${label}` };\n}\n"],"mappings":";;;;;AAGA,eAAsB,wBACpB,SACA,SACA,WACkF;AAClF,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,yBAAyB,MAAM,MAAM,SAAS,MAAM,OAAO;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,SAAS,MAAM,UAAU,OAAO,OAAO,KAAK,EAAE;AAAA,EACzD,OAAO;AACL,WAAO,EAAE,SAAS,OAAO,OAAO,OAAO,OAAO,KAAK,KAAK,QAAQ,OAAO,IAAI,GAAG;AAAA,EAChF;AACF;AAEA,eAAsB,6BACpB,UACA,SACA,WACA,OACkF;AAClF,MAAI,YAA2B;AAC/B,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,MAAM,wBAAwB,SAAS,SAAS,SAAS;AACxE,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,IACT,OAAO;AACL,kBAAY,OAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO,EAAE,SAAS,OAAO,OAAO,aAAa,qCAAqC,KAAK,GAAG;AAC5F;","names":[]}