]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#253,!147] Command interpreter now rejects unknown command parameters.
authorMarcin Siodelski <marcin@isc.org>
Thu, 29 Nov 2018 16:47:02 +0000 (17:47 +0100)
committerMarcin Siodelski <marcin@isc.org>
Tue, 4 Dec 2018 16:39:03 +0000 (11:39 -0500)
src/lib/cc/command_interpreter.cc
src/lib/cc/tests/command_interpreter_unittests.cc

index 214739d8a82a9fdbcbe0155c56ddf7422afa2274..6ee57af37dc1b0c5d071a2a17f1d5b53b3268289 100644 (file)
@@ -179,6 +179,17 @@ parseCommand(ConstElementPtr& arg, ConstElementPtr command) {
                   "Invalid answer specified, does not contain mandatory 'command'");
     }
 
+    // Make sure that all specified parameters are supported.
+    auto command_params = command->mapValue();
+    for (auto param : command_params) {
+        if ((param.first != CONTROL_COMMAND) &&
+            (param.first != CONTROL_ARGUMENTS) &&
+            (param.first != CONTROL_SERVICE)) {
+            isc_throw(CtrlChannelError, "Received command contains unsupported "
+                      "parameter '" << param.first << "'");
+        }
+    }
+
     ConstElementPtr cmd = command->get(CONTROL_COMMAND);
     if (cmd->getType() != Element::string) {
         isc_throw(CtrlChannelError,
index 7058e0ed77d4fef2fa23df2a6b95c728109da485..2f2b66119220009b473dda80f94b2480233b9100 100644 (file)
@@ -165,12 +165,16 @@ TEST(CommandInterpreterTest, parseCommand) {
     EXPECT_THROW(parseCommand(arg, el("{ \"command\": 1 }")), CtrlChannelError);
     EXPECT_THROW(parseCommand(arg, el("{ \"command\": [] }")), CtrlChannelError);
     EXPECT_THROW(parseCommand(arg, el("{ \"command\": [ 1 ] }")), CtrlChannelError);
+    EXPECT_THROW(parseCommand(arg, el("{ \"command\": \"my_command\", "
+                                      "\"unknown\": \"xyz\" }")), CtrlChannelError);
 
     cmd = parseCommand(arg, el("{ \"command\": \"my_command\" }"));
     EXPECT_EQ("my_command", cmd);
     EXPECT_FALSE(arg);
 
-    cmd = parseCommand(arg, el("{ \"command\": \"my_command\", \"arguments\": 1 }"));
+    // Include "service" to verify that it is not rejected.
+    cmd = parseCommand(arg, el("{ \"command\": \"my_command\", \"arguments\": 1, "
+                               "  \"service\": [ \"dhcp4\" ] }"));
     ASSERT_TRUE(arg);
     EXPECT_EQ("my_command", cmd);
     EXPECT_EQ("1", arg->str());
@@ -203,10 +207,17 @@ TEST(CommandInterpreterTest, parseCommandWithArgs) {
                                               "\"arguments\": { } }")),
                  CtrlChannelError);
 
+    // Command with unsupported parameter is rejected.
+    EXPECT_THROW(parseCommandWithArgs(arg, el("{ \"command\": \"my_command\", "
+                                              "  \"arguments\": { \"arg1\": \"value1\" }, "
+                                              "  \"unsupported\": 1 }")),
+                 CtrlChannelError);
+
+
     // Specifying arguments in non empty map should be successful.
     EXPECT_NO_THROW(
         cmd = parseCommandWithArgs(arg, el("{ \"command\": \"my_command\", "
-                                           "\"arguments\": { \"arg1\": \"value1\" } }"))
+                                           "  \"arguments\": { \"arg1\": \"value1\" } }"))
     );
     ASSERT_TRUE(arg);
     ASSERT_EQ(Element::map, arg->getType());
@@ -215,6 +226,13 @@ TEST(CommandInterpreterTest, parseCommandWithArgs) {
     ASSERT_EQ(Element::string, arg1->getType());
     EXPECT_EQ("value1", arg1->stringValue());
     EXPECT_EQ("my_command", cmd);
+
+    // The "service" parameter should be allowed.
+    EXPECT_NO_THROW(parseCommandWithArgs(arg, el("{ \"command\": \"my_command\", "
+                                                 "  \"service\": [ \"dhcp4\" ], "
+                                                 "  \"arguments\": { \"arg1\": \"value1\" } }"))
+    );
+
 }
 
 }