]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth lmdb: support replaceComments, but only accept the empty vector 12636/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 9 Mar 2023 18:55:45 +0000 (19:55 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 9 Mar 2023 18:55:45 +0000 (19:55 +0100)
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh
regression-tests.api/test_Zones.py

index 086200f50b0536d0a0a42b5e905e6d8ae74d255d..0927649ec24fc3998be0cc9054631e5fb8531ee9 100644 (file)
@@ -568,6 +568,13 @@ bool LMDBBackend::replaceRRSet(uint32_t domain_id, const DNSName& qname, const Q
   return true;
 }
 
+bool LMDBBackend::replaceComments(const uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<Comment>& comments)
+{
+  // if the vector is empty, good, that's what we do here (LMDB does not store comments)
+  // if it's not, report failure
+  return comments.empty();
+}
+
 // tempting to templatize these two functions but the pain is not worth it
 std::shared_ptr<LMDBBackend::RecordsRWTransaction> LMDBBackend::getRecordsRWTransaction(uint32_t id)
 {
index c1d29a864f88ea72fa1830248413245708b542e2..4b55184748b3dbe469e1f2436d911e9e62e50d09 100644 (file)
@@ -74,6 +74,7 @@ public:
   bool feedEnts(int domain_id, map<DNSName, bool>& nonterm) override;
   bool feedEnts3(int domain_id, const DNSName& domain, map<DNSName, bool>& nonterm, const NSEC3PARAMRecordContent& ns3prc, bool narrow) override;
   bool replaceRRSet(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<DNSResourceRecord>& rrset) override;
+  bool replaceComments(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<Comment>& comments) override;
 
   void getAllDomains(vector<DomainInfo>* domains, bool doSerial, bool include_disabled) override;
   void lookup(const QType& type, const DNSName& qdomain, int zoneId, DNSPacket* p = nullptr) override;
index 0c26db393b8be9e4b059091c7abf1b76d2c27496..46d92f552075ec10681d19af3a7b9d0e3a6bb7a8 100644 (file)
@@ -3,6 +3,7 @@ import json
 import operator
 import time
 import unittest
+import requests.exceptions
 from copy import deepcopy
 from parameterized import parameterized
 from pprint import pprint
@@ -242,7 +243,6 @@ class AuthZones(ApiTestCase, AuthZonesHelperMixin):
         # check our record has appeared
         self.assertEqual(get_rrset(data, rrset['name'], 'A')['records'], rrset['records'])
 
-    @unittest.skipIf(is_auth_lmdb(), "No comments in LMDB")
     def test_create_zone_with_comments(self):
         name = unique_zone_name()
         rrsets = [
@@ -288,6 +288,12 @@ class AuthZones(ApiTestCase, AuthZonesHelperMixin):
                   }],
               },
           ]
+
+        if is_auth_lmdb():
+            with self.assertRaises(requests.exceptions.HTTPError):   # No comments in LMDB
+                self.create_zone(name=name, rrsets=rrsets)
+            return
+
         name, payload, data = self.create_zone(name=name, rrsets=rrsets)
         # NS records have been created
         self.assertEqual(len(data['rrsets']), len(rrsets) + 1)
@@ -1848,7 +1854,6 @@ $ORIGIN %NAME%
         self.assertEqual(r.status_code, 204)
         self.assertNotIn('Content-Type', r.headers)
 
-    @unittest.skipIf(is_auth_lmdb(), "No comments in LMDB")
     def test_zone_comment_create(self):
         name, payload, zone = self.create_zone()
         rrset = {
@@ -1872,7 +1877,11 @@ $ORIGIN %NAME%
             self.url("/api/v1/servers/localhost/zones/" + name),
             data=json.dumps(payload),
             headers={'content-type': 'application/json'})
-        self.assert_success(r)
+        if is_auth_lmdb():
+            self.assert_error_json(r)  # No comments in LMDB
+            return
+        else:
+            self.assert_success(r)
         # make sure the comments have been set, and that the NS
         # records are still present
         data = self.session.get(self.url("/api/v1/servers/localhost/zones/" + name)).json()
@@ -1885,7 +1894,6 @@ $ORIGIN %NAME%
         # verify that TTL is correct (regression test)
         self.assertEqual(serverset['ttl'], 3600)
 
-    @unittest.skipIf(is_auth_lmdb(), "No comments in LMDB")
     def test_zone_comment_delete(self):
         # Test: Delete ONLY comments.
         name, payload, zone = self.create_zone()