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.
- package/README.md +164 -0
- package/dist/bravoLinuxCookie.d.ts +5 -0
- package/dist/bravoLinuxCookie.js +12 -0
- package/dist/bravoLinuxCookie.js.map +1 -0
- package/dist/bravoMacCookie.d.ts +5 -0
- package/dist/bravoMacCookie.js +12 -0
- package/dist/bravoMacCookie.js.map +1 -0
- package/dist/bravoWindowsCookie.d.ts +5 -0
- package/dist/bravoWindowsCookie.js +12 -0
- package/dist/bravoWindowsCookie.js.map +1 -0
- package/dist/browsers/bravo.d.ts +5 -0
- package/dist/browsers/bravo.js +17 -0
- package/dist/browsers/bravo.js.map +1 -0
- package/dist/browsers/chrome.d.ts +5 -0
- package/dist/browsers/chrome.js +17 -0
- package/dist/browsers/chrome.js.map +1 -0
- package/dist/browsers/edge.d.ts +5 -0
- package/dist/browsers/edge.js +17 -0
- package/dist/browsers/edge.js.map +1 -0
- package/dist/browsers/firefoxCookie.d.ts +12 -0
- package/dist/browsers/firefoxCookie.js +8 -0
- package/dist/browsers/firefoxCookie.js.map +1 -0
- package/dist/browsers/opera.d.ts +5 -0
- package/dist/browsers/opera.js +17 -0
- package/dist/browsers/opera.js.map +1 -0
- package/dist/browsers/safariCookie.d.ts +12 -0
- package/dist/browsers/safariCookie.js +8 -0
- package/dist/browsers/safariCookie.js.map +1 -0
- package/dist/browsers/vivaldi.d.ts +5 -0
- package/dist/browsers/vivaldi.js +17 -0
- package/dist/browsers/vivaldi.js.map +1 -0
- package/dist/chromeLinuxCookie.d.ts +5 -0
- package/dist/chromeLinuxCookie.js +12 -0
- package/dist/chromeLinuxCookie.js.map +1 -0
- package/dist/chromeMacCookie.d.ts +5 -0
- package/dist/chromeMacCookie.js +12 -0
- package/dist/chromeMacCookie.js.map +1 -0
- package/dist/chromeWindowsCookie.d.ts +5 -0
- package/dist/chromeWindowsCookie.js +12 -0
- package/dist/chromeWindowsCookie.js.map +1 -0
- package/dist/chunk-2ILP4UJD.js +69 -0
- package/dist/chunk-2ILP4UJD.js.map +1 -0
- package/dist/chunk-4G6NLIPV.js +98 -0
- package/dist/chunk-4G6NLIPV.js.map +1 -0
- package/dist/chunk-5AEUDMIX.js +68 -0
- package/dist/chunk-5AEUDMIX.js.map +1 -0
- package/dist/chunk-5AJFPLWB.js +98 -0
- package/dist/chunk-5AJFPLWB.js.map +1 -0
- package/dist/chunk-6OYYWSIJ.js +58 -0
- package/dist/chunk-6OYYWSIJ.js.map +1 -0
- package/dist/chunk-A3YGBITD.js +221 -0
- package/dist/chunk-A3YGBITD.js.map +1 -0
- package/dist/chunk-AR5Q6KM4.js +37 -0
- package/dist/chunk-AR5Q6KM4.js.map +1 -0
- package/dist/chunk-D23AYBOE.js +35 -0
- package/dist/chunk-D23AYBOE.js.map +1 -0
- package/dist/chunk-E6CQFEXM.js +98 -0
- package/dist/chunk-E6CQFEXM.js.map +1 -0
- package/dist/chunk-EPL3V4O3.js +41 -0
- package/dist/chunk-EPL3V4O3.js.map +1 -0
- package/dist/chunk-EZBYP7NP.js +58 -0
- package/dist/chunk-EZBYP7NP.js.map +1 -0
- package/dist/chunk-GRIZYEBN.js +58 -0
- package/dist/chunk-GRIZYEBN.js.map +1 -0
- package/dist/chunk-HOGGS6QP.js +35 -0
- package/dist/chunk-HOGGS6QP.js.map +1 -0
- package/dist/chunk-IXZPT56H.js +35 -0
- package/dist/chunk-IXZPT56H.js.map +1 -0
- package/dist/chunk-J2UYSXFG.js +69 -0
- package/dist/chunk-J2UYSXFG.js.map +1 -0
- package/dist/chunk-JTBFDYPY.js +244 -0
- package/dist/chunk-JTBFDYPY.js.map +1 -0
- package/dist/chunk-LTLRZZW3.js +41 -0
- package/dist/chunk-LTLRZZW3.js.map +1 -0
- package/dist/chunk-MLKERL3L.js +98 -0
- package/dist/chunk-MLKERL3L.js.map +1 -0
- package/dist/chunk-NGBAATI3.js +35 -0
- package/dist/chunk-NGBAATI3.js.map +1 -0
- package/dist/chunk-PT5JK5UI.js +98 -0
- package/dist/chunk-PT5JK5UI.js.map +1 -0
- package/dist/chunk-Q2LDNBEA.js +35 -0
- package/dist/chunk-Q2LDNBEA.js.map +1 -0
- package/dist/chunk-QCW7AUP6.js +62 -0
- package/dist/chunk-QCW7AUP6.js.map +1 -0
- package/dist/chunk-SRZIPU62.js +69 -0
- package/dist/chunk-SRZIPU62.js.map +1 -0
- package/dist/chunk-SSXWHBKV.js +69 -0
- package/dist/chunk-SSXWHBKV.js.map +1 -0
- package/dist/chunk-TWA6YYS5.js +58 -0
- package/dist/chunk-TWA6YYS5.js.map +1 -0
- package/dist/chunk-TYLH6G3Z.js +52 -0
- package/dist/chunk-TYLH6G3Z.js.map +1 -0
- package/dist/chunk-U4G74MHA.js +69 -0
- package/dist/chunk-U4G74MHA.js.map +1 -0
- package/dist/chunk-UR6BPQ2T.js +103 -0
- package/dist/chunk-UR6BPQ2T.js.map +1 -0
- package/dist/chunk-XDL34EPI.js +35 -0
- package/dist/chunk-XDL34EPI.js.map +1 -0
- package/dist/chunk-YD3PNZMV.js +447 -0
- package/dist/chunk-YD3PNZMV.js.map +1 -0
- package/dist/common.d.ts +15 -0
- package/dist/common.js +9 -0
- package/dist/common.js.map +1 -0
- package/dist/edgeLinuxCookie.d.ts +5 -0
- package/dist/edgeLinuxCookie.js +12 -0
- package/dist/edgeLinuxCookie.js.map +1 -0
- package/dist/edgeMacCookie.d.ts +5 -0
- package/dist/edgeMacCookie.js +12 -0
- package/dist/edgeMacCookie.js.map +1 -0
- package/dist/edgeWindowsCookie.d.ts +5 -0
- package/dist/edgeWindowsCookie.js +12 -0
- package/dist/edgeWindowsCookie.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/operaLinuxCookie.d.ts +5 -0
- package/dist/operaLinuxCookie.js +12 -0
- package/dist/operaLinuxCookie.js.map +1 -0
- package/dist/operaMacCookie.d.ts +5 -0
- package/dist/operaMacCookie.js +12 -0
- package/dist/operaMacCookie.js.map +1 -0
- package/dist/operaWindowsCookie.d.ts +5 -0
- package/dist/operaWindowsCookie.js +12 -0
- package/dist/operaWindowsCookie.js.map +1 -0
- package/dist/publicApi.d.ts +20 -0
- package/dist/publicApi.js +38 -0
- package/dist/publicApi.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/util/crypto.d.ts +9 -0
- package/dist/util/crypto.js +11 -0
- package/dist/util/crypto.js.map +1 -0
- package/dist/util/fileHelper.d.ts +4 -0
- package/dist/util/fileHelper.js +9 -0
- package/dist/util/fileHelper.js.map +1 -0
- package/dist/util/linuxKeyring.d.ts +11 -0
- package/dist/util/linuxKeyring.js +8 -0
- package/dist/util/linuxKeyring.js.map +1 -0
- package/dist/util/macKeyChain.d.ts +16 -0
- package/dist/util/macKeyChain.js +10 -0
- package/dist/util/macKeyChain.js.map +1 -0
- package/dist/util/processExecutor.d.ts +7 -0
- package/dist/util/processExecutor.js +7 -0
- package/dist/util/processExecutor.js.map +1 -0
- package/dist/util/windowsDpapi.d.ts +9 -0
- package/dist/util/windowsDpapi.js +8 -0
- package/dist/util/windowsDpapi.js.map +1 -0
- package/dist/vivaldiLinuxCookie.d.ts +5 -0
- package/dist/vivaldiLinuxCookie.js +12 -0
- package/dist/vivaldiLinuxCookie.js.map +1 -0
- package/dist/vivaldiMacCookie.d.ts +5 -0
- package/dist/vivaldiMacCookie.js +12 -0
- package/dist/vivaldiMacCookie.js.map +1 -0
- package/dist/vivaldiWindowsCookie.d.ts +5 -0
- package/dist/vivaldiWindowsCookie.js +12 -0
- package/dist/vivaldiWindowsCookie.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/windowsDpapi.ts"],"sourcesContent":["// Windows DPAPI decryption via PowerShell\nimport { executeProcess } from './processExecutor';\n\nexport async function decryptWindowsDpapi(\n encryptedBytes: Buffer,\n timeoutMs: number = 5000\n): Promise<{ success: true; decrypted: Buffer } | { success: false; error: string }> {\n const base64Input = encryptedBytes.toString('base64');\n const script = [\n 'Add-Type -AssemblyName System.Security',\n `$bytes = [Convert]::FromBase64String(\"${base64Input}\")`,\n '$decrypted = [System.Security.Cryptography.ProtectedData]::Unprotect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)',\n '[Convert]::ToBase64String($decrypted)',\n ].join('; ');\n\n const result = await executeProcess(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', script],\n timeoutMs\n );\n\n if (result.code !== 0) {\n return { success: false, error: result.stderr.trim() || `powershell exit ${result.code}` };\n }\n\n const output = result.stdout.trim();\n if (!output) {\n return { success: false, error: 'DPAPI decryption returned empty result' };\n }\n\n try {\n const decrypted = Buffer.from(output, 'base64');\n return { success: true, decrypted };\n } catch (error) {\n return { success: false, error: `Failed to decode DPAPI result: ${(error as Error).message}` };\n }\n}\n"],"mappings":";;;;;AAGA,eAAsB,oBACpB,gBACA,YAAoB,KAC+D;AACnF,QAAM,cAAc,eAAe,SAAS,QAAQ;AACpD,QAAM,SAAS;AAAA,IACb;AAAA,IACA,yCAAyC,WAAW;AAAA,IACpD;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,cAAc,mBAAmB,YAAY,MAAM;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,SAAS,OAAO,OAAO,OAAO,OAAO,KAAK,KAAK,mBAAmB,OAAO,IAAI,GAAG;AAAA,EAC3F;AAEA,QAAM,SAAS,OAAO,OAAO,KAAK;AAClC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,SAAS,OAAO,OAAO,yCAAyC;AAAA,EAC3E;AAEA,MAAI;AACF,UAAM,YAAY,OAAO,KAAK,QAAQ,QAAQ;AAC9C,WAAO,EAAE,SAAS,MAAM,UAAU;AAAA,EACpC,SAAS,OAAO;AACd,WAAO,EAAE,SAAS,OAAO,OAAO,kCAAmC,MAAgB,OAAO,GAAG;AAAA,EAC/F;AACF;","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCookiesFromEdgeSqlite
|
|
3
|
+
} from "./chunk-SRZIPU62.js";
|
|
4
|
+
import {
|
|
5
|
+
getCookiesFromEdgeWindowsSqlite
|
|
6
|
+
} from "./chunk-E6CQFEXM.js";
|
|
7
|
+
import {
|
|
8
|
+
getCookiesFromEdgeLinuxSqlite
|
|
9
|
+
} from "./chunk-QCW7AUP6.js";
|
|
10
|
+
|
|
11
|
+
// src/browsers/edge.ts
|
|
12
|
+
async function getCookiesFromEdge(options, origins, cookieNames) {
|
|
13
|
+
const warnings = [];
|
|
14
|
+
if (process.platform === "darwin") {
|
|
15
|
+
const result = await getCookiesFromEdgeSqlite(options, origins, cookieNames);
|
|
16
|
+
warnings.push(...result.warnings);
|
|
17
|
+
return { cookies: result.cookies, warnings };
|
|
18
|
+
}
|
|
19
|
+
if (process.platform === "win32") {
|
|
20
|
+
const result = await getCookiesFromEdgeWindowsSqlite(options, origins, cookieNames);
|
|
21
|
+
warnings.push(...result.warnings);
|
|
22
|
+
return { cookies: result.cookies, warnings };
|
|
23
|
+
}
|
|
24
|
+
if (process.platform === "linux") {
|
|
25
|
+
const result = await getCookiesFromEdgeLinuxSqlite(options, origins, cookieNames);
|
|
26
|
+
warnings.push(...result.warnings);
|
|
27
|
+
return { cookies: result.cookies, warnings };
|
|
28
|
+
}
|
|
29
|
+
return { cookies: [], warnings };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
getCookiesFromEdge
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-D23AYBOE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browsers/edge.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult } from '../types';\nimport { getCookiesFromEdgeSqlite } from '../edgeMacCookie';\nimport { getCookiesFromEdgeWindowsSqlite } from '../edgeWindowsCookie';\nimport { getCookiesFromEdgeLinuxSqlite } from '../edgeLinuxCookie';\n\nexport async function getCookiesFromEdge(\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 getCookiesFromEdgeSqlite(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 getCookiesFromEdgeWindowsSqlite(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 getCookiesFromEdgeLinuxSqlite(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,mBACpB,SACA,SACA,aAC2B;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,SAAS,MAAM,yBAAyB,SAAS,SAAS,WAAW;AAC3E,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,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,8BAA8B,SAAS,SAAS,WAAW;AAChF,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/edgeWindowsCookie.ts
|
|
15
|
+
import path from "path";
|
|
16
|
+
import { readFileSync } from "fs";
|
|
17
|
+
async function getCookiesFromEdgeWindowsSqlite(options, origins, cookieNames) {
|
|
18
|
+
const edgeUserDataDir = resolveEdgeWindowsUserDataDir();
|
|
19
|
+
const sqlDBPath = resolveEdgeWindowsDBPath(edgeUserDataDir, options.profile);
|
|
20
|
+
if (!sqlDBPath) {
|
|
21
|
+
return {
|
|
22
|
+
cookies: [],
|
|
23
|
+
warnings: ["Could not resolve Edge cookie database path on Windows."]
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const warnings = [];
|
|
27
|
+
const keyResult = await extractEdgeWindowsEncryptionKey(edgeUserDataDir);
|
|
28
|
+
if (!keyResult.success) {
|
|
29
|
+
warnings.push(`Failed to get Edge 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
|
+
"edge",
|
|
46
|
+
decryptFn
|
|
47
|
+
);
|
|
48
|
+
warnings.push(...dbWarnings);
|
|
49
|
+
return { cookies, warnings };
|
|
50
|
+
}
|
|
51
|
+
function resolveEdgeWindowsUserDataDir() {
|
|
52
|
+
const localAppData = process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || "", "AppData", "Local");
|
|
53
|
+
return path.join(localAppData, "Microsoft", "Edge", "User Data");
|
|
54
|
+
}
|
|
55
|
+
function resolveEdgeWindowsDBPath(userDataDir, profile) {
|
|
56
|
+
return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);
|
|
57
|
+
}
|
|
58
|
+
async function extractEdgeWindowsEncryptionKey(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
|
+
getCookiesFromEdgeWindowsSqlite
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=chunk-E6CQFEXM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/edgeWindowsCookie.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 getCookiesFromEdgeWindowsSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const edgeUserDataDir = resolveEdgeWindowsUserDataDir();\n const sqlDBPath = resolveEdgeWindowsDBPath(edgeUserDataDir, options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Edge cookie database path on Windows.'],\n };\n }\n\n const warnings: string[] = [];\n\n const keyResult = await extractEdgeWindowsEncryptionKey(edgeUserDataDir);\n if (!keyResult.success) {\n warnings.push(`Failed to get Edge 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 'edge',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveEdgeWindowsUserDataDir(): string {\n const localAppData =\n process.env.LOCALAPPDATA || path.join(process.env.USERPROFILE || '', 'AppData', 'Local');\n return path.join(localAppData, 'Microsoft', 'Edge', 'User Data');\n}\n\nfunction resolveEdgeWindowsDBPath(userDataDir: string, profile?: string): string | null {\n return resolveBrowserDefaultorSpecificDBPath([userDataDir], profile);\n}\n\nasync function extractEdgeWindowsEncryptionKey(\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,gCACpB,SACA,SACA,aAC2B;AAC3B,QAAM,kBAAkB,8BAA8B;AACtD,QAAM,YAAY,yBAAyB,iBAAiB,QAAQ,OAAO;AAC3E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,yDAAyD;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,YAAY,MAAM,gCAAgC,eAAe;AACvE,MAAI,CAAC,UAAU,SAAS;AACtB,aAAS,KAAK,sCAAsC,UAAU,KAAK,EAAE;AACrE,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,gCAAwC;AAC/C,QAAM,eACJ,QAAQ,IAAI,gBAAgB,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAI,WAAW,OAAO;AACzF,SAAO,KAAK,KAAK,cAAc,aAAa,QAAQ,WAAW;AACjE;AAEA,SAAS,yBAAyB,aAAqB,SAAiC;AACtF,SAAO,sCAAsC,CAAC,WAAW,GAAG,OAAO;AACrE;AAEA,eAAe,gCACb,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,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
executeProcess
|
|
3
|
+
} from "./chunk-LTLRZZW3.js";
|
|
4
|
+
|
|
5
|
+
// src/util/linuxKeyring.ts
|
|
6
|
+
var LINUX_DEFAULT_PASSWORD = "peanuts";
|
|
7
|
+
async function findLinuxChromiumPassword(application, label, timeoutMs) {
|
|
8
|
+
const warnings = [];
|
|
9
|
+
const schemas = [
|
|
10
|
+
"chrome_libsecret_os_crypt_password_v2",
|
|
11
|
+
"chrome_libsecret_os_crypt_password_v1"
|
|
12
|
+
];
|
|
13
|
+
for (const schema of schemas) {
|
|
14
|
+
const result = await executeProcess(
|
|
15
|
+
"secret-tool",
|
|
16
|
+
["lookup", "xdg:schema", schema, "application", application],
|
|
17
|
+
timeoutMs
|
|
18
|
+
);
|
|
19
|
+
if (result.code === 0) {
|
|
20
|
+
const password = result.stdout.trim();
|
|
21
|
+
if (password) {
|
|
22
|
+
return { password, warnings };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const labelResult = await executeProcess(
|
|
27
|
+
"secret-tool",
|
|
28
|
+
["lookup", "xdg:schema", "chrome_libsecret_os_crypt_password_v1", "application", application],
|
|
29
|
+
timeoutMs
|
|
30
|
+
);
|
|
31
|
+
if (labelResult.code === 0 && labelResult.stdout.trim()) {
|
|
32
|
+
return { password: labelResult.stdout.trim(), warnings };
|
|
33
|
+
}
|
|
34
|
+
warnings.push(`Could not retrieve ${label} from keyring, using default password.`);
|
|
35
|
+
return { password: LINUX_DEFAULT_PASSWORD, warnings };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
findLinuxChromiumPassword
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=chunk-EPL3V4O3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/linuxKeyring.ts"],"sourcesContent":["// Linux keyring password retrieval via secret-tool (libsecret)\nimport { executeProcess } from './processExecutor';\n\nconst LINUX_DEFAULT_PASSWORD = 'peanuts';\n\n/**\n * Attempt to retrieve the Chromium encryption password from the Linux keyring.\n * Tries secret-tool (GNOME Keyring / KDE Wallet) with v2 and v1 schemas.\n * Falls back to the hardcoded default password \"peanuts\" if keyring is unavailable.\n */\nexport async function findLinuxChromiumPassword(\n application: string,\n label: string,\n timeoutMs: number\n): Promise<{ password: string; warnings: string[] }> {\n const warnings: string[] = [];\n\n // Try v2 schema first, then v1\n const schemas = [\n 'chrome_libsecret_os_crypt_password_v2',\n 'chrome_libsecret_os_crypt_password_v1',\n ];\n\n for (const schema of schemas) {\n const result = await executeProcess(\n 'secret-tool',\n ['lookup', 'xdg:schema', schema, 'application', application],\n timeoutMs\n );\n if (result.code === 0) {\n const password = result.stdout.trim();\n if (password) {\n return { password, warnings };\n }\n }\n }\n\n // Also try looking up by label directly\n const labelResult = await executeProcess(\n 'secret-tool',\n ['lookup', 'xdg:schema', 'chrome_libsecret_os_crypt_password_v1', 'application', application],\n timeoutMs\n );\n if (labelResult.code === 0 && labelResult.stdout.trim()) {\n return { password: labelResult.stdout.trim(), warnings };\n }\n\n warnings.push(`Could not retrieve ${label} from keyring, using default password.`);\n return { password: LINUX_DEFAULT_PASSWORD, warnings };\n}\n"],"mappings":";;;;;AAGA,IAAM,yBAAyB;AAO/B,eAAsB,0BACpB,aACA,OACA,WACmD;AACnD,QAAM,WAAqB,CAAC;AAG5B,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,CAAC,UAAU,cAAc,QAAQ,eAAe,WAAW;AAAA,MAC3D;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,WAAW,OAAO,OAAO,KAAK;AACpC,UAAI,UAAU;AACZ,eAAO,EAAE,UAAU,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,CAAC,UAAU,cAAc,yCAAyC,eAAe,WAAW;AAAA,IAC5F;AAAA,EACF;AACA,MAAI,YAAY,SAAS,KAAK,YAAY,OAAO,KAAK,GAAG;AACvD,WAAO,EAAE,UAAU,YAAY,OAAO,KAAK,GAAG,SAAS;AAAA,EACzD;AAEA,WAAS,KAAK,sBAAsB,KAAK,wCAAwC;AACjF,SAAO,EAAE,UAAU,wBAAwB,SAAS;AACtD;","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/bravoLinuxCookie.ts
|
|
16
|
+
import { homedir } from "os";
|
|
17
|
+
async function getCookiesFromBraveLinuxSqlite(options, origins, cookieNames) {
|
|
18
|
+
const sqlDBPath = resolveBraveLinuxDBPath(options.profile);
|
|
19
|
+
if (!sqlDBPath) {
|
|
20
|
+
return {
|
|
21
|
+
cookies: [],
|
|
22
|
+
warnings: ["Could not resolve Brave cookie database path on Linux."]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const warnings = [];
|
|
26
|
+
const passwordResult = await findLinuxChromiumPassword("brave", "Brave 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
|
+
"brave",
|
|
44
|
+
decryptFn
|
|
45
|
+
);
|
|
46
|
+
warnings.push(...dbWarnings);
|
|
47
|
+
return { cookies, warnings };
|
|
48
|
+
}
|
|
49
|
+
function resolveBraveLinuxDBPath(profile) {
|
|
50
|
+
const homeDir = homedir();
|
|
51
|
+
const roots = [`${homeDir}/.config/BraveSoftware/Brave-Browser`];
|
|
52
|
+
return resolveBrowserDefaultorSpecificDBPath(roots, profile);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
getCookiesFromBraveLinuxSqlite
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=chunk-EZBYP7NP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bravoLinuxCookie.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 getCookiesFromBraveLinuxSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveBraveLinuxDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Brave cookie database path on Linux.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findLinuxChromiumPassword('brave', 'Brave Safe Storage', 5000);\n if (passwordResult.warnings.length > 0) {\n warnings.push(...passwordResult.warnings);\n }\n\n // iterations is 1 for Linux Brave (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 'brave',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveBraveLinuxDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const roots = [`${homeDir}/.config/BraveSoftware/Brave-Browser`];\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,sCAAsC;AAC/D,SAAO,sCAAsC,OAAO,OAAO;AAC7D;","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/vivaldiLinuxCookie.ts
|
|
16
|
+
import { homedir } from "os";
|
|
17
|
+
async function getCookiesFromVivaldiLinuxSqlite(options, origins, cookieNames) {
|
|
18
|
+
const sqlDBPath = resolveVivaldiLinuxDBPath(options.profile);
|
|
19
|
+
if (!sqlDBPath) {
|
|
20
|
+
return {
|
|
21
|
+
cookies: [],
|
|
22
|
+
warnings: ["Could not resolve Vivaldi cookie database path on Linux."]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const warnings = [];
|
|
26
|
+
const passwordResult = await findLinuxChromiumPassword("vivaldi", "Vivaldi 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
|
+
"vivaldi",
|
|
44
|
+
decryptFn
|
|
45
|
+
);
|
|
46
|
+
warnings.push(...dbWarnings);
|
|
47
|
+
return { cookies, warnings };
|
|
48
|
+
}
|
|
49
|
+
function resolveVivaldiLinuxDBPath(profile) {
|
|
50
|
+
const homeDir = homedir();
|
|
51
|
+
const roots = [`${homeDir}/.config/vivaldi`];
|
|
52
|
+
return resolveBrowserDefaultorSpecificDBPath(roots, profile);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
getCookiesFromVivaldiLinuxSqlite
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=chunk-GRIZYEBN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vivaldiLinuxCookie.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 getCookiesFromVivaldiLinuxSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveVivaldiLinuxDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Vivaldi cookie database path on Linux.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findLinuxChromiumPassword('vivaldi', 'Vivaldi Safe Storage', 5000);\n if (passwordResult.warnings.length > 0) {\n warnings.push(...passwordResult.warnings);\n }\n\n // iterations is 1 for Linux Vivaldi (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 'vivaldi',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveVivaldiLinuxDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const roots = [`${homeDir}/.config/vivaldi`];\n return resolveBrowserDefaultorSpecificDBPath(roots, profile);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAOxB,eAAsB,iCACpB,SACA,SACA,aAC2B;AAC3B,QAAM,YAAY,0BAA0B,QAAQ,OAAO;AAC3D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,0DAA0D;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM,0BAA0B,WAAW,wBAAwB,GAAI;AAC9F,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,0BAA0B,SAAiC;AAClE,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,CAAC,GAAG,OAAO,kBAAkB;AAC3C,SAAO,sCAAsC,OAAO,OAAO;AAC7D;","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCookiesFromOperaLinuxSqlite
|
|
3
|
+
} from "./chunk-TWA6YYS5.js";
|
|
4
|
+
import {
|
|
5
|
+
getCookiesFromOperaMacSqlite
|
|
6
|
+
} from "./chunk-2ILP4UJD.js";
|
|
7
|
+
import {
|
|
8
|
+
getCookiesFromOperaWindowsSqlite
|
|
9
|
+
} from "./chunk-5AJFPLWB.js";
|
|
10
|
+
|
|
11
|
+
// src/browsers/opera.ts
|
|
12
|
+
async function getCookiesFromOpera(options, origins, cookieNames) {
|
|
13
|
+
const warnings = [];
|
|
14
|
+
if (process.platform === "darwin") {
|
|
15
|
+
const result = await getCookiesFromOperaMacSqlite(options, origins, cookieNames);
|
|
16
|
+
warnings.push(...result.warnings);
|
|
17
|
+
return { cookies: result.cookies, warnings };
|
|
18
|
+
}
|
|
19
|
+
if (process.platform === "win32") {
|
|
20
|
+
const result = await getCookiesFromOperaWindowsSqlite(options, origins, cookieNames);
|
|
21
|
+
warnings.push(...result.warnings);
|
|
22
|
+
return { cookies: result.cookies, warnings };
|
|
23
|
+
}
|
|
24
|
+
if (process.platform === "linux") {
|
|
25
|
+
const result = await getCookiesFromOperaLinuxSqlite(options, origins, cookieNames);
|
|
26
|
+
warnings.push(...result.warnings);
|
|
27
|
+
return { cookies: result.cookies, warnings };
|
|
28
|
+
}
|
|
29
|
+
return { cookies: [], warnings };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
getCookiesFromOpera
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-HOGGS6QP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browsers/opera.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult } from '../types';\nimport { getCookiesFromOperaMacSqlite } from '../operaMacCookie';\nimport { getCookiesFromOperaWindowsSqlite } from '../operaWindowsCookie';\nimport { getCookiesFromOperaLinuxSqlite } from '../operaLinuxCookie';\n\nexport async function getCookiesFromOpera(\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 getCookiesFromOperaMacSqlite(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 getCookiesFromOperaWindowsSqlite(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 getCookiesFromOperaLinuxSqlite(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":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCookiesFromVivaldiLinuxSqlite
|
|
3
|
+
} from "./chunk-GRIZYEBN.js";
|
|
4
|
+
import {
|
|
5
|
+
getCookiesFromVivaldiMacSqlite
|
|
6
|
+
} from "./chunk-J2UYSXFG.js";
|
|
7
|
+
import {
|
|
8
|
+
getCookiesFromVivaldiWindowsSqlite
|
|
9
|
+
} from "./chunk-4G6NLIPV.js";
|
|
10
|
+
|
|
11
|
+
// src/browsers/vivaldi.ts
|
|
12
|
+
async function getCookiesFromVivaldi(options, origins, cookieNames) {
|
|
13
|
+
const warnings = [];
|
|
14
|
+
if (process.platform === "darwin") {
|
|
15
|
+
const result = await getCookiesFromVivaldiMacSqlite(options, origins, cookieNames);
|
|
16
|
+
warnings.push(...result.warnings);
|
|
17
|
+
return { cookies: result.cookies, warnings };
|
|
18
|
+
}
|
|
19
|
+
if (process.platform === "win32") {
|
|
20
|
+
const result = await getCookiesFromVivaldiWindowsSqlite(options, origins, cookieNames);
|
|
21
|
+
warnings.push(...result.warnings);
|
|
22
|
+
return { cookies: result.cookies, warnings };
|
|
23
|
+
}
|
|
24
|
+
if (process.platform === "linux") {
|
|
25
|
+
const result = await getCookiesFromVivaldiLinuxSqlite(options, origins, cookieNames);
|
|
26
|
+
warnings.push(...result.warnings);
|
|
27
|
+
return { cookies: result.cookies, warnings };
|
|
28
|
+
}
|
|
29
|
+
return { cookies: [], warnings };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
getCookiesFromVivaldi
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-IXZPT56H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browsers/vivaldi.ts"],"sourcesContent":["import { GetCookiesOptions, GetCookiesResult } from '../types';\nimport { getCookiesFromVivaldiMacSqlite } from '../vivaldiMacCookie';\nimport { getCookiesFromVivaldiWindowsSqlite } from '../vivaldiWindowsCookie';\nimport { getCookiesFromVivaldiLinuxSqlite } from '../vivaldiLinuxCookie';\n\nexport async function getCookiesFromVivaldi(\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 getCookiesFromVivaldiMacSqlite(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 getCookiesFromVivaldiWindowsSqlite(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 getCookiesFromVivaldiLinuxSqlite(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,sBACpB,SACA,SACA,aAC2B;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,SAAS,MAAM,+BAA+B,SAAS,SAAS,WAAW;AACjF,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAAS,MAAM,mCAAmC,SAAS,SAAS,WAAW;AACrF,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,SAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AACjC;","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/vivaldiMacCookie.ts
|
|
16
|
+
import { homedir } from "os";
|
|
17
|
+
async function getCookiesFromVivaldiMacSqlite(options, origins, cookieNames) {
|
|
18
|
+
const sqlDBPath = resolveVivaldiMacDBPath(options.profile);
|
|
19
|
+
if (!sqlDBPath) {
|
|
20
|
+
return {
|
|
21
|
+
cookies: [],
|
|
22
|
+
warnings: ["Could not resolve Vivaldi cookie database path."]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const warnings = [];
|
|
26
|
+
const passwordResult = await findFirstMacKeyChainPassword(
|
|
27
|
+
["Vivaldi Safe Storage"],
|
|
28
|
+
"Vivaldi",
|
|
29
|
+
5e3,
|
|
30
|
+
"Vivaldi Safe Storage"
|
|
31
|
+
);
|
|
32
|
+
if (!passwordResult.success) {
|
|
33
|
+
warnings.push(`Failed to get Vivaldi decryption key: ${passwordResult.error}`);
|
|
34
|
+
return { cookies: [], warnings };
|
|
35
|
+
}
|
|
36
|
+
const vivaldiPassword = passwordResult.password.trim();
|
|
37
|
+
if (!vivaldiPassword) {
|
|
38
|
+
warnings.push("Vivaldi decryption key is empty.");
|
|
39
|
+
return { cookies: [], warnings };
|
|
40
|
+
}
|
|
41
|
+
const key = getAES128CBCKey(vivaldiPassword, 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
|
+
"vivaldi",
|
|
55
|
+
decryptFn
|
|
56
|
+
);
|
|
57
|
+
warnings.push(...dbWarnings);
|
|
58
|
+
return { cookies, warnings };
|
|
59
|
+
}
|
|
60
|
+
function resolveVivaldiMacDBPath(profile) {
|
|
61
|
+
const homeDir = homedir();
|
|
62
|
+
const rootPath = `${homeDir}/Library/Application Support/Vivaldi`;
|
|
63
|
+
return resolveBrowserDefaultorSpecificDBPath([rootPath], profile);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export {
|
|
67
|
+
getCookiesFromVivaldiMacSqlite
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=chunk-J2UYSXFG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vivaldiMacCookie.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 getCookiesFromVivaldiMacSqlite(\n options: GetCookiesOptions,\n origins: string[],\n cookieNames: Set<string> | null\n): Promise<GetCookiesResult> {\n const sqlDBPath = resolveVivaldiMacDBPath(options.profile);\n if (!sqlDBPath) {\n return {\n cookies: [],\n warnings: ['Could not resolve Vivaldi cookie database path.'],\n };\n }\n\n const warnings: string[] = [];\n\n const passwordResult = await findFirstMacKeyChainPassword(\n ['Vivaldi Safe Storage'],\n 'Vivaldi',\n 5000,\n 'Vivaldi Safe Storage'\n );\n if (!passwordResult.success) {\n warnings.push(`Failed to get Vivaldi decryption key: ${passwordResult.error}`);\n return { cookies: [], warnings };\n }\n\n const vivaldiPassword = passwordResult.password.trim();\n if (!vivaldiPassword) {\n warnings.push('Vivaldi decryption key is empty.');\n return { cookies: [], warnings };\n }\n\n // iterations is 1003 for macOS Vivaldi (same as Chrome)\n const key = getAES128CBCKey(vivaldiPassword, 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 'vivaldi',\n decryptFn\n );\n warnings.push(...dbWarnings);\n\n return { cookies, warnings };\n}\n\nfunction resolveVivaldiMacDBPath(profile?: string): string | null {\n const homeDir = homedir();\n const rootPath = `${homeDir}/Library/Application Support/Vivaldi`;\n return resolveBrowserDefaultorSpecificDBPath([rootPath], 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,iDAAiD;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,sBAAsB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,eAAe,SAAS;AAC3B,aAAS,KAAK,yCAAyC,eAAe,KAAK,EAAE;AAC7E,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAEA,QAAM,kBAAkB,eAAe,SAAS,KAAK;AACrD,MAAI,CAAC,iBAAiB;AACpB,aAAS,KAAK,kCAAkC;AAChD,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA,EACjC;AAGA,QAAM,MAAM,gBAAgB,iBAAiB,IAAI;AACjD,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,WAAW,GAAG,OAAO;AAC3B,SAAO,sCAAsC,CAAC,QAAQ,GAAG,OAAO;AAClE;","names":[]}
|