pentest-tool-lite 3.10.6 → 3.10.10

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 (208) hide show
  1. package/dist/Pentest.js +46 -0
  2. package/dist/{src/Test.js → Test.js} +11 -24
  3. package/dist/{src/index → command.js} +21 -20
  4. package/dist/commands/Sitemap.js +79 -0
  5. package/dist/dns/A.js +49 -0
  6. package/dist/dns/DMARC.js +59 -0
  7. package/dist/dns/NS.js +36 -0
  8. package/dist/dns/RegistrationDate.js +39 -0
  9. package/dist/dns/index.js +47 -0
  10. package/dist/functions/parseSitemap.js +12 -0
  11. package/dist/html/Anchor.js +56 -0
  12. package/dist/html/CSS.js +92 -0
  13. package/dist/html/DuplicateId.js +35 -0
  14. package/dist/html/Generator.js +31 -0
  15. package/dist/html/Image.js +79 -0
  16. package/dist/html/JavaScript.js +107 -0
  17. package/dist/{src/html → html}/__TESTS__/Generator.test.js +10 -19
  18. package/dist/html/index.js +51 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.js +11 -0
  21. package/dist/{src/logger → logger}/Console.js +1 -3
  22. package/dist/metadata/HTML.js +26 -0
  23. package/dist/metadata/Markdown.js +28 -0
  24. package/dist/metadata/ResponseTime.js +25 -0
  25. package/dist/metadata/index.js +45 -0
  26. package/dist/request/NodeFetch.js +58 -0
  27. package/dist/{src/request → request}/cache/UnlimitedCache.js +2 -0
  28. package/dist/security/ContentEncoding.js +44 -0
  29. package/dist/security/ContentSecurityPolicy.js +32 -0
  30. package/dist/security/Cookies.js +44 -0
  31. package/dist/security/FingerPrint.js +37 -0
  32. package/dist/security/GoogleWebRisk.js +44 -0
  33. package/dist/security/HSTS.js +48 -0
  34. package/dist/security/HTTPS.js +78 -0
  35. package/dist/security/HTTPVersion.js +50 -0
  36. package/dist/security/PermissionsPolicy.js +53 -0
  37. package/dist/security/Redirect.js +37 -0
  38. package/dist/security/ReferrerPolicy.js +32 -0
  39. package/dist/security/RobotsTXT.js +28 -0
  40. package/dist/security/SSL.js +36 -0
  41. package/dist/security/XFrameOptions.js +32 -0
  42. package/dist/security/XXSSProtection.js +32 -0
  43. package/dist/{src/security → security}/__TESTS__/ContentSecurityPolicy.test.js +10 -19
  44. package/dist/{src/security → security}/__TESTS__/FingerPrint.test.js +10 -19
  45. package/dist/{src/security → security}/__TESTS__/HSTS.test.js +15 -24
  46. package/dist/{src/security → security}/__TESTS__/HTTPS.test.js +15 -24
  47. package/dist/{src/security → security}/__TESTS__/XFrameOptions.test.js +10 -19
  48. package/dist/{src/security → security}/__TESTS__/XXSSProtection.test.js +10 -19
  49. package/dist/{src/security → security}/index.js +20 -31
  50. package/dist/seo/Heading.js +51 -0
  51. package/dist/seo/Robots.js +21 -0
  52. package/dist/seo/Sitemap.js +32 -0
  53. package/dist/seo/Title.js +44 -0
  54. package/dist/seo/index.js +47 -0
  55. package/dist/wordpress/DefaultFiles.js +50 -0
  56. package/dist/wordpress/Generator.js +58 -0
  57. package/dist/wordpress/index.js +43 -0
  58. package/package.json +10 -2
  59. package/dist/package.json +0 -61
  60. package/dist/src/Pentest.js +0 -57
  61. package/dist/src/commands/Sitemap.js +0 -96
  62. package/dist/src/dns/A.js +0 -65
  63. package/dist/src/dns/DMARC.js +0 -73
  64. package/dist/src/dns/NS.js +0 -52
  65. package/dist/src/dns/RegistrationDate.js +0 -55
  66. package/dist/src/dns/index.js +0 -58
  67. package/dist/src/functions/parseSitemap.js +0 -23
  68. package/dist/src/html/Anchor.js +0 -72
  69. package/dist/src/html/CSS.js +0 -108
  70. package/dist/src/html/DuplicateId.js +0 -49
  71. package/dist/src/html/Generator.js +0 -45
  72. package/dist/src/html/Image.js +0 -95
  73. package/dist/src/html/JavaScript.js +0 -123
  74. package/dist/src/html/index.js +0 -62
  75. package/dist/src/metadata/HTML.js +0 -40
  76. package/dist/src/metadata/Markdown.js +0 -42
  77. package/dist/src/metadata/ResponseTime.js +0 -39
  78. package/dist/src/metadata/index.js +0 -56
  79. package/dist/src/request/NodeFetch.js +0 -68
  80. package/dist/src/security/ContentEncoding.js +0 -58
  81. package/dist/src/security/ContentSecurityPolicy.js +0 -46
  82. package/dist/src/security/Cookies.js +0 -58
  83. package/dist/src/security/FingerPrint.js +0 -51
  84. package/dist/src/security/GoogleWebRisk.js +0 -58
  85. package/dist/src/security/HSTS.js +0 -62
  86. package/dist/src/security/HTTPS.js +0 -92
  87. package/dist/src/security/HTTPVersion.js +0 -64
  88. package/dist/src/security/PermissionsPolicy.js +0 -67
  89. package/dist/src/security/Redirect.js +0 -51
  90. package/dist/src/security/ReferrerPolicy.js +0 -46
  91. package/dist/src/security/RobotsTXT.js +0 -42
  92. package/dist/src/security/SSL.js +0 -50
  93. package/dist/src/security/XFrameOptions.js +0 -46
  94. package/dist/src/security/XXSSProtection.js +0 -46
  95. package/dist/src/seo/Heading.js +0 -65
  96. package/dist/src/seo/Robots.js +0 -35
  97. package/dist/src/seo/Sitemap.js +0 -46
  98. package/dist/src/seo/Title.js +0 -58
  99. package/dist/src/seo/index.js +0 -58
  100. package/dist/src/wordpress/DefaultFiles.js +0 -66
  101. package/dist/src/wordpress/Generator.js +0 -76
  102. package/dist/src/wordpress/index.js +0 -54
  103. /package/{dist/README.md → README.md} +0 -0
  104. /package/dist/{src/Pentest.d.ts → Pentest.d.ts} +0 -0
  105. /package/dist/{src/Test.d.ts → Test.d.ts} +0 -0
  106. /package/dist/{src/index.d.ts → command.d.ts} +0 -0
  107. /package/dist/{src/commands → commands}/Sitemap.d.ts +0 -0
  108. /package/dist/{src/config.d.ts → config.d.ts} +0 -0
  109. /package/dist/{src/config.js → config.js} +0 -0
  110. /package/dist/{src/dns → dns}/A.d.ts +0 -0
  111. /package/dist/{src/dns → dns}/DMARC.d.ts +0 -0
  112. /package/dist/{src/dns → dns}/NS.d.ts +0 -0
  113. /package/dist/{src/dns → dns}/RegistrationDate.d.ts +0 -0
  114. /package/dist/{src/dns → dns}/index.d.ts +0 -0
  115. /package/dist/{src/functions → functions}/findEvery.d.ts +0 -0
  116. /package/dist/{src/functions → functions}/findEvery.js +0 -0
  117. /package/dist/{src/functions → functions}/getAnchors.d.ts +0 -0
  118. /package/dist/{src/functions → functions}/getAnchors.js +0 -0
  119. /package/dist/{src/functions → functions}/getDomain.d.ts +0 -0
  120. /package/dist/{src/functions → functions}/getDomain.js +0 -0
  121. /package/dist/{src/functions → functions}/getDuplicates.d.ts +0 -0
  122. /package/dist/{src/functions → functions}/getDuplicates.js +0 -0
  123. /package/dist/{src/functions → functions}/getGenerator.d.ts +0 -0
  124. /package/dist/{src/functions → functions}/getGenerator.js +0 -0
  125. /package/dist/{src/functions → functions}/getHeading.d.ts +0 -0
  126. /package/dist/{src/functions → functions}/getHeading.js +0 -0
  127. /package/dist/{src/functions → functions}/getImages.d.ts +0 -0
  128. /package/dist/{src/functions → functions}/getImages.js +0 -0
  129. /package/dist/{src/functions → functions}/getObject.d.ts +0 -0
  130. /package/dist/{src/functions → functions}/getObject.js +0 -0
  131. /package/dist/{src/functions → functions}/getScripts.d.ts +0 -0
  132. /package/dist/{src/functions → functions}/getScripts.js +0 -0
  133. /package/dist/{src/functions → functions}/getStylesheets.d.ts +0 -0
  134. /package/dist/{src/functions → functions}/getStylesheets.js +0 -0
  135. /package/dist/{src/functions → functions}/getTitle.d.ts +0 -0
  136. /package/dist/{src/functions → functions}/getTitle.js +0 -0
  137. /package/dist/{src/functions → functions}/index.d.ts +0 -0
  138. /package/dist/{src/functions → functions}/index.js +0 -0
  139. /package/dist/{src/functions → functions}/parseHtml.d.ts +0 -0
  140. /package/dist/{src/functions → functions}/parseHtml.js +0 -0
  141. /package/dist/{src/functions → functions}/parseSitemap.d.ts +0 -0
  142. /package/dist/{src/functions → functions}/parseXml.d.ts +0 -0
  143. /package/dist/{src/functions → functions}/parseXml.js +0 -0
  144. /package/dist/{src/html → html}/Anchor.d.ts +0 -0
  145. /package/dist/{src/html → html}/CSS.d.ts +0 -0
  146. /package/dist/{src/html → html}/DuplicateId.d.ts +0 -0
  147. /package/dist/{src/html → html}/Generator.d.ts +0 -0
  148. /package/dist/{src/html → html}/Image.d.ts +0 -0
  149. /package/dist/{src/html → html}/JavaScript.d.ts +0 -0
  150. /package/dist/{src/html → html}/__TESTS__/Generator.test.d.ts +0 -0
  151. /package/dist/{src/html → html}/index.d.ts +0 -0
  152. /package/dist/{src/logger → logger}/Console.d.ts +0 -0
  153. /package/dist/{src/logger → logger}/Logger.d.ts +0 -0
  154. /package/dist/{src/logger → logger}/Logger.js +0 -0
  155. /package/dist/{src/logger → logger}/index.d.ts +0 -0
  156. /package/dist/{src/logger → logger}/index.js +0 -0
  157. /package/dist/{src/metadata → metadata}/HTML.d.ts +0 -0
  158. /package/dist/{src/metadata → metadata}/Markdown.d.ts +0 -0
  159. /package/dist/{src/metadata → metadata}/ResponseTime.d.ts +0 -0
  160. /package/dist/{src/metadata → metadata}/index.d.ts +0 -0
  161. /package/dist/{src/report → report}/CommandLine.d.ts +0 -0
  162. /package/dist/{src/report → report}/CommandLine.js +0 -0
  163. /package/dist/{src/report → report}/Json.d.ts +0 -0
  164. /package/dist/{src/report → report}/Json.js +0 -0
  165. /package/dist/{src/report → report}/Report.d.ts +0 -0
  166. /package/dist/{src/report → report}/Report.js +0 -0
  167. /package/dist/{src/report → report}/Symbols.d.ts +0 -0
  168. /package/dist/{src/report → report}/Symbols.js +0 -0
  169. /package/dist/{src/report → report}/index.d.ts +0 -0
  170. /package/dist/{src/report → report}/index.js +0 -0
  171. /package/dist/{src/request → request}/NodeFetch.d.ts +0 -0
  172. /package/dist/{src/request → request}/Request.d.ts +0 -0
  173. /package/dist/{src/request → request}/Request.js +0 -0
  174. /package/dist/{src/request → request}/cache/BlackHoleCache.d.ts +0 -0
  175. /package/dist/{src/request → request}/cache/BlackHoleCache.js +0 -0
  176. /package/dist/{src/request → request}/cache/UnlimitedCache.d.ts +0 -0
  177. /package/dist/{src/request → request}/index.d.ts +0 -0
  178. /package/dist/{src/request → request}/index.js +0 -0
  179. /package/dist/{src/security → security}/ContentEncoding.d.ts +0 -0
  180. /package/dist/{src/security → security}/ContentSecurityPolicy.d.ts +0 -0
  181. /package/dist/{src/security → security}/Cookies.d.ts +0 -0
  182. /package/dist/{src/security → security}/FingerPrint.d.ts +0 -0
  183. /package/dist/{src/security → security}/GoogleWebRisk.d.ts +0 -0
  184. /package/dist/{src/security → security}/HSTS.d.ts +0 -0
  185. /package/dist/{src/security → security}/HTTPS.d.ts +0 -0
  186. /package/dist/{src/security → security}/HTTPVersion.d.ts +0 -0
  187. /package/dist/{src/security → security}/PermissionsPolicy.d.ts +0 -0
  188. /package/dist/{src/security → security}/Redirect.d.ts +0 -0
  189. /package/dist/{src/security → security}/ReferrerPolicy.d.ts +0 -0
  190. /package/dist/{src/security → security}/RobotsTXT.d.ts +0 -0
  191. /package/dist/{src/security → security}/SSL.d.ts +0 -0
  192. /package/dist/{src/security → security}/XFrameOptions.d.ts +0 -0
  193. /package/dist/{src/security → security}/XXSSProtection.d.ts +0 -0
  194. /package/dist/{src/security → security}/__TESTS__/ContentSecurityPolicy.test.d.ts +0 -0
  195. /package/dist/{src/security → security}/__TESTS__/FingerPrint.test.d.ts +0 -0
  196. /package/dist/{src/security → security}/__TESTS__/HSTS.test.d.ts +0 -0
  197. /package/dist/{src/security → security}/__TESTS__/HTTPS.test.d.ts +0 -0
  198. /package/dist/{src/security → security}/__TESTS__/XFrameOptions.test.d.ts +0 -0
  199. /package/dist/{src/security → security}/__TESTS__/XXSSProtection.test.d.ts +0 -0
  200. /package/dist/{src/security → security}/index.d.ts +0 -0
  201. /package/dist/{src/seo → seo}/Heading.d.ts +0 -0
  202. /package/dist/{src/seo → seo}/Robots.d.ts +0 -0
  203. /package/dist/{src/seo → seo}/Sitemap.d.ts +0 -0
  204. /package/dist/{src/seo → seo}/Title.d.ts +0 -0
  205. /package/dist/{src/seo → seo}/index.d.ts +0 -0
  206. /package/dist/{src/wordpress → wordpress}/DefaultFiles.d.ts +0 -0
  207. /package/dist/{src/wordpress → wordpress}/Generator.d.ts +0 -0
  208. /package/dist/{src/wordpress → wordpress}/index.d.ts +0 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ const functions_1 = require("../functions");
10
+ class DuplicateId extends Test_1.default {
11
+ name = 'Duplicate ID';
12
+ async test({ url }) {
13
+ logger_1.default.info('Starting DuplicateId test...');
14
+ const response = await request_1.default.get(url);
15
+ const duplicates = await (0, functions_1.getDuplicates)(response);
16
+ if (duplicates.length > 0) {
17
+ return {
18
+ status: 'WARNING',
19
+ title: 'Duplicate IDs',
20
+ description: '',
21
+ results: duplicates.map(duplicate => ({
22
+ status: 'WARNING',
23
+ title: `<${duplicate.name} id="${duplicate.attribs.id}" ... />`,
24
+ description: '',
25
+ }))
26
+ };
27
+ }
28
+ return {
29
+ status: 'SUCCESS',
30
+ title: 'Duplicate IDs',
31
+ description: ''
32
+ };
33
+ }
34
+ }
35
+ exports.default = DuplicateId;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ const functions_1 = require("../functions");
10
+ class Generator extends Test_1.default {
11
+ name = 'Generator';
12
+ async test({ url }) {
13
+ logger_1.default.info('Starting DuplicateId test...');
14
+ const response = await request_1.default.get(url);
15
+ const html = await (0, functions_1.parseHtml)(response);
16
+ const generators = await (0, functions_1.getGenerator)(html);
17
+ if (generators.length > 0) {
18
+ return {
19
+ status: 'WARNING',
20
+ title: this.name,
21
+ description: 'Page contains inmformation about its generator!',
22
+ };
23
+ }
24
+ return {
25
+ status: 'SUCCESS',
26
+ title: this.name,
27
+ description: 'Page doesn\t contain any information about its generator.',
28
+ };
29
+ }
30
+ }
31
+ exports.default = Generator;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ const functions_1 = require("../functions");
10
+ class Image extends Test_1.default {
11
+ name = 'Image';
12
+ async test({ url }) {
13
+ logger_1.default.info('Starting Image test...');
14
+ const response = await request_1.default.get(url);
15
+ const html = await (0, functions_1.parseHtml)(response);
16
+ const images = (0, functions_1.getImages)(html);
17
+ const subTests = await this.checkImages(images);
18
+ return {
19
+ status: this.getStatus(subTests.map(test => test.status)),
20
+ title: 'Image',
21
+ description: '',
22
+ results: subTests,
23
+ };
24
+ }
25
+ async checkImages(images) {
26
+ const results = [];
27
+ for (const image of images) {
28
+ const filename = image.substring(image.lastIndexOf('/') + 1);
29
+ logger_1.default.verbose(`Checking ${filename}...`);
30
+ const result = await request_1.default.get(image);
31
+ const isFileAvailabe = {
32
+ status: this.isFileAvailable(result) ? 'SUCCESS' : 'ERROR',
33
+ title: 'Available',
34
+ description: '',
35
+ };
36
+ const isCached = {
37
+ status: this.isCached(result) ? 'SUCCESS' : 'ERROR',
38
+ title: 'Cached',
39
+ description: '',
40
+ };
41
+ const hasXContentTypeOptionsHeader = {
42
+ status: this.hasXContentTypeOptionsHeader(result) ? 'SUCCESS' : 'WARNING',
43
+ title: 'X-Content-Type-Options',
44
+ description: '',
45
+ };
46
+ results.push({
47
+ status: this.getStatus([
48
+ isFileAvailabe.status,
49
+ isCached.status,
50
+ hasXContentTypeOptionsHeader.status,
51
+ ]), // eslint-disable-line @typescript-eslint/no-explicit-any
52
+ title: filename,
53
+ description: '',
54
+ results: [
55
+ isFileAvailabe,
56
+ isCached,
57
+ hasXContentTypeOptionsHeader,
58
+ ],
59
+ });
60
+ }
61
+ return results;
62
+ }
63
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
64
+ isFileAvailable(result) {
65
+ if (result.response.statusCode === 404 || result.response.statusCode === 500) {
66
+ return false;
67
+ }
68
+ return true;
69
+ }
70
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
71
+ isCached(result) {
72
+ return result.response.headers.has('cache-control');
73
+ }
74
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
75
+ hasXContentTypeOptionsHeader(result) {
76
+ return result.response.headers.has('x-content-type-options');
77
+ }
78
+ }
79
+ exports.default = Image;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const uglify_js_1 = __importDefault(require("uglify-js"));
7
+ const Test_1 = __importDefault(require("../Test"));
8
+ const request_1 = __importDefault(require("../request"));
9
+ const logger_1 = __importDefault(require("../logger"));
10
+ const functions_1 = require("../functions");
11
+ class JavaScript extends Test_1.default {
12
+ name = 'JavaScript';
13
+ async test({ url }) {
14
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
15
+ const response = await request_1.default.get(url);
16
+ const html = await (0, functions_1.parseHtml)(response);
17
+ const scripts = (0, functions_1.getScripts)(html);
18
+ const subTests = await this.check(scripts);
19
+ return {
20
+ status: this.getStatus(subTests.map(test => test.status)),
21
+ title: this.constructor.name,
22
+ description: '',
23
+ results: subTests,
24
+ };
25
+ }
26
+ async check(scripts) {
27
+ const results = [];
28
+ for (const script of scripts) {
29
+ const filename = script.substr(script.lastIndexOf('/') + 1);
30
+ logger_1.default.verbose(`Checking ${filename}...`);
31
+ const result = await request_1.default.get(script);
32
+ const isFileAvailabe = {
33
+ status: this.isFileAvailable(result) ? 'SUCCESS' : 'ERROR',
34
+ title: 'Available',
35
+ description: '',
36
+ };
37
+ const isCached = {
38
+ status: this.isCached(result) ? 'SUCCESS' : 'ERROR',
39
+ title: 'Cached',
40
+ description: '',
41
+ };
42
+ const hasXContentTypeOptionsHeader = {
43
+ status: this.hasXContentTypeOptionsHeader(result) ? 'SUCCESS' : 'WARNING',
44
+ title: 'X-Content-Type-Options',
45
+ description: '',
46
+ };
47
+ const isMinified = {
48
+ status: this.isMinified(result) ? 'SUCCESS' : 'WARNING',
49
+ title: 'Minified',
50
+ description: '',
51
+ };
52
+ const hasConsoleLogs = {
53
+ status: this.hasConsoleLogs(result) ? 'SUCCESS' : 'WARNING',
54
+ title: 'ConsoleLogs',
55
+ description: '',
56
+ };
57
+ results.push({
58
+ status: this.getStatus([
59
+ isFileAvailabe.status,
60
+ isCached.status,
61
+ hasXContentTypeOptionsHeader.status,
62
+ isMinified.status,
63
+ hasConsoleLogs.status,
64
+ ]), // eslint-disable-line @typescript-eslint/no-explicit-any
65
+ title: filename,
66
+ description: '',
67
+ results: [
68
+ isFileAvailabe,
69
+ isCached,
70
+ hasXContentTypeOptionsHeader,
71
+ isMinified,
72
+ hasConsoleLogs,
73
+ ],
74
+ });
75
+ }
76
+ return results;
77
+ }
78
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
79
+ isFileAvailable(result) {
80
+ if (result.response.statusCode === 404 || result.response.statusCode === 500) {
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
86
+ isCached(result) {
87
+ return result.response.headers.has('cache-control');
88
+ }
89
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
90
+ hasXContentTypeOptionsHeader(result) {
91
+ return result.response.headers.has('x-content-type-options');
92
+ }
93
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
94
+ isMinified(result) {
95
+ const r = uglify_js_1.default.minify(result.body, { mangle: false, output: { comments: true } });
96
+ if (Object.prototype.hasOwnProperty.call(r, 'error')) {
97
+ logger_1.default.error('JavaScript syntax error!');
98
+ throw r.error;
99
+ }
100
+ return result.body.length /* - (result.body.length * 0.05)*/ <= r.code.length;
101
+ }
102
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
103
+ hasConsoleLogs(result) {
104
+ return result.body.indexOf('console.log') !== -1 && result.body.indexOf('console.error') !== -1;
105
+ }
106
+ }
107
+ exports.default = JavaScript;
@@ -1,44 +1,35 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
14
5
  Object.defineProperty(exports, "__esModule", { value: true });
15
6
  const Generator_1 = __importDefault(require("../Generator"));
16
7
  const request_1 = __importDefault(require("../../request"));
17
- test('Generator test without generator metatag', () => __awaiter(void 0, void 0, void 0, function* () {
8
+ test('Generator test without generator metatag', async () => {
18
9
  const generator = new Generator_1.default();
19
10
  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
20
- const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
11
+ const mock = jest.spyOn(request_1.default, 'get').mockImplementation(async () => {
21
12
  return new Promise((resolve) => {
22
13
  resolve({
23
14
  body: '<html><body><meta name="description" content="Generator is not here" /></body></html>'
24
15
  });
25
16
  });
26
- }));
27
- const result = yield generator.run({ url: 'https://juffalow.com' });
17
+ });
18
+ const result = await generator.run({ url: 'https://juffalow.com' });
28
19
  expect(result.status).toEqual('SUCCESS');
29
20
  mock.mockRestore();
30
- }));
31
- test('Generator test with generator metatag', () => __awaiter(void 0, void 0, void 0, function* () {
21
+ });
22
+ test('Generator test with generator metatag', async () => {
32
23
  const generator = new Generator_1.default();
33
24
  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
34
- const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
25
+ const mock = jest.spyOn(request_1.default, 'get').mockImplementation(async () => {
35
26
  return new Promise((resolve) => {
36
27
  resolve({
37
28
  body: '<html><body><meta name="description" content="Generator is not here" /><meta name="generator" content="Whatever" /></body></html>'
38
29
  });
39
30
  });
40
- }));
41
- const result = yield generator.run({ url: 'https://juffalow.com' });
31
+ });
32
+ const result = await generator.run({ url: 'https://juffalow.com' });
42
33
  expect(result.status).toEqual('WARNING');
43
34
  mock.mockRestore();
44
- }));
35
+ });
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const Image_1 = __importDefault(require("./Image"));
8
+ const DuplicateId_1 = __importDefault(require("./DuplicateId"));
9
+ const CSS_1 = __importDefault(require("./CSS"));
10
+ const JavaScript_1 = __importDefault(require("./JavaScript"));
11
+ const Anchor_1 = __importDefault(require("./Anchor"));
12
+ const Generator_1 = __importDefault(require("./Generator"));
13
+ class HTML extends Test_1.default {
14
+ name = 'HTML';
15
+ constructor() {
16
+ super();
17
+ this.tests = [
18
+ new JavaScript_1.default(),
19
+ new CSS_1.default(),
20
+ new Image_1.default(),
21
+ new Anchor_1.default(),
22
+ new DuplicateId_1.default(),
23
+ new Generator_1.default(),
24
+ ];
25
+ }
26
+ async test(params) {
27
+ const tests = this.getTests();
28
+ const results = [];
29
+ for (const test of tests) {
30
+ let result = null;
31
+ try {
32
+ result = await test.run(params);
33
+ }
34
+ catch {
35
+ result = {
36
+ status: 'ERROR',
37
+ title: test.name,
38
+ description: 'Test failed or cannot be run!',
39
+ };
40
+ }
41
+ results.push(result);
42
+ }
43
+ return {
44
+ status: this.getStatus(results.map(result => result.status)),
45
+ title: this.name,
46
+ description: '',
47
+ results,
48
+ };
49
+ }
50
+ }
51
+ exports.default = HTML;
@@ -0,0 +1,5 @@
1
+ import Pentest from './Pentest';
2
+ import Test from './Test';
3
+ export default Pentest;
4
+ export { Pentest };
5
+ export { Test };
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Test = exports.Pentest = void 0;
7
+ const Pentest_1 = __importDefault(require("./Pentest"));
8
+ exports.Pentest = Pentest_1.default;
9
+ const Test_1 = __importDefault(require("./Test"));
10
+ exports.Test = Test_1.default;
11
+ exports.default = Pentest_1.default;
@@ -5,9 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const config_1 = __importDefault(require("../config"));
7
7
  class Console {
8
- constructor() {
9
- this.levels = ['ALL', 'DEBUG', 'VERBOSE', 'INFO', 'WARNING', 'ERROR', 'NONE'];
10
- }
8
+ levels = ['ALL', 'DEBUG', 'VERBOSE', 'INFO', 'WARNING', 'ERROR', 'NONE'];
11
9
  debug(message, ...args) {
12
10
  if (this.levels.indexOf(config_1.default.logger.level) > 1) {
13
11
  return;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ class HTML extends Test_1.default {
10
+ name = 'HTML';
11
+ async test({ url }) {
12
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
13
+ const response = await request_1.default.get(url);
14
+ const html = response.body;
15
+ return {
16
+ status: 'SUCCESS',
17
+ title: this.constructor.name,
18
+ description: '',
19
+ metadata: {
20
+ html,
21
+ },
22
+ results: [],
23
+ };
24
+ }
25
+ }
26
+ exports.default = HTML;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_html_markdown_1 = require("node-html-markdown");
7
+ const Test_1 = __importDefault(require("../Test"));
8
+ const request_1 = __importDefault(require("../request"));
9
+ const logger_1 = __importDefault(require("../logger"));
10
+ class Markdown extends Test_1.default {
11
+ name = 'Markdown';
12
+ async test({ url }) {
13
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
14
+ const response = await request_1.default.get(url);
15
+ const html = response.body;
16
+ const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html);
17
+ return {
18
+ status: 'SUCCESS',
19
+ title: this.constructor.name,
20
+ description: '',
21
+ metadata: {
22
+ markdown,
23
+ },
24
+ results: [],
25
+ };
26
+ }
27
+ }
28
+ exports.default = Markdown;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ class ResponseTime extends Test_1.default {
10
+ name = 'ResponseTime';
11
+ async test({ url }) {
12
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
13
+ const response = await request_1.default.get(url);
14
+ return {
15
+ status: 'SUCCESS',
16
+ title: this.constructor.name,
17
+ description: '',
18
+ metadata: {
19
+ duration: response.duration,
20
+ },
21
+ results: [],
22
+ };
23
+ }
24
+ }
25
+ exports.default = ResponseTime;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const HTML_1 = __importDefault(require("./HTML"));
8
+ const Markdown_1 = __importDefault(require("./Markdown"));
9
+ const ResponseTime_1 = __importDefault(require("./ResponseTime"));
10
+ class Metadata extends Test_1.default {
11
+ name = 'Metadata';
12
+ constructor() {
13
+ super();
14
+ this.tests = [
15
+ new HTML_1.default(),
16
+ new Markdown_1.default(),
17
+ new ResponseTime_1.default(),
18
+ ];
19
+ }
20
+ async test(params) {
21
+ const tests = this.getTests();
22
+ const results = [];
23
+ for (const test of tests) {
24
+ let result = null;
25
+ try {
26
+ result = await test.run(params);
27
+ }
28
+ catch {
29
+ result = {
30
+ status: 'ERROR',
31
+ title: test.name,
32
+ description: 'Test failed or cannot be run!',
33
+ };
34
+ }
35
+ results.push(result);
36
+ }
37
+ return {
38
+ status: this.getStatus(results.map(result => result.status)),
39
+ title: this.name,
40
+ description: '',
41
+ results,
42
+ };
43
+ }
44
+ }
45
+ exports.default = Metadata;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const config_1 = __importDefault(require("../config"));
7
+ const getHeaders = (headers) => {
8
+ const keyValues = {};
9
+ headers.forEach((value, header) => {
10
+ if (value.length === 1 && header !== 'set-cookie') {
11
+ keyValues[header] = value[0];
12
+ }
13
+ else {
14
+ keyValues[header] = value;
15
+ }
16
+ });
17
+ return keyValues;
18
+ };
19
+ class NodeFetch {
20
+ cache;
21
+ constructor(cache) {
22
+ this.cache = cache;
23
+ }
24
+ async get(url, options) {
25
+ if (this.cache.has(url)) {
26
+ return this.cache.get(url);
27
+ }
28
+ const defaultOptions = config_1.default.request.options;
29
+ const startTime = Date.now();
30
+ const response = await fetch(url, { ...defaultOptions, ...options });
31
+ const endTime = Date.now();
32
+ const body = await response.text();
33
+ const statusCode = response.status;
34
+ const statusText = response.statusText;
35
+ const headers = getHeaders(response.headers);
36
+ this.cache.add(url, {
37
+ response,
38
+ statusCode,
39
+ statusText,
40
+ headers,
41
+ body,
42
+ url,
43
+ finalUrl: response.url,
44
+ duration: (endTime - startTime) / 1000,
45
+ });
46
+ return {
47
+ response,
48
+ statusCode,
49
+ statusText,
50
+ headers,
51
+ body,
52
+ url,
53
+ finalUrl: response.url,
54
+ duration: (endTime - startTime) / 1000,
55
+ };
56
+ }
57
+ }
58
+ exports.default = NodeFetch;
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class UnlimitedCache {
4
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
5
+ requests;
4
6
  constructor() {
5
7
  this.requests = {};
6
8
  }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ /**
10
+ *
11
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/content-encoding
12
+ */
13
+ class ContentEncoding extends Test_1.default {
14
+ name = 'Content-Encoding';
15
+ async test({ url }) {
16
+ logger_1.default.info('Starting content-encoding test...');
17
+ const response = await request_1.default.get(url);
18
+ if (!Object.prototype.hasOwnProperty.call(response.headers, 'content-encoding')) {
19
+ return {
20
+ status: 'ERROR',
21
+ title: 'Content-Encoding',
22
+ description: 'Response headers does not contain content-encoding header!',
23
+ };
24
+ }
25
+ const attributesList = response.headers['content-encoding'];
26
+ const attributes = attributesList.replace(' ', '').split(',');
27
+ const ce1 = attributes.indexOf('gzip') > -1;
28
+ const ce2 = attributes.indexOf('deflate') > -1;
29
+ const ce3 = attributes.indexOf('br') > -1;
30
+ if (ce1 || ce2 || ce3) {
31
+ return {
32
+ status: 'SUCCESS',
33
+ title: 'Content-Encoding',
34
+ description: `The value of content-encoding header is ${attributesList}.`,
35
+ };
36
+ }
37
+ return {
38
+ status: 'ERROR',
39
+ title: 'Content-Encoding',
40
+ description: `The value of content-encoding header is ${attributesList}.`,
41
+ };
42
+ }
43
+ }
44
+ exports.default = ContentEncoding;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Test_1 = __importDefault(require("../Test"));
7
+ const request_1 = __importDefault(require("../request"));
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ /**
10
+ *
11
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
12
+ */
13
+ class ContentSecurityPolicy extends Test_1.default {
14
+ name = 'Content-Security-Policy';
15
+ async test({ url }) {
16
+ logger_1.default.info('Starting ContentSecurityPolicy test...');
17
+ const response = await request_1.default.get(url);
18
+ if (!Object.prototype.hasOwnProperty.call(response.headers, 'content-security-policy')) {
19
+ return {
20
+ status: 'ERROR',
21
+ title: 'Content-Security-Policy',
22
+ description: 'Response headers does not contain content-security-policy header!',
23
+ };
24
+ }
25
+ return {
26
+ status: 'SUCCESS',
27
+ title: 'Content-Security-Policy',
28
+ description: `The value of content-security-policy header is ${response.headers['content-security-policy']}.`,
29
+ };
30
+ }
31
+ }
32
+ exports.default = ContentSecurityPolicy;