test_api_domains.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import os
  2. import time
  3. import pytest
  4. from conftest import DeSECAPIV1Client, NSLordClient, random_domainname, FaketimeShift
  5. DEFAULT_TTL = int(os.environ['DESECSTACK_NSLORD_DEFAULT_TTL'])
  6. example_zonefile = """
  7. @ 300 IN SOA get.desec.io. get.desec.io. 2021114126 86400 3600 2419200 3600
  8. @ 300 IN RRSIG SOA 13 3 300 20220324000000 20220303000000 8312 @ XcZOyVwrEMjp1RGi+5rjk82hYbpzRPIm 5Nx8H4p5wlsCSViAOE9WKIv4TC6xH44l AY4CFBbb2e3iui/bzwQnoQ==
  9. @ 3600 IN DNSKEY 257 3 13 q4/6eDL5bHn2hF7mbtpzGdUvIgaU2GE0 +BsPVYivqPYZrZlk/aAPpHpeUa/5giLM KhI4QPPy1uv2F6jw9RgPLw==
  10. @ 3600 IN RRSIG DNSKEY 13 3 3600 20220324000000 20220303000000 8312 @ 9X44LeBCpmmrO3mJp2P6GFLenAeOLxhX 1ta2ACMTVwPVaHlz3rG4dgzseTp//YHz +DJSc7P3W9cCDkg5X4Q43g==
  11. @ 3600 IN CDS 8312 13 2 bca8973bae3e58e697f0558ef55d3df835e6dd443c46ab5778904f186341c0d8
  12. @ 3600 IN CDS 8312 13 4 c5fd0f288522d0e7eeaf7ddbbbb1d956a8cd7d1eba6e6f12ebe0926ed560ccfca480f6022bacff98c1767c61281466c5
  13. @ 3600 IN RRSIG CDS 13 3 3600 20220324000000 20220303000000 8312 @ MIGwQf72bq55bQlGMSB5WSKV6iFoELKM 82IBLqU5kNgSHGOVhxAuGL8H/dktLgxY uQEXO0NFRIODq+8zmIovYg==
  14. @ 60 IN A 83.219.1.24
  15. @ 60 IN RRSIG A 13 3 60 20220324000000 20220303000000 8312 @ WrjVe9hYjmZNG5nysOEbAOp24DLPJ/9k xucV/5T4wXYXyzeJCxqV3DQ9B7fj6HZX zP8EJeZ9xxsqL9M6myN3vQ==
  16. @ 3600 IN CDNSKEY 257 3 13 q4/6eDL5bHn2hF7mbtpzGdUvIgaU2GE0 +BsPVYivqPYZrZlk/aAPpHpeUa/5giLM KhI4QPPy1uv2F6jw9RgPLw==
  17. @ 3600 IN RRSIG CDNSKEY 13 3 3600 20220324000000 20220303000000 8312 @ yRRuPINa9fAuwtdYL0Ggy5IuLDJMuSS1 ydc9WjnUR6uLPM0TGVOvwRk32ItoSOcJ bSfRZshxI/u27kc19eEQAw==
  18. @ 86400 IN NS ns1.example.
  19. @ 86400 IN NS ns2.example.
  20. @ 3600 IN RRSIG NS 13 3 3600 20220324000000 20220303000000 8312 @ mQSIpFAaOZMQpvq9DGJvXKCTuwcH+VyS HZ4EAKiXN50+w6g6+Ogik8GwmrMBG7/4 tC9mxMOIsBn/86GPR8eYzg==
  21. @ 3600 IN NSEC3PARAM 1 0 0 -
  22. @ 3600 IN RRSIG NSEC3PARAM 13 3 3600 20220324000000 20220303000000 8312 @ bePOvsK3Npl1GsKRBDtdipKIOVaz9JJX Ka/ccAHZPp8GSwDQFmyBt0l1JWJvGzT0 L+wVQMCsk/rpxrWsUanwdg==
  23. p6gfsf6t5tvesh74gd38o43u26q8kqes 300 IN NSEC3 1 0 0 - p6gfsf6t5tvesh74gd38o43u26q8kqes A NS SOA RRSIG DNSKEY NSEC3PARAM CDS CDNSKEY
  24. p6gfsf6t5tvesh74gd38o43u26q8kqes 300 IN RRSIG NSEC3 13 4 300 20220324000000 20220303000000 8312 @ b3ZfxXKLJrOGVTAqmQeEZSjbT7iYKtyM M6Wl6HilgjYTzWPvpiwpFSrETWWP5A19 wKRmT4Nh6nnbTDalUvXLsQ==
  25. """
  26. def ttl(value, min_ttl=int(os.environ['DESECSTACK_MINIMUM_TTL_DEFAULT'])):
  27. return max(min_ttl, min(86400, value))
  28. def test_create(api_user: DeSECAPIV1Client):
  29. assert len(api_user.domain_list()) == 0
  30. assert api_user.domain_create(random_domainname()).status_code == 201
  31. assert len(api_user.domain_list()) == 1
  32. assert NSLordClient.query(api_user.domain, 'SOA')[0].serial >= int(time.time())
  33. def test_create_import_export(api_user: DeSECAPIV1Client):
  34. assert len(api_user.domain_list()) == 0
  35. domainname = random_domainname()
  36. assert api_user.domain_create(domainname, example_zonefile).status_code == 201
  37. assert len(api_user.domain_list()) == 1
  38. api_user.assert_rrsets({
  39. ('', 'NS'): (
  40. DEFAULT_TTL,
  41. {f"{name}." for name in os.environ["DESECSTACK_NS"].split(" ")}
  42. ),
  43. ('', 'A'): (
  44. ttl(60),
  45. {'83.219.1.24'}
  46. ),
  47. })
  48. api_user.assert_rrsets({
  49. ('', 'RRSIG'): (None, None),
  50. ('', 'NSEC3PARAM'): (None, None),
  51. ('', 'CDS'): (None, None),
  52. ('', 'DNSKEY'): (None, None),
  53. ('', 'SOA'): (None, None),
  54. }, via_dns=False)
  55. assert NSLordClient.query(api_user.domain, 'NSEC3PARAM')[0].to_text() == '1 0 0 -'
  56. _, zonefile = api_user.get(f"/domains/{api_user.domain}/zonefile").content.decode().split("\n", 1)
  57. assert {l.strip() for l in zonefile.strip().split('\n') if 'SOA' not in l} == \
  58. {f"{domainname}. {ttl(60)} IN A 83.219.1.24"} | \
  59. {
  60. f"{domainname}. {DEFAULT_TTL} IN NS {name}."
  61. for name in os.environ["DESECSTACK_NS"].split(" ")
  62. }
  63. def test_get(api_user_domain: DeSECAPIV1Client):
  64. domain = api_user_domain.get(f"/domains/{api_user_domain.domain}/").json()
  65. assert {rr.to_text() for rr in NSLordClient.query(api_user_domain.domain, 'CDS')} == set(domain['keys'][0]['ds'])
  66. assert domain['name'] == api_user_domain.domain
  67. def test_modify(api_user_domain: DeSECAPIV1Client):
  68. old_serial = NSLordClient.query(api_user_domain.domain, 'SOA')[0].serial
  69. api_user_domain.rr_set_create(api_user_domain.domain, 'A', ['127.0.0.1'])
  70. assert NSLordClient.query(api_user_domain.domain, 'SOA')[0].serial > old_serial
  71. def test_rrsig_rollover(api_user_domain: DeSECAPIV1Client):
  72. old_serial = NSLordClient.query(api_user_domain.domain, 'SOA')[0].serial
  73. with FaketimeShift(days=7):
  74. assert NSLordClient.query(api_user_domain.domain, 'SOA')[0].serial > old_serial
  75. def test_destroy(api_user_domain: DeSECAPIV1Client):
  76. n = len(api_user_domain.domain_list())
  77. assert api_user_domain.domain_destroy(api_user_domain.domain).status_code == 204
  78. assert len(api_user_domain.domain_list()) == n - 1
  79. @pytest.mark.skip # TODO currently broken
  80. def test_recreate(api_user_domain: DeSECAPIV1Client):
  81. name = api_user_domain.domain
  82. old_serial = NSLordClient.query(name, 'SOA')[0].serial
  83. assert api_user_domain.domain_destroy(name).status_code == 204
  84. assert api_user_domain.domain_create(name).status_code == 201
  85. assert NSLordClient.query(name, 'SOA')[0].serial > old_serial
  86. def test_export(api_user_domain: DeSECAPIV1Client):
  87. """Check export of fresh domain (only contains NS and SOA RRs)"""
  88. for content_type in ['text/dns', 'application/json']:
  89. _, zonefile = api_user_domain.get(f"/domains/{api_user_domain.domain}/zonefile", headers={'Accept': content_type}).content.decode().split("\n", 1)
  90. assert {l.strip() for l in zonefile.strip().split('\n') if 'SOA' not in l} == \
  91. {
  92. f"{api_user_domain.domain}. {DEFAULT_TTL} IN NS {name}."
  93. for name in os.environ["DESECSTACK_NS"].split(" ")
  94. }