Fixed #3520 Validate accepted status codes type (#3530)

* Fixed #3520 Validate accepted status codes type

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

* Avoid crash on invalid status code

Instead of failing on an invalid status code, log the error and skip to
next.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

---------

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
This commit is contained in:
Matthew Nickson 2023-08-07 21:22:32 +02:00 committed by GitHub
parent 2921f33c24
commit 71fca3f0c3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 2 deletions

View file

@ -641,6 +641,10 @@ let needSetup = false;
let notificationIDList = monitor.notificationIDList; let notificationIDList = monitor.notificationIDList;
delete monitor.notificationIDList; delete monitor.notificationIDList;
// Ensure status code ranges are strings
if (!monitor.accepted_statuscodes.every((code) => typeof code === "string")) {
throw new Error("Accepted status codes are not all strings");
}
monitor.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes); monitor.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes);
delete monitor.accepted_statuscodes; delete monitor.accepted_statuscodes;
@ -706,6 +710,11 @@ let needSetup = false;
removeGroupChildren = true; removeGroupChildren = true;
} }
// Ensure status code ranges are strings
if (!monitor.accepted_statuscodes.every((code) => typeof code === "string")) {
throw new Error("Accepted status codes are not all strings");
}
bean.name = monitor.name; bean.name = monitor.name;
bean.description = monitor.description; bean.description = monitor.description;
bean.parent = monitor.parent; bean.parent = monitor.parent;

View file

@ -720,7 +720,6 @@ exports.checkCertificate = function (res) {
* @param {number} status The status code to check * @param {number} status The status code to check
* @param {string[]} acceptedCodes An array of accepted status codes * @param {string[]} acceptedCodes An array of accepted status codes
* @returns {boolean} True if status code within range, false otherwise * @returns {boolean} True if status code within range, false otherwise
* @throws {Error} Will throw an error if the provided status code is not a valid range string or code string
*/ */
exports.checkStatusCode = function (status, acceptedCodes) { exports.checkStatusCode = function (status, acceptedCodes) {
if (acceptedCodes == null || acceptedCodes.length === 0) { if (acceptedCodes == null || acceptedCodes.length === 0) {
@ -728,6 +727,11 @@ exports.checkStatusCode = function (status, acceptedCodes) {
} }
for (const codeRange of acceptedCodes) { for (const codeRange of acceptedCodes) {
if (typeof codeRange !== "string") {
log.error("monitor", `Accepted status code not a string. ${codeRange} is of type ${typeof codeRange}`);
continue;
}
const codeRangeSplit = codeRange.split("-").map(string => parseInt(string)); const codeRangeSplit = codeRange.split("-").map(string => parseInt(string));
if (codeRangeSplit.length === 1) { if (codeRangeSplit.length === 1) {
if (status === codeRangeSplit[0]) { if (status === codeRangeSplit[0]) {
@ -738,7 +742,8 @@ exports.checkStatusCode = function (status, acceptedCodes) {
return true; return true;
} }
} else { } else {
throw new Error("Invalid status code range"); log.error("monitor", `${codeRange} is not a valid status code range`);
continue;
} }
} }