1
0
mirror of https://github.com/google/nomulus synced 2026-05-21 23:31:51 +00:00

Compare commits

...

6 Commits

Author SHA1 Message Date
Juan Celhay
bd70cd91a5 Add canary strategy to crash stage in Cloud Deploy pipeline (#3057)
* Add customCanaryDeployment strategy to crash

* change key to partialDeploymentAlertPolicyChecks

* add more indentation to alert policies config
2026-05-21 19:39:46 +00:00
gbrodman
73725e94fe Avoid injection of a possibly-null string value if thee Valkey cert key doesn't exist (#3055) 2026-05-20 20:02:35 +00:00
Juan Celhay
c3f8ec8c85 Generate partial phases kubernetes manifests in CB release job (#3048)
* generate kubernetes partial/canary manifests in release job

* rename partial phase labels

* replace container name value to be stage dependent

* just keep the new partial deployment update in the manifest generation
2026-05-20 16:44:45 +00:00
Weimin Yu
3894ca6971 More debugging code for replyTo address (#3053)
The  replyTo header works in manual tests. Add code emulating
BillingEmailUtils behavior and see if that causes the problem.

Also experimenting not to set the From header in GmaiClient, since
whatever we set is overridden anyway.
2026-05-19 21:02:01 +00:00
Weimin Yu
5f06581572 Add a reminder to run update_dependency to PR authors (#3050)
After the public-access removal from GCS buckets, the Kokoro tests can
no longer use our private repo for resolve dependencies. And breakage is
discovered only during build.

This PR lets Github to create review comment, which triggers on PRs that
contain *.lockfile changes and asks the PR author to confirm that the
update_dependency script has been executed.
2026-05-18 19:27:22 +00:00
gbrodman
17b851de42 Remove remaining references to contacts in XML files and flows (#2979)
This requires moving phone numbers from the contact XSD file to the
eppcommon XSD file (they're still used by registrars).

The remaining changes are related to removing the XML infrastructure
that allows for contacts and any uses of contacts.

We shouldn't merge this until
https://github.com/google/nomulus/pull/2954 is deployed to production
and has had a little bit to bake and make sure that nothing is wrong.
2026-05-18 18:55:00 +00:00
234 changed files with 468 additions and 5492 deletions

View File

@@ -0,0 +1,48 @@
name: Request Lockfile Review
on:
pull_request_target:
branches: ["master"]
types: [opened, synchronize, reopened]
jobs:
review-lockfiles:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
# We intentionally do NOT use actions/checkout here.
# This keeps the environment completely secure and satisfies CodeQL.
- name: Check files via GitHub API
id: check_files
uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.pull_request.number;
// Get the list of files in the PR directly from the API
const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
per_page: 100
});
// Look for any file **ending** in gradle.lockfile
const hasLockfile = files.some(file => file.filename.endsWith('gradle.lockfile'));
core.setOutput('has_lockfile', hasLockfile ? 'true' : 'false');
- name: Post unresolved review comment
if: steps.check_files.outputs.has_lockfile == 'true'
uses: actions/github-script@v7
with:
script: |
await github.rest.pulls.createReview({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
event: 'REQUEST_CHANGES',
body: `### ⚠️ Attention Required: Lockfile Detected\nThis pull request contains modifications to one or more \`*.lockfile\` files. Please confirm that you have run update_dependency.sh to push new dependencies to the private repo.\n\n_Someone with Admin role must manually dismiss this review before merging._`
});

View File

@@ -54,9 +54,9 @@ public class BatchModule {
static final int DEFAULT_MAX_QPS = 10;
@Provides
@Parameter("sender")
static String provideSender(HttpServletRequest req) {
return extractRequiredParameter(req, "sender");
@Parameter("replyTo")
static String provideReplyTo(HttpServletRequest req) {
return extractRequiredParameter(req, "replyTo");
}
@Provides

View File

@@ -18,7 +18,9 @@ import static google.registry.request.Action.Method.GET;
import static google.registry.request.Action.Method.POST;
import com.google.api.services.gmail.Gmail;
import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger;
import com.google.common.net.MediaType;
import dagger.Lazy;
import google.registry.config.RegistryConfig.Config;
import google.registry.groups.GmailClient;
@@ -31,6 +33,7 @@ import google.registry.util.Retrier;
import jakarta.inject.Inject;
import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;
import java.util.Optional;
/**
* Action that executes a canned script specified by the caller.
@@ -62,13 +65,16 @@ public class CannedScriptExecutionAction implements Runnable {
@Inject Response response;
@Inject
@Parameter("sender")
String sender;
@Parameter("replyTo")
String replyTo;
@Inject
@Parameter("receiver")
String receiver;
@Config("invoiceReplyToEmailAddress")
Optional<InternetAddress> replyToEmailAddressFromConfig;
@Inject
CannedScriptExecutionAction() {}
@@ -77,20 +83,36 @@ public class CannedScriptExecutionAction implements Runnable {
// For b/510340944, validating a new G Workspace user can send email. Code below can be
// removed or changed afterward.
try {
logger.atInfo().log("Sending email from %s to %s", sender, receiver);
logger.atInfo().log("Sending email to %s with replyTo %s", receiver, replyTo);
GmailClient gmailClient =
new GmailClient(
gmail, retrier, isEmailSendingEnabled, sender, sender, new InternetAddress(sender));
new GmailClient(gmail, retrier, isEmailSendingEnabled, new InternetAddress(replyTo));
gmailClient.sendEmail(
EmailMessage.newBuilder()
.addRecipient(new InternetAddress(receiver))
.setSubject(String.format("Email send test from %s", sender))
.setBody(String.format("This is a test email sent from %s to %s.", sender, receiver))
.setSubject(String.format("Email with manually set replyTo header %s", replyTo))
.setBody("See subject")
.build());
response.setPayload("Email sent successfully.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
gmailClient.sendEmail(
EmailMessage.newBuilder()
.setSubject(
String.format(
"Email with injected replyTo header %s", replyToEmailAddressFromConfig))
.setBody("See header")
.setRecipients(ImmutableList.of(new InternetAddress(receiver)))
.setReplyToEmailAddress(replyToEmailAddressFromConfig)
.setContentType(MediaType.HTML_UTF_8)
.build());
response.setPayload("Emails sent successfully.");
} catch (AddressException e) {
logger.atWarning().withCause(e).log(
"Invalid email address: sender=%s, receiver=%s", sender, receiver);
"Invalid email address: sender=%s, receiver=%s", replyTo, receiver);
response.setStatus(400);
response.setPayload("Invalid email address provided.");
} catch (Exception e) {

View File

@@ -21,7 +21,6 @@ import static google.registry.beam.rde.RdePipeline.TupleTags.DOMAIN_FRAGMENTS;
import static google.registry.beam.rde.RdePipeline.TupleTags.EXTERNAL_HOST_FRAGMENTS;
import static google.registry.beam.rde.RdePipeline.TupleTags.HOST_TO_PENDING_DEPOSIT;
import static google.registry.beam.rde.RdePipeline.TupleTags.PENDING_DEPOSIT;
import static google.registry.beam.rde.RdePipeline.TupleTags.REFERENCED_CONTACTS;
import static google.registry.beam.rde.RdePipeline.TupleTags.REFERENCED_HOSTS;
import static google.registry.beam.rde.RdePipeline.TupleTags.REVISION_ID;
import static google.registry.beam.rde.RdePipeline.TupleTags.SUPERORDINATE_DOMAINS;
@@ -131,9 +130,8 @@ import org.apache.beam.sdk.values.TypeDescriptor;
*
* After the most recent (live) domain resources are loaded from the corresponding history objects,
* we marshall them to deposit fragments and emit the (pending deposit: deposit fragment) pairs for
* further processing. We also find all the contacts and hosts referenced by a given domain and emit
* pairs of (contact/host repo ID: pending deposit) for all RDE pending deposits for further
* processing.
* further processing. We also find all the hosts referenced by a given domain and emit pairs of
* (host repo ID: pending deposit) for all RDE pending deposits for further processing.
*
* <h3>{@link Host}</h3>
*
@@ -358,7 +356,6 @@ public class RdePipeline implements Serializable {
private <T extends HistoryEntry> EppResource loadResourceByHistoryEntryId(
Class<T> historyEntryClazz, String repoId, long revisionId) {
return tm().transact(
() ->
tm().loadByKey(
@@ -372,8 +369,8 @@ public class RdePipeline implements Serializable {
* Remove unreferenced resources by joining the (repoId, pendingDeposit) pair with the (repoId,
* revisionId) on the repoId.
*
* <p>The (repoId, pendingDeposit) pairs denote resources (contact, host) that are referenced from
* a domain, that are to be included in the corresponding pending deposit.
* <p>The (repoId, pendingDeposit) pairs denote hosts that are referenced from a domain, that are
* to be included in the corresponding pending deposit.
*
* <p>The (repoId, revisionId) paris come from the most recent history entry query, which can be
* used to load the embedded resources themselves.
@@ -423,7 +420,7 @@ public class RdePipeline implements Serializable {
Counter domainFragmentCounter = Metrics.counter("RDE", "DomainFragment");
Counter referencedHostCounter = Metrics.counter("RDE", "ReferencedHost");
return domainHistories.apply(
"Map DomainHistory to DepositFragment " + "and emit referenced Contact and Host",
"Map DomainHistory to DepositFragment and emit referenced Host",
ParDo.of(
new DoFn<KV<String, Long>, KV<PendingDeposit, DepositFragment>>() {
@ProcessElement
@@ -465,8 +462,7 @@ public class RdePipeline implements Serializable {
});
}
})
.withOutputTags(
DOMAIN_FRAGMENTS, TupleTagList.of(REFERENCED_CONTACTS).and(REFERENCED_HOSTS)));
.withOutputTags(DOMAIN_FRAGMENTS, TupleTagList.of(REFERENCED_HOSTS)));
}
private PCollectionTuple processHostHistories(
@@ -627,9 +623,6 @@ public class RdePipeline implements Serializable {
protected static final TupleTag<KV<PendingDeposit, DepositFragment>> DOMAIN_FRAGMENTS =
new TupleTag<>() {};
protected static final TupleTag<KV<String, PendingDeposit>> REFERENCED_CONTACTS =
new TupleTag<>() {};
protected static final TupleTag<KV<String, PendingDeposit>> REFERENCED_HOSTS =
new TupleTag<>() {};

View File

@@ -60,12 +60,15 @@ public final class CacheModule {
public static Optional<UnifiedJedis> provideJedis(
@ApplicationDefaultCredential GoogleCredentialsBundle credentialsBundle,
@Config("valkeyHostsAndPorts") Optional<ImmutableList<String>> valkeyHostsAndPorts,
@Config("valkeySslSocketFactory") SSLSocketFactory valkeySslSocketFactory) {
if (valkeyHostsAndPorts.map(ImmutableList::isEmpty).orElse(true)) {
@Config("valkeyCertificateAuthority") Optional<String> valkeyCertificateAuthority) {
if (valkeyHostsAndPorts.map(ImmutableList::isEmpty).orElse(true)
|| valkeyCertificateAuthority.isEmpty()) {
return Optional.empty();
}
ImmutableSet<HostAndPort> hostsAndPorts =
valkeyHostsAndPorts.get().stream().map(HostAndPort::from).collect(toImmutableSet());
SSLSocketFactory valkeySslSocketFactory =
createValkeySslSocketFactory(valkeyCertificateAuthority.get());
JedisClientConfig clientConfig =
DefaultJedisClientConfig.builder()
.ssl(true)
@@ -111,11 +114,7 @@ public final class CacheModule {
return new MultilayerHostCache(jedisClient.get(), cacheMetrics);
}
@Provides
@Singleton
@Config("valkeySslSocketFactory")
static SSLSocketFactory provideValkeySslSocketFactory(
@Config("valkeyCertificateAuthority") String valkeyCertificateAuthority) {
private static SSLSocketFactory createValkeySslSocketFactory(String valkeyCertificateAuthority) {
try {
ImmutableList<X509Certificate> trustedCerts =
CertificateFactory.getInstance("X.509")

View File

@@ -19,16 +19,6 @@ import dagger.Provides;
import dagger.Subcomponent;
import google.registry.batch.BatchModule;
import google.registry.dns.DnsModule;
import google.registry.flows.contact.ContactCheckFlow;
import google.registry.flows.contact.ContactCreateFlow;
import google.registry.flows.contact.ContactDeleteFlow;
import google.registry.flows.contact.ContactInfoFlow;
import google.registry.flows.contact.ContactTransferApproveFlow;
import google.registry.flows.contact.ContactTransferCancelFlow;
import google.registry.flows.contact.ContactTransferQueryFlow;
import google.registry.flows.contact.ContactTransferRejectFlow;
import google.registry.flows.contact.ContactTransferRequestFlow;
import google.registry.flows.contact.ContactUpdateFlow;
import google.registry.flows.custom.CustomLogicModule;
import google.registry.flows.domain.DomainCheckFlow;
import google.registry.flows.domain.DomainClaimsCheckFlow;
@@ -54,6 +44,8 @@ import google.registry.flows.session.HelloFlow;
import google.registry.flows.session.LoginFlow;
import google.registry.flows.session.LogoutFlow;
import google.registry.model.eppcommon.Trid;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/** Dagger component for flow classes. */
@FlowScope
@@ -69,16 +61,6 @@ public interface FlowComponent {
FlowRunner flowRunner();
// Flows must be added here and in FlowComponentModule below.
ContactCheckFlow contactCheckFlow();
ContactCreateFlow contactCreateFlow();
ContactDeleteFlow contactDeleteFlow();
ContactInfoFlow contactInfoFlow();
ContactTransferApproveFlow contactTransferApproveFlow();
ContactTransferCancelFlow contactTransferCancelFlow();
ContactTransferQueryFlow contactTransferQueryFlow();
ContactTransferRejectFlow contactTransferRejectFlow();
ContactTransferRequestFlow contactTransferRequestFlow();
ContactUpdateFlow contactUpdateFlow();
DomainCheckFlow domainCheckFlow();
DomainClaimsCheckFlow domainClaimsCheckFlow();
DomainCreateFlow domainCreateFlow();
@@ -118,40 +100,16 @@ public interface FlowComponent {
// TODO(b/29874464): fix this in a cleaner way.
@Provides
static Flow provideFlow(FlowComponent flows, Class<? extends Flow> clazz) {
return clazz.equals(ContactCheckFlow.class) ? flows.contactCheckFlow()
: clazz.equals(ContactCreateFlow.class) ? flows.contactCreateFlow()
: clazz.equals(ContactDeleteFlow.class) ? flows.contactDeleteFlow()
: clazz.equals(ContactInfoFlow.class) ? flows.contactInfoFlow()
: clazz.equals(ContactTransferApproveFlow.class) ? flows.contactTransferApproveFlow()
: clazz.equals(ContactTransferCancelFlow.class) ? flows.contactTransferCancelFlow()
: clazz.equals(ContactTransferQueryFlow.class) ? flows.contactTransferQueryFlow()
: clazz.equals(ContactTransferRejectFlow.class) ? flows.contactTransferRejectFlow()
: clazz.equals(ContactTransferRequestFlow.class) ? flows.contactTransferRequestFlow()
: clazz.equals(ContactUpdateFlow.class) ? flows.contactUpdateFlow()
: clazz.equals(DomainCheckFlow.class) ? flows.domainCheckFlow()
: clazz.equals(DomainClaimsCheckFlow.class) ? flows.domainClaimsCheckFlow()
: clazz.equals(DomainCreateFlow.class) ? flows.domainCreateFlow()
: clazz.equals(DomainDeleteFlow.class) ? flows.domainDeleteFlow()
: clazz.equals(DomainInfoFlow.class) ? flows.domainInfoFlow()
: clazz.equals(DomainRenewFlow.class) ? flows.domainRenewFlow()
: clazz.equals(DomainRestoreRequestFlow.class) ? flows.domainRestoreRequestFlow()
: clazz.equals(DomainTransferApproveFlow.class) ? flows.domainTransferApproveFlow()
: clazz.equals(DomainTransferCancelFlow.class) ? flows.domainTransferCancelFlow()
: clazz.equals(DomainTransferQueryFlow.class) ? flows.domainTransferQueryFlow()
: clazz.equals(DomainTransferRejectFlow.class) ? flows.domainTransferRejectFlow()
: clazz.equals(DomainTransferRequestFlow.class) ? flows.domainTransferRequestFlow()
: clazz.equals(DomainUpdateFlow.class) ? flows.domainUpdateFlow()
: clazz.equals(HostCheckFlow.class) ? flows.hostCheckFlow()
: clazz.equals(HostCreateFlow.class) ? flows.hostCreateFlow()
: clazz.equals(HostDeleteFlow.class) ? flows.hostDeleteFlow()
: clazz.equals(HostInfoFlow.class) ? flows.hostInfoFlow()
: clazz.equals(HostUpdateFlow.class) ? flows.hostUpdateFlow()
: clazz.equals(PollAckFlow.class) ? flows.pollAckFlow()
: clazz.equals(PollRequestFlow.class) ? flows.pollRequestFlow()
: clazz.equals(HelloFlow.class) ? flows.helloFlow()
: clazz.equals(LoginFlow.class) ? flows.loginFlow()
: clazz.equals(LogoutFlow.class) ? flows.logoutFlow()
: null;
String simpleName = clazz.getSimpleName();
// The method name is the same as the class name but with the first character being lowercase
String methodName = Character.toLowerCase(simpleName.charAt(0)) + simpleName.substring(1);
try {
Method method = FlowComponent.class.getMethod(methodName);
method.setAccessible(true);
return (Flow) method.invoke(flows);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to check whether a contact can be provisioned.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_CHECK)
public final class ContactCheckFlow extends ContactsProhibitedFlow {
@Inject ContactCheckFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow meant to create a new contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_CREATE)
public final class ContactCreateFlow extends ContactsProhibitedFlow {
@Inject ContactCreateFlow() {}
}

View File

@@ -1,32 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to delete a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_DELETE)
public final class ContactDeleteFlow extends ContactsProhibitedFlow {
@Inject
ContactDeleteFlow() {}
}

View File

@@ -1,32 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to return information about a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_INFO)
public final class ContactInfoFlow extends ContactsProhibitedFlow {
@Inject
ContactInfoFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to approve a pending transfer on a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_APPROVE)
public final class ContactTransferApproveFlow extends ContactsProhibitedFlow {
@Inject ContactTransferApproveFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to cancel a pending transfer on a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_CANCEL)
public final class ContactTransferCancelFlow extends ContactsProhibitedFlow {
@Inject ContactTransferCancelFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to query a pending transfer on a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_QUERY)
public final class ContactTransferQueryFlow extends ContactsProhibitedFlow {
@Inject ContactTransferQueryFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to reject a pending transfer on a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REJECT)
public final class ContactTransferRejectFlow extends ContactsProhibitedFlow {
@Inject ContactTransferRejectFlow() {}
}

View File

@@ -1,32 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow that is meant to request a transfer on a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REQUEST)
public final class ContactTransferRequestFlow extends ContactsProhibitedFlow {
@Inject
ContactTransferRequestFlow() {}
}

View File

@@ -1,31 +0,0 @@
// Copyright 2017 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.flows.contact;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
/**
* An EPP flow meant to update a contact.
*
* @error {@link ContactsProhibitedException}
*/
@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_UPDATE)
public final class ContactUpdateFlow extends ContactsProhibitedFlow {
@Inject ContactUpdateFlow() {}
}

View File

@@ -1,28 +0,0 @@
// Copyright 2025 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.flows.contact;
import google.registry.flows.EppException;
import google.registry.flows.Flow;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.eppoutput.EppResponse;
/** Nomulus follows the Minimum Dataset Requirements, meaning it stores no contact information. */
public abstract class ContactsProhibitedFlow implements Flow {
@Override
public EppResponse run() throws EppException {
throw new ContactsProhibitedException();
}
}

View File

@@ -22,16 +22,6 @@ import google.registry.flows.EppException;
import google.registry.flows.EppException.SyntaxErrorException;
import google.registry.flows.EppException.UnimplementedCommandException;
import google.registry.flows.Flow;
import google.registry.flows.contact.ContactCheckFlow;
import google.registry.flows.contact.ContactCreateFlow;
import google.registry.flows.contact.ContactDeleteFlow;
import google.registry.flows.contact.ContactInfoFlow;
import google.registry.flows.contact.ContactTransferApproveFlow;
import google.registry.flows.contact.ContactTransferCancelFlow;
import google.registry.flows.contact.ContactTransferQueryFlow;
import google.registry.flows.contact.ContactTransferRejectFlow;
import google.registry.flows.contact.ContactTransferRequestFlow;
import google.registry.flows.contact.ContactUpdateFlow;
import google.registry.flows.domain.DomainCheckFlow;
import google.registry.flows.domain.DomainClaimsCheckFlow;
import google.registry.flows.domain.DomainCreateFlow;
@@ -55,7 +45,6 @@ import google.registry.flows.poll.PollRequestFlow;
import google.registry.flows.session.HelloFlow;
import google.registry.flows.session.LoginFlow;
import google.registry.flows.session.LogoutFlow;
import google.registry.model.contact.ContactCommand;
import google.registry.model.domain.DomainCommand;
import google.registry.model.domain.launch.LaunchCheckExtension;
import google.registry.model.domain.launch.LaunchCheckExtension.CheckType;
@@ -202,11 +191,6 @@ public class FlowPicker {
private static final FlowProvider RESOURCE_CRUD_FLOW_PROVIDER = new FlowProvider() {
private final Map<Class<?>, Class<? extends Flow>> resourceCrudFlows =
new ImmutableMap.Builder<Class<?>, Class<? extends Flow>>()
.put(ContactCommand.Check.class, ContactCheckFlow.class)
.put(ContactCommand.Create.class, ContactCreateFlow.class)
.put(ContactCommand.Delete.class, ContactDeleteFlow.class)
.put(ContactCommand.Info.class, ContactInfoFlow.class)
.put(ContactCommand.Update.class, ContactUpdateFlow.class)
.put(DomainCommand.Create.class, DomainCreateFlow.class)
.put(DomainCommand.Delete.class, DomainDeleteFlow.class)
.put(DomainCommand.Info.class, DomainInfoFlow.class)
@@ -230,24 +214,6 @@ public class FlowPicker {
new FlowProvider() {
private final Table<Class<?>, TransferOp, Class<? extends Flow>> transferFlows =
ImmutableTable.<Class<?>, TransferOp, Class<? extends Flow>>builder()
.put(
ContactCommand.Transfer.class,
TransferOp.APPROVE,
ContactTransferApproveFlow.class)
.put(
ContactCommand.Transfer.class,
TransferOp.CANCEL,
ContactTransferCancelFlow.class)
.put(
ContactCommand.Transfer.class, TransferOp.QUERY, ContactTransferQueryFlow.class)
.put(
ContactCommand.Transfer.class,
TransferOp.REJECT,
ContactTransferRejectFlow.class)
.put(
ContactCommand.Transfer.class,
TransferOp.REQUEST,
ContactTransferRequestFlow.class)
.put(
DomainCommand.Transfer.class,
TransferOp.APPROVE,

View File

@@ -15,7 +15,6 @@
package google.registry.flows.session;
import static com.google.common.collect.Sets.difference;
import static google.registry.model.common.FeatureFlag.FeatureName.PROHIBIT_CONTACT_OBJECTS_ON_LOGIN;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.util.CollectionUtils.nullToEmpty;
@@ -40,7 +39,6 @@ import google.registry.flows.TlsCredentials.BadRegistrarIpAddressException;
import google.registry.flows.TlsCredentials.MissingRegistrarCertificateException;
import google.registry.flows.TransportCredentials;
import google.registry.flows.TransportCredentials.BadRegistrarPasswordException;
import google.registry.model.common.FeatureFlag;
import google.registry.model.eppcommon.ProtocolDefinition;
import google.registry.model.eppcommon.ProtocolDefinition.ServiceExtension;
import google.registry.model.eppinput.EppInput;
@@ -120,9 +118,7 @@ public class LoginFlow implements MutatingFlow {
Set<String> unsupportedObjectServices =
difference(
nullToEmpty(services.getObjectServices()),
FeatureFlag.isActiveNow(PROHIBIT_CONTACT_OBJECTS_ON_LOGIN)
? ProtocolDefinition.SUPPORTED_OBJECT_SERVICES
: ProtocolDefinition.SUPPORTED_OBJECT_SERVICES_WITH_CONTACT);
ProtocolDefinition.SUPPORTED_OBJECT_SERVICES);
stopwatch.tick("LoginFlow difference unsupportedObjectServices");
if (!unsupportedObjectServices.isEmpty()) {
throw new UnimplementedObjectServiceException();

View File

@@ -56,9 +56,9 @@ public final class GmailClient {
private final InternetAddress outgoingEmailAddressWithUsername;
private final InternetAddress replyToEmailAddress;
// TODO(b/510340944): make package private after feature is rolled out
// TODO(b/510340944): drop sender info. Sender is determined by the Gmail credential owner.
@Inject
public GmailClient(
GmailClient(
Lazy<Gmail> gmail,
Retrier retrier,
@Config("isEmailSendingEnabled") boolean isEmailSendingEnabled,
@@ -78,6 +78,20 @@ public final class GmailClient {
}
}
// TODO(b/510340944): Remove this experiment method
public GmailClient(
Lazy<Gmail> gmail,
Retrier retrier,
@Config("isEmailSendingEnabled") boolean isEmailSendingEnabled,
@Config("replyToEmailAddress") InternetAddress replyToEmailAddress) {
this.gmail = gmail;
this.retrier = retrier;
this.isEmailSendingEnabled = isEmailSendingEnabled;
this.replyToEmailAddress = replyToEmailAddress;
this.outgoingEmailAddressWithUsername = null;
}
/**
* Sends {@code emailMessage} using {@link Gmail}.
*/
@@ -117,7 +131,9 @@ public final class GmailClient {
try {
MimeMessage msg =
new MimeMessage(Session.getDefaultInstance(new Properties(), /* authenticator= */ null));
msg.setFrom(this.outgoingEmailAddressWithUsername);
if (this.outgoingEmailAddressWithUsername != null) {
msg.setFrom(this.outgoingEmailAddressWithUsername);
}
msg.setReplyTo(
new InternetAddress[] {emailMessage.replyToEmailAddress().orElse(replyToEmailAddress)});
msg.addRecipients(

View File

@@ -22,6 +22,7 @@ import google.registry.config.RegistryConfig.Config;
import google.registry.keyring.api.Keyring;
import google.registry.keyring.secretmanager.SecretManagerKeyring;
import jakarta.inject.Singleton;
import java.util.Optional;
/** Dagger module for {@link Keyring} */
@Module
@@ -55,7 +56,7 @@ public abstract class KeyringModule {
@Provides
@Config("valkeyCertificateAuthority")
public static String provideValkeyCertificateAuthority(Keyring keyring) {
return keyring.getValkeyCertificateAuthority();
public static Optional<String> provideValkeyCertificateAuthority(Keyring keyring) {
return Optional.ofNullable(keyring.getValkeyCertificateAuthority());
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.contact;
import google.registry.model.eppcommon.Address;
import jakarta.persistence.Embeddable;
/**
* EPP Contact Address
*
* <p>This class is embedded inside the {@link PostalInfo} of an EPP contact to hold its address.
* The fields are all defined in parent class {@link Address}, but the subclass is still necessary
* to pick up the contact namespace.
*
* <p>This does not implement {@code Overlayable} because it is intended to be bulk replaced on
* update.
*
* @see PostalInfo
*/
@Embeddable
public class ContactAddress extends Address {
/** Builder for {@link ContactAddress}. */
public static class Builder extends Address.Builder<ContactAddress> {}
}

View File

@@ -1,30 +0,0 @@
// Copyright 2017 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.contact;
import google.registry.model.eppcommon.AuthInfo;
import jakarta.persistence.Embeddable;
import jakarta.xml.bind.annotation.XmlType;
/** A version of authInfo specifically for contacts. */
@Embeddable
@XmlType(namespace = "urn:ietf:params:xml:ns:contact-1.0")
public class ContactAuthInfo extends AuthInfo {
public static ContactAuthInfo create(PasswordAuth pw) {
ContactAuthInfo instance = new ContactAuthInfo();
instance.pw = pw;
return instance;
}
}

View File

@@ -1,198 +0,0 @@
// Copyright 2017 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.contact;
import static com.google.common.base.Preconditions.checkState;
import static google.registry.util.CollectionUtils.nullToEmpty;
import com.google.common.collect.Maps;
import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.contact.PostalInfo.Type;
import google.registry.model.eppinput.ResourceCommand.AbstractSingleResourceCommand;
import google.registry.model.eppinput.ResourceCommand.ResourceCheck;
import google.registry.model.eppinput.ResourceCommand.ResourceCreateOrChange;
import google.registry.model.eppinput.ResourceCommand.ResourceUpdate;
import google.registry.model.eppinput.ResourceCommand.SingleResourceCommand;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlTransient;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;
import java.util.Map;
/** A collection of (vestigial) Contact commands. */
public class ContactCommand {
/** The fields on "chgType" from <a href="http://tools.ietf.org/html/rfc5733">RFC5733</a>. */
@XmlTransient
public static class ContactCreateOrChange extends ImmutableObject
implements ResourceCreateOrChange<EppResource.Builder<?, ?>> {
/** Postal info for the contact. */
List<PostalInfo> postalInfo;
/** Contacts voice number. */
ContactPhoneNumber voice;
/** Contacts fax number. */
ContactPhoneNumber fax;
/** Contacts email address. */
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
String email;
/** Authorization info (aka transfer secret) of the contact. */
ContactAuthInfo authInfo;
/** Disclosure policy. */
Disclose disclose;
/** Helper method to move between the postal infos list and the individual getters. */
protected Map<Type, PostalInfo> getPostalInfosAsMap() {
// There can be no more than 2 postalInfos (enforced by the schema), and if there are 2 they
// must be of different types (not enforced). If the type is repeated, uniqueIndex will throw.
checkState(nullToEmpty(postalInfo).size() <= 2);
return Maps.uniqueIndex(nullToEmpty(postalInfo), PostalInfo::getType);
}
public ContactPhoneNumber getVoice() {
return voice;
}
public ContactPhoneNumber getFax() {
return fax;
}
public String getEmail() {
return email;
}
public ContactAuthInfo getAuthInfo() {
return authInfo;
}
public Disclose getDisclose() {
return disclose;
}
public PostalInfo getInternationalizedPostalInfo() {
return getPostalInfosAsMap().get(Type.INTERNATIONALIZED);
}
public PostalInfo getLocalizedPostalInfo() {
return getPostalInfosAsMap().get(Type.LOCALIZED);
}
}
/** An abstract contact command that contains authorization info. */
@XmlTransient
public static class AbstractContactAuthCommand extends AbstractSingleResourceCommand {
/** Authorization info used to validate if client has permissions to perform this operation. */
ContactAuthInfo authInfo;
@Override
public ContactAuthInfo getAuthInfo() {
return authInfo;
}
}
/**
* A create command for a (vestigial) Contact, mapping "createType" from <a
* href="http://tools.ietf.org/html/rfc5733">RFC5733</a>}.
*/
@XmlType(propOrder = {"contactId", "postalInfo", "voice", "fax", "email", "authInfo", "disclose"})
@XmlRootElement
public static class Create extends ContactCreateOrChange
implements SingleResourceCommand, ResourceCreateOrChange<EppResource.Builder<?, ?>> {
/**
* Unique identifier for this contact.
*
* <p>This is only unique in the sense that for any given lifetime specified as the time range
* from (creationTime, deletionTime) there can only be one contact in the database with this id.
* However, there can be many contacts with the same id and non-overlapping lifetimes.
*/
@XmlElement(name = "id")
String contactId;
@Override
public String getTargetId() {
return contactId;
}
@Override
public ContactAuthInfo getAuthInfo() {
return authInfo;
}
}
/** A delete command for a (vestigial) Contact. */
@XmlRootElement
public static class Delete extends AbstractSingleResourceCommand {}
/** An info request for a (vestigial) Contact. */
@XmlRootElement
@XmlType(propOrder = {"targetId", "authInfo"})
public static class Info extends AbstractContactAuthCommand {}
/** A check request for (vestigial) Contact. */
@XmlRootElement
public static class Check extends ResourceCheck {}
/** A transfer operation for a (vestigial) Contact. */
@XmlRootElement
@XmlType(propOrder = {"targetId", "authInfo"})
public static class Transfer extends AbstractContactAuthCommand {}
/** An update to a (vestigial) Contact. */
@XmlRootElement
@XmlType(propOrder = {"targetId", "innerAdd", "innerRemove", "innerChange"})
public static class Update
extends ResourceUpdate<Update.AddRemove, EppResource.Builder<?, ?>, Update.Change> {
@XmlElement(name = "chg")
protected Change innerChange;
@XmlElement(name = "add")
protected AddRemove innerAdd;
@XmlElement(name = "rem")
protected AddRemove innerRemove;
@Override
protected Change getNullableInnerChange() {
return innerChange;
}
@Override
protected AddRemove getNullableInnerAdd() {
return innerAdd;
}
@Override
protected AddRemove getNullableInnerRemove() {
return innerRemove;
}
/** The inner change type on a contact update command. */
public static class AddRemove extends ResourceUpdate.AddRemove {}
/** The inner change type on a contact update command. */
@XmlType(propOrder = {"postalInfo", "voice", "fax", "email", "authInfo", "disclose"})
public static class Change extends ContactCreateOrChange {}
}
}

View File

@@ -1,140 +0,0 @@
// Copyright 2017 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.contact;
import com.google.auto.value.AutoValue;
import com.google.auto.value.AutoValue.CopyAnnotations;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppoutput.EppResponse.ResponseData;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.time.Instant;
import javax.annotation.Nullable;
/** The {@link ResponseData} returned for an EPP info flow on a contact. */
@XmlRootElement(name = "infData")
@XmlType(
propOrder = {
"contactId",
"repoId",
"statusValues",
"postalInfos",
"voiceNumber",
"faxNumber",
"emailAddress",
"currentSponsorRegistrarId",
"creationRegistrarId",
"creationTime",
"lastEppUpdateRegistrarId",
"lastEppUpdateTime",
"lastTransferTime",
"authInfo",
"disclose"
})
@AutoValue
@CopyAnnotations
public abstract class ContactInfoData implements ResponseData {
@XmlElement(name = "id")
abstract String getContactId();
@XmlElement(name = "roid")
abstract String getRepoId();
@XmlElement(name = "status")
abstract ImmutableSet<StatusValue> getStatusValues();
@XmlElement(name = "postalInfo")
abstract ImmutableList<PostalInfo> getPostalInfos();
@XmlElement(name = "voice")
@Nullable
abstract ContactPhoneNumber getVoiceNumber();
@XmlElement(name = "fax")
@Nullable
abstract ContactPhoneNumber getFaxNumber();
@XmlElement(name = "email")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@Nullable
abstract String getEmailAddress();
@XmlElement(name = "clID")
abstract String getCurrentSponsorRegistrarId();
@XmlElement(name = "crID")
abstract String getCreationRegistrarId();
@XmlElement(name = "crDate")
abstract Instant getCreationTime();
@XmlElement(name = "upID")
@Nullable
abstract String getLastEppUpdateRegistrarId();
@XmlElement(name = "upDate")
@Nullable
abstract Instant getLastEppUpdateTime();
@XmlElement(name = "trDate")
@Nullable
abstract Instant getLastTransferTime();
@XmlElement(name = "authInfo")
@Nullable
abstract ContactAuthInfo getAuthInfo();
@XmlElement(name = "disclose")
@Nullable
abstract Disclose getDisclose();
/** Builder for {@link ContactInfoData}. */
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setContactId(String contactId);
public abstract Builder setRepoId(String repoId);
public abstract Builder setStatusValues(ImmutableSet<StatusValue> statusValues);
public abstract Builder setPostalInfos(ImmutableList<PostalInfo> postalInfos);
public abstract Builder setVoiceNumber(@Nullable ContactPhoneNumber voiceNumber);
public abstract Builder setFaxNumber(@Nullable ContactPhoneNumber faxNumber);
public abstract Builder setEmailAddress(@Nullable String emailAddress);
public abstract Builder setCurrentSponsorRegistrarId(String currentSponsorRegistrarId);
public abstract Builder setCreationRegistrarId(String creationRegistrarId);
public abstract Builder setCreationTime(Instant creationTime);
public abstract Builder setLastEppUpdateRegistrarId(@Nullable String lastEppUpdateRegistrarId);
public abstract Builder setLastEppUpdateTime(@Nullable Instant lastEppUpdateTime);
public abstract Builder setLastTransferTime(@Nullable Instant lastTransferTime);
public abstract Builder setAuthInfo(@Nullable ContactAuthInfo authInfo);
public abstract Builder setDisclose(@Nullable Disclose disclose);
public abstract ContactInfoData build();
}
public static Builder newBuilder() {
return new AutoValue_ContactInfoData.Builder();
}
}

View File

@@ -1,32 +0,0 @@
// Copyright 2017 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.contact;
import google.registry.model.eppcommon.PhoneNumber;
import jakarta.persistence.Embeddable;
/**
* EPP Contact Phone Number
*
* <p>This class is embedded inside a (vestigial) Contact to hold the phone number of an EPP
* contact. The fields are all defined in the parent class {@link PhoneNumber}, but the subclass is
* still necessary to pick up the contact namespace.
*/
@Embeddable
public class ContactPhoneNumber extends PhoneNumber {
/** Builder for {@link ContactPhoneNumber}. */
public static class Builder extends PhoneNumber.Builder<ContactPhoneNumber> {}
}

View File

@@ -1,137 +0,0 @@
// Copyright 2017 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.contact;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.collect.ImmutableList;
import google.registry.model.Buildable;
import google.registry.model.ImmutableObject;
import google.registry.model.UnsafeSerializable;
import google.registry.model.eppcommon.PresenceMarker;
import google.registry.persistence.converter.PostalInfoChoiceListUserType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlType;
import java.io.Serializable;
import java.util.List;
import org.hibernate.annotations.Type;
/** The "discloseType" from <a href="http://tools.ietf.org/html/rfc5733">RFC5733</a>. */
@Embeddable
@XmlType(propOrder = {"name", "org", "addr", "voice", "fax", "email"})
public class Disclose extends ImmutableObject implements UnsafeSerializable {
@Type(PostalInfoChoiceListUserType.class)
List<PostalInfoChoice> name;
@Type(PostalInfoChoiceListUserType.class)
List<PostalInfoChoice> org;
@Type(PostalInfoChoiceListUserType.class)
List<PostalInfoChoice> addr;
@Embedded PresenceMarker voice;
@Embedded PresenceMarker fax;
@Embedded PresenceMarker email;
@XmlAttribute
Boolean flag;
public ImmutableList<PostalInfoChoice> getNames() {
return nullToEmptyImmutableCopy(name);
}
public ImmutableList<PostalInfoChoice> getOrgs() {
return nullToEmptyImmutableCopy(org);
}
public ImmutableList<PostalInfoChoice> getAddrs() {
return nullToEmptyImmutableCopy(addr);
}
public PresenceMarker getVoice() {
return voice;
}
public PresenceMarker getFax() {
return fax;
}
public PresenceMarker getEmail() {
return email;
}
public Boolean getFlag() {
return flag;
}
/** The "intLocType" from <a href="http://tools.ietf.org/html/rfc5733">RFC5733</a>. */
public static class PostalInfoChoice extends ImmutableObject implements Serializable {
@XmlAttribute
PostalInfo.Type type;
public PostalInfo.Type getType() {
return type;
}
public static PostalInfoChoice create(PostalInfo.Type type) {
PostalInfoChoice instance = new PostalInfoChoice();
instance.type = type;
return instance;
}
}
/** A builder for {@link Disclose} since it is immutable. */
public static class Builder extends Buildable.Builder<Disclose> {
public Builder setNames(ImmutableList<PostalInfoChoice> names) {
getInstance().name = names;
return this;
}
public Builder setOrgs(ImmutableList<PostalInfoChoice> orgs) {
getInstance().org = orgs;
return this;
}
public Builder setAddrs(ImmutableList<PostalInfoChoice> addrs) {
getInstance().addr = addrs;
return this;
}
public Builder setVoice(PresenceMarker voice) {
getInstance().voice = voice;
return this;
}
public Builder setFax(PresenceMarker fax) {
getInstance().fax = fax;
return this;
}
public Builder setEmail(PresenceMarker email) {
getInstance().email = email;
return this;
}
public Builder setFlag(boolean flag) {
getInstance().flag = flag;
return this;
}
}
}

View File

@@ -1,124 +0,0 @@
// Copyright 2017 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.contact;
import static com.google.common.base.Preconditions.checkState;
import google.registry.model.Buildable;
import google.registry.model.Buildable.Overlayable;
import google.registry.model.ImmutableObject;
import google.registry.model.UnsafeSerializable;
import jakarta.persistence.Embeddable;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlEnumValue;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.adapters.NormalizedStringAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Optional;
/**
* Implementation of both "postalInfoType" and "chgPostalInfoType" from <a href=
* "http://tools.ietf.org/html/rfc5733">RFC5733</a>.
*/
@Embeddable
@XmlType(propOrder = {"name", "org", "address", "type"})
public class PostalInfo extends ImmutableObject
implements Overlayable<PostalInfo>, UnsafeSerializable {
/** The type of the address, either localized or international. */
public enum Type {
@XmlEnumValue("loc")
LOCALIZED,
@XmlEnumValue("int")
INTERNATIONALIZED
}
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
String name;
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
String org;
@XmlElement(name = "addr")
ContactAddress address;
@Enumerated(EnumType.STRING)
@XmlAttribute
Type type;
public String getName() {
return name;
}
public String getOrg() {
return org;
}
public ContactAddress getAddress() {
return address;
}
public Type getType() {
return type;
}
@Override
public PostalInfo overlay(PostalInfo source) {
// Don't overlay the type field, as that should never change.
checkState(source.type == null || source.type == type);
return asBuilder()
.setName(Optional.ofNullable(source.getName()).orElse(name))
.setOrg(Optional.ofNullable(source.getOrg()).orElse(org))
.setAddress(Optional.ofNullable(source.getAddress()).orElse(address))
.build();
}
@Override
public Builder asBuilder() {
return new Builder(clone(this));
}
/** A builder for constructing {@link PostalInfo}, since its changes get overlayed. */
public static class Builder extends Buildable.Builder<PostalInfo> {
public Builder() {}
private Builder(PostalInfo instance) {
super(instance);
}
public Builder setName(String name) {
getInstance().name = name;
return this;
}
public Builder setOrg(String org) {
getInstance().org = org;
return this;
}
public Builder setAddress(ContactAddress address) {
getInstance().address = address;
return this;
}
public Builder setType(Type type) {
getInstance().type = type;
return this;
}
}
}

View File

@@ -1,30 +0,0 @@
// Copyright 2017 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:ietf:params:xml:ns:contact-1.0",
xmlns = @XmlNs(prefix = "contact", namespaceURI = "urn:ietf:params:xml:ns:contact-1.0"),
elementFormDefault = XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)})
package google.registry.model.contact;
import google.registry.xml.UtcInstantAdapter;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlNs;
import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

View File

@@ -49,7 +49,6 @@ import java.util.stream.Stream;
* also matches the "addrType" type from <a
* href="http://tools.ietf.org/html/draft-lozano-tmch-smd">Mark and Signed Mark Objects Mapping</a>.
*
* @see google.registry.model.contact.ContactAddress
* @see google.registry.model.mark.MarkAddress
* @see google.registry.model.registrar.RegistrarAddress
*/

View File

@@ -40,7 +40,6 @@ public class EppXmlTransformer {
ImmutableList.of(
"eppcom.xsd",
"epp.xsd",
"contact.xsd",
"host.xsd",
"domain.xsd",
"rgp.xsd",

View File

@@ -44,7 +44,6 @@ import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
*
* </blockquote>
*
* @see google.registry.model.contact.ContactPhoneNumber
* @see google.registry.model.mark.MarkPhoneNumber
*/
@XmlTransient

View File

@@ -52,12 +52,6 @@ public class ProtocolDefinition {
public static final ImmutableSet<String> SUPPORTED_OBJECT_SERVICES =
ImmutableSet.of("urn:ietf:params:xml:ns:host-1.0", "urn:ietf:params:xml:ns:domain-1.0");
public static final ImmutableSet<String> SUPPORTED_OBJECT_SERVICES_WITH_CONTACT =
new ImmutableSet.Builder<String>()
.addAll(SUPPORTED_OBJECT_SERVICES)
.add("urn:ietf:params:xml:ns:contact-1.0")
.build();
/** Enum representing which environments should have which service extensions enabled. */
private enum ServiceExtensionVisibility {
ALL,

View File

@@ -21,7 +21,6 @@ import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import google.registry.model.ImmutableObject;
import google.registry.model.contact.ContactCommand;
import google.registry.model.domain.DomainCommand;
import google.registry.model.domain.bulktoken.BulkTokenExtension;
import google.registry.model.domain.fee06.FeeCheckCommandExtensionV06;
@@ -170,12 +169,6 @@ public class EppInput extends ImmutableObject {
/** A command that has an extension inside of it. */
public static class ResourceCommandWrapper extends InnerCommand {
@XmlElementRefs({
@XmlElementRef(type = ContactCommand.Check.class),
@XmlElementRef(type = ContactCommand.Create.class),
@XmlElementRef(type = ContactCommand.Delete.class),
@XmlElementRef(type = ContactCommand.Info.class),
@XmlElementRef(type = ContactCommand.Transfer.class),
@XmlElementRef(type = ContactCommand.Update.class),
@XmlElementRef(type = DomainCommand.Check.class),
@XmlElementRef(type = DomainCommand.Create.class),
@XmlElementRef(type = DomainCommand.Delete.class),

View File

@@ -32,8 +32,6 @@ public abstract class CheckData extends ImmutableObject implements ResponseData
/** The check responses. We must explicitly list the namespaced versions of {@link Check}. */
@XmlElements({
@XmlElement(
name = "cd", namespace = "urn:ietf:params:xml:ns:contact-1.0", type = ContactCheck.class),
@XmlElement(
name = "cd", namespace = "urn:ietf:params:xml:ns:domain-1.0", type = DomainCheck.class),
@XmlElement(
@@ -114,14 +112,6 @@ public abstract class CheckData extends ImmutableObject implements ResponseData
}
}
/** A version with contact namespacing. */
@XmlType(namespace = "urn:ietf:params:xml:ns:contact-1.0")
public static class ContactCheck extends Check {
public static ContactCheck create(boolean avail, String id, String reason) {
return init(new ContactCheck(), CheckID.create(avail, id), reason);
}
}
/** A version with domain namespacing. */
@XmlType(namespace = "urn:ietf:params:xml:ns:domain-1.0")
public static class DomainCheck extends Check {
@@ -146,14 +136,6 @@ public abstract class CheckData extends ImmutableObject implements ResponseData
}
}
/** A version with contact namespacing. */
@XmlRootElement(name = "chkData", namespace = "urn:ietf:params:xml:ns:contact-1.0")
public static class ContactCheckData extends CheckData {
public static ContactCheckData create(ImmutableList<ContactCheck> checks) {
return init(new ContactCheckData(), checks);
}
}
/** A version with domain namespacing. */
@XmlRootElement(name = "chkData", namespace = "urn:ietf:params:xml:ns:domain-1.0")
public static class DomainCheckData extends CheckData {

View File

@@ -28,21 +28,6 @@ public abstract class CreateData implements ResponseData {
@XmlElement(name = "crDate")
protected Instant creationDate;
/** An acknowledgment message indicating that a contact was created. */
@XmlRootElement(name = "creData", namespace = "urn:ietf:params:xml:ns:contact-1.0")
@XmlType(propOrder = {"id", "creationDate"}, namespace = "urn:ietf:params:xml:ns:contact-1.0")
public static class ContactCreateData extends CreateData {
String id;
public static ContactCreateData create(String id, Instant creationDate) {
ContactCreateData instance = new ContactCreateData();
instance.id = id;
instance.creationDate = creationDate;
return instance;
}
}
/** An acknowledgment message indicating that a domain was created. */
@XmlRootElement(name = "creData", namespace = "urn:ietf:params:xml:ns:domain-1.0")
@XmlType(

View File

@@ -20,7 +20,6 @@ import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.collect.ImmutableList;
import google.registry.model.Buildable;
import google.registry.model.ImmutableObject;
import google.registry.model.contact.ContactInfoData;
import google.registry.model.domain.DomainInfoData;
import google.registry.model.domain.DomainRenewData;
import google.registry.model.domain.bulktoken.BulkTokenResponseExtension;
@@ -53,19 +52,15 @@ import google.registry.model.domain.launch.LaunchCheckResponseExtension;
import google.registry.model.domain.rgp.RgpInfoExtension;
import google.registry.model.domain.secdns.SecDnsInfoExtension;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.CheckData.ContactCheckData;
import google.registry.model.eppoutput.CheckData.DomainCheckData;
import google.registry.model.eppoutput.CheckData.HostCheckData;
import google.registry.model.eppoutput.CreateData.ContactCreateData;
import google.registry.model.eppoutput.CreateData.DomainCreateData;
import google.registry.model.eppoutput.CreateData.HostCreateData;
import google.registry.model.eppoutput.EppOutput.ResponseOrGreeting;
import google.registry.model.host.HostInfoData;
import google.registry.model.poll.MessageQueueInfo;
import google.registry.model.poll.PendingActionNotificationResponse.ContactPendingActionNotificationResponse;
import google.registry.model.poll.PendingActionNotificationResponse.DomainPendingActionNotificationResponse;
import google.registry.model.poll.PendingActionNotificationResponse.HostPendingActionNotificationResponse;
import google.registry.model.transfer.TransferResponse.ContactTransferResponse;
import google.registry.model.transfer.TransferResponse.DomainTransferResponse;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementRef;
@@ -107,11 +102,6 @@ public class EppResponse extends ImmutableObject implements ResponseOrGreeting {
/** Zero or more response "resData" results. */
@XmlElementRefs({
@XmlElementRef(type = ContactCheckData.class),
@XmlElementRef(type = ContactCreateData.class),
@XmlElementRef(type = ContactInfoData.class),
@XmlElementRef(type = ContactPendingActionNotificationResponse.class),
@XmlElementRef(type = ContactTransferResponse.class),
@XmlElementRef(type = DomainCheckData.class),
@XmlElementRef(type = DomainCreateData.class),
@XmlElementRef(type = DomainInfoData.class),

View File

@@ -39,15 +39,13 @@ public class PendingActionNotificationResponse extends ImmutableObject
/** The inner name type that contains a name and the result boolean. */
@Embeddable
static class NameOrId extends ImmutableObject implements UnsafeSerializable {
@XmlValue
String value;
@XmlValue String value;
@XmlAttribute(name = "paResult")
boolean actionResult;
}
@XmlTransient
NameOrId nameOrId;
@XmlTransient NameOrId nameOrId;
@XmlElement(name = "paTRID")
Trid trid;
@@ -104,36 +102,11 @@ public class PendingActionNotificationResponse extends ImmutableObject
}
}
/** An adapter to output the XML in response to resolving a pending command on a contact. */
@XmlRootElement(name = "panData", namespace = "urn:ietf:params:xml:ns:contact-1.0")
@XmlType(
propOrder = {"id", "trid", "processedDate"},
namespace = "urn:ietf:params:xml:ns:contact-1.0")
public static class ContactPendingActionNotificationResponse
extends PendingActionNotificationResponse {
@XmlElement
NameOrId getId() {
return nameOrId;
}
public static ContactPendingActionNotificationResponse create(
String contactId, boolean actionResult, Trid trid, Instant processedDate) {
return init(
new ContactPendingActionNotificationResponse(),
contactId,
actionResult,
trid,
processedDate);
}
}
/** An adapter to output the XML in response to resolving a pending command on a host. */
@XmlRootElement(name = "panData", namespace = "urn:ietf:params:xml:ns:domain-1.0")
@XmlType(
propOrder = {"name", "trid", "processedDate"},
namespace = "urn:ietf:params:xml:ns:domain-1.0"
)
propOrder = {"name", "trid", "processedDate"},
namespace = "urn:ietf:params:xml:ns:domain-1.0")
public static class HostPendingActionNotificationResponse
extends PendingActionNotificationResponse {

View File

@@ -182,7 +182,7 @@ public class Registrar extends UpdateAutoTimestampEntity implements Buildable, J
DISABLED
}
/** Regex for E.164 phone number format specified by {@code contact.xsd}. */
/** Regex for E.164 phone number format. */
private static final Pattern E164_PATTERN = Pattern.compile("\\+[0-9]{1,3}\\.[0-9]{1,14}");
/** Regex for telephone support passcode (5 digit string). */

View File

@@ -43,17 +43,7 @@ public final class IcannReportingTypes {
HOST_CREATE("srs-host-create"),
HOST_DELETE("srs-host-delete"),
HOST_INFO("srs-host-info"),
HOST_UPDATE("srs-host-update"),
CONTACT_CHECK("srs-cont-check"),
CONTACT_CREATE("srs-cont-create"),
CONTACT_DELETE("srs-cont-delete"),
CONTACT_INFO("srs-cont-info"),
CONTACT_TRANSFER_APPROVE("srs-cont-transfer-approve"),
CONTACT_TRANSFER_CANCEL("srs-cont-transfer-cancel"),
CONTACT_TRANSFER_QUERY("srs-cont-transfer-query"),
CONTACT_TRANSFER_REJECT("srs-cont-transfer-reject"),
CONTACT_TRANSFER_REQUEST("srs-cont-transfer-request"),
CONTACT_UPDATE("srs-cont-update");
HOST_UPDATE("srs-host-update");
/** Returns the actual field name from the specification. */
private final String fieldName;

View File

@@ -83,33 +83,4 @@ public class TransferResponse extends BaseTransferObject implements ResponseData
}
}
}
/** An adapter to output the XML in response to a transfer command on a contact. */
@XmlRootElement(name = "trnData", namespace = "urn:ietf:params:xml:ns:contact-1.0")
@XmlType(propOrder = {
"contactId",
"transferStatus",
"gainingClientId",
"transferRequestTime",
"losingClientId",
"pendingTransferExpirationTime"},
namespace = "urn:ietf:params:xml:ns:contact-1.0")
public static class ContactTransferResponse extends TransferResponse {
@XmlElement(name = "id")
String contactId;
public String getContactId() {
return contactId;
}
/** Builder for {@link ContactTransferResponse}. */
public static class Builder
extends BaseTransferObject.Builder<ContactTransferResponse, Builder> {
public Builder setContactId(String contactId) {
getInstance().contactId = contactId;
return this;
}
}
}
}

View File

@@ -1,50 +0,0 @@
// Copyright 2024 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.persistence.converter;
import static com.google.common.collect.ImmutableList.toImmutableList;
import google.registry.model.contact.Disclose.PostalInfoChoice;
import google.registry.model.contact.PostalInfo;
import java.util.List;
import java.util.stream.Stream;
/** Hibernate custom type for {@link List} of {@link PostalInfoChoice}. */
public class PostalInfoChoiceListUserType
extends StringCollectionUserType<PostalInfoChoice, List<PostalInfoChoice>> {
@Override
String[] toJdbcObject(List<PostalInfoChoice> collection) {
return collection.stream()
.map(PostalInfoChoice::getType)
.map(Enum::name)
.toList()
.toArray(new String[0]);
}
@Override
List<PostalInfoChoice> toEntity(String[] data) {
return Stream.of(data)
.map(PostalInfo.Type::valueOf)
.map(PostalInfoChoice::create)
.collect(toImmutableList());
}
@SuppressWarnings("unchecked")
@Override
public Class<List<PostalInfoChoice>> returnedClass() {
return (Class<List<PostalInfoChoice>>) ((Object) List.class);
}
}

View File

@@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableMap;
import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.Registrar.State;
import google.registry.model.registrar.RegistrarAddress;
import google.registry.xjc.contact.XjcContactE164Type;
import google.registry.xjc.eppcom.XjcEppcomE164Type;
import google.registry.xjc.rderegistrar.XjcRdeRegistrar;
import google.registry.xjc.rderegistrar.XjcRdeRegistrarAddrType;
import google.registry.xjc.rderegistrar.XjcRdeRegistrarElement;
@@ -103,7 +103,7 @@ final class RegistrarToXjcConverter {
// telephone number.
// XXX: Make Registrar use PhoneNumber.
if (model.getPhoneNumber() != null) {
XjcContactE164Type phone = new XjcContactE164Type();
XjcEppcomE164Type phone = new XjcEppcomE164Type();
phone.setValue(model.getPhoneNumber());
bean.setVoice(phone);
}
@@ -111,7 +111,7 @@ final class RegistrarToXjcConverter {
// o An OPTIONAL <fax> element that contains the registrar's facsimile
// telephone number.
if (model.getFaxNumber() != null) {
XjcContactE164Type fax = new XjcContactE164Type();
XjcEppcomE164Type fax = new XjcEppcomE164Type();
fax.setValue(model.getFaxNumber());
bean.setFax(fax);
}

View File

@@ -26,10 +26,8 @@ import google.registry.keyring.api.Keyring;
import google.registry.rde.Ghostryde;
import google.registry.tools.params.PathParameter;
import google.registry.xjc.XjcXmlTransformer;
import google.registry.xjc.domain.XjcDomainContactType;
import google.registry.xjc.domain.XjcDomainHostAttrType;
import google.registry.xjc.rde.XjcRdeDeposit;
import google.registry.xjc.rdecontact.XjcRdeContact;
import google.registry.xjc.rdedomain.XjcRdeDomain;
import google.registry.xjc.rdehost.XjcRdeHost;
import google.registry.xjc.rderegistrar.XjcRdeRegistrar;
@@ -103,13 +101,6 @@ final class ValidateEscrowDepositCommand implements Command {
if (host.getUpRr() != null) {
addIfNotNull(registrarRefs, host.getUpRr().getValue());
}
} else if (XjcRdeContact.class.isAssignableFrom(item.getDeclaredType())) {
XjcRdeContact contact = (XjcRdeContact) item.getValue();
contacts.add(checkNotNull(contact.getId()));
addIfNotNull(registrarRefs, contact.getClID());
if (contact.getUpRr() != null) {
addIfNotNull(registrarRefs, contact.getUpRr().getValue());
}
} else if (XjcRdeDomain.class.isAssignableFrom(item.getDeclaredType())) {
XjcRdeDomain domain = (XjcRdeDomain) item.getValue();
addIfNotNull(registrarRefs, domain.getClID());
@@ -122,9 +113,6 @@ final class ValidateEscrowDepositCommand implements Command {
addIfNotNull(hostnameRefs, hostAttr.getHostName());
}
}
for (XjcDomainContactType contact : domain.getContacts()) {
contactRefs.add(contact.getValue());
}
} else if (XjcRdeRegistrar.class.isAssignableFrom(item.getDeclaredType())) {
XjcRdeRegistrar registrar = (XjcRdeRegistrar) item.getValue();
registrars.add(checkNotNull(registrar.getId()));

View File

@@ -36,7 +36,6 @@ public class XjcXmlTransformer {
new ImmutableMap.Builder<String, String>()
.put("eppcom", "eppcom.xsd")
.put("epp", "epp.xsd")
.put("contact", "contact.xsd")
.put("host", "host.xsd")
.put("domain", "domain.xsd")
.put("rgp", "rgp.xsd")
@@ -52,7 +51,6 @@ public class XjcXmlTransformer {
.put("rde", "rde.xsd")
.put("rdeheader", "rde-header.xsd")
.put("rdereport", "rde-report.xsd")
.put("rdecontact", "rde-contact.xsd")
.put("rdehost", "rde-host.xsd")
.put("rdeidn", "rde-idn.xsd")
.put("rdedomain", "rde-domain.xsd")

View File

@@ -60,15 +60,6 @@
</nameXmlTransform>
</schemaBindings>
</bindings>
<bindings schemaLocation="contact.xsd" node="/xsd:schema">
<schemaBindings>
<package name="google.registry.xjc.contact"/>
<nameXmlTransform>
<elementName prefix="XjcContact"/>
<typeName prefix="XjcContact"/>
</nameXmlTransform>
</schemaBindings>
</bindings>
<bindings schemaLocation="rgp.xsd" node="/xsd:schema">
<schemaBindings>
<package name="google.registry.xjc.rgp"/>
@@ -203,24 +194,6 @@
<class name="XjcRdeMenuType"/>
</bindings>
</bindings>
<bindings schemaLocation="rde-contact.xsd" node="/xsd:schema">
<schemaBindings>
<package name="google.registry.xjc.rdecontact"/>
<nameXmlTransform>
<elementName prefix="XjcRdeContact"/>
<typeName prefix="XjcRdeContact"/>
</nameXmlTransform>
</schemaBindings>
<bindings node="//xsd:complexType[@name='abstractContentType']">
<class name="XjcRdeContact"/>
</bindings>
<bindings node="//xsd:element[@name='contact']">
<class name="XjcRdeContactElement"/>
</bindings>
<bindings node="//xsd:element[@name='abstractContact']">
<class name="XjcRdeContactAbstract"/>
</bindings>
</bindings>
<bindings schemaLocation="rde-domain.xsd" node="/xsd:schema">
<schemaBindings>
<package name="google.registry.xjc.rdedomain"/>

View File

@@ -8,9 +8,6 @@
@jakarta.xml.bind.annotation.XmlNs(
prefix = "eppcom",
namespaceURI = "urn:ietf:params:xml:ns:eppcom-1.0"),
@jakarta.xml.bind.annotation.XmlNs(
prefix = "contact",
namespaceURI = "urn:ietf:params:xml:ns:contact-1.0"),
@jakarta.xml.bind.annotation.XmlNs(
prefix = "domain",
namespaceURI = "urn:ietf:params:xml:ns:domain-1.0"),
@@ -44,9 +41,6 @@
@jakarta.xml.bind.annotation.XmlNs(
prefix = "rde",
namespaceURI = "urn:ietf:params:xml:ns:rde-1.0"),
@jakarta.xml.bind.annotation.XmlNs(
prefix = "rdeContact",
namespaceURI = "urn:ietf:params:xml:ns:rdeContact-1.0"),
@jakarta.xml.bind.annotation.XmlNs(
prefix = "rdeDomain",
namespaceURI = "urn:ietf:params:xml:ns:rdeDomain-1.0"),

View File

@@ -1,4 +1,3 @@
contact urn:ietf:params:xml:ns:contact-1.0
domain urn:ietf:params:xml:ns:domain-1.0
dsig http://www.w3.org/2000/09/xmldsig#
epp urn:ietf:params:xml:ns:epp-1.0
@@ -12,7 +11,6 @@ iirdea urn:ietf:params:xml:ns:iirdea-1.0
launch urn:ietf:params:xml:ns:launch-1.0
mark urn:ietf:params:xml:ns:mark-1.0
rde urn:ietf:params:xml:ns:rde-1.0
rdecontact urn:ietf:params:xml:ns:rdeContact-1.0
rdedomain urn:ietf:params:xml:ns:rdeDomain-1.0
rdeeppparams urn:ietf:params:xml:ns:rdeEppParams-1.0
rdeheader urn:ietf:params:xml:ns:rdeHeader-1.0

View File

@@ -1,389 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:contact-1.0"
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"
xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!--
Import common element types.
-->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0"
schemaLocation="eppcom.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0"
schemaLocation="epp.xsd"/>
<annotation>
<documentation>
Extensible Provisioning Protocol v1.0
contact provisioning schema.
</documentation>
</annotation>
<!--
Child elements found in EPP commands.
-->
<element name="check" type="contact:mIDType"/>
<element name="create" type="contact:createType"/>
<element name="delete" type="contact:sIDType"/>
<element name="info" type="contact:authIDType"/>
<element name="transfer" type="contact:authIDType"/>
<element name="update" type="contact:updateType"/>
<!--
Utility types.
-->
<simpleType name="ccType">
<restriction base="token">
<length value="2"/>
</restriction>
</simpleType>
<complexType name="e164Type">
<simpleContent>
<extension base="contact:e164StringType">
<attribute name="x" type="token"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="e164StringType">
<restriction base="token">
<pattern value="(\+[0-9]{1,3}\.[0-9]{1,14})?"/>
<maxLength value="17"/>
</restriction>
</simpleType>
<simpleType name="pcType">
<restriction base="token">
<maxLength value="16"/>
</restriction>
</simpleType>
<simpleType name="postalLineType">
<restriction base="normalizedString">
<minLength value="1"/>
<maxLength value="255"/>
</restriction>
</simpleType>
<simpleType name="optPostalLineType">
<restriction base="normalizedString">
<maxLength value="255"/>
</restriction>
</simpleType>
<!--
Child elements of the <create> command.
-->
<complexType name="createType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="authInfo" type="contact:authInfoType"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="postalInfoType">
<sequence>
<element name="name" type="contact:postalLineType"/>
<element name="org" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="addr" type="contact:addrType"/>
</sequence>
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
</complexType>
<simpleType name="postalInfoEnumType">
<restriction base="token">
<enumeration value="loc"/>
<enumeration value="int"/>
</restriction>
</simpleType>
<complexType name="addrType">
<sequence>
<element name="street" type="contact:optPostalLineType"
minOccurs="0" maxOccurs="3"/>
<element name="city" type="contact:postalLineType"/>
<element name="sp" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="pc" type="contact:pcType"
minOccurs="0"/>
<element name="cc" type="contact:ccType"/>
</sequence>
</complexType>
<complexType name="authInfoType">
<choice>
<element name="pw" type="eppcom:pwAuthInfoType"/>
<element name="ext" type="eppcom:extAuthInfoType"/>
</choice>
</complexType>
<complexType name="discloseType">
<sequence>
<element name="name" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="org" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="addr" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="voice" minOccurs="0"/>
<element name="fax" minOccurs="0"/>
<element name="email" minOccurs="0"/>
</sequence>
<attribute name="flag" type="boolean" use="required"/>
</complexType>
<complexType name="intLocType">
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
</complexType>
<!--
Child element of commands that require only an identifier.
-->
<complexType name="sIDType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
</sequence>
</complexType>
<!--
Child element of commands that accept multiple identifiers.
-->
<complexType name="mIDType">
<sequence>
<element name="id" type="eppcom:clIDType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<!--
Child elements of the <info> and <transfer> commands.
-->
<complexType name="authIDType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Child elements of the <update> command.
-->
<complexType name="updateType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="add" type="contact:addRemType"
minOccurs="0"/>
<element name="rem" type="contact:addRemType"
minOccurs="0"/>
<element name="chg" type="contact:chgType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Data elements that can be added or removed.
-->
<complexType name="addRemType">
<sequence>
<element name="status" type="contact:statusType"
maxOccurs="7"/>
</sequence>
</complexType>
<!--
Data elements that can be changed.
-->
<complexType name="chgType">
<sequence>
<element name="postalInfo" type="contact:chgPostalInfoType"
minOccurs="0" maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="chgPostalInfoType">
<sequence>
<element name="name" type="contact:postalLineType"
minOccurs="0"/>
<element name="org" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="addr" type="contact:addrType"
minOccurs="0"/>
</sequence>
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
</complexType>
<!--
Child response elements.
-->
<element name="chkData" type="contact:chkDataType"/>
<element name="creData" type="contact:creDataType"/>
<element name="infData" type="contact:infDataType"/>
<element name="panData" type="contact:panDataType"/>
<element name="trnData" type="contact:trnDataType"/>
<!--
<check> response elements.
-->
<complexType name="chkDataType">
<sequence>
<element name="cd" type="contact:checkType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="checkType">
<sequence>
<element name="id" type="contact:checkIDType"/>
<element name="reason" type="eppcom:reasonType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="checkIDType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="avail" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<create> response elements.
-->
<complexType name="creDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="crDate" type="dateTime"/>
</sequence>
</complexType>
<!--
<info> response elements.
-->
<complexType name="infDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="roid" type="eppcom:roidType"/>
<element name="status" type="contact:statusType"
maxOccurs="7"/>
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="clID" type="eppcom:clIDType"/>
<element name="crID" type="eppcom:clIDType"/>
<element name="crDate" type="dateTime"/>
<element name="upID" type="eppcom:clIDType"
minOccurs="0"/>
<element name="upDate" type="dateTime"
minOccurs="0"/>
<element name="trDate" type="dateTime"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Status is a combination of attributes and an optional human-readable
message that may be expressed in languages other than English.
-->
<complexType name="statusType">
<simpleContent>
<extension base="normalizedString">
<attribute name="s" type="contact:statusValueType"
use="required"/>
<attribute name="lang" type="language"
default="en"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="statusValueType">
<restriction base="token">
<enumeration value="clientDeleteProhibited"/>
<enumeration value="clientTransferProhibited"/>
<enumeration value="clientUpdateProhibited"/>
<enumeration value="linked"/>
<enumeration value="ok"/>
<enumeration value="pendingCreate"/>
<enumeration value="pendingDelete"/>
<enumeration value="pendingTransfer"/>
<enumeration value="pendingUpdate"/>
<enumeration value="serverDeleteProhibited"/>
<enumeration value="serverTransferProhibited"/>
<enumeration value="serverUpdateProhibited"/>
</restriction>
</simpleType>
<!--
Pending action notification response elements.
-->
<complexType name="panDataType">
<sequence>
<element name="id" type="contact:paCLIDType"/>
<element name="paTRID" type="epp:trIDType"/>
<element name="paDate" type="dateTime"/>
</sequence>
</complexType>
<complexType name="paCLIDType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="paResult" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<transfer> response elements.
-->
<complexType name="trnDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="trStatus" type="eppcom:trStatusType"/>
<element name="reID" type="eppcom:clIDType"/>
<element name="reDate" type="dateTime"/>
<element name="acID" type="eppcom:clIDType"/>
<element name="acDate" type="dateTime"/>
</sequence>
</complexType>
<!--
End of schema.
-->
</schema>

View File

@@ -47,8 +47,6 @@ Child elements of the <create> command.
minOccurs="0"/>
<element name="registrant" type="eppcom:clIDType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="authInfo" type="domain:authInfoType"/>
</sequence>
</complexType>
@@ -100,22 +98,6 @@ If attributes, addresses are optional and follow the
structure defined in the host mapping.
-->
<complexType name="contactType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="type" type="domain:contactAttrType"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="contactAttrType">
<restriction base="token">
<enumeration value="admin"/>
<enumeration value="billing"/>
<enumeration value="tech"/>
</restriction>
</simpleType>
<complexType name="authInfoType">
<choice>
<element name="pw" type="eppcom:pwAuthInfoType"/>
@@ -216,8 +198,6 @@ Data elements that can be added or removed.
<sequence>
<element name="ns" type="domain:nsType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="status" type="domain:statusType"
minOccurs="0" maxOccurs="11"/>
</sequence>
@@ -319,8 +299,6 @@ Child response elements.
minOccurs="0" maxOccurs="11"/>
<element name="registrant" type="eppcom:clIDType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="ns" type="domain:nsType"
minOccurs="0"/>
<element name="host" type="eppcom:labelType"

View File

@@ -101,6 +101,24 @@ Transfer status identifiers.
</restriction>
</simpleType>
<!--
Phone number types
-->
<complexType name="e164Type">
<simpleContent>
<extension base="eppcom:e164StringType">
<attribute name="x" type="token"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="e164StringType">
<restriction base="token">
<pattern value="(\+[0-9]{1,3}\.[0-9]{1,14})?"/>
<maxLength value="17"/>
</restriction>
</simpleType>
<!--
End of schema.
-->

View File

@@ -1,96 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:rdeContact-1.0"
xmlns:rdeContact="urn:ietf:params:xml:ns:rdeContact-1.0"
xmlns:rde="urn:ietf:params:xml:ns:rde-1.0"
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"
xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!-- Import common element types. -->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0"
schemaLocation="eppcom.xsd"/>
<import namespace="urn:ietf:params:xml:ns:contact-1.0"
schemaLocation="contact.xsd"/>
<import namespace="urn:ietf:params:xml:ns:rde-1.0"
schemaLocation="rde.xsd"/>
<annotation>
<documentation>
Registry Data Escrow contact provisioning schema
</documentation>
</annotation>
<element name="abstractContact"
type="rdeContact:abstractContentType"
substitutionGroup="rde:content" abstract="true"/>
<element name="contact"
substitutionGroup="rdeContact:abstractContact"/>
<element name="delete"
type="rdeContact:deleteType"
substitutionGroup="rde:delete"/>
<!-- Contact Type -->
<complexType name="abstractContentType">
<complexContent>
<extension base="rde:contentType">
<sequence>
<element name="id"
type="eppcom:clIDType"/>
<element name="roid"
type="eppcom:roidType"/>
<element name="status"
type="contact:statusType" maxOccurs="7"/>
<element name="postalInfo"
type="contact:postalInfoType" maxOccurs="2"/>
<element name="voice"
type="contact:e164Type" minOccurs="0"/>
<element name="fax"
type="contact:e164Type" minOccurs="0"/>
<element name="email"
type="eppcom:minTokenType"/>
<element name="clID"
type="eppcom:clIDType"/>
<element name="crRr"
type="rde:rrType"/>
<element name="crDate"
type="dateTime"/>
<element name="upRr"
type="rde:rrType" minOccurs="0"/>
<element name="upDate"
type="dateTime" minOccurs="0"/>
<element name="trDate"
type="dateTime" minOccurs="0"/>
<element name="trnData"
type="rdeContact:transferDataType" minOccurs="0"/>
<element name="disclose"
type="contact:discloseType" minOccurs="0"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="transferDataType">
<sequence>
<element name="trStatus" type="eppcom:trStatusType"/>
<element name="reRr" type="rde:rrType"/>
<element name="reDate" type="dateTime"/>
<element name="acRr" type="rde:rrType"/>
<element name="acDate" type="dateTime"/>
</sequence>
</complexType>
<!-- Delete Type -->
<complexType name="deleteType">
<complexContent>
<extension base="rde:deleteType">
<sequence>
<element name="id"
type="eppcom:clIDType" minOccurs="0"
maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
</schema>

View File

@@ -60,9 +60,6 @@
maxOccurs="unbounded"/>
<element name="registrant"
type="eppcom:clIDType" minOccurs="0"/>
<element name="contact"
type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="ns"
type="domain:nsType" minOccurs="0"/>
<element name="clID"

View File

@@ -2,7 +2,6 @@
<schema targetNamespace="urn:ietf:params:xml:ns:rdeRegistrar-1.0"
xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0"
xmlns:rde="urn:ietf:params:xml:ns:rde-1.0"
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
@@ -13,8 +12,6 @@
schemaLocation="eppcom.xsd"/>
<import namespace="urn:ietf:params:xml:ns:domain-1.0"
schemaLocation="domain.xsd"/>
<import namespace="urn:ietf:params:xml:ns:contact-1.0"
schemaLocation="contact.xsd"/>
<import namespace="urn:ietf:params:xml:ns:rde-1.0"
schemaLocation="rde.xsd"/>
@@ -49,9 +46,9 @@
type="rdeRegistrar:postalInfoType"
maxOccurs="2"/>
<element name="voice"
type="contact:e164Type" minOccurs="0"/>
type="eppcom:e164Type" minOccurs="0"/>
<element name="fax"
type="contact:e164Type" minOccurs="0"/>
type="eppcom:e164Type" minOccurs="0"/>
<element name="email"
type="eppcom:minTokenType"/>
<element name="url"

View File

@@ -49,16 +49,17 @@ SELECT
SUM(IF(metricName = 'srs-host-delete', count, 0)) AS srs_host_delete,
SUM(IF(metricName = 'srs-host-info', count, 0)) AS srs_host_info,
SUM(IF(metricName = 'srs-host-update', count, 0)) AS srs_host_update,
SUM(IF(metricName = 'srs-cont-check', count, 0)) AS srs_cont_check,
SUM(IF(metricName = 'srs-cont-create', count, 0)) AS srs_cont_create,
SUM(IF(metricName = 'srs-cont-delete', count, 0)) AS srs_cont_delete,
SUM(IF(metricName = 'srs-cont-info', count, 0)) AS srs_cont_info,
SUM(IF(metricName = 'srs-cont-transfer-approve', count, 0)) AS srs_cont_transfer_approve,
SUM(IF(metricName = 'srs-cont-transfer-cancel', count, 0)) AS srs_cont_transfer_cancel,
SUM(IF(metricName = 'srs-cont-transfer-query', count, 0)) AS srs_cont_transfer_query,
SUM(IF(metricName = 'srs-cont-transfer-reject', count, 0)) AS srs_cont_transfer_reject,
SUM(IF(metricName = 'srs-cont-transfer-request', count, 0)) AS srs_cont_transfer_request,
SUM(IF(metricName = 'srs-cont-update', count, 0)) AS srs_cont_update,
-- Contacts are no longer supported
0 AS srs_cont_check,
0 AS srs_cont_create,
0 AS srs_cont_delete,
0 AS srs_cont_info,
0 AS srs_cont_transfer_approve,
0 AS srs_cont_transfer_cancel,
0 AS srs_cont_transfer_query,
0 AS srs_cont_transfer_reject,
0 AS srs_cont_transfer_request,
0 AS srs_cont_update,
SUM(IF(metricName = 'rdap-queries', count, 0)) AS rdap_queries
-- Cross join a list of all TLDs against TLD-specific metrics and then
-- filter so that only metrics with that TLD or a NULL TLD are counted

View File

@@ -1,86 +0,0 @@
// Copyright 2017 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.
{namespace domain.registry.tools.contact_create}
/**
* Create contact
*/
{template contactcreate stricthtml="false"}
{@param? id: string|null}
{@param? name: string|null}
{@param? org: string|null}
{@param? street: list<string>|null}
{@param? city: string|null}
{@param? state: string|null}
{@param? zip: string|null}
{@param? cc: string|null}
{@param? phone: string|null}
{@param? fax: string|null}
{@param? email: string|null}
{@param password: string}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<contact:create
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
{if $id}
<contact:id>{$id}</contact:id>
{/if}
<contact:postalInfo type="loc">
{if $name}
<contact:name>{$name}</contact:name>
{/if}
{if $org}
<contact:org>{$org}</contact:org>
{/if}
<contact:addr>
{if $street}
{for $s in $street}
<contact:street>{$s}</contact:street>
{/for}
{/if}
{if $city}
<contact:city>{$city}</contact:city>
{/if}
{if $state}
<contact:sp>{$state}</contact:sp>
{/if}
{if $zip}
<contact:pc>{$zip}</contact:pc>
{/if}
{if $cc}
<contact:cc>{$cc}</contact:cc>
{/if}
</contact:addr>
</contact:postalInfo>
{if $phone}
<contact:voice>{$phone}</contact:voice>
{/if}
{if $fax}
<contact:fax>{$fax}</contact:fax>
{/if}
{if $email}
<contact:email>{$email}</contact:email>
{/if}
<contact:authInfo>
<contact:pw>{$password}</contact:pw>
</contact:authInfo>
</contact:create>
</create>
<clTRID>RegistryTool</clTRID>
</command>
</epp>
{/template}

View File

@@ -73,21 +73,11 @@ class EppXmlSanitizerTest {
}
@Test
void testSanitize_contactAuthInfo_sanitized() throws Exception {
byte[] inputXmlBytes = loadBytes(getClass(), "contact_info.xml").read();
void testSanitize_domainAuthInfo_sanitized() throws Exception {
byte[] inputXmlBytes = loadBytes(getClass(), "domain_info_response.xml").read();
String expectedXml =
UTF8_HEADER
+ new EppLoader(this, "contact_info_sanitized.xml", ImmutableMap.of()).getEppXml();
assertXmlEqualsIgnoreHeader(expectedXml, sanitizeEppXml(inputXmlBytes));
}
@Test
void testSanitize_contactCreateResponseAuthInfo_sanitized() throws Exception {
byte[] inputXmlBytes = loadBytes(getClass(), "contact_info_from_create_response.xml").read();
String expectedXml =
UTF8_HEADER
+ new EppLoader(
this, "contact_info_from_create_response_sanitized.xml", ImmutableMap.of())
+ new EppLoader(this, "domain_info_response_sanitized.xml", ImmutableMap.of())
.getEppXml();
assertXmlEqualsIgnoreHeader(expectedXml, sanitizeEppXml(inputXmlBytes));
}
@@ -124,7 +114,6 @@ class EppXmlSanitizerTest {
String inputXml =
"<?xml version=\"1.0\" encoding=\"UTF-16LE\" standalone=\"no\"?>" + "<p>\u03bc</p>\n";
String sanitizedXml = sanitizeEppXml(inputXml.getBytes(UTF_16LE));
assertThat(sanitizedXml).isEqualTo(inputXml);
}
}

View File

@@ -30,12 +30,14 @@ class EppXxeAttackTest extends EppTestCase {
@Test
void testRemoteXmlExternalEntity() throws Exception {
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
assertThatCommand("contact_create_remote_xxe.xml")
assertThatCommand("host_create_remote_xxe.xml")
.hasResponse(
"response_error_no_cltrid.xml",
ImmutableMap.of(
"CODE", "2001",
"MSG", "Syntax error at line 11, column 34: "
"CODE",
"2001",
"MSG",
"Syntax error at line 8, column 41: "
+ "The entity &quot;remote&quot; was referenced, but not declared."));
assertThatLogoutSucceeds();
}
@@ -43,12 +45,14 @@ class EppXxeAttackTest extends EppTestCase {
@Test
void testLocalXmlExtrernalEntity() throws Exception {
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
assertThatCommand("contact_create_local_xxe.xml")
assertThatCommand("host_create_local_xxe.xml")
.hasResponse(
"response_error_no_cltrid.xml",
ImmutableMap.of(
"CODE", "2001",
"MSG", "Syntax error at line 11, column 31: "
"CODE",
"2001",
"MSG",
"Syntax error at line 8, column 38: "
+ "The entity &quot;ent&quot; was referenced, but not declared."));
assertThatLogoutSucceeds();
}
@@ -56,12 +60,14 @@ class EppXxeAttackTest extends EppTestCase {
@Test
void testBillionLaughsAttack() throws Exception {
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
assertThatCommand("contact_create_billion_laughs.xml")
assertThatCommand("host_create_billion_laughs.xml")
.hasResponse(
"response_error_no_cltrid.xml",
ImmutableMap.of(
"CODE", "2001",
"MSG", "Syntax error at line 20, column 32: "
"CODE",
"2001",
"MSG",
"Syntax error at line 17, column 39: "
+ "The entity &quot;lol9&quot; was referenced, but not declared."));
assertThatLogoutSucceeds();
}

View File

@@ -45,7 +45,7 @@ class FlowReporterTest {
}
}
@ReportingSpec(ActivityReportField.CONTACT_CHECK)
@ReportingSpec(ActivityReportField.DOMAIN_CHECK)
static class TestReportingSpecCommandFlow implements Flow {
@Override
public ResponseOrGreeting run() {
@@ -96,7 +96,7 @@ class FlowReporterTest {
Map<String, Object> json =
parseJsonMap(findFirstLogMessageByPrefix(handler, "FLOW-LOG-SIGNATURE-METADATA: "));
assertThat(json).containsEntry("flowClassName", "TestReportingSpecCommandFlow");
assertThat(json).containsEntry("icannActivityReportField", "srs-cont-check");
assertThat(json).containsEntry("icannActivityReportField", "srs-dom-check");
}
@Test

View File

@@ -1,38 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactCheckFlow}. */
class ContactCheckFlowTest extends FlowTestCase<ContactCheckFlow> {
ContactCheckFlowTest() {
setEppInput("contact_check.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactCreateFlow}. */
class ContactCreateFlowTest extends FlowTestCase<ContactCreateFlow> {
ContactCreateFlowTest() {
setEppInput("contact_create.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactDeleteFlow}. */
class ContactDeleteFlowTest extends FlowTestCase<ContactDeleteFlow> {
ContactDeleteFlowTest() {
setEppInput("contact_delete.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactInfoFlow}. */
class ContactInfoFlowTest extends FlowTestCase<ContactInfoFlow> {
ContactInfoFlowTest() {
setEppInput("contact_info.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferApproveFlow}. */
class ContactTransferApproveFlowTest extends FlowTestCase<ContactTransferApproveFlow> {
ContactTransferApproveFlowTest() {
setEppInput("contact_transfer_approve.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferCancelFlow}. */
class ContactTransferCancelFlowTest extends FlowTestCase<ContactTransferCancelFlow> {
ContactTransferCancelFlowTest() {
setEppInput("contact_transfer_cancel.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferQueryFlow}. */
class ContactTransferQueryFlowTest extends FlowTestCase<ContactTransferQueryFlow> {
ContactTransferQueryFlowTest() {
setEppInput("contact_transfer_query.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferRejectFlow}. */
class ContactTransferRejectFlowTest extends FlowTestCase<ContactTransferRejectFlow> {
ContactTransferRejectFlowTest() {
setEppInput("contact_transfer_reject.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferRequestFlow}. */
class ContactTransferRequestFlowTest extends FlowTestCase<ContactTransferRequestFlow> {
ContactTransferRequestFlowTest() {
setEppInput("contact_transfer_request.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -1,37 +0,0 @@
// Copyright 2017 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.flows.contact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactUpdateFlow}. */
class ContactUpdateFlowTest extends FlowTestCase<ContactUpdateFlow> {
ContactUpdateFlowTest() {
setEppInput("contact_update.xml");
}
@Test
void testThrowsException() {
assertAboutEppExceptions()
.that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
}

View File

@@ -79,6 +79,7 @@ import google.registry.flows.EppException;
import google.registry.flows.EppException.UnimplementedExtensionException;
import google.registry.flows.EppRequestSource;
import google.registry.flows.ExtensionManager.UndeclaredServiceExtensionException;
import google.registry.flows.FlowUtils;
import google.registry.flows.FlowUtils.NotLoggedInException;
import google.registry.flows.FlowUtils.UnknownCurrencyEppException;
import google.registry.flows.ResourceFlowTestCase;
@@ -141,7 +142,6 @@ import google.registry.flows.domain.token.AllocationTokenFlowUtils.AllocationTok
import google.registry.flows.domain.token.AllocationTokenFlowUtils.AllocationTokenNotValidForRegistrarException;
import google.registry.flows.domain.token.AllocationTokenFlowUtils.AlreadyRedeemedAllocationTokenException;
import google.registry.flows.domain.token.AllocationTokenFlowUtils.NonexistentAllocationTokenException;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.flows.exceptions.OnlyToolCanPassMetadataException;
import google.registry.flows.exceptions.ResourceCreateContentionException;
import google.registry.model.billing.BillingBase;
@@ -1878,7 +1878,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
void testFailure_minimumDataset_noRegistrantButSomeOtherContactTypes() throws Exception {
setEppInput("domain_create_other_contact_types.xml");
persistHosts();
EppException thrown = assertThrows(ContactsProhibitedException.class, this::runFlow);
EppException thrown =
assertThrows(FlowUtils.GenericXmlSyntaxErrorException.class, this::runFlow);
assertAboutEppExceptions().that(thrown).marshalsToXml();
}

View File

@@ -65,6 +65,7 @@ import google.registry.config.RegistryConfig;
import google.registry.flows.EppException;
import google.registry.flows.EppException.UnimplementedExtensionException;
import google.registry.flows.EppRequestSource;
import google.registry.flows.FlowUtils;
import google.registry.flows.FlowUtils.NotLoggedInException;
import google.registry.flows.ResourceFlowTestCase;
import google.registry.flows.ResourceFlowUtils.AddExistingValueException;
@@ -87,7 +88,6 @@ import google.registry.flows.domain.DomainFlowUtils.SecDnsAllUsageException;
import google.registry.flows.domain.DomainFlowUtils.TooManyDsRecordsException;
import google.registry.flows.domain.DomainFlowUtils.TooManyNameserversException;
import google.registry.flows.domain.DomainFlowUtils.UrgentAttributeNotSupportedException;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.flows.exceptions.OnlyToolCanPassMetadataException;
import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException;
import google.registry.flows.exceptions.ResourceStatusProhibitsOperationException;
@@ -273,15 +273,12 @@ class DomainUpdateFlowTest extends ResourceFlowTestCase<DomainUpdateFlow, Domain
}
@Test
void testFailure_minimumDataset_whenAddingNewContacts() throws Exception {
void testFailure_whenAddingNewContacts() throws Exception {
// This EPP adds a new technical contact mak21 that wasn't already present.
setEppInput("domain_update_empty_registrant.xml");
persistReferencedEntities();
persistDomain();
// Fails because the update adds some new contacts, although the registrant has been removed.
ContactsProhibitedException thrown =
assertThrows(ContactsProhibitedException.class, this::runFlow);
assertAboutEppExceptions().that(thrown).marshalsToXml();
assertThrows(FlowUtils.GenericXmlSyntaxErrorException.class, this::persistDomain);
}
private void modifyDomainToHave13Nameservers() throws Exception {

View File

@@ -127,31 +127,6 @@ public abstract class LoginFlowTestCase extends FlowTestCase<LoginFlow> {
doFailingTest("login_invalid_extension.xml", UnimplementedExtensionException.class);
}
@Test
void testFailure_invalidContactObjectUri() {
doFailingTest("login_with_contact_objuri.xml", UnimplementedObjectServiceException.class);
}
@Test
void testSuccess_contactObjectUriSent_worksWhenNotProhibited() throws Exception {
persistResource(
FeatureFlag.get(PROHIBIT_CONTACT_OBJECTS_ON_LOGIN)
.asBuilder()
.setStatusMap(ImmutableSortedMap.of(START_INSTANT, FeatureStatus.INACTIVE))
.build());
doSuccessfulTest("login_with_contact_objuri.xml");
}
@Test
void testSuccess_contactObjectUriNotSent_worksWhenNotProhibited() throws Exception {
persistResource(
FeatureFlag.get(PROHIBIT_CONTACT_OBJECTS_ON_LOGIN)
.asBuilder()
.setStatusMap(ImmutableSortedMap.of(START_INSTANT, FeatureStatus.INACTIVE))
.build());
doSuccessfulTest("login_valid.xml");
}
@Test
void testFailure_invalidTypes() {
doFailingTest("login_invalid_types.xml", UnimplementedObjectServiceException.class);

View File

@@ -1,119 +0,0 @@
// Copyright 2017 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.contact;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.eppcommon.EppXmlTransformer.marshalInput;
import static google.registry.model.eppcommon.EppXmlTransformer.validateInput;
import static google.registry.xml.ValidationMode.LENIENT;
import static google.registry.xml.XmlTestUtils.assertXmlEquals;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableList;
import google.registry.model.contact.ContactCommand.Update;
import google.registry.model.contact.ContactCommand.Update.Change;
import google.registry.model.eppinput.EppInput.ResourceCommandWrapper;
import google.registry.testing.EppLoader;
import org.junit.jupiter.api.Test;
/** Test xml roundtripping of commands. */
public class ContactCommandTest {
private void doXmlRoundtripTest(String inputFilename) throws Exception {
EppLoader eppLoader = new EppLoader(this, inputFilename);
// JAXB can unmarshal a "name" or an "id" into the "targetId" field, but when marshaling it
// chooses "name" always since it is last on the list of @XmlElement choices on that field. This
// is fine because we never marshal an input command... except for this test which verifies
// roundtripping, so we hack the output here. Since the marshal step won't validate, we use
// the non-validating lenient marshal, do the change, and then do the validate afterwards.
String marshaled = new String(marshalInput(eppLoader.getEpp(), LENIENT), UTF_8).replaceAll(
"<contact:name>(sh8013|sah8013|8013sah)</contact:name>",
"<contact:id>$1</contact:id>");
validateInput(marshaled);
assertXmlEquals(eppLoader.getEppXml(), marshaled);
}
@Test
void testCreate() throws Exception {
doXmlRoundtripTest("contact_create.xml");
}
@Test
void testDelete() throws Exception {
doXmlRoundtripTest("contact_delete.xml");
}
@Test
void testUpdate() throws Exception {
doXmlRoundtripTest("contact_update.xml");
}
@Test
void testUpdate_individualStreetFieldsGetPopulatedCorrectly() throws Exception {
EppLoader eppLoader = new EppLoader(this, "contact_update.xml");
Update command =
(Update)
((ResourceCommandWrapper) eppLoader.getEpp().getCommandWrapper().getCommand())
.getResourceCommand();
Change change = command.getInnerChange();
assertThat(change.getInternationalizedPostalInfo().getAddress())
.isEqualTo(
new ContactAddress.Builder()
.setCity("Dulles")
.setCountryCode("US")
.setState("VA")
.setZip("20166-6503")
.setStreet(
ImmutableList.of(
"124 Example Dr.",
"Suite 200")) // streetLine1 and streetLine2 get set inside the builder
.build());
}
@Test
void testInfo() throws Exception {
doXmlRoundtripTest("contact_info.xml");
}
@Test
void testCheck() throws Exception {
doXmlRoundtripTest("contact_check.xml");
}
@Test
void testTransferApprove() throws Exception {
doXmlRoundtripTest("contact_transfer_approve.xml");
}
@Test
void testTransferReject() throws Exception {
doXmlRoundtripTest("contact_transfer_reject.xml");
}
@Test
void testTransferCancel() throws Exception {
doXmlRoundtripTest("contact_transfer_cancel.xml");
}
@Test
void testTransferQuery() throws Exception {
doXmlRoundtripTest("contact_transfer_query.xml");
}
@Test
void testTransferRequest() throws Exception {
doXmlRoundtripTest("contact_transfer_request.xml");
}
}

View File

@@ -17,8 +17,8 @@ package google.registry.model.domain;
import static google.registry.testing.DatabaseHelper.persistActiveHost;
import static org.junit.Assert.assertThrows;
import google.registry.flows.FlowUtils;
import google.registry.flows.domain.DomainFlowUtils.RegistrantProhibitedException;
import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.ResourceCommandTestCase;
import google.registry.model.eppinput.EppInput;
import google.registry.model.eppinput.EppInput.ResourceCommandWrapper;
@@ -88,10 +88,9 @@ class DomainCommandTest extends ResourceCommandTestCase {
void testCreate_cloneAndLinkReferences_failsWithContacts() throws Exception {
persistActiveHost("ns1.example.net");
persistActiveHost("ns2.example.net");
DomainCommand.Create create =
(DomainCommand.Create) loadEppResourceCommand("domain_create_with_contacts.xml");
assertThrows(
RegistrantProhibitedException.class, () -> create.cloneAndLinkReferences(fakeClock.now()));
FlowUtils.GenericXmlSyntaxErrorException.class,
() -> loadEppResourceCommand("domain_create_with_contacts.xml"));
}
@Test
@@ -139,10 +138,9 @@ class DomainCommandTest extends ResourceCommandTestCase {
void testUpdate_cloneAndLinkReferences_failsWithContacts() throws Exception {
persistActiveHost("ns1.example.com");
persistActiveHost("ns2.example.com");
DomainCommand.Update update =
(DomainCommand.Update) loadEppResourceCommand("domain_update_with_contacts.xml");
assertThrows(
ContactsProhibitedException.class, () -> update.cloneAndLinkReferences(fakeClock.now()));
FlowUtils.GenericXmlSyntaxErrorException.class,
() -> loadEppResourceCommand("domain_update_with_contacts.xml"));
}
@Test

View File

@@ -59,7 +59,7 @@ class EppXmlTransformerTest {
@Test
void testUnmarshalingEppInput() throws Exception {
EppInput input = unmarshal(EppInput.class, loadBytes(getClass(), "contact_info.xml").read());
EppInput input = unmarshal(EppInput.class, loadBytes(getClass(), "domain_info.xml").read());
assertThat(input.getCommandType()).isEqualTo("info");
}
@@ -67,7 +67,7 @@ class EppXmlTransformerTest {
void testUnmarshalingWrongClassThrows() {
assertThrows(
ClassCastException.class,
() -> unmarshal(EppOutput.class, loadBytes(getClass(), "contact_info.xml").read()));
() -> unmarshal(EppOutput.class, loadBytes(getClass(), "domain_info.xml").read()));
}
@Test

View File

@@ -97,11 +97,6 @@ public class DomainToXjcConverterTest {
assertThat(bean.getClID()).isEqualTo("TheRegistrar");
assertThat(
bean.getContacts().stream()
.map(input -> String.format("%s %s", input.getType().toString(), input.getValue())))
.isEmpty();
assertThat(bean.getCrDate()).isEqualTo(Instant.parse("1900-01-01T00:00:00Z"));
// o A <crRr> element that contains the identifier of the registrar
@@ -176,7 +171,6 @@ public class DomainToXjcConverterTest {
void testConvertThin() {
XjcRdeDomain bean = DomainToXjcConverter.convertDomain(makeDomain(clock), RdeMode.THIN);
assertThat(bean.getRegistrant()).isNull();
assertThat(bean.getContacts()).isEmpty();
assertThat(bean.getSecDNS()).isNull();
}
@@ -197,7 +191,6 @@ public class DomainToXjcConverterTest {
Domain domain = makeDomain(clock);
XjcRdeDomain bean = DomainToXjcConverter.convertDomain(domain, RdeMode.FULL);
assertThat(bean.getRegistrant()).isNull();
assertThat(bean.getContacts()).isEmpty();
wrapDeposit(bean).marshal(new ByteArrayOutputStream(), UTF_8);
}

View File

@@ -52,10 +52,8 @@ public class EppToolCommandTest extends EppToolCommandTestCase<EppToolCommand> {
@Test
void testSuccess_singleXmlCommand() throws Exception {
// The choice of xml file is arbitrary.
runCommandForced(
"--client=NewRegistrar",
ToolsTestData.loadFile("contact_create.xml"));
eppVerifier.verifySent("contact_create.xml");
runCommandForced("--client=NewRegistrar", ToolsTestData.loadFile("domain_create_minimal.xml"));
eppVerifier.verifySent("domain_create_minimal.xml");
}
@Test
@@ -63,11 +61,11 @@ public class EppToolCommandTest extends EppToolCommandTestCase<EppToolCommand> {
// The choice of xml files is arbitrary.
runCommandForced(
"--client=NewRegistrar",
ToolsTestData.loadFile("contact_create.xml"),
ToolsTestData.loadFile("domain_create_minimal.xml"),
ToolsTestData.loadFile("domain_check.xml"),
ToolsTestData.loadFile("domain_check_fee.xml"));
eppVerifier
.verifySent("contact_create.xml")
.verifySent("domain_create_minimal.xml")
.verifySent("domain_check.xml")
.verifySent("domain_check_fee.xml");
}

View File

@@ -32,33 +32,33 @@ class ExecuteEppCommandTest extends EppToolCommandTestCase<ExecuteEppCommand> {
@BeforeEach
void beforeEach() throws Exception {
xmlInput = ToolsTestData.loadFile("contact_create.xml");
xmlInput = ToolsTestData.loadFile("domain_create_minimal.xml");
eppFile = writeToNamedTmpFile("eppFile", xmlInput);
}
@Test
void testSuccess() throws Exception {
runCommand("--client=NewRegistrar", "--force", eppFile);
eppVerifier.verifySent("contact_create.xml");
eppVerifier.verifySent("domain_create_minimal.xml");
}
@Test
void testSuccess_dryRun() throws Exception {
runCommand("--client=NewRegistrar", "--dry_run", eppFile);
eppVerifier.expectDryRun().verifySent("contact_create.xml");
eppVerifier.expectDryRun().verifySent("domain_create_minimal.xml");
}
@Test
void testSuccess_withSuperuser() throws Exception {
runCommand("--client=NewRegistrar", "--superuser", "--force", eppFile);
eppVerifier.expectSuperuser().verifySent("contact_create.xml");
eppVerifier.expectSuperuser().verifySent("domain_create_minimal.xml");
}
@Test
void testSuccess_fromStdin() throws Exception {
System.setIn(new ByteArrayInputStream(xmlInput.getBytes(UTF_8)));
runCommand("--client=NewRegistrar", "--force");
eppVerifier.verifySent("contact_create.xml");
eppVerifier.verifySent("domain_create_minimal.xml");
}
@Test
@@ -66,9 +66,7 @@ class ExecuteEppCommandTest extends EppToolCommandTestCase<ExecuteEppCommand> {
String xmlInput2 = ToolsTestData.loadFile("domain_check.xml");
String eppFile2 = writeToNamedTmpFile("eppFile2", xmlInput2);
runCommand("--client=NewRegistrar", "--force", eppFile, eppFile2);
eppVerifier
.verifySent("contact_create.xml")
.verifySent("domain_check.xml");
eppVerifier.verifySent("domain_create_minimal.xml").verifySent("domain_check.xml");
}
@Test

View File

@@ -53,10 +53,8 @@ public class MutatingEppToolCommandTest extends EppToolCommandTestCase<MutatingE
void testSuccess_dryrun() throws Exception {
// The choice of xml file is arbitrary.
runCommand(
"--client=NewRegistrar",
"--dry_run",
ToolsTestData.loadFile("contact_create.xml"));
eppVerifier.expectDryRun().verifySent("contact_create.xml");
"--client=NewRegistrar", "--dry_run", ToolsTestData.loadFile("domain_create_minimal.xml"));
eppVerifier.expectDryRun().verifySent("domain_create_minimal.xml");
}
@Test

View File

@@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import com.google.re2j.Pattern;
import google.registry.xjc.rde.XjcRdeDeposit;
import google.registry.xjc.rde.XjcRdeDepositTypeType;
import google.registry.xjc.rdecontact.XjcRdeContact;
import google.registry.xjc.rdedomain.XjcRdeDomain;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.junit.jupiter.api.Test;
@@ -109,8 +109,8 @@ class XjcObjectTest {
@Test
void testToStringNoValidation() {
String xml = new XjcRdeContact().toString();
assertWithMessage(xml).that(xml).startsWith("<XjcRdeContact ");
String xml = new XjcRdeDomain().toString();
assertWithMessage(xml).that(xml).startsWith("<XjcRdeDomain ");
}
@Test

View File

@@ -54,21 +54,6 @@ class XmlTestdataTest {
@SuppressWarnings("unused")
static Stream<Arguments> provideTestCombinations() {
return Stream.of(
Arguments.of("contact_check_response.xml", XjcEpp.class),
Arguments.of("contact_check.xml", XjcEpp.class),
Arguments.of("contact_create_response_offline_review_completed.xml", XjcEpp.class),
Arguments.of("contact_create_response_offline_review.xml", XjcEpp.class),
Arguments.of("contact_create_response.xml", XjcEpp.class),
Arguments.of("contact_create.xml", XjcEpp.class),
Arguments.of("contact_delete_response.xml", XjcEpp.class),
Arguments.of("contact_delete.xml", XjcEpp.class),
Arguments.of("contact_info_response.xml", XjcEpp.class),
Arguments.of("contact_info.xml", XjcEpp.class),
Arguments.of("contact_transfer_query_response.xml", XjcEpp.class),
Arguments.of("contact_transfer_query.xml", XjcEpp.class),
Arguments.of("contact_transfer_request_response.xml", XjcEpp.class),
Arguments.of("contact_transfer_request.xml", XjcEpp.class),
Arguments.of("contact_update.xml", XjcEpp.class),
Arguments.of("domain_check_response.xml", XjcEpp.class),
Arguments.of("domain_check.xml", XjcEpp.class),
Arguments.of("domain_create_response_offline_review_completed.xml", XjcEpp.class),

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rde:deposit xmlns:contact="urn:ietf:params:xml:ns:contact-1.0" xmlns:rdeContact="urn:ietf:params:xml:ns:rdeContact-1.0" xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6" type="FULL" id="AAAABXDKZ6WAA"%RESEND%>
<rde:deposit xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6" type="FULL" id="AAAABXDKZ6WAA"%RESEND%>
<rde:watermark>2000-01-01T00:00:00.000Z</rde:watermark>
<rde:rdeMenu>
<rde:version>1.0</rde:version>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rde:deposit xmlns:contact="urn:ietf:params:xml:ns:contact-1.0" xmlns:rdeContact="urn:ietf:params:xml:ns:rdeContact-1.0" xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6" type="FULL" id="AAAABXDKZ6WAA"%RESEND%>
<rde:deposit xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6" type="FULL" id="AAAABXDKZ6WAA"%RESEND%>
<rde:watermark>2000-01-01T00:00:00.000Z</rde:watermark>
<rde:rdeMenu>
<rde:version>1.0</rde:version>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rdeReport:report xmlns:contact="urn:ietf:params:xml:ns:contact-1.0" xmlns:rdeContact="urn:ietf:params:xml:ns:rdeContact-1.0" xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6">
<rdeReport:report xmlns:launch="urn:ietf:params:xml:ns:launch-1.0" xmlns:rdeEppParams="urn:ietf:params:xml:ns:rdeEppParams-1.0" xmlns:rdeNotification="urn:ietf:params:xml:ns:rdeNotification-1.0" xmlns:host="urn:ietf:params:xml:ns:host-1.0" xmlns:rdeIDN="urn:ietf:params:xml:ns:rdeIDN-1.0" xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0" xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" xmlns:rdeHost="urn:ietf:params:xml:ns:rdeHost-1.0" xmlns:rdeReport="urn:ietf:params:xml:ns:rdeReport-1.0" xmlns:fee11="urn:ietf:params:xml:ns:fee-0.11" xmlns:fee12="urn:ietf:params:xml:ns:fee-0.12" xmlns:iirdea="urn:ietf:params:xml:ns:iirdea-1.0" xmlns:rdeHeader="urn:ietf:params:xml:ns:rdeHeader-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:rdeDomain="urn:ietf:params:xml:ns:rdeDomain-1.0" xmlns:epp="urn:ietf:params:xml:ns:epp-1.0" xmlns:rdeNNDN="urn:ietf:params:xml:ns:rdeNNDN-1.0" xmlns:rdeRegistrar="urn:ietf:params:xml:ns:rdeRegistrar-1.0" xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:rde="urn:ietf:params:xml:ns:rde-1.0" xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" xmlns:mark="urn:ietf:params:xml:ns:mark-1.0" xmlns:rdePolicy="urn:ietf:params:xml:ns:rdePolicy-1.0" xmlns:fee_1_00="urn:ietf:params:xml:ns:epp:fee-1.0" xmlns:fee06="urn:ietf:params:xml:ns:fee-0.6">
<rdeReport:id>AAAABXDKZ6WAA</rdeReport:id>
<rdeReport:version>1</rdeReport:version>
<rdeReport:rydeSpecEscrow>draft-arias-noguchi-registry-data-escrow-06</rdeReport:rydeSpecEscrow>

View File

@@ -1,13 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<check>
<contact:check
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:id>sah8013</contact:id>
<contact:id>8013sah</contact:id>
</contact:check>
</check>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,60 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<check>
<contact:check
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>contact1</contact:id>
<contact:id>contact2</contact:id>
<contact:id>contact3</contact:id>
<contact:id>contact4</contact:id>
<contact:id>contact5</contact:id>
<contact:id>contact6</contact:id>
<contact:id>contact7</contact:id>
<contact:id>contact8</contact:id>
<contact:id>contact9</contact:id>
<contact:id>contact10</contact:id>
<contact:id>contact11</contact:id>
<contact:id>contact12</contact:id>
<contact:id>contact13</contact:id>
<contact:id>contact14</contact:id>
<contact:id>contact15</contact:id>
<contact:id>contact16</contact:id>
<contact:id>contact17</contact:id>
<contact:id>contact18</contact:id>
<contact:id>contact19</contact:id>
<contact:id>contact20</contact:id>
<contact:id>contact21</contact:id>
<contact:id>contact22</contact:id>
<contact:id>contact23</contact:id>
<contact:id>contact24</contact:id>
<contact:id>contact25</contact:id>
<contact:id>contact26</contact:id>
<contact:id>contact27</contact:id>
<contact:id>contact28</contact:id>
<contact:id>contact29</contact:id>
<contact:id>contact30</contact:id>
<contact:id>contact31</contact:id>
<contact:id>contact32</contact:id>
<contact:id>contact33</contact:id>
<contact:id>contact34</contact:id>
<contact:id>contact35</contact:id>
<contact:id>contact36</contact:id>
<contact:id>contact37</contact:id>
<contact:id>contact38</contact:id>
<contact:id>contact39</contact:id>
<contact:id>contact40</contact:id>
<contact:id>contact41</contact:id>
<contact:id>contact42</contact:id>
<contact:id>contact43</contact:id>
<contact:id>contact44</contact:id>
<contact:id>contact45</contact:id>
<contact:id>contact46</contact:id>
<contact:id>contact47</contact:id>
<contact:id>contact48</contact:id>
<contact:id>contact49</contact:id>
<contact:id>contact50</contact:id>
</contact:check>
</check>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,61 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<check>
<contact:check
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>contact1</contact:id>
<contact:id>contact2</contact:id>
<contact:id>contact3</contact:id>
<contact:id>contact4</contact:id>
<contact:id>contact5</contact:id>
<contact:id>contact6</contact:id>
<contact:id>contact7</contact:id>
<contact:id>contact8</contact:id>
<contact:id>contact9</contact:id>
<contact:id>contact10</contact:id>
<contact:id>contact11</contact:id>
<contact:id>contact12</contact:id>
<contact:id>contact13</contact:id>
<contact:id>contact14</contact:id>
<contact:id>contact15</contact:id>
<contact:id>contact16</contact:id>
<contact:id>contact17</contact:id>
<contact:id>contact18</contact:id>
<contact:id>contact19</contact:id>
<contact:id>contact20</contact:id>
<contact:id>contact21</contact:id>
<contact:id>contact22</contact:id>
<contact:id>contact23</contact:id>
<contact:id>contact24</contact:id>
<contact:id>contact25</contact:id>
<contact:id>contact26</contact:id>
<contact:id>contact27</contact:id>
<contact:id>contact28</contact:id>
<contact:id>contact29</contact:id>
<contact:id>contact30</contact:id>
<contact:id>contact31</contact:id>
<contact:id>contact32</contact:id>
<contact:id>contact33</contact:id>
<contact:id>contact34</contact:id>
<contact:id>contact35</contact:id>
<contact:id>contact36</contact:id>
<contact:id>contact37</contact:id>
<contact:id>contact38</contact:id>
<contact:id>contact39</contact:id>
<contact:id>contact40</contact:id>
<contact:id>contact41</contact:id>
<contact:id>contact42</contact:id>
<contact:id>contact43</contact:id>
<contact:id>contact44</contact:id>
<contact:id>contact45</contact:id>
<contact:id>contact46</contact:id>
<contact:id>contact47</contact:id>
<contact:id>contact48</contact:id>
<contact:id>contact49</contact:id>
<contact:id>contact50</contact:id>
<contact:id>contact51</contact:id>
</contact:check>
</check>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,26 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<contact:chkData
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:cd>
<contact:id avail="1">sh8013</contact:id>
</contact:cd>
<contact:cd>
<contact:id avail="0">sah8013</contact:id>
<contact:reason>In use</contact:reason>
</contact:cd>
<contact:cd>
<contact:id avail="1">8013sah</contact:id>
</contact:cd>
</contact:chkData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View File

@@ -1,33 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<contact:create
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:postalInfo type="int">
<contact:name>John Doe</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:voice x="1234">+1.7035555555</contact:voice>
<contact:fax>+1.7035555556</contact:fax>
<contact:email>jdoe@example.com</contact:email>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
<contact:disclose flag="1">
<contact:voice/>
<contact:email/>
</contact:disclose>
</contact:create>
</create>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,33 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<contact:create
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:postalInfo type="int">
<contact:name>John Doe</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:voice x="1234">+1.7035555555</contact:voice>
<contact:fax>+1.7035555556</contact:fax>
<contact:email>jdoe@example.com</contact:email>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
<contact:disclose flag="0">
<contact:voice/>
<contact:email/>
</contact:disclose>
</contact:create>
</create>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,45 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<contact:create
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:postalInfo type="int">
<contact:name>חנוך גולדפדר</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:postalInfo type="loc">
<contact:name>John Doe</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:voice x="1234">+1.7035555555</contact:voice>
<contact:fax>+1.7035555556</contact:fax>
<contact:email>jdoe@example.com</contact:email>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
<contact:disclose flag="1">
<contact:voice/>
<contact:email/>
</contact:disclose>
</contact:create>
</create>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,45 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<contact:create
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:postalInfo type="int">
<contact:name>John Doe</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:postalInfo type="loc">
<contact:name>חנוך גולדפדר</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:voice x="1234">+1.7035555555</contact:voice>
<contact:fax>+1.7035555556</contact:fax>
<contact:email>jdoe@example.com</contact:email>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
<contact:disclose flag="1">
<contact:voice/>
<contact:email/>
</contact:disclose>
</contact:create>
</create>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,18 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<contact:creData
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:crDate>1999-04-03T22:00:00.0Z</contact:crDate>
</contact:creData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View File

@@ -1,11 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<delete>
<contact:delete
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
</contact:delete>
</delete>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,10 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<delete>
<contact:delete
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
</contact:delete>
</delete>
</command>
</epp>

View File

@@ -1,11 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View File

@@ -1,10 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<trID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View File

@@ -1,14 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<info>
<contact:info
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
</contact:info>
</info>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,11 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<info>
<contact:info
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
</contact:info>
</info>
<clTRID>ABC-12345</clTRID>
</command>
</epp>

View File

@@ -1,47 +0,0 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<contact:infData
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
<contact:id>sh8013</contact:id>
<contact:roid>SH8013-REP</contact:roid>
<contact:status s="clientDeleteProhibited"/>
<contact:postalInfo type="int">
<contact:name>John Doe</contact:name>
<contact:org>Example Inc.</contact:org>
<contact:addr>
<contact:street>123 Example Dr.</contact:street>
<contact:street>Suite 100</contact:street>
<contact:city>Dulles</contact:city>
<contact:sp>VA</contact:sp>
<contact:pc>20166-6503</contact:pc>
<contact:cc>US</contact:cc>
</contact:addr>
</contact:postalInfo>
<contact:voice x="1234">+1.7035555555</contact:voice>
<contact:fax>+1.7035555556</contact:fax>
<contact:email>jdoe@example.com</contact:email>
<contact:clID>TheRegistrar</contact:clID>
<contact:crID>NewRegistrar</contact:crID>
<contact:crDate>1999-04-03T22:00:00.0Z</contact:crDate>
<contact:upID>NewRegistrar</contact:upID>
<contact:upDate>1999-12-03T09:00:00.0Z</contact:upDate>
<contact:trDate>2000-04-08T09:00:00.0Z</contact:trDate>
<contact:authInfo>
<contact:pw>2fooBAR</contact:pw>
</contact:authInfo>
<contact:disclose flag="1">
<contact:voice/>
<contact:email/>
</contact:disclose>
</contact:infData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

Some files were not shown because too many files have changed in this diff Show More