From 41e3b10e76441caa035ef38a32f50675da4a5ce9 Mon Sep 17 00:00:00 2001 From: Christian Hofstaedtler Date: Wed, 2 Apr 2014 16:56:33 +0200 Subject: [PATCH] API: don't add priority to content field on save We need the prio in content for verification purposes, but for storage it needs to stay in rr.priority. Adds a test for this. --- pdns/ws-auth.cc | 9 +++++---- regression-tests.api/test_Zones.py | 31 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index 551a1c6045..f71cfb09d5 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -628,14 +628,15 @@ static void apiServerZoneRRset(HttpRequest* req, HttpResponse* resp) { rr.priority = intFromJson(record, "priority"); rr.disabled = boolFromJson(record, "disabled"); - if(rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) - rr.content = lexical_cast(rr.priority)+" "+rr.content; - if(rr.qname != qname || rr.qtype != qtype) throw ApiException("Record "+rr.qname+" IN "+rr.qtype.getName()+" "+rr.content+": Record bundled with wrong RRset"); + string temp_content = rr.content; + if(rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) + temp_content = lexical_cast(rr.priority)+" "+rr.content; + try { - shared_ptr drc(DNSRecordContent::mastermake(rr.qtype.getCode(), 1, rr.content)); + shared_ptr drc(DNSRecordContent::mastermake(rr.qtype.getCode(), 1, temp_content)); string tmp = drc->serialize(rr.qname); } catch(std::exception& e) diff --git a/regression-tests.api/test_Zones.py b/regression-tests.api/test_Zones.py index 104182aeb5..075534c1ea 100644 --- a/regression-tests.api/test_Zones.py +++ b/regression-tests.api/test_Zones.py @@ -156,6 +156,37 @@ class AuthZones(ApiTestCase): recs = [rec for rec in data if rec['type'] == payload['type'] and rec['name'] == payload['name']] self.assertEquals(recs, payload['records']) + def test_ZoneRRUpdateMX(self): + # Important to test with MX records, as they have a priority field, which must not end up in the content field. + payload, zone = self.create_zone() + name = payload['name'] + # do a replace (= update) + payload = { + 'changetype': 'replace', + 'name': name, + 'type': 'MX', + 'records': [ + { + "name": name, + "type": "MX", + "priority": 10, + "ttl": 3600, + "content": "mail.example.org", + "disabled": False + } + ] + } + r = self.session.patch( + self.url("/servers/localhost/zones/" + name + "/rrset"), + data=json.dumps(payload), + headers={'content-type': 'application/json'}) + self.assertSuccessJson(r) + # verify that (only) the new record is there + r = self.session.get(self.url("/servers/localhost/zones/" + name)) + data = r.json()['records'] + recs = [rec for rec in data if rec['type'] == payload['type'] and rec['name'] == payload['name']] + self.assertEquals(recs, payload['records']) + def test_ZoneRRDelete(self): payload, zone = self.create_zone() name = payload['name'] -- 2.47.2