Skip to content

Commit 22bf77d

Browse files
committed
Remove implementation of contact flows
Now that we have transitioned to the minimum dataset, we no longer support any actions on contacts (and by the time this is merged / deployed, all contacts will be deleted). We should just throw an appropriate exception on all contact-related flows. We don't delete the flows themselves, so that we can have an appropriate error message. We also keep all the flows and XML templates around individually for now because we may be required to continue to differentiate the requests in ICANN activity reporting (e.g. srs-cont-create vs srs-cont-delete)
1 parent eed1886 commit 22bf77d

File tree

77 files changed

+198
-3702
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+198
-3702
lines changed

core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,60 +14,31 @@
1414

1515
package google.registry.flows.contact;
1616

17-
import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
18-
import static google.registry.flows.ResourceFlowUtils.verifyTargetIdCount;
1917

20-
import com.google.common.collect.ImmutableList;
21-
import com.google.common.collect.ImmutableSet;
22-
import google.registry.config.RegistryConfig.Config;
2318
import google.registry.flows.EppException;
24-
import google.registry.flows.ExtensionManager;
25-
import google.registry.flows.FlowModule.RegistrarId;
26-
import google.registry.flows.TransactionalFlow;
19+
import google.registry.flows.Flow;
2720
import google.registry.flows.annotations.ReportingSpec;
28-
import google.registry.model.ForeignKeyUtils;
29-
import google.registry.model.contact.Contact;
30-
import google.registry.model.contact.ContactCommand.Check;
31-
import google.registry.model.eppinput.ResourceCommand;
32-
import google.registry.model.eppoutput.CheckData.ContactCheck;
33-
import google.registry.model.eppoutput.CheckData.ContactCheckData;
21+
import google.registry.flows.exceptions.ContactsProhibitedException;
3422
import google.registry.model.eppoutput.EppResponse;
3523
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
36-
import google.registry.util.Clock;
3724
import jakarta.inject.Inject;
3825

3926
/**
40-
* An EPP flow that checks whether a contact can be provisioned.
27+
* An EPP flow that is meant to check whether a contact can be provisioned.
4128
*
42-
* <p>This flows can check the existence of multiple contacts simultaneously.
29+
* <p>This is no longer in use, because Nomulus follows the Minimum Dataset requirements, removing
30+
* all contact information.
4331
*
44-
* @error {@link google.registry.flows.exceptions.TooManyResourceChecksException}
45-
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
32+
* @error {@link ContactsProhibitedException}
4633
*/
34+
@Deprecated
4735
@ReportingSpec(ActivityReportField.CONTACT_CHECK)
48-
public final class ContactCheckFlow implements TransactionalFlow {
36+
public final class ContactCheckFlow implements Flow {
4937

50-
@Inject ResourceCommand resourceCommand;
51-
@Inject @RegistrarId String registrarId;
52-
@Inject ExtensionManager extensionManager;
53-
@Inject Clock clock;
54-
@Inject @Config("maxChecks") int maxChecks;
55-
@Inject EppResponse.Builder responseBuilder;
5638
@Inject ContactCheckFlow() {}
5739

5840
@Override
5941
public EppResponse run() throws EppException {
60-
validateRegistrarIsLoggedIn(registrarId);
61-
extensionManager.validate(); // There are no legal extensions for this flow.
62-
ImmutableList<String> targetIds = ((Check) resourceCommand).getTargetIds();
63-
verifyTargetIdCount(targetIds, maxChecks);
64-
ImmutableSet<String> existingIds =
65-
ForeignKeyUtils.loadKeys(Contact.class, targetIds, clock.nowUtc()).keySet();
66-
ImmutableList.Builder<ContactCheck> checks = new ImmutableList.Builder<>();
67-
for (String id : targetIds) {
68-
boolean unused = !existingIds.contains(id);
69-
checks.add(ContactCheck.create(unused, id, unused ? null : "In use"));
70-
}
71-
return responseBuilder.setResData(ContactCheckData.create(checks.build())).build();
42+
throw new ContactsProhibitedException();
7243
}
7344
}

core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java

Lines changed: 7 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,94 +14,31 @@
1414

1515
package google.registry.flows.contact;
1616

17-
import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
18-
import static google.registry.flows.ResourceFlowUtils.verifyResourceDoesNotExist;
19-
import static google.registry.flows.contact.ContactFlowUtils.validateAsciiPostalInfo;
20-
import static google.registry.flows.contact.ContactFlowUtils.validateContactAgainstPolicy;
21-
import static google.registry.model.EppResourceUtils.createRepoId;
22-
import static google.registry.model.common.FeatureFlag.FeatureName.MINIMUM_DATASET_CONTACTS_PROHIBITED;
23-
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
2417

25-
import com.google.common.collect.ImmutableSet;
26-
import google.registry.config.RegistryConfig.Config;
2718
import google.registry.flows.EppException;
28-
import google.registry.flows.ExtensionManager;
29-
import google.registry.flows.FlowModule.RegistrarId;
30-
import google.registry.flows.FlowModule.TargetId;
31-
import google.registry.flows.MutatingFlow;
19+
import google.registry.flows.Flow;
3220
import google.registry.flows.annotations.ReportingSpec;
3321
import google.registry.flows.exceptions.ContactsProhibitedException;
34-
import google.registry.flows.exceptions.ResourceAlreadyExistsForThisClientException;
35-
import google.registry.flows.exceptions.ResourceCreateContentionException;
36-
import google.registry.model.common.FeatureFlag;
37-
import google.registry.model.contact.Contact;
38-
import google.registry.model.contact.ContactCommand.Create;
39-
import google.registry.model.contact.ContactHistory;
40-
import google.registry.model.domain.metadata.MetadataExtension;
41-
import google.registry.model.eppinput.ResourceCommand;
42-
import google.registry.model.eppoutput.CreateData.ContactCreateData;
4322
import google.registry.model.eppoutput.EppResponse;
44-
import google.registry.model.reporting.HistoryEntry;
4523
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
4624
import jakarta.inject.Inject;
47-
import org.joda.time.DateTime;
4825

4926
/**
50-
* An EPP flow that creates a new contact.
27+
* An EPP flow meant to create a new contact.
28+
*
29+
* <p>This is no longer in use, because Nomulus follows the Minimum Dataset requirements, removing
30+
* all contact information.
5131
*
52-
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
5332
* @error {@link ContactsProhibitedException}
54-
* @error {@link ResourceAlreadyExistsForThisClientException}
55-
* @error {@link ResourceCreateContentionException}
56-
* @error {@link ContactFlowUtils.BadInternationalizedPostalInfoException}
57-
* @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException}
5833
*/
34+
@Deprecated
5935
@ReportingSpec(ActivityReportField.CONTACT_CREATE)
60-
public final class ContactCreateFlow implements MutatingFlow {
36+
public final class ContactCreateFlow implements Flow {
6137

62-
@Inject ResourceCommand resourceCommand;
63-
@Inject ExtensionManager extensionManager;
64-
@Inject @RegistrarId String registrarId;
65-
@Inject @TargetId String targetId;
66-
@Inject ContactHistory.Builder historyBuilder;
67-
@Inject EppResponse.Builder responseBuilder;
68-
@Inject @Config("contactAndHostRoidSuffix") String roidSuffix;
6938
@Inject ContactCreateFlow() {}
7039

7140
@Override
7241
public EppResponse run() throws EppException {
73-
extensionManager.register(MetadataExtension.class);
74-
validateRegistrarIsLoggedIn(registrarId);
75-
extensionManager.validate();
76-
if (FeatureFlag.isActiveNow(MINIMUM_DATASET_CONTACTS_PROHIBITED)) {
7742
throw new ContactsProhibitedException();
78-
}
79-
Create command = (Create) resourceCommand;
80-
DateTime now = tm().getTransactionTime();
81-
verifyResourceDoesNotExist(Contact.class, targetId, now, registrarId);
82-
Contact newContact =
83-
new Contact.Builder()
84-
.setContactId(targetId)
85-
.setAuthInfo(command.getAuthInfo())
86-
.setCreationRegistrarId(registrarId)
87-
.setPersistedCurrentSponsorRegistrarId(registrarId)
88-
.setRepoId(createRepoId(tm().allocateId(), roidSuffix))
89-
.setFaxNumber(command.getFax())
90-
.setVoiceNumber(command.getVoice())
91-
.setDisclose(command.getDisclose())
92-
.setEmailAddress(command.getEmail())
93-
.setInternationalizedPostalInfo(command.getInternationalizedPostalInfo())
94-
.setLocalizedPostalInfo(command.getLocalizedPostalInfo())
95-
.build();
96-
validateAsciiPostalInfo(newContact.getInternationalizedPostalInfo());
97-
validateContactAgainstPolicy(newContact);
98-
historyBuilder
99-
.setType(HistoryEntry.Type.CONTACT_CREATE)
100-
.setXmlBytes(null) // We don't want to store contact details in the history entry.
101-
.setContact(newContact);
102-
tm().insertAll(ImmutableSet.of(newContact, historyBuilder.build()));
103-
return responseBuilder
104-
.setResData(ContactCreateData.create(newContact.getContactId(), now))
105-
.build();
10643
}
10744
}

core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java

Lines changed: 9 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -14,97 +14,32 @@
1414

1515
package google.registry.flows.contact;
1616

17-
import static google.registry.flows.FlowUtils.DELETE_PROHIBITED_STATUSES;
18-
import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
19-
import static google.registry.flows.ResourceFlowUtils.checkLinkedDomains;
20-
import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
21-
import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses;
22-
import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
23-
import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
24-
import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
25-
import static google.registry.model.ResourceTransferUtils.handlePendingTransferOnDelete;
26-
import static google.registry.model.eppoutput.Result.Code.SUCCESS;
27-
import static google.registry.model.transfer.TransferStatus.SERVER_CANCELLED;
28-
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
2917

30-
import com.google.common.collect.ImmutableSet;
3118
import google.registry.flows.EppException;
32-
import google.registry.flows.ExtensionManager;
33-
import google.registry.flows.FlowModule.RegistrarId;
34-
import google.registry.flows.FlowModule.Superuser;
35-
import google.registry.flows.FlowModule.TargetId;
36-
import google.registry.flows.MutatingFlow;
19+
import google.registry.flows.Flow;
3720
import google.registry.flows.annotations.ReportingSpec;
38-
import google.registry.model.contact.Contact;
39-
import google.registry.model.contact.ContactHistory;
40-
import google.registry.model.domain.metadata.MetadataExtension;
41-
import google.registry.model.eppcommon.AuthInfo;
42-
import google.registry.model.eppcommon.StatusValue;
43-
import google.registry.model.eppcommon.Trid;
21+
import google.registry.flows.exceptions.ContactsProhibitedException;
4422
import google.registry.model.eppoutput.EppResponse;
45-
import google.registry.model.reporting.HistoryEntry.Type;
4623
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
4724
import jakarta.inject.Inject;
48-
import java.util.Optional;
49-
import org.joda.time.DateTime;
5025

5126
/**
52-
* An EPP flow that deletes a contact.
27+
* An EPP flow that is meant to delete a contact.
5328
*
54-
* <p>Contacts that are in use by any domain cannot be deleted. The flow may return immediately if a
55-
* quick smoke check determines that deletion is impossible due to an existing reference. However, a
56-
* successful delete will always be asynchronous, as all existing domains must be checked for
57-
* references to the host before the deletion is allowed to proceed. A poll message will be written
58-
* with the success or failure message when the process is complete.
29+
* <p>This is no longer in use, because Nomulus follows the Minimum Dataset requirements, removing
30+
* all contact information.
5931
*
60-
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
61-
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
62-
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
63-
* @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException}
64-
* @error {@link google.registry.flows.exceptions.ResourceToDeleteIsReferencedException}
32+
* @error {@link ContactsProhibitedException}
6533
*/
34+
@Deprecated
6635
@ReportingSpec(ActivityReportField.CONTACT_DELETE)
67-
public final class ContactDeleteFlow implements MutatingFlow {
68-
69-
@Inject ExtensionManager extensionManager;
70-
@Inject @RegistrarId String registrarId;
71-
@Inject @TargetId String targetId;
72-
@Inject Trid trid;
73-
@Inject @Superuser boolean isSuperuser;
74-
@Inject Optional<AuthInfo> authInfo;
75-
@Inject ContactHistory.Builder historyBuilder;
76-
@Inject EppResponse.Builder responseBuilder;
36+
public final class ContactDeleteFlow implements Flow {
7737

7838
@Inject
7939
ContactDeleteFlow() {}
8040

8141
@Override
8242
public EppResponse run() throws EppException {
83-
extensionManager.register(MetadataExtension.class);
84-
validateRegistrarIsLoggedIn(registrarId);
85-
extensionManager.validate();
86-
DateTime now = tm().getTransactionTime();
87-
checkLinkedDomains(targetId, now, Contact.class);
88-
Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
89-
verifyOptionalAuthInfo(authInfo, existingContact);
90-
verifyNoDisallowedStatuses(existingContact, ImmutableSet.of(StatusValue.PENDING_DELETE));
91-
if (!isSuperuser) {
92-
verifyNoDisallowedStatuses(existingContact, DELETE_PROHIBITED_STATUSES);
93-
verifyResourceOwnership(registrarId, existingContact);
94-
}
95-
// Handle pending transfers on contact deletion.
96-
Contact newContact =
97-
existingContact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)
98-
? denyPendingTransfer(existingContact, SERVER_CANCELLED, now, registrarId)
99-
: existingContact;
100-
// Wipe out PII on contact deletion.
101-
newContact =
102-
newContact.asBuilder().wipeOut().setStatusValues(null).setDeletionTime(now).build();
103-
ContactHistory contactHistory =
104-
historyBuilder.setType(Type.CONTACT_DELETE).setContact(newContact).build();
105-
handlePendingTransferOnDelete(existingContact, newContact, now, contactHistory);
106-
tm().insert(contactHistory);
107-
tm().update(newContact);
108-
return responseBuilder.setResultFromCode(SUCCESS).build();
43+
throw new ContactsProhibitedException();
10944
}
11045
}

0 commit comments

Comments
 (0)