pentest-tool-lite 3.9.2 → 3.10.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/LICENSE +19 -0
- package/dist/package.json +61 -0
- package/{src → dist/src}/Pentest.d.ts +1 -0
- package/{src → dist/src}/Pentest.js +19 -5
- package/{src → dist/src}/Test.d.ts +1 -0
- package/{src → dist/src}/Test.js +5 -7
- package/{src → dist/src}/commands/Sitemap.d.ts +4 -4
- package/{src → dist/src}/commands/Sitemap.js +3 -1
- package/{src → dist/src}/dns/A.js +4 -3
- package/{src → dist/src}/dns/DMARC.js +2 -1
- package/{src → dist/src}/dns/NS.js +2 -2
- package/{src → dist/src}/dns/RegistrationDate.js +3 -3
- package/{src → dist/src}/dns/index.js +1 -1
- package/dist/src/functions/findEvery.d.ts +2 -0
- package/{src → dist/src}/functions/getDuplicates.js +1 -0
- package/dist/src/functions/getGenerator.d.ts +2 -0
- package/{src → dist/src}/functions/getGenerator.js +3 -0
- package/{src → dist/src}/functions/getHeading.js +4 -0
- package/{src → dist/src}/functions/getImages.js +1 -0
- package/dist/src/functions/getObject.d.ts +2 -0
- package/{src → dist/src}/functions/getScripts.js +1 -0
- package/{src → dist/src}/functions/getStylesheets.js +1 -0
- package/{src → dist/src}/functions/getTitle.js +1 -0
- package/{src → dist/src}/functions/parseHtml.js +4 -0
- package/{src → dist/src}/functions/parseSitemap.js +1 -0
- package/{src → dist/src}/functions/parseXml.js +1 -1
- package/{src → dist/src}/html/Anchor.js +2 -1
- package/{src → dist/src}/html/CSS.js +6 -2
- package/{src → dist/src}/html/Image.js +5 -2
- package/{src → dist/src}/html/JavaScript.js +6 -1
- package/{src → dist/src}/html/__TESTS__/Generator.test.js +2 -0
- package/{src → dist/src}/html/index.js +1 -1
- package/{src → dist/src}/index +18 -8
- package/dist/src/logger/Console.d.ts +14 -0
- package/{src → dist/src}/logger/Console.js +12 -12
- package/dist/src/metadata/HTML.d.ts +6 -0
- package/dist/src/metadata/HTML.js +40 -0
- package/dist/src/metadata/Markdown.d.ts +6 -0
- package/dist/src/metadata/Markdown.js +42 -0
- package/dist/src/metadata/ResponseTime.d.ts +6 -0
- package/dist/src/metadata/ResponseTime.js +39 -0
- package/dist/src/metadata/index.d.ts +6 -0
- package/dist/src/metadata/index.js +56 -0
- package/{src → dist/src}/request/NodeFetch.d.ts +2 -0
- package/{src → dist/src}/request/NodeFetch.js +26 -7
- package/{src → dist/src}/request/Request.d.ts +2 -0
- package/dist/src/request/cache/BlackHoleCache.d.ts +7 -0
- package/{src → dist/src}/request/cache/BlackHoleCache.js +4 -3
- package/{src → dist/src}/request/cache/UnlimitedCache.d.ts +1 -2
- package/{src → dist/src}/request/cache/UnlimitedCache.js +2 -0
- package/dist/src/request/index.js +11 -0
- package/{src → dist/src}/security/HTTPS.js +19 -0
- package/dist/src/security/Redirect.d.ts +6 -0
- package/dist/src/security/Redirect.js +51 -0
- package/{src → dist/src}/security/__TESTS__/ContentSecurityPolicy.test.js +2 -0
- package/{src → dist/src}/security/__TESTS__/FingerPrint.test.js +2 -0
- package/{src → dist/src}/security/__TESTS__/HSTS.test.js +3 -0
- package/{src → dist/src}/security/__TESTS__/HTTPS.test.js +3 -0
- package/{src → dist/src}/security/__TESTS__/XFrameOptions.test.js +2 -0
- package/{src → dist/src}/security/__TESTS__/XXSSProtection.test.js +2 -0
- package/{src → dist/src}/security/index.js +5 -7
- package/{src → dist/src}/seo/Heading.js +1 -1
- package/{src → dist/src}/seo/Title.js +1 -1
- package/{src → dist/src}/seo/index.js +1 -1
- package/{src → dist/src}/wordpress/Generator.js +2 -1
- package/{src → dist/src}/wordpress/index.js +1 -1
- package/package.json +60 -59
- package/src/functions/findEvery.d.ts +0 -2
- package/src/functions/getGenerator.d.ts +0 -2
- package/src/functions/getObject.d.ts +0 -2
- package/src/logger/Console.d.ts +0 -14
- package/src/request/cache/BlackHoleCache.d.ts +0 -8
- package/src/request/cache/Cache.d.ts +0 -6
- package/src/request/cache/Cache.js +0 -2
- package/src/request/index.js +0 -7
- package/src/types/Sitemap.d.ts +0 -9
- package/src/types/Sitemap.js +0 -0
- /package/{README.md → dist/README.md} +0 -0
- /package/{src → dist/src}/config.d.ts +0 -0
- /package/{src → dist/src}/config.js +0 -0
- /package/{src → dist/src}/dns/A.d.ts +0 -0
- /package/{src → dist/src}/dns/DMARC.d.ts +0 -0
- /package/{src → dist/src}/dns/NS.d.ts +0 -0
- /package/{src → dist/src}/dns/RegistrationDate.d.ts +0 -0
- /package/{src → dist/src}/dns/index.d.ts +0 -0
- /package/{src → dist/src}/functions/findEvery.js +0 -0
- /package/{src → dist/src}/functions/getAnchors.d.ts +0 -0
- /package/{src → dist/src}/functions/getAnchors.js +0 -0
- /package/{src → dist/src}/functions/getDomain.d.ts +0 -0
- /package/{src → dist/src}/functions/getDomain.js +0 -0
- /package/{src → dist/src}/functions/getDuplicates.d.ts +0 -0
- /package/{src → dist/src}/functions/getHeading.d.ts +0 -0
- /package/{src → dist/src}/functions/getImages.d.ts +0 -0
- /package/{src → dist/src}/functions/getObject.js +0 -0
- /package/{src → dist/src}/functions/getScripts.d.ts +0 -0
- /package/{src → dist/src}/functions/getStylesheets.d.ts +0 -0
- /package/{src → dist/src}/functions/getTitle.d.ts +0 -0
- /package/{src → dist/src}/functions/index.d.ts +0 -0
- /package/{src → dist/src}/functions/index.js +0 -0
- /package/{src → dist/src}/functions/parseHtml.d.ts +0 -0
- /package/{src → dist/src}/functions/parseSitemap.d.ts +0 -0
- /package/{src → dist/src}/functions/parseXml.d.ts +0 -0
- /package/{src → dist/src}/html/Anchor.d.ts +0 -0
- /package/{src → dist/src}/html/CSS.d.ts +0 -0
- /package/{src → dist/src}/html/DuplicateId.d.ts +0 -0
- /package/{src → dist/src}/html/DuplicateId.js +0 -0
- /package/{src → dist/src}/html/Generator.d.ts +0 -0
- /package/{src → dist/src}/html/Generator.js +0 -0
- /package/{src → dist/src}/html/Image.d.ts +0 -0
- /package/{src → dist/src}/html/JavaScript.d.ts +0 -0
- /package/{src → dist/src}/html/__TESTS__/Generator.test.d.ts +0 -0
- /package/{src → dist/src}/html/index.d.ts +0 -0
- /package/{src → dist/src}/index.d.ts +0 -0
- /package/{src → dist/src}/logger/Logger.d.ts +0 -0
- /package/{src → dist/src}/logger/Logger.js +0 -0
- /package/{src → dist/src}/logger/index.d.ts +0 -0
- /package/{src → dist/src}/logger/index.js +0 -0
- /package/{src → dist/src}/report/CommandLine.d.ts +0 -0
- /package/{src → dist/src}/report/CommandLine.js +0 -0
- /package/{src → dist/src}/report/Json.d.ts +0 -0
- /package/{src → dist/src}/report/Json.js +0 -0
- /package/{src → dist/src}/report/Report.d.ts +0 -0
- /package/{src → dist/src}/report/Report.js +0 -0
- /package/{src → dist/src}/report/Symbols.d.ts +0 -0
- /package/{src → dist/src}/report/Symbols.js +0 -0
- /package/{src → dist/src}/report/index.d.ts +0 -0
- /package/{src → dist/src}/report/index.js +0 -0
- /package/{src → dist/src}/request/Request.js +0 -0
- /package/{src → dist/src}/request/index.d.ts +0 -0
- /package/{src → dist/src}/security/ContentEncoding.d.ts +0 -0
- /package/{src → dist/src}/security/ContentEncoding.js +0 -0
- /package/{src → dist/src}/security/ContentSecurityPolicy.d.ts +0 -0
- /package/{src → dist/src}/security/ContentSecurityPolicy.js +0 -0
- /package/{src → dist/src}/security/Cookies.d.ts +0 -0
- /package/{src → dist/src}/security/Cookies.js +0 -0
- /package/{src → dist/src}/security/FingerPrint.d.ts +0 -0
- /package/{src → dist/src}/security/FingerPrint.js +0 -0
- /package/{src → dist/src}/security/GoogleWebRisk.d.ts +0 -0
- /package/{src → dist/src}/security/GoogleWebRisk.js +0 -0
- /package/{src → dist/src}/security/HSTS.d.ts +0 -0
- /package/{src → dist/src}/security/HSTS.js +0 -0
- /package/{src → dist/src}/security/HTTPS.d.ts +0 -0
- /package/{src → dist/src}/security/HTTPVersion.d.ts +0 -0
- /package/{src → dist/src}/security/HTTPVersion.js +0 -0
- /package/{src → dist/src}/security/PermissionsPolicy.d.ts +0 -0
- /package/{src → dist/src}/security/PermissionsPolicy.js +0 -0
- /package/{src → dist/src}/security/ReferrerPolicy.d.ts +0 -0
- /package/{src → dist/src}/security/ReferrerPolicy.js +0 -0
- /package/{src → dist/src}/security/RobotsTXT.d.ts +0 -0
- /package/{src → dist/src}/security/RobotsTXT.js +0 -0
- /package/{src → dist/src}/security/SSL.d.ts +0 -0
- /package/{src → dist/src}/security/SSL.js +0 -0
- /package/{src → dist/src}/security/XFrameOptions.d.ts +0 -0
- /package/{src → dist/src}/security/XFrameOptions.js +0 -0
- /package/{src → dist/src}/security/XXSSProtection.d.ts +0 -0
- /package/{src → dist/src}/security/XXSSProtection.js +0 -0
- /package/{src → dist/src}/security/__TESTS__/ContentSecurityPolicy.test.d.ts +0 -0
- /package/{src → dist/src}/security/__TESTS__/FingerPrint.test.d.ts +0 -0
- /package/{src → dist/src}/security/__TESTS__/HSTS.test.d.ts +0 -0
- /package/{src → dist/src}/security/__TESTS__/HTTPS.test.d.ts +0 -0
- /package/{src → dist/src}/security/__TESTS__/XFrameOptions.test.d.ts +0 -0
- /package/{src → dist/src}/security/__TESTS__/XXSSProtection.test.d.ts +0 -0
- /package/{src → dist/src}/security/index.d.ts +0 -0
- /package/{src → dist/src}/seo/Heading.d.ts +0 -0
- /package/{src → dist/src}/seo/Robots.d.ts +0 -0
- /package/{src → dist/src}/seo/Robots.js +0 -0
- /package/{src → dist/src}/seo/Sitemap.d.ts +0 -0
- /package/{src → dist/src}/seo/Sitemap.js +0 -0
- /package/{src → dist/src}/seo/Title.d.ts +0 -0
- /package/{src → dist/src}/seo/index.d.ts +0 -0
- /package/{src → dist/src}/wordpress/DefaultFiles.d.ts +0 -0
- /package/{src → dist/src}/wordpress/DefaultFiles.js +0 -0
- /package/{src → dist/src}/wordpress/Generator.d.ts +0 -0
- /package/{src → dist/src}/wordpress/index.d.ts +0 -0
|
@@ -8,42 +8,42 @@ class Console {
|
|
|
8
8
|
constructor() {
|
|
9
9
|
this.levels = ['ALL', 'DEBUG', 'VERBOSE', 'INFO', 'WARNING', 'ERROR', 'NONE'];
|
|
10
10
|
}
|
|
11
|
-
debug(message) {
|
|
11
|
+
debug(message, ...args) {
|
|
12
12
|
if (this.levels.indexOf(config_1.default.logger.level) > 1) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
console.log(message);
|
|
15
|
+
console.log(message, ...args);
|
|
16
16
|
}
|
|
17
|
-
verbose(message) {
|
|
17
|
+
verbose(message, ...args) {
|
|
18
18
|
if (this.levels.indexOf(config_1.default.logger.level) > 2) {
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
|
-
console.log(message);
|
|
21
|
+
console.log(message, ...args);
|
|
22
22
|
}
|
|
23
|
-
info(message) {
|
|
23
|
+
info(message, ...args) {
|
|
24
24
|
if (this.levels.indexOf(config_1.default.logger.level) > 3) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
console.log(message);
|
|
27
|
+
console.log(message, ...args);
|
|
28
28
|
}
|
|
29
|
-
warning(message) {
|
|
29
|
+
warning(message, ...args) {
|
|
30
30
|
if (this.levels.indexOf(config_1.default.logger.level) > 4) {
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
console.warn(message);
|
|
33
|
+
console.warn(message, ...args);
|
|
34
34
|
}
|
|
35
|
-
error(message) {
|
|
35
|
+
error(message, ...args) {
|
|
36
36
|
if (this.levels.indexOf(config_1.default.logger.level) > 5) {
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
|
-
console.error(message);
|
|
39
|
+
console.error(message, ...args);
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* What a terrible failure
|
|
43
43
|
* @param message
|
|
44
44
|
*/
|
|
45
|
-
wtf(message) {
|
|
46
|
-
console.error(message);
|
|
45
|
+
wtf(message, ...args) {
|
|
46
|
+
console.error(message, ...args);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
exports.default = Console;
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const Test_1 = __importDefault(require("../Test"));
|
|
16
|
+
const request_1 = __importDefault(require("../request"));
|
|
17
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
18
|
+
class HTML extends Test_1.default {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.name = 'HTML';
|
|
22
|
+
}
|
|
23
|
+
test(_a) {
|
|
24
|
+
return __awaiter(this, arguments, void 0, function* ({ url }) {
|
|
25
|
+
logger_1.default.info(`Starting ${this.constructor.name} test...`);
|
|
26
|
+
const response = yield request_1.default.get(url);
|
|
27
|
+
const html = response.body;
|
|
28
|
+
return {
|
|
29
|
+
status: 'SUCCESS',
|
|
30
|
+
title: this.constructor.name,
|
|
31
|
+
description: '',
|
|
32
|
+
metadata: {
|
|
33
|
+
html,
|
|
34
|
+
},
|
|
35
|
+
results: [],
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.default = HTML;
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const node_html_markdown_1 = require("node-html-markdown");
|
|
16
|
+
const Test_1 = __importDefault(require("../Test"));
|
|
17
|
+
const request_1 = __importDefault(require("../request"));
|
|
18
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
19
|
+
class Markdown extends Test_1.default {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.name = 'Markdown';
|
|
23
|
+
}
|
|
24
|
+
test(_a) {
|
|
25
|
+
return __awaiter(this, arguments, void 0, function* ({ url }) {
|
|
26
|
+
logger_1.default.info(`Starting ${this.constructor.name} test...`);
|
|
27
|
+
const response = yield request_1.default.get(url);
|
|
28
|
+
const html = response.body;
|
|
29
|
+
const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html);
|
|
30
|
+
return {
|
|
31
|
+
status: 'SUCCESS',
|
|
32
|
+
title: this.constructor.name,
|
|
33
|
+
description: '',
|
|
34
|
+
metadata: {
|
|
35
|
+
markdown,
|
|
36
|
+
},
|
|
37
|
+
results: [],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.default = Markdown;
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const Test_1 = __importDefault(require("../Test"));
|
|
16
|
+
const request_1 = __importDefault(require("../request"));
|
|
17
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
18
|
+
class ResponseTime extends Test_1.default {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.name = 'ResponseTime';
|
|
22
|
+
}
|
|
23
|
+
test(_a) {
|
|
24
|
+
return __awaiter(this, arguments, void 0, function* ({ url }) {
|
|
25
|
+
logger_1.default.info(`Starting ${this.constructor.name} test...`);
|
|
26
|
+
const response = yield request_1.default.get(url);
|
|
27
|
+
return {
|
|
28
|
+
status: 'SUCCESS',
|
|
29
|
+
title: this.constructor.name,
|
|
30
|
+
description: '',
|
|
31
|
+
metadata: {
|
|
32
|
+
duration: response.duration,
|
|
33
|
+
},
|
|
34
|
+
results: [],
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = ResponseTime;
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const Test_1 = __importDefault(require("../Test"));
|
|
16
|
+
const HTML_1 = __importDefault(require("./HTML"));
|
|
17
|
+
const Markdown_1 = __importDefault(require("./Markdown"));
|
|
18
|
+
const ResponseTime_1 = __importDefault(require("./ResponseTime"));
|
|
19
|
+
class Metadata extends Test_1.default {
|
|
20
|
+
constructor() {
|
|
21
|
+
super();
|
|
22
|
+
this.name = 'Metadata';
|
|
23
|
+
this.tests = [
|
|
24
|
+
new HTML_1.default(),
|
|
25
|
+
new Markdown_1.default(),
|
|
26
|
+
new ResponseTime_1.default(),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
test(params) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
const tests = this.getTests();
|
|
32
|
+
const results = [];
|
|
33
|
+
for (const test of tests) {
|
|
34
|
+
let result = null;
|
|
35
|
+
try {
|
|
36
|
+
result = yield test.run(params);
|
|
37
|
+
}
|
|
38
|
+
catch (_a) {
|
|
39
|
+
result = {
|
|
40
|
+
status: 'ERROR',
|
|
41
|
+
title: test.name,
|
|
42
|
+
description: 'Test failed or cannot be run!',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
results.push(result);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
status: this.getStatus(results.map(result => result.status)),
|
|
49
|
+
title: this.name,
|
|
50
|
+
description: '',
|
|
51
|
+
results,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.default = Metadata;
|
|
@@ -12,29 +12,46 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
16
15
|
const config_1 = __importDefault(require("../config"));
|
|
17
16
|
const getHeaders = (headers) => {
|
|
18
17
|
const keyValues = {};
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
keyValues[header] =
|
|
18
|
+
headers.forEach((value, header) => {
|
|
19
|
+
if (value.length === 1 && header !== 'set-cookie') {
|
|
20
|
+
keyValues[header] = value[0];
|
|
22
21
|
}
|
|
23
22
|
else {
|
|
24
|
-
keyValues[header] =
|
|
23
|
+
keyValues[header] = value;
|
|
25
24
|
}
|
|
26
25
|
});
|
|
27
26
|
return keyValues;
|
|
28
27
|
};
|
|
29
28
|
class NodeFetch {
|
|
29
|
+
constructor(cache) {
|
|
30
|
+
this.cache = cache;
|
|
31
|
+
}
|
|
30
32
|
get(url, options) {
|
|
31
33
|
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
if (this.cache.has(url)) {
|
|
35
|
+
return this.cache.get(url);
|
|
36
|
+
}
|
|
32
37
|
const defaultOptions = config_1.default.request.options;
|
|
33
|
-
const
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
const response = yield fetch(url, Object.assign(Object.assign({}, defaultOptions), options));
|
|
40
|
+
const endTime = Date.now();
|
|
34
41
|
const body = yield response.text();
|
|
35
42
|
const statusCode = response.status;
|
|
36
43
|
const statusText = response.statusText;
|
|
37
|
-
const headers = getHeaders(response.headers
|
|
44
|
+
const headers = getHeaders(response.headers);
|
|
45
|
+
this.cache.add(url, {
|
|
46
|
+
response,
|
|
47
|
+
statusCode,
|
|
48
|
+
statusText,
|
|
49
|
+
headers,
|
|
50
|
+
body,
|
|
51
|
+
url,
|
|
52
|
+
finalUrl: response.url,
|
|
53
|
+
duration: (endTime - startTime) / 1000,
|
|
54
|
+
});
|
|
38
55
|
return {
|
|
39
56
|
response,
|
|
40
57
|
statusCode,
|
|
@@ -42,6 +59,8 @@ class NodeFetch {
|
|
|
42
59
|
headers,
|
|
43
60
|
body,
|
|
44
61
|
url,
|
|
62
|
+
finalUrl: response.url,
|
|
63
|
+
duration: (endTime - startTime) / 1000,
|
|
45
64
|
};
|
|
46
65
|
});
|
|
47
66
|
}
|
|
@@ -5,11 +5,13 @@ export type Options = {
|
|
|
5
5
|
};
|
|
6
6
|
export type Response = {
|
|
7
7
|
url: string;
|
|
8
|
+
finalUrl: string;
|
|
8
9
|
body: string;
|
|
9
10
|
statusCode: number;
|
|
10
11
|
statusText: string;
|
|
11
12
|
headers: any;
|
|
12
13
|
response: any;
|
|
14
|
+
duration: number;
|
|
13
15
|
};
|
|
14
16
|
export default interface Request {
|
|
15
17
|
get(url: string, options?: Options): Promise<Response>;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
class BlackHoleCache {
|
|
4
|
-
add(
|
|
4
|
+
add() {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
has(
|
|
7
|
+
has() {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
11
|
+
get() {
|
|
11
12
|
return null;
|
|
12
13
|
}
|
|
13
14
|
clear() {
|
|
@@ -4,12 +4,14 @@ class UnlimitedCache {
|
|
|
4
4
|
constructor() {
|
|
5
5
|
this.requests = {};
|
|
6
6
|
}
|
|
7
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
7
8
|
add(url, response) {
|
|
8
9
|
this.requests[url] = response;
|
|
9
10
|
}
|
|
10
11
|
has(url) {
|
|
11
12
|
return Object.prototype.hasOwnProperty.call(this.requests, url);
|
|
12
13
|
}
|
|
14
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
13
15
|
get(url) {
|
|
14
16
|
if (!this.has(url)) {
|
|
15
17
|
return null;
|
|
@@ -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
|
+
const NodeFetch_1 = __importDefault(require("./NodeFetch"));
|
|
7
|
+
const UnlimitedCache_1 = __importDefault(require("./cache/UnlimitedCache"));
|
|
8
|
+
const BlackHoleCache_1 = __importDefault(require("./cache/BlackHoleCache"));
|
|
9
|
+
const config_1 = __importDefault(require("../config"));
|
|
10
|
+
const cache = config_1.default.request.cache.type === 'UNLIMITED' ? new UnlimitedCache_1.default() : new BlackHoleCache_1.default();
|
|
11
|
+
exports.default = new NodeFetch_1.default(cache);
|
|
@@ -38,11 +38,18 @@ class HTTPS extends Test_1.default {
|
|
|
38
38
|
return __awaiter(this, arguments, void 0, function* ({ url }) {
|
|
39
39
|
logger_1.default.info('Starting HTTPS test...');
|
|
40
40
|
const unsecureUrl = this.toHttp(url);
|
|
41
|
+
logger_1.default.debug('Unsecure URL', unsecureUrl);
|
|
41
42
|
const response = yield request_1.default.get(unsecureUrl, { redirect: 'manual' });
|
|
43
|
+
logger_1.default.debug('Response', { statusCode: response.statusCode, headers: response.headers });
|
|
42
44
|
if (!this.isRedirect(response)) {
|
|
43
45
|
return {
|
|
44
46
|
status: 'ERROR',
|
|
45
47
|
title: 'HTTPS',
|
|
48
|
+
metadata: {
|
|
49
|
+
statusCode: response.statusCode,
|
|
50
|
+
unsecureUrl,
|
|
51
|
+
finalUrl: response.finalUrl,
|
|
52
|
+
},
|
|
46
53
|
description: `Request to not secure url returned ${response.statusCode}!`,
|
|
47
54
|
};
|
|
48
55
|
}
|
|
@@ -50,19 +57,31 @@ class HTTPS extends Test_1.default {
|
|
|
50
57
|
return {
|
|
51
58
|
status: 'ERROR',
|
|
52
59
|
title: 'HTTPS',
|
|
60
|
+
metadata: {
|
|
61
|
+
statusCode: response.statusCode,
|
|
62
|
+
unsecureUrl,
|
|
63
|
+
finalUrl: response.finalUrl,
|
|
64
|
+
},
|
|
53
65
|
description: `Request to not secure url returned non-secure redirect url ${response.headers.location}!`,
|
|
54
66
|
};
|
|
55
67
|
}
|
|
56
68
|
return {
|
|
57
69
|
status: 'SUCCESS',
|
|
58
70
|
title: 'HTTPS',
|
|
71
|
+
metadata: {
|
|
72
|
+
statusCode: response.statusCode,
|
|
73
|
+
unsecureUrl,
|
|
74
|
+
finalUrl: response.finalUrl,
|
|
75
|
+
},
|
|
59
76
|
description: `Request to not secure url responded with status code ${response.statusCode} and redirect url ${response.headers.location}.`,
|
|
60
77
|
};
|
|
61
78
|
});
|
|
62
79
|
}
|
|
80
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
63
81
|
isRedirect(response) {
|
|
64
82
|
return Math.floor(response.statusCode / 100) === 3 && 'location' in response.headers;
|
|
65
83
|
}
|
|
84
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
66
85
|
isRedirectSecure(response) {
|
|
67
86
|
return response.headers.location.startsWith('https');
|
|
68
87
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const Test_1 = __importDefault(require("../Test"));
|
|
16
|
+
const request_1 = __importDefault(require("../request"));
|
|
17
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
18
|
+
class Redirect extends Test_1.default {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.name = 'Redirect';
|
|
22
|
+
}
|
|
23
|
+
test(_a) {
|
|
24
|
+
return __awaiter(this, arguments, void 0, function* ({ url }) {
|
|
25
|
+
logger_1.default.info('Starting Redirect test...');
|
|
26
|
+
const response = yield request_1.default.get(url, { redirect: 'follow' });
|
|
27
|
+
if (response.response.redirected) {
|
|
28
|
+
const originalUrl = new URL(url);
|
|
29
|
+
const finalUrl = new URL(response.response.url);
|
|
30
|
+
if (originalUrl.hostname !== finalUrl.hostname) {
|
|
31
|
+
return {
|
|
32
|
+
status: 'ERROR',
|
|
33
|
+
title: this.name,
|
|
34
|
+
description: 'URL redirects to different hostname!',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
status: 'SUCCESS',
|
|
39
|
+
title: this.name,
|
|
40
|
+
description: 'Request was redirected but to the same hostname.',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
status: 'SUCCESS',
|
|
45
|
+
title: this.name,
|
|
46
|
+
description: 'Request was not redirected.',
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.default = Redirect;
|
|
@@ -16,6 +16,7 @@ const ContentSecurityPolicy_1 = __importDefault(require("../ContentSecurityPolic
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('Content-Security-Policy test with correct header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const pentest = new ContentSecurityPolicy_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -31,6 +32,7 @@ test('Content-Security-Policy test with correct header', () => __awaiter(void 0,
|
|
|
31
32
|
}));
|
|
32
33
|
test('Content-Security-Policy test with missing Content-Security-Policy header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
34
|
const pentest = new ContentSecurityPolicy_1.default();
|
|
35
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
34
36
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
37
|
return new Promise((resolve) => {
|
|
36
38
|
resolve({
|
|
@@ -16,6 +16,7 @@ const FingerPrint_1 = __importDefault(require("../FingerPrint"));
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('FingerPrint test without any finger print header present', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const fingerPrint = new FingerPrint_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -31,6 +32,7 @@ test('FingerPrint test without any finger print header present', () => __awaiter
|
|
|
31
32
|
}));
|
|
32
33
|
test('FingerPrint test with finger print header present', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
34
|
const fingerPrint = new FingerPrint_1.default();
|
|
35
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
34
36
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
37
|
return new Promise((resolve) => {
|
|
36
38
|
resolve({
|
|
@@ -16,6 +16,7 @@ const HSTS_1 = __importDefault(require("../HSTS"));
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('HSTS test with correct header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const hsts = new HSTS_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -31,6 +32,7 @@ test('HSTS test with correct header', () => __awaiter(void 0, void 0, void 0, fu
|
|
|
31
32
|
}));
|
|
32
33
|
test('HSTS test with low max age value', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
34
|
const hsts = new HSTS_1.default();
|
|
35
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
34
36
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
37
|
return new Promise((resolve) => {
|
|
36
38
|
resolve({
|
|
@@ -46,6 +48,7 @@ test('HSTS test with low max age value', () => __awaiter(void 0, void 0, void 0,
|
|
|
46
48
|
}));
|
|
47
49
|
test('HSTS test with missing HSTS header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
50
|
const hsts = new HSTS_1.default();
|
|
51
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
49
52
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
53
|
return new Promise((resolve) => {
|
|
51
54
|
resolve({
|
|
@@ -16,6 +16,7 @@ const HTTPS_1 = __importDefault(require("../HTTPS"));
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('HTTPS test with correct statusCode and location header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const https = new HTTPS_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -32,6 +33,7 @@ test('HTTPS test with correct statusCode and location header', () => __awaiter(v
|
|
|
32
33
|
}));
|
|
33
34
|
test('HTTPS test with wrong statusCode', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
35
|
const https = new HTTPS_1.default();
|
|
36
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
35
37
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
38
|
return new Promise((resolve) => {
|
|
37
39
|
resolve({
|
|
@@ -46,6 +48,7 @@ test('HTTPS test with wrong statusCode', () => __awaiter(void 0, void 0, void 0,
|
|
|
46
48
|
}));
|
|
47
49
|
test('HTTPS test with correct statusCode but wrong redirect location', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
50
|
const https = new HTTPS_1.default();
|
|
51
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
49
52
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
53
|
return new Promise((resolve) => {
|
|
51
54
|
resolve({
|
|
@@ -16,6 +16,7 @@ const XFrameOptions_1 = __importDefault(require("../XFrameOptions"));
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('X-Frame-Options test with correct header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const pentest = new XFrameOptions_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -31,6 +32,7 @@ test('X-Frame-Options test with correct header', () => __awaiter(void 0, void 0,
|
|
|
31
32
|
}));
|
|
32
33
|
test('X-Frame-Options test with missing X-Frame-Options header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
34
|
const pentest = new XFrameOptions_1.default();
|
|
35
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
34
36
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
37
|
return new Promise((resolve) => {
|
|
36
38
|
resolve({
|
|
@@ -16,6 +16,7 @@ const XXSSProtection_1 = __importDefault(require("../XXSSProtection"));
|
|
|
16
16
|
const request_1 = __importDefault(require("../../request"));
|
|
17
17
|
test('X-XSS-Protection test with correct header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
const pentest = new XXSSProtection_1.default();
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
19
20
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
return new Promise((resolve) => {
|
|
21
22
|
resolve({
|
|
@@ -31,6 +32,7 @@ test('X-XSS-Protection test with correct header', () => __awaiter(void 0, void 0
|
|
|
31
32
|
}));
|
|
32
33
|
test('X-XSS-Protection test with missing X-XSS-Protection header', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
34
|
const pentest = new XXSSProtection_1.default();
|
|
35
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
34
36
|
const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
37
|
return new Promise((resolve) => {
|
|
36
38
|
resolve({
|