From 4d32668b2ba7d36c4f29b4be569d026c79f55c96 Mon Sep 17 00:00:00 2001
From: Cyril Danilevski <cyril.danilevski@xfel.eu>
Date: Wed, 26 Feb 2025 11:51:33 +0100
Subject: [PATCH] Handle invalid mpod responses in REST API

---
 mpod.cpp | 5 +++++
 rest.cpp | 9 +++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/mpod.cpp b/mpod.cpp
index 08e79ea..4ceb264 100644
--- a/mpod.cpp
+++ b/mpod.cpp
@@ -142,6 +142,11 @@ bool MPOD::message(const SNMP::Message *message) {
         // that far.
         const char *channel = strrchr(varbind->getName(), '.') + 1;
         _channel = atoi(channel);
+
+        // MPOD SNMP channel 0 does not exist (starts from 1; U0 is 1).
+        // Mark the channel as 0 if invalid data was received.
+        // This can be used later to validate a sent request.
+        _channel = found ? _channel : 0;
     }
     // Return true if nodes found, that means this is a valid response from MPOD
     return found;
diff --git a/rest.cpp b/rest.cpp
index 2f1b0ae..e4bbea1 100644
--- a/rest.cpp
+++ b/rest.cpp
@@ -161,7 +161,7 @@ void sendSNMP() {
 
     if (output != NONE && channel != 0) {
         setChannelStateAndWait(&ipAddr, channel, output);
-        success = true;  // validates input parameters, not MPOD status, reported separately
+        success = mpod.getChannel() ? true : false;
     }
 
     String http_msg = "{\n";
@@ -285,7 +285,12 @@ void pollMPODChannel() {
         delay(MPOD_UPDATE_LATENCY);
         snmp.loop();  // Force loop to update now
 
-        ret = mpod.toJSON();
+        if (mpod.getChannel()) {
+            ret = mpod.toJSON();
+        } else {
+            ret = "\"reason\": \"Invalid channel\"";
+            channel = 0;
+        }
     }
 
     String http_msg = "{\n";
-- 
GitLab