Add new config cwmp.skipWritableCheck
Some CPEs incorrectly report writable parameters as non-writable. This config option lets us bypass the check and attempt to modify the parameter even if it reported as read-only.
This commit is contained in:
1 parent
4fd919ccfa
commit
dfab724515
1 file changed
+23
-9
+23
-9
@@ -1734,20 +1734,35 @@ function generateSetRpcRequest(
|
|||||||
|
|
||||||
const deviceData = sessionContext.deviceData;
|
const deviceData = sessionContext.deviceData;
|
||||||
|
|
||||||
|
const SKIP_WRITABLE_CHECK = !!localCache.getConfig(
|
||||||
|
sessionContext.cacheSnapshot,
|
||||||
|
"cwmp.skipWritableCheck",
|
||||||
|
{},
|
||||||
|
sessionContext.timestamp,
|
||||||
|
(e) => configContextCallback(sessionContext, e)
|
||||||
|
);
|
||||||
|
|
||||||
|
const canWrite = (attrs: Attributes): boolean =>
|
||||||
|
SKIP_WRITABLE_CHECK || (attrs.writable && !!attrs.writable[1]);
|
||||||
|
|
||||||
// Delete instance
|
// Delete instance
|
||||||
for (const instances of syncState.instancesToDelete.values()) {
|
for (const instances of syncState.instancesToDelete.values()) {
|
||||||
const instance = instances.values().next().value;
|
for (const instance of instances) {
|
||||||
if (instance && sessionContext.deviceData.attributes.has(instance)) {
|
const attrs = sessionContext.deviceData.attributes.get(instance);
|
||||||
return {
|
if (attrs && canWrite(attrs)) {
|
||||||
name: "DeleteObject",
|
instances.delete(instance);
|
||||||
objectName: instance.toString() + ".",
|
return {
|
||||||
};
|
name: "DeleteObject",
|
||||||
|
objectName: instance.toString() + ".",
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create instance
|
// Create instance
|
||||||
for (const [param, instances] of syncState.instancesToCreate) {
|
for (const [param, instances] of syncState.instancesToCreate) {
|
||||||
if (sessionContext.deviceData.attributes.has(param)) {
|
const attrs = sessionContext.deviceData.attributes.get(param);
|
||||||
|
if (attrs && canWrite(attrs)) {
|
||||||
const instance = instances.values().next().value;
|
const instance = instances.values().next().value;
|
||||||
if (instance) {
|
if (instance) {
|
||||||
instances.delete(instance);
|
instances.delete(instance);
|
||||||
@@ -1791,7 +1806,7 @@ function generateSetRpcRequest(
|
|||||||
syncState.spv.delete(k);
|
syncState.spv.delete(k);
|
||||||
const attrs = sessionContext.deviceData.attributes.get(k);
|
const attrs = sessionContext.deviceData.attributes.get(k);
|
||||||
const curVal = attrs.value ? attrs.value[1] : null;
|
const curVal = attrs.value ? attrs.value[1] : null;
|
||||||
if (curVal && attrs.writable && attrs.writable[1]) {
|
if (curVal && canWrite(attrs)) {
|
||||||
const val = v.slice() as [string | number | boolean, string];
|
const val = v.slice() as [string | number | boolean, string];
|
||||||
if (!val[1]) val[1] = curVal[1];
|
if (!val[1]) val[1] = curVal[1];
|
||||||
device.sanitizeParameterValue(val);
|
device.sanitizeParameterValue(val);
|
||||||
@@ -2609,7 +2624,6 @@ export async function rpcResponse(
|
|||||||
timestamp + 1,
|
timestamp + 1,
|
||||||
{
|
{
|
||||||
object: [timestamp + 1, 0],
|
object: [timestamp + 1, 0],
|
||||||
writable: [timestamp + 1, 1],
|
|
||||||
value: [
|
value: [
|
||||||
timestamp + 1,
|
timestamp + 1,
|
||||||
p.slice(1) as [string | number | boolean, string],
|
p.slice(1) as [string | number | boolean, string],
|
||||||
|
|||||||
Reference in new issue
Block a user