diff --git a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java index c12116d2f..8b42748da 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java @@ -163,7 +163,8 @@ public final class DomainCheckFlow implements Flow { clientId, now)); - ImmutableList.Builder checks = new ImmutableList.Builder<>(); + ImmutableList.Builder checksBuilder = new ImmutableList.Builder<>(); + ImmutableSet.Builder availableDomains = new ImmutableSet.Builder<>(); ImmutableMap tldStates = Maps.toMap(seenTlds, tld -> Registry.get(tld).getTldState(now)); ImmutableMap domainCheckResults = @@ -180,13 +181,19 @@ public final class DomainCheckFlow implements Flow { domainCheckResults, tldStates, allocationToken); - checks.add(DomainCheck.create(!message.isPresent(), targetId, message.orElse(null))); + boolean isAvailable = !message.isPresent(); + checksBuilder.add(DomainCheck.create(isAvailable, targetId, message.orElse(null))); + if (isAvailable) { + availableDomains.add(targetId); + } } BeforeResponseReturnData responseData = flowCustomLogic.beforeResponse( BeforeResponseParameters.newBuilder() - .setDomainChecks(checks.build()) - .setResponseExtensions(getResponseExtensions(domainNames, now, allocationToken)) + .setDomainChecks(checksBuilder.build()) + .setResponseExtensions( + getResponseExtensions( + domainNames, availableDomains.build(), now, allocationToken)) .setAsOfDate(now) .build()); return responseBuilder @@ -221,6 +228,7 @@ public final class DomainCheckFlow implements Flow { /** Handle the fee check extension. */ private ImmutableList getResponseExtensions( ImmutableMap domainNames, + ImmutableSet availableDomains, DateTime now, Optional allocationToken) throws EppException { @@ -242,7 +250,8 @@ public final class DomainCheckFlow implements Flow { feeCheck.getCurrency(), now, pricingLogic, - allocationToken); + allocationToken, + availableDomains.contains(domainName)); responseItems.add(builder.setDomainNameIfSupported(domainName).build()); } } diff --git a/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java b/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java index 744c5c528..d11d5416a 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java +++ b/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java @@ -555,7 +555,8 @@ public class DomainFlowUtils { @Nullable CurrencyUnit topLevelCurrency, DateTime currentDate, DomainPricingLogic pricingLogic, - Optional allocationToken) + Optional allocationToken, + boolean isAvailable) throws EppException { DateTime now = currentDate; // Use the custom effective date specified in the fee check request, if there is one. @@ -587,7 +588,8 @@ public class DomainFlowUtils { ImmutableList fees = ImmutableList.of(); switch (feeRequest.getCommandName()) { case CREATE: - if (isReserved(domain, isSunrise)) { // Don't return a create price for reserved names. + // Don't return a create price for reserved names. + if (isReserved(domain, isSunrise) && !isAvailable) { builder.setClass("reserved"); // Override whatever class we've set above. builder.setAvailIfSupported(false); builder.setReasonIfSupported("reserved"); diff --git a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java index 65cce4904..88dd0f2f5 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java @@ -164,7 +164,8 @@ public final class DomainInfoFlow implements Flow { null, now, pricingLogic, - Optional.empty()); + Optional.empty(), + false); extensions.add(builder.build()); } return extensions.build(); diff --git a/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java index f07ddf205..cf209cefa 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java @@ -191,6 +191,21 @@ public class DomainCheckFlowTest extends ResourceCheckFlowTestCase + + + + example1.tld + example2.example + reserved.tld + specificuse.tld + + + + + abc123 + + + + example1.tld + USD + create + 1 + + + example2.example + USD + create + 1 + + + reserved.tld + USD + create + 1 + + + specificuse.tld + USD + create + 1 + + + + ABC-12345 + + diff --git a/core/src/test/resources/google/registry/flows/domain/domain_check_allocationtoken_fee_specificuse_response.xml b/core/src/test/resources/google/registry/flows/domain/domain_check_allocationtoken_fee_specificuse_response.xml new file mode 100644 index 000000000..d6910dbf2 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/domain/domain_check_allocationtoken_fee_specificuse_response.xml @@ -0,0 +1,63 @@ + + + + + Command completed successfully + + + + + example1.tld + Alloc token invalid for domain + + + example2.example + Alloc token invalid for domain + + + reserved.tld + Reserved + + + specificuse.tld + + + + + + + example2.example + USD + create + 1 + 13.00 + + + example1.tld + USD + create + 1 + 13.00 + + + reserved.tld + USD + create + 1 + reserved + + + specificuse.tld + USD + create + 1 + 13.00 + + + + + ABC-12345 + server-trid + + + diff --git a/core/src/test/resources/google/registry/flows/domain/domain_check_duplicates.xml b/core/src/test/resources/google/registry/flows/domain/domain_check_duplicates.xml index 5ef4e03e6..25639006a 100644 --- a/core/src/test/resources/google/registry/flows/domain/domain_check_duplicates.xml +++ b/core/src/test/resources/google/registry/flows/domain/domain_check_duplicates.xml @@ -3,6 +3,7 @@ example1.tld + example2.tld example1.tld