Skip to content

Commit 85f7549

Browse files
authored
Remove implementation of contact flows (#2896)
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 cbba915 commit 85f7549

36 files changed

+147
-3596
lines changed

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

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,60 +14,19 @@
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;
23-
import google.registry.flows.EppException;
24-
import google.registry.flows.ExtensionManager;
25-
import google.registry.flows.FlowModule.RegistrarId;
26-
import google.registry.flows.TransactionalFlow;
2718
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;
34-
import google.registry.model.eppoutput.EppResponse;
19+
import google.registry.flows.exceptions.ContactsProhibitedException;
3520
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
36-
import google.registry.util.Clock;
3721
import jakarta.inject.Inject;
3822

3923
/**
40-
* An EPP flow that checks whether a contact can be provisioned.
24+
* An EPP flow that is meant to check whether a contact can be provisioned.
4125
*
42-
* <p>This flows can check the existence of multiple contacts simultaneously.
43-
*
44-
* @error {@link google.registry.flows.exceptions.TooManyResourceChecksException}
45-
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
26+
* @error {@link ContactsProhibitedException}
4627
*/
28+
@Deprecated
4729
@ReportingSpec(ActivityReportField.CONTACT_CHECK)
48-
public final class ContactCheckFlow implements TransactionalFlow {
49-
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;
30+
public final class ContactCheckFlow extends ContactsProhibitedFlow {
5631
@Inject ContactCheckFlow() {}
57-
58-
@Override
59-
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();
72-
}
7332
}

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

Lines changed: 3 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -14,94 +14,19 @@
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;
27-
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;
3218
import google.registry.flows.annotations.ReportingSpec;
3319
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;
43-
import google.registry.model.eppoutput.EppResponse;
44-
import google.registry.model.reporting.HistoryEntry;
4520
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
4621
import jakarta.inject.Inject;
47-
import org.joda.time.DateTime;
4822

4923
/**
50-
* An EPP flow that creates a new contact.
24+
* An EPP flow meant to create a new contact.
5125
*
52-
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
5326
* @error {@link ContactsProhibitedException}
54-
* @error {@link ResourceAlreadyExistsForThisClientException}
55-
* @error {@link ResourceCreateContentionException}
56-
* @error {@link ContactFlowUtils.BadInternationalizedPostalInfoException}
57-
* @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException}
5827
*/
28+
@Deprecated
5929
@ReportingSpec(ActivityReportField.CONTACT_CREATE)
60-
public final class ContactCreateFlow implements MutatingFlow {
61-
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;
30+
public final class ContactCreateFlow extends ContactsProhibitedFlow {
6931
@Inject ContactCreateFlow() {}
70-
71-
@Override
72-
public EppResponse run() throws EppException {
73-
extensionManager.register(MetadataExtension.class);
74-
validateRegistrarIsLoggedIn(registrarId);
75-
extensionManager.validate();
76-
if (FeatureFlag.isActiveNow(MINIMUM_DATASET_CONTACTS_PROHIBITED)) {
77-
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();
106-
}
10732
}

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

Lines changed: 5 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -14,97 +14,20 @@
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;
31-
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;
3718
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;
44-
import google.registry.model.eppoutput.EppResponse;
45-
import google.registry.model.reporting.HistoryEntry.Type;
19+
import google.registry.flows.exceptions.ContactsProhibitedException;
4620
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
4721
import jakarta.inject.Inject;
48-
import java.util.Optional;
49-
import org.joda.time.DateTime;
5022

5123
/**
52-
* An EPP flow that deletes a contact.
24+
* An EPP flow that is meant to delete a contact.
5325
*
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.
59-
*
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}
26+
* @error {@link ContactsProhibitedException}
6527
*/
28+
@Deprecated
6629
@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;
77-
30+
public final class ContactDeleteFlow extends ContactsProhibitedFlow {
7831
@Inject
7932
ContactDeleteFlow() {}
80-
81-
@Override
82-
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();
109-
}
11033
}

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

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)