From 06a1fc00229f858984feba7ca16c6bb649644109 Mon Sep 17 00:00:00 2001 From: sarahcaseybot Date: Tue, 30 Aug 2022 17:50:42 -0400 Subject: [PATCH] Add a packageToken EPP extension for use in the DomainInfo flow (#1760) * Add a packageToken EPP extension for use in the DomainInfo flow * small fixes * Change namespace --- .../registry/flows/domain/DomainInfoFlow.java | 15 +++- .../packagetoken/PackageTokenExtension.java | 23 ++++++ .../PackageTokenResponseExtension.java | 45 +++++++++++ .../domain/packagetoken/package-info.java | 27 +++++++ .../model/eppcommon/EppXmlTransformer.java | 40 +++++----- .../registry/model/eppinput/EppInput.java | 2 + .../registry/model/eppoutput/EppResponse.java | 47 ++++++----- .../google/registry/xml/xsd/packageToken.xsd | 38 +++++++++ .../flows/domain/DomainInfoFlowTest.java | 80 +++++++++++++++++++ .../flows/domain/domain_info_package.xml | 16 ++++ .../domain_info_response_empty_package.xml | 45 +++++++++++ .../domain/domain_info_response_package.xml | 45 +++++++++++ ...domain_info_response_superuser_package.xml | 26 ++++++ 13 files changed, 407 insertions(+), 42 deletions(-) create mode 100644 core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenExtension.java create mode 100644 core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenResponseExtension.java create mode 100644 core/src/main/java/google/registry/model/domain/packagetoken/package-info.java create mode 100644 core/src/main/java/google/registry/xml/xsd/packageToken.xsd create mode 100644 core/src/test/resources/google/registry/flows/domain/domain_info_package.xml create mode 100644 core/src/test/resources/google/registry/flows/domain/domain_info_response_empty_package.xml create mode 100644 core/src/test/resources/google/registry/flows/domain/domain_info_response_package.xml create mode 100644 core/src/test/resources/google/registry/flows/domain/domain_info_response_superuser_package.xml 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 47adf8a63..38caadd19 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java @@ -30,6 +30,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; +import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainInfoFlowCustomLogic; @@ -42,6 +43,8 @@ import google.registry.model.domain.DomainCommand.Info.HostsRequest; import google.registry.model.domain.DomainInfoData; import google.registry.model.domain.fee06.FeeInfoCommandExtensionV06; import google.registry.model.domain.fee06.FeeInfoResponseExtensionV06; +import google.registry.model.domain.packagetoken.PackageTokenExtension; +import google.registry.model.domain.packagetoken.PackageTokenResponseExtension; import google.registry.model.domain.rgp.GracePeriodStatus; import google.registry.model.domain.rgp.RgpInfoExtension; import google.registry.model.eppcommon.AuthInfo; @@ -85,13 +88,14 @@ public final class DomainInfoFlow implements Flow { @Inject EppResponse.Builder responseBuilder; @Inject DomainInfoFlowCustomLogic flowCustomLogic; @Inject DomainPricingLogic pricingLogic; + @Inject @Superuser boolean isSuperuser; @Inject DomainInfoFlow() {} @Override public EppResponse run() throws EppException { - extensionManager.register(FeeInfoCommandExtensionV06.class); + extensionManager.register(FeeInfoCommandExtensionV06.class, PackageTokenExtension.class); flowCustomLogic.beforeValidation(); validateRegistrarIsLoggedIn(registrarId); extensionManager.validate(); @@ -150,6 +154,15 @@ public final class DomainInfoFlow implements Flow { if (!gracePeriodStatuses.isEmpty()) { extensions.add(RgpInfoExtension.create(gracePeriodStatuses)); } + Optional packageInfo = + eppInput.getSingleExtension(PackageTokenExtension.class); + if (packageInfo.isPresent()) { + // Package info was requested. + if (isSuperuser || registrarId.equals(domain.getCurrentSponsorRegistrarId())) { + // Only show package info to owning registrar or superusers + extensions.add(PackageTokenResponseExtension.create(domain.getCurrentPackageToken())); + } + } Optional feeInfo = eppInput.getSingleExtension(FeeInfoCommandExtensionV06.class); if (feeInfo.isPresent()) { // Fee check was requested. diff --git a/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenExtension.java b/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenExtension.java new file mode 100644 index 000000000..64f7a3a40 --- /dev/null +++ b/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenExtension.java @@ -0,0 +1,23 @@ +// Copyright 2022 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.model.domain.packagetoken; + +import google.registry.model.ImmutableObject; +import google.registry.model.eppinput.EppInput.CommandExtension; +import javax.xml.bind.annotation.XmlRootElement; + +/** A package token extension that may be present on EPP domain commands. */ +@XmlRootElement(name = "info") +public class PackageTokenExtension extends ImmutableObject implements CommandExtension {} diff --git a/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenResponseExtension.java b/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenResponseExtension.java new file mode 100644 index 000000000..3d5240c90 --- /dev/null +++ b/core/src/main/java/google/registry/model/domain/packagetoken/PackageTokenResponseExtension.java @@ -0,0 +1,45 @@ +// Copyright 2022 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.model.domain.packagetoken; + +import google.registry.model.ImmutableObject; +import google.registry.model.domain.token.AllocationToken; +import google.registry.model.eppoutput.EppResponse.ResponseExtension; +import google.registry.persistence.VKey; +import google.registry.xml.TrimWhitespaceAdapter; +import java.util.Optional; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +/** + * An XML data object that represents a package token extension that may be present on the response + * to EPP domain info commands. + */ +@XmlRootElement(name = "packageData") +public class PackageTokenResponseExtension extends ImmutableObject implements ResponseExtension { + + /** Token string of the PACKAGE token the name belongs to. */ + @XmlJavaTypeAdapter(TrimWhitespaceAdapter.class) + String token; + + public static PackageTokenResponseExtension create(Optional> tokenKey) { + PackageTokenResponseExtension instance = new PackageTokenResponseExtension(); + instance.token = ""; + if (tokenKey.isPresent()) { + instance.token = tokenKey.get().getSqlKey().toString(); + } + return instance; + } +} diff --git a/core/src/main/java/google/registry/model/domain/packagetoken/package-info.java b/core/src/main/java/google/registry/model/domain/packagetoken/package-info.java new file mode 100644 index 000000000..af29abadf --- /dev/null +++ b/core/src/main/java/google/registry/model/domain/packagetoken/package-info.java @@ -0,0 +1,27 @@ +// Copyright 2022 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@XmlSchema( + namespace = "urn:google:params:xml:ns:packageToken-1.0", + xmlns = + @XmlNs(prefix = "packageToken", namespaceURI = "urn:google:params:xml:ns:packageToken-1.0"), + elementFormDefault = XmlNsForm.QUALIFIED) +@XmlAccessorType(XmlAccessType.FIELD) +package google.registry.model.domain.packagetoken; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlNs; +import javax.xml.bind.annotation.XmlNsForm; +import javax.xml.bind.annotation.XmlSchema; diff --git a/core/src/main/java/google/registry/model/eppcommon/EppXmlTransformer.java b/core/src/main/java/google/registry/model/eppcommon/EppXmlTransformer.java index b4a3a0c2a..ab5d90d4c 100644 --- a/core/src/main/java/google/registry/model/eppcommon/EppXmlTransformer.java +++ b/core/src/main/java/google/registry/model/eppcommon/EppXmlTransformer.java @@ -31,25 +31,27 @@ import java.io.ByteArrayOutputStream; public class EppXmlTransformer { // Hardcoded XML schemas, ordered with respect to dependency. - private static final ImmutableList SCHEMAS = ImmutableList.of( - "eppcom.xsd", - "epp.xsd", - "contact.xsd", - "host.xsd", - "domain.xsd", - "rgp.xsd", - "secdns.xsd", - "fee06.xsd", - "fee11.xsd", - "fee12.xsd", - "metadata.xsd", - "mark.xsd", - "dsig.xsd", - "smd.xsd", - "launch.xsd", - "allocate.xsd", - "superuser.xsd", - "allocationToken-1.0.xsd"); + private static final ImmutableList SCHEMAS = + ImmutableList.of( + "eppcom.xsd", + "epp.xsd", + "contact.xsd", + "host.xsd", + "domain.xsd", + "rgp.xsd", + "secdns.xsd", + "fee06.xsd", + "fee11.xsd", + "fee12.xsd", + "metadata.xsd", + "mark.xsd", + "dsig.xsd", + "smd.xsd", + "launch.xsd", + "allocate.xsd", + "superuser.xsd", + "allocationToken-1.0.xsd", + "packageToken.xsd"); private static final XmlTransformer INPUT_TRANSFORMER = new XmlTransformer(SCHEMAS, EppInput.class); diff --git a/core/src/main/java/google/registry/model/eppinput/EppInput.java b/core/src/main/java/google/registry/model/eppinput/EppInput.java index de0dc456c..ca6071d0e 100644 --- a/core/src/main/java/google/registry/model/eppinput/EppInput.java +++ b/core/src/main/java/google/registry/model/eppinput/EppInput.java @@ -45,6 +45,7 @@ import google.registry.model.domain.launch.LaunchDeleteExtension; import google.registry.model.domain.launch.LaunchInfoExtension; import google.registry.model.domain.launch.LaunchUpdateExtension; import google.registry.model.domain.metadata.MetadataExtension; +import google.registry.model.domain.packagetoken.PackageTokenExtension; import google.registry.model.domain.rgp.RgpUpdateExtension; import google.registry.model.domain.secdns.SecDnsCreateExtension; import google.registry.model.domain.secdns.SecDnsUpdateExtension; @@ -362,6 +363,7 @@ public class EppInput extends ImmutableObject { // Other extensions @XmlElementRef(type = AllocationTokenExtension.class), @XmlElementRef(type = MetadataExtension.class), + @XmlElementRef(type = PackageTokenExtension.class), @XmlElementRef(type = RgpUpdateExtension.class), @XmlElementRef(type = SecDnsCreateExtension.class), @XmlElementRef(type = SecDnsUpdateExtension.class) diff --git a/core/src/main/java/google/registry/model/eppoutput/EppResponse.java b/core/src/main/java/google/registry/model/eppoutput/EppResponse.java index 4870c0f95..0446585c8 100644 --- a/core/src/main/java/google/registry/model/eppoutput/EppResponse.java +++ b/core/src/main/java/google/registry/model/eppoutput/EppResponse.java @@ -43,6 +43,7 @@ import google.registry.model.domain.fee12.FeeRenewResponseExtensionV12; import google.registry.model.domain.fee12.FeeTransferResponseExtensionV12; import google.registry.model.domain.fee12.FeeUpdateResponseExtensionV12; import google.registry.model.domain.launch.LaunchCheckResponseExtension; +import google.registry.model.domain.packagetoken.PackageTokenResponseExtension; import google.registry.model.domain.rgp.RgpInfoExtension; import google.registry.model.domain.secdns.SecDnsInfoExtension; import google.registry.model.eppcommon.Trid; @@ -121,28 +122,30 @@ public class EppResponse extends ImmutableObject implements ResponseOrGreeting { /** Zero or more response extensions. */ @XmlElementRefs({ - @XmlElementRef(type = FeeCheckResponseExtensionV06.class), - @XmlElementRef(type = FeeInfoResponseExtensionV06.class), - @XmlElementRef(type = FeeCreateResponseExtensionV06.class), - @XmlElementRef(type = FeeDeleteResponseExtensionV06.class), - @XmlElementRef(type = FeeRenewResponseExtensionV06.class), - @XmlElementRef(type = FeeTransferResponseExtensionV06.class), - @XmlElementRef(type = FeeUpdateResponseExtensionV06.class), - @XmlElementRef(type = FeeCheckResponseExtensionV11.class), - @XmlElementRef(type = FeeCreateResponseExtensionV11.class), - @XmlElementRef(type = FeeDeleteResponseExtensionV11.class), - @XmlElementRef(type = FeeRenewResponseExtensionV11.class), - @XmlElementRef(type = FeeTransferResponseExtensionV11.class), - @XmlElementRef(type = FeeUpdateResponseExtensionV11.class), - @XmlElementRef(type = FeeCheckResponseExtensionV12.class), - @XmlElementRef(type = FeeCreateResponseExtensionV12.class), - @XmlElementRef(type = FeeDeleteResponseExtensionV12.class), - @XmlElementRef(type = FeeRenewResponseExtensionV12.class), - @XmlElementRef(type = FeeTransferResponseExtensionV12.class), - @XmlElementRef(type = FeeUpdateResponseExtensionV12.class), - @XmlElementRef(type = LaunchCheckResponseExtension.class), - @XmlElementRef(type = RgpInfoExtension.class), - @XmlElementRef(type = SecDnsInfoExtension.class) }) + @XmlElementRef(type = FeeCheckResponseExtensionV06.class), + @XmlElementRef(type = FeeInfoResponseExtensionV06.class), + @XmlElementRef(type = FeeCreateResponseExtensionV06.class), + @XmlElementRef(type = FeeDeleteResponseExtensionV06.class), + @XmlElementRef(type = FeeRenewResponseExtensionV06.class), + @XmlElementRef(type = FeeTransferResponseExtensionV06.class), + @XmlElementRef(type = FeeUpdateResponseExtensionV06.class), + @XmlElementRef(type = FeeCheckResponseExtensionV11.class), + @XmlElementRef(type = FeeCreateResponseExtensionV11.class), + @XmlElementRef(type = FeeDeleteResponseExtensionV11.class), + @XmlElementRef(type = FeeRenewResponseExtensionV11.class), + @XmlElementRef(type = FeeTransferResponseExtensionV11.class), + @XmlElementRef(type = FeeUpdateResponseExtensionV11.class), + @XmlElementRef(type = FeeCheckResponseExtensionV12.class), + @XmlElementRef(type = FeeCreateResponseExtensionV12.class), + @XmlElementRef(type = FeeDeleteResponseExtensionV12.class), + @XmlElementRef(type = FeeRenewResponseExtensionV12.class), + @XmlElementRef(type = FeeTransferResponseExtensionV12.class), + @XmlElementRef(type = FeeUpdateResponseExtensionV12.class), + @XmlElementRef(type = LaunchCheckResponseExtension.class), + @XmlElementRef(type = PackageTokenResponseExtension.class), + @XmlElementRef(type = RgpInfoExtension.class), + @XmlElementRef(type = SecDnsInfoExtension.class) + }) @XmlElementWrapper(name = "extension") ImmutableList extensions; diff --git a/core/src/main/java/google/registry/xml/xsd/packageToken.xsd b/core/src/main/java/google/registry/xml/xsd/packageToken.xsd new file mode 100644 index 000000000..f9b11f46c --- /dev/null +++ b/core/src/main/java/google/registry/xml/xsd/packageToken.xsd @@ -0,0 +1,38 @@ + + + + + + + Extensible Provisioning Protocol v1.0 + Package Token Extension. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/test/java/google/registry/flows/domain/DomainInfoFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainInfoFlowTest.java index fe5465758..1eb9d6854 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainInfoFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainInfoFlowTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; 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.SPECIFIED; +import static google.registry.model.eppcommon.EppXmlTransformer.marshal; import static google.registry.model.tld.Registry.TldState.QUIET_PERIOD; import static google.registry.testing.DatabaseHelper.assertNoBillingEvents; import static google.registry.testing.DatabaseHelper.createTld; @@ -31,6 +32,8 @@ import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptio import static google.registry.testing.TestDataHelper.updateSubstitutions; import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.DateTimeUtils.START_OF_TIME; +import static google.registry.xml.XmlTestUtils.assertXmlEquals; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.joda.money.CurrencyUnit.USD; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -62,14 +65,18 @@ import google.registry.model.domain.DomainHistory; import google.registry.model.domain.GracePeriod; import google.registry.model.domain.rgp.GracePeriodStatus; import google.registry.model.domain.secdns.DelegationSignerData; +import google.registry.model.domain.token.AllocationToken; +import google.registry.model.domain.token.AllocationToken.TokenType; import google.registry.model.eppcommon.AuthInfo.PasswordAuth; import google.registry.model.eppcommon.StatusValue; +import google.registry.model.eppoutput.EppOutput; import google.registry.model.host.Host; import google.registry.model.reporting.HistoryEntry; import google.registry.model.tld.Registry; import google.registry.persistence.VKey; import google.registry.testing.AppEngineExtension; import google.registry.testing.DatabaseHelper; +import google.registry.xml.ValidationMode; import java.util.regex.Pattern; import javax.annotation.Nullable; import org.joda.money.Money; @@ -1075,4 +1082,77 @@ class DomainInfoFlowTest extends ResourceFlowTestCase { assertIcannReportingActivityFieldLogged("srs-dom-info"); assertTldsFieldLogged("tld"); } + + @Test + void testPackageInfoExtension_returnsPackageInfo() throws Exception { + persistTestEntities(false); + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("abc123") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2010-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("NewRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + domain = domain.asBuilder().setCurrentPackageToken(token.createVKey()).build(); + persistResource(domain); + setEppInput("domain_info_package.xml"); + doSuccessfulTest("domain_info_response_package.xml", false); + } + + @Test + void testPackageInfoExtension_returnsPackageInfoForSuperUser() throws Exception { + persistTestEntities(false); + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("abc123") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2010-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("NewRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + domain = domain.asBuilder().setCurrentPackageToken(token.createVKey()).build(); + persistResource(domain); + sessionMetadata.setRegistrarId("TheRegistrar"); + setEppInput("domain_info_package.xml"); + EppOutput output = runFlowAsSuperuser(); + String expectedOutput = + loadFile( + "domain_info_response_superuser_package.xml", + updateSubstitutions(ImmutableMap.of(), "ROID", "2FF-TLD")); + assertXmlEquals(expectedOutput, new String(marshal(output, ValidationMode.LENIENT), UTF_8)); + } + + @Test + void testPackageInfoExtension_nameNotInPackage() throws Exception { + setEppInput("domain_info_package.xml"); + doSuccessfulTest("domain_info_response_empty_package.xml"); + } + + @Test + void testPackageInfoExtension_notCurrentSponsorRegistrar() throws Exception { + persistTestEntities(false); + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("abc123") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2010-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("NewRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + domain = domain.asBuilder().setCurrentPackageToken(token.createVKey()).build(); + persistResource(domain); + sessionMetadata.setRegistrarId("TheRegistrar"); + setEppInput("domain_info_package.xml"); + doSuccessfulTest("domain_info_response_unauthorized.xml", false); + } } diff --git a/core/src/test/resources/google/registry/flows/domain/domain_info_package.xml b/core/src/test/resources/google/registry/flows/domain/domain_info_package.xml new file mode 100644 index 000000000..19f3c8617 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/domain/domain_info_package.xml @@ -0,0 +1,16 @@ + + + + + example.tld + + + + + + ABC-12345 + + diff --git a/core/src/test/resources/google/registry/flows/domain/domain_info_response_empty_package.xml b/core/src/test/resources/google/registry/flows/domain/domain_info_response_empty_package.xml new file mode 100644 index 000000000..7caf10ad9 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/domain/domain_info_response_empty_package.xml @@ -0,0 +1,45 @@ + + + + Command completed successfully + + + + example.tld + %ROID% + + jd1234 + sh8013 + sh8013 + + ns1.example.tld + ns1.example.net + + ns1.example.tld + ns2.example.tld + NewRegistrar + TheRegistrar + 1999-04-03T22:00:00.0Z + NewRegistrar + 1999-12-03T09:00:00.0Z + 2005-04-03T22:00:00.0Z + 2000-04-08T09:00:00.0Z + + 2fooBAR + + + + + + + + + + ABC-12345 + server-trid + + + diff --git a/core/src/test/resources/google/registry/flows/domain/domain_info_response_package.xml b/core/src/test/resources/google/registry/flows/domain/domain_info_response_package.xml new file mode 100644 index 000000000..e0103bf54 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/domain/domain_info_response_package.xml @@ -0,0 +1,45 @@ + + + + Command completed successfully + + + + example.tld + %ROID% + + jd1234 + sh8013 + sh8013 + + ns1.example.tld + ns1.example.net + + ns1.example.tld + ns2.example.tld + NewRegistrar + TheRegistrar + 1999-04-03T22:00:00.0Z + NewRegistrar + 1999-12-03T09:00:00.0Z + 2005-04-03T22:00:00.0Z + 2000-04-08T09:00:00.0Z + + 2fooBAR + + + + + + abc123 + + + + ABC-12345 + server-trid + + + diff --git a/core/src/test/resources/google/registry/flows/domain/domain_info_response_superuser_package.xml b/core/src/test/resources/google/registry/flows/domain/domain_info_response_superuser_package.xml new file mode 100644 index 000000000..84a2608fe --- /dev/null +++ b/core/src/test/resources/google/registry/flows/domain/domain_info_response_superuser_package.xml @@ -0,0 +1,26 @@ + + + + Command completed successfully + + + + example.tld + %ROID% + jd1234 + NewRegistrar + + + + + abc123 + + + + ABC-12345 + server-trid + + +