]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
newCAFromRaw(): create ComboAddress from raw 4/16 byte strings, plus test 9474/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Wed, 16 Sep 2020 08:21:24 +0000 (10:21 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 18 Jun 2021 10:58:34 +0000 (12:58 +0200)
(code copied from dnsdist)

.github/actions/spell-check/expect.txt
docs/lua-records/reference/comboaddress.rst
pdns/lua-base4.cc
regression-tests.auth-py/test_LuaRecords.py

index e8045650af2edf9a869dc43e9866c9f3ddba245a..90441a70177d6be6bfa47e355e5e27953df9992b 100644 (file)
@@ -1365,6 +1365,7 @@ randomises
 randomloader
 rapidjson
 raspbian
+rawaddress
 rb
 RBL
 rcode
index 7d79eeec03a2896ce3bc06b7a029c8633386a0f6..719a9f25cb086454cb4df5c6ab9c831eea5fc1da 100644 (file)
@@ -19,6 +19,14 @@ Functions and methods of a ``ComboAddress``
 
     addr = newCA("1.2.3.4")
 
+.. function:: newCAFromRaw(rawaddress[, port]) -> ComboAddress
+
+  Returns a new :class:`ComboAddress` object based on the 4- or 16-octet string.
+  For example, ``newCAFromRaw('ABCD')`` makes a ``ComboAddress`` object holding the IP ``65.66.67.68``, because those are the ASCII values for those four letters.
+
+  :param string rawaddress: The IPv4 of IPv6 address as a 4/16 octet string
+  :param int port: The optional port number
+
 .. class:: ComboAddress
 
   A ``ComboAddress`` represents an IP address with possibly a port number.
index e00ac5cd2f05e3950f9365f6e4361b52d8014fe1..efbf71257a27edb4fb6db6e306c4728ae358326f 100644 (file)
@@ -125,6 +125,29 @@ void BaseLua4::prepareContext() {
     } );
 
   d_lw->writeFunction("newCA", [](const std::string& a) { return ComboAddress(a); });
+  d_lw->writeFunction("newCAFromRaw", [](const std::string& raw, boost::optional<uint16_t> port) {
+                                        if (raw.size() == 4) {
+                                          struct sockaddr_in sin4;
+                                          memset(&sin4, 0, sizeof(sin4));
+                                          sin4.sin_family = AF_INET;
+                                          memcpy(&sin4.sin_addr.s_addr, raw.c_str(), raw.size());
+                                          if (port) {
+                                            sin4.sin_port = htons(*port);
+                                          }
+                                          return ComboAddress(&sin4);
+                                        }
+                                        else if (raw.size() == 16) {
+                                          struct sockaddr_in6 sin6;
+                                          memset(&sin6, 0, sizeof(sin6));
+                                          sin6.sin6_family = AF_INET6;
+                                          memcpy(&sin6.sin6_addr.s6_addr, raw.c_str(), raw.size());
+                                          if (port) {
+                                            sin6.sin6_port = htons(*port);
+                                          }
+                                          return ComboAddress(&sin6);
+                                        }
+                                        return ComboAddress();
+                                      });
   typedef std::unordered_set<ComboAddress,ComboAddress::addressOnlyHash,ComboAddress::addressOnlyEqual> cas_t;
   d_lw->registerFunction<bool(ComboAddress::*)(const ComboAddress&)>("equal", [](const ComboAddress& lhs, const ComboAddress& rhs) { return ComboAddress::addressOnlyEqual()(lhs, rhs); });
 
index 32ff9f0a32a3b3ea15c652d9daf4963936d510ee..152b5bab512a7194690d3351417667ec8ba7f212 100644 (file)
@@ -121,6 +121,8 @@ resolve          IN    LUA    A   ";local r=resolve('localhost', 1) local t={{}}
 *.createreverse  IN    LUA    PTR   "createReverse('%5%.example.com', {{['10.10.10.10'] = 'quad10.example.com.'}})"
 *.createreverse6 IN    LUA    PTR   "createReverse6('%33%.example.com', {{['2001:db8::1'] = 'example.example.com.'}})"
 
+newcafromraw     IN    LUA    A    "newCAFromRaw('ABCD'):toString()"
+newcafromraw     IN    LUA    AAAA "newCAFromRaw('ABCD020340506070'):toString()"
         """,
         'createforward6.example.org': """
 createforward6.example.org.                 3600 IN SOA  {soa}
@@ -607,6 +609,32 @@ createforward6.example.org.                 3600 IN NS   ns2.example.org.
         self.assertRcodeEqual(res, dns.rcode.NOERROR)
         self.assertEqual(self.sortRRsets(res.answer), self.sortRRsets(response.answer))
 
+    def testCAFromRaw(self):
+        """
+        Test newCAFromRaw() function
+        """
+        name = 'newcafromraw.example.org.'
+
+        query = dns.message.make_query(name, 'A')
+
+        response = dns.message.make_response(query)
+
+        response.answer.append(dns.rrset.from_text(name, 0, dns.rdataclass.IN, dns.rdatatype.A, '65.66.67.68'))
+
+        res = self.sendUDPQuery(query)
+        self.assertRcodeEqual(res, dns.rcode.NOERROR)
+        self.assertEqual(res.answer, response.answer)
+
+        query = dns.message.make_query(name, 'AAAA')
+
+        response = dns.message.make_response(query)
+
+        response.answer.append(dns.rrset.from_text(name, 0, dns.rdataclass.IN, dns.rdatatype.AAAA, '4142:4344:3032:3033:3430:3530:3630:3730'))
+
+        res = self.sendUDPQuery(query)
+        self.assertRcodeEqual(res, dns.rcode.NOERROR)
+        self.assertEqual(res.answer, response.answer)
+
     def testResolve(self):
         """
         Test resolve() function