@mherod/get-cookie 2.0.0-beta.5 → 2.0.0-beta.6

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.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- var e=require("lodash"),r=require("fs"),n=require("crypto"),o=require("path"),t=require("child_process"),i=require("sqlite3"),s=require("jsonwebtoken"),a=require("tty");var l=e.merge;const c={};l(c,process.env);const g=c.HOME;if(!g)throw new Error("HOME environment variable is not set");async function u(e){return process.env.VERBOSE&&console.log(e),new Promise(((r,n)=>{(0,t.exec)(e,{encoding:"binary",maxBuffer:5120},((e,o,t)=>{e||t?n(e):o&&r(o.trim())}))}))}function f(e){return null==e?null:(process.env.VERBOSE&&console.log("result",e),"string"==typeof e&&e.length>0?e:e.slice&&e.toString?e.toString("utf8"):null)}async function h({path:e,name:n,maxDepth:o=2}){const t=e.split("/").length;c.VERBOSE&&console.log(`Searching for ${n} in ${e}`);const i=[];let s;try{s=r.readdirSync(e)}catch(r){return c.VERBOSE&&console.log(`Error reading ${e}`,r),[]}for(const a of s){const s=e+"/"+a;let l;try{l=r.statSync(s)}catch(e){c.VERBOSE&&console.error(`Error getting stat for ${s}`,e);continue}if(l.isDirectory()){if(s.split("/").length<t+o)try{const e=await h({path:s,name:n,maxDepth:2});i.push(...e)}catch(e){c.VERBOSE&&console.error(e)}}else a===n&&i.push(s)}return c.VERBOSE&&i.length>0&&(console.log(`Found ${i.length} ${n} files`),console.log(i)),i}async function d(e,n){if(!r.existsSync(e))throw new Error(`doSqliteQuery1: file ${e} does not exist`);const o=new i.Database(e);return new Promise(((r,t)=>{o.all(n,((n,o)=>{if(n)return void t(n);const i=o;if(null!=i&&0!==i.length)if(Array.isArray(i)){const n=i.map((r=>({domain:r.host_key,name:r.name,value:r.encrypted_value,meta:{file:e}})));r(n)}else process.env.VERBOSE&&console.log(`doSqliteQuery1: rows ${JSON.stringify(i)}`),r([i]);else r([])}))}))}function y(e){return void 0!==e.domain&&void 0!==e.name&&void 0!==e.value}function m(e){return void 0!==e.domain&&void 0!==e.name&&void 0!==e.value}class E{async queryCookies(t,i){if("darwin"!==process.platform)throw new Error("This only works on macOS");return c.FIREFOX_ONLY?[]:async function({name:t,domain:i="%",requireJwt:s=!1}){const a=await async function(e,n){try{const t=(await h({path:p,name:"Cookies"})).map((t=>async function(e,n,t){try{return await async function({name:e,domain:n,file:t=o.join(p,"Default","Cookies")}){if(!(0,r.existsSync)(t))throw new Error(`File ${t} does not exist`);if(c.VERBOSE){const r=t.split("/").slice(-3).join("/");console.log(`Trying Chrome (at ${r}) cookie ${e} for domain ${n}`)}let i;i="SELECT encrypted_value, name, host_key FROM cookies";const s=/^([*%])$/i,a=null==e.match(s),l=null==n.match(s);(a||l)&&(i+=" WHERE ",a&&(i+=`name = '${e}'`,l&&(i+=" AND ")),l&&(i+=`host_key LIKE '${n}';`));return d(t,i)}({name:e,domain:n,file:t})}catch(e){return c.VERBOSE&&console.log("Error getting encrypted cookie",e),[]}}(e,n,t)));return(await Promise.all(t)).flat().filter(y)}catch(e){return c.VERBOSE&&console.log("error",e),[]}}(t,i),l=await async function(){return u('security find-generic-password -w -s "Chrome Safe Storage"')}(),g=a.filter((({value:e})=>null!=e&&e.length>0)).map((async r=>{const o=r.value,t=await async function(e,r){let o;try{o=await async function(e,r){if("string"!=typeof e)throw new Error("password must be a string: "+e);let o;if(o=r,null==o||"object"!=typeof o)throw new Error("encryptedData must be a object: "+o);if(!(o instanceof Buffer)){if(!(Array.isArray(o)&&o[0]instanceof Buffer))throw new Error("encryptedData must be a Buffer: "+o);[o]=o,c.VERBOSE&&console.log(`encryptedData is an array of buffers, selected first: ${o}`),o=Buffer.from(o)}c.VERBOSE&&console.log(`Trying to decrypt with password ${e}`);return new Promise(((r,t)=>{n.pbkdf2(e,"saltysalt",1003,16,"sha1",((e,i)=>{try{if(e)return c.VERBOSE&&console.log("Error doing pbkdf2",e),void t(e);if(16!==i.length)return c.VERBOSE&&console.log("Error doing pbkdf2, buffer length is not 16",i.length),void t(new Error("Buffer length is not 16"));const s=new Array(17).join(" "),a=Buffer.from(s,"binary"),l=n.createDecipheriv("aes-128-cbc",i,a);if(l.setAutoPadding(!1),o&&o.slice&&(o=o.slice(3)),o.length%16!=0)return c.VERBOSE&&console.log("Error doing pbkdf2, encryptedData length is not a multiple of 16",o.length),void t(new Error("encryptedData length is not a multiple of 16"));let g=l.update(o);try{l.final("utf-8")}catch(e){return c.VERBOSE&&console.log("Error doing decipher.final()",e),void t(e)}const u=g[g.length-1];u&&(g=g.slice(0,0-u));const f=g.toString("utf8");r(f)}catch(e){t(e)}}))}))}(e,r)}catch(e){c.VERBOSE&&console.log("Error decrypting cookie",e),o=null}return o??r.toString("utf-8")}(l,o),i={};return(0,e.merge)(i,r.meta??{}),{domain:r.domain,name:r.name,value:t,meta:i}})),f=(await Promise.all(g)).filter(m);c.VERBOSE&&console.log("results",f);return f}({requireJwt:!1,name:t,domain:i})}}const p=o.join(g,"Library","Application Support","Google","Chrome");class B{async queryCookies(e,r){if("darwin"!==process.platform)throw new Error("This only works on macOS");if(c.CHROME_ONLY)return[];const n=await this.#e({name:e,domain:r});return Array.isArray(n)?n.map(f):[]}async#e({name:e,domain:r}){const n=await h({path:o.join(g,"Library","Application Support","Firefox","Profiles"),name:"cookies.sqlite"});return(await Promise.all(n.map((n=>this.#r(n,e,r))))).flat()}#r(e,n,o){if(e&&!(0,r.existsSync)(e))throw new Error(`File ${e} does not exist`);let t;return c.VERBOSE&&console.log(`Trying Firefox cookie ${n} for domain ${o}`),t="SELECT value FROM moz_cookies","string"!=typeof n&&"string"!=typeof o||(t+=" WHERE ","string"==typeof n&&(t+=`name = '${n}'`,"string"==typeof o&&(t+=" AND ")),"string"==typeof o&&(t+=`host LIKE '${o}';`)),d(e,t).then((e=>e.map((e=>({domain:e.domain,name:e.name,value:e.value.toString("utf8")}))))).catch((()=>[]))}}class b{async queryCookies(e,r){return[]}}class w{#n;constructor(){this.#n=[E,B,b].map((e=>new e))}async queryCookies(e,r){return(await Promise.all(this.#n.map((async n=>n.queryCookies(e,r).catch((()=>[])))))).flat()}}function O(e){try{const n=(r=s,r&&r.__esModule?r.default:r).decode(e,{complete:!0});return c.VERBOSE&&console.log(n),!0}catch(e){return!1}var r}const S=process.argv??[],{env:R={},argv:v=[],platform:k=""}="undefined"==typeof process?{}:process,C="NO_COLOR"in R||v.includes("--no-color"),q="FORCE_COLOR"in R||v.includes("--color"),V="win32"===k,$="dumb"===R.TERM,_=a&&a.isatty&&a.isatty(1)&&R.TERM&&!$,x=!C&&(q||V&&!$||_||"CI"in R&&("GITHUB_ACTIONS"in R||"GITLAB_CI"in R||"CIRCLECI"in R)),I=(e,r,n,o,t=r.substring(0,e)+o,i=r.substring(e+n.length),s=i.indexOf(n))=>t+(s<0?i:I(s,i,n,o)),D=(e,r,n=e,o=e.length+1)=>t=>t||""!==t&&void 0!==t?((e,r,n,o,t)=>e<0?n+r+o:n+I(e,r,o,t)+o)((""+t).indexOf(r,o),t,e,r,n):"",L=(e,r,n)=>D(`[${e}m`,`[${r}m`,n),N={reset:L(0,0),bold:L(1,22,""),dim:L(2,22,""),italic:L(3,23),underline:L(4,24),inverse:L(7,27),hidden:L(8,28),strikethrough:L(9,29),black:L(30,39),red:L(31,39),green:L(32,39),yellow:L(33,39),blue:L(34,39),magenta:L(35,39),cyan:L(36,39),white:L(37,39),gray:L(90,39),bgBlack:L(40,49),bgRed:L(41,49),bgGreen:L(42,49),bgYellow:L(43,49),bgBlue:L(44,49),bgMagenta:L(45,49),bgCyan:L(46,49),bgWhite:L(47,49),blackBright:L(90,39),redBright:L(91,39),greenBright:L(92,39),yellowBright:L(93,39),blueBright:L(94,39),magentaBright:L(95,39),cyanBright:L(96,39),whiteBright:L(97,39),bgBlackBright:L(100,49),bgRedBright:L(101,49),bgGreenBright:L(102,49),bgYellowBright:L(103,49),bgBlueBright:L(104,49),bgMagentaBright:L(105,49),bgCyanBright:L(106,49),bgWhiteBright:L(107,49)},{reset:A,bold:F,dim:T,italic:M,underline:j,inverse:G,hidden:P,strikethrough:W,black:Y,red:H,green:J,yellow:Q,blue:U,magenta:X,cyan:K,white:z,gray:Z,bgBlack:ee,bgRed:re,bgGreen:ne,bgYellow:oe,bgBlue:te,bgMagenta:ie,bgCyan:se,bgWhite:ae,blackBright:le,redBright:ce,greenBright:ge,yellowBright:ue,blueBright:fe,magentaBright:he,cyanBright:de,whiteBright:ye,bgBlackBright:me,bgRedBright:Ee,bgGreenBright:pe,bgYellowBright:Be,bgBlueBright:be,bgMagentaBright:we,bgCyanBright:Oe,bgWhiteBright:Se}=(({useColor:e=x}={})=>e?N:Object.keys(N).reduce(((e,r)=>({...e,[r]:String})),{}))();function Re(r){return(0,e.uniqBy)(r,(e=>e.name)).map((e=>e.name+"="+e.value)).join("; ")}function ve(e){return U(Re(e))}if(S&&S.length>2){const r=S[2];let n;n=null!=S[3]&&S[3].indexOf(".")>-1?S[3]:"%";const o="true";S.includes("--require-jwt")&&(c.REQUIRE_JWT=o),S.includes("--verbose")&&(c.VERBOSE=o),S.includes("--chrome-only")&&(c.CHROME_ONLY=o),S.includes("--firefox-only")&&(c.FIREFOX_ONLY=o),S.includes("--ignore-expired")&&(c.IGNORE_EXPIRED=o),S.includes("--single")&&(c.SINGLE=o),c.VERBOSE&&console.log("Verbose mode",S),async function(r,n){try{const o=await async function({name:r,domain:n},o=new w){const t=await o.queryCookies(r,n),i=(0,e.uniqBy)(t,JSON.stringify),s=[];for(const e of i)O(e.value)&&s.push(e);const a=c.REQUIRE_JWT?s:i;return c.SINGLE?[a[0]]:a}({name:r,domain:n});if(o.length>0)if(S.includes("--combined-string"))console.log(ve(o));else if(S.includes("--dump"))console.log(o);else if(S.includes("--dump-grouped")){const r=(0,e.groupBy)(o,(e=>e.meta?.file));console.log(J(JSON.stringify(r,null,2)))}else if(S.includes("--combined-string-grouped")){const r=(0,e.groupBy)(o,(e=>e.meta?.file));for(const e of Object.keys(r)){let n=r[e];console.log(J(e)+": ",ve(n))}}else for(const e of o)console.log(e.value);else console.error("No results")}catch(e){console.error(e)}}(r,n).catch(console.error)}
2
+ var e=require("lodash"),r=require("fs"),n=require("crypto"),t=require("path"),o=require("child_process"),i=require("sqlite3"),s=require("jsonwebtoken"),a=require("tty");var l=e.merge;const c={};l(c,process.env);const g=c.HOME;if(!g)throw new Error("HOME environment variable is not set");async function u(e){return new Promise(((r,n)=>{(0,o.exec)(e,{encoding:"binary",maxBuffer:5120},((e,t,o)=>{e||o?n(e):t&&r(t.trim())}))}))}function f(e){return null==e?null:(process.env.VERBOSE&&console.log("result",e),"string"==typeof e&&e.length>0?e:e.slice&&e.toString?e.toString("utf8"):null)}async function h({path:e,name:n,maxDepth:t=2}){const o=e.split("/").length;c.VERBOSE&&console.log(`Searching for ${n} in ${e}`);const i=[];let s;try{s=r.readdirSync(e)}catch(r){return c.VERBOSE&&console.log(`Error reading ${e}`,r),[]}for(const a of s){const s=e+"/"+a;let l;try{l=r.statSync(s)}catch(e){c.VERBOSE&&console.error(`Error getting stat for ${s}`,e);continue}if(l.isDirectory()){if(s.split("/").length<o+t)try{const e=await h({path:s,name:n,maxDepth:2});i.push(...e)}catch(e){c.VERBOSE&&console.error(e)}}else a===n&&i.push(s)}return c.VERBOSE&&i.length>0&&(console.log(`Found ${i.length} ${n} files`),console.log(i)),i}async function d(e,n){if(!r.existsSync(e))throw new Error(`doSqliteQuery1: file ${e} does not exist`);const t=new i.Database(e);return new Promise(((r,o)=>{t.all(n,((n,t)=>{if(n)return void o(n);const i=t;if(null!=i&&0!==i.length)if(Array.isArray(i)){const n=i.map((r=>({domain:r.host_key,name:r.name,value:r.encrypted_value,meta:{file:e}})));r(n)}else process.env.VERBOSE&&console.log(`doSqliteQuery1: rows ${JSON.stringify(i)}`),r([i]);else r([])}))}))}function y(e){return void 0!==e.domain&&void 0!==e.name&&void 0!==e.value}function m(e){return void 0!==e.domain&&void 0!==e.name&&void 0!==e.value}class E{async queryCookies(o,i){if("darwin"!==process.platform)throw new Error("This only works on macOS");return c.FIREFOX_ONLY?[]:async function({name:o,domain:i="%",requireJwt:s=!1}){const a=await async function(e,n){try{const o=(await h({path:p,name:"Cookies"})).map((o=>async function(e,n,o){try{return await async function({name:e,domain:n,file:o=t.join(p,"Default","Cookies")}){if(!(0,r.existsSync)(o))throw new Error(`File ${o} does not exist`);if(c.VERBOSE){const r=o.split("/").slice(-3).join("/");console.log(`Trying Chrome (at ${r}) cookie ${e} for domain ${n}`)}let i;i="SELECT encrypted_value, name, host_key FROM cookies";const s=/^([*%])$/i,a=null==e.match(s),l=null==n.match(s);(a||l)&&(i+=" WHERE ",a&&(i+=`name = '${e}'`,l&&(i+=" AND ")),l&&(i+=`host_key LIKE '${n}';`));return d(o,i)}({name:e,domain:n,file:o})}catch(e){return c.VERBOSE&&console.log("Error getting encrypted cookie",e),[]}}(e,n,o)));return(await Promise.all(o)).flat().filter(y)}catch(e){return c.VERBOSE&&console.log("error",e),[]}}(o,i),l=await async function(){return u('security find-generic-password -w -s "Chrome Safe Storage"')}(),g=a.filter((({value:e})=>null!=e&&e.length>0)).map((async r=>{const t=r.value,o=await async function(e,r){let t;try{t=await async function(e,r){if("string"!=typeof e)throw new Error("password must be a string: "+e);let t;if(t=r,null==t||"object"!=typeof t)throw new Error("encryptedData must be a object: "+t);if(!(t instanceof Buffer)){if(!(Array.isArray(t)&&t[0]instanceof Buffer))throw new Error("encryptedData must be a Buffer: "+t);[t]=t,c.VERBOSE&&console.log(`encryptedData is an array of buffers, selected first: ${t}`),t=Buffer.from(t)}c.VERBOSE&&console.log(`Trying to decrypt with password ${e}`);return new Promise(((r,o)=>{n.pbkdf2(e,"saltysalt",1003,16,"sha1",((e,i)=>{try{if(e)return c.VERBOSE&&console.log("Error doing pbkdf2",e),void o(e);if(16!==i.length)return c.VERBOSE&&console.log("Error doing pbkdf2, buffer length is not 16",i.length),void o(new Error("Buffer length is not 16"));const s=new Array(17).join(" "),a=Buffer.from(s,"binary"),l=n.createDecipheriv("aes-128-cbc",i,a);if(l.setAutoPadding(!1),t&&t.slice&&(t=t.slice(3)),t.length%16!=0)return c.VERBOSE&&console.log("Error doing pbkdf2, encryptedData length is not a multiple of 16",t.length),void o(new Error("encryptedData length is not a multiple of 16"));let g=l.update(t);try{l.final("utf-8")}catch(e){return c.VERBOSE&&console.log("Error doing decipher.final()",e),void o(e)}const u=g[g.length-1];u&&(g=g.slice(0,0-u));const f=g.toString("utf8");r(f)}catch(e){o(e)}}))}))}(e,r)}catch(e){c.VERBOSE&&console.log("Error decrypting cookie",e),t=null}return t??r.toString("utf-8")}(l,t),i={};return(0,e.merge)(i,r.meta??{}),{domain:r.domain,name:r.name,value:o,meta:i}})),f=(await Promise.all(g)).filter(m);c.VERBOSE&&console.log("results",f);return f}({requireJwt:!1,name:o,domain:i})}}const p=t.join(g,"Library","Application Support","Google","Chrome");class B{async queryCookies(e,r){if("darwin"!==process.platform)throw new Error("This only works on macOS");if(c.CHROME_ONLY)return[];const n=await this.#e({name:e,domain:r});return Array.isArray(n)?n.map(f):[]}async#e({name:e,domain:r}){const n=await h({path:t.join(g,"Library","Application Support","Firefox","Profiles"),name:"cookies.sqlite"});return(await Promise.all(n.map((n=>this.#r(n,e,r))))).flat()}#r(e,n,t){if(e&&!(0,r.existsSync)(e))throw new Error(`File ${e} does not exist`);let o;return c.VERBOSE&&console.log(`Trying Firefox cookie ${n} for domain ${t}`),o="SELECT value FROM moz_cookies","string"!=typeof n&&"string"!=typeof t||(o+=" WHERE ","string"==typeof n&&(o+=`name = '${n}'`,"string"==typeof t&&(o+=" AND ")),"string"==typeof t&&(o+=`host LIKE '${t}';`)),d(e,o).then((e=>e.map((e=>({domain:e.domain,name:e.name,value:e.value.toString("utf8")}))))).catch((()=>[]))}}class b{async queryCookies(e,r){return[]}}class w{#n;constructor(){this.#n=[E,B,b].map((e=>new e))}async queryCookies(e,r){return(await Promise.all(this.#n.map((async n=>n.queryCookies(e,r).catch((()=>[])))))).flat()}}function O(e){try{const n=(r=s,r&&r.__esModule?r.default:r).decode(e,{complete:!0});return c.VERBOSE&&console.log(n),!0}catch(e){return!1}var r}const S=process.argv??[],{env:R={},argv:k=[],platform:v=""}="undefined"==typeof process?{}:process,C="NO_COLOR"in R||k.includes("--no-color"),q="FORCE_COLOR"in R||k.includes("--color"),$="win32"===v,V="dumb"===R.TERM,_=a&&a.isatty&&a.isatty(1)&&R.TERM&&!V,x=!C&&(q||$&&!V||_||"CI"in R&&("GITHUB_ACTIONS"in R||"GITLAB_CI"in R||"CIRCLECI"in R)),I=(e,r,n,t,o=r.substring(0,e)+t,i=r.substring(e+n.length),s=i.indexOf(n))=>o+(s<0?i:I(s,i,n,t)),D=(e,r,n=e,t=e.length+1)=>o=>o||""!==o&&void 0!==o?((e,r,n,t,o)=>e<0?n+r+t:n+I(e,r,t,o)+t)((""+o).indexOf(r,t),o,e,r,n):"",L=(e,r,n)=>D(`[${e}m`,`[${r}m`,n),N={reset:L(0,0),bold:L(1,22,""),dim:L(2,22,""),italic:L(3,23),underline:L(4,24),inverse:L(7,27),hidden:L(8,28),strikethrough:L(9,29),black:L(30,39),red:L(31,39),green:L(32,39),yellow:L(33,39),blue:L(34,39),magenta:L(35,39),cyan:L(36,39),white:L(37,39),gray:L(90,39),bgBlack:L(40,49),bgRed:L(41,49),bgGreen:L(42,49),bgYellow:L(43,49),bgBlue:L(44,49),bgMagenta:L(45,49),bgCyan:L(46,49),bgWhite:L(47,49),blackBright:L(90,39),redBright:L(91,39),greenBright:L(92,39),yellowBright:L(93,39),blueBright:L(94,39),magentaBright:L(95,39),cyanBright:L(96,39),whiteBright:L(97,39),bgBlackBright:L(100,49),bgRedBright:L(101,49),bgGreenBright:L(102,49),bgYellowBright:L(103,49),bgBlueBright:L(104,49),bgMagentaBright:L(105,49),bgCyanBright:L(106,49),bgWhiteBright:L(107,49)},{reset:A,bold:F,dim:T,italic:M,underline:j,inverse:G,hidden:P,strikethrough:W,black:Y,red:H,green:J,yellow:Q,blue:U,magenta:X,cyan:K,white:z,gray:Z,bgBlack:ee,bgRed:re,bgGreen:ne,bgYellow:te,bgBlue:oe,bgMagenta:ie,bgCyan:se,bgWhite:ae,blackBright:le,redBright:ce,greenBright:ge,yellowBright:ue,blueBright:fe,magentaBright:he,cyanBright:de,whiteBright:ye,bgBlackBright:me,bgRedBright:Ee,bgGreenBright:pe,bgYellowBright:Be,bgBlueBright:be,bgMagentaBright:we,bgCyanBright:Oe,bgWhiteBright:Se}=(({useColor:e=x}={})=>e?N:Object.keys(N).reduce(((e,r)=>({...e,[r]:String})),{}))();function Re(r){return(0,e.uniqBy)(r,(e=>e.name)).map((e=>e.name+"="+e.value)).join("; ")}function ke(e){return U(Re(e))}if(S&&S.length>2){const r=S[2];let n;n=null!=S[3]&&S[3].indexOf(".")>-1?S[3]:"%";const t="true";S.includes("--require-jwt")&&(c.REQUIRE_JWT=t),S.includes("--verbose")&&(c.VERBOSE=t),S.includes("--chrome-only")&&(c.CHROME_ONLY=t),S.includes("--firefox-only")&&(c.FIREFOX_ONLY=t),S.includes("--ignore-expired")&&(c.IGNORE_EXPIRED=t),S.includes("--single")&&(c.SINGLE=t),c.VERBOSE&&console.log("Verbose mode",S),async function(r,n){try{const t=await async function({name:r,domain:n},t=new w){const o=await t.queryCookies(r,n),i=(0,e.uniqBy)(o,JSON.stringify),s=[];for(const e of i)O(e.value)&&s.push(e);const a=c.REQUIRE_JWT?s:i;return c.SINGLE?[a[0]]:a}({name:r,domain:n});if(t.length>0)if(S.includes("--combined-string"))console.log(ke(t));else if(S.includes("--dump"))console.log(t);else if(S.includes("--dump-grouped")){const r=(0,e.groupBy)(t,(e=>e.meta?.file));console.log(J(JSON.stringify(r,null,2)))}else if(S.includes("--combined-string-grouped")){const r=(0,e.groupBy)(t,(e=>e.meta?.file));for(const e of Object.keys(r)){let n=r[e];console.log(J(e)+": ",ke(n))}}else for(const e of t)console.log(e.value);else console.error("No results")}catch(e){console.error(e)}}(r,n).catch(console.error)}
3
3
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/global.ts","src/utils.ts","src/findAllFiles.ts","src/doSqliteQuery1.ts","src/IsCookieRow.ts","src/IsExportedCookie.ts","src/browsers/ChromeCookieQueryStrategy.ts","src/browsers/FirefoxCookieQueryStrategy.ts","src/browsers/SafariCookieQueryStrategy.ts","src/browsers/CompositeCookieQueryStrategy.ts","src/isValidJwt.ts","src/argv.ts","node_modules/colorette/index.js","src/resultsRendered.ts","src/cli.ts","src/queryCookies.ts"],"sourcesContent":["const { merge } = require(\"lodash\");\nexport const env: any = {};\nmerge(env, process.env);\nexport const HOME: string = env[\"HOME\"];\nif (!HOME) {\n throw new Error(\"HOME environment variable is not set\");\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport {exec, ExecException} from \"child_process\";\n\nexport async function execSimple(command: string): Promise<string> {\n if (process.env.VERBOSE) {\n console.log(command);\n }\n return new Promise((resolve, reject) => {\n exec(\n command,\n { encoding: \"binary\", maxBuffer: 5 * 1024 },\n (error: ExecException | null, stdout: string, stderr: string) => {\n if (error) {\n reject(error);\n return;\n }\n if (stderr) {\n reject(error);\n return;\n }\n if (stdout) {\n resolve(stdout.trim());\n }\n }\n );\n });\n}\n\n// export async function execAsBuffer(command: string) {\n// if (process.env.VERBOSE) {\n// console.log(command);\n// }\n// return await new Promise((resolve, reject) => {\n// exec(\n// command,\n// { encoding: \"binary\", maxBuffer: 5 * 1024 },\n// (error: ExecException | null, stdout: string, stderr: string) => {\n// if (error) {\n// reject(error);\n// return;\n// }\n// if (stderr) {\n// reject(error);\n// return;\n// }\n// let stdoutAsBuffer: string = stdout;\n// if (typeof stdoutAsBuffer === \"string\" && stdoutAsBuffer.length > 0) {\n// // noinspection JSCheckFunctionSignatures\n// stdoutAsBuffer = Buffer.from(stdoutAsBuffer, \"binary\").slice(0, -1);\n// }\n// if (stdoutAsBuffer && stdoutAsBuffer.length > 0) {\n// resolve(stdoutAsBuffer);\n// }\n// }\n// );\n// });\n// }\n\n// @ts-ignore\nexport function toStringValue(r: any): string {\n if (process.env.VERBOSE) {\n console.log(\"Printing value\", r);\n }\n if (r) {\n if (typeof r === \"string\") {\n return r;\n } else if (r.toString) {\n // noinspection JSCheckFunctionSignatures\n return r.toString(\"utf8\");\n }\n }\n}\n\nexport function printStringValue(r: any) {\n if (process.env.VERBOSE) {\n console.log(\"Printing value\", r);\n }\n if (r) {\n if (typeof r === \"string\") {\n console.log(r);\n } else if (r.toString) {\n // noinspection JSCheckFunctionSignatures\n console.log(r.toString(\"utf8\"));\n }\n }\n}\n\n/**\n *\n * @param result\n * @returns {string|null}\n */\nexport function toStringOrNull(result: any) {\n if (result == null) {\n return null;\n }\n if (process.env.VERBOSE) {\n console.log(\"result\", result);\n }\n if (typeof result === \"string\" && result.length > 0) {\n return result;\n }\n if (result.slice && result.toString) {\n // noinspection JSCheckFunctionSignatures\n return result.toString(\"utf8\");\n }\n return null;\n}\n\nexport function invalidString(input: any): boolean {\n return typeof input !== \"string\" || input.length === 0;\n}\n\n\nexport function validString(input: any): input is string {\n return typeof input == \"string\" && input.length > 0;\n}\n","import { env } from \"./global\";\nimport * as fs from \"fs\";\n\nexport async function findAllFiles(\n {\n path,\n name,\n maxDepth = 2\n//\n }: {\n path: string;\n name: string;\n maxDepth?: number;\n }\n): Promise<string[]> {\n const rootSegments = path.split(\"/\").length;\n\n if (env.VERBOSE) {\n console.log(`Searching for ${name} in ${path}`);\n }\n const files: string[] = [];\n let readdirSync;\n try {\n readdirSync = fs.readdirSync(path);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(`Error reading ${path}`, e);\n }\n return [];\n }\n for (const file of readdirSync) {\n const filePath = path + \"/\" + file;\n let stat;\n try {\n stat = fs.statSync(filePath);\n } catch (e) {\n if (env.VERBOSE) {\n console.error(`Error getting stat for ${filePath}`, e);\n }\n continue;\n }\n if (stat.isDirectory()) {\n if (filePath.split(\"/\").length < rootSegments + maxDepth) {\n try {\n const subFiles = await findAllFiles({\n path: filePath,\n name: name,\n maxDepth: 2\n });\n files.push(...subFiles);\n } catch (e) {\n if (env.VERBOSE) {\n console.error(e);\n }\n }\n }\n } else if (file === name) {\n files.push(filePath);\n }\n }\n if (env.VERBOSE) {\n if (files.length > 0) {\n console.log(`Found ${files.length} ${name} files`);\n console.log(files);\n }\n }\n return files;\n}\n","import * as fs from \"fs\";\nimport * as sqlite3 from \"sqlite3\";\nimport CookieRow from \"./CookieRow\";\n\nexport async function doSqliteQuery1(file: string, sql: string): Promise<CookieRow[]> {\n if (!fs.existsSync(file)) {\n throw new Error(`doSqliteQuery1: file ${file} does not exist`);\n }\n const db = new sqlite3.Database(file);\n return new Promise((resolve, reject) => {\n db.all(sql, (err: Error, rows: any[]) => {\n if (err) {\n reject(err);\n return;\n }\n const rows1: any[] = rows;\n if (rows1 == null || rows1.length === 0) {\n resolve([]);\n return;\n }\n if (Array.isArray(rows1)) {\n const cookieRows: CookieRow[] = rows1.map((row) => {\n return {\n domain: row[\"host_key\"],\n name: row[\"name\"],\n value: row[\"encrypted_value\"],\n meta: {\n file: file\n }\n };\n });\n resolve(cookieRows);\n return;\n }\n if (process.env.VERBOSE) {\n console.log(`doSqliteQuery1: rows ${JSON.stringify(rows1)}`);\n }\n resolve([rows1]);\n });\n });\n}\n","import CookieRow from \"./CookieRow\";\n\nexport function isCookieRow(obj: any): obj is CookieRow {\n return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;\n}\n","import ExportedCookie from \"./ExportedCookie\";\n\nexport function isExportedCookie(obj: any): obj is ExportedCookie {\n return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport { execSimple } from \"../utils\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as crypto from \"crypto\";\nimport * as path from \"path\";\nimport CookieRow from \"../CookieRow\";\nimport ExportedCookie from \"../ExportedCookie\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport { merge } from \"lodash\";\nimport { isCookieRow } from \"../IsCookieRow\";\nimport { isExportedCookie } from \"../IsExportedCookie\";\n\nexport default class ChromeCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.FIREFOX_ONLY) {\n return [];\n }\n return getChromeCookies({\n requireJwt: false,\n name,\n domain\n });\n }\n}\n\nasync function getPromise1(name: string, domain: string, file: string): Promise<CookieRow[]> {\n try {\n return await getEncryptedChromeCookie({\n name: name,\n domain: domain,\n file: file\n });\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error getting encrypted cookie\", e);\n }\n return [];\n }\n}\n\nasync function getPromise(name: string, domain: string): Promise<CookieRow[]> {\n try {\n const files: string[] = await findAllFiles({\n path: chromeLocal,\n name: \"Cookies\"\n });\n const promises: Promise<CookieRow[]>[] = files.map((file) => getPromise1(name, domain, file));\n const results1: Awaited<CookieRow[]>[] = await Promise.all(promises);\n return results1.flat().filter(isCookieRow);\n } catch (error) {\n if (env.VERBOSE) {\n console.log(\"error\", error);\n }\n return [];\n }\n}\n\nasync function decryptValue(password: string, encryptedValue: Buffer) {\n let d: string | null;\n try {\n d = await decrypt(password, encryptedValue);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error decrypting cookie\", e);\n }\n d = null;\n }\n return d ?? encryptedValue.toString(\"utf-8\");\n}\n\nasync function getChromeCookies(\n {\n name,\n domain = \"%\",\n requireJwt = false\n }: {\n name: string;\n domain: string;\n requireJwt: boolean | undefined;\n //\n }\n //\n): Promise<ExportedCookie[]> {\n const encryptedDataItems: CookieRow[] = await getPromise(name, domain);\n const password: string = await getChromePassword();\n const decrypted: Promise<ExportedCookie | null>[] = encryptedDataItems\n .filter(({ value }) => value != null && value.length > 0)\n .map(async (cookieRow: CookieRow) => {\n const encryptedValue: Buffer = cookieRow.value;\n const decryptedValue = await decryptValue(password, encryptedValue);\n const meta = {};\n merge(meta, cookieRow.meta ?? {});\n return {\n domain: cookieRow.domain,\n name: cookieRow.name,\n value: decryptedValue,\n meta: meta\n };\n });\n const results: ExportedCookie[] = (await Promise.all(decrypted)).filter(isExportedCookie);\n if (env.VERBOSE) {\n console.log(\"results\", results);\n }\n return results;\n}\n\nconst chromeLocal = path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Google\",\n \"Chrome\"\n);\n\nasync function getEncryptedChromeCookie(\n {\n name,\n domain,\n file = path.join(chromeLocal, \"Default\", \"Cookies\")\n //\n }: {\n name: string;\n domain: string;\n file: string;\n }): Promise<CookieRow[]> {\n if (!existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n const s = file.split(\"/\").slice(-3).join(\"/\");\n console.log(`Trying Chrome (at ${s}) cookie ${name} for domain ${domain}`);\n }\n let sql;\n sql = `SELECT encrypted_value, name, host_key FROM cookies`;\n const wildcardRegexp = /^([*%])$/i;\n const specifiedName = name.match(wildcardRegexp) == null;\n const specifiedDomain = domain.match(wildcardRegexp) == null;\n if (specifiedName || specifiedDomain) {\n sql += ` WHERE `;\n if (specifiedName) {\n sql += `name = '${name}'`;\n if (specifiedDomain) {\n sql += ` AND `;\n }\n }\n if (specifiedDomain) {\n sql += `host_key LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql);\n}\n\nasync function getChromePassword(): Promise<string> {\n return execSimple(\n \"security find-generic-password -w -s \\\"Chrome Safe Storage\\\"\"\n );\n}\n\nasync function decrypt(password: crypto.BinaryLike, encryptedData: Buffer): Promise<string> {\n if (typeof password !== \"string\") {\n throw new Error(\"password must be a string: \" + password);\n }\n let encryptedData1: any;\n encryptedData1 = encryptedData;\n if (encryptedData1 == null || typeof encryptedData1 !== \"object\") {\n throw new Error(\"encryptedData must be a object: \" + encryptedData1);\n }\n if (!(encryptedData1 instanceof Buffer)) {\n if (Array.isArray(encryptedData1) && encryptedData1[0] instanceof Buffer) {\n [encryptedData1] = encryptedData1;\n if (env.VERBOSE) {\n console.log(\n `encryptedData is an array of buffers, selected first: ${encryptedData1}`\n );\n }\n } else {\n throw new Error(\"encryptedData must be a Buffer: \" + encryptedData1);\n }\n encryptedData1 = Buffer.from(encryptedData1);\n }\n if (env.VERBOSE) {\n console.log(`Trying to decrypt with password ${password}`);\n }\n return new Promise((resolve, reject) => {\n crypto.pbkdf2(password,\n \"saltysalt\",\n 1003,\n 16,\n \"sha1\",\n (error, buffer) => {\n try {\n if (error) {\n if (env.VERBOSE) {\n console.log(\"Error doing pbkdf2\", error);\n }\n reject(error);\n return;\n }\n\n if (buffer.length !== 16) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, buffer length is not 16\",\n buffer.length\n );\n }\n reject(new Error(\"Buffer length is not 16\"));\n return;\n }\n\n const str = new Array(17).join(\" \");\n const iv = Buffer.from(str, \"binary\");\n const decipher = crypto.createDecipheriv(\"aes-128-cbc\", buffer, iv);\n decipher.setAutoPadding(false);\n\n if (encryptedData1 && encryptedData1.slice) {\n encryptedData1 = encryptedData1.slice(3);\n }\n\n if (encryptedData1.length % 16 !== 0) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, encryptedData length is not a multiple of 16\",\n encryptedData1.length\n );\n }\n reject(new Error(\"encryptedData length is not a multiple of 16\"));\n return;\n }\n\n let decoded = decipher.update(encryptedData1);\n try {\n decipher.final(\"utf-8\");\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error doing decipher.final()\", e);\n }\n reject(e);\n return;\n }\n\n const padding = decoded[decoded.length - 1];\n if (padding) {\n decoded = decoded.slice(0, 0 - padding);\n }\n // noinspection JSCheckFunctionSignatures\n const decodedString = decoded.toString(\"utf8\");\n resolve(decodedString);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { toStringOrNull } from \"../utils\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as path from \"path\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class FirefoxCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.CHROME_ONLY) {\n return [];\n }\n const cookies = await this.#getFirefoxCookie({ name, domain });\n return Array.isArray(cookies) ? cookies.map(toStringOrNull) : [];\n }\n\n /**\n *\n * @param name\n * @param domain\n * @returns {Promise<Buffer>}\n */\n async #getFirefoxCookie(\n //\n {\n name,\n domain\n }: {\n name: string,\n domain: string\n //\n }\n //\n ) {\n const files: string[] = await findAllFiles({\n path: path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Firefox\",\n \"Profiles\"\n ),\n name: \"cookies.sqlite\"\n });\n const all = await Promise.all(\n files.map((file) => {\n return this.#queryCookiesDb(file, name, domain);\n })\n );\n return all.flat();\n }\n\n #queryCookiesDb(file: string, name: string, domain: string) {\n if (file && !existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n console.log(`Trying Firefox cookie ${name} for domain ${domain}`);\n }\n let sql;\n //language=SQL\n sql = \"SELECT value FROM moz_cookies\";\n if (typeof name === \"string\" || typeof domain === \"string\") {\n sql += ` WHERE `;\n if (typeof name === \"string\") {\n sql += `name = '${name}'`;\n if (typeof domain === \"string\") {\n sql += ` AND `;\n }\n }\n if (typeof domain === \"string\") {\n sql += `host LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql)\n .then((rows) => {\n return rows.map((row) => {\n return {\n domain: row.domain,\n name: row.name,\n value: row.value.toString(\"utf8\")\n };\n });\n })\n .catch(() => []);\n }\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class SafariCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n return [];\n }\n}\n","import ChromeCookieQueryStrategy from \"./ChromeCookieQueryStrategy\";\nimport FirefoxCookieQueryStrategy from \"./FirefoxCookieQueryStrategy\";\nimport SafariCookieQueryStrategy from \"./SafariCookieQueryStrategy\";\nimport CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class CompositeCookieQueryStrategy implements CookieQueryStrategy {\n #strategies;\n\n constructor() {\n this.#strategies = [\n ChromeCookieQueryStrategy,\n FirefoxCookieQueryStrategy,\n SafariCookieQueryStrategy,\n ].map((strategy) => {\n return new strategy();\n });\n }\n\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n const results = await Promise.all(\n this.#strategies.map(async (strategy) => {\n // @ts-ignore\n const cookies: Promise<ExportedCookie[]> = strategy.queryCookies(name, domain);\n return cookies.catch(() => []);\n })\n );\n return results.flat();\n }\n}\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { env } from \"./global\";\n\nexport default function isValidJwt(token: any) {\n try {\n const result = jsonwebtoken.decode(token, { complete: true });\n if (env.VERBOSE) {\n console.log(result);\n }\n return true;\n } catch (err) {\n return false;\n }\n}\n","export const argv = process.argv ?? [];\n","import * as tty from \"tty\"\n\nconst {\n env = {},\n argv = [],\n platform = \"\",\n} = typeof process === \"undefined\" ? {} : process\n\nconst isDisabled = \"NO_COLOR\" in env || argv.includes(\"--no-color\")\nconst isForced = \"FORCE_COLOR\" in env || argv.includes(\"--color\")\nconst isWindows = platform === \"win32\"\nconst isDumbTerminal = env.TERM === \"dumb\"\n\nconst isCompatibleTerminal =\n tty && tty.isatty && tty.isatty(1) && env.TERM && !isDumbTerminal\n\nconst isCI =\n \"CI\" in env &&\n (\"GITHUB_ACTIONS\" in env || \"GITLAB_CI\" in env || \"CIRCLECI\" in env)\n\nexport const isColorSupported =\n !isDisabled &&\n (isForced || (isWindows && !isDumbTerminal) || isCompatibleTerminal || isCI)\n\nconst replaceClose = (\n index,\n string,\n close,\n replace,\n head = string.substring(0, index) + replace,\n tail = string.substring(index + close.length),\n next = tail.indexOf(close)\n) => head + (next < 0 ? tail : replaceClose(next, tail, close, replace))\n\nconst clearBleed = (index, string, open, close, replace) =>\n index < 0\n ? open + string + close\n : open + replaceClose(index, string, close, replace) + close\n\nconst filterEmpty =\n (open, close, replace = open, at = open.length + 1) =>\n (string) =>\n string || !(string === \"\" || string === undefined)\n ? clearBleed(\n (\"\" + string).indexOf(close, at),\n string,\n open,\n close,\n replace\n )\n : \"\"\n\nconst init = (open, close, replace) =>\n filterEmpty(`\\x1b[${open}m`, `\\x1b[${close}m`, replace)\n\nconst colors = {\n reset: init(0, 0),\n bold: init(1, 22, \"\\x1b[22m\\x1b[1m\"),\n dim: init(2, 22, \"\\x1b[22m\\x1b[2m\"),\n italic: init(3, 23),\n underline: init(4, 24),\n inverse: init(7, 27),\n hidden: init(8, 28),\n strikethrough: init(9, 29),\n black: init(30, 39),\n red: init(31, 39),\n green: init(32, 39),\n yellow: init(33, 39),\n blue: init(34, 39),\n magenta: init(35, 39),\n cyan: init(36, 39),\n white: init(37, 39),\n gray: init(90, 39),\n bgBlack: init(40, 49),\n bgRed: init(41, 49),\n bgGreen: init(42, 49),\n bgYellow: init(43, 49),\n bgBlue: init(44, 49),\n bgMagenta: init(45, 49),\n bgCyan: init(46, 49),\n bgWhite: init(47, 49),\n blackBright: init(90, 39),\n redBright: init(91, 39),\n greenBright: init(92, 39),\n yellowBright: init(93, 39),\n blueBright: init(94, 39),\n magentaBright: init(95, 39),\n cyanBright: init(96, 39),\n whiteBright: init(97, 39),\n bgBlackBright: init(100, 49),\n bgRedBright: init(101, 49),\n bgGreenBright: init(102, 49),\n bgYellowBright: init(103, 49),\n bgBlueBright: init(104, 49),\n bgMagentaBright: init(105, 49),\n bgCyanBright: init(106, 49),\n bgWhiteBright: init(107, 49),\n}\n\nexport const createColors = ({ useColor = isColorSupported } = {}) =>\n useColor\n ? colors\n : Object.keys(colors).reduce(\n (colors, key) => ({ ...colors, [key]: String }),\n {}\n )\n\nexport const {\n reset,\n bold,\n dim,\n italic,\n underline,\n inverse,\n hidden,\n strikethrough,\n black,\n red,\n green,\n yellow,\n blue,\n magenta,\n cyan,\n white,\n gray,\n bgBlack,\n bgRed,\n bgGreen,\n bgYellow,\n bgBlue,\n bgMagenta,\n bgCyan,\n bgWhite,\n blackBright,\n redBright,\n greenBright,\n yellowBright,\n blueBright,\n magentaBright,\n cyanBright,\n whiteBright,\n bgBlackBright,\n bgRedBright,\n bgGreenBright,\n bgYellowBright,\n bgBlueBright,\n bgMagentaBright,\n bgCyanBright,\n bgWhiteBright,\n} = createColors()\n","import ExportedCookie from \"./ExportedCookie\";\nimport { uniqBy } from \"lodash\";\n\nexport function resultsRendered(results: ExportedCookie[]) {\n return uniqBy(results, (r) => r.name)\n .map((r) => r.name + \"=\" + r.value)\n .join(\"; \");\n}\n","#!/usr/bin/env node\n\nimport { env } from \"./global\";\nimport { queryCookies } from \"./queryCookies\";\nimport { argv } from \"./argv\";\nimport { groupBy } from \"lodash\";\nimport { blue, green } from \"colorette\";\nimport ExportedCookie from \"./ExportedCookie\";\nimport { resultsRendered } from \"./resultsRendered\";\n\nfunction combinedString(results: ExportedCookie[]) {\n return blue(resultsRendered(results));\n}\n\nasync function cliQueryCookies(name: string, domain: string) {\n try {\n const results = await queryCookies({ name, domain });\n if (results.length > 0) {\n if (argv.includes(\"--combined-string\")) {\n console.log(combinedString(results));\n } else if (argv.includes(\"--dump\")) {\n console.log(results);\n } else if (argv.includes(\"--dump-grouped\")) {\n const groupedByFile = groupBy(results, (r) => r.meta?.file);\n console.log(green(JSON.stringify(groupedByFile, null, 2)));\n } else if (argv.includes(\"--combined-string-grouped\")) {\n const groupedByFile = groupBy(results, (r) => r.meta?.file);\n for (const file of Object.keys(groupedByFile)) {\n let results = groupedByFile[file];\n console.log(green(file) + \": \", combinedString(results));\n }\n } else {\n for (const result of results) {\n console.log(result.value);\n }\n }\n } else {\n console.error(\"No results\");\n }\n } catch (e) {\n console.error(e);\n }\n}\n\nif (argv && argv.length > 2) {\n const name = argv[2];\n\n let domain;\n if (argv[3] != null && argv[3].indexOf(\".\") > -1) {\n domain = argv[3];\n } else {\n domain = \"%\";\n }\n\n const tru = `${true}`;\n\n if (argv.includes(\"--require-jwt\")) {\n env.REQUIRE_JWT = tru;\n }\n if (argv.includes(\"--verbose\")) {\n env.VERBOSE = tru;\n }\n if (argv.includes(\"--chrome-only\")) {\n env.CHROME_ONLY = tru;\n }\n if (argv.includes(\"--firefox-only\")) {\n env.FIREFOX_ONLY = tru;\n }\n if (argv.includes(\"--ignore-expired\")) {\n env.IGNORE_EXPIRED = tru;\n }\n\n if (argv.includes(\"--single\")) {\n env.SINGLE = tru;\n }\n\n if (env.VERBOSE) {\n console.log(\"Verbose mode\", argv);\n }\n\n cliQueryCookies(name, domain).catch(console.error);\n}\n","import { env } from \"./global\";\nimport { uniqBy } from \"lodash\";\nimport CompositeCookieQueryStrategy from \"./browsers/CompositeCookieQueryStrategy\";\nimport CookieQueryStrategy from \"./browsers/CookieQueryStrategy\";\nimport isValidJwt from \"./isValidJwt\";\nimport ExportedCookie from \"./ExportedCookie\";\n\nexport async function queryCookies(\n {\n name,\n domain\n }: {\n name: string;\n domain: string;\n },\n strategy: CookieQueryStrategy = new CompositeCookieQueryStrategy()\n) {\n const results: ExportedCookie[] = await strategy.queryCookies(name, domain);\n const results1: ExportedCookie[] = uniqBy(results, JSON.stringify);\n const jwtCookies = [];\n for (const result of results1) {\n const value = result.value;\n if (isValidJwt(value)) {\n jwtCookies.push(result);\n }\n }\n const resultsUniq = env.REQUIRE_JWT ? jwtCookies : results1;\n return env.SINGLE ? [resultsUniq[0]] : resultsUniq;\n}\n"],"names":["$3GcJY$lodash","merge","$46d5f952bbf1ad16$export$a7b6bc01c63cdfc3","$46d5f952bbf1ad16$require$merge","process","env","$46d5f952bbf1ad16$export$a7c5707626fc90f","Error","async","$08b2542d46c201fb$export$8d71c74f97c0202e","command","VERBOSE","console","log","Promise","resolve","reject","$3GcJY$child_process","exec","encoding","maxBuffer","error","stdout","stderr","trim","$08b2542d46c201fb$export$d53bf2de587a369","result","length","slice","toString","$50e620a43f85291a$export$2c9faf86071156ae","path","name","maxDepth","rootSegments","split","files","readdirSync","$3GcJY$fs","e","file","filePath","stat","statSync","e1","isDirectory","subFiles","push","e2","$f5dd4d62c4c3f3b4$export$f19f611d1fa7c6f3","sql","existsSync","db","$3GcJY$sqlite3","Database","all","err","rows","rows1","Array","isArray","cookieRows","map","row","domain","value","meta","JSON","stringify","$f10944b6cece07ca$export$bc926c43858bd3cb","obj","undefined","$7ce825379b0eda98$export$963c8d651337e4a4","$d96ea452b1675522$export$2e2bcd8739ae039","platform","FIREFOX_ONLY","requireJwt","encryptedDataItems","promises","$d96ea452b1675522$var$chromeLocal","$3GcJY$path","join","s","wildcardRegexp","specifiedName","match","specifiedDomain","$d96ea452b1675522$var$getEncryptedChromeCookie","$d96ea452b1675522$var$getPromise1","flat","filter","$d96ea452b1675522$var$getPromise","password","$d96ea452b1675522$var$getChromePassword","decrypted","cookieRow","encryptedValue","decryptedValue","d","encryptedData","encryptedData1","Buffer","from","$3GcJY$crypto","pbkdf2","buffer","str","iv","decipher","createDecipheriv","setAutoPadding","decoded","update","final","padding","decodedString","$d96ea452b1675522$var$decrypt","$d96ea452b1675522$var$decryptValue","results","$d96ea452b1675522$var$getChromeCookies","$009bb4f99042a7e5$export$2e2bcd8739ae039","CHROME_ONLY","cookies","this","getFirefoxCookie","queryCookiesDb","name1","domain1","then","catch","$1f4fc383cc585db2$export$2e2bcd8739ae039","$47b6161e24f245f2$export$2e2bcd8739ae039","strategies","constructor","strategy","queryCookies","$fde20152a1eed49d$export$2e2bcd8739ae039","token","$3GcJY$jsonwebtoken","decode","complete","$79b52b72feab5f10$export$6f4ae1207c703045","argv","$46332c16e7a967a5$var$env","$46332c16e7a967a5$var$argv","$46332c16e7a967a5$var$platform","$46332c16e7a967a5$var$isDisabled","includes","$46332c16e7a967a5$var$isForced","$46332c16e7a967a5$var$isWindows","$46332c16e7a967a5$var$isDumbTerminal","TERM","$46332c16e7a967a5$var$isCompatibleTerminal","$3GcJY$tty","isatty","$46332c16e7a967a5$export$ba7eaac21c385de8","$46332c16e7a967a5$var$replaceClose","index","string","close","replace","head","substring","tail","next","indexOf","$46332c16e7a967a5$var$filterEmpty","open","at","$46332c16e7a967a5$var$clearBleed","$46332c16e7a967a5$var$init","$46332c16e7a967a5$var$colors","reset","bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgBlackBright","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","$46332c16e7a967a5$export$aad8462122ac592b","$46332c16e7a967a5$export$73ba5813cda80a49","$46332c16e7a967a5$export$c96e90b4bcb7d4ca","$46332c16e7a967a5$export$5540da1282cbf565","$46332c16e7a967a5$export$425327af25286e5e","$46332c16e7a967a5$export$70ae2c07e401031b","$46332c16e7a967a5$export$73920f18ca706874","$46332c16e7a967a5$export$19426ff118fe8be","$46332c16e7a967a5$export$c073df10e766abfa","$46332c16e7a967a5$export$a90204d1394caf30","$46332c16e7a967a5$export$955a2ebd2fb142ae","$46332c16e7a967a5$export$594c5a8758200c32","$46332c16e7a967a5$export$2aa0182783e7e9de","$46332c16e7a967a5$export$2a9ca2e383622e18","$46332c16e7a967a5$export$7474046f446842ee","$46332c16e7a967a5$export$8fa4e5556fd77a60","$46332c16e7a967a5$export$3e2c219d3ab79d01","$46332c16e7a967a5$export$a91ca5b79f5fb26c","$46332c16e7a967a5$export$74a89e4512e7c91","$46332c16e7a967a5$export$8137d14243d019b3","$46332c16e7a967a5$export$3d3dcf8beff00fe1","$46332c16e7a967a5$export$ec69fb4048854b4","$46332c16e7a967a5$export$76507b7995de3038","$46332c16e7a967a5$export$1b1236a85ae1b824","$46332c16e7a967a5$export$2fbae6ef3123e0b0","$46332c16e7a967a5$export$c442bbc3ef058f3e","$46332c16e7a967a5$export$6f940151fac4d6e4","$46332c16e7a967a5$export$9e103086f7204459","$46332c16e7a967a5$export$106f17ac3545b17c","$46332c16e7a967a5$export$7aa4c9ef25eb1086","$46332c16e7a967a5$export$76b6abffe88e3179","$46332c16e7a967a5$export$c609d1d25ac1cc71","$46332c16e7a967a5$export$38b81c3a7de495d7","$46332c16e7a967a5$export$5c9c56f63b47e15b","$46332c16e7a967a5$export$26735259ab854b4f","$46332c16e7a967a5$export$d5483c19744b2fc2","$46332c16e7a967a5$export$f8c17ad4aac14a99","$46332c16e7a967a5$export$6038eb5fdc315c12","$46332c16e7a967a5$export$41148066f4812842","$46332c16e7a967a5$export$eb0dc7973d30eea7","$46332c16e7a967a5$export$fde769fa8262c0d6","useColor","Object","keys","reduce","colors","key","String","$46332c16e7a967a5$export$fc3cc093e161d064","$8c51a9568358068a$export$9abc0a414b0d8b8f","uniqBy","r","$2a211dfb3a4f388f$var$combinedString","tru","REQUIRE_JWT","IGNORE_EXPIRED","SINGLE","results1","jwtCookies","resultsUniq","groupedByFile","groupBy","groupedByFile1","$2a211dfb3a4f388f$var$cliQueryCookies"],"version":3,"file":"cli.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/global.ts","src/utils.ts","src/findAllFiles.ts","src/doSqliteQuery1.ts","src/IsCookieRow.ts","src/IsExportedCookie.ts","src/browsers/ChromeCookieQueryStrategy.ts","src/browsers/FirefoxCookieQueryStrategy.ts","src/browsers/SafariCookieQueryStrategy.ts","src/browsers/CompositeCookieQueryStrategy.ts","src/isValidJwt.ts","src/argv.ts","node_modules/colorette/index.js","src/resultsRendered.ts","src/cli.ts","src/queryCookies.ts"],"sourcesContent":["const { merge } = require(\"lodash\");\nexport const env: any = {};\nmerge(env, process.env);\nexport const HOME: string = env[\"HOME\"];\nif (!HOME) {\n throw new Error(\"HOME environment variable is not set\");\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport {exec, ExecException} from \"child_process\";\n\nexport async function execSimple(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n exec(\n command,\n { encoding: \"binary\", maxBuffer: 5 * 1024 },\n (error: ExecException | null, stdout: string, stderr: string) => {\n if (error) {\n reject(error);\n return;\n }\n if (stderr) {\n reject(error);\n return;\n }\n if (stdout) {\n resolve(stdout.trim());\n }\n }\n );\n });\n}\n\n/**\n *\n * @param result\n * @returns {string|null}\n */\nexport function toStringOrNull(result: any) {\n if (result == null) {\n return null;\n }\n if (process.env.VERBOSE) {\n console.log(\"result\", result);\n }\n if (typeof result === \"string\" && result.length > 0) {\n return result;\n }\n if (result.slice && result.toString) {\n // noinspection JSCheckFunctionSignatures\n return result.toString(\"utf8\");\n }\n return null;\n}\n\nexport function invalidString(input: any): boolean {\n return typeof input !== \"string\" || input.length === 0;\n}\n\n\nexport function validString(input: any): input is string {\n return typeof input == \"string\" && input.length > 0;\n}\n","import { env } from \"./global\";\nimport * as fs from \"fs\";\n\nexport async function findAllFiles(\n {\n path,\n name,\n maxDepth = 2\n//\n }: {\n path: string;\n name: string;\n maxDepth?: number;\n }\n): Promise<string[]> {\n const rootSegments = path.split(\"/\").length;\n\n if (env.VERBOSE) {\n console.log(`Searching for ${name} in ${path}`);\n }\n const files: string[] = [];\n let readdirSync;\n try {\n readdirSync = fs.readdirSync(path);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(`Error reading ${path}`, e);\n }\n return [];\n }\n for (const file of readdirSync) {\n const filePath = path + \"/\" + file;\n let stat;\n try {\n stat = fs.statSync(filePath);\n } catch (e) {\n if (env.VERBOSE) {\n console.error(`Error getting stat for ${filePath}`, e);\n }\n continue;\n }\n if (stat.isDirectory()) {\n if (filePath.split(\"/\").length < rootSegments + maxDepth) {\n try {\n const subFiles = await findAllFiles({\n path: filePath,\n name: name,\n maxDepth: 2\n });\n files.push(...subFiles);\n } catch (e) {\n if (env.VERBOSE) {\n console.error(e);\n }\n }\n }\n } else if (file === name) {\n files.push(filePath);\n }\n }\n if (env.VERBOSE) {\n if (files.length > 0) {\n console.log(`Found ${files.length} ${name} files`);\n console.log(files);\n }\n }\n return files;\n}\n","import * as fs from \"fs\";\nimport * as sqlite3 from \"sqlite3\";\nimport CookieRow from \"./CookieRow\";\n\nexport async function doSqliteQuery1(file: string, sql: string): Promise<CookieRow[]> {\n if (!fs.existsSync(file)) {\n throw new Error(`doSqliteQuery1: file ${file} does not exist`);\n }\n const db = new sqlite3.Database(file);\n return new Promise((resolve, reject) => {\n db.all(sql, (err: Error, rows: any[]) => {\n if (err) {\n reject(err);\n return;\n }\n const rows1: any[] = rows;\n if (rows1 == null || rows1.length === 0) {\n resolve([]);\n return;\n }\n if (Array.isArray(rows1)) {\n const cookieRows: CookieRow[] = rows1.map((row) => {\n return {\n domain: row[\"host_key\"],\n name: row[\"name\"],\n value: row[\"encrypted_value\"],\n meta: {\n file: file\n }\n };\n });\n resolve(cookieRows);\n return;\n }\n if (process.env.VERBOSE) {\n console.log(`doSqliteQuery1: rows ${JSON.stringify(rows1)}`);\n }\n resolve([rows1]);\n });\n });\n}\n","import CookieRow from \"./CookieRow\";\n\nexport function isCookieRow(obj: any): obj is CookieRow {\n return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;\n}\n","import ExportedCookie from \"./ExportedCookie\";\n\nexport function isExportedCookie(obj: any): obj is ExportedCookie {\n return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport { execSimple } from \"../utils\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as crypto from \"crypto\";\nimport * as path from \"path\";\nimport CookieRow from \"../CookieRow\";\nimport ExportedCookie from \"../ExportedCookie\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport { merge } from \"lodash\";\nimport { isCookieRow } from \"../IsCookieRow\";\nimport { isExportedCookie } from \"../IsExportedCookie\";\n\nexport default class ChromeCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.FIREFOX_ONLY) {\n return [];\n }\n return getChromeCookies({\n requireJwt: false,\n name,\n domain\n });\n }\n}\n\nasync function getPromise1(name: string, domain: string, file: string): Promise<CookieRow[]> {\n try {\n return await getEncryptedChromeCookie({\n name: name,\n domain: domain,\n file: file\n });\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error getting encrypted cookie\", e);\n }\n return [];\n }\n}\n\nasync function getPromise(name: string, domain: string): Promise<CookieRow[]> {\n try {\n const files: string[] = await findAllFiles({\n path: chromeLocal,\n name: \"Cookies\"\n });\n const promises: Promise<CookieRow[]>[] = files.map((file) => getPromise1(name, domain, file));\n const results1: Awaited<CookieRow[]>[] = await Promise.all(promises);\n return results1.flat().filter(isCookieRow);\n } catch (error) {\n if (env.VERBOSE) {\n console.log(\"error\", error);\n }\n return [];\n }\n}\n\nasync function decryptValue(password: string, encryptedValue: Buffer) {\n let d: string | null;\n try {\n d = await decrypt(password, encryptedValue);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error decrypting cookie\", e);\n }\n d = null;\n }\n return d ?? encryptedValue.toString(\"utf-8\");\n}\n\nasync function getChromeCookies(\n {\n name,\n domain = \"%\",\n requireJwt = false\n }: {\n name: string;\n domain: string;\n requireJwt: boolean | undefined;\n //\n }\n //\n): Promise<ExportedCookie[]> {\n const encryptedDataItems: CookieRow[] = await getPromise(name, domain);\n const password: string = await getChromePassword();\n const decrypted: Promise<ExportedCookie | null>[] = encryptedDataItems\n .filter(({ value }) => value != null && value.length > 0)\n .map(async (cookieRow: CookieRow) => {\n const encryptedValue: Buffer = cookieRow.value;\n const decryptedValue = await decryptValue(password, encryptedValue);\n const meta = {};\n merge(meta, cookieRow.meta ?? {});\n return {\n domain: cookieRow.domain,\n name: cookieRow.name,\n value: decryptedValue,\n meta: meta\n };\n });\n const results: ExportedCookie[] = (await Promise.all(decrypted)).filter(isExportedCookie);\n if (env.VERBOSE) {\n console.log(\"results\", results);\n }\n return results;\n}\n\nconst chromeLocal = path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Google\",\n \"Chrome\"\n);\n\nasync function getEncryptedChromeCookie(\n {\n name,\n domain,\n file = path.join(chromeLocal, \"Default\", \"Cookies\")\n //\n }: {\n name: string;\n domain: string;\n file: string;\n }): Promise<CookieRow[]> {\n if (!existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n const s = file.split(\"/\").slice(-3).join(\"/\");\n console.log(`Trying Chrome (at ${s}) cookie ${name} for domain ${domain}`);\n }\n let sql;\n sql = `SELECT encrypted_value, name, host_key FROM cookies`;\n const wildcardRegexp = /^([*%])$/i;\n const specifiedName = name.match(wildcardRegexp) == null;\n const specifiedDomain = domain.match(wildcardRegexp) == null;\n if (specifiedName || specifiedDomain) {\n sql += ` WHERE `;\n if (specifiedName) {\n sql += `name = '${name}'`;\n if (specifiedDomain) {\n sql += ` AND `;\n }\n }\n if (specifiedDomain) {\n sql += `host_key LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql);\n}\n\nasync function getChromePassword(): Promise<string> {\n return execSimple(\n \"security find-generic-password -w -s \\\"Chrome Safe Storage\\\"\"\n );\n}\n\nasync function decrypt(password: crypto.BinaryLike, encryptedData: Buffer): Promise<string> {\n if (typeof password !== \"string\") {\n throw new Error(\"password must be a string: \" + password);\n }\n let encryptedData1: any;\n encryptedData1 = encryptedData;\n if (encryptedData1 == null || typeof encryptedData1 !== \"object\") {\n throw new Error(\"encryptedData must be a object: \" + encryptedData1);\n }\n if (!(encryptedData1 instanceof Buffer)) {\n if (Array.isArray(encryptedData1) && encryptedData1[0] instanceof Buffer) {\n [encryptedData1] = encryptedData1;\n if (env.VERBOSE) {\n console.log(\n `encryptedData is an array of buffers, selected first: ${encryptedData1}`\n );\n }\n } else {\n throw new Error(\"encryptedData must be a Buffer: \" + encryptedData1);\n }\n encryptedData1 = Buffer.from(encryptedData1);\n }\n if (env.VERBOSE) {\n console.log(`Trying to decrypt with password ${password}`);\n }\n return new Promise((resolve, reject) => {\n crypto.pbkdf2(password,\n \"saltysalt\",\n 1003,\n 16,\n \"sha1\",\n (error, buffer) => {\n try {\n if (error) {\n if (env.VERBOSE) {\n console.log(\"Error doing pbkdf2\", error);\n }\n reject(error);\n return;\n }\n\n if (buffer.length !== 16) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, buffer length is not 16\",\n buffer.length\n );\n }\n reject(new Error(\"Buffer length is not 16\"));\n return;\n }\n\n const str = new Array(17).join(\" \");\n const iv = Buffer.from(str, \"binary\");\n const decipher = crypto.createDecipheriv(\"aes-128-cbc\", buffer, iv);\n decipher.setAutoPadding(false);\n\n if (encryptedData1 && encryptedData1.slice) {\n encryptedData1 = encryptedData1.slice(3);\n }\n\n if (encryptedData1.length % 16 !== 0) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, encryptedData length is not a multiple of 16\",\n encryptedData1.length\n );\n }\n reject(new Error(\"encryptedData length is not a multiple of 16\"));\n return;\n }\n\n let decoded = decipher.update(encryptedData1);\n try {\n decipher.final(\"utf-8\");\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error doing decipher.final()\", e);\n }\n reject(e);\n return;\n }\n\n const padding = decoded[decoded.length - 1];\n if (padding) {\n decoded = decoded.slice(0, 0 - padding);\n }\n // noinspection JSCheckFunctionSignatures\n const decodedString = decoded.toString(\"utf8\");\n resolve(decodedString);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { toStringOrNull } from \"../utils\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as path from \"path\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class FirefoxCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.CHROME_ONLY) {\n return [];\n }\n const cookies = await this.#getFirefoxCookie({ name, domain });\n return Array.isArray(cookies) ? cookies.map(toStringOrNull) : [];\n }\n\n /**\n *\n * @param name\n * @param domain\n * @returns {Promise<Buffer>}\n */\n async #getFirefoxCookie(\n //\n {\n name,\n domain\n }: {\n name: string,\n domain: string\n //\n }\n //\n ) {\n const files: string[] = await findAllFiles({\n path: path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Firefox\",\n \"Profiles\"\n ),\n name: \"cookies.sqlite\"\n });\n const all = await Promise.all(\n files.map((file) => {\n return this.#queryCookiesDb(file, name, domain);\n })\n );\n return all.flat();\n }\n\n #queryCookiesDb(file: string, name: string, domain: string) {\n if (file && !existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n console.log(`Trying Firefox cookie ${name} for domain ${domain}`);\n }\n let sql;\n //language=SQL\n sql = \"SELECT value FROM moz_cookies\";\n if (typeof name === \"string\" || typeof domain === \"string\") {\n sql += ` WHERE `;\n if (typeof name === \"string\") {\n sql += `name = '${name}'`;\n if (typeof domain === \"string\") {\n sql += ` AND `;\n }\n }\n if (typeof domain === \"string\") {\n sql += `host LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql)\n .then((rows) => {\n return rows.map((row) => {\n return {\n domain: row.domain,\n name: row.name,\n value: row.value.toString(\"utf8\")\n };\n });\n })\n .catch(() => []);\n }\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class SafariCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n return [];\n }\n}\n","import ChromeCookieQueryStrategy from \"./ChromeCookieQueryStrategy\";\nimport FirefoxCookieQueryStrategy from \"./FirefoxCookieQueryStrategy\";\nimport SafariCookieQueryStrategy from \"./SafariCookieQueryStrategy\";\nimport CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport ExportedCookie from \"../ExportedCookie\";\n\nexport default class CompositeCookieQueryStrategy implements CookieQueryStrategy {\n #strategies;\n\n constructor() {\n this.#strategies = [\n ChromeCookieQueryStrategy,\n FirefoxCookieQueryStrategy,\n SafariCookieQueryStrategy,\n ].map((strategy) => {\n return new strategy();\n });\n }\n\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n const results = await Promise.all(\n this.#strategies.map(async (strategy) => {\n // @ts-ignore\n const cookies: Promise<ExportedCookie[]> = strategy.queryCookies(name, domain);\n return cookies.catch(() => []);\n })\n );\n return results.flat();\n }\n}\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { env } from \"./global\";\n\nexport default function isValidJwt(token: any) {\n try {\n const result = jsonwebtoken.decode(token, { complete: true });\n if (env.VERBOSE) {\n console.log(result);\n }\n return true;\n } catch (err) {\n return false;\n }\n}\n","export const argv = process.argv ?? [];\n","import * as tty from \"tty\"\n\nconst {\n env = {},\n argv = [],\n platform = \"\",\n} = typeof process === \"undefined\" ? {} : process\n\nconst isDisabled = \"NO_COLOR\" in env || argv.includes(\"--no-color\")\nconst isForced = \"FORCE_COLOR\" in env || argv.includes(\"--color\")\nconst isWindows = platform === \"win32\"\nconst isDumbTerminal = env.TERM === \"dumb\"\n\nconst isCompatibleTerminal =\n tty && tty.isatty && tty.isatty(1) && env.TERM && !isDumbTerminal\n\nconst isCI =\n \"CI\" in env &&\n (\"GITHUB_ACTIONS\" in env || \"GITLAB_CI\" in env || \"CIRCLECI\" in env)\n\nexport const isColorSupported =\n !isDisabled &&\n (isForced || (isWindows && !isDumbTerminal) || isCompatibleTerminal || isCI)\n\nconst replaceClose = (\n index,\n string,\n close,\n replace,\n head = string.substring(0, index) + replace,\n tail = string.substring(index + close.length),\n next = tail.indexOf(close)\n) => head + (next < 0 ? tail : replaceClose(next, tail, close, replace))\n\nconst clearBleed = (index, string, open, close, replace) =>\n index < 0\n ? open + string + close\n : open + replaceClose(index, string, close, replace) + close\n\nconst filterEmpty =\n (open, close, replace = open, at = open.length + 1) =>\n (string) =>\n string || !(string === \"\" || string === undefined)\n ? clearBleed(\n (\"\" + string).indexOf(close, at),\n string,\n open,\n close,\n replace\n )\n : \"\"\n\nconst init = (open, close, replace) =>\n filterEmpty(`\\x1b[${open}m`, `\\x1b[${close}m`, replace)\n\nconst colors = {\n reset: init(0, 0),\n bold: init(1, 22, \"\\x1b[22m\\x1b[1m\"),\n dim: init(2, 22, \"\\x1b[22m\\x1b[2m\"),\n italic: init(3, 23),\n underline: init(4, 24),\n inverse: init(7, 27),\n hidden: init(8, 28),\n strikethrough: init(9, 29),\n black: init(30, 39),\n red: init(31, 39),\n green: init(32, 39),\n yellow: init(33, 39),\n blue: init(34, 39),\n magenta: init(35, 39),\n cyan: init(36, 39),\n white: init(37, 39),\n gray: init(90, 39),\n bgBlack: init(40, 49),\n bgRed: init(41, 49),\n bgGreen: init(42, 49),\n bgYellow: init(43, 49),\n bgBlue: init(44, 49),\n bgMagenta: init(45, 49),\n bgCyan: init(46, 49),\n bgWhite: init(47, 49),\n blackBright: init(90, 39),\n redBright: init(91, 39),\n greenBright: init(92, 39),\n yellowBright: init(93, 39),\n blueBright: init(94, 39),\n magentaBright: init(95, 39),\n cyanBright: init(96, 39),\n whiteBright: init(97, 39),\n bgBlackBright: init(100, 49),\n bgRedBright: init(101, 49),\n bgGreenBright: init(102, 49),\n bgYellowBright: init(103, 49),\n bgBlueBright: init(104, 49),\n bgMagentaBright: init(105, 49),\n bgCyanBright: init(106, 49),\n bgWhiteBright: init(107, 49),\n}\n\nexport const createColors = ({ useColor = isColorSupported } = {}) =>\n useColor\n ? colors\n : Object.keys(colors).reduce(\n (colors, key) => ({ ...colors, [key]: String }),\n {}\n )\n\nexport const {\n reset,\n bold,\n dim,\n italic,\n underline,\n inverse,\n hidden,\n strikethrough,\n black,\n red,\n green,\n yellow,\n blue,\n magenta,\n cyan,\n white,\n gray,\n bgBlack,\n bgRed,\n bgGreen,\n bgYellow,\n bgBlue,\n bgMagenta,\n bgCyan,\n bgWhite,\n blackBright,\n redBright,\n greenBright,\n yellowBright,\n blueBright,\n magentaBright,\n cyanBright,\n whiteBright,\n bgBlackBright,\n bgRedBright,\n bgGreenBright,\n bgYellowBright,\n bgBlueBright,\n bgMagentaBright,\n bgCyanBright,\n bgWhiteBright,\n} = createColors()\n","import ExportedCookie from \"./ExportedCookie\";\nimport { uniqBy } from \"lodash\";\n\nexport function resultsRendered(results: ExportedCookie[]) {\n return uniqBy(results, (r) => r.name)\n .map((r) => r.name + \"=\" + r.value)\n .join(\"; \");\n}\n","#!/usr/bin/env node\n\nimport { env } from \"./global\";\nimport { queryCookies } from \"./queryCookies\";\nimport { argv } from \"./argv\";\nimport { groupBy } from \"lodash\";\nimport { blue, green } from \"colorette\";\nimport ExportedCookie from \"./ExportedCookie\";\nimport { resultsRendered } from \"./resultsRendered\";\n\nfunction combinedString(results: ExportedCookie[]) {\n return blue(resultsRendered(results));\n}\n\nasync function cliQueryCookies(name: string, domain: string) {\n try {\n const results = await queryCookies({ name, domain });\n if (results.length > 0) {\n if (argv.includes(\"--combined-string\")) {\n console.log(combinedString(results));\n } else if (argv.includes(\"--dump\")) {\n console.log(results);\n } else if (argv.includes(\"--dump-grouped\")) {\n const groupedByFile = groupBy(results, (r) => r.meta?.file);\n console.log(green(JSON.stringify(groupedByFile, null, 2)));\n } else if (argv.includes(\"--combined-string-grouped\")) {\n const groupedByFile = groupBy(results, (r) => r.meta?.file);\n for (const file of Object.keys(groupedByFile)) {\n let results = groupedByFile[file];\n console.log(green(file) + \": \", combinedString(results));\n }\n } else {\n for (const result of results) {\n console.log(result.value);\n }\n }\n } else {\n console.error(\"No results\");\n }\n } catch (e) {\n console.error(e);\n }\n}\n\nif (argv && argv.length > 2) {\n const name = argv[2];\n\n let domain;\n if (argv[3] != null && argv[3].indexOf(\".\") > -1) {\n domain = argv[3];\n } else {\n domain = \"%\";\n }\n\n const tru = `${true}`;\n\n if (argv.includes(\"--require-jwt\")) {\n env.REQUIRE_JWT = tru;\n }\n if (argv.includes(\"--verbose\")) {\n env.VERBOSE = tru;\n }\n if (argv.includes(\"--chrome-only\")) {\n env.CHROME_ONLY = tru;\n }\n if (argv.includes(\"--firefox-only\")) {\n env.FIREFOX_ONLY = tru;\n }\n if (argv.includes(\"--ignore-expired\")) {\n env.IGNORE_EXPIRED = tru;\n }\n\n if (argv.includes(\"--single\")) {\n env.SINGLE = tru;\n }\n\n if (env.VERBOSE) {\n console.log(\"Verbose mode\", argv);\n }\n\n cliQueryCookies(name, domain).catch(console.error);\n}\n","import { env } from \"./global\";\nimport { uniqBy } from \"lodash\";\nimport CompositeCookieQueryStrategy from \"./browsers/CompositeCookieQueryStrategy\";\nimport CookieQueryStrategy from \"./browsers/CookieQueryStrategy\";\nimport isValidJwt from \"./isValidJwt\";\nimport ExportedCookie from \"./ExportedCookie\";\nimport CookieRequest from \"./CookieRequest\";\n\nexport async function queryCookies(\n {\n name,\n domain\n }: CookieRequest,\n strategy: CookieQueryStrategy = new CompositeCookieQueryStrategy()\n) {\n const results: ExportedCookie[] = await strategy.queryCookies(name, domain);\n const results1: ExportedCookie[] = uniqBy(results, JSON.stringify);\n const jwtCookies = [];\n for (const result of results1) {\n const value = result.value;\n if (isValidJwt(value)) {\n jwtCookies.push(result);\n }\n }\n const resultsUniq = env.REQUIRE_JWT ? jwtCookies : results1;\n return env.SINGLE ? [resultsUniq[0]] : resultsUniq;\n}\n"],"names":["$3GcJY$lodash","merge","$46d5f952bbf1ad16$export$a7b6bc01c63cdfc3","$46d5f952bbf1ad16$require$merge","process","env","$46d5f952bbf1ad16$export$a7c5707626fc90f","Error","async","$08b2542d46c201fb$export$8d71c74f97c0202e","command","Promise","resolve","reject","$3GcJY$child_process","exec","encoding","maxBuffer","error","stdout","stderr","trim","$08b2542d46c201fb$export$d53bf2de587a369","result","VERBOSE","console","log","length","slice","toString","$50e620a43f85291a$export$2c9faf86071156ae","path","name","maxDepth","rootSegments","split","files","readdirSync","$3GcJY$fs","e","file","filePath","stat","statSync","e1","isDirectory","subFiles","push","e2","$f5dd4d62c4c3f3b4$export$f19f611d1fa7c6f3","sql","existsSync","db","$3GcJY$sqlite3","Database","all","err","rows","rows1","Array","isArray","cookieRows","map","row","domain","value","meta","JSON","stringify","$f10944b6cece07ca$export$bc926c43858bd3cb","obj","undefined","$7ce825379b0eda98$export$963c8d651337e4a4","$d96ea452b1675522$export$2e2bcd8739ae039","platform","FIREFOX_ONLY","requireJwt","encryptedDataItems","promises","$d96ea452b1675522$var$chromeLocal","$3GcJY$path","join","s","wildcardRegexp","specifiedName","match","specifiedDomain","$d96ea452b1675522$var$getEncryptedChromeCookie","$d96ea452b1675522$var$getPromise1","flat","filter","$d96ea452b1675522$var$getPromise","password","$d96ea452b1675522$var$getChromePassword","decrypted","cookieRow","encryptedValue","decryptedValue","d","encryptedData","encryptedData1","Buffer","from","$3GcJY$crypto","pbkdf2","buffer","str","iv","decipher","createDecipheriv","setAutoPadding","decoded","update","final","padding","decodedString","$d96ea452b1675522$var$decrypt","$d96ea452b1675522$var$decryptValue","results","$d96ea452b1675522$var$getChromeCookies","$009bb4f99042a7e5$export$2e2bcd8739ae039","CHROME_ONLY","cookies","this","getFirefoxCookie","queryCookiesDb","name1","domain1","then","catch","$1f4fc383cc585db2$export$2e2bcd8739ae039","$47b6161e24f245f2$export$2e2bcd8739ae039","strategies","constructor","strategy","queryCookies","$fde20152a1eed49d$export$2e2bcd8739ae039","token","$3GcJY$jsonwebtoken","decode","complete","$79b52b72feab5f10$export$6f4ae1207c703045","argv","$46332c16e7a967a5$var$env","$46332c16e7a967a5$var$argv","$46332c16e7a967a5$var$platform","$46332c16e7a967a5$var$isDisabled","includes","$46332c16e7a967a5$var$isForced","$46332c16e7a967a5$var$isWindows","$46332c16e7a967a5$var$isDumbTerminal","TERM","$46332c16e7a967a5$var$isCompatibleTerminal","$3GcJY$tty","isatty","$46332c16e7a967a5$export$ba7eaac21c385de8","$46332c16e7a967a5$var$replaceClose","index","string","close","replace","head","substring","tail","next","indexOf","$46332c16e7a967a5$var$filterEmpty","open","at","$46332c16e7a967a5$var$clearBleed","$46332c16e7a967a5$var$init","$46332c16e7a967a5$var$colors","reset","bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgBlackBright","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","$46332c16e7a967a5$export$aad8462122ac592b","$46332c16e7a967a5$export$73ba5813cda80a49","$46332c16e7a967a5$export$c96e90b4bcb7d4ca","$46332c16e7a967a5$export$5540da1282cbf565","$46332c16e7a967a5$export$425327af25286e5e","$46332c16e7a967a5$export$70ae2c07e401031b","$46332c16e7a967a5$export$73920f18ca706874","$46332c16e7a967a5$export$19426ff118fe8be","$46332c16e7a967a5$export$c073df10e766abfa","$46332c16e7a967a5$export$a90204d1394caf30","$46332c16e7a967a5$export$955a2ebd2fb142ae","$46332c16e7a967a5$export$594c5a8758200c32","$46332c16e7a967a5$export$2aa0182783e7e9de","$46332c16e7a967a5$export$2a9ca2e383622e18","$46332c16e7a967a5$export$7474046f446842ee","$46332c16e7a967a5$export$8fa4e5556fd77a60","$46332c16e7a967a5$export$3e2c219d3ab79d01","$46332c16e7a967a5$export$a91ca5b79f5fb26c","$46332c16e7a967a5$export$74a89e4512e7c91","$46332c16e7a967a5$export$8137d14243d019b3","$46332c16e7a967a5$export$3d3dcf8beff00fe1","$46332c16e7a967a5$export$ec69fb4048854b4","$46332c16e7a967a5$export$76507b7995de3038","$46332c16e7a967a5$export$1b1236a85ae1b824","$46332c16e7a967a5$export$2fbae6ef3123e0b0","$46332c16e7a967a5$export$c442bbc3ef058f3e","$46332c16e7a967a5$export$6f940151fac4d6e4","$46332c16e7a967a5$export$9e103086f7204459","$46332c16e7a967a5$export$106f17ac3545b17c","$46332c16e7a967a5$export$7aa4c9ef25eb1086","$46332c16e7a967a5$export$76b6abffe88e3179","$46332c16e7a967a5$export$c609d1d25ac1cc71","$46332c16e7a967a5$export$38b81c3a7de495d7","$46332c16e7a967a5$export$5c9c56f63b47e15b","$46332c16e7a967a5$export$26735259ab854b4f","$46332c16e7a967a5$export$d5483c19744b2fc2","$46332c16e7a967a5$export$f8c17ad4aac14a99","$46332c16e7a967a5$export$6038eb5fdc315c12","$46332c16e7a967a5$export$41148066f4812842","$46332c16e7a967a5$export$eb0dc7973d30eea7","$46332c16e7a967a5$export$fde769fa8262c0d6","useColor","Object","keys","reduce","colors","key","String","$46332c16e7a967a5$export$fc3cc093e161d064","$8c51a9568358068a$export$9abc0a414b0d8b8f","uniqBy","r","$2a211dfb3a4f388f$var$combinedString","tru","REQUIRE_JWT","IGNORE_EXPIRED","SINGLE","results1","jwtCookies","resultsUniq","groupedByFile","groupBy","groupedByFile1","$2a211dfb3a4f388f$var$cliQueryCookies"],"version":3,"file":"cli.js.map","sourceRoot":"../"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":";sJAAMA,EAAAC,MACC,MAAMC,EAAW,GACxBC,EAAMD,EAAKE,QAAQC,KACZ,MAAMC,EAAeJ,EAAU,KACtC,IAAKI,EACH,MAAM,IAAIC,MAAM,wCCuGEC,EAAAC,KAClBH,EACA,UACA,sBACA,SACA","sources":["src/global.ts","src/browsers/ChromeCookieQueryStrategy.ts"],"sourcesContent":["const { merge } = require(\"lodash\");\nexport const env: any = {};\nmerge(env, process.env);\nexport const HOME: string = env[\"HOME\"];\nif (!HOME) {\n throw new Error(\"HOME environment variable is not set\");\n}\n","import AbstractCookieQueryStrategy from \"./AbstractCookieQueryStrategy\";\nimport { execSimple } from \"../utils\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as crypto from \"crypto\";\nimport * as path from \"path\";\nimport { CookieRow, ExportedCookie, isCookieRow, isExportedCookie } from \"../CookieRow\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport { merge } from \"lodash\";\n\nexport default class ChromeCookieQueryStrategy extends AbstractCookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.FIREFOX_ONLY) {\n return [];\n }\n return getChromeCookies({\n requireJwt: false,\n name,\n domain\n });\n }\n}\n\nasync function getPromise1(name: string, domain: string, file: string): Promise<CookieRow[]> {\n try {\n return await getEncryptedChromeCookie({\n name: name,\n domain: domain,\n file: file\n });\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error getting encrypted cookie\", e);\n }\n return [];\n }\n}\n\nasync function getPromise(name: string, domain: string): Promise<CookieRow[]> {\n try {\n const files: string[] = await findAllFiles({\n path: chromeLocal,\n name: \"Cookies\"\n });\n const promises: Promise<CookieRow[]>[] = files.map((file) => getPromise1(name, domain, file));\n const results1: Awaited<CookieRow[]>[] = await Promise.all(promises);\n return results1.flat().filter(isCookieRow);\n } catch (error) {\n if (env.VERBOSE) {\n console.log(\"error\", error);\n }\n return [];\n }\n}\n\nasync function decryptValue(password: string, encryptedValue: Buffer) {\n let d: string | null;\n try {\n d = await decrypt(password, encryptedValue);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error decrypting cookie\", e);\n }\n d = null;\n }\n return d ?? encryptedValue.toString(\"utf-8\");\n}\n\nasync function getChromeCookies(\n {\n name,\n domain = \"%\",\n requireJwt = false\n }: {\n name: string;\n domain: string;\n requireJwt: boolean | undefined;\n //\n }\n //\n): Promise<ExportedCookie[]> {\n const encryptedDataItems: CookieRow[] = await getPromise(name, domain);\n const password: string = await getChromePassword();\n const decrypted: Promise<ExportedCookie | null>[] = encryptedDataItems\n .filter(({ value }) => value != null && value.length > 0)\n .map(async (cookieRow: CookieRow) => {\n const encryptedValue: Buffer = cookieRow.value;\n const decryptedValue = await decryptValue(password, encryptedValue);\n const meta = {};\n merge(meta, cookieRow.meta ?? {});\n return {\n domain: cookieRow.domain,\n name: cookieRow.name,\n value: decryptedValue,\n meta: meta\n };\n });\n const results: ExportedCookie[] = (await Promise.all(decrypted)).filter(isExportedCookie);\n if (env.VERBOSE) {\n console.log(\"results\", results);\n }\n return results;\n}\n\nconst chromeLocal = path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Google\",\n \"Chrome\"\n);\n\nasync function getEncryptedChromeCookie(\n {\n name,\n domain,\n file = path.join(chromeLocal, \"Default\", \"Cookies\")\n //\n }: {\n name: string;\n domain: string;\n file: string;\n }): Promise<CookieRow[]> {\n if (!existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n const s = file.split(\"/\").slice(-3).join(\"/\");\n console.log(`Trying Chrome (at ${s}) cookie ${name} for domain ${domain}`);\n }\n let sql;\n sql = `SELECT encrypted_value, name, host_key FROM cookies`;\n const wildcardRegexp = /^([*%])$/i;\n const specifiedName = name.match(wildcardRegexp) == null;\n const specifiedDomain = domain.match(wildcardRegexp) == null;\n if (specifiedName || specifiedDomain) {\n sql += ` WHERE `;\n if (specifiedName) {\n sql += `name = '${name}'`;\n if (specifiedDomain) {\n sql += ` AND `;\n }\n }\n if (specifiedDomain) {\n sql += `host_key LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql);\n}\n\nasync function getChromePassword(): Promise<string> {\n return execSimple(\n \"security find-generic-password -w -s \\\"Chrome Safe Storage\\\"\"\n );\n}\n\nasync function decrypt(password: crypto.BinaryLike, encryptedData: Buffer): Promise<string> {\n if (typeof password !== \"string\") {\n throw new Error(\"password must be a string: \" + password);\n }\n let encryptedData1: any;\n encryptedData1 = encryptedData;\n if (encryptedData1 == null || typeof encryptedData1 !== \"object\") {\n throw new Error(\"encryptedData must be a object: \" + encryptedData1);\n }\n if (!(encryptedData1 instanceof Buffer)) {\n if (Array.isArray(encryptedData1) && encryptedData1[0] instanceof Buffer) {\n [encryptedData1] = encryptedData1;\n if (env.VERBOSE) {\n console.log(\n `encryptedData is an array of buffers, selected first: ${encryptedData1}`\n );\n }\n } else {\n throw new Error(\"encryptedData must be a Buffer: \" + encryptedData1);\n }\n encryptedData1 = Buffer.from(encryptedData1);\n }\n if (env.VERBOSE) {\n console.log(`Trying to decrypt with password ${password}`);\n }\n return new Promise((resolve, reject) => {\n crypto.pbkdf2(password,\n \"saltysalt\",\n 1003,\n 16,\n \"sha1\",\n (error, buffer) => {\n try {\n if (error) {\n if (env.VERBOSE) {\n console.log(\"Error doing pbkdf2\", error);\n }\n reject(error);\n return;\n }\n\n if (buffer.length !== 16) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, buffer length is not 16\",\n buffer.length\n );\n }\n reject(new Error(\"Buffer length is not 16\"));\n return;\n }\n\n const str = new Array(17).join(\" \");\n const iv = Buffer.from(str, \"binary\");\n const decipher = crypto.createDecipheriv(\"aes-128-cbc\", buffer, iv);\n decipher.setAutoPadding(false);\n\n if (encryptedData1 && encryptedData1.slice) {\n encryptedData1 = encryptedData1.slice(3);\n }\n\n if (encryptedData1.length % 16 !== 0) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, encryptedData length is not a multiple of 16\",\n encryptedData1.length\n );\n }\n reject(new Error(\"encryptedData length is not a multiple of 16\"));\n return;\n }\n\n let decoded = decipher.update(encryptedData1);\n try {\n decipher.final(\"utf-8\");\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error doing decipher.final()\", e);\n }\n reject(e);\n return;\n }\n\n const padding = decoded[decoded.length - 1];\n if (padding) {\n decoded = decoded.slice(0, 0 - padding);\n }\n // noinspection JSCheckFunctionSignatures\n const decodedString = decoded.toString(\"utf8\");\n resolve(decodedString);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n"],"names":["$1RAd3$lodash","merge","$d99bf10ae9ada58f$export$a7b6bc01c63cdfc3","$d99bf10ae9ada58f$require$merge","process","env","$d99bf10ae9ada58f$export$a7c5707626fc90f","Error","$1RAd3$path","join"],"version":3,"file":"index.js.map","sourceRoot":"../"}
1
+ {"mappings":";sJAAMA,EAAAC,MACC,MAAMC,EAAW,GACxBC,EAAMD,EAAKE,QAAQC,KACZ,MAAMC,EAAeJ,EAAU,KACtC,IAAKI,EACH,MAAM,IAAIC,MAAM,wCC0GEC,EAAAC,KAClBH,EACA,UACA,sBACA,SACA","sources":["src/global.ts","src/browsers/ChromeCookieQueryStrategy.ts"],"sourcesContent":["const { merge } = require(\"lodash\");\nexport const env: any = {};\nmerge(env, process.env);\nexport const HOME: string = env[\"HOME\"];\nif (!HOME) {\n throw new Error(\"HOME environment variable is not set\");\n}\n","import CookieQueryStrategy from \"./CookieQueryStrategy\";\nimport { execSimple } from \"../utils\";\nimport { env, HOME } from \"../global\";\nimport { existsSync } from \"fs\";\nimport { findAllFiles } from \"../findAllFiles\";\nimport * as crypto from \"crypto\";\nimport * as path from \"path\";\nimport CookieRow from \"../CookieRow\";\nimport ExportedCookie from \"../ExportedCookie\";\nimport { doSqliteQuery1 } from \"../doSqliteQuery1\";\nimport { merge } from \"lodash\";\nimport { isCookieRow } from \"../IsCookieRow\";\nimport { isExportedCookie } from \"../IsExportedCookie\";\n\nexport default class ChromeCookieQueryStrategy implements CookieQueryStrategy {\n async queryCookies(name: string, domain: string): Promise<ExportedCookie[]> {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This only works on macOS\");\n }\n if (env.FIREFOX_ONLY) {\n return [];\n }\n return getChromeCookies({\n requireJwt: false,\n name,\n domain\n });\n }\n}\n\nasync function getPromise1(name: string, domain: string, file: string): Promise<CookieRow[]> {\n try {\n return await getEncryptedChromeCookie({\n name: name,\n domain: domain,\n file: file\n });\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error getting encrypted cookie\", e);\n }\n return [];\n }\n}\n\nasync function getPromise(name: string, domain: string): Promise<CookieRow[]> {\n try {\n const files: string[] = await findAllFiles({\n path: chromeLocal,\n name: \"Cookies\"\n });\n const promises: Promise<CookieRow[]>[] = files.map((file) => getPromise1(name, domain, file));\n const results1: Awaited<CookieRow[]>[] = await Promise.all(promises);\n return results1.flat().filter(isCookieRow);\n } catch (error) {\n if (env.VERBOSE) {\n console.log(\"error\", error);\n }\n return [];\n }\n}\n\nasync function decryptValue(password: string, encryptedValue: Buffer) {\n let d: string | null;\n try {\n d = await decrypt(password, encryptedValue);\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error decrypting cookie\", e);\n }\n d = null;\n }\n return d ?? encryptedValue.toString(\"utf-8\");\n}\n\nasync function getChromeCookies(\n {\n name,\n domain = \"%\",\n requireJwt = false\n }: {\n name: string;\n domain: string;\n requireJwt: boolean | undefined;\n //\n }\n //\n): Promise<ExportedCookie[]> {\n const encryptedDataItems: CookieRow[] = await getPromise(name, domain);\n const password: string = await getChromePassword();\n const decrypted: Promise<ExportedCookie | null>[] = encryptedDataItems\n .filter(({ value }) => value != null && value.length > 0)\n .map(async (cookieRow: CookieRow) => {\n const encryptedValue: Buffer = cookieRow.value;\n const decryptedValue = await decryptValue(password, encryptedValue);\n const meta = {};\n merge(meta, cookieRow.meta ?? {});\n return {\n domain: cookieRow.domain,\n name: cookieRow.name,\n value: decryptedValue,\n meta: meta\n };\n });\n const results: ExportedCookie[] = (await Promise.all(decrypted)).filter(isExportedCookie);\n if (env.VERBOSE) {\n console.log(\"results\", results);\n }\n return results;\n}\n\nconst chromeLocal = path.join(\n HOME,\n \"Library\",\n \"Application Support\",\n \"Google\",\n \"Chrome\"\n);\n\nasync function getEncryptedChromeCookie(\n {\n name,\n domain,\n file = path.join(chromeLocal, \"Default\", \"Cookies\")\n //\n }: {\n name: string;\n domain: string;\n file: string;\n }): Promise<CookieRow[]> {\n if (!existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (env.VERBOSE) {\n const s = file.split(\"/\").slice(-3).join(\"/\");\n console.log(`Trying Chrome (at ${s}) cookie ${name} for domain ${domain}`);\n }\n let sql;\n sql = `SELECT encrypted_value, name, host_key FROM cookies`;\n const wildcardRegexp = /^([*%])$/i;\n const specifiedName = name.match(wildcardRegexp) == null;\n const specifiedDomain = domain.match(wildcardRegexp) == null;\n if (specifiedName || specifiedDomain) {\n sql += ` WHERE `;\n if (specifiedName) {\n sql += `name = '${name}'`;\n if (specifiedDomain) {\n sql += ` AND `;\n }\n }\n if (specifiedDomain) {\n sql += `host_key LIKE '${domain}';`;\n }\n }\n return doSqliteQuery1(file, sql);\n}\n\nasync function getChromePassword(): Promise<string> {\n return execSimple(\n \"security find-generic-password -w -s \\\"Chrome Safe Storage\\\"\"\n );\n}\n\nasync function decrypt(password: crypto.BinaryLike, encryptedData: Buffer): Promise<string> {\n if (typeof password !== \"string\") {\n throw new Error(\"password must be a string: \" + password);\n }\n let encryptedData1: any;\n encryptedData1 = encryptedData;\n if (encryptedData1 == null || typeof encryptedData1 !== \"object\") {\n throw new Error(\"encryptedData must be a object: \" + encryptedData1);\n }\n if (!(encryptedData1 instanceof Buffer)) {\n if (Array.isArray(encryptedData1) && encryptedData1[0] instanceof Buffer) {\n [encryptedData1] = encryptedData1;\n if (env.VERBOSE) {\n console.log(\n `encryptedData is an array of buffers, selected first: ${encryptedData1}`\n );\n }\n } else {\n throw new Error(\"encryptedData must be a Buffer: \" + encryptedData1);\n }\n encryptedData1 = Buffer.from(encryptedData1);\n }\n if (env.VERBOSE) {\n console.log(`Trying to decrypt with password ${password}`);\n }\n return new Promise((resolve, reject) => {\n crypto.pbkdf2(password,\n \"saltysalt\",\n 1003,\n 16,\n \"sha1\",\n (error, buffer) => {\n try {\n if (error) {\n if (env.VERBOSE) {\n console.log(\"Error doing pbkdf2\", error);\n }\n reject(error);\n return;\n }\n\n if (buffer.length !== 16) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, buffer length is not 16\",\n buffer.length\n );\n }\n reject(new Error(\"Buffer length is not 16\"));\n return;\n }\n\n const str = new Array(17).join(\" \");\n const iv = Buffer.from(str, \"binary\");\n const decipher = crypto.createDecipheriv(\"aes-128-cbc\", buffer, iv);\n decipher.setAutoPadding(false);\n\n if (encryptedData1 && encryptedData1.slice) {\n encryptedData1 = encryptedData1.slice(3);\n }\n\n if (encryptedData1.length % 16 !== 0) {\n if (env.VERBOSE) {\n console.log(\n \"Error doing pbkdf2, encryptedData length is not a multiple of 16\",\n encryptedData1.length\n );\n }\n reject(new Error(\"encryptedData length is not a multiple of 16\"));\n return;\n }\n\n let decoded = decipher.update(encryptedData1);\n try {\n decipher.final(\"utf-8\");\n } catch (e) {\n if (env.VERBOSE) {\n console.log(\"Error doing decipher.final()\", e);\n }\n reject(e);\n return;\n }\n\n const padding = decoded[decoded.length - 1];\n if (padding) {\n decoded = decoded.slice(0, 0 - padding);\n }\n // noinspection JSCheckFunctionSignatures\n const decodedString = decoded.toString(\"utf8\");\n resolve(decodedString);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n"],"names":["$1RAd3$lodash","merge","$d99bf10ae9ada58f$export$a7b6bc01c63cdfc3","$d99bf10ae9ada58f$require$merge","process","env","$d99bf10ae9ada58f$export$a7c5707626fc90f","Error","$1RAd3$path","join"],"version":3,"file":"index.js.map","sourceRoot":"../"}
package/dist/main.js CHANGED
@@ -7,6 +7,9 @@ var $7oI3p$child_process = require("child_process");
7
7
  var $7oI3p$sqlite3 = require("sqlite3");
8
8
  var $7oI3p$jsonwebtoken = require("jsonwebtoken");
9
9
 
10
+ function $parcel$defineInteropFlag(a) {
11
+ Object.defineProperty(a, '__esModule', {value: true, configurable: true});
12
+ }
10
13
  function $parcel$export(e, n, v, s) {
11
14
  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
12
15
  }
@@ -14,20 +17,23 @@ function $parcel$interopDefault(a) {
14
17
  return a && a.__esModule ? a.default : a;
15
18
  }
16
19
 
20
+ $parcel$defineInteropFlag(module.exports);
21
+
17
22
  $parcel$export(module.exports, "getCookie", () => $cd1ba0160120c006$export$4be65e66cfa2648a);
18
23
  $parcel$export(module.exports, "getFirefoxCookie", () => $cd1ba0160120c006$export$c44c5fdef43f0941);
19
24
  $parcel$export(module.exports, "getChromeCookie", () => $cd1ba0160120c006$export$e5637297e9eb6f2e);
20
- class $503d2a3d296fcf21$export$2e2bcd8739ae039 {
21
- async queryCookies(name, domain) {
22
- if (process.env.NODE_ENV === "development") console.log("queryCookie", name, domain);
23
- return [];
24
- }
25
- }
25
+ $parcel$export(module.exports, "default", () => $cd1ba0160120c006$export$2e2bcd8739ae039);
26
+
27
+ var $fac425c10fbbada5$require$merge = $7oI3p$lodash.merge;
28
+ const $fac425c10fbbada5$export$a7b6bc01c63cdfc3 = {};
29
+ $fac425c10fbbada5$require$merge($fac425c10fbbada5$export$a7b6bc01c63cdfc3, process.env);
30
+ const $fac425c10fbbada5$export$a7c5707626fc90f = $fac425c10fbbada5$export$a7b6bc01c63cdfc3["HOME"];
31
+ if (!$fac425c10fbbada5$export$a7c5707626fc90f) throw new Error("HOME environment variable is not set");
32
+
26
33
 
27
34
 
28
35
 
29
36
  async function $25b78d6746d4ad48$export$8d71c74f97c0202e(command) {
30
- if (process.env.VERBOSE) console.log(command);
31
37
  return new Promise((resolve, reject)=>{
32
38
  (0, $7oI3p$child_process.exec)(command, {
33
39
  encoding: "binary",
@@ -45,22 +51,6 @@ async function $25b78d6746d4ad48$export$8d71c74f97c0202e(command) {
45
51
  });
46
52
  });
47
53
  }
48
- function $25b78d6746d4ad48$export$33d3adc27420eed5(r) {
49
- if (process.env.VERBOSE) console.log("Printing value", r);
50
- if (r) {
51
- if (typeof r === "string") return r;
52
- else if (r.toString) // noinspection JSCheckFunctionSignatures
53
- return r.toString("utf8");
54
- }
55
- }
56
- function $25b78d6746d4ad48$export$1ed1ce2ec2b4f5a3(r) {
57
- if (process.env.VERBOSE) console.log("Printing value", r);
58
- if (r) {
59
- if (typeof r === "string") console.log(r);
60
- else if (r.toString) // noinspection JSCheckFunctionSignatures
61
- console.log(r.toString("utf8"));
62
- }
63
- }
64
54
  function $25b78d6746d4ad48$export$d53bf2de587a369(result) {
65
55
  if (result == null) return null;
66
56
  if (process.env.VERBOSE) console.log("result", result);
@@ -78,13 +68,6 @@ function $25b78d6746d4ad48$export$5348b46700dd771c(input) {
78
68
 
79
69
 
80
70
 
81
- var $fac425c10fbbada5$require$merge = $7oI3p$lodash.merge;
82
- const $fac425c10fbbada5$export$a7b6bc01c63cdfc3 = {};
83
- $fac425c10fbbada5$require$merge($fac425c10fbbada5$export$a7b6bc01c63cdfc3, process.env);
84
- const $fac425c10fbbada5$export$a7c5707626fc90f = $fac425c10fbbada5$export$a7b6bc01c63cdfc3["HOME"];
85
- if (!$fac425c10fbbada5$export$a7c5707626fc90f) throw new Error("HOME environment variable is not set");
86
-
87
-
88
71
 
89
72
 
90
73
 
@@ -133,14 +116,6 @@ async function $e62c2c56eb720f29$export$2c9faf86071156ae({ path: path , name: na
133
116
 
134
117
 
135
118
 
136
- function $3d7e27b54f670f46$export$bc926c43858bd3cb(obj) {
137
- return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;
138
- }
139
- function $3d7e27b54f670f46$export$963c8d651337e4a4(obj) {
140
- return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;
141
- }
142
-
143
-
144
119
 
145
120
 
146
121
  async function $a085b524d8ee9fce$export$f19f611d1fa7c6f3(file, sql) {
@@ -149,13 +124,11 @@ async function $a085b524d8ee9fce$export$f19f611d1fa7c6f3(file, sql) {
149
124
  return new Promise((resolve, reject)=>{
150
125
  db.all(sql, (err, rows)=>{
151
126
  if (err) {
152
- if (process.env.VERBOSE) console.log(`doSqliteQuery1: error ${err}`);
153
127
  reject(err);
154
128
  return;
155
129
  }
156
130
  const rows1 = rows;
157
131
  if (rows1 == null || rows1.length === 0) {
158
- if (process.env.VERBOSE) console.log(`doSqliteQuery1: no rows`);
159
132
  resolve([]);
160
133
  return;
161
134
  }
@@ -183,7 +156,17 @@ async function $a085b524d8ee9fce$export$f19f611d1fa7c6f3(file, sql) {
183
156
 
184
157
 
185
158
 
186
- class $269fe42bfd555305$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$export$2e2bcd8739ae039) {
159
+ function $af69dfb8766652d8$export$bc926c43858bd3cb(obj) {
160
+ return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;
161
+ }
162
+
163
+
164
+ function $d66f40b581ba8bfa$export$963c8d651337e4a4(obj) {
165
+ return obj.domain !== undefined && obj.name !== undefined && obj.value !== undefined;
166
+ }
167
+
168
+
169
+ class $269fe42bfd555305$export$2e2bcd8739ae039 {
187
170
  async queryCookies(name, domain) {
188
171
  if (process.platform !== "darwin") throw new Error("This only works on macOS");
189
172
  if ((0, $fac425c10fbbada5$export$a7b6bc01c63cdfc3).FIREFOX_ONLY) return [];
@@ -214,7 +197,7 @@ async function $269fe42bfd555305$var$getPromise(name, domain) {
214
197
  });
215
198
  const promises = files.map((file)=>$269fe42bfd555305$var$getPromise1(name, domain, file));
216
199
  const results1 = await Promise.all(promises);
217
- return results1.flat().filter((0, $3d7e27b54f670f46$export$bc926c43858bd3cb));
200
+ return results1.flat().filter((0, $af69dfb8766652d8$export$bc926c43858bd3cb));
218
201
  } catch (error) {
219
202
  if ((0, $fac425c10fbbada5$export$a7b6bc01c63cdfc3).VERBOSE) console.log("error", error);
220
203
  return [];
@@ -245,7 +228,7 @@ async function $269fe42bfd555305$var$getChromeCookies({ name: name , domain: dom
245
228
  meta: meta
246
229
  };
247
230
  });
248
- const results = (await Promise.all(decrypted)).filter((0, $3d7e27b54f670f46$export$963c8d651337e4a4));
231
+ const results = (await Promise.all(decrypted)).filter((0, $d66f40b581ba8bfa$export$963c8d651337e4a4));
249
232
  if ((0, $fac425c10fbbada5$export$a7b6bc01c63cdfc3).VERBOSE) console.log("results", results);
250
233
  return results;
251
234
  }
@@ -337,8 +320,7 @@ async function $269fe42bfd555305$var$decrypt(password, encryptedData) {
337
320
 
338
321
 
339
322
 
340
-
341
- class $7bb7da9a77b2fd99$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$export$2e2bcd8739ae039) {
323
+ class $7bb7da9a77b2fd99$export$2e2bcd8739ae039 {
342
324
  async queryCookies(name, domain) {
343
325
  if (process.platform !== "darwin") throw new Error("This only works on macOS");
344
326
  if ((0, $fac425c10fbbada5$export$a7b6bc01c63cdfc3).CHROME_ONLY) return [];
@@ -391,16 +373,16 @@ class $7bb7da9a77b2fd99$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$exp
391
373
  }
392
374
 
393
375
 
394
-
395
- class $fad6f51bd5c7bae2$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$export$2e2bcd8739ae039) {
376
+ class $fad6f51bd5c7bae2$export$2e2bcd8739ae039 {
377
+ async queryCookies(name, domain) {
378
+ return [];
379
+ }
396
380
  }
397
381
 
398
382
 
399
-
400
- class $f72befa528c23ca7$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$export$2e2bcd8739ae039) {
383
+ class $f72befa528c23ca7$export$2e2bcd8739ae039 {
401
384
  #strategies;
402
385
  constructor(){
403
- super();
404
386
  this.#strategies = [
405
387
  (0, $269fe42bfd555305$export$2e2bcd8739ae039),
406
388
  (0, $7bb7da9a77b2fd99$export$2e2bcd8739ae039),
@@ -422,8 +404,6 @@ class $f72befa528c23ca7$export$2e2bcd8739ae039 extends (0, $503d2a3d296fcf21$exp
422
404
 
423
405
 
424
406
 
425
-
426
-
427
407
  function $9a6b2ace073cf1d7$export$2e2bcd8739ae039(token) {
428
408
  try {
429
409
  const result = (0, ($parcel$interopDefault($7oI3p$jsonwebtoken))).decode(token, {
@@ -455,6 +435,35 @@ async function $7a068a32d4710f0b$export$e6d428437cf2cacb({ name: name , domain:
455
435
 
456
436
 
457
437
 
438
+
439
+
440
+
441
+
442
+ function $9c43c2ed82e63570$export$9abc0a414b0d8b8f(results) {
443
+ return (0, $7oI3p$lodash.uniqBy)(results, (r)=>r.name).map((r)=>r.name + "=" + r.value).join("; ");
444
+ }
445
+
446
+
447
+ async function $300d8b33187a203c$export$4d2e9997e2c23417(//
448
+ { name: name , domain: domain }) {
449
+ const cookies = await (0, $7a068a32d4710f0b$export$e6d428437cf2cacb)({
450
+ name: name,
451
+ domain: domain
452
+ }, new (0, $f72befa528c23ca7$export$2e2bcd8739ae039)());
453
+ if (Array.isArray(cookies) && cookies.length > 0) {
454
+ const results = await (0, $7a068a32d4710f0b$export$e6d428437cf2cacb)({
455
+ name: name,
456
+ domain: domain
457
+ });
458
+ const groupedByFile = (0, $7oI3p$lodash.groupBy)(results, (r)=>r.meta?.file);
459
+ return Object.keys(groupedByFile).map((file)=>{
460
+ const results = groupedByFile[file];
461
+ return (0, $9c43c2ed82e63570$export$9abc0a414b0d8b8f)(results);
462
+ });
463
+ } else throw new Error("Cookie not found");
464
+ }
465
+
466
+
458
467
  async function $cd1ba0160120c006$export$4be65e66cfa2648a(params) {
459
468
  const cookies = await (0, $7a068a32d4710f0b$export$e6d428437cf2cacb)(params, new (0, $f72befa528c23ca7$export$2e2bcd8739ae039)());
460
469
  if (Array.isArray(cookies) && cookies.length > 0) return cookies.find((cookie)=>cookie != null);
@@ -470,6 +479,12 @@ async function $cd1ba0160120c006$export$e5637297e9eb6f2e(params) {
470
479
  if (Array.isArray(cookies) && cookies.length > 0) return cookies.find((cookie)=>cookie != null);
471
480
  else throw new Error("Cookie not found");
472
481
  }
482
+ var $cd1ba0160120c006$export$2e2bcd8739ae039 = {
483
+ getCookie: $cd1ba0160120c006$export$4be65e66cfa2648a,
484
+ getFirefoxCookie: $cd1ba0160120c006$export$c44c5fdef43f0941,
485
+ getChromeCookie: $cd1ba0160120c006$export$e5637297e9eb6f2e,
486
+ getGroupedRenderedCookies: $300d8b33187a203c$export$4d2e9997e2c23417
487
+ };
473
488
 
474
489
 
475
490
  //# sourceMappingURL=main.js.map