[Git][NTPsec/ntpsec][master] Fixes for searchrangelist, functions that use them, and tests

Ian Bruene gitlab at mg.gitlab.com
Sat Jul 22 00:26:03 UTC 2017


Ian Bruene pushed to branch master at NTPsec / ntpsec


Commits:
47e4bc6d by Ian Bruene at 2017-07-21T19:14:00-05:00
Fixes for searchrangelist, functions that use them, and tests

- - - - -


2 changed files:

- pylib/agentx.py
- tests/pylib/test_agentx.py


Changes:

=====================================
pylib/agentx.py
=====================================
--- a/pylib/agentx.py
+++ b/pylib/agentx.py
@@ -141,18 +141,23 @@ def decode_unregisterpdu(data, flags):
 def encode_getpdu_core(isnext, sID, tactID, pktID, oidranges, context=None):
     if isnext is True:
         pkttype = PDU_GET_NEXT
+        nullTerm = False
     else:
         pkttype = PDU_GET
+        nullTerm = True
     contextP, payload = encode_context(context)
-    payload += encode_searchrange_list(oidranges)
+    payload += encode_searchrange_list(oidranges, nullTerm)
     header = encode_pduheader(pkttype, False, False, False, contextP,
                               sID, tactID, pktID, len(payload))
     return header + payload
 
 
-def decode_getpdu_core(data, flags):
+def decode_getpdu_core(isnext, data, flags):
     context, data = decode_context(data, flags)
-    oidranges, data = decode_searchrange_list(data, flags)
+    if isnext is True:
+        oidranges = decode_searchrange_list(data, flags)
+    else:
+        oidranges, data = decode_searchrange_list_nullterm(data, flags)
     result = {"context": context, "oidranges": oidranges}
     return result
 
@@ -165,7 +170,12 @@ def encode_getnextpdu(sID, tactID, pktID, oidranges, context=None):
     return encode_getpdu_core(True, sID, tactID, pktID, oidranges, context)
 
 
-decode_getpdu = decode_getnextpdu = decode_getpdu_core
+def decode_getpdu(data, flags):
+    return decode_getpdu_core(False, data, flags)
+
+
+def decode_getnextpdu(data, flags):
+    return decode_getpdu_core(True, data, flags)
 
 
 def encode_getbulkpdu(sID, tactID, pktID, nonReps, maxReps,
@@ -183,7 +193,7 @@ def decode_getbulkpdu(data, flags):
     context, data = decode_context(data, flags)
     temp, data = slicedata(data, 4)
     nonReps, maxReps = struct.unpack(endianToken + "HH", temp)
-    oidranges, data = decode_searchrange_list(data, flags)
+    oidranges = decode_searchrange_list(data, flags)
     result = {"context": context, "non_reps": nonReps, "max_reps": maxReps,
               "oidranges": oidranges}
     return result
@@ -503,23 +513,32 @@ def decode_searchrange(data, flags):
     return result, data
 
 
-def encode_searchrange_list(oidranges):
+def encode_searchrange_list(oidranges, nullTerminate=False):
     encoded = []
     for oran in oidranges:
         encoded.append(encode_searchrange(*oran))
-    encoded.append(encode_oid(tuple(), False))
+    if nullTerminate:
+        encoded.append(encode_oid(tuple(), False))
     encoded = "".join(encoded)
     return encoded
 
 
-def decode_searchrange_list(data, flags, expectNullTerm=False):
+def decode_searchrange_list(data, flags):  # Cannot handle extra data
+    oidranges = []
+    while len(data) > 0:
+        oids, data = decode_searchrange(data, flags)
+        oidranges.append(oids)
+    return tuple(oidranges)
+
+
+def decode_searchrange_list_nullterm(data, flags):
     oidranges = []
     while len(data) > 0:
         one, data = decode_oid(data, flags)
-        if (expectNullTerm is True) and isnullOID(one):
+        if isnullOID(one):
             break
         two, data = decode_oid(data, flags)
-        oidranges.append({"start": one, "end": two})  # oid, oid, inclusive
+        oidranges.append({"start": one, "end": two})
     return tuple(oidranges), data
 
 


=====================================
tests/pylib/test_agentx.py
=====================================
--- a/tests/pylib/test_agentx.py
+++ b/tests/pylib/test_agentx.py
@@ -416,22 +416,20 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
         self.assertEqual(f(1, 2, 3, ()),
                          "\x01\x06\x10\x00"
                          "\x00\x00\x00\x01\x00\x00\x00\x02"
-                         "\x00\x00\x00\x03\x00\x00\x00\x04"
-                         "\x00\x00\x00\x00")
+                         "\x00\x00\x00\x03\x00\x00\x00\x00")
         # Test basic
         self.assertEqual(f(1, 2, 3,
                            (((1, 2, 3), (1, 2, 5), False),
                             ((10, 20), (30, 40), True))),
                          "\x01\x06\x10\x00"
                          "\x00\x00\x00\x01\x00\x00\x00\x02"
-                         "\x00\x00\x00\x03\x00\x00\x00\x3C"
+                         "\x00\x00\x00\x03\x00\x00\x00\x38"
                          "\x03\x00\x00\x00\x00\x00\x00\x01"
                          "\x00\x00\x00\x02\x00\x00\x00\x03"
                          "\x03\x00\x00\x00\x00\x00\x00\x01"
                          "\x00\x00\x00\x02\x00\x00\x00\x05"
                          "\x02\x00\x01\x00\x00\x00\x00\x0A\x00\x00\x00\x14"
-                         "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28"
-                         "\x00\x00\x00\x00")
+                         "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28")
         # Test with context
         self.assertEqual(f(1, 2, 3,
                            (((1, 2, 3), (1, 2, 5), False),
@@ -439,21 +437,20 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            context="blah"),
                          "\x01\x06\x18\x00"
                          "\x00\x00\x00\x01\x00\x00\x00\x02"
-                         "\x00\x00\x00\x03\x00\x00\x00\x44"
+                         "\x00\x00\x00\x03\x00\x00\x00\x40"
                          "\x00\x00\x00\x04blah"
                          "\x03\x00\x00\x00\x00\x00\x00\x01"
                          "\x00\x00\x00\x02\x00\x00\x00\x03"
                          "\x03\x00\x00\x00\x00\x00\x00\x01"
                          "\x00\x00\x00\x02\x00\x00\x00\x05"
                          "\x02\x00\x01\x00\x00\x00\x00\x0A\x00\x00\x00\x14"
-                         "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28"
-                         "\x00\x00\x00\x00")
+                         "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28")
 
     def test_decode_getnextpdu(self):
         f = ntp.agentx.decode_getnextpdu
 
         # Test null
-        self.assertEqual(f("\x00\x00\x00\x00", standardFlags),
+        self.assertEqual(f("", standardFlags),
                          {"context": None,
                           "oidranges": ()})
         # Test basic
@@ -461,8 +458,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
             "\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03"
             "\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x05"
             "\x02\x00\x01\x00\x00\x00\x00\x0A\x00\x00\x00\x14"
-            "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28"
-            "\x00\x00\x00\x00", standardFlags),
+            "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28",
+            standardFlags),
                          {"context": None,
                           "oidranges": ({"start": {"subids": (1, 2, 3),
                                                    "include": False},
@@ -477,8 +474,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
             "\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00"
             "\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00"
             "\x02\x00\x01\x00\x0A\x00\x00\x00\x14\x00\x00\x00"
-            "\x02\x00\x00\x00\x1E\x00\x00\x00\x28\x00\x00\x00"
-            "\x00\x00\x00\x00", lilEndianFlags),
+            "\x02\x00\x00\x00\x1E\x00\x00\x00\x28\x00\x00\x00",
+            lilEndianFlags),
                          {"context": None,
                           "oidranges": ({"start": {"subids": (1, 2, 3),
                                                    "include": False},
@@ -495,8 +492,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            "\x03\x00\x00\x00\x00\x00\x00\x01"
                            "\x00\x00\x00\x02\x00\x00\x00\x05"
                            "\x02\x00\x01\x00\x00\x00\x00\x0A\x00\x00\x00\x14"
-                           "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28"
-                           "\x00\x00\x00\x00", contextFlags),
+                           "\x02\x00\x00\x00\x00\x00\x00\x1E\x00\x00\x00\x28",
+                           contextFlags),
                          {"context": "blah",
                           "oidranges": ({"start": {"subids": (1, 2, 3),
                                                    "include": False},
@@ -514,28 +511,28 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
         self.assertEqual(f(1, 2, 3, 1, 5,
                            (((1, 2), (3, 4), False),
                             ((6, 7), (8, 9), True))),
-                         "\x01\x07\x10\x00\x00\x00\x00\x01\x00\x00\x00\x02"
-                         "\x00\x00\x00\x03\x00\x00\x00\x38"
+                         "\x01\x07\x10\x00"
+                         "\x00\x00\x00\x01\x00\x00\x00\x02"
+                         "\x00\x00\x00\x03\x00\x00\x00\x34"
                          "\x00\x01\x00\x05"
                          "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                          "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                          "\x02\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x07"
-                         "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"
-                         "\x00\x00\x00\x00")
+                         "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09")
         # Test with context
         self.assertEqual(f(1, 2, 3, 1, 5,
                            (((1, 2), (3, 4), False),
                             ((6, 7), (8, 9), True)),
                            context="blah"),
-                         "\x01\x07\x18\x00\x00\x00\x00\x01\x00\x00\x00\x02"
-                         "\x00\x00\x00\x03\x00\x00\x00\x40"
+                         "\x01\x07\x18\x00"
+                         "\x00\x00\x00\x01\x00\x00\x00\x02"
+                         "\x00\x00\x00\x03\x00\x00\x00\x3C"
                          "\x00\x00\x00\x04blah"
                          "\x00\x01\x00\x05"
                          "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                          "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                          "\x02\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x07"
-                         "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"
-                         "\x00\x00\x00\x00")
+                         "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09")
 
     def test_decode_getbulkpdu(self):
         f = ntp.agentx.decode_getbulkpdu
@@ -545,8 +542,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                            "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                            "\x02\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x07"
-                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"
-                           "\x00\x00\x00\x00", standardFlags),
+                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09",
+                           standardFlags),
                          {"context": None, "non_reps": 1, "max_reps": 5,
                           "oidranges": ({"start": {"subids": (1, 2),
                                                    "include": False},
@@ -561,8 +558,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            "\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00"
                            "\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00"
                            "\x02\x00\x01\x00\x06\x00\x00\x00\x07\x00\x00\x00"
-                           "\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00"
-                           "\x00\x00\x00\x00", lilEndianFlags),
+                           "\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00",
+                           lilEndianFlags),
                          {"context": None, "non_reps": 1, "max_reps": 5,
                           "oidranges": ({"start": {"subids": (1, 2),
                                                    "include": False},
@@ -578,8 +575,8 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                            "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                            "\x02\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x07"
-                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"
-                           "\x00\x00\x00\x00", contextFlags),
+                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09",
+                           contextFlags),
                          {"context": "blah", "non_reps": 1, "max_reps": 5,
                           "oidranges": ({"start": {"subids": (1, 2),
                                                    "include": False},
@@ -1432,6 +1429,13 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                          "\x02\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                          "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                          "\x02\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03"
+                         "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04")
+        # Test, null terminated
+        self.assertEqual(f((((1, 2), (1, 2), True),
+                            ((2, 3), (3, 4), False)), nullTerminate=True),
+                         "\x02\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x02"
+                         "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
+                         "\x02\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03"
                          "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                          "\x00\x00\x00\x00")
 
@@ -1442,12 +1446,36 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
         self.assertEqual(f("\x02\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                            "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                            "\x02\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03"
+                           "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04",
+                           standardFlags),
+                         ({"start": {"subids": (1, 2), "include": True},
+                           "end": {"subids": (1, 2), "include": False}},
+                          {"start": {"subids": (2, 3), "include": False},
+                           "end": {"subids": (3, 4), "include": False}}))
+        # Test, little endian
+        self.assertEqual(f("\x02\x00\x01\x00\x01\x00\x00\x00\x02\x00\x00\x00"
+                           "\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00"
+                           "\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00"
+                           "\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00",
+                           lilEndianFlags),
+                         ({"start": {"subids": (1, 2), "include": True},
+                           "end": {"subids": (1, 2), "include": False}},
+                          {"start": {"subids": (2, 3), "include": False},
+                           "end": {"subids": (3, 4), "include": False}}))
+
+    def test_decode_searchrange_list_nullterm(self):
+        f = ntp.agentx.decode_searchrange_list_nullterm
+
+        # Test
+        self.assertEqual(f("\x02\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x02"
+                           "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
+                           "\x02\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03"
                            "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                            "\x00\x00\x00\x00" + extraData, standardFlags),
                          (({"start": {"subids": (1, 2), "include": True},
-                            "end": {"subids": (1, 2), "include": False}},
-                           {"start": {"subids": (2, 3), "include": False},
-                            "end": {"subids": (3, 4), "include": False}}),
+                           "end": {"subids": (1, 2), "include": False}},
+                          {"start": {"subids": (2, 3), "include": False},
+                           "end": {"subids": (3, 4), "include": False}}),
                           extraData))
         # Test, little endian
         self.assertEqual(f("\x02\x00\x01\x00\x01\x00\x00\x00\x02\x00\x00\x00"
@@ -1456,9 +1484,9 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                            "\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00"
                            "\x00\x00\x00\x00" + extraData, lilEndianFlags),
                          (({"start": {"subids": (1, 2), "include": True},
-                            "end": {"subids": (1, 2), "include": False}},
-                           {"start": {"subids": (2, 3), "include": False},
-                            "end": {"subids": (3, 4), "include": False}}),
+                           "end": {"subids": (1, 2), "include": False}},
+                          {"start": {"subids": (2, 3), "include": False},
+                           "end": {"subids": (3, 4), "include": False}}),
                           extraData))
 
     def test_encode_octetstr(self):
@@ -1778,6 +1806,24 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
                                             "include": False},
                                     "description": "foo"}},
                           ""))
+        # Test open, extraData
+        self.assertEqual(f("\x01\x01\x10\x00"
+                           "\x00\x00\x00\x0C\x00\x00\x00\x22"
+                           "\x00\x00\x00\x38\x00\x00\x00\x20"
+                           "\x4E\x00\x00\x00"
+                           "\x04\x00\x00\x00"
+                           "\x00\x00\x00\x01\x00\x00\x00\x02"
+                           "\x00\x00\x00\x03\x00\x00\x00\x04"
+                           "\x00\x00\x00\x03foo\x00" + extraData),
+                         ({"header": {"version": 1, "type": x.PDU_OPEN,
+                                      "flags": standardFlags, "session_id": 12,
+                                      "transaction_id": 34, "packet_id": 56,
+                                      "length": 32},
+                           "body": {"timeout": 78,
+                                    "oid": {"subids": (1, 2, 3, 4),
+                                            "include": False},
+                                    "description": "foo"}},
+                          extraData))
         # Test close
         self.assertEqual(f("\x01\x02\x10\x00"
                            "\x00\x00\x00\x01\x00\x00\x00\x02"
@@ -1837,28 +1883,26 @@ class TestNtpclientsNtpsnmpd(unittest.TestCase):
         # Test get next
         self.assertEqual(f("\x01\x06\x10\x00"
                            "\x00\x00\x00\x01\x00\x00\x00\x02"
-                           "\x00\x00\x00\x03\x00\x00\x00\x04"
-                           "\x00\x00\x00\x00"),
+                           "\x00\x00\x00\x03\x00\x00\x00\x00"),
                          ({"header": {"version": 1, "type": x.PDU_GET_NEXT,
                                       "flags": standardFlags, "session_id": 1,
                                       "transaction_id": 2, "packet_id": 3,
-                                      "length": 4},
+                                      "length": 0},
                            "body": {"context": None, "oidranges": ()}},
                           ""))
         # Test get bulk
         self.assertEqual(f("\x01\x07\x10\x00"
                            "\x00\x00\x00\x01\x00\x00\x00\x02"
-                           "\x00\x00\x00\x03\x00\x00\x00\x38"
+                           "\x00\x00\x00\x03\x00\x00\x00\x34"
                            "\x00\x01\x00\x05"
                            "\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02"
                            "\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04"
                            "\x02\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x07"
-                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"
-                           "\x00\x00\x00\x00"),
+                           "\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x09"),
                          ({"header": {"version": 1, "type": x.PDU_GET_BULK,
                                       "flags": standardFlags, "session_id": 1,
                                       "transaction_id": 2, "packet_id": 3,
-                                      "length": 56},
+                                      "length": 52},
                            "body": {"context": None, "non_reps": 1,
                                     "max_reps": 5,
                                     "oidranges": ({"start": {"subids": (1, 2),



View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/47e4bc6d417a2c560c8c4a83b9749970672a154c

---
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/47e4bc6d417a2c560c8c4a83b9749970672a154c
You're receiving this email because of your account on gitlab.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20170722/1e639811/attachment.html>


More information about the vc mailing list