diff --git a/java/google/registry/flows/FlowModule.java b/java/google/registry/flows/FlowModule.java index baacfeac1..0d1dfe6ff 100644 --- a/java/google/registry/flows/FlowModule.java +++ b/java/google/registry/flows/FlowModule.java @@ -18,9 +18,14 @@ import static com.google.common.base.Preconditions.checkState; import dagger.Module; import dagger.Provides; +import google.registry.flows.exceptions.OnlyToolCanPassMetadataException; import google.registry.flows.picker.FlowPicker; +import google.registry.model.domain.metadata.MetadataExtension; import google.registry.model.eppcommon.Trid; import google.registry.model.eppinput.EppInput; +import google.registry.model.eppinput.EppInput.ResourceCommandWrapper; +import google.registry.model.eppinput.ResourceCommand; +import google.registry.model.reporting.HistoryEntry; import java.lang.annotation.Documented; import javax.annotation.Nullable; import javax.inject.Qualifier; @@ -164,6 +169,44 @@ public class FlowModule { } } + @Provides + @FlowScope + static ResourceCommand provideResourceCommand(EppInput eppInput) { + return ((ResourceCommandWrapper) eppInput.getCommandWrapper().getCommand()) + .getResourceCommand(); + } + + /** + * Provides a partially filled in {@link HistoryEntry} builder. + * + *
This is not marked with {@link FlowScope} so that each retry gets a fresh one. Otherwise, + * the fact that the builder is one-use would cause NPEs. + */ + @Provides + static HistoryEntry.Builder provideHistoryEntryBuilder( + Trid trid, + @InputXml byte[] inputXmlBytes, + @Superuser boolean isSuperuser, + @ClientId @Nullable String clientId, + EppRequestSource eppRequestSource, + EppInput eppInput) { + HistoryEntry.Builder historyBuilder = new HistoryEntry.Builder() + .setTrid(trid) + .setXmlBytes(inputXmlBytes) + .setBySuperuser(isSuperuser) + .setClientId(clientId); + MetadataExtension metadataExtension = eppInput.getSingleExtension(MetadataExtension.class); + if (metadataExtension != null) { + if (!eppRequestSource.equals(EppRequestSource.TOOL)) { + throw new EppExceptionInProviderException(new OnlyToolCanPassMetadataException()); + } + historyBuilder + .setReason(metadataExtension.getReason()) + .setRequestedByRegistrar(metadataExtension.getRequestedByRegistrar()); + } + return historyBuilder; + } + /** Wrapper class to carry an {@link EppException} to the calling code. */ static class EppExceptionInProviderException extends RuntimeException { EppExceptionInProviderException(EppException exception) {