mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 03:57:51 +02:00
Implement default tokens for the fee extension in domain check flow (#1950)
* Implement default tokens for the fee extension in domain check * Add test for expired token * Add test for alloc token and default token * Fix formatting * Always check for default tokens * Change transaction time to passed in DateTime
This commit is contained in:
parent
d124a34649
commit
cf5e887f55
16 changed files with 794 additions and 38 deletions
|
@ -38,6 +38,7 @@ import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.flogger.FluentLogger;
|
||||||
import com.google.common.net.InternetDomainName;
|
import com.google.common.net.InternetDomainName;
|
||||||
import google.registry.config.RegistryConfig.Config;
|
import google.registry.config.RegistryConfig.Config;
|
||||||
import google.registry.flows.EppException;
|
import google.registry.flows.EppException;
|
||||||
|
@ -116,6 +117,7 @@ import org.joda.time.DateTime;
|
||||||
@ReportingSpec(ActivityReportField.DOMAIN_CHECK)
|
@ReportingSpec(ActivityReportField.DOMAIN_CHECK)
|
||||||
public final class DomainCheckFlow implements Flow {
|
public final class DomainCheckFlow implements Flow {
|
||||||
|
|
||||||
|
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
||||||
@Inject ResourceCommand resourceCommand;
|
@Inject ResourceCommand resourceCommand;
|
||||||
@Inject ExtensionManager extensionManager;
|
@Inject ExtensionManager extensionManager;
|
||||||
@Inject EppInput eppInput;
|
@Inject EppInput eppInput;
|
||||||
|
@ -271,6 +273,12 @@ public final class DomainCheckFlow implements Flow {
|
||||||
|
|
||||||
for (FeeCheckCommandExtensionItem feeCheckItem : feeCheck.getItems()) {
|
for (FeeCheckCommandExtensionItem feeCheckItem : feeCheck.getItems()) {
|
||||||
for (String domainName : getDomainNamesToCheckForFee(feeCheckItem, domainNames.keySet())) {
|
for (String domainName : getDomainNamesToCheckForFee(feeCheckItem, domainNames.keySet())) {
|
||||||
|
Optional<AllocationToken> defaultToken =
|
||||||
|
DomainFlowUtils.checkForDefaultToken(
|
||||||
|
Registry.get(InternetDomainName.from(domainName).parent().toString()),
|
||||||
|
domainName,
|
||||||
|
registrarId,
|
||||||
|
now);
|
||||||
FeeCheckResponseExtensionItem.Builder<?> builder = feeCheckItem.createResponseBuilder();
|
FeeCheckResponseExtensionItem.Builder<?> builder = feeCheckItem.createResponseBuilder();
|
||||||
Optional<Domain> domain = Optional.ofNullable(domainObjs.get(domainName));
|
Optional<Domain> domain = Optional.ofNullable(domainObjs.get(domainName));
|
||||||
handleFeeRequest(
|
handleFeeRequest(
|
||||||
|
@ -281,7 +289,7 @@ public final class DomainCheckFlow implements Flow {
|
||||||
feeCheck.getCurrency(),
|
feeCheck.getCurrency(),
|
||||||
now,
|
now,
|
||||||
pricingLogic,
|
pricingLogic,
|
||||||
allocationToken,
|
allocationToken.isPresent() ? allocationToken : defaultToken,
|
||||||
availableDomains.contains(domainName),
|
availableDomains.contains(domainName),
|
||||||
recurrences.getOrDefault(domainName, null));
|
recurrences.getOrDefault(domainName, null));
|
||||||
responseItems.add(builder.setDomainNameIfSupported(domainName).build());
|
responseItems.add(builder.setDomainNameIfSupported(domainName).build());
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
package google.registry.flows.domain;
|
package google.registry.flows.domain;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
|
||||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
|
||||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||||
import static google.registry.flows.FlowUtils.persistEntityChanges;
|
import static google.registry.flows.FlowUtils.persistEntityChanges;
|
||||||
import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
|
import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
|
||||||
|
@ -54,7 +52,6 @@ import static google.registry.model.tld.Registry.TldState.QUIET_PERIOD;
|
||||||
import static google.registry.model.tld.Registry.TldState.START_DATE_SUNRISE;
|
import static google.registry.model.tld.Registry.TldState.START_DATE_SUNRISE;
|
||||||
import static google.registry.model.tld.label.ReservationType.NAME_COLLISION;
|
import static google.registry.model.tld.label.ReservationType.NAME_COLLISION;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
||||||
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
||||||
|
|
||||||
|
@ -64,7 +61,6 @@ import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.net.InternetDomainName;
|
import com.google.common.net.InternetDomainName;
|
||||||
import google.registry.dns.DnsUtils;
|
import google.registry.dns.DnsUtils;
|
||||||
import google.registry.flows.EppException;
|
import google.registry.flows.EppException;
|
||||||
import google.registry.flows.EppException.AssociationProhibitsOperationException;
|
|
||||||
import google.registry.flows.EppException.CommandUseErrorException;
|
import google.registry.flows.EppException.CommandUseErrorException;
|
||||||
import google.registry.flows.EppException.ParameterValuePolicyErrorException;
|
import google.registry.flows.EppException.ParameterValuePolicyErrorException;
|
||||||
import google.registry.flows.ExtensionManager;
|
import google.registry.flows.ExtensionManager;
|
||||||
|
@ -121,9 +117,7 @@ import google.registry.model.tld.Registry.TldType;
|
||||||
import google.registry.model.tld.label.ReservationType;
|
import google.registry.model.tld.label.ReservationType;
|
||||||
import google.registry.model.tmch.ClaimsList;
|
import google.registry.model.tmch.ClaimsList;
|
||||||
import google.registry.model.tmch.ClaimsListDao;
|
import google.registry.model.tmch.ClaimsListDao;
|
||||||
import google.registry.persistence.VKey;
|
|
||||||
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -280,7 +274,8 @@ public final class DomainCreateFlow implements TransactionalFlow {
|
||||||
eppInput.getSingleExtension(AllocationTokenExtension.class));
|
eppInput.getSingleExtension(AllocationTokenExtension.class));
|
||||||
boolean defaultTokenUsed = false;
|
boolean defaultTokenUsed = false;
|
||||||
if (!allocationToken.isPresent() && !registry.getDefaultPromoTokens().isEmpty()) {
|
if (!allocationToken.isPresent() && !registry.getDefaultPromoTokens().isEmpty()) {
|
||||||
allocationToken = checkForDefaultToken(registry, command);
|
allocationToken =
|
||||||
|
DomainFlowUtils.checkForDefaultToken(registry, command.getDomainName(), registrarId, now);
|
||||||
if (allocationToken.isPresent()) {
|
if (allocationToken.isPresent()) {
|
||||||
defaultTokenUsed = true;
|
defaultTokenUsed = true;
|
||||||
}
|
}
|
||||||
|
@ -454,36 +449,6 @@ public final class DomainCreateFlow implements TransactionalFlow {
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<AllocationToken> checkForDefaultToken(
|
|
||||||
Registry registry, DomainCommand.Create command) throws EppException {
|
|
||||||
Map<VKey<AllocationToken>, Optional<AllocationToken>> tokens =
|
|
||||||
AllocationToken.getAll(registry.getDefaultPromoTokens());
|
|
||||||
ImmutableList<Optional<AllocationToken>> tokenList =
|
|
||||||
registry.getDefaultPromoTokens().stream()
|
|
||||||
.map(tokens::get)
|
|
||||||
.filter(Optional::isPresent)
|
|
||||||
.collect(toImmutableList());
|
|
||||||
checkState(
|
|
||||||
!isNullOrEmpty(tokenList),
|
|
||||||
"Failure while loading default TLD promotions from the database");
|
|
||||||
// Check if any of the tokens are valid for this domain registration
|
|
||||||
for (Optional<AllocationToken> token : tokenList) {
|
|
||||||
try {
|
|
||||||
AllocationTokenFlowUtils.validateToken(
|
|
||||||
InternetDomainName.from(command.getDomainName()),
|
|
||||||
token.get(),
|
|
||||||
registrarId,
|
|
||||||
tm().getTransactionTime());
|
|
||||||
} catch (AssociationProhibitsOperationException e) {
|
|
||||||
// Allocation token was not valid for this registration, continue to check the next token in
|
|
||||||
// the list
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Only use the first valid token in the list
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Verifies that signed marks are only sent during sunrise.
|
* Verifies that signed marks are only sent during sunrise.
|
||||||
*
|
*
|
||||||
|
|
|
@ -39,6 +39,7 @@ import static google.registry.model.tld.label.ReservationType.RESERVED_FOR_ANCHO
|
||||||
import static google.registry.model.tld.label.ReservationType.RESERVED_FOR_SPECIFIC_USE;
|
import static google.registry.model.tld.label.ReservationType.RESERVED_FOR_SPECIFIC_USE;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
||||||
import static google.registry.pricing.PricingEngineProxy.isDomainPremium;
|
import static google.registry.pricing.PricingEngineProxy.isDomainPremium;
|
||||||
|
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
||||||
import static google.registry.util.CollectionUtils.nullToEmpty;
|
import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
import static google.registry.util.DateTimeUtils.isAtOrAfter;
|
import static google.registry.util.DateTimeUtils.isAtOrAfter;
|
||||||
|
@ -63,6 +64,7 @@ import com.google.common.collect.Sets;
|
||||||
import com.google.common.collect.Streams;
|
import com.google.common.collect.Streams;
|
||||||
import com.google.common.net.InternetDomainName;
|
import com.google.common.net.InternetDomainName;
|
||||||
import google.registry.flows.EppException;
|
import google.registry.flows.EppException;
|
||||||
|
import google.registry.flows.EppException.AssociationProhibitsOperationException;
|
||||||
import google.registry.flows.EppException.AuthorizationErrorException;
|
import google.registry.flows.EppException.AuthorizationErrorException;
|
||||||
import google.registry.flows.EppException.CommandUseErrorException;
|
import google.registry.flows.EppException.CommandUseErrorException;
|
||||||
import google.registry.flows.EppException.ObjectDoesNotExistException;
|
import google.registry.flows.EppException.ObjectDoesNotExistException;
|
||||||
|
@ -72,6 +74,7 @@ import google.registry.flows.EppException.ParameterValueSyntaxErrorException;
|
||||||
import google.registry.flows.EppException.RequiredParameterMissingException;
|
import google.registry.flows.EppException.RequiredParameterMissingException;
|
||||||
import google.registry.flows.EppException.StatusProhibitsOperationException;
|
import google.registry.flows.EppException.StatusProhibitsOperationException;
|
||||||
import google.registry.flows.EppException.UnimplementedOptionException;
|
import google.registry.flows.EppException.UnimplementedOptionException;
|
||||||
|
import google.registry.flows.domain.token.AllocationTokenFlowUtils;
|
||||||
import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException;
|
import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException;
|
||||||
import google.registry.model.EppResource;
|
import google.registry.model.EppResource;
|
||||||
import google.registry.model.billing.BillingEvent;
|
import google.registry.model.billing.BillingEvent;
|
||||||
|
@ -1191,6 +1194,44 @@ public class DomainFlowUtils {
|
||||||
.getResultList();
|
.getResultList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if there is a valid default token to be used for a domain create command.
|
||||||
|
*
|
||||||
|
* <p>If there is more than one valid default token for the registration, only the first valid
|
||||||
|
* token found on the TLD's default token list will be returned.
|
||||||
|
*/
|
||||||
|
public static Optional<AllocationToken> checkForDefaultToken(
|
||||||
|
Registry registry, String domainName, String registrarId, DateTime now) throws EppException {
|
||||||
|
if (isNullOrEmpty(registry.getDefaultPromoTokens())) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
Map<VKey<AllocationToken>, Optional<AllocationToken>> tokens =
|
||||||
|
AllocationToken.getAll(registry.getDefaultPromoTokens());
|
||||||
|
ImmutableList<Optional<AllocationToken>> tokenList =
|
||||||
|
registry.getDefaultPromoTokens().stream()
|
||||||
|
.map(tokens::get)
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.collect(toImmutableList());
|
||||||
|
checkState(
|
||||||
|
!isNullOrEmpty(tokenList),
|
||||||
|
"Failure while loading default TLD promotions from the database");
|
||||||
|
// Check if any of the tokens are valid for this domain registration
|
||||||
|
for (Optional<AllocationToken> token : tokenList) {
|
||||||
|
try {
|
||||||
|
AllocationTokenFlowUtils.validateToken(
|
||||||
|
InternetDomainName.from(domainName), token.get(), registrarId, now);
|
||||||
|
} catch (AssociationProhibitsOperationException | StatusProhibitsOperationException e) {
|
||||||
|
// Allocation token was not valid for this registration, continue to check the next token in
|
||||||
|
// the list
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Only use the first valid token in the list
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
// No valid default token found
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
/** Resource linked to this domain does not exist. */
|
/** Resource linked to this domain does not exist. */
|
||||||
static class LinkedResourcesDoNotExistException extends ObjectDoesNotExistException {
|
static class LinkedResourcesDoNotExistException extends ObjectDoesNotExistException {
|
||||||
public LinkedResourcesDoNotExistException(Class<?> type, ImmutableSet<String> resourceIds) {
|
public LinkedResourcesDoNotExistException(Class<?> type, ImmutableSet<String> resourceIds) {
|
||||||
|
|
|
@ -17,6 +17,7 @@ package google.registry.flows.domain;
|
||||||
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.DEFAULT;
|
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.DEFAULT;
|
||||||
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.NONPREMIUM;
|
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.NONPREMIUM;
|
||||||
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.SPECIFIED;
|
import static google.registry.model.billing.BillingEvent.RenewalPriceBehavior.SPECIFIED;
|
||||||
|
import static google.registry.model.domain.token.AllocationToken.TokenType.DEFAULT_PROMO;
|
||||||
import static google.registry.model.domain.token.AllocationToken.TokenType.SINGLE_USE;
|
import static google.registry.model.domain.token.AllocationToken.TokenType.SINGLE_USE;
|
||||||
import static google.registry.model.domain.token.AllocationToken.TokenType.UNLIMITED_USE;
|
import static google.registry.model.domain.token.AllocationToken.TokenType.UNLIMITED_USE;
|
||||||
import static google.registry.model.eppoutput.CheckData.DomainCheck.create;
|
import static google.registry.model.eppoutput.CheckData.DomainCheck.create;
|
||||||
|
@ -38,6 +39,7 @@ import static org.joda.money.CurrencyUnit.USD;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.ImmutableSortedMap;
|
import com.google.common.collect.ImmutableSortedMap;
|
||||||
|
@ -350,6 +352,28 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_allocationtoken_fee_response.xml"));
|
runFlowAssertResponse(loadFile("domain_check_allocationtoken_fee_response.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSuccess_allocationTokenPromotion_doesNotUseValidDefaultToken_singleYear()
|
||||||
|
throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
createTld("example");
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("abc123")
|
||||||
|
.setTokenType(UNLIMITED_USE)
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.setDiscountYears(2)
|
||||||
|
.setTokenStatusTransitions(
|
||||||
|
ImmutableSortedMap.<DateTime, TokenStatus>naturalOrder()
|
||||||
|
.put(START_OF_TIME, TokenStatus.NOT_STARTED)
|
||||||
|
.put(clock.nowUtc().minusDays(1), TokenStatus.VALID)
|
||||||
|
.put(clock.nowUtc().plusDays(1), TokenStatus.ENDED)
|
||||||
|
.build())
|
||||||
|
.build());
|
||||||
|
setEppInput("domain_check_allocationtoken_fee.xml");
|
||||||
|
runFlowAssertResponse(loadFile("domain_check_allocationtoken_fee_response.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testSuccess_allocationTokenPromotion_multiYearAndPremiums() throws Exception {
|
void testSuccess_allocationTokenPromotion_multiYearAndPremiums() throws Exception {
|
||||||
createTld("example");
|
createTld("example");
|
||||||
|
@ -760,6 +784,31 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_fee_response_v06.xml"));
|
runFlowAssertResponse(loadFile("domain_check_fee_response_v06.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setUpDefaultToken() {
|
||||||
|
AllocationToken defaultToken =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("bbbbb")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("tld"))
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.build());
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setDefaultPromoTokens(ImmutableList.of(defaultToken.createVKey()))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFeeExtension_defaultToken_v06() throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
persistActiveDomain("example1.tld");
|
||||||
|
setEppInput("domain_check_fee_v06.xml", ImmutableMap.of("CURRENCY", "USD"));
|
||||||
|
runFlowAssertResponse(loadFile("domain_check_fee_response_default_token_v06.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testFeeExtension_multipleReservations() throws Exception {
|
void testFeeExtension_multipleReservations() throws Exception {
|
||||||
persistResource(
|
persistResource(
|
||||||
|
@ -780,6 +829,14 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_fee_response_v11.xml"));
|
runFlowAssertResponse(loadFile("domain_check_fee_response_v11.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFeeExtension_defaultToken_v11() throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
persistActiveDomain("example1.tld");
|
||||||
|
setEppInput("domain_check_fee_v11.xml", ImmutableMap.of("CURRENCY", "USD"));
|
||||||
|
runFlowAssertResponse(loadFile("domain_check_fee_response_default_token_v11.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testFeeExtension_v12() throws Exception {
|
void testFeeExtension_v12() throws Exception {
|
||||||
persistActiveDomain("example1.tld");
|
persistActiveDomain("example1.tld");
|
||||||
|
@ -787,6 +844,14 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_fee_response_v12.xml"));
|
runFlowAssertResponse(loadFile("domain_check_fee_response_v12.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFeeExtension_defaultToken_v12() throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
persistActiveDomain("example1.tld");
|
||||||
|
setEppInput("domain_check_fee_v12.xml", ImmutableMap.of("CURRENCY", "USD"));
|
||||||
|
runFlowAssertResponse(loadFile("domain_check_fee_response_default_token_v12.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testSuccess_thirtyDomains_restoreFees() throws Exception {
|
void testSuccess_thirtyDomains_restoreFees() throws Exception {
|
||||||
// Note that 30 is more than 25, which is the maximum # of entity groups you can enlist in a
|
// Note that 30 is more than 25, which is the maximum # of entity groups you can enlist in a
|
||||||
|
@ -810,6 +875,14 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_fee_multiple_commands_response_v06.xml"));
|
runFlowAssertResponse(loadFile("domain_check_fee_multiple_commands_response_v06.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFeeExtension_multipleCommands_defaultTokenOnlyOnCreate_v06() throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
setEppInput("domain_check_fee_multiple_commands_v06.xml");
|
||||||
|
runFlowAssertResponse(
|
||||||
|
loadFile("domain_check_fee_multiple_commands_default_token_response_v06.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
// Version 11 cannot have multiple commands.
|
// Version 11 cannot have multiple commands.
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -818,6 +891,80 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase<DomainCheckFlow, Dom
|
||||||
runFlowAssertResponse(loadFile("domain_check_fee_multiple_commands_response_v12.xml"));
|
runFlowAssertResponse(loadFile("domain_check_fee_multiple_commands_response_v12.xml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFeeExtension_multipleCommands_defaultTokenOnlyOnCreate_v12() throws Exception {
|
||||||
|
setUpDefaultToken();
|
||||||
|
setEppInput("domain_check_fee_multiple_commands_v12.xml");
|
||||||
|
runFlowAssertResponse(
|
||||||
|
loadFile("domain_check_fee_multiple_commands_default_token_response_v12.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void testFeeExtension_defaultToken_notValidForAllLabels_v06() throws Exception {
|
||||||
|
createTld("example");
|
||||||
|
AllocationToken defaultToken =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("bbbbb")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("example"))
|
||||||
|
.setDiscountPremiums(false)
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.build());
|
||||||
|
persistResource(
|
||||||
|
Registry.get("example")
|
||||||
|
.asBuilder()
|
||||||
|
.setDefaultPromoTokens(ImmutableList.of(defaultToken.createVKey()))
|
||||||
|
.build());
|
||||||
|
setEppInput("domain_check_fee_default_token_multiple_names_v06.xml");
|
||||||
|
runFlowAssertResponse(
|
||||||
|
loadFile("domain_check_fee_default_token_multiple_names_response_v06.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void testFeeExtension_defaultToken_notValidForAllLabels_v11() throws Exception {
|
||||||
|
createTld("example");
|
||||||
|
AllocationToken defaultToken =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("bbbbb")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("example"))
|
||||||
|
.setDiscountPremiums(false)
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.build());
|
||||||
|
persistResource(
|
||||||
|
Registry.get("example")
|
||||||
|
.asBuilder()
|
||||||
|
.setDefaultPromoTokens(ImmutableList.of(defaultToken.createVKey()))
|
||||||
|
.build());
|
||||||
|
setEppInput("domain_check_fee_default_token_multiple_names_v11.xml");
|
||||||
|
runFlowAssertResponse(
|
||||||
|
loadFile("domain_check_fee_default_token_multiple_names_response_v11.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void testFeeExtension_defaultToken_notValidForAllLabels_v12() throws Exception {
|
||||||
|
createTld("example");
|
||||||
|
AllocationToken defaultToken =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("bbbbb")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("example"))
|
||||||
|
.setDiscountPremiums(false)
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.build());
|
||||||
|
persistResource(
|
||||||
|
Registry.get("example")
|
||||||
|
.asBuilder()
|
||||||
|
.setDefaultPromoTokens(ImmutableList.of(defaultToken.createVKey()))
|
||||||
|
.build());
|
||||||
|
setEppInput("domain_check_fee_default_token_multiple_names_v12.xml");
|
||||||
|
runFlowAssertResponse(
|
||||||
|
loadFile("domain_check_fee_default_token_multiple_names_response_v12.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
/** Test the same as {@link #testFeeExtension_multipleCommands_v06} with premium labels. */
|
/** Test the same as {@link #testFeeExtension_multipleCommands_v06} with premium labels. */
|
||||||
@Test
|
@Test
|
||||||
void testFeeExtension_premiumLabels_v06() throws Exception {
|
void testFeeExtension_premiumLabels_v06() throws Exception {
|
||||||
|
|
|
@ -2012,6 +2012,41 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertThat(billingEvent.getCost()).isEqualTo(Money.of(USD, BigDecimal.valueOf(19.5)));
|
assertThat(billingEvent.getCost()).isEqualTo(Money.of(USD, BigDecimal.valueOf(19.5)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSuccess_skipsOverExpiredDefaultToken() throws Exception {
|
||||||
|
persistContactsAndHosts();
|
||||||
|
AllocationToken defaultToken1 =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("aaaaa")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("NewRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("tld"))
|
||||||
|
.build());
|
||||||
|
AllocationToken defaultToken2 =
|
||||||
|
persistResource(
|
||||||
|
new AllocationToken.Builder()
|
||||||
|
.setToken("bbbbb")
|
||||||
|
.setTokenType(DEFAULT_PROMO)
|
||||||
|
.setDiscountFraction(0.5)
|
||||||
|
.setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar"))
|
||||||
|
.setAllowedTlds(ImmutableSet.of("tld"))
|
||||||
|
.setTokenStatusTransitions(
|
||||||
|
ImmutableSortedMap.<DateTime, TokenStatus>naturalOrder()
|
||||||
|
.put(START_OF_TIME, TokenStatus.NOT_STARTED)
|
||||||
|
.put(clock.nowUtc().minusDays(2), TokenStatus.VALID)
|
||||||
|
.put(clock.nowUtc().minusDays(1), TokenStatus.ENDED)
|
||||||
|
.build())
|
||||||
|
.build());
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setDefaultPromoTokens(
|
||||||
|
ImmutableList.of(defaultToken1.createVKey(), defaultToken2.createVKey()))
|
||||||
|
.build());
|
||||||
|
doSuccessfulTest();
|
||||||
|
}
|
||||||
|
|
||||||
BillingEvent.OneTime runTest_defaultToken(String token) throws Exception {
|
BillingEvent.OneTime runTest_defaultToken(String token) throws Exception {
|
||||||
setEppInput("domain_create.xml", ImmutableMap.of("DOMAIN", "example.tld"));
|
setEppInput("domain_create.xml", ImmutableMap.of("DOMAIN", "example.tld"));
|
||||||
runFlowAssertResponse(
|
runFlowAssertResponse(
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">rich.example</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>rich.example</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">100.00</fee:fee>
|
||||||
|
<fee:class>premium</fee:class>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example2.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">4.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example3.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">2</fee:period>
|
||||||
|
<fee:fee description="create">12.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,70 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">rich.example</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.11"
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>rich.example</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">100.00</fee:fee>
|
||||||
|
<fee:class>premium</fee:class>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,71 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">rich.example</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.12"
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>rich.example</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">100.00</fee:fee>
|
||||||
|
<fee:class>premium</fee:class>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<check>
|
||||||
|
<domain:check xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>rich.example</domain:name>
|
||||||
|
<domain:name>example1.example</domain:name>
|
||||||
|
<domain:name>example2.example</domain:name>
|
||||||
|
<domain:name>example3.example</domain:name>
|
||||||
|
</domain:check>
|
||||||
|
</check>
|
||||||
|
<extension>
|
||||||
|
<fee:check xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:domain>
|
||||||
|
<fee:name>rich.example</fee:name>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
</fee:domain>
|
||||||
|
<fee:domain>
|
||||||
|
<fee:name>example2.tld</fee:name>
|
||||||
|
<fee:currency>%CURRENCY%</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
</fee:domain>
|
||||||
|
<fee:domain>
|
||||||
|
<fee:name>example3.tld</fee:name>
|
||||||
|
<fee:currency>%CURRENCY%</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">2</fee:period>
|
||||||
|
</fee:domain>
|
||||||
|
</fee:check>
|
||||||
|
</extension>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<check>
|
||||||
|
<domain:check xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>rich.example</domain:name>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</domain:check>
|
||||||
|
</check>
|
||||||
|
<extension>
|
||||||
|
<launch:check xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" type="avail">
|
||||||
|
<launch:phase name="foo">custom</launch:phase>
|
||||||
|
</launch:check>
|
||||||
|
<fee:check xmlns:fee="urn:ietf:params:xml:ns:fee-0.11">
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:class>premium</fee:class>
|
||||||
|
</fee:check>
|
||||||
|
</extension>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<check>
|
||||||
|
<domain:check xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>rich.example</domain:name>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</domain:check>
|
||||||
|
</check>
|
||||||
|
<extension>
|
||||||
|
<launch:check xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" type="avail">
|
||||||
|
<launch:phase name="foo">custom</launch:phase>
|
||||||
|
</launch:check>
|
||||||
|
<fee:check xmlns:fee="urn:ietf:params:xml:ns:fee-0.12">
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:class>premium</fee:class>
|
||||||
|
</fee:command>
|
||||||
|
</fee:check>
|
||||||
|
</extension>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>
|
|
@ -0,0 +1,57 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example1.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example1.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example1.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>renew</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="renew">11.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example1.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>transfer</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="renew">11.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example1.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>restore</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="restore">17.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example1.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>update</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="update">0.00</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,68 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example1.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.12"
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="renew">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="renew">11.00</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="transfer">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="renew">11.00</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="restore">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="restore">17.00</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="update">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="update">0.00</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,43 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example2.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd xmlns:fee="urn:ietf:params:xml:ns:fee-0.6">
|
||||||
|
<fee:name>example3.tld</fee:name>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:period unit="y">2</fee:period>
|
||||||
|
<fee:fee description="create">19.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,57 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.11"
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd avail="1">
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command>create</fee:command>
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -0,0 +1,58 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="0">example1.tld</domain:name>
|
||||||
|
<domain:reason>In use</domain:reason>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example2.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
<domain:cd>
|
||||||
|
<domain:name avail="1">example3.tld</domain:name>
|
||||||
|
</domain:cd>
|
||||||
|
</domain:chkData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<fee:chkData xmlns:fee="urn:ietf:params:xml:ns:fee-0.12"
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<fee:currency>USD</fee:currency>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example1.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example2.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
<fee:cd>
|
||||||
|
<fee:object>
|
||||||
|
<domain:name>example3.tld</domain:name>
|
||||||
|
</fee:object>
|
||||||
|
<fee:command name="create">
|
||||||
|
<fee:period unit="y">1</fee:period>
|
||||||
|
<fee:fee description="create">6.50</fee:fee>
|
||||||
|
</fee:command>
|
||||||
|
</fee:cd>
|
||||||
|
</fee:chkData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
Loading…
Add table
Reference in a new issue