From: JINMEI Tatuya Date: Wed, 16 May 2012 07:41:33 +0000 (-0700) Subject: [1512] supported the case of update attmpt for a secondary zone. X-Git-Tag: trac2351_base~226^2~82^2~24 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=adbe1bace4e5d7bb7b063a01f769b0ae65362c2e;p=thirdparty%2Fkea.git [1512] supported the case of update attmpt for a secondary zone. (sine we're not yet going to support update forwarding, we'll just return REFUSED, as if it were rejected as some kind of access control) --- diff --git a/src/lib/python/isc/ddns/session.py b/src/lib/python/isc/ddns/session.py index fe3d842f59..74e382d859 100644 --- a/src/lib/python/isc/ddns/session.py +++ b/src/lib/python/isc/ddns/session.py @@ -94,6 +94,10 @@ class UpdateSession: zone_type, datasrc_client = self.__zone_config.find_zone(zname, zclass) if zone_type == isc.ddns.zone_config.ZONE_PRIMARY: return datasrc_client, zname, zclass + elif zone_type == isc.ddns.zone_config.ZONE_SECONDARY: + # unconditionally refused forwarding (we don't support it yet) + raise ZoneError('Update forwarding not supported', + isc.dns.Rcode.REFUSED()) def __make_response(self, rcode): '''Transform the internal message to the update response. diff --git a/src/lib/python/isc/ddns/tests/session_tests.py b/src/lib/python/isc/ddns/tests/session_tests.py index 452740c1cd..93d80a51a5 100644 --- a/src/lib/python/isc/ddns/tests/session_tests.py +++ b/src/lib/python/isc/ddns/tests/session_tests.py @@ -49,7 +49,9 @@ class SessionTest(unittest.TestCase): self.__update_msgdata, self.__update_msg = create_update_msg() self.__session = UpdateSession(self.__update_msg, self.__update_msgdata, - self.__client_addr, ZoneConfig()) + self.__client_addr, + ZoneConfig([(Name("example.org"), + TEST_RRCLASS)])) def check_response(self, msg, expected_rcode): '''Perform common checks on update resposne message.''' @@ -84,6 +86,19 @@ class SessionTest(unittest.TestCase): self.assertEqual(UPDATE_DONE, session.handle()) self.check_response(session.get_message(), Rcode.FORMERR()) + def test_update_secondary(self): + # specified zone is configured as a secondary. Since this + # implementation doesn't support update forwarding, the result + # should be REFUSED. + sec_zone = Name("example.org") + msg_data, msg = create_update_msg(zones=[Question(sec_zone, + TEST_RRCLASS, + RRType.SOA())]) + session = UpdateSession(msg, msg_data, None, + ZoneConfig([(sec_zone, TEST_RRCLASS)])) + self.assertEqual(UPDATE_DONE, session.handle()) + self.check_response(session.get_message(), Rcode.REFUSED()) + def test_handle(self): self.assertEqual(UPDATE_DONE, self.__session.handle()) self.assertNotEqual(UPDATE_DROP, self.__session.handle()) diff --git a/src/lib/python/isc/ddns/zone_config.py b/src/lib/python/isc/ddns/zone_config.py index 2af5ed8ec4..a1dd1cc2d4 100644 --- a/src/lib/python/isc/ddns/zone_config.py +++ b/src/lib/python/isc/ddns/zone_config.py @@ -30,7 +30,14 @@ class ZoneConfig: until the details are fixed. ''' + def __init__(self, secondaries): + self.__secondaries = {} + for (zname, zclass) in secondaries: + self.__secondaries[(zname, zclass)] = True + def find_zone(self, zone_name, zone_class): '''Return the type and accessor client object for given zone.''' # Right now, the client is not used, so we simply return None. + if (zone_name, zone_class) in self.__secondaries: + return ZONE_SECONDARY, None return ZONE_PRIMARY, None