@@ -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