diff --git a/docs/flows.md b/docs/flows.md index e8de6a1c2..80e5ed56c 100644 --- a/docs/flows.md +++ b/docs/flows.md @@ -517,6 +517,8 @@ An EPP flow that creates a new domain resource. * Service extension(s) must be declared at login. * The current registry phase does not allow for general registrations. * 2003 + * Fees must be explicitly acknowledged when creating domains during the + Early Access Program. * Fees must be explicitly acknowledged when performing any operations on a premium name. * Admin contact is required. diff --git a/java/google/registry/flows/domain/DomainCreateFlow.java b/java/google/registry/flows/domain/DomainCreateFlow.java index cf49d0286..724f94ec1 100644 --- a/java/google/registry/flows/domain/DomainCreateFlow.java +++ b/java/google/registry/flows/domain/DomainCreateFlow.java @@ -133,6 +133,7 @@ import org.joda.time.Duration; * @error {@link DomainFlowUtils.ExceedsMaxRegistrationYearsException} * @error {@link DomainFlowUtils.ExpiredClaimException} * @error {@link DomainFlowUtils.FeesMismatchException} + * @error {@link DomainFlowUtils.FeesRequiredDuringEarlyAccessProgramException} * @error {@link DomainFlowUtils.FeesRequiredForPremiumNameException} * @error {@link DomainFlowUtils.InvalidIdnDomainLabelException} * @error {@link DomainFlowUtils.InvalidLrpTokenException} diff --git a/java/google/registry/flows/domain/DomainFlowUtils.java b/java/google/registry/flows/domain/DomainFlowUtils.java index 02dc9d329..67b1077f1 100644 --- a/java/google/registry/flows/domain/DomainFlowUtils.java +++ b/java/google/registry/flows/domain/DomainFlowUtils.java @@ -631,6 +631,9 @@ public class DomainFlowUtils { // This only happens when the total fees are non-zero and include custom fees requiring the // extension. if (feeCommand == null) { + if (!feesAndCredits.getEapCost().isZero()) { + throw new FeesRequiredDuringEarlyAccessProgramException(feesAndCredits.getEapCost()); + } if (feesAndCredits.getTotalCost().isZero() || !feesAndCredits.isFeeExtensionRequired()) { return; } @@ -1167,9 +1170,6 @@ public class DomainFlowUtils { /** Fees must be explicitly acknowledged when performing an operation which is not free. */ static class FeesRequiredForNonFreeOperationException extends RequiredParameterMissingException { - FeesRequiredForNonFreeOperationException() { - super("Fees must be explicitly acknowledged when performing an operation which is not free."); - } public FeesRequiredForNonFreeOperationException(Money expectedFee) { super( @@ -1179,6 +1179,18 @@ public class DomainFlowUtils { } } + /** Fees must be explicitly acknowledged when creating domains during the Early Access Program. */ + static class FeesRequiredDuringEarlyAccessProgramException + extends RequiredParameterMissingException { + + public FeesRequiredDuringEarlyAccessProgramException(Money expectedFee) { + super( + "Fees must be explicitly acknowledged when creating domains " + + "during the Early Access Program. The EAP fee is: " + + expectedFee); + } + } + /** The 'grace-period', 'applied' and 'refundable' fields are disallowed by server policy. */ static class UnsupportedFeeAttributeException extends UnimplementedOptionException { UnsupportedFeeAttributeException() { diff --git a/javatests/google/registry/flows/domain/DomainCreateFlowTest.java b/javatests/google/registry/flows/domain/DomainCreateFlowTest.java index 003aaf65b..c2f0ee66f 100644 --- a/javatests/google/registry/flows/domain/DomainCreateFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainCreateFlowTest.java @@ -43,6 +43,7 @@ import static google.registry.testing.DatastoreHelper.persistReservedList; import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DomainResourceSubject.assertAboutDomains; import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions; +import static google.registry.testing.JUnitBackports.expectThrows; import static google.registry.testing.TaskQueueHelper.assertDnsTasksEnqueued; import static google.registry.testing.TaskQueueHelper.assertNoDnsTasksEnqueued; import static google.registry.testing.TaskQueueHelper.assertNoTasksEnqueued; @@ -82,6 +83,7 @@ import google.registry.flows.domain.DomainFlowUtils.EmptyDomainNamePartException import google.registry.flows.domain.DomainFlowUtils.ExceedsMaxRegistrationYearsException; import google.registry.flows.domain.DomainFlowUtils.ExpiredClaimException; import google.registry.flows.domain.DomainFlowUtils.FeesMismatchException; +import google.registry.flows.domain.DomainFlowUtils.FeesRequiredDuringEarlyAccessProgramException; import google.registry.flows.domain.DomainFlowUtils.FeesRequiredForPremiumNameException; import google.registry.flows.domain.DomainFlowUtils.InvalidIdnDomainLabelException; import google.registry.flows.domain.DomainFlowUtils.InvalidLrpTokenException; @@ -1967,6 +1969,27 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase