whopper 0.5.7 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/browser/index.d.ts.map +1 -1
  2. package/dist/browser/index.js +93 -11
  3. package/dist/browser/index.js.map +1 -1
  4. package/dist/browser/index.test.js +135 -1
  5. package/dist/browser/index.test.js.map +1 -1
  6. package/dist/browser/types.d.ts +2 -0
  7. package/dist/browser/types.d.ts.map +1 -1
  8. package/dist/commands/detect.d.ts.map +1 -1
  9. package/dist/commands/detect.js +4 -0
  10. package/dist/commands/detect.js.map +1 -1
  11. package/dist/commands/detect.test.js +6 -0
  12. package/dist/commands/detect.test.js.map +1 -1
  13. package/dist/commands/detect_utils.d.ts.map +1 -1
  14. package/dist/commands/detect_utils.js +23 -5
  15. package/dist/commands/detect_utils.js.map +1 -1
  16. package/dist/commands/detect_utils.test.js +86 -9
  17. package/dist/commands/detect_utils.test.js.map +1 -1
  18. package/dist/signatures/_types.d.ts +1 -0
  19. package/dist/signatures/_types.d.ts.map +1 -1
  20. package/dist/signatures/index.d.ts.map +1 -1
  21. package/dist/signatures/index.js +4 -0
  22. package/dist/signatures/index.js.map +1 -1
  23. package/dist/signatures/signatures.test.js +16 -0
  24. package/dist/signatures/signatures.test.js.map +1 -1
  25. package/dist/signatures/technologies/drupal.d.ts.map +1 -1
  26. package/dist/signatures/technologies/drupal.js +17 -0
  27. package/dist/signatures/technologies/drupal.js.map +1 -1
  28. package/dist/signatures/technologies/drupal.test.d.ts +2 -0
  29. package/dist/signatures/technologies/drupal.test.d.ts.map +1 -0
  30. package/dist/signatures/technologies/drupal.test.js +76 -0
  31. package/dist/signatures/technologies/drupal.test.js.map +1 -0
  32. package/dist/signatures/technologies/movable_type.d.ts +3 -0
  33. package/dist/signatures/technologies/movable_type.d.ts.map +1 -0
  34. package/dist/signatures/technologies/movable_type.js +56 -0
  35. package/dist/signatures/technologies/movable_type.js.map +1 -0
  36. package/dist/signatures/technologies/movable_type.test.d.ts +2 -0
  37. package/dist/signatures/technologies/movable_type.test.d.ts.map +1 -0
  38. package/dist/signatures/technologies/movable_type.test.js +114 -0
  39. package/dist/signatures/technologies/movable_type.test.js.map +1 -0
  40. package/dist/signatures/technologies/power_cms.d.ts +3 -0
  41. package/dist/signatures/technologies/power_cms.d.ts.map +1 -0
  42. package/dist/signatures/technologies/power_cms.js +51 -0
  43. package/dist/signatures/technologies/power_cms.js.map +1 -0
  44. package/dist/signatures/technologies/power_cms.test.d.ts +2 -0
  45. package/dist/signatures/technologies/power_cms.test.d.ts.map +1 -0
  46. package/dist/signatures/technologies/power_cms.test.js +83 -0
  47. package/dist/signatures/technologies/power_cms.test.js.map +1 -0
  48. package/package.json +3 -2
@@ -0,0 +1,56 @@
1
+ import { perlSignature } from "./perl.js";
2
+ // Probe common install dirs for the mt.cgi admin page. The logout mode avoids
3
+ // the redirect to mt-update.cgi on installs that need updating. Each probe
4
+ // mirrors the three admin-page markers (MT v2/v3/v4); the version-bearing
5
+ // patterns come first so the version is captured when available.
6
+ const adminPageRegexes = [
7
+ '/mt\\.js\\?v=([0-9]+(?:\\.[0-9]+)*)', // version (MT v4)
8
+ // version (MT v2.x / v3.x). Capture from the first digit up to the next tag
9
+ // so non-numeric suffixes (e.g. "3.36-ja" on Japanese editions) are kept
10
+ // without greedily spanning later </b> tags.
11
+ "<b>Version ([0-9][^<]*)</b>",
12
+ "<title>MOVABLE TYPE", // MT v2 marker
13
+ 'mt\\.cgi"><img alt="Movable Type"', // MT v3 marker
14
+ "Movable Type</title>", // MT v4 marker
15
+ ];
16
+ const activeRules = [
17
+ "/mt.cgi?__mode=logout", // root install (common)
18
+ "/mt/mt.cgi?__mode=logout",
19
+ "/cgi-bin/mt/mt.cgi?__mode=logout",
20
+ "/blog/mt.cgi?__mode=logout",
21
+ ].map((path) => ({ path, bodyRegexes: adminPageRegexes }));
22
+ // Detects Movable Type from public-facing pages (generator meta tag, mt-static
23
+ // assets) and, once detected, confirms/extracts the version via the mt.cgi
24
+ // admin page probed by the active rules above.
25
+ export const movableTypeSignature = {
26
+ name: "Movable Type",
27
+ description: "Movable Type is a weblog publishing system written in Perl by Six Apart.",
28
+ cpe: "cpe:/a:sixapart:movable_type", // CPE 2.2
29
+ rule: {
30
+ // Passive markers that appear on public-facing pages, so detection (and the
31
+ // active mt.cgi probe, which only runs for already-detected technologies)
32
+ // can fire without hitting the admin login page.
33
+ confidence: "high",
34
+ urls: [
35
+ "/mt-static/", // default StaticWebPath, referenced by public templates
36
+ ],
37
+ bodies: [
38
+ // generator meta tag emitted by the default templates, e.g.
39
+ // <meta name="generator" content="Movable Type Pro 7.9.1" />.
40
+ // Anchored to a literal <meta tag so escaped examples (&lt;meta ...) in
41
+ // articles about MT don't match; accepts single or double quotes like the
42
+ // other generator signatures. The trailing optional group captures the
43
+ // version when present.
44
+ "<meta[^>]+name=[\"']generator[\"'][^>]+content=[\"']Movable Type[^\"'0-9]*([0-9]+(?:\\.[0-9]+)*)?",
45
+ 'mt\\.cgi"><img alt="Movable Type"', // admin marker, specific enough for passive use
46
+ // Versioned mt.js asset, e.g. src="/mt-static/mt.js?v=7.9.7". On the admin
47
+ // page this is often the only detection + version source (the mt-static
48
+ // URL rule may miss it when subresources aren't captured). No trailing
49
+ // delimiter so single/double quotes and extra query params all work.
50
+ '/mt\\.js\\?v=([0-9]+(?:\\.[0-9]+)*)',
51
+ ],
52
+ },
53
+ activeRules,
54
+ impliedSoftwares: [perlSignature.name], // Movable Type is a Perl CGI application
55
+ };
56
+ //# sourceMappingURL=movable_type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movable_type.js","sourceRoot":"","sources":["../../../src/signatures/technologies/movable_type.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,gBAAgB,GAAG;IACvB,qCAAqC,EAAE,kBAAkB;IACzD,4EAA4E;IAC5E,yEAAyE;IACzE,6CAA6C;IAC7C,6BAA6B;IAC7B,qBAAqB,EAAE,eAAe;IACtC,mCAAmC,EAAE,eAAe;IACpD,sBAAsB,EAAE,eAAe;CACxC,CAAC;AAEF,MAAM,WAAW,GAAiB;IAChC,uBAAuB,EAAE,wBAAwB;IACjD,0BAA0B;IAC1B,kCAAkC;IAClC,4BAA4B;CAC7B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAE3D,+EAA+E;AAC/E,2EAA2E;AAC3E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,0EAA0E;IAC5E,GAAG,EAAE,8BAA8B,EAAE,UAAU;IAC/C,IAAI,EAAE;QACJ,4EAA4E;QAC5E,0EAA0E;QAC1E,iDAAiD;QACjD,UAAU,EAAE,MAAM;QAClB,IAAI,EAAE;YACJ,aAAa,EAAE,wDAAwD;SACxE;QACD,MAAM,EAAE;YACN,4DAA4D;YAC5D,8DAA8D;YAC9D,wEAAwE;YACxE,0EAA0E;YAC1E,uEAAuE;YACvE,wBAAwB;YACxB,mGAAmG;YACnG,mCAAmC,EAAE,gDAAgD;YACrF,2EAA2E;YAC3E,wEAAwE;YACxE,uEAAuE;YACvE,qEAAqE;YACrE,qCAAqC;SACtC;KACF;IACD,WAAW;IACX,gBAAgB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,yCAAyC;CAClF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=movable_type.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movable_type.test.d.ts","sourceRoot":"","sources":["../../../src/signatures/technologies/movable_type.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { matchString } from "../../analyzer/match.js";
3
+ import { movableTypeSignature } from "./movable_type.js";
4
+ describe("movableTypeSignature", () => {
5
+ describe("rule (passive, public-facing markers)", () => {
6
+ const bodies = movableTypeSignature.rule?.bodies ?? [];
7
+ const urls = movableTypeSignature.rule?.urls ?? [];
8
+ const generatorRegex = bodies.find((r) => r.includes("generator"));
9
+ it("matches the generator meta tag without a version", () => {
10
+ const html = '<meta name="generator" content="Movable Type" />';
11
+ const result = matchString(html, generatorRegex);
12
+ expect(result.hit).toBe(true);
13
+ expect(result.version).toBeUndefined();
14
+ });
15
+ it("extracts the version from the generator meta tag", () => {
16
+ const html = '<meta name="generator" content="Movable Type Pro 7.9.1" />';
17
+ const result = matchString(html, generatorRegex);
18
+ expect(result.hit).toBe(true);
19
+ expect(result.version).toBe("7.9.1");
20
+ });
21
+ it("matches a single-quoted generator meta tag", () => {
22
+ const html = "<meta name='generator' content='Movable Type Pro 7.9.1' />";
23
+ const result = matchString(html, generatorRegex);
24
+ expect(result.hit).toBe(true);
25
+ expect(result.version).toBe("7.9.1");
26
+ });
27
+ it("matches mt-static asset URLs", () => {
28
+ const url = "https://example.com/mt-static/themes-base/blog.css";
29
+ expect(urls.some((r) => matchString(url, r).hit)).toBe(true);
30
+ });
31
+ it("matches the admin image marker", () => {
32
+ const html = '<a href="mt.cgi"><img alt="Movable Type" src="logo.png">';
33
+ expect(bodies.some((r) => matchString(html, r).hit)).toBe(true);
34
+ });
35
+ it("extracts the version from the mt-static mt.js asset reference", () => {
36
+ const verRegex = bodies.find((r) => r.includes("mt\\.js"));
37
+ const result = matchString('<script src="/mt-static/mt.js?v=7.9.7"></script>', verRegex);
38
+ expect(result.hit).toBe(true);
39
+ expect(result.version).toBe("7.9.7");
40
+ });
41
+ it("extracts the mt.js version regardless of quoting or trailing params", () => {
42
+ const verRegex = bodies.find((r) => r.includes("mt\\.js"));
43
+ const singleQuoted = matchString("<script src='/mt-static/mt.js?v=7.9.7'></script>", verRegex);
44
+ expect(singleQuoted.version).toBe("7.9.7");
45
+ const extraParams = matchString('"/mt-static/mt.js?v=7.9.7&cb=1"', verRegex);
46
+ expect(extraParams.version).toBe("7.9.7");
47
+ });
48
+ it("does not match an escaped generator example quoted in an article", () => {
49
+ const html = 'Movable Type emits &lt;meta name="generator" ' +
50
+ 'content="Movable Type 7"&gt; in the head.';
51
+ expect(bodies.some((r) => matchString(html, r).hit)).toBe(false);
52
+ });
53
+ it("does not match an unrelated page", () => {
54
+ const html = '<html><head><title>Some Blog</title>' +
55
+ '<meta name="generator" content="WordPress 6.5" /></head></html>';
56
+ expect(bodies.some((r) => matchString(html, r).hit)).toBe(false);
57
+ });
58
+ });
59
+ describe("activeRules (mt.cgi admin probe)", () => {
60
+ const rules = movableTypeSignature.activeRules ?? [];
61
+ it("probes the root and common install dirs with logout mode", () => {
62
+ expect(rules.map((r) => r.path)).toEqual([
63
+ "/mt.cgi?__mode=logout",
64
+ "/mt/mt.cgi?__mode=logout",
65
+ "/cgi-bin/mt/mt.cgi?__mode=logout",
66
+ "/blog/mt.cgi?__mode=logout",
67
+ ]);
68
+ });
69
+ it("detects the MT v2, v3 and v4 admin-page markers", () => {
70
+ const regexes = rules[0].bodyRegexes;
71
+ const v2 = "<html><head><title>MOVABLE TYPE</title></head></html>";
72
+ const v3 = '<a href="mt.cgi"><img alt="Movable Type" src="x">';
73
+ const v4 = "<title>Sign in | Movable Type</title>";
74
+ for (const html of [v2, v3, v4]) {
75
+ expect(regexes.some((r) => matchString(html, r).hit)).toBe(true);
76
+ }
77
+ });
78
+ it("extracts the version from the mt.js asset reference", () => {
79
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("mt\\.js"));
80
+ const result = matchString('src="/mt.js?v=5.2.6"', regex);
81
+ expect(result.hit).toBe(true);
82
+ expect(result.version).toBe("5.2.6");
83
+ });
84
+ it("extracts the version from the 'Version x.y' marker (MT v2/v3)", () => {
85
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("Version"));
86
+ const result = matchString("<b>Version 3.2</b>", regex);
87
+ expect(result.hit).toBe(true);
88
+ expect(result.version).toBe("3.2");
89
+ });
90
+ it("keeps a non-numeric version suffix (e.g. Japanese editions)", () => {
91
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("Version"));
92
+ const result = matchString("<b>Version 3.36-ja</b>", regex);
93
+ expect(result.hit).toBe(true);
94
+ expect(result.version).toBe("3.36-ja");
95
+ });
96
+ it("does not over-capture across multiple <b> tags", () => {
97
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("Version"));
98
+ const result = matchString("<b>Version 3.2</b> x <b>y</b>", regex);
99
+ expect(result.hit).toBe(true);
100
+ expect(result.version).toBe("3.2");
101
+ });
102
+ it("does not match an unrelated response", () => {
103
+ const probe = rules[0];
104
+ expect(probe.bodyRegexes.some((r) => matchString("<html>not mt</html>", r).hit)).toBe(false);
105
+ });
106
+ });
107
+ it("uses the Six Apart Movable Type CPE 2.2 identifier", () => {
108
+ expect(movableTypeSignature.cpe).toBe("cpe:/a:sixapart:movable_type");
109
+ });
110
+ it("implies Perl as the underlying runtime", () => {
111
+ expect(movableTypeSignature.impliedSoftwares).toContain("Perl");
112
+ });
113
+ });
114
+ //# sourceMappingURL=movable_type.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movable_type.test.js","sourceRoot":"","sources":["../../../src/signatures/technologies/movable_type.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Signature } from "../_types.js";
2
+ export declare const powerCmsSignature: Signature;
3
+ //# sourceMappingURL=power_cms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power_cms.d.ts","sourceRoot":"","sources":["../../../src/signatures/technologies/power_cms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,cAAc,CAAC;AAqC1D,eAAO,MAAM,iBAAiB,EAAE,SAiB/B,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { movableTypeSignature } from "./movable_type.js";
2
+ import { perlSignature } from "./perl.js";
3
+ // PowerCMS is an Alfasado CMS built on top of Movable Type, so it shares the
4
+ // mt.cgi admin script and mt-static asset path with MT. Detection keys off the
5
+ // PowerCMS-specific plugin static path to tell it apart from plain MT, and the
6
+ // active mt.cgi admin probe captures the version from the admin footer when
7
+ // available (best-effort; admin pages are not always reachable).
8
+ const adminPageRegexes = [
9
+ // Admin footer version text, e.g. "PowerCMS version 5.43" / "PowerCMS 4.46".
10
+ // Version-bearing patterns come first so the version is captured when present.
11
+ // PowerCMS version numbers have irregular precision (2.0493 / 4.46 / 5.43),
12
+ // so accept an arbitrary number of dot-separated groups.
13
+ "PowerCMS version ([0-9]+(?:\\.[0-9]+)*)", // v5 footer
14
+ "PowerCMS ([0-9]+(?:\\.[0-9]+)*)", // v4 footer
15
+ // v6/v7 dropped the product-name prefix and show just "version 6.83". This
16
+ // bare fallback is intentionally last so v4/v5 still match the prefixed forms
17
+ // above (first-hit-wins), limiting its blast radius to v6/v7 pages. Requiring
18
+ // at least one dot avoids picking up single-token "version 3" style noise, and
19
+ // the leading \b prevents matching words that merely end in "version"
20
+ // (e.g. "Subversion 1.14.2").
21
+ "\\bversion ([0-9]+\\.[0-9]+(?:\\.[0-9]+)*)", // v6/v7 footer
22
+ "/mt-static/plugins/PowerCMS/", // PowerCMS-specific marker, confirms even without a version
23
+ ];
24
+ const activeRules = [
25
+ "/mt.cgi?__mode=logout", // root install (common)
26
+ "/mt/mt.cgi?__mode=logout",
27
+ "/cgi-bin/mt/mt.cgi?__mode=logout",
28
+ "/blog/mt.cgi?__mode=logout",
29
+ ].map((path) => ({ path, bodyRegexes: adminPageRegexes }));
30
+ // Detects PowerCMS from the PowerCMS-specific plugin static path on public
31
+ // pages, then confirms/extracts the version via the mt.cgi admin probe. When
32
+ // PowerCMS is detected, Movable Type is excluded from the output to avoid the
33
+ // underlying MT being reported alongside the actual product.
34
+ export const powerCmsSignature = {
35
+ name: "PowerCMS",
36
+ description: "PowerCMS is a Movable Type-based content management system by Alfasado Inc.",
37
+ cpe: "cpe:/a:alfasado:powercms", // CPE 2.2
38
+ rule: {
39
+ confidence: "high",
40
+ urls: [
41
+ "/mt-static/plugins/PowerCMS/", // distinguishes PowerCMS from plain Movable Type
42
+ ],
43
+ bodies: [
44
+ "/mt-static/plugins/PowerCMS/", // same path referenced inline in public HTML
45
+ ],
46
+ },
47
+ activeRules,
48
+ excludes: [movableTypeSignature.name], // PowerCMS supersedes the underlying Movable Type
49
+ impliedSoftwares: [perlSignature.name], // PowerCMS is a Perl application (like MT)
50
+ };
51
+ //# sourceMappingURL=power_cms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power_cms.js","sourceRoot":"","sources":["../../../src/signatures/technologies/power_cms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,iEAAiE;AACjE,MAAM,gBAAgB,GAAG;IACvB,6EAA6E;IAC7E,+EAA+E;IAC/E,4EAA4E;IAC5E,yDAAyD;IACzD,yCAAyC,EAAE,YAAY;IACvD,iCAAiC,EAAE,YAAY;IAC/C,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,sEAAsE;IACtE,8BAA8B;IAC9B,4CAA4C,EAAE,eAAe;IAC7D,8BAA8B,EAAE,4DAA4D;CAC7F,CAAC;AAEF,MAAM,WAAW,GAAiB;IAChC,uBAAuB,EAAE,wBAAwB;IACjD,0BAA0B;IAC1B,kCAAkC;IAClC,4BAA4B;CAC7B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAE3D,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,6EAA6E;IAC/E,GAAG,EAAE,0BAA0B,EAAE,UAAU;IAC3C,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM;QAClB,IAAI,EAAE;YACJ,8BAA8B,EAAE,iDAAiD;SAClF;QACD,MAAM,EAAE;YACN,8BAA8B,EAAE,6CAA6C;SAC9E;KACF;IACD,WAAW;IACX,QAAQ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,kDAAkD;IACzF,gBAAgB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,2CAA2C;CACpF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=power_cms.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power_cms.test.d.ts","sourceRoot":"","sources":["../../../src/signatures/technologies/power_cms.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { matchString } from "../../analyzer/match.js";
3
+ import { powerCmsSignature } from "./power_cms.js";
4
+ import { movableTypeSignature } from "./movable_type.js";
5
+ describe("powerCmsSignature", () => {
6
+ describe("rule (passive, public-facing marker)", () => {
7
+ const urls = powerCmsSignature.rule?.urls ?? [];
8
+ const bodies = powerCmsSignature.rule?.bodies ?? [];
9
+ it("matches the PowerCMS plugin static path in URLs", () => {
10
+ const url = "https://example.com/mt-static/plugins/PowerCMS/css/style.css";
11
+ expect(urls.some((r) => matchString(url, r).hit)).toBe(true);
12
+ });
13
+ it("matches the PowerCMS plugin static path inline in HTML", () => {
14
+ const html = '<link rel="stylesheet" href="/mt-static/plugins/PowerCMS/x.css">';
15
+ expect(bodies.some((r) => matchString(html, r).hit)).toBe(true);
16
+ });
17
+ it("does not match a plain Movable Type asset path", () => {
18
+ const url = "https://example.com/mt-static/themes-base/blog.css";
19
+ expect(urls.some((r) => matchString(url, r).hit)).toBe(false);
20
+ });
21
+ });
22
+ describe("activeRules (mt.cgi admin probe)", () => {
23
+ const rules = powerCmsSignature.activeRules ?? [];
24
+ it("probes the root and common install dirs with logout mode", () => {
25
+ expect(rules.map((r) => r.path)).toEqual([
26
+ "/mt.cgi?__mode=logout",
27
+ "/mt/mt.cgi?__mode=logout",
28
+ "/cgi-bin/mt/mt.cgi?__mode=logout",
29
+ "/blog/mt.cgi?__mode=logout",
30
+ ]);
31
+ });
32
+ it("extracts the version from the 'PowerCMS version X.Y' footer", () => {
33
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("PowerCMS version"));
34
+ const result = matchString("<p>PowerCMS version 5.43</p>", regex);
35
+ expect(result.hit).toBe(true);
36
+ expect(result.version).toBe("5.43");
37
+ });
38
+ it("extracts the version from the 'PowerCMS X.Y' footer", () => {
39
+ const result = rules[0].bodyRegexes
40
+ .map((r) => matchString("Powered by PowerCMS 4.46", r))
41
+ .find((r) => r.hit);
42
+ expect(result.hit).toBe(true);
43
+ expect(result.version).toBe("4.46");
44
+ });
45
+ it("extracts the version from the v6/v7 'version X.Y' footer (no product prefix)", () => {
46
+ const result = rules[0].bodyRegexes
47
+ .map((r) => matchString("<p>version 6.83</p>", r))
48
+ .find((r) => r.hit);
49
+ expect(result.hit).toBe(true);
50
+ expect(result.version).toBe("6.83");
51
+ });
52
+ it("does not pick up a single-token 'version 3' as a version", () => {
53
+ const bare = rules[0].bodyRegexes.find((r) => r === "\\bversion ([0-9]+\\.[0-9]+(?:\\.[0-9]+)*)");
54
+ expect(matchString("requires version 3", bare).hit).toBe(false);
55
+ });
56
+ it("does not match a word that merely ends in 'version' (e.g. Subversion)", () => {
57
+ const bare = rules[0].bodyRegexes.find((r) => r === "\\bversion ([0-9]+\\.[0-9]+(?:\\.[0-9]+)*)");
58
+ expect(matchString("Subversion 1.14.2", bare).hit).toBe(false);
59
+ });
60
+ it("extracts irregular-precision versions (e.g. 2.0493)", () => {
61
+ const result = rules[0].bodyRegexes
62
+ .map((r) => matchString("PowerCMS 2.0493", r))
63
+ .find((r) => r.hit);
64
+ expect(result.version).toBe("2.0493");
65
+ });
66
+ it("confirms PowerCMS via the plugin path even without a version", () => {
67
+ const regex = rules[0].bodyRegexes.find((r) => r.includes("/mt-static/plugins/PowerCMS/"));
68
+ const result = matchString('<img src="/mt-static/plugins/PowerCMS/logo.png">', regex);
69
+ expect(result.hit).toBe(true);
70
+ expect(result.version).toBeUndefined();
71
+ });
72
+ });
73
+ it("uses the Alfasado PowerCMS CPE 2.2 identifier", () => {
74
+ expect(powerCmsSignature.cpe).toBe("cpe:/a:alfasado:powercms");
75
+ });
76
+ it("excludes Movable Type so only PowerCMS is reported", () => {
77
+ expect(powerCmsSignature.excludes).toContain(movableTypeSignature.name);
78
+ });
79
+ it("implies Perl as the underlying runtime", () => {
80
+ expect(powerCmsSignature.impliedSoftwares).toContain("Perl");
81
+ });
82
+ });
83
+ //# sourceMappingURL=power_cms.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power_cms.test.js","sourceRoot":"","sources":["../../../src/signatures/technologies/power_cms.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;QAEpD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,GAAG,GACP,8DAA8D,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,IAAI,GACR,kEAAkE,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,GAAG,GAAG,oDAAoD,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,IAAI,EAAE,CAAC;QAElD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBACvC,uBAAuB;gBACvB,0BAA0B;gBAC1B,kCAAkC;gBAClC,4BAA4B;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAC9B,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;iBACtD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;iBACjD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,4CAA4C,CACzD,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,4CAA4C,CACzD,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;iBAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAC1C,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CACxB,kDAAkD,EAClD,KAAK,CACN,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whopper",
3
- "version": "0.5.7",
3
+ "version": "0.6.0",
4
4
  "description": "Whopper is a CLI tool that discovers and detects web technologies used on websites.",
5
5
  "scripts": {
6
6
  "build": "tsc -p tsconfig.json",
@@ -10,7 +10,8 @@
10
10
  "lint": "eslint . --ext .ts",
11
11
  "format": "prettier --write .",
12
12
  "test": "vitest run --coverage",
13
- "prepublishOnly": "npm run clean && npm run lint && npm test && npm run build",
13
+ "preversion": "npm run lint && npm test",
14
+ "prepublishOnly": "npm run clean && npm run build",
14
15
  "release": "git push --follow-tags && npm publish",
15
16
  "release:patch": "npm version patch && git push --follow-tags && npm publish",
16
17
  "release:minor": "npm version minor && git push --follow-tags && npm publish",