From ebfa27b3ad92f445276eb37696442d17374ae806 Mon Sep 17 00:00:00 2001 From: mcilwain Date: Fri, 1 Dec 2017 09:02:32 -0800 Subject: [PATCH] Require fee extension when registering domain in EAP Failing to use the fee extension during EAP can result in charges to registrars that are radically different than what they may have been expecting. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=177597883 --- docs/flows.md | 2 ++ .../flows/domain/DomainCreateFlow.java | 1 + .../flows/domain/DomainFlowUtils.java | 18 ++++++++++++--- .../flows/domain/DomainCreateFlowTest.java | 23 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) 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