@mherod/get-cookie 4.3.0 → 4.3.2
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/dist/cli.cjs +2 -2
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
- package/.claude/settings.local.json +0 -11
- package/test-exports/package.json +0 -15
- package/test-exports/test-esm.mjs +0 -12
- package/test-exports/test-runtime.js +0 -14
- package/test-exports/test-types.ts +0 -61
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createConsola as Ee}from"consola";import{homedir as ke}from"os";import{config as xe}from"dotenv";import{z as O}from"zod";xe();var Se=O.object({LOG_LEVEL:O.enum(["debug","info","warn","error"]).default("info"),HOME:O.string().optional().transform(t=>t??process.env.USERPROFILE??"").pipe(O.string().min(1))}),M=Se.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:ke()});var ve=Ee({fancy:!0,formatOptions:{showLogLevel:!1,colors:!0,date:!1,compact:!0,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:M.LOG_LEVEL==="debug"?5:2}),Pr=M.LOG_LEVEL==="debug",Be=ve,w=Be;function Z(t,e,r){e?w.success(`${t} succeeded`,r):w.error(`${t} failed`,r)}function C(t,e,r){let o=e instanceof Error?e.message:String(e);w.error(t,{...r,error:o})}function v(t,e,r){w.warn(`[${t}] ${e}`,r)}function m(t){return w.withTag(t)}var Pe={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},d=class{constructor(e,r){this.browserName=r;let o=m(e);this.logger=o||Pe}async queryCookies(e,r,o,i){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:o,force:i}),await this.executeQuery(e,r,o,i)}catch(s){return s instanceof Error?this.logger.error("Failed to query cookies",{error:s.message,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:i}):this.logger.error("Failed to query cookies",{error:String(s),browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:i}),[]}}};import{existsSync as Ae}from"fs";import{join as W}from"path";import _e from"fast-glob";import Re from"better-sqlite3";var T=m("QuerySqliteThenTransform");function Le(t){return new Promise(e=>setTimeout(e,t))}function Fe(t){if(t instanceof Error){let e=t.message.toLowerCase();return e.includes("database is locked")||e.includes("database locked")||e.includes("sqlite_busy")}return!1}function Oe(t){try{let e=new Re(t,{readonly:!0,fileMustExist:!0});try{e.pragma("journal_mode = WAL"),T.debug("Set WAL mode for database",{file:t})}catch(r){T.warn("Failed to set WAL mode, continuing with default",{file:t,error:r instanceof Error?r.message:String(r)})}return e}catch(e){throw C("Database open failed",e,{file:t}),e}}function Te(t){try{return t.close(),Promise.resolve()}catch(e){return C("Database close failed",e),Promise.reject(e instanceof Error?e:new Error("Failed to close database: Unknown error"))}}async function De(t){let{file:e,sql:r,params:o,rowFilter:i,rowTransform:s}=t,n;try{n=Oe(e);let a=n.prepare(r).all(o),c=i?a.filter(i):a;return s?c.map(s):c}finally{n&&await Te(n)}}async function D(t){let{file:e,sql:r,retryAttempts:o=3}=t,i=[100,500,1e3],s;for(let n=0;n<o;n++)try{let f=await De(t);return n>0&&T.info("Database query succeeded after retry",{file:e,attempt:n+1,totalAttempts:o}),f}catch(f){if(s=f,Fe(f)&&n<o-1){let a=i[n]||1e3;T.warn("Database locked, retrying after delay",{file:e,attempt:n+1,totalAttempts:o,delay:a,error:f instanceof Error?f.message:String(f)}),await Le(a);continue}throw C("Database query failed",f,{file:e,sql:r,attempt:n+1}),f}throw s}import{homedir as Ie,platform as J}from"os";import{join as V}from"path";var b=(()=>{let t=Ie();if(!t)throw new Error("Unable to determine user home directory");switch(J()){case"darwin":return V(t,"Library","Application Support","Google","Chrome");case"win32":return V(t,"AppData","Local","Google","Chrome","User Data");case"linux":return V(t,".config","google-chrome");default:throw new Error(`Platform ${J()} is not supported`)}})();var P=m("getEncryptedChromeCookie");function Ne(t){if(typeof t!="string")return!1;let e=t.trim();return e.length===0?!1:Ae(e)}async function Ue(){let t=[W(b,"Default/Cookies"),W(b,"Profile */Cookies"),W(b,"Profile Default/Cookies")],e=[];for(let r of t){let o=await _e(r);e.push(...o)}return P.debug("ChromeCookies","Found cookie files",{count:e.length,files:e}),e}function $e(t,e){let r=t==="%",o=r?"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE host_key LIKE ?":"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE name = ? AND host_key LIKE ?",i=r?[`%${e}%`]:[t,`%${e}%`];return{sql:o,params:i}}async function qe(t,e,r){try{let{sql:o,params:i}=$e(e,r);P.debug("ChromeCookies","Executing query",{sql:o,params:i});let s=await D({file:t,sql:o,params:i,rowTransform:n=>({name:n.name,domain:n.host_key,value:n.encrypted_value,expiry:n.expires_utc})});return Z("QueryCookies",!0,{file:t,count:s.length}),s}catch(o){return C("Failed to read cookie file",o,{file:t}),[]}}async function I({name:t,domain:e,file:r}){let o=typeof r=="string"&&r.length>0?[r]:await Ue();if(o.length===0)return P.debug("ChromeCookies","No cookie files found"),[];let i=[];for(let s of o){if(!Ne(s)){P.debug("ChromeCookies","Cookie file missing or invalid",{file:s});continue}let n=await qe(s,t,e);i.push(...n)}return P.debug("ChromeCookies","Query complete",{totalCookies:i.length}),i}import{readFileSync as Gr}from"fs";import{join as Jr}from"path";import Qe from"fast-glob";var ze=m("listChromeProfiles");function K(){let t=Qe.sync("./**/Cookies",{cwd:b,absolute:!0});return ze.debug("Found cookie files:",t),t}import{createDecipheriv as Ve,pbkdf2 as We}from"crypto";import{platform as ee}from"os";import{createDecipheriv as Me}from"crypto";function X(t,e){let r=Buffer.from("v10");if(!t.subarray(0,3).equals(r))throw new Error("Not a v10 encrypted cookie");let o=t.subarray(3),i=12,s=16;if(o.length<i+s)throw new Error("Invalid v10 cookie: too short");let n=o.subarray(0,i),f=o.subarray(i,o.length-s),a=o.subarray(o.length-s),c=Me("aes-256-gcm",e,n);return c.setAuthTag(a),Buffer.concat([c.update(f),c.final()]).toString("utf8")}function Y(t){let e=Buffer.from("v10");return t.length>=3&&t.subarray(0,3).equals(e)}function re(t,e){let r=new Map;return o=>{let i=e?e(o):o.toString("hex");if(r.has(i)){let n=r.get(i);if(n!==void 0)return n}let s=t(o);return r.set(i,s),s}}var He=re(t=>t.length>=3&&t[0]===118&&t[1]===49&&t[2]===48?t.slice(3):t,t=>t.toString("hex")),je=re(t=>{let e=t[t.length-1];return e&&e<=16?t.slice(0,-e):t},t=>t.toString("hex"));function Ge(t){let e=t.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e)return e[1];let r=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/(\d{3}-\d{7}-\d{7})$/];for(let i of r){let s=t.match(i);if(s)return s[1]}let o=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-\.]+)$/];for(let i of o){let n=t.match(i)?.[1]??"";if(n.length>0)return n}return t}async function A(t,e,r){if(ee()==="win32"&&Y(t)&&t.length>=31&&Buffer.isBuffer(e))return X(t,e);if(ee()==="darwin"&&!t.slice(0,3).toString().match(/^v\d\d$/))return Promise.resolve(t.toString("utf8"));if(typeof e!="string")throw new Error("password must be a string");if(!Buffer.isBuffer(t))throw new Error("encryptedData must be a Buffer");return new Promise((o,i)=>{We(e,"saltysalt",1003,16,"sha1",(s,n)=>{try{if(s){i(new Error(`Failed to derive key: ${s.message}`));return}let f=He(t);if(f.length%16!==0){i(new Error("Encrypted data length is not a multiple of 16"));return}let a=Buffer.alloc(16," "),c=Ve("aes-128-cbc",n,a);c.setAutoPadding(!1);let l=c.update(f);try{c.final()}catch(be){i(new Error(`Failed to finalize decryption: ${be.message}`));return}l=je(l);let Ce=((r||0)>=24&&l.length>32?l.slice(32):l).toString("utf8");o(Ge(Ce))}catch(f){i(new Error(`Decryption failed: ${f.message}`))}})})}import{platform as ie}from"os";import{exec as Ze}from"child_process";import{promisify as Je}from"util";var Ke=Je(Ze),H=class extends Error{constructor(r,o,i){super(r);this.command=o;this.originalError=i;this.name="CommandExecutionError"}};async function k(t,e){try{let r=await Ke(t,{...e,encoding:"utf8"});return{stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw C("Command execution failed",r,{command:t}),new H(r instanceof Error?r.message:String(r),t,r instanceof Error?r:void 0)}}async function oe(){try{let r=(await k("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await k(`python3 -c "import keyring; print(keyring.get_password('Chrome Safe Storage', 'Chrome'))"`)).stdout.trim();if(r&&r!=="None")return r}catch{}try{let r=(await k('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return"peanuts"}async function te(){return(await k('security find-generic-password -w -s "Chrome Safe Storage"')).stdout.trim()}import{readFileSync as Xe}from"fs";import{join as Ye}from"path";async function er(t){let e=Buffer.from("DPAPI");if(!t.subarray(0,5).equals(e))throw new Error("Invalid DPAPI key prefix");let r=t.subarray(5);if(process.platform==="win32")try{let o=await import("@primno/dpapi").then(i=>i).catch(()=>null);if(o)return o.unprotectData(r)}catch(o){console.warn("DPAPI module not available, using fallback:",o)}throw new Error("Windows DPAPI decryption requires native bindings. Install @primno/dpapi package for Windows support.")}async function se(){try{let t=Ye(b,"Local State"),e=Xe(t,"utf8"),r=JSON.parse(e);if(!r.os_crypt?.encrypted_key)throw new Error("No encrypted key found in Chrome Local State");let o=Buffer.from(r.os_crypt.encrypted_key,"base64");return(await er(o)).toString("latin1")}catch(t){throw new Error(`Failed to retrieve Chrome password on Windows: ${t instanceof Error?t.message:String(t)}`)}}async function _(){switch(ie()){case"darwin":return await te();case"win32":return await se();case"linux":return await oe();default:throw new Error(`Platform ${ie()} is not supported`)}}function rr(t){return typeof t!="number"||t<=0?"Infinity":new Date(t)}function ne(t,e,r,o,i,s){return{domain:t,name:e,value:r,expiry:rr(o),meta:{file:i,browser:"Chrome",decrypted:s}}}var R=class extends d{constructor(){super("ChromeCookieQueryStrategy","Chrome")}async executeQuery(e,r,o,i){let s=["darwin","win32","linux"];if(!s.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:s}),[];let n=o??K(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn("No Chrome cookie files found"),[];let a=await _();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}async processFile(e,r,o,i){try{let s=await I({name:r,domain:o,file:e}),n=0;try{let c=await import("better-sqlite3"),l=new c.default(e,{readonly:!0});try{let g=l.prepare("SELECT value FROM meta WHERE key = ?").get("version");n=g?Number.parseInt(g.value,10):0}finally{l.close()}}catch(c){this.logger.debug("Could not retrieve meta version, defaulting to 0",{error:c})}let f={file:e,password:i,metaVersion:n};return(await Promise.allSettled(s.map(c=>this.processCookie(c,f)))).map(c=>c.status==="fulfilled"?c.value:null).filter(c=>c!==null)}catch(s){return s instanceof Error?this.logger.error("Failed to process cookie file",{error:s.message,file:e,name:r,domain:o}):this.logger.error("Failed to process cookie file",{error:String(s),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),i=await A(o,r.password,r.metaVersion);return ne(e.domain,e.name,i,e.expiry,r.file,!0)}catch(o){return o instanceof Error?this.logger.warn("Failed to decrypt cookie",{error:o}):this.logger.warn("Failed to decrypt cookie",{error:String(o)}),ne(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,!1)}}};import{homedir as tr}from"os";import{join as ue}from"path";import sr from"fast-glob";var ae=m("ProcessDetector");function or(t,e){let r=t.trim().split(/\s+/);if(r.length<2)return null;let o=Number.parseInt(r[1],10);return Number.isNaN(o)?null:{pid:o,command:r.slice(10).join(" ")||e,details:t.trim()}}async function fe(){try{let t="ps aux | grep -i firefox | grep -v grep",{stdout:e}=await k(t);if(!e||e.trim()==="")return[];let r=[],o=e.split(`
|
|
2
|
-
`).filter(i=>i.trim()!=="");for(let i of o){let s=or(i,"firefox");s&&r.push(s)}return ae.debug("Firefox process detection completed",{processCount:r.length,processes:r.map(i=>({pid:i.pid,command:i.command}))}),r}catch(t){return ae.warn("Failed to detect Firefox processes",{error:t instanceof Error?t.message:String(t)}),[]}}function ce(t,e){if(e.length===0)return"";let r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);return`${o} is currently running (${r} process${r>1?"es":""} detected). For reliable cookie access, consider closing ${o} and trying again. Alternatively, use the --force flag to attempt access despite the lock.`}function ir(t){let e=tr();if(!e)return t.warn("Failed to get home directory"),[];let r=[ue(e,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"),ue(e,".mozilla/firefox/*/cookies.sqlite")],o=[];for(let i of r){let s=sr.sync(i);o.push(...s)}return t.debug("Found Firefox cookie files",{files:o}),o}var L=class extends d{constructor(){super("FirefoxCookieQueryStrategy","Firefox")}async handleDatabaseLockError(e,r){if(e instanceof Error&&e.message.toLowerCase().includes("database is locked"))try{let o=await fe();if(o.length>0){let i=ce("firefox",o);this.logger.warn("Firefox process conflict detected",{file:r,processCount:o.length,advice:i})}else this.logger.warn("Database locked but no Firefox processes detected",{file:r,suggestion:"Another process may be accessing the database"})}catch(o){this.logger.debug("Failed to check Firefox processes",{error:o instanceof Error?o.message:String(o)})}}async executeQuery(e,r,o,i){let s=o??ir(this.logger),n=Array.isArray(s)?s:[s],f=[];for(let a of n)try{let c=await D({file:a,sql:"SELECT name, value, host as domain, expiry FROM moz_cookies WHERE name = ? AND host LIKE ?",params:[e,`%${r}%`],rowTransform:l=>({name:l.name,value:l.value,domain:l.domain,expiry:l.expiry>0?new Date(l.expiry*1e3):"Infinity",meta:{file:a,browser:"Firefox",decrypted:!1}})});f.push(...c)}catch(c){await this.handleDatabaseLockError(c,a),c instanceof Error?this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:c.message,file:a,name:e,domain:r}):this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:String(c),file:a,name:e,domain:r})}return f}};import{homedir as gr}from"os";import{join as dr}from"path";import{Buffer as ur}from"buffer";import{readFileSync as lr}from"fs";import{homedir as pr}from"os";import{join as mr}from"path";import{Buffer as $}from"buffer";import nr from"destr";import{z as u}from"zod";var N=u.string().trim().min(1,"Domain cannot be empty").refine(t=>/^\.?[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(t),"Invalid domain format"),U=u.string().trim().min(1,"Cookie name cannot be empty").refine(t=>t==="%"||/^[!#$%&'()*+\-.:0-9A-Z \^_`a-z|~]+$/.test(t),"Invalid cookie name format - must contain only valid characters (letters, numbers, and certain symbols) or be '%' for wildcard"),le=u.string().trim().min(1,"Path cannot be empty").refine(t=>t.startsWith("/"),"Path must start with /").refine(t=>/^\/[!#$%&'()*+,\-./:=@\w~]*$/.test(t),"Invalid path format - must contain only valid URL path characters").default("/"),pe=u.string().trim().transform(t=>nr(t)).pipe(u.any()),me=u.object({name:U,value:pe,domain:N,path:le,expiry:u.number().int(),creation:u.number().int(),flags:u.number().optional(),version:u.number().int().optional(),port:u.number().int().optional(),comment:u.string().optional(),commentURL:u.string().optional()}),Mo=u.object({name:U,domain:N}).strict(),ar=u.object({file:u.string().trim().min(1,"File path cannot be empty").optional(),browser:u.string().trim().optional(),decrypted:u.boolean().optional(),secure:u.boolean().optional(),httpOnly:u.boolean().optional(),path:le.optional()}).catchall(u.unknown()).strict(),fr=u.object({domain:N,name:U,value:pe,expiry:u.union([u.literal("Infinity"),u.date(),u.number().int().positive("Expiry must be a positive number")]).optional(),meta:ar.optional()}).strict(),Vo=u.object({expiry:u.number().int().optional(),domain:N,name:U,value:u.union([u.string(),u.instanceof(Buffer)])}).strict(),Wo=u.object({format:u.enum(["merged","grouped"]).optional(),separator:u.string().optional(),showFilePaths:u.boolean().optional()}).strict(),cr=u.enum(["Chrome","Firefox","Safari","internal","unknown"]),Ho=u.object({browserName:cr,queryCookies:u.function().args(u.string(),u.string(),u.string().optional(),u.boolean().optional()).returns(u.promise(u.array(fr)))}).strict();var x=m("BinaryCodableCookie"),q=class{constructor(e){this.version=0;this.url="";this.name="";this.path="";this.value="";this.flags={isSecure:!1,isHTTPOnly:!1,unknown1:!1,unknown2:!1};this.expiration=0;this.creation=0;let r={offset:0,buffer:e};this.decode(r)}decodeUrlValue(e){let r=e,o;do{o=r;try{r=decodeURIComponent(r)}catch{return o}}while(r!==o&&r.includes("%"));return r}decodeJwtPayload(e){let r=e.split(".");if(r.length!==3)return null;try{let o=$.from(r[1],"base64").toString("utf8"),i=JSON.parse(o);return JSON.stringify(i)}catch{return null}}parseJsonValue(e){try{let r=JSON.parse(e);return JSON.stringify(r)}catch{return null}}processValue(e){if(e===null)return"null";if(e===void 0)return"undefined";if($.isBuffer(e))return e.toString();if(typeof e!="string")return String(e);let r=this.decodeUrlValue(e);if(r.match(/^ey[A-Za-z0-9_-]+\.ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)){let o=this.decodeJwtPayload(r);if(typeof o=="string"&&o.length>0)return o}if(r.startsWith("{")||r.startsWith("[")){let o=this.parseJsonValue(r);if(typeof o=="string"&&o.length>0)return o}return r}convertMacTimestamp(e){return e<=0?e:e>=0&&e<=1e9&&Number.isFinite(e)?e+978307200:0}toCookieRow(){try{let e=this.convertFlags(),r=this.url.replace(/^https?:\/\//,"").replace(/\/.*$/,"")||"uk",o=this.convertMacTimestamp(this.expiration),i=this.convertMacTimestamp(this.creation);return me.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:o,creation:i,flags:e,version:this.version,port:this.port,comment:this.comment,commentURL:this.commentURL})}catch{return null}}readNullTerminatedString(e,r){let o=r;for(;o<e.buffer.length&&e.buffer[o]!==0;)o++;return e.buffer.toString("utf8",r,o)||""}readHeader(e){let r=e.buffer.readUInt32LE(e.offset);x.debug("Cookie size:",r),e.offset+=4;let o=e.buffer.readUInt32LE(e.offset);x.debug("Cookie version:",o),e.offset+=4;let i=e.buffer.readUInt32LE(e.offset);x.debug("Cookie flags:",i.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(i&1)!==0,isHTTPOnly:(i&4)!==0,unknown1:(i&8)!==0,unknown2:(i&16)!==0};let s=e.buffer.readUInt32LE(e.offset);x.debug("Has port:",s),e.offset+=4;let n={urlOffset:e.buffer.readUInt32LE(e.offset),nameOffset:e.buffer.readUInt32LE(e.offset+4),pathOffset:e.buffer.readUInt32LE(e.offset+8),valueOffset:e.buffer.readUInt32LE(e.offset+12),commentOffset:e.buffer.readUInt32LE(e.offset+16),commentURLOffset:e.buffer.readUInt32LE(e.offset+20)};return x.debug("String offsets:",n),{size:r,hasPort:s,offsets:n}}readTimestamps(e){let r=$.alloc(8);for(let n=0;n<8;n++)r[n]=e.buffer[e.offset+n];let o=r.readDoubleLE(0);e.offset+=8;let i=$.alloc(8);for(let n=0;n<8;n++)i[n]=e.buffer[e.offset+n];let s=i.readDoubleLE(0);e.offset+=8,this.expiration=o,this.creation=s}readStrings(e,r,o){x.debug("Reading strings from cookie buffer of size:",r);let s=[{field:"url",offset:o.urlOffset},{field:"name",offset:o.nameOffset},{field:"path",offset:o.pathOffset},{field:"value",offset:o.valueOffset},{field:"comment",offset:o.commentOffset}].filter(n=>n.offset>0).sort((n,f)=>n.offset-f.offset);x.debug("Reading strings in order:",s.map(n=>n.field));for(let n=0;n<s.length;n++){let{field:f,offset:a}=s[n],l=(n<s.length-1?s[n+1].offset:r)-a,g=0+a;for(;g<0+a+l&&e.buffer[g]!==0;)g++;let E=e.buffer.toString("utf8",0+a,g);switch(x.debug(`Read ${f}:`,E),f){case"url":this.url=E;break;case"name":this.name=E;break;case"path":this.path=E;break;case"value":this.value=E;break;case"comment":this.comment=E;break}}}decode(e){let{size:r,hasPort:o,offsets:i}=this.readHeader(e),s=e.offset;e.offset=s+24,this.readTimestamps(e),o>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=s,this.readStrings(e,r,i)}convertFlags(){return(this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var h=m("BinaryCodablePage"),B=class B{constructor(e){this.cookies=[];let r={offset:0,buffer:e};this.decode(r)}toCookieRows(){let e=[];for(let r of this.cookies)try{let o=r.toCookieRow();o!==null&&e.push(o)}catch(o){let i=o instanceof Error?o.message:String(o);v("BinaryCookies","Error converting cookie",{error:i})}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if(h.debug("Page header:",r.toString(16)),e.offset+=4,r!==B.HEADER)throw new Error("Invalid page header");let o=e.buffer.readUInt32LE(e.offset);h.debug("Cookie count:",o),e.offset+=4;let i=e.offset-8;h.debug("Page start offset:",i);let s=[];for(let f=0;f<o;f++){let a=e.buffer.readUInt32LE(e.offset);s.push(a),h.debug(`Cookie ${f} offset:`,a),e.offset+=4}let n=e.buffer.readUInt32BE(e.offset);if(h.debug("Page footer:",n.toString(16)),e.offset+=4,n!==B.FOOTER)throw new Error("Invalid page footer");for(let f=0;f<o;f++)try{let a=s[f];h.debug(`Reading cookie ${f} at offset:`,a);let c=e.buffer.readUInt32LE(a);if(h.debug(`Cookie ${f} size:`,c),c<48){h.warn(`Invalid cookie size ${c} at index ${f}`);continue}if(a+c>e.buffer.length){h.warn(`Cookie size ${c} at index ${f} would exceed buffer length ${e.buffer.length}`);continue}let l=e.buffer.subarray(a,a+c),g=new q(l);this.cookies.push(g)}catch(a){h.warn("Invalid cookie data",{error:a instanceof Error?a.message:String(a)})}}};B.HEADER=256,B.FOOTER=0;var Q=B;var S=m("BinaryCodableCookies"),y=class y{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r)}static fromFile(e){let r=lr(e);return new y(r)}static fromDefaultPath(){return y.fromFile(y.DEFAULT_COOKIE_PATH)}toCookieRows(){let e=[];for(let r of this.pages)try{let o=r.toCookieRows();Array.isArray(o)&&e.push(...o)}catch(o){let i=o instanceof Error?o.message:String(o);v("BinaryCookies","Error converting page cookies",{error:i})}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,S.debug("Magic bytes:",r.toString()),!r.equals(y.MAGIC))throw new Error("Missing magic value");let o=e.buffer.readUInt32BE(e.offset);S.debug("Page count:",o),e.offset+=4;let i=[];for(let c=0;c<o;c++){let l=e.buffer.readUInt32BE(e.offset);i.push(l),S.debug(`Page ${c} size:`,l),e.offset+=4}let s=e.offset;S.debug("Starting page data at offset:",s);for(let c of i)try{S.debug("Reading page at offset:",s,"with size:",c);let l=e.buffer.subarray(s,s+c),g=new Q(l);this.pages.push(g),s+=c}catch(l){let g=l instanceof Error?l.message:String(l);S.warn("Error decoding page:",{error:g}),s+=c}e.offset=s;let n=e.buffer.readUInt32BE(e.offset);S.debug("Checksum:",n.toString(16)),e.offset+=4;let f=e.buffer.readBigUInt64BE(e.offset);S.debug("Footer:",f.toString(16)),e.offset+=8,f!==y.FOOTER&&v("BinaryCookies","Invalid cookie file format: wrong footer");let a=e.buffer.subarray(e.offset);this.metadata={}}catch(r){let o=r instanceof Error?r.message:String(r);throw v("BinaryCookies","Error decoding binary cookies file",{error:o}),r}}};y.MAGIC=ur.from("cook","utf8"),y.FOOTER=BigInt("0x071720050000004b"),y.DEFAULT_COOKIE_PATH=mr(pr(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var z=y;function ge(t){return z.fromFile(t).toCookieRows()}var F=class extends d{constructor(){super("SafariCookieQueryStrategy","Safari")}getCookieDbPath(e){return dr(e,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies")}formatDomain(e){return e.startsWith(".")?e.slice(1):e}formatExpiry(e){if(e==null){let i=new Date;return Object.defineProperty(i,"valueOf",{value:()=>Number.NaN}),Object.defineProperty(i,"getTime",{value:()=>Number.NaN}),i}return typeof e!="number"||Number.isNaN(e)||e<=0?"Infinity":e<0||e>4102444800?(this.logger.warn("Invalid expiry timestamp, treating as session cookie",{expiry:e}),"Infinity"):new Date(e*1e3)}isFlagSet(e,r){return typeof e!="number"||Number.isNaN(e)||e<=0?!1:(e&r)===r}formatCreation(e){if(typeof e!="number"||Number.isNaN(e)||e<=0)return;if(e<0||e>4102444800){this.logger.warn("Invalid creation timestamp, ignoring",{creation:e});return}return e*1e3}processValue(e){return e===null?"null":e===void 0?"undefined":Buffer.isBuffer(e)?e.toString():String(e)}decodeCookies(e,r,o){try{return ge(e).filter(s=>(r==="%"||s.name===r)&&(o==="%"||this.formatDomain(s.domain).includes(o))).map(s=>({domain:this.formatDomain(s.domain),name:s.name,value:this.processValue(s.value),expiry:this.formatExpiry(s.expiry),meta:{file:e,browser:"Safari",decrypted:!1,secure:this.isFlagSet(s.flags,1),httpOnly:this.isFlagSet(s.flags,4),path:s.path,version:s.version,comment:s.comment,commentURL:s.commentURL,port:s.port,creation:this.formatCreation(s.creation)}}))}catch(i){return i instanceof Error?this.logger.error(`Error decoding ${e}`,{error:i.message,file:e,name:r,domain:o}):this.logger.error(`Error decoding ${e}`,{error:String(i),file:e,name:r,domain:o}),[]}}executeQuery(e,r,o,i){try{this.logger.info("Querying cookies",{name:e,domain:r,store:o});let s=gr();if(typeof s!="string"||s.length===0)return this.logger.error("Failed to get home directory"),Promise.resolve([]);let n=o??this.getCookieDbPath(s);return Promise.resolve(this.decodeCookies(n,e||"%",r||"%"))}catch(s){return s instanceof Error?this.logger.error("Failed to query cookies",{error:s.message,name:e,domain:r}):this.logger.error("Failed to query cookies",{error:String(s),name:e,domain:r}),Promise.resolve([])}}};async function de(t){if(!t.name||!t.domain)return[];let{name:e,domain:r}=t;if(typeof e!="string"||typeof r!="string")return[];let o=[new R,new L,new F];return(await Promise.allSettled(o.map(s=>s.queryCookies(e,r)))).filter(s=>s.status==="fulfilled").flatMap(s=>s.value)}async function hr(t){try{return await de(t)}catch(e){return w.warn("Error querying cookies:",e instanceof Error?e.message:String(e)),[]}}import Cr from"fast-glob";import{homedir as yr,platform as wr}from"os";import{join as p}from"path";function he(t){let e=yr();if(!e)throw new Error("Unable to determine user home directory");let r=wr(),i={chrome:{windows:p(e,"AppData","Local","Google","Chrome","User Data"),macos:p(e,"Library","Application Support","Google","Chrome"),linux:p(e,".config","google-chrome")},chromium:{windows:p(e,"AppData","Local","Chromium","User Data"),macos:p(e,"Library","Application Support","Chromium"),linux:p(e,".config","chromium")},brave:{windows:p(e,"AppData","Local","BraveSoftware","Brave-Browser","User Data"),macos:p(e,"Library","Application Support","BraveSoftware","Brave-Browser"),linux:p(e,".config","BraveSoftware","Brave-Browser")},edge:{windows:p(e,"AppData","Local","Microsoft","Edge","User Data"),macos:p(e,"Library","Application Support","Microsoft Edge"),linux:p(e,".config","microsoft-edge")},opera:{windows:p(e,"AppData","Roaming","Opera Software","Opera Stable"),macos:p(e,"Library","Application Support","com.operasoftware.Opera"),linux:p(e,".config","opera")},vivaldi:{windows:p(e,"AppData","Local","Vivaldi","User Data"),macos:p(e,"Library","Application Support","Vivaldi"),linux:p(e,".config","vivaldi")},whale:{windows:p(e,"AppData","Local","Naver","Naver Whale","User Data"),macos:p(e,"Library","Application Support","Naver","Whale"),linux:p(e,".config","naver-whale")}}[t];if(!i)throw new Error(`Unknown browser: ${t}`);switch(r){case"win32":return i.windows;case"darwin":return i.macos;case"linux":return i.linux;default:throw new Error(`Platform ${r} is not supported`)}}function br(t){return typeof t!="number"||t<=0?"Infinity":new Date(t)}function ye(t,e,r,o,i,s,n){return{domain:t,name:e,value:r,expiry:br(o),meta:{file:i,browser:s.charAt(0).toUpperCase()+s.slice(1),decrypted:n}}}var j=class extends d{constructor(e="chrome"){let r=e.charAt(0).toUpperCase()+e.slice(1);super(`${r}CookieQueryStrategy`,"Chrome"),this.browser=e}listBrowserCookiePaths(){try{let e=he(this.browser),r=Cr.sync("./**/Cookies",{cwd:e,absolute:!0});return this.logger.debug(`Found ${r.length} cookie files for ${this.browser}`),r}catch(e){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:e}),[]}}async executeQuery(e,r,o,i){let s=["darwin","win32","linux"];if(!s.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:s}),[];let n=o??this.listBrowserCookiePaths(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn(`No ${this.browser} cookie files found`),[];try{let a=await _();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}catch(a){return this.logger.error(`Failed to get ${this.browser} password`,{error:a}),[]}}async processFile(e,r,o,i){try{let s=await I({name:r,domain:o,file:e}),n={file:e,password:i,browser:this.browser};return(await Promise.allSettled(s.map(a=>this.processCookie(a,n)))).map(a=>a.status==="fulfilled"?a.value:null).filter(a=>a!==null)}catch(s){return this.logger.error(`Failed to process ${this.browser} cookie file`,{error:s instanceof Error?s.message:String(s),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),i=await A(o,r.password);return ye(e.domain,e.name,i,e.expiry,r.file,r.browser,!0)}catch(o){return this.logger.warn(`Failed to decrypt ${this.browser} cookie`,{error:o instanceof Error?o.message:String(o)}),ye(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,!1)}}};async function we(t,e,r=[]){return t.length===0?r:(await Promise.all(t.map(async i=>{try{return await e(i)}catch{return r}}))).flat()}var G=class{constructor(e){this.strategies=e;this.logger=m("CompositeCookieQueryStrategy");this.browserName="internal"}handleStrategyError(e,r){e instanceof Error?this.logger.error("Strategy failed",{error:e,strategy:r}):this.logger.error("Strategy failed with unknown error",{error:String(e),strategy:r})}async queryCookies(e,r,o,i){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:o,force:i,strategyCount:this.strategies.length}),await we(this.strategies,async s=>{try{return await s.queryCookies(e,r,o,i)}catch(n){return this.handleStrategyError(n,s),[]}},[])}catch(s){return s instanceof Error?this.logger.error("Failed to query cookies",{error:s}):this.logger.error("Failed to query cookies with unknown error",{error:String(s)}),[]}}};export{R as ChromeCookieQueryStrategy,j as ChromiumCookieQueryStrategy,G as CompositeCookieQueryStrategy,L as FirefoxCookieQueryStrategy,F as SafariCookieQueryStrategy,hr as getCookie};
|
|
1
|
+
import{createConsola as ve}from"consola";import{homedir as xe}from"os";import{config as Se}from"dotenv";import{z as F}from"zod";Se();var Ee=F.object({LOG_LEVEL:F.enum(["debug","info","warn","error"]).default("info"),HOME:F.string().optional().transform(t=>t??process.env.USERPROFILE??"").pipe(F.string().min(1))}),V=Ee.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:xe()});var Pe=ve({fancy:!0,formatOptions:{showLogLevel:!1,colors:!0,date:!1,compact:!0,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:V.LOG_LEVEL==="debug"?5:2}),Pr=V.LOG_LEVEL==="debug",Be=Pe,C=Be;function T(t){if(t==null||typeof t!="number"||Number.isNaN(t))return;if(t<=0)return"Infinity";let e=t/1e6-11644473600;return e<0||e>3250368e4?"Infinity":new Date(e*1e3)}function K(t,e,r){e?C.success(`${t} succeeded`,r):C.error(`${t} failed`,r)}function w(t,e,r){let o=e instanceof Error?e.message:String(e);C.error(t,{...r,error:o})}function v(t,e,r){C.warn(`[${t}] ${e}`,r)}function m(t){return C.withTag(t)}var Re={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},d=class{constructor(e,r){this.browserName=r;let o=m(e);this.logger=o||Re}async queryCookies(e,r,o,s){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:o,force:s}),await this.executeQuery(e,r,o,s)}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i.message,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:s}):this.logger.error("Failed to query cookies",{error:String(i),browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:s}),[]}}};import{existsSync as Ae}from"fs";import{join as W}from"path";import Ne from"fast-glob";import Oe from"better-sqlite3";var B=m("QuerySqliteThenTransform");function Le(t){return new Promise(e=>setTimeout(e,t))}function De(t){if(t instanceof Error){let e=t.message.toLowerCase();return e.includes("database is locked")||e.includes("database locked")||e.includes("sqlite_busy")}return!1}function Fe(t){try{let e=new Oe(t,{readonly:!0,fileMustExist:!0});try{e.pragma("journal_mode = WAL"),B.debug("Set WAL mode for database",{file:t})}catch(r){let o=r instanceof Error?r.message:String(r);o.includes("readonly")||o.includes("write")?B.debug("Database is readonly, continuing with default journal mode",{file:t,error:o}):B.warn("Failed to set WAL mode, continuing with default",{file:t,error:o})}return e}catch(e){throw w("Database open failed",e,{file:t}),e}}function Te(t){try{return t.close(),Promise.resolve()}catch(e){return w("Database close failed",e),Promise.reject(e instanceof Error?e:new Error("Failed to close database: Unknown error"))}}async function Ie(t){let{file:e,sql:r,params:o,rowFilter:s,rowTransform:i}=t,n;try{n=Fe(e);let a=n.prepare(r).all(o),c=s?a.filter(s):a;return i?c.map(i):c}finally{n&&await Te(n)}}async function I(t){let{file:e,sql:r,retryAttempts:o=3}=t,s=[100,500,1e3],i;for(let n=0;n<o;n++)try{let f=await Ie(t);return n>0&&B.info("Database query succeeded after retry",{file:e,attempt:n+1,totalAttempts:o}),f}catch(f){if(i=f,De(f)&&n<o-1){let a=s[n]||1e3;B.warn("Database locked, retrying after delay",{file:e,attempt:n+1,totalAttempts:o,delay:a,error:f instanceof Error?f.message:String(f)}),await Le(a);continue}throw w("Database query failed",f,{file:e,sql:r,attempt:n+1}),f}throw i}import{homedir as _e,platform as J}from"os";import{join as H}from"path";var b=(()=>{let t=_e();if(!t)throw new Error("Unable to determine user home directory");switch(J()){case"darwin":return H(t,"Library","Application Support","Google","Chrome");case"win32":return H(t,"AppData","Local","Google","Chrome","User Data");case"linux":return H(t,".config","google-chrome");default:throw new Error(`Platform ${J()} is not supported`)}})();var R=m("getEncryptedChromeCookie");function $e(t){if(typeof t!="string")return!1;let e=t.trim();return e.length===0?!1:Ae(e)}async function Ue(){let t=[W(b,"Default/Cookies"),W(b,"Profile */Cookies"),W(b,"Profile Default/Cookies")],e=[];for(let r of t){let o=await Ne(r);e.push(...o)}return R.debug("ChromeCookies","Found cookie files",{count:e.length,files:e}),e}function qe(t,e){let r=t==="%",o=r?"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE host_key LIKE ?":"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE name = ? AND host_key LIKE ?",s=r?[`%${e}%`]:[t,`%${e}%`];return{sql:o,params:s}}async function Me(t,e,r){try{let{sql:o,params:s}=qe(e,r);R.debug("ChromeCookies","Executing query",{sql:o,params:s});let i=await I({file:t,sql:o,params:s,rowTransform:n=>({name:n.name,domain:n.host_key,value:n.encrypted_value,expiry:n.expires_utc})});return K("QueryCookies",!0,{file:t,count:i.length}),i}catch(o){return w("Failed to read cookie file",o,{file:t}),[]}}async function _({name:t,domain:e,file:r}){let o=typeof r=="string"&&r.length>0?[r]:await Ue();if(o.length===0)return R.debug("ChromeCookies","No cookie files found"),[];let s=[];for(let i of o){if(!$e(i)){R.debug("ChromeCookies","Cookie file missing or invalid",{file:i});continue}let n=await Me(i,t,e);s.push(...n)}return R.debug("ChromeCookies","Query complete",{totalCookies:s.length}),s}import{readFileSync as Gr}from"fs";import{join as Kr}from"path";import Qe from"fast-glob";var ze=m("listChromeProfiles");function X(){let t=Qe.sync("./**/Cookies",{cwd:b,absolute:!0});return ze.debug("Found cookie files:",t),t}import{createDecipheriv as He,pbkdf2 as We}from"crypto";import{platform as re}from"os";import{createDecipheriv as Ve}from"crypto";function Y(t,e){let r=Buffer.from("v10");if(!t.subarray(0,3).equals(r))throw new Error("Not a v10 encrypted cookie");let o=t.subarray(3),s=12,i=16;if(o.length<s+i)throw new Error("Invalid v10 cookie: too short");let n=o.subarray(0,s),f=o.subarray(s,o.length-i),a=o.subarray(o.length-i),c=Ve("aes-256-gcm",e,n);return c.setAuthTag(a),Buffer.concat([c.update(f),c.final()]).toString("utf8")}function ee(t){let e=Buffer.from("v10");return t.length>=3&&t.subarray(0,3).equals(e)}function oe(t,e){let r=new Map;return o=>{let s=e?e(o):o.toString("hex");if(r.has(s)){let n=r.get(s);if(n!==void 0)return n}let i=t(o);return r.set(s,i),i}}var je=oe(t=>t.length>=3&&t[0]===118&&t[1]===49&&t[2]===48?t.slice(3):t,t=>t.toString("hex")),Ge=oe(t=>{let e=t[t.length-1];return e&&e<=16?t.slice(0,-e):t},t=>t.toString("hex"));function Ze(t){let e=t.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e)return e[1];let r=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/(\d{3}-\d{7}-\d{7})$/];for(let s of r){let i=t.match(s);if(i)return i[1]}let o=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-\.]+)$/];for(let s of o){let n=t.match(s)?.[1]??"";if(n.length>0)return n}return t}async function A(t,e,r){if(re()==="win32"&&ee(t)&&t.length>=31&&Buffer.isBuffer(e))return Y(t,e);if(re()==="darwin"&&!t.slice(0,3).toString().match(/^v\d\d$/))return Promise.resolve(t.toString("utf8"));if(typeof e!="string")throw new Error("password must be a string");if(!Buffer.isBuffer(t))throw new Error("encryptedData must be a Buffer");return new Promise((o,s)=>{We(e,"saltysalt",1003,16,"sha1",(i,n)=>{try{if(i){s(new Error(`Failed to derive key: ${i.message}`));return}let f=je(t);if(f.length%16!==0){s(new Error("Encrypted data length is not a multiple of 16"));return}let a=Buffer.alloc(16," "),c=He("aes-128-cbc",n,a);c.setAutoPadding(!1);let l=c.update(f);try{c.final()}catch(ke){s(new Error(`Failed to finalize decryption: ${ke.message}`));return}l=Ge(l);let be=((r||0)>=24&&l.length>32?l.slice(32):l).toString("utf8");o(Ze(be))}catch(f){s(new Error(`Decryption failed: ${f.message}`))}})})}import{platform as ne}from"os";import{exec as Ke}from"child_process";import{promisify as Je}from"util";var Xe=Je(Ke),j=class extends Error{constructor(r,o,s){super(r);this.command=o;this.originalError=s;this.name="CommandExecutionError"}};async function k(t,e){try{let r=await Xe(t,{...e,encoding:"utf8"});return{stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw w("Command execution failed",r,{command:t}),new j(r instanceof Error?r.message:String(r),t,r instanceof Error?r:void 0)}}async function te(){try{let r=(await k("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await k(`python3 -c "import keyring; print(keyring.get_password('Chrome Safe Storage', 'Chrome'))"`)).stdout.trim();if(r&&r!=="None")return r}catch{}try{let r=(await k('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return"peanuts"}async function ie(){return(await k('security find-generic-password -w -s "Chrome Safe Storage"')).stdout.trim()}import{readFileSync as Ye}from"fs";import{join as er}from"path";function rr(encryptedKey){let DPAPI_PREFIX=Buffer.from("DPAPI");if(!encryptedKey.subarray(0,5).equals(DPAPI_PREFIX))throw new Error("Invalid DPAPI key prefix");let encryptedData=encryptedKey.subarray(5);if(process.platform==="win32")try{let moduleName="@primno/dpapi",dpapi=eval(`require("${moduleName}")`);if(dpapi&&typeof dpapi.unprotectData=="function")return dpapi.unprotectData(encryptedData)}catch(t){process.env.VERBOSE&&console.warn("DPAPI module not available:",t)}throw new Error("Windows DPAPI decryption requires native bindings. Install @primno/dpapi package for Windows support.")}function se(){try{let t=er(b,"Local State"),e=Ye(t,"utf8"),r=JSON.parse(e);if(!r.os_crypt?.encrypted_key)throw new Error("No encrypted key found in Chrome Local State");let o=Buffer.from(r.os_crypt.encrypted_key,"base64");return rr(o).toString("latin1")}catch(t){throw new Error(`Failed to retrieve Chrome password on Windows: ${t instanceof Error?t.message:String(t)}`)}}async function N(){switch(ne()){case"darwin":return await ie();case"win32":return se();case"linux":return await te();default:throw new Error(`Platform ${ne()} is not supported`)}}function ae(t,e,r,o,s,i){return{domain:t,name:e,value:r,expiry:T(o),meta:{file:s,browser:"Chrome",decrypted:i}}}var O=class extends d{constructor(){super("ChromeCookieQueryStrategy","Chrome")}async executeQuery(e,r,o,s){let i=["darwin","win32","linux"];if(!i.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:i}),[];let n=o??X(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn("No Chrome cookie files found"),[];let a=await N();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}async processFile(e,r,o,s){try{let i=await _({name:r,domain:o,file:e}),n=0;try{let c=await import("better-sqlite3"),l=new c.default(e,{readonly:!0});try{let g=l.prepare("SELECT value FROM meta WHERE key = ?").get("version");n=g?Number.parseInt(g.value,10):0}finally{l.close()}}catch(c){this.logger.debug("Could not retrieve meta version, defaulting to 0",{error:c})}let f={file:e,password:s,metaVersion:n};return(await Promise.allSettled(i.map(c=>this.processCookie(c,f)))).map(c=>c.status==="fulfilled"?c.value:null).filter(c=>c!==null)}catch(i){return i instanceof Error?this.logger.error("Failed to process cookie file",{error:i.message,file:e,name:r,domain:o}):this.logger.error("Failed to process cookie file",{error:String(i),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),s=await A(o,r.password,r.metaVersion);return ae(e.domain,e.name,s,e.expiry,r.file,!0)}catch(o){return o instanceof Error?this.logger.warn("Failed to decrypt cookie",{error:o}):this.logger.warn("Failed to decrypt cookie",{error:String(o)}),ae(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,!1)}}};import{homedir as tr}from"os";import{join as le}from"path";import ir from"fast-glob";var fe=m("ProcessDetector");function or(t,e){let r=t.trim().split(/\s+/);if(r.length<2)return null;let o=Number.parseInt(r[1],10);return Number.isNaN(o)?null:{pid:o,command:r.slice(10).join(" ")||e,details:t.trim()}}async function ce(){try{let t="ps aux | grep -i firefox | grep -v grep",{stdout:e}=await k(t);if(!e||e.trim()==="")return[];let r=[],o=e.split(`
|
|
2
|
+
`).filter(s=>s.trim()!=="");for(let s of o){let i=or(s,"firefox");i&&r.push(i)}return fe.debug("Firefox process detection completed",{processCount:r.length,processes:r.map(s=>({pid:s.pid,command:s.command}))}),r}catch(t){return fe.warn("Failed to detect Firefox processes",{error:t instanceof Error?t.message:String(t)}),[]}}function ue(t,e){if(e.length===0)return"";let r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);return`${o} is currently running (${r} process${r>1?"es":""} detected). For reliable cookie access, consider closing ${o} and trying again. Alternatively, use the --force flag to attempt access despite the lock.`}function sr(t){let e=tr();if(!e)return t.warn("Failed to get home directory"),[];let r=[le(e,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"),le(e,".mozilla/firefox/*/cookies.sqlite")],o=[];for(let s of r){let i=ir.sync(s);o.push(...i)}return t.debug("Found Firefox cookie files",{files:o}),o}var L=class extends d{constructor(){super("FirefoxCookieQueryStrategy","Firefox")}async handleDatabaseLockError(e,r){if(e instanceof Error&&e.message.toLowerCase().includes("database is locked"))try{let o=await ce();if(o.length>0){let s=ue("firefox",o);this.logger.warn("Firefox process conflict detected",{file:r,processCount:o.length,advice:s})}else this.logger.warn("Database locked but no Firefox processes detected",{file:r,suggestion:"Another process may be accessing the database"})}catch(o){this.logger.debug("Failed to check Firefox processes",{error:o instanceof Error?o.message:String(o)})}}async executeQuery(e,r,o,s){let i=o??sr(this.logger),n=Array.isArray(i)?i:[i],f=[];for(let a of n)try{let c=await I({file:a,sql:"SELECT name, value, host as domain, expiry FROM moz_cookies WHERE name = ? AND host LIKE ?",params:[e,`%${r}%`],rowTransform:l=>({name:l.name,value:l.value,domain:l.domain,expiry:l.expiry>0?new Date(l.expiry*1e3):"Infinity",meta:{file:a,browser:"Firefox",decrypted:!1}})});f.push(...c)}catch(c){await this.handleDatabaseLockError(c,a),c instanceof Error?this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:c.message,file:a,name:e,domain:r}):this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:String(c),file:a,name:e,domain:r})}return f}};import{homedir as gr}from"os";import{join as dr}from"path";import{Buffer as ur}from"buffer";import{readFileSync as lr}from"fs";import{homedir as pr}from"os";import{join as mr}from"path";import{Buffer as q}from"buffer";import nr from"destr";import{z as u}from"zod";var $=u.string().trim().min(1,"Domain cannot be empty").refine(t=>/^\.?[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(t),"Invalid domain format"),U=u.string().trim().min(1,"Cookie name cannot be empty").refine(t=>t==="%"||/^[!#$%&'()*+\-.:0-9A-Z \^_`a-z|~]+$/.test(t),"Invalid cookie name format - must contain only valid characters (letters, numbers, and certain symbols) or be '%' for wildcard"),pe=u.string().trim().min(1,"Path cannot be empty").refine(t=>t.startsWith("/"),"Path must start with /").refine(t=>/^\/[!#$%&'()*+,\-./:=@\w~]*$/.test(t),"Invalid path format - must contain only valid URL path characters").default("/"),me=u.string().trim().transform(t=>nr(t)).pipe(u.any()),ge=u.object({name:U,value:me,domain:$,path:pe,expiry:u.number().int(),creation:u.number().int(),flags:u.number().optional(),version:u.number().int().optional(),port:u.number().int().optional(),comment:u.string().optional(),commentURL:u.string().optional()}),Vo=u.object({name:U,domain:$}).strict(),ar=u.object({file:u.string().trim().min(1,"File path cannot be empty").optional(),browser:u.string().trim().optional(),decrypted:u.boolean().optional(),secure:u.boolean().optional(),httpOnly:u.boolean().optional(),path:pe.optional()}).catchall(u.unknown()).strict(),fr=u.object({domain:$,name:U,value:me,expiry:u.union([u.literal("Infinity"),u.date(),u.number().int().positive("Expiry must be a positive number")]).optional(),meta:ar.optional()}).strict(),Ho=u.object({expiry:u.number().int().optional(),domain:$,name:U,value:u.union([u.string(),u.instanceof(Buffer)])}).strict(),Wo=u.object({format:u.enum(["merged","grouped"]).optional(),separator:u.string().optional(),showFilePaths:u.boolean().optional()}).strict(),cr=u.enum(["Chrome","Firefox","Safari","internal","unknown"]),jo=u.object({browserName:cr,queryCookies:u.function().args(u.string(),u.string(),u.string().optional(),u.boolean().optional()).returns(u.promise(u.array(fr)))}).strict();var x=m("BinaryCodableCookie"),M=class{constructor(e){this.version=0;this.url="";this.name="";this.path="";this.value="";this.flags={isSecure:!1,isHTTPOnly:!1,unknown1:!1,unknown2:!1};this.expiration=0;this.creation=0;let r={offset:0,buffer:e};this.decode(r)}decodeUrlValue(e){let r=e,o;do{o=r;try{r=decodeURIComponent(r)}catch{return o}}while(r!==o&&r.includes("%"));return r}decodeJwtPayload(e){let r=e.split(".");if(r.length!==3)return null;try{let o=q.from(r[1],"base64").toString("utf8"),s=JSON.parse(o);return JSON.stringify(s)}catch{return null}}parseJsonValue(e){try{let r=JSON.parse(e);return JSON.stringify(r)}catch{return null}}processValue(e){if(e===null)return"null";if(e===void 0)return"undefined";if(q.isBuffer(e))return e.toString();if(typeof e!="string")return String(e);let r=this.decodeUrlValue(e);if(r.match(/^ey[A-Za-z0-9_-]+\.ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)){let o=this.decodeJwtPayload(r);if(typeof o=="string"&&o.length>0)return o}if(r.startsWith("{")||r.startsWith("[")){let o=this.parseJsonValue(r);if(typeof o=="string"&&o.length>0)return o}return r}convertMacTimestamp(e){return e<=0?e:e>=0&&e<=1e9&&Number.isFinite(e)?e+978307200:0}toCookieRow(){try{let e=this.convertFlags(),r=this.url.replace(/^https?:\/\//,"").replace(/\/.*$/,"")||"uk",o=this.convertMacTimestamp(this.expiration),s=this.convertMacTimestamp(this.creation);return ge.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:o,creation:s,flags:e,version:this.version,port:this.port,comment:this.comment,commentURL:this.commentURL})}catch{return null}}readNullTerminatedString(e,r){let o=r;for(;o<e.buffer.length&&e.buffer[o]!==0;)o++;return e.buffer.toString("utf8",r,o)||""}readHeader(e){let r=e.buffer.readUInt32LE(e.offset);x.debug("Cookie size:",r),e.offset+=4;let o=e.buffer.readUInt32LE(e.offset);x.debug("Cookie version:",o),e.offset+=4;let s=e.buffer.readUInt32LE(e.offset);x.debug("Cookie flags:",s.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(s&1)!==0,isHTTPOnly:(s&4)!==0,unknown1:(s&8)!==0,unknown2:(s&16)!==0};let i=e.buffer.readUInt32LE(e.offset);x.debug("Has port:",i),e.offset+=4;let n={urlOffset:e.buffer.readUInt32LE(e.offset),nameOffset:e.buffer.readUInt32LE(e.offset+4),pathOffset:e.buffer.readUInt32LE(e.offset+8),valueOffset:e.buffer.readUInt32LE(e.offset+12),commentOffset:e.buffer.readUInt32LE(e.offset+16),commentURLOffset:e.buffer.readUInt32LE(e.offset+20)};return x.debug("String offsets:",n),{size:r,hasPort:i,offsets:n}}readTimestamps(e){let r=q.alloc(8);for(let n=0;n<8;n++)r[n]=e.buffer[e.offset+n];let o=r.readDoubleLE(0);e.offset+=8;let s=q.alloc(8);for(let n=0;n<8;n++)s[n]=e.buffer[e.offset+n];let i=s.readDoubleLE(0);e.offset+=8,this.expiration=o,this.creation=i}readStrings(e,r,o){x.debug("Reading strings from cookie buffer of size:",r);let i=[{field:"url",offset:o.urlOffset},{field:"name",offset:o.nameOffset},{field:"path",offset:o.pathOffset},{field:"value",offset:o.valueOffset},{field:"comment",offset:o.commentOffset}].filter(n=>n.offset>0).sort((n,f)=>n.offset-f.offset);x.debug("Reading strings in order:",i.map(n=>n.field));for(let n=0;n<i.length;n++){let{field:f,offset:a}=i[n],l=(n<i.length-1?i[n+1].offset:r)-a,g=0+a;for(;g<0+a+l&&e.buffer[g]!==0;)g++;let E=e.buffer.toString("utf8",0+a,g);switch(x.debug(`Read ${f}:`,E),f){case"url":this.url=E;break;case"name":this.name=E;break;case"path":this.path=E;break;case"value":this.value=E;break;case"comment":this.comment=E;break}}}decode(e){let{size:r,hasPort:o,offsets:s}=this.readHeader(e),i=e.offset;e.offset=i+24,this.readTimestamps(e),o>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=i,this.readStrings(e,r,s)}convertFlags(){return(this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var h=m("BinaryCodablePage"),P=class P{constructor(e){this.cookies=[];let r={offset:0,buffer:e};this.decode(r)}toCookieRows(){let e=[];for(let r of this.cookies)try{let o=r.toCookieRow();o!==null&&e.push(o)}catch(o){let s=o instanceof Error?o.message:String(o);v("BinaryCookies","Error converting cookie",{error:s})}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if(h.debug("Page header:",r.toString(16)),e.offset+=4,r!==P.HEADER)throw new Error("Invalid page header");let o=e.buffer.readUInt32LE(e.offset);h.debug("Cookie count:",o),e.offset+=4;let s=e.offset-8;h.debug("Page start offset:",s);let i=[];for(let f=0;f<o;f++){let a=e.buffer.readUInt32LE(e.offset);i.push(a),h.debug(`Cookie ${f} offset:`,a),e.offset+=4}let n=e.buffer.readUInt32BE(e.offset);if(h.debug("Page footer:",n.toString(16)),e.offset+=4,n!==P.FOOTER)throw new Error("Invalid page footer");for(let f=0;f<o;f++)try{let a=i[f];h.debug(`Reading cookie ${f} at offset:`,a);let c=e.buffer.readUInt32LE(a);if(h.debug(`Cookie ${f} size:`,c),c<48){h.warn(`Invalid cookie size ${c} at index ${f}`);continue}if(a+c>e.buffer.length){h.warn(`Cookie size ${c} at index ${f} would exceed buffer length ${e.buffer.length}`);continue}let l=e.buffer.subarray(a,a+c),g=new M(l);this.cookies.push(g)}catch(a){h.warn("Invalid cookie data",{error:a instanceof Error?a.message:String(a)})}}};P.HEADER=256,P.FOOTER=0;var Q=P;var S=m("BinaryCodableCookies"),y=class y{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r)}static fromFile(e){let r=lr(e);return new y(r)}static fromDefaultPath(){return y.fromFile(y.DEFAULT_COOKIE_PATH)}toCookieRows(){let e=[];for(let r of this.pages)try{let o=r.toCookieRows();Array.isArray(o)&&e.push(...o)}catch(o){let s=o instanceof Error?o.message:String(o);v("BinaryCookies","Error converting page cookies",{error:s})}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,S.debug("Magic bytes:",r.toString()),!r.equals(y.MAGIC))throw new Error("Missing magic value");let o=e.buffer.readUInt32BE(e.offset);S.debug("Page count:",o),e.offset+=4;let s=[];for(let c=0;c<o;c++){let l=e.buffer.readUInt32BE(e.offset);s.push(l),S.debug(`Page ${c} size:`,l),e.offset+=4}let i=e.offset;S.debug("Starting page data at offset:",i);for(let c of s)try{S.debug("Reading page at offset:",i,"with size:",c);let l=e.buffer.subarray(i,i+c),g=new Q(l);this.pages.push(g),i+=c}catch(l){let g=l instanceof Error?l.message:String(l);S.warn("Error decoding page:",{error:g}),i+=c}e.offset=i;let n=e.buffer.readUInt32BE(e.offset);S.debug("Checksum:",n.toString(16)),e.offset+=4;let f=e.buffer.readBigUInt64BE(e.offset);S.debug("Footer:",f.toString(16)),e.offset+=8,f!==y.FOOTER&&v("BinaryCookies","Invalid cookie file format: wrong footer");let a=e.buffer.subarray(e.offset);this.metadata={}}catch(r){let o=r instanceof Error?r.message:String(r);throw v("BinaryCookies","Error decoding binary cookies file",{error:o}),r}}};y.MAGIC=ur.from("cook","utf8"),y.FOOTER=BigInt("0x071720050000004b"),y.DEFAULT_COOKIE_PATH=mr(pr(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var z=y;function de(t){return z.fromFile(t).toCookieRows()}var D=class extends d{constructor(){super("SafariCookieQueryStrategy","Safari")}getCookieDbPath(e){return dr(e,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies")}formatDomain(e){return e.startsWith(".")?e.slice(1):e}formatExpiry(e){return e==null?void 0:typeof e!="number"||Number.isNaN(e)||e<=0?"Infinity":e<0||e>4102444800?(this.logger.warn("Invalid expiry timestamp, treating as session cookie",{expiry:e}),"Infinity"):new Date(e*1e3)}isFlagSet(e,r){return typeof e!="number"||Number.isNaN(e)||e<=0?!1:(e&r)===r}formatCreation(e){if(typeof e!="number"||Number.isNaN(e)||e<=0)return;if(e<0||e>4102444800){this.logger.warn("Invalid creation timestamp, ignoring",{creation:e});return}return e*1e3}processValue(e){return e===null?"null":e===void 0?"undefined":Buffer.isBuffer(e)?e.toString():String(e)}decodeCookies(e,r,o){try{return de(e).filter(i=>(r==="%"||i.name===r)&&(o==="%"||this.formatDomain(i.domain).includes(o))).map(i=>({domain:this.formatDomain(i.domain),name:i.name,value:this.processValue(i.value),expiry:this.formatExpiry(i.expiry),meta:{file:e,browser:"Safari",decrypted:!1,secure:this.isFlagSet(i.flags,1),httpOnly:this.isFlagSet(i.flags,4),path:i.path,version:i.version,comment:i.comment,commentURL:i.commentURL,port:i.port,creation:this.formatCreation(i.creation)}}))}catch(s){let i=s instanceof Error?s.message:String(s);return i.includes("EPERM")||i.includes("operation not permitted")||i.includes("Permission denied")?this.logger.debug(`Permission denied accessing Safari cookies at ${e}`,{error:i,file:e,name:r,domain:o}):s instanceof Error?this.logger.error(`Error decoding ${e}`,{error:s.message,file:e,name:r,domain:o}):this.logger.error(`Error decoding ${e}`,{error:String(s),file:e,name:r,domain:o}),[]}}executeQuery(e,r,o,s){try{this.logger.info("Querying cookies",{name:e,domain:r,store:o});let i=gr();if(typeof i!="string"||i.length===0)return this.logger.error("Failed to get home directory"),Promise.resolve([]);let n=o??this.getCookieDbPath(i);return Promise.resolve(this.decodeCookies(n,e||"%",r||"%"))}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i.message,name:e,domain:r}):this.logger.error("Failed to query cookies",{error:String(i),name:e,domain:r}),Promise.resolve([])}}};async function he(t){if(!t.name||!t.domain)return[];let{name:e,domain:r}=t;if(typeof e!="string"||typeof r!="string")return[];let o=[new O,new L,new D];return(await Promise.allSettled(o.map(i=>i.queryCookies(e,r)))).filter(i=>i.status==="fulfilled").flatMap(i=>i.value)}async function hr(t){try{return await he(t)}catch(e){return C.warn("Error querying cookies:",e instanceof Error?e.message:String(e)),[]}}import wr from"fast-glob";import{homedir as yr,platform as Cr}from"os";import{join as p}from"path";function ye(t){let e=yr();if(!e)throw new Error("Unable to determine user home directory");let r=Cr(),s={chrome:{windows:p(e,"AppData","Local","Google","Chrome","User Data"),macos:p(e,"Library","Application Support","Google","Chrome"),linux:p(e,".config","google-chrome")},chromium:{windows:p(e,"AppData","Local","Chromium","User Data"),macos:p(e,"Library","Application Support","Chromium"),linux:p(e,".config","chromium")},brave:{windows:p(e,"AppData","Local","BraveSoftware","Brave-Browser","User Data"),macos:p(e,"Library","Application Support","BraveSoftware","Brave-Browser"),linux:p(e,".config","BraveSoftware","Brave-Browser")},edge:{windows:p(e,"AppData","Local","Microsoft","Edge","User Data"),macos:p(e,"Library","Application Support","Microsoft Edge"),linux:p(e,".config","microsoft-edge")},opera:{windows:p(e,"AppData","Roaming","Opera Software","Opera Stable"),macos:p(e,"Library","Application Support","com.operasoftware.Opera"),linux:p(e,".config","opera")},vivaldi:{windows:p(e,"AppData","Local","Vivaldi","User Data"),macos:p(e,"Library","Application Support","Vivaldi"),linux:p(e,".config","vivaldi")},whale:{windows:p(e,"AppData","Local","Naver","Naver Whale","User Data"),macos:p(e,"Library","Application Support","Naver","Whale"),linux:p(e,".config","naver-whale")}}[t];if(!s)throw new Error(`Unknown browser: ${t}`);switch(r){case"win32":return s.windows;case"darwin":return s.macos;case"linux":return s.linux;default:throw new Error(`Platform ${r} is not supported`)}}function Ce(t,e,r,o,s,i,n){return{domain:t,name:e,value:r,expiry:T(o),meta:{file:s,browser:i.charAt(0).toUpperCase()+i.slice(1),decrypted:n}}}var G=class extends d{constructor(e="chrome"){let r=e.charAt(0).toUpperCase()+e.slice(1);super(`${r}CookieQueryStrategy`,"Chrome"),this.browser=e}listBrowserCookiePaths(){try{let e=ye(this.browser),r=wr.sync("./**/Cookies",{cwd:e,absolute:!0});return this.logger.debug(`Found ${r.length} cookie files for ${this.browser}`),r}catch(e){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:e}),[]}}async executeQuery(e,r,o,s){let i=["darwin","win32","linux"];if(!i.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:i}),[];let n=o??this.listBrowserCookiePaths(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn(`No ${this.browser} cookie files found`),[];try{let a=await N();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}catch(a){return this.logger.error(`Failed to get ${this.browser} password`,{error:a}),[]}}async processFile(e,r,o,s){try{let i=await _({name:r,domain:o,file:e}),n={file:e,password:s,browser:this.browser};return(await Promise.allSettled(i.map(a=>this.processCookie(a,n)))).map(a=>a.status==="fulfilled"?a.value:null).filter(a=>a!==null)}catch(i){return this.logger.error(`Failed to process ${this.browser} cookie file`,{error:i instanceof Error?i.message:String(i),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),s=await A(o,r.password);return Ce(e.domain,e.name,s,e.expiry,r.file,r.browser,!0)}catch(o){return this.logger.warn(`Failed to decrypt ${this.browser} cookie`,{error:o instanceof Error?o.message:String(o)}),Ce(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,!1)}}};async function we(t,e,r=[]){return t.length===0?r:(await Promise.all(t.map(async s=>{try{return await e(s)}catch{return r}}))).flat()}var Z=class{constructor(e){this.strategies=e;this.logger=m("CompositeCookieQueryStrategy");this.browserName="internal"}handleStrategyError(e,r){e instanceof Error?this.logger.error("Strategy failed",{error:e,strategy:r}):this.logger.error("Strategy failed with unknown error",{error:String(e),strategy:r})}async queryCookies(e,r,o,s){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:o,force:s,strategyCount:this.strategies.length}),await we(this.strategies,async i=>{try{return await i.queryCookies(e,r,o,s)}catch(n){return this.handleStrategyError(n,i),[]}},[])}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i}):this.logger.error("Failed to query cookies with unknown error",{error:String(i)}),[]}}};export{O as ChromeCookieQueryStrategy,G as ChromiumCookieQueryStrategy,Z as CompositeCookieQueryStrategy,L as FirefoxCookieQueryStrategy,D as SafariCookieQueryStrategy,hr as getCookie};
|
|
3
3
|
//# sourceMappingURL=index.js.map
|