@mherod/get-cookie 2.0.0-rc.3 → 2.0.0-rc.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.idea/runConfigurations/build.xml +12 -0
  2. package/.parcelrc +12 -0
  3. package/.prettierignore +5 -0
  4. package/.prettierrc +12 -0
  5. package/.terserrc +26 -0
  6. package/README.md +2 -2
  7. package/dist/cli.js +2 -0
  8. package/dist/index.js +2 -687
  9. package/dist/index.js.map +1 -0
  10. package/dist/module.js +1323 -0
  11. package/dist/module.js.map +1 -0
  12. package/dist/prompt.2b8c61c0.js +40 -0
  13. package/dist/prompt.536a2c51.js +40 -0
  14. package/dist/prompt.fb2c7dad.js.map +1 -0
  15. package/dist/types.d.ts +25 -0
  16. package/dist/types.d.ts.map +1 -0
  17. package/jest.config.ts +14 -0
  18. package/package-lock.json +2688 -6684
  19. package/package.json +42 -35
  20. package/src/CookieRow.ts +1 -0
  21. package/src/CookieSpec.ts +3 -1
  22. package/src/CookieStore.ts +27 -0
  23. package/src/ExportedCookie.ts +13 -0
  24. package/src/FetchResponse.ts +1 -2
  25. package/src/FileCookieStore.ts +175 -0
  26. package/src/StringToRegex.ts +16 -0
  27. package/src/argv.ts +29 -0
  28. package/src/browsers/ChromeApplicationSupport.ts +10 -0
  29. package/src/browsers/ChromeCookieQueryStrategy.ts +71 -131
  30. package/src/browsers/CompositeCookieQueryStrategy.ts +35 -11
  31. package/src/browsers/CookieQueryStrategy.ts +2 -0
  32. package/src/browsers/CookieStoreQueryStrategy.ts +99 -0
  33. package/src/browsers/DoSqliteQueryWithTransform.ts +85 -0
  34. package/src/browsers/FirefoxCookieQueryStrategy.ts +12 -7
  35. package/src/browsers/SafariCookieQueryStrategy.ts +3 -0
  36. package/src/browsers/decrypt.ts +118 -0
  37. package/src/browsers/getChromePassword.ts +9 -0
  38. package/src/cli.ts +52 -36
  39. package/src/comboQueryCookieSpec.ts +24 -0
  40. package/src/cookieSpecsFromUrl.ts +26 -0
  41. package/src/execSimple.ts +13 -0
  42. package/src/fetchWithCookies.ts +105 -38
  43. package/src/findAllFiles.ts +26 -54
  44. package/src/getChromeCookie.ts +19 -0
  45. package/src/getCookie.ts +20 -0
  46. package/src/getFirefoxCookie.ts +19 -0
  47. package/src/getGroupedRenderedCookies.ts +11 -24
  48. package/src/getMergedRenderedCookies.ts +12 -0
  49. package/src/global.ts +1 -1
  50. package/src/index.ts +14 -58
  51. package/src/isValidJwt.ts +4 -4
  52. package/src/listChromeProfiles.ts +45 -0
  53. package/src/logger.ts +3 -0
  54. package/src/queryCookies.ts +20 -11
  55. package/src/resultsRendered.ts +6 -3
  56. package/src/util/flatMapAsync.test.ts +55 -0
  57. package/src/util/flatMapAsync.ts +37 -0
  58. package/tsconfig.json +12 -16
  59. package/.github/dependabot.yml +0 -6
  60. package/.prettierrc.json +0 -1
  61. package/src/IsExportedCookie.ts +0 -9
  62. package/src/MemoryCookieStore.ts +0 -5
  63. package/src/browsers/MemoryCookieJarQueryStrategy.ts +0 -53
  64. package/src/doSqliteQuery1.ts +0 -51
  65. package/src/utils.ts +0 -50
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mherod/get-cookie",
3
- "version": "2.0.0-rc.3",
3
+ "version": "2.0.0-rc.30",
4
4
  "description": "Node.js module for querying a local user's Chrome cookie",
5
5
  "source": "src/index.ts",
6
6
  "bin": "dist/cli.js",
@@ -11,29 +11,29 @@
11
11
  "access": "public"
12
12
  },
13
13
  "scripts": {
14
- "clean": "git clean -fXd && yarn",
15
- "build": "parcel build",
16
- "prepare": "npm run build && npm run prettier",
14
+ "clean": "git clean -fdX && rm -rf dist && yarn install",
15
+ "lintfix": "prettier --write \"src/**/*.ts\"",
16
+ "prebuild": "npm run lintfix",
17
+ "build": "parcel build --no-cache",
18
+ "prepare": "parcel build --no-cache",
17
19
  "test": "jest",
18
- "postbuild": "npm run check",
19
20
  "prepublish": "npm run build",
20
- "preinstall:global": "npm run build",
21
- "install:global": "npm install --force --global .",
22
- "postinstall:global": "find $NVM_BIN -exec chmod +x {} \\; || true",
23
- "prettier": "prettier --write 'src/{**/*,*}.{js,json,ts}'",
24
- "check": "tsc --noEmit"
21
+ "install:global": "npm run build && npm install --global .",
22
+ "prettier": "prettier --write ."
25
23
  },
26
24
  "targets": {
27
- "main": {},
28
25
  "types": {},
29
- "library": {
30
- "source": [
31
- "src/index.ts"
32
- ],
26
+ "main": {
27
+ "source": "src/index.ts",
33
28
  "distDir": "dist",
34
29
  "isLibrary": true,
35
30
  "engines": {
36
- "node": "16"
31
+ "node": ">= 16"
32
+ },
33
+ "sourceMap": false,
34
+ "optimize": true,
35
+ "includeNodeModules": {
36
+ "@mapbox/node-pre-gyp": false
37
37
  }
38
38
  },
39
39
  "cli": {
@@ -41,11 +41,13 @@
41
41
  "distDir": "dist",
42
42
  "isLibrary": false,
43
43
  "engines": {
44
- "node": "16"
44
+ "node": ">= 16"
45
45
  },
46
- "includeNodeModules": [
47
- "colorette"
48
- ]
46
+ "sourceMap": false,
47
+ "optimize": true,
48
+ "includeNodeModules": {
49
+ "@mapbox/node-pre-gyp": false
50
+ }
49
51
  }
50
52
  },
51
53
  "@parcel/transformer-js": {
@@ -53,35 +55,40 @@
53
55
  "inlineEnvironment": true
54
56
  },
55
57
  "engines": {
56
- "node": "16"
58
+ "node": ">= 16"
57
59
  },
58
60
  "keywords": [],
59
61
  "author": "Matthew Herod",
60
62
  "license": "ISC",
61
63
  "dependencies": {
62
- "colorette": "^2.0.19",
63
- "cross-fetch": "^3.1.5",
64
- "destr": "^1.1.1",
65
- "jsonwebtoken": "^8.5.1",
64
+ "colorette": "2.0.20",
65
+ "consola": "3.2.3",
66
+ "cross-fetch": "^4.0.0",
67
+ "destr": "2.0.2",
68
+ "fast-glob": "^3.3.1",
69
+ "jsonwebtoken": "9.0.0",
66
70
  "lodash": "^4.17.21",
71
+ "lodash-es": "^4.17.21",
67
72
  "lru-cache": "^7.14.0",
68
- "minimist": "^1.2.6",
69
- "sqlite3": "^5.1.1",
70
- "tough-cookie": "^4.1.2"
73
+ "minimist": "^1.2.7",
74
+ "sqlite3": "^5.1.6",
75
+ "tough-cookie": "^4.1.2",
76
+ "user-agents": "^1.0.1178"
71
77
  },
72
78
  "devDependencies": {
73
- "@parcel/packager-ts": "^2.7.0",
74
- "@parcel/transformer-typescript-types": "^2.7.0",
79
+ "@mapbox/node-pre-gyp": "^1.0.11",
80
+ "@parcel/packager-ts": "^2.10.1",
81
+ "@parcel/transformer-typescript-tsc": "^2.10.1",
82
+ "@parcel/transformer-typescript-types": "^2.10.1",
75
83
  "@types/jsonwebtoken": "^8.5.9",
76
84
  "@types/lodash": "^4.14.186",
77
85
  "@types/minimist": "^1.2.2",
78
- "@types/node": "^18.8.2",
86
+ "@types/node": "^18.11.4",
79
87
  "@types/tough-cookie": "^4.0.2",
80
88
  "@types/user-agents": "^1.0.2",
81
- "jest": "^29.0.3",
82
- "parcel": "^2.7.0",
83
- "prettier": "^2.7.1",
89
+ "parcel": "^2.10.1",
90
+ "prettier": "^2.8.1",
84
91
  "ts-node": "^10.9.1",
85
- "typescript": "^4.8.4"
92
+ "typescript": "^5.2.2"
86
93
  }
87
94
  }
package/src/CookieRow.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export default interface CookieRow {
2
+ expiry?: number;
2
3
  domain: string;
3
4
  name: string;
4
5
  value: Buffer;
package/src/CookieSpec.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export default interface CookieSpec {
2
- name: string;
3
2
  domain: string;
3
+ name: string;
4
4
  }
5
+
6
+ export type MultiCookieSpec = CookieSpec | CookieSpec[];
@@ -0,0 +1,27 @@
1
+ import { env } from "./global";
2
+ import { parsedArgs } from "./argv";
3
+ import { CookieJar, MemoryCookieStore, Store } from "tough-cookie";
4
+
5
+ import { FileCookieStore } from "./FileCookieStore";
6
+
7
+ const memoryCookieStore = new MemoryCookieStore();
8
+
9
+ async function getCookieStore(): Promise<Store> {
10
+ if (parsedArgs["cs"] == "memory") {
11
+ return memoryCookieStore;
12
+ }
13
+ const fileCookieStore = new FileCookieStore(
14
+ `${env["HOME"]}/cookie-star.json`,
15
+ memoryCookieStore
16
+ );
17
+ await fileCookieStore.waitUntilIdle();
18
+ return fileCookieStore;
19
+ }
20
+
21
+ export const cookieStorePromise: Promise<Store> = new Promise((resolve) => {
22
+ getCookieStore().then(resolve);
23
+ });
24
+
25
+ export const cookieJarPromise: Promise<CookieJar> = new Promise((resolve) => {
26
+ cookieStorePromise.then((store) => new CookieJar(store)).then(resolve);
27
+ });
@@ -2,5 +2,18 @@ export default interface ExportedCookie {
2
2
  domain: string;
3
3
  name: string;
4
4
  value: string;
5
+ expiry?: Date | "Infinity";
5
6
  meta?: any;
6
7
  }
8
+
9
+ export function isExportedCookie(obj: any): obj is ExportedCookie {
10
+ return (
11
+ typeof obj.domain === "string" &&
12
+ typeof obj.name === "string" &&
13
+ typeof obj.value === "string" &&
14
+ (obj.expiry === undefined ||
15
+ obj.expiry instanceof Date ||
16
+ obj.expiry === "Infinity") &&
17
+ (obj.meta === undefined || typeof obj.meta === "object")
18
+ );
19
+ }
@@ -1,6 +1,5 @@
1
1
  // noinspection JSUnusedGlobalSymbols
2
-
3
- import { Response } from "cross-fetch";
2
+ import type { Response } from "cross-fetch";
4
3
 
5
4
  export default interface FetchResponse extends Response {
6
5
  status: number;
@@ -0,0 +1,175 @@
1
+ import { Cookie, MemoryCookieStore, Store } from "tough-cookie";
2
+ import { existsSync, writeFile } from "fs";
3
+ import destr from "destr";
4
+ import { merge } from "lodash";
5
+ import { readFile } from "fs/promises";
6
+ import logger from "./logger";
7
+
8
+ export class FileCookieStore extends Store {
9
+ private readonly internalStore: Store;
10
+
11
+ synchronous: boolean = false;
12
+ filePath: string;
13
+
14
+ private tasks: Promise<any>[] = [];
15
+
16
+ constructor(
17
+ filePath: string,
18
+ internalStore: Store = new MemoryCookieStore()
19
+ ) {
20
+ super();
21
+
22
+ this.filePath = filePath;
23
+ this.internalStore = internalStore ?? new MemoryCookieStore();
24
+
25
+ logger.debug("Importing cookies from", filePath, internalStore);
26
+
27
+ this.tasks.push(
28
+ this.importSaved(filePath, internalStore).then(console.log, console.error)
29
+ );
30
+ }
31
+
32
+ private async importSaved(filePath: string, store: Store): Promise<Cookie[]> {
33
+ const cookies: Cookie[] = [];
34
+ if (existsSync(filePath)) {
35
+ const data: string = await readFile(filePath, "utf8");
36
+ // @ts-ignore
37
+ const cookies: any[] = Object.values(destr(data))
38
+ .flatMap((domainCookies: any) => Object.values(domainCookies))
39
+ .flatMap((domainCookies: any) => Object.values(domainCookies));
40
+ if (process.env["DEBUG"]) {
41
+ logger.start("Importing", cookies.length, "cookies");
42
+ }
43
+ const array = Array.isArray(cookies) ? cookies : Object.values(cookies);
44
+ const put = await Promise.all(
45
+ array.map((cookie) => {
46
+ const fromJSON = Cookie.fromJSON(cookie);
47
+ if (fromJSON) {
48
+ return this.putCookieInternal(fromJSON, store);
49
+ }
50
+ })
51
+ );
52
+ cookies.push(...put);
53
+ }
54
+ return cookies;
55
+ }
56
+
57
+ findCookie(
58
+ domain: string,
59
+ path: string,
60
+ key: string,
61
+ cb: (err: Error | null, cookie: Cookie | null) => void
62
+ ) {
63
+ this.waitUntilIdle().finally(() => {
64
+ this.internalStore.findCookie(domain, path, key, cb);
65
+ });
66
+ }
67
+
68
+ findCookies(
69
+ domain: string,
70
+ path: string,
71
+ allowSpecialUseDomain: boolean,
72
+ cb: (err: Error | null, cookie: Cookie[]) => void
73
+ ) {
74
+ this.waitUntilIdle().finally(() => {
75
+ this.internalStore.findCookies(domain, path, allowSpecialUseDomain, cb);
76
+ });
77
+ }
78
+
79
+ putCookie(cookie: Cookie, cb: (err: Error | null) => void) {
80
+ this.internalStore.putCookie(cookie, cb);
81
+ this.internalStore.getAllCookies((err, cookies) => {
82
+ this.serializeCallback(err, cookies);
83
+ });
84
+ }
85
+
86
+ updateCookie(
87
+ oldCookie: Cookie,
88
+ newCookie: Cookie,
89
+ cb: (err: Error | null) => void
90
+ ) {
91
+ this.internalStore.updateCookie(oldCookie, newCookie, cb);
92
+ this.internalStore.getAllCookies((err, cookies) => {
93
+ this.serializeCallback(err, cookies);
94
+ });
95
+ }
96
+
97
+ removeCookie(
98
+ domain: string,
99
+ path: string,
100
+ key: string,
101
+ cb: (err: Error | null) => void
102
+ ) {
103
+ this.internalStore.removeCookie(domain, path, key, cb);
104
+ this.internalStore.getAllCookies((err, cookies) => {
105
+ this.serializeCallback(err, cookies);
106
+ });
107
+ }
108
+
109
+ removeCookies(domain: string, path: string, cb: (err: Error | null) => void) {
110
+ this.internalStore.removeCookies(domain, path, cb);
111
+ this.internalStore.getAllCookies((err, cookies) => {
112
+ this.serializeCallback(err, cookies);
113
+ });
114
+ }
115
+
116
+ getAllCookies(cb: (err: Error | null, cookie: Cookie[]) => void) {
117
+ this.waitUntilIdle().finally(() => {
118
+ this.internalStore.getAllCookies(cb);
119
+ });
120
+ }
121
+
122
+ waitUntilIdle() {
123
+ return Promise.allSettled(this.tasks).catch(logger.error);
124
+ }
125
+
126
+ private async putCookieInternal(
127
+ cookie: Cookie,
128
+ store: Store
129
+ ): Promise<Cookie> {
130
+ await this.waitUntilIdle();
131
+ return await new Promise<Cookie>(
132
+ (
133
+ resolve: (value: PromiseLike<Cookie> | Cookie) => void,
134
+ reject: (reason?: any) => void
135
+ ) => {
136
+ store.putCookie(cookie, (err: Error | null) => {
137
+ if (err) {
138
+ reject(err);
139
+ } else {
140
+ resolve(cookie);
141
+ }
142
+ });
143
+ }
144
+ );
145
+ }
146
+
147
+ private serializeCallback(err: Error | null, cookies: Cookie[]) {
148
+ if (err) {
149
+ console.error(err);
150
+ return;
151
+ }
152
+ const cookieObjs = cookies.map((cookie: Cookie) => cookie);
153
+ const idx: any = {};
154
+ for (const cookie of cookieObjs) {
155
+ const domain = cookie.domain;
156
+ if (typeof domain === "string") {
157
+ const path: string = cookie.path ?? "/";
158
+ const key: string = cookie.key;
159
+ merge(idx, {
160
+ [domain]: {
161
+ [path]: {
162
+ [key]: cookie.toJSON(),
163
+ },
164
+ },
165
+ });
166
+ }
167
+ }
168
+ const stringify = JSON.stringify(idx, null, 2);
169
+ writeFile(this.filePath, stringify, (err) => {
170
+ if (err) {
171
+ console.error(err);
172
+ }
173
+ });
174
+ }
175
+ }
@@ -0,0 +1,16 @@
1
+ // This function converts a string into a regular expression
2
+ export function stringToRegex(s: string): RegExp {
3
+ // Replace all occurrences of '.' with a literal '.'
4
+ const s1 = s.replaceAll(/\./gi, ".");
5
+ // Replace all occurrences of '%' with '.*' to match any number of any characters
6
+ const s2 = s1.replace(/%/g, ".*");
7
+ // Replace all occurrences of '*' with '.*' to match any number of any characters
8
+ const s3 = s2.replace(/\*/g, ".*");
9
+ // Return the new string as a RegExp object
10
+ return new RegExp(s3);
11
+ }
12
+
13
+ /*
14
+ %.example.com -> .*\.example\.com
15
+ example.com -> example\.com
16
+ */
package/src/argv.ts CHANGED
@@ -1 +1,30 @@
1
+ import minimist from "minimist";
2
+ import { merge } from "lodash";
3
+
4
+ export interface MyParsedArgs extends minimist.ParsedArgs {
5
+ verbose: boolean;
6
+ render?: string;
7
+ fetch?: string;
8
+ cs?: string;
9
+ dump?: string;
10
+ "dump-request-headers"?: string;
11
+ "dump-response-headers"?: string;
12
+ "dump-response-body"?: string;
13
+ }
14
+
15
+ /*
16
+ Usage: get-cookie [name] [domain] [options]
17
+ Options:
18
+ -h, --help: Show this help
19
+ -v, --verbose: Show verbose output
20
+ -d, --dump: Dump all results
21
+ -D, --dump-grouped: Dump all results, grouped by profile
22
+ -r, --render: Render all results
23
+ */
24
+
1
25
  export const argv: string[] = process.argv ?? [];
26
+ const minimistArgs: minimist.ParsedArgs = minimist(argv.slice(2));
27
+ const defaultOptions = {
28
+ verbose: false,
29
+ };
30
+ export const parsedArgs: MyParsedArgs = merge(defaultOptions, minimistArgs);
@@ -0,0 +1,10 @@
1
+ import { join } from "path";
2
+ import { HOME } from "../global";
3
+
4
+ export const chromeApplicationSupport: string = join(
5
+ HOME,
6
+ "Library",
7
+ "Application Support",
8
+ "Google",
9
+ "Chrome"
10
+ );