Skip to content

Commit d5d7768

Browse files
molikunerpeterthomassen
authored andcommitted
feat(dyndns): allow overwriting IP address for specific (sub)domain
1 parent 479fa07 commit d5d7768

4 files changed

Lines changed: 311 additions & 45 deletions

File tree

api/desecapi/tests/test_dyndns12update.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,101 @@ def test_update_multiple_v4(self):
330330
self.assertIP(ipv4=new_ip)
331331
self.assertIP(subname="sub", ipv4=new_ip)
332332

333+
def test_update_multiple_with_overwrite(self):
334+
# /nic/update?hostname=sub1.a.io,sub2.a.io,sub3.a.io&myip=1.2.3.4&ipv6=::1&myipv6:sub2.a.io=::2
335+
new_ip4 = "1.2.3.4"
336+
new_ip6 = "::1"
337+
new_ip6_overwrite = "::2"
338+
domain1 = "sub1." + self.my_domain.name
339+
domain2 = "sub2." + self.my_domain.name
340+
domain3 = "sub3." + self.my_domain.name
341+
342+
with self.assertRequests(
343+
self.request_pdns_zone_update(self.my_domain.name),
344+
self.request_pdns_zone_axfr(self.my_domain.name),
345+
):
346+
response = self.client.get(
347+
self.reverse("v1:dyndns12update"),
348+
{
349+
"hostname": f"{domain1},{domain2},{domain3}",
350+
"myip": new_ip4,
351+
"ipv6": new_ip6,
352+
f"myipv6:{domain2}": new_ip6_overwrite,
353+
},
354+
)
355+
356+
self.assertStatus(response, status.HTTP_200_OK)
357+
self.assertEqual(response.data, "good")
358+
359+
self.assertIP(subname="sub1", ipv4=new_ip4, ipv6=new_ip6)
360+
self.assertIP(subname="sub2", ipv4=new_ip4, ipv6=new_ip6_overwrite)
361+
self.assertIP(subname="sub3", ipv4=new_ip4, ipv6=new_ip6)
362+
363+
def test_update_multiple_with_extra(self):
364+
# /nic/update?hostname=sub1.a.io,sub3.a.io&myip=1.2.3.4&ipv6=::1&myipv6:sub2.a.io=::2
365+
old_ip4 = "10.0.0.2"
366+
new_ip4 = "1.2.3.4"
367+
new_ip6 = "::1"
368+
new_ip6_extra = "::2"
369+
domain1 = "sub1." + self.my_domain.name
370+
domain2 = "sub2." + self.my_domain.name
371+
domain3 = "sub3." + self.my_domain.name
372+
self.create_rr_set(self.my_domain, [old_ip4], subname="sub2", type="A", ttl=60)
373+
374+
with self.assertRequests(
375+
self.request_pdns_zone_update(self.my_domain.name),
376+
self.request_pdns_zone_axfr(self.my_domain.name),
377+
):
378+
response = self.client.get(
379+
self.reverse("v1:dyndns12update"),
380+
{
381+
"hostname": f"{domain1},{domain3}",
382+
f"myipv6:{domain2}": new_ip6_extra,
383+
"myip": new_ip4,
384+
"ipv6": new_ip6,
385+
},
386+
)
387+
388+
self.assertStatus(response, status.HTTP_200_OK)
389+
self.assertEqual(response.data, "good")
390+
391+
self.assertIP(subname="sub1", ipv4=new_ip4, ipv6=new_ip6)
392+
self.assertIP(subname="sub2", ipv4=old_ip4, ipv6=new_ip6_extra)
393+
self.assertIP(subname="sub3", ipv4=new_ip4, ipv6=new_ip6)
394+
395+
def test_update_multiple_with_same_argument_domain_twice(self):
396+
# /nic/update?hostname=sub1.a.io&myip=1.2.3.4&myipv6:sub1.a.io=::1&myipv6:sub1.a.io,sub2.a.io,sub3.a.io=::2
397+
old_ip4 = "10.0.0.2"
398+
new_ip4 = "1.2.3.4"
399+
new_ip6 = "::1"
400+
new_ip6_extra = "::2"
401+
domain1 = "sub1." + self.my_domain.name
402+
domain2 = "sub2." + self.my_domain.name
403+
domain3 = "sub3." + self.my_domain.name
404+
self.create_rr_set(self.my_domain, [old_ip4], subname="sub2", type="A", ttl=60)
405+
self.create_rr_set(self.my_domain, [old_ip4], subname="sub3", type="A", ttl=60)
406+
407+
with self.assertRequests(
408+
self.request_pdns_zone_update(self.my_domain.name),
409+
self.request_pdns_zone_axfr(self.my_domain.name),
410+
):
411+
response = self.client.get(
412+
self.reverse("v1:dyndns12update"),
413+
{
414+
"hostname": f"{domain1}",
415+
"myip": new_ip4,
416+
f"myipv6:{domain1}": new_ip6,
417+
f"myipv6:{domain1},{domain2},{domain3}": new_ip6_extra,
418+
},
419+
)
420+
421+
self.assertStatus(response, status.HTTP_200_OK)
422+
self.assertEqual(response.data, "good")
423+
424+
self.assertIP(subname="sub1", ipv4=new_ip4, ipv6=new_ip6_extra)
425+
self.assertIP(subname="sub2", ipv4=old_ip4, ipv6=new_ip6_extra)
426+
self.assertIP(subname="sub3", ipv4=old_ip4, ipv6=new_ip6_extra)
427+
333428
def test_update_multiple_username_param(self):
334429
# /nic/update?username=a.io,sub.a.io&myip=1.2.3.4
335430
new_ip = "1.2.3.4"
@@ -403,6 +498,36 @@ def test_update_multiple_with_subnet(self):
403498
self.assertIP(subname="sub1", ipv4="10.1.0.1")
404499
self.assertIP(subname="sub2", ipv4="10.1.0.2")
405500

501+
def test_update_multiple_with_subnet_and_ip_override(self):
502+
# /nic/update?hostname=a.io,b.io&myip=10.1.0.0/16&a.io=192.168.1.1
503+
domain1 = "sub1." + self.my_domain.name
504+
domain2 = "sub2." + self.my_domain.name
505+
self.create_rr_set(
506+
self.my_domain, ["10.0.0.1"], subname="sub1", type="A", ttl=60
507+
)
508+
self.create_rr_set(
509+
self.my_domain, ["10.0.0.2"], subname="sub2", type="A", ttl=60
510+
)
511+
512+
with self.assertRequests(
513+
self.request_pdns_zone_update(self.my_domain.name),
514+
self.request_pdns_zone_axfr(self.my_domain.name),
515+
):
516+
response = self.client.get(
517+
self.reverse("v1:dyndns12update"),
518+
{
519+
"hostname": f"{domain1},{domain2}",
520+
"myip": "10.1.0.0/16",
521+
f"myipv4:{domain1}": "192.168.1.1",
522+
},
523+
)
524+
525+
self.assertStatus(response, status.HTTP_200_OK)
526+
self.assertEqual(response.data, "good")
527+
528+
self.assertIP(subname="sub1", ipv4="192.168.1.1")
529+
self.assertIP(subname="sub2", ipv4="10.1.0.2")
530+
406531
def test_update_multiple_with_one_being_already_up_to_date(self):
407532
# /nic/update?hostname=a.io,sub.a.io&myip=1.2.3.4
408533
new_ip = "1.2.3.4"
@@ -446,6 +571,20 @@ def test_update_same_domain_twice(self):
446571

447572
self.assertIP(ipv4=new_ip)
448573

574+
def test_update_overwrite_with_invalid_subnet(self):
575+
# /nic/update?hostname=a.io&myipv4:a.io=1.2.3.4/64
576+
domain1 = self.create_domain(owner=self.owner).name
577+
578+
with self.assertRequests():
579+
response = self.client.get(
580+
self.reverse("v1:dyndns12update"),
581+
{"hostname": f"{domain1}", f"myipv4:{domain1}": "1.2.3.4/64"},
582+
)
583+
584+
self.assertContains(
585+
response, "invalid subnet", status_code=status.HTTP_400_BAD_REQUEST
586+
)
587+
449588
def test_update_multiple_with_invalid_subnet(self):
450589
# /nic/update?hostname=sub1.a.io,sub2.a.io&myip=1.2.3.4/64
451590
domain1 = "sub1." + self.my_domain.name

0 commit comments

Comments
 (0)