diff --git a/java/google/registry/flows/domain/DomainApplicationCreateFlow.java b/java/google/registry/flows/domain/DomainApplicationCreateFlow.java index 87deff8fb..a5174bc09 100644 --- a/java/google/registry/flows/domain/DomainApplicationCreateFlow.java +++ b/java/google/registry/flows/domain/DomainApplicationCreateFlow.java @@ -44,6 +44,7 @@ import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation; import com.google.common.base.Function; +import com.google.common.base.Optional; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -233,6 +234,8 @@ public final class DomainApplicationCreateFlow extends LoggedInFlow implements T DomainApplication newApplication = applicationBuilder.build(); HistoryEntry historyEntry = buildHistory(newApplication.getRepoId(), command.getPeriod()); ImmutableSet.Builder entitiesToSave = new ImmutableSet.Builder<>(); + handleExtraFlowLogic( + registry.getTldStr(), command.getPeriod().getValue(), historyEntry, newApplication); entitiesToSave.add( newApplication, historyEntry, @@ -333,6 +336,23 @@ public final class DomainApplicationCreateFlow extends LoggedInFlow implements T return responseExtensionsBuilder.build(); } + private void handleExtraFlowLogic( + String tld, int years, HistoryEntry historyEntry, DomainApplication newApplication) + throws EppException { + Optional extraFlowLogic = + RegistryExtraFlowLogicProxy.newInstanceForTld(tld); + if (extraFlowLogic.isPresent()) { + extraFlowLogic.get().performAdditionalApplicationCreateLogic( + newApplication, + clientId, + now, + years, + eppInput, + historyEntry); + extraFlowLogic.get().commitAdditionalLogicChanges(); + } + } + /** Landrush applications are disallowed during sunrise. */ static class LandrushApplicationDisallowedDuringSunriseException extends RequiredParameterMissingException { diff --git a/java/google/registry/flows/domain/RegistryExtraFlowLogic.java b/java/google/registry/flows/domain/RegistryExtraFlowLogic.java index 9f5f49587..088e7749e 100644 --- a/java/google/registry/flows/domain/RegistryExtraFlowLogic.java +++ b/java/google/registry/flows/domain/RegistryExtraFlowLogic.java @@ -15,6 +15,7 @@ package google.registry.flows.domain; import google.registry.flows.EppException; +import google.registry.model.domain.DomainApplication; import google.registry.model.domain.DomainResource; import google.registry.model.domain.fee.BaseFee; import google.registry.model.eppinput.EppInput; @@ -36,6 +37,20 @@ public interface RegistryExtraFlowLogic { public Set getExtensionFlags( DomainResource domainResource, String clientId, DateTime asOfDate); + /** + * Performs additional tasks required for an application create command. + * + *

Any changes should not be persisted to Datastore until commitAdditionalLogicChanges is + * called. + */ + public void performAdditionalApplicationCreateLogic( + DomainApplication application, + String clientId, + DateTime asOfDate, + int years, + EppInput eppInput, + HistoryEntry historyEntry) throws EppException; + /** * Computes the expected creation fee. * diff --git a/javatests/google/registry/flows/domain/DomainApplicationCreateFlowTest.java b/javatests/google/registry/flows/domain/DomainApplicationCreateFlowTest.java index 7ace3bfa8..dda4caa7e 100644 --- a/javatests/google/registry/flows/domain/DomainApplicationCreateFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainApplicationCreateFlowTest.java @@ -105,6 +105,8 @@ import google.registry.flows.exceptions.ResourceAlreadyExistsException; import google.registry.model.domain.DomainApplication; import google.registry.model.domain.GracePeriod; import google.registry.model.domain.LrpTokenEntity; +import google.registry.model.domain.TestExtraLogicManager; +import google.registry.model.domain.TestExtraLogicManager.TestExtraLogicManagerSuccessException; import google.registry.model.domain.launch.ApplicationStatus; import google.registry.model.domain.launch.LaunchNotice; import google.registry.model.domain.launch.LaunchPhase; @@ -155,6 +157,10 @@ public class DomainApplicationCreateFlowTest setEppInput("domain_create_sunrise_encoded_signed_mark.xml"); createTld("tld", TldState.SUNRISE); persistResource(Registry.get("tld").asBuilder().setReservedLists(createReservedList()).build()); + createTld("flags", TldState.LANDRUSH); + RegistryExtraFlowLogicProxy.setOverride("flags", TestExtraLogicManager.class); + persistResource( + Registry.get("flags").asBuilder().setReservedLists(createReservedList()).build()); inject.setStaticField(TmchCertificateAuthority.class, "clock", clock); clock.setTo(DateTime.parse("2014-09-09T09:09:09Z")); } @@ -1686,4 +1692,20 @@ public class DomainApplicationCreateFlowTest // ❤☀☆☂☻♞☯.tld doFailingDomainNameTest("xn--k3hel9n7bxlu1e.tld", InvalidIdnDomainLabelException.class); } + + @Test + public void testFailure_flags_feeMismatch() throws Exception { + persistContactsAndHosts(); + setEppInput("domain_create_landrush_flags.xml", ImmutableMap.of("FEE", "12")); + thrown.expect(FeesMismatchException.class); + runFlow(); + } + + @Test + public void testSuccess_flags() throws Exception { + persistContactsAndHosts(); + setEppInput("domain_create_landrush_flags.xml", ImmutableMap.of("FEE", "42")); + thrown.expect(TestExtraLogicManagerSuccessException.class, "flag1,flag2"); + runFlow(); + } } diff --git a/javatests/google/registry/flows/domain/testdata/domain_create_landrush_flags.xml b/javatests/google/registry/flows/domain/testdata/domain_create_landrush_flags.xml new file mode 100644 index 000000000..d420b18da --- /dev/null +++ b/javatests/google/registry/flows/domain/testdata/domain_create_landrush_flags.xml @@ -0,0 +1,36 @@ + + + + + + create-42.flags + + ns1.example.net + ns2.example.net + + jd1234 + sh8013 + sh8013 + + 2fooBAR + + + + + + landrush + + + USD + %FEE% + + + flag1 + flag2 + + + ABC-12345 + + diff --git a/javatests/google/registry/model/domain/TestExtraLogicManager.java b/javatests/google/registry/model/domain/TestExtraLogicManager.java index 81c46b965..fa10838d6 100644 --- a/javatests/google/registry/model/domain/TestExtraLogicManager.java +++ b/javatests/google/registry/model/domain/TestExtraLogicManager.java @@ -99,6 +99,26 @@ public class TestExtraLogicManager implements RegistryExtraFlowLogic { } } + /** + * Performs additional tasks required for an application create command. Any changes should not be + * persisted to Datastore until commitAdditionalLogicChanges is called. + */ + @Override + public void performAdditionalApplicationCreateLogic( + DomainApplication application, + String clientId, + DateTime asOfDate, + int years, + EppInput eppInput, + HistoryEntry historyEntry) throws EppException { + FlagsCreateCommandExtension flags = + eppInput.getSingleExtension(FlagsCreateCommandExtension.class); + if (flags == null) { + return; + } + messageToThrow = Joiner.on(',').join(flags.getFlags()); + } + /** Computes the expected create cost, for use in fee challenges and the like. */ @Override public BaseFee getCreateFeeOrCredit(