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