From 1a5fd65f4e95e76d56072b11216a8b51f1b5111f Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sat, 18 Mar 2017 22:20:17 -0700 Subject: [PATCH] Show warning when failing to parse attributes --- lib/cwmp.coffee | 8 +++++- lib/soap.js | 66 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/lib/cwmp.coffee b/lib/cwmp.coffee index ed2ce66..ac1dd17 100644 --- a/lib/cwmp.coffee +++ b/lib/cwmp.coffee @@ -603,9 +603,10 @@ listener = (httpRequest, httpResponse) -> stream.on('end', () -> rpc = null + parseWarnings = [] getSession(httpRequest, f = (err, sessionContext) -> return throwError(err, httpResponse) if err - rpc ?= soap.request(httpRequest, sessionContext?.cwmpVersion) + rpc ?= soap.request(httpRequest, sessionContext?.cwmpVersion, parseWarnings) if not sessionContext? if rpc.cpeRequest?.name isnt 'Inform' httpResponse.writeHead(400) @@ -645,6 +646,11 @@ listener = (httpRequest, httpResponse) -> sessionContext.httpRequest = httpRequest sessionContext.httpResponse = httpResponse + for w in parseWarnings + w.sessionContext = sessionContext + w.rpc = rpc; + logger.accessWarn(w) + if config.get('DEBUG', sessionContext.deviceId) dump = "# REQUEST #{new Date(Date.now())}\n" + JSON.stringify(httpRequest.headers) + "\n#{httpRequest.getBody()}\n\n" require('fs').appendFile("./debug/#{sessionContext.deviceId}.dump", dump, (err) -> diff --git a/lib/soap.js b/lib/soap.js index f8d181c..5674244 100644 --- a/lib/soap.js +++ b/lib/soap.js @@ -85,6 +85,8 @@ if (XML_IGNORE_NAMESPACE) { }; } +let warnings; + function parseBool(v) { v = "" + v; @@ -93,7 +95,7 @@ function parseBool(v) { else if (v === "false" || v === "FALSE" || v === "False" || v === "0") return false; else - throw new Error("Invalid boolean value"); + return null; } @@ -103,9 +105,21 @@ function event(xml) { function parameterInfoList(xml) { - return xml.find("ParameterInfoStruct").map( - e => [e.get("Name").text(), parseBool(e.get("Writable").text())] - ); + return xml.find("ParameterInfoStruct").map(function(e) { + let param = e.get("Name").text(); + let value = e.get("Writable").text(); + let parsed = parseBool(value); + + if (parsed === null) { + warnings.push({ + message: "Invalid writable attribute", + parameter: param + }); + parsed = false; + } + + return [param, parsed]; + }); } @@ -113,15 +127,41 @@ function parameterValueList(xml) { return xml.find("ParameterValueStruct").map(function(e) { const valueElement = e.get("Value"); const valueType = valueElement.attr("type").value(); + let param = e.get("Name").text(); let value = valueElement.text(); - if (valueType === "xsd:boolean") - value = parseBool(value); - else if (valueType === "xsd:int" || valueType === "xsd:unsignedInt") - value = parseInt(value); - else if (valueType === "xsd:dateTime") - value = Date.parse(value); + let parsed = value; + if (valueType === "xsd:boolean") { + parsed = parseBool(value); + if (parsed === null) { + warnings.push({ + message: "Invalid value attribute", + parameter: param + }); + parsed = value; + } + } + else if (valueType === "xsd:int" || valueType === "xsd:unsignedInt") { + parsed = parseInt(value); + if (isNaN(parsed)) { + warnings.push({ + message: "Invalid value attribute", + parameter: param + }); + parsed = value; + } + } + else if (valueType === "xsd:dateTime") { + parsed = Date.parse(value); + if (isNaN(parsed)) { + warnings.push({ + message: "Invalid value attribute", + parameter: param + }); + parsed = value; + } + } - return [e.get("Name").text(), value, valueType]; + return [param, value, valueType]; }); } @@ -367,7 +407,9 @@ function fault(xml, cwmpVersion) { } -function request(httpRequest, cwmpVersion) { +function request(httpRequest, cwmpVersion, warn) { + warnings = warn; + const rpc = { cwmpVersion: cwmpVersion };