@@ -1049,6 +1049,11 @@ pub fn create_server_failure_response_from_query(
1049
1049
1050
1050
#[ cfg( test) ]
1051
1051
mod message_test {
1052
+ use std:: net:: { IpAddr , Ipv4Addr } ;
1053
+ use std:: time:: Duration ;
1054
+ use crate :: client:: Client ;
1055
+ use crate :: client:: client_connection:: ClientConnection ;
1056
+ use crate :: client:: udp_connection:: ClientUDPConnection ;
1052
1057
use super :: * ;
1053
1058
use crate :: domain_name:: DomainName ;
1054
1059
use crate :: message:: header:: Header ;
@@ -1059,6 +1064,7 @@ mod message_test {
1059
1064
use crate :: message:: resource_record:: ResourceRecord ;
1060
1065
use crate :: message:: DnsMessage ;
1061
1066
use crate :: message:: Rclass ;
1067
+ use crate :: message:: rdata:: soa_rdata:: SoaRdata ;
1062
1068
use crate :: message:: Rrtype ;
1063
1069
1064
1070
#[ test]
@@ -1821,4 +1827,189 @@ mod message_test {
1821
1827
}
1822
1828
}
1823
1829
1830
+
1831
+ // DNS update examples --------------------------------------------
1832
+ /*
1833
+ 2.5.1 - Add To An RRset
1834
+
1835
+ RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
1836
+ and RDATA are those being added, and CLASS is the same as the zone
1837
+ class. Any duplicate RRs will be silently ignored by the primary
1838
+ master.
1839
+ */
1840
+ #[ ignore]
1841
+ #[ tokio:: test]
1842
+ async fn add_to_an_rrset ( ) {
1843
+ let zname = DomainName :: new_from_str ( "example.com" ) ;
1844
+ let zclass = Rclass :: IN ;
1845
+
1846
+ let mut prerequisite = vec ! [ ] ;
1847
+ let mut update = vec ! [ ] ;
1848
+ let additional : Vec < ResourceRecord > = vec ! [ ] ;
1849
+
1850
+ // prerequisite--------------------------------
1851
+ let prerequisite_rdata = Rdata :: SOA ( SoaRdata :: new_empty ( ) ) ;
1852
+
1853
+ let mut prerequisite_rr = ResourceRecord :: new ( prerequisite_rdata) ;
1854
+ prerequisite_rr. set_name ( zname) ;
1855
+ prerequisite_rr. set_rclass ( Rclass :: ANY ) ;
1856
+ prerequisite. push ( prerequisite_rr) ;
1857
+
1858
+ // update---------------------------------------
1859
+ let update_rdata = Rdata :: A ( ARdata :: new_from_addr ( IpAddr :: V4 ( Ipv4Addr :: new ( 192 , 168 , 1 , 200 ) ) ) ) ;
1860
+ let mut update_rr = ResourceRecord :: new ( update_rdata) ;
1861
+ update_rr. set_name ( DomainName :: new_from_str ( "test.example.com" ) ) ;
1862
+ update_rr. set_ttl ( 3600 ) ;
1863
+ update_rr. set_rclass ( zclass) ;
1864
+ update. push ( update_rr) ;
1865
+
1866
+ // sending-------------------------------------
1867
+ let addr = IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) ;
1868
+ let conn = ClientUDPConnection :: new_default ( addr, Duration :: from_secs ( 10 ) ) ;
1869
+
1870
+ let mess = DnsMessage :: update_message ( "example.com" , "IN" , prerequisite, update, additional) ;
1871
+ let mut client = Client :: new ( conn) ;
1872
+ client. set_dns_query ( mess) ;
1873
+ let response = client. send_query ( ) . await ;
1874
+ }
1875
+
1876
+ /*
1877
+ 2.5.2 - Delete An RRset
1878
+
1879
+ One RR is added to the Update Section whose NAME and TYPE are those
1880
+ of the RRset to be deleted. TTL must be specified as zero (0) and is
1881
+ otherwise not used by the primary master. CLASS must be specified as
1882
+ ANY. RDLENGTH must be zero (0) and RDATA must therefore be empty.
1883
+ If no such RRset exists, then this Update RR will be silently ignored
1884
+ by the primary master.
1885
+ */
1886
+ #[ ignore]
1887
+ #[ tokio:: test]
1888
+ async fn delete_an_rrset ( ) {
1889
+ let zname = DomainName :: new_from_str ( "example.com" ) ;
1890
+ let zclass = Rclass :: IN ;
1891
+
1892
+ let mut prerequisite = vec ! [ ] ;
1893
+ let mut update = vec ! [ ] ;
1894
+ let additional : Vec < ResourceRecord > = vec ! [ ] ;
1895
+
1896
+ // prerequisite--------------------------------
1897
+ let prerequisite_rdata = Rdata :: SOA ( SoaRdata :: new_empty ( ) ) ;
1898
+
1899
+ let mut prerequisite_rr = ResourceRecord :: new ( prerequisite_rdata) ;
1900
+ prerequisite_rr. set_name ( zname) ;
1901
+ prerequisite_rr. set_rclass ( Rclass :: ANY ) ;
1902
+ prerequisite. push ( prerequisite_rr) ;
1903
+
1904
+ // update---------------------------------------
1905
+ let update_rdata = Rdata :: A ( ARdata :: new_empty ( ) ) ;
1906
+ let mut update_rr = ResourceRecord :: new ( update_rdata) ;
1907
+ update_rr. set_name ( DomainName :: new_from_str ( "test.example.com" ) ) ;
1908
+ update_rr. set_ttl ( 0 ) ;
1909
+ update_rr. set_rclass ( Rclass :: ANY ) ;
1910
+ update. push ( update_rr) ;
1911
+
1912
+ // sending-------------------------------------
1913
+ let addr = IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) ;
1914
+ let conn = ClientUDPConnection :: new_default ( addr, Duration :: from_secs ( 10 ) ) ;
1915
+
1916
+ let mess = DnsMessage :: update_message ( "example.com" , "IN" , prerequisite, update, additional) ;
1917
+ let mut client = Client :: new ( conn) ;
1918
+ client. set_dns_query ( mess) ;
1919
+ let response = client. send_query ( ) . await ;
1920
+ }
1921
+
1922
+ /*
1923
+ 2.5.3 - Delete All RRsets From A Name
1924
+
1925
+ One RR is added to the Update Section whose NAME is that of the name
1926
+ to be cleansed of RRsets. TYPE must be specified as ANY. TTL must
1927
+ be specified as zero (0) and is otherwise not used by the primary
1928
+ master. CLASS must be specified as ANY. RDLENGTH must be zero (0)
1929
+ and RDATA must therefore be empty. If no such RRsets exist, then
1930
+ this Update RR will be silently ignored by the primary master.
1931
+ */
1932
+ #[ ignore]
1933
+ #[ tokio:: test]
1934
+ async fn delete_all_rrset_from_name ( ) {
1935
+ let zname = DomainName :: new_from_str ( "example.com" ) ;
1936
+ let zclass = Rclass :: IN ;
1937
+
1938
+ let mut prerequisite = vec ! [ ] ;
1939
+ let mut update = vec ! [ ] ;
1940
+ let additional : Vec < ResourceRecord > = vec ! [ ] ;
1941
+
1942
+ // prerequisite--------------------------------
1943
+ let prerequisite_rdata = Rdata :: SOA ( SoaRdata :: new_empty ( ) ) ;
1944
+
1945
+ let mut prerequisite_rr = ResourceRecord :: new ( prerequisite_rdata) ;
1946
+ prerequisite_rr. set_name ( zname) ;
1947
+ prerequisite_rr. set_rclass ( Rclass :: ANY ) ;
1948
+ prerequisite. push ( prerequisite_rr) ;
1949
+
1950
+ // update---------------------------------------
1951
+ let update_rdata = Rdata :: A ( ARdata :: new_empty ( ) ) ;
1952
+ let mut update_rr = ResourceRecord :: new ( update_rdata) ;
1953
+ update_rr. set_name ( DomainName :: new_from_str ( "test.example.com" ) ) ;
1954
+ update_rr. set_ttl ( 0 ) ;
1955
+ update_rr. set_rclass ( Rclass :: ANY ) ;
1956
+ update_rr. set_type_code ( Rrtype :: ANY ) ;
1957
+ update. push ( update_rr) ;
1958
+
1959
+ // sending-------------------------------------
1960
+ let addr = IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) ;
1961
+ let conn = ClientUDPConnection :: new_default ( addr, Duration :: from_secs ( 10 ) ) ;
1962
+
1963
+ let mess = DnsMessage :: update_message ( "example.com" , "IN" , prerequisite, update, additional) ;
1964
+ let mut client = Client :: new ( conn) ;
1965
+ client. set_dns_query ( mess) ;
1966
+ let response = client. send_query ( ) . await ;
1967
+ }
1968
+
1969
+ /*
1970
+ 2.5.4 - Delete An RR From An RRset
1971
+
1972
+ RRs to be deleted are added to the Update Section. The NAME, TYPE,
1973
+ RDLENGTH and RDATA must match the RR being deleted. TTL must be
1974
+ specified as zero (0) and will otherwise be ignored by the primary
1975
+ master. CLASS must be specified as NONE to distinguish this from an
1976
+ RR addition. If no such RRs exist, then this Update RR will be
1977
+ silently ignored by the primary master.
1978
+ */
1979
+ #[ ignore]
1980
+ #[ tokio:: test]
1981
+ async fn delete_an_rr_from_rrset ( ) {
1982
+ let zname = DomainName :: new_from_str ( "example.com" ) ;
1983
+ let zclass = Rclass :: IN ;
1984
+
1985
+ let mut prerequisite = vec ! [ ] ;
1986
+ let mut update = vec ! [ ] ;
1987
+ let additional : Vec < ResourceRecord > = vec ! [ ] ;
1988
+
1989
+ // prerequisite--------------------------------
1990
+ let prerequisite_rdata = Rdata :: SOA ( SoaRdata :: new_empty ( ) ) ;
1991
+
1992
+ let mut prerequisite_rr = ResourceRecord :: new ( prerequisite_rdata) ;
1993
+ prerequisite_rr. set_name ( zname) ;
1994
+ prerequisite_rr. set_rclass ( Rclass :: ANY ) ;
1995
+ prerequisite. push ( prerequisite_rr) ;
1996
+
1997
+ // update---------------------------------------
1998
+ let update_rdata = Rdata :: A ( ARdata :: new_from_addr ( IpAddr :: V4 ( Ipv4Addr :: new ( 192 , 168 , 1 , 200 ) ) ) ) ;
1999
+ let mut update_rr = ResourceRecord :: new ( update_rdata) ;
2000
+ update_rr. set_name ( DomainName :: new_from_str ( "test.example.com" ) ) ;
2001
+ update_rr. set_ttl ( 0 ) ;
2002
+ update_rr. set_rclass ( Rclass :: NONE ) ;
2003
+ update. push ( update_rr) ;
2004
+
2005
+ // sending-------------------------------------
2006
+ let addr = IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) ;
2007
+ let conn = ClientUDPConnection :: new_default ( addr, Duration :: from_secs ( 10 ) ) ;
2008
+
2009
+ let mess = DnsMessage :: update_message ( "example.com" , "IN" , prerequisite, update, additional) ;
2010
+ let mut client = Client :: new ( conn) ;
2011
+ client. set_dns_query ( mess) ;
2012
+ let response = client. send_query ( ) . await ;
2013
+ }
2014
+
1824
2015
}
0 commit comments