From e4343a1777e488383013862e7fec49ef1b464c06 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 4 Jul 2024 07:50:41 +0200 Subject: [PATCH] generate Zonefile as prep for external validation --- ...HsDomainDnsSetupHostingAssetValidator.java | 18 +++++++++++++ .../hs/validation/HsEntityValidator.java | 24 ++++++++++++++++++ ...DnsSetupHostingAssetValidatorUnitTest.java | 25 +++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java index 531b645e..d0dbf8ca 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java @@ -5,6 +5,7 @@ import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import java.util.regex.Pattern; +import static java.util.Arrays.stream; import static net.hostsharing.hsadminng.hs.validation.ArrayProperty.arrayOf; import static net.hostsharing.hsadminng.hs.validation.BooleanProperty.booleanProperty; import static net.hostsharing.hsadminng.hs.validation.IntegerProperty.integerProperty; @@ -53,4 +54,21 @@ class HsDomainDnsSetupHostingAssetValidator extends HsHostingAssetEntityValidato // FIXME: should be auto-initialized return Pattern.compile("^" + assetEntity.getParentAsset().getIdentifier() + "$"); } + + String toZonefileString(final HsHostingAssetEntity assetEntity) { + return """ + $ORIGIN {domain}. + $TTL {ttl} + + ; these records are just placeholders to create a valid zonefile for the validation + @ 1814400 IN SOA {domain}. root.{domain} ( 1999010100 10800 900 604800 86400 ) + @ IN NS ns + + {userRRs} + """ + .replace("{domain}", assetEntity.getIdentifier()) + .replace("{ttl}", getPropertyValue(assetEntity, "TTL")) + .replace("{userRRs}", getPropertyValues(assetEntity, "user-RR") ); + } + } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java index 13cb3f05..9905d2fa 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java @@ -6,7 +6,9 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; +import java.util.stream.Collectors; import static java.util.Arrays.stream; import static java.util.Collections.emptyList; @@ -41,6 +43,12 @@ public abstract class HsEntityValidator { .toList(); } + public final Map> propertiesMap() { + return Arrays.stream(propertyValidators) + .map(ValidatableProperty::toOrderedMap) + .collect(Collectors.toMap(p -> p.get("propertyName").toString(), p -> p)); + } + protected ArrayList validateProperties(final PropertiesProvider propsProvider) { final var result = new ArrayList(); @@ -109,4 +117,20 @@ public abstract class HsEntityValidator { }); return copy; } + + protected String getPropertyValue(final PropertiesProvider entity, final String propertyName) { + final var rawValue = entity.getDirectValue(propertyName, Object.class); + if (rawValue != null) { + return rawValue.toString(); + } + return Objects.toString(propertiesMap().get(propertyName).get("defaultValue")); + } + + protected String getPropertyValues(final PropertiesProvider entity, final String propertyName) { + final var rawValue = entity.getDirectValue(propertyName, Object[].class); + if (rawValue != null) { + return stream(rawValue).map(Object::toString).collect(Collectors.joining("\n")); + } + return ""; + } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java index eccf8b01..abe5fff9 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java @@ -126,4 +126,29 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { assertThat("; whatever ; \" really anything").matches(RR_COMMENT); } + + @Test + void generatesZonefile() { + // given + final var givenEntity = validEntityBuilder().identifier("example.org").build(); + final var validator = (HsDomainDnsSetupHostingAssetValidator) HsHostingAssetEntityValidatorRegistry.forType(givenEntity.getType()); + + // when + final var zonefile = validator.toZonefileString(givenEntity); + + // then + assertThat(zonefile).isEqualTo(""" + $ORIGIN example.org. + $TTL 21600 + + ; these records are just placeholders to create a valid zonefile for the validation + @ 1814400 IN SOA example.org. root.example.org ( 1999010100 10800 900 604800 86400 ) + @ IN NS ns + + www IN CNAME example.com. ; www.example.com is an alias for example.com + test1 IN 1h30m CNAME example.com. + test2 1h30m IN CNAME example.com. + ns IN A 192.0.2.2; IPv4 address for ns.example.com + """); + } }