From 732c30b359994bca8d38991382ec0526d9bdae67 Mon Sep 17 00:00:00 2001 From: gbrodman Date: Thu, 11 Sep 2025 11:29:06 -0400 Subject: [PATCH] Remove registry-lock-related fields from RegistrarPoc (#2818) We've moved these over to the User class, so we should remove these for clarity. In addition, we should make it clear (in Java at least) that the field in the RegistryLock object refers to the email address used for the lock in question. --- .../registry/batch/RelockDomainAction.java | 48 +- .../registry/model/domain/RegistryLock.java | 21 +- .../model/registrar/RegistrarPoc.java | 85 +- .../registry/tools/DomainLockUtils.java | 13 +- .../registry/tools/RegistrarPocCommand.java | 27 - .../ui/server/RegistrarFormFields.java | 31 - .../console/settings/ContactAction.java | 65 - .../batch/RelockDomainActionTest.java | 16 +- .../JpaTransactionManagerExtension.java | 3 - .../schema/registrar/RegistrarPocTest.java | 1 - .../registry/tools/DomainLockUtilsTest.java | 6 +- .../tools/RegistrarPocCommandTest.java | 85 - .../ConsoleRegistryLockActionTest.java | 34 +- .../ConsoleRegistryLockVerifyActionTest.java | 2 +- .../console/settings/ContactActionTest.java | 54 +- .../sql/er_diagram/brief_er_diagram.html | 2258 ++-------- .../sql/er_diagram/full_er_diagram.html | 3900 ++--------------- db/src/main/resources/sql/flyway.txt | 1 + .../flyway/V197__poc_rlock_drop_not_null.sql | 16 + .../sql/schema/db-schema.sql.generated | 3 - .../resources/sql/schema/nomulus.golden.sql | 2 +- .../console-api-swagger.json | 4 +- 22 files changed, 828 insertions(+), 5847 deletions(-) create mode 100644 db/src/main/resources/sql/flyway/V197__poc_rlock_drop_not_null.sql diff --git a/core/src/main/java/google/registry/batch/RelockDomainAction.java b/core/src/main/java/google/registry/batch/RelockDomainAction.java index efed4fc1b..6f27a0a67 100644 --- a/core/src/main/java/google/registry/batch/RelockDomainAction.java +++ b/core/src/main/java/google/registry/batch/RelockDomainAction.java @@ -15,7 +15,6 @@ package google.registry.batch; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableSet.toImmutableSet; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.request.Action.Method.POST; import static google.registry.tools.LockOrUnlockDomainCommand.REGISTRY_LOCK_STATUSES; @@ -30,8 +29,6 @@ import google.registry.groups.GmailClient; import google.registry.model.domain.Domain; import google.registry.model.domain.RegistryLock; import google.registry.model.eppcommon.StatusValue; -import google.registry.model.registrar.Registrar; -import google.registry.model.registrar.RegistrarPoc; import google.registry.model.tld.RegistryLockDao; import google.registry.persistence.VKey; import google.registry.request.Action; @@ -70,12 +67,14 @@ public class RelockDomainAction implements Runnable { """ The domain %s was successfully re-locked. - Please contact support at %s if you have any questions."""; + Please contact support at %s if you have any questions.\ + """; private static final String RELOCK_NON_RETRYABLE_FAILURE_EMAIL_TEMPLATE = """ There was an error when automatically re-locking %s. Error message: %s - Please contact support at %s if you have any questions."""; + Please contact support at %s if you have any questions.\ + """; private static final String RELOCK_TRANSIENT_FAILURE_EMAIL_TEMPLATE = "There was an unexpected error when automatically re-locking %s. We will continue retrying " + "the lock for five hours. Please contact support at %s if you have any questions"; @@ -171,7 +170,7 @@ public class RelockDomainAction implements Runnable { domainLockUtils.administrativelyApplyLock( oldLock.getDomainName(), oldLock.getRegistrarId(), - oldLock.getRegistrarPocId(), + oldLock.getRegistryLockEmail(), oldLock.isSuperuser()); logger.atInfo().log("Re-locked domain %s.", oldLock.getDomainName()); response.setStatus(SC_OK); @@ -221,7 +220,7 @@ public class RelockDomainAction implements Runnable { EmailMessage.newBuilder() .setBody(body) .setSubject(String.format("Error re-locking domain %s", oldLock.getDomainName())) - .setRecipients(getEmailRecipients(oldLock.getRegistrarId())) + .setRecipients(ImmutableSet.of(getEmailRecipient(oldLock))) .build()); } @@ -250,7 +249,7 @@ public class RelockDomainAction implements Runnable { EmailMessage.newBuilder() .setBody(body) .setSubject(String.format("Successful re-lock of domain %s", oldLock.getDomainName())) - .setRecipients(getEmailRecipients(oldLock.getRegistrarId())) + .setRecipients(ImmutableSet.of(getEmailRecipient(oldLock))) .build()); } @@ -261,7 +260,7 @@ public class RelockDomainAction implements Runnable { // For an unexpected failure, notify both the lock-enabled contacts and our alerting email ImmutableSet allRecipients = new ImmutableSet.Builder() - .addAll(getEmailRecipients(oldLock.getRegistrarId())) + .add(getEmailRecipient(oldLock)) .add(alertRecipientAddress) .build(); gmailClient.sendEmail( @@ -281,31 +280,12 @@ public class RelockDomainAction implements Runnable { .build()); } - private ImmutableSet getEmailRecipients(String registrarId) { - Registrar registrar = - Registrar.loadByRegistrarIdCached(registrarId) - .orElseThrow( - () -> - new IllegalStateException(String.format("Unknown registrar %s", registrarId))); - - ImmutableSet registryLockEmailAddresses = - registrar.getContacts().stream() - .filter(RegistrarPoc::isRegistryLockAllowed) - .map(RegistrarPoc::getRegistryLockEmailAddress) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(toImmutableSet()); - - ImmutableSet.Builder builder = new ImmutableSet.Builder<>(); - // can't use streams due to the 'throws' in the InternetAddress constructor - for (String registryLockEmailAddress : registryLockEmailAddresses) { - try { - builder.add(new InternetAddress(registryLockEmailAddress)); - } catch (AddressException e) { - // This shouldn't stop any other emails going out, so swallow it - logger.atWarning().log("Invalid email address '%s'.", registryLockEmailAddress); - } + private InternetAddress getEmailRecipient(RegistryLock lock) { + try { + return new InternetAddress(lock.getRegistryLockEmail()); + } catch (AddressException e) { + // this really shouldn't happen + throw new RuntimeException(e); } - return builder.build(); } } diff --git a/core/src/main/java/google/registry/model/domain/RegistryLock.java b/core/src/main/java/google/registry/model/domain/RegistryLock.java index 374ce5753..67fa6d714 100644 --- a/core/src/main/java/google/registry/model/domain/RegistryLock.java +++ b/core/src/main/java/google/registry/model/domain/RegistryLock.java @@ -101,8 +101,15 @@ public final class RegistryLock extends UpdateAutoTimestampEntity implements Bui @Column(nullable = false) private String registrarId; - /** The POC that performed the action, or null if it was a superuser. */ - @Expose private String registrarPocId; + /** + * The email address of the user that performed the action, or null if it was a superuser. + * + *

Note: this is misnamed in the database due to historical reasons, where we used the + * registrar POC ID as the email address rather than a separate specialized field. + */ + @Column(name = "registrarPocId") + @Expose + private String registryLockEmail; /** When the lock is first requested. */ @AttributeOverrides({ @@ -161,8 +168,8 @@ public final class RegistryLock extends UpdateAutoTimestampEntity implements Bui return registrarId; } - public String getRegistrarPocId() { - return registrarPocId; + public String getRegistryLockEmail() { + return registryLockEmail; } public DateTime getLockRequestTime() { @@ -255,7 +262,7 @@ public final class RegistryLock extends UpdateAutoTimestampEntity implements Bui checkArgumentNotNull(getInstance().registrarId, "Registrar ID cannot be null"); checkArgumentNotNull(getInstance().verificationCode, "Verification code cannot be null"); checkArgument( - getInstance().registrarPocId != null || getInstance().isSuperuser, + getInstance().registryLockEmail != null || getInstance().isSuperuser, "Registrar POC ID must be provided if superuser is false"); return super.build(); } @@ -275,8 +282,8 @@ public final class RegistryLock extends UpdateAutoTimestampEntity implements Bui return this; } - public Builder setRegistrarPocId(String registrarPocId) { - getInstance().registrarPocId = registrarPocId; + public Builder setRegistryLockEmail(String registryLockEmail) { + getInstance().registryLockEmail = registryLockEmail; return this; } diff --git a/core/src/main/java/google/registry/model/registrar/RegistrarPoc.java b/core/src/main/java/google/registry/model/registrar/RegistrarPoc.java index e5f8eea25..5f9bedf17 100644 --- a/core/src/main/java/google/registry/model/registrar/RegistrarPoc.java +++ b/core/src/main/java/google/registry/model/registrar/RegistrarPoc.java @@ -14,16 +14,11 @@ package google.registry.model.registrar; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.collect.ImmutableSet.toImmutableSet; -import static com.google.common.io.BaseEncoding.base64; import static google.registry.model.registrar.Registrar.checkValidEmail; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.util.CollectionUtils.nullToEmptyImmutableSortedCopy; -import static google.registry.util.PasswordUtils.SALT_SUPPLIER; -import static google.registry.util.PasswordUtils.hashPassword; import static java.util.stream.Collectors.joining; import com.google.common.annotations.VisibleForTesting; @@ -38,7 +33,6 @@ import google.registry.model.Jsonifiable; import google.registry.model.UnsafeSerializable; import google.registry.persistence.VKey; import google.registry.persistence.transaction.QueryComposer; -import google.registry.util.PasswordUtils; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -47,9 +41,7 @@ import jakarta.persistence.Id; import jakarta.persistence.IdClass; import java.io.Serializable; import java.util.Map; -import java.util.Optional; import java.util.Set; -import javax.annotation.Nullable; /** * A contact for a Registrar. Note, equality, hashCode and comparable have been overridden to only @@ -107,9 +99,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe @Id @Expose public String registrarId; - /** External email address of this contact used for registry lock confirmations. */ - String registryLockEmailAddress; - /** The voice number of the contact. */ @Expose String phoneNumber; @@ -147,22 +136,10 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe @Expose boolean visibleInDomainWhoisAsAbuse = false; - /** - * Whether the contact is allowed to set their registry lock password through the registrar - * console. This will be set to false on contact creation and when the user sets a password. - */ + /** Legacy field, around until we can remove the non-null constraint and the column from SQL. */ @Column(nullable = false) boolean allowedToSetRegistryLockPassword = false; - /** - * A hashed password that exists iff this contact is registry-lock-enabled. The hash is a base64 - * encoded SHA256 string. - */ - String registryLockPasswordHash; - - /** Randomly generated hash salt. */ - String registryLockPasswordSalt; - /** * Helper to update the contacts associated with a Registrar. This requires querying for the * existing contacts, deleting existing contacts that are not part of the given {@code contacts} @@ -197,10 +174,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe return emailAddress; } - public Optional getRegistryLockEmailAddress() { - return Optional.ofNullable(registryLockEmailAddress); - } - public String getPhoneNumber() { return phoneNumber; } @@ -229,24 +202,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe return new Builder(clone(this)); } - public boolean isAllowedToSetRegistryLockPassword() { - return allowedToSetRegistryLockPassword; - } - - public boolean isRegistryLockAllowed() { - return !isNullOrEmpty(registryLockPasswordHash) && !isNullOrEmpty(registryLockPasswordSalt); - } - - public boolean verifyRegistryLockPassword(String registryLockPassword) { - if (isNullOrEmpty(registryLockPassword) - || isNullOrEmpty(registryLockPasswordSalt) - || isNullOrEmpty(registryLockPasswordHash)) { - return false; - } - return PasswordUtils.verifyPassword( - registryLockPassword, registryLockPasswordHash, registryLockPasswordSalt); - } - /** * Returns a string representation that's human friendly. * @@ -296,15 +251,12 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe return new JsonMapBuilder() .put("name", name) .put("emailAddress", emailAddress) - .put("registryLockEmailAddress", registryLockEmailAddress) .put("phoneNumber", phoneNumber) .put("faxNumber", faxNumber) .put("types", getTypes().stream().map(Object::toString).collect(joining(","))) .put("visibleInWhoisAsAdmin", visibleInWhoisAsAdmin) .put("visibleInWhoisAsTech", visibleInWhoisAsTech) .put("visibleInDomainWhoisAsAbuse", visibleInDomainWhoisAsAbuse) - .put("allowedToSetRegistryLockPassword", allowedToSetRegistryLockPassword) - .put("registryLockAllowed", isRegistryLockAllowed()) .put("id", getId()) .build(); } @@ -344,14 +296,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe public RegistrarPoc build() { checkNotNull(getInstance().registrarId, "Registrar ID cannot be null"); checkValidEmail(getInstance().emailAddress); - // Check allowedToSetRegistryLockPassword here because if we want to allow the user to set - // a registry lock password, we must also set up the correct registry lock email concurrently - // or beforehand. - if (getInstance().allowedToSetRegistryLockPassword) { - checkArgument( - !isNullOrEmpty(getInstance().registryLockEmailAddress), - "Registry lock email must not be null if allowing registry lock access"); - } return cloneEmptyToNull(super.build()); } @@ -365,11 +309,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe return this; } - public Builder setRegistryLockEmailAddress(@Nullable String registryLockEmailAddress) { - getInstance().registryLockEmailAddress = registryLockEmailAddress; - return this; - } - public Builder setPhoneNumber(String phoneNumber) { getInstance().phoneNumber = phoneNumber; return this; @@ -409,28 +348,6 @@ public class RegistrarPoc extends ImmutableObject implements Jsonifiable, Unsafe getInstance().visibleInDomainWhoisAsAbuse = visible; return this; } - - public Builder setAllowedToSetRegistryLockPassword(boolean allowedToSetRegistryLockPassword) { - if (allowedToSetRegistryLockPassword) { - getInstance().registryLockPasswordSalt = null; - getInstance().registryLockPasswordHash = null; - } - getInstance().allowedToSetRegistryLockPassword = allowedToSetRegistryLockPassword; - return this; - } - - public Builder setRegistryLockPassword(String registryLockPassword) { - checkArgument( - getInstance().allowedToSetRegistryLockPassword, - "Not allowed to set registry lock password for this contact"); - checkArgument( - !isNullOrEmpty(registryLockPassword), "Registry lock password was null or empty"); - byte[] salt = SALT_SUPPLIER.get(); - getInstance().registryLockPasswordSalt = base64().encode(salt); - getInstance().registryLockPasswordHash = hashPassword(registryLockPassword, salt); - getInstance().allowedToSetRegistryLockPassword = false; - return this; - } } public static ImmutableList loadForRegistrar(String registrarId) { diff --git a/core/src/main/java/google/registry/tools/DomainLockUtils.java b/core/src/main/java/google/registry/tools/DomainLockUtils.java index 0898fb388..4eb87f1f2 100644 --- a/core/src/main/java/google/registry/tools/DomainLockUtils.java +++ b/core/src/main/java/google/registry/tools/DomainLockUtils.java @@ -74,11 +74,12 @@ public final class DomainLockUtils { *

The lock will not be applied until {@link #verifyVerificationCode} is called. */ public RegistryLock saveNewRegistryLockRequest( - String domainName, String registrarId, @Nullable String registrarPocId, boolean isAdmin) { + String domainName, String registrarId, @Nullable String registryLockEmail, boolean isAdmin) { return tm().transact( () -> RegistryLockDao.save( - createLockBuilder(domainName, registrarId, registrarPocId, isAdmin).build())); + createLockBuilder(domainName, registrarId, registryLockEmail, isAdmin) + .build())); } /** @@ -129,13 +130,13 @@ public final class DomainLockUtils { * the case of relocks, isAdmin is determined by the previous lock. */ public RegistryLock administrativelyApplyLock( - String domainName, String registrarId, @Nullable String registrarPocId, boolean isAdmin) { + String domainName, String registrarId, @Nullable String registryLockEmail, boolean isAdmin) { return tm().transact( () -> { DateTime now = tm().getTransactionTime(); RegistryLock newLock = RegistryLockDao.save( - createLockBuilder(domainName, registrarId, registrarPocId, isAdmin) + createLockBuilder(domainName, registrarId, registryLockEmail, isAdmin) .setLockCompletionTime(now) .build()); applyLockStatuses(newLock, now, isAdmin); @@ -235,7 +236,7 @@ public final class DomainLockUtils { } private RegistryLock.Builder createLockBuilder( - String domainName, String registrarId, @Nullable String registrarPocId, boolean isAdmin) { + String domainName, String registrarId, @Nullable String registryLockEmail, boolean isAdmin) { DateTime now = tm().getTransactionTime(); Domain domain = getDomain(domainName, registrarId, now); verifyDomainNotLocked(domain, isAdmin); @@ -255,7 +256,7 @@ public final class DomainLockUtils { .setDomainName(domainName) .setRepoId(domain.getRepoId()) .setRegistrarId(registrarId) - .setRegistrarPocId(registrarPocId) + .setRegistryLockEmail(registryLockEmail) .isSuperuser(isAdmin); } diff --git a/core/src/main/java/google/registry/tools/RegistrarPocCommand.java b/core/src/main/java/google/registry/tools/RegistrarPocCommand.java index f095523d8..4da9d4d41 100644 --- a/core/src/main/java/google/registry/tools/RegistrarPocCommand.java +++ b/core/src/main/java/google/registry/tools/RegistrarPocCommand.java @@ -85,12 +85,6 @@ final class RegistrarPocCommand extends MutatingCommand { + " and will be used as the console login email, if --login_email is not specified.") String email; - @Nullable - @Parameter( - names = "--registry_lock_email", - description = "Email address used for registry lock confirmation emails") - String registryLockEmail; - @Nullable @Parameter( names = "--phone", @@ -132,15 +126,6 @@ final class RegistrarPocCommand extends MutatingCommand { arity = 1) private Boolean visibleInDomainWhoisAsAbuse; - @Nullable - @Parameter( - names = "--allowed_to_set_registry_lock_password", - description = - "Allow this contact to set their registry lock password in the console," - + " enabling registry lock", - arity = 1) - private Boolean allowedToSetRegistryLockPassword; - @Parameter( names = {"-o", "--output"}, description = "Output file when --mode=LIST", @@ -235,9 +220,6 @@ final class RegistrarPocCommand extends MutatingCommand { builder.setRegistrar(registrar); builder.setName(name); builder.setEmailAddress(email); - if (!isNullOrEmpty(registryLockEmail)) { - builder.setRegistryLockEmailAddress(registryLockEmail); - } if (phone != null) { builder.setPhoneNumber(phone.orElse(null)); } @@ -255,9 +237,6 @@ final class RegistrarPocCommand extends MutatingCommand { if (visibleInDomainWhoisAsAbuse != null) { builder.setVisibleInDomainWhoisAsAbuse(visibleInDomainWhoisAsAbuse); } - if (allowedToSetRegistryLockPassword != null) { - builder.setAllowedToSetRegistryLockPassword(allowedToSetRegistryLockPassword); - } return builder.build(); } @@ -269,9 +248,6 @@ final class RegistrarPocCommand extends MutatingCommand { if (!isNullOrEmpty(name)) { builder.setName(name); } - if (!isNullOrEmpty(registryLockEmail)) { - builder.setRegistryLockEmailAddress(registryLockEmail); - } if (phone != null) { builder.setPhoneNumber(phone.orElse(null)); } @@ -290,9 +266,6 @@ final class RegistrarPocCommand extends MutatingCommand { if (visibleInDomainWhoisAsAbuse != null) { builder.setVisibleInDomainWhoisAsAbuse(visibleInDomainWhoisAsAbuse); } - if (allowedToSetRegistryLockPassword != null) { - builder.setAllowedToSetRegistryLockPassword(allowedToSetRegistryLockPassword); - } return builder.build(); } diff --git a/core/src/main/java/google/registry/ui/server/RegistrarFormFields.java b/core/src/main/java/google/registry/ui/server/RegistrarFormFields.java index 15e292b60..fb2db81fd 100644 --- a/core/src/main/java/google/registry/ui/server/RegistrarFormFields.java +++ b/core/src/main/java/google/registry/ui/server/RegistrarFormFields.java @@ -21,7 +21,6 @@ import static google.registry.util.DomainNameUtils.canonicalizeHostname; import com.google.common.base.Ascii; import com.google.common.base.Splitter; -import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.net.InternetDomainName; @@ -29,7 +28,6 @@ import com.google.re2j.Pattern; import google.registry.model.registrar.Registrar; import google.registry.model.registrar.RegistrarAddress; import google.registry.model.registrar.RegistrarPoc; -import google.registry.ui.forms.FormException; import google.registry.ui.forms.FormField; import google.registry.ui.forms.FormFieldException; import google.registry.ui.forms.FormFields; @@ -38,7 +36,6 @@ import google.registry.util.X509Utils; import java.security.cert.CertificateParsingException; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; import javax.annotation.Nullable; @@ -192,14 +189,6 @@ public final class RegistrarFormFields { public static final FormField CONTACT_FAX_NUMBER_FIELD = FormFields.PHONE_NUMBER.asBuilderNamed("faxNumber").build(); - public static final FormField CONTACT_ALLOWED_TO_SET_REGISTRY_LOCK_PASSWORD = - FormField.named("allowedToSetRegistryLockPassword", Object.class) - .transform(Boolean.class, b -> Boolean.valueOf(Objects.toString(b))) - .build(); - - public static final FormField CONTACT_REGISTRY_LOCK_PASSWORD_FIELD = - FormFields.NAME.asBuilderNamed("registryLockPassword").build(); - public static final FormField> CONTACT_TYPES = FormField.named("types") .uppercased() @@ -369,8 +358,6 @@ public final class RegistrarFormFields { private static void applyRegistrarContactArgs(RegistrarPoc.Builder builder, Map args) { builder.setName(CONTACT_NAME_FIELD.extractUntyped(args).orElse(null)); builder.setEmailAddress(CONTACT_EMAIL_ADDRESS_FIELD.extractUntyped(args).orElse(null)); - builder.setRegistryLockEmailAddress( - REGISTRY_LOCK_EMAIL_ADDRESS_FIELD.extractUntyped(args).orElse(null)); builder.setVisibleInWhoisAsAdmin( CONTACT_VISIBLE_IN_WHOIS_AS_ADMIN_FIELD.extractUntyped(args).orElse(false)); builder.setVisibleInWhoisAsTech( @@ -380,23 +367,5 @@ public final class RegistrarFormFields { builder.setPhoneNumber(CONTACT_PHONE_NUMBER_FIELD.extractUntyped(args).orElse(null)); builder.setFaxNumber(CONTACT_FAX_NUMBER_FIELD.extractUntyped(args).orElse(null)); builder.setTypes(CONTACT_TYPES.extractUntyped(args).orElse(ImmutableSet.of())); - // The parser is inconsistent with whether it retrieves boolean values as strings or booleans. - // As a result, use a potentially-redundant converter that can deal with both. - builder.setAllowedToSetRegistryLockPassword( - CONTACT_ALLOWED_TO_SET_REGISTRY_LOCK_PASSWORD.extractUntyped(args).orElse(false)); - - // Registry lock password does not need to be set every time - CONTACT_REGISTRY_LOCK_PASSWORD_FIELD - .extractUntyped(args) - .ifPresent( - password -> { - if (!Strings.isNullOrEmpty(password)) { - if (password.length() < 8) { - throw new FormException( - "Registry lock password must be at least 8 characters long"); - } - builder.setRegistryLockPassword(password); - } - }); } } diff --git a/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java b/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java index e7c961cb7..05f2aba52 100644 --- a/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java +++ b/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java @@ -45,7 +45,6 @@ import google.registry.ui.server.console.ConsoleApiAction; import google.registry.ui.server.console.ConsoleApiParams; import jakarta.inject.Inject; import java.util.HashSet; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.BiFunction; @@ -246,7 +245,6 @@ public class ContactAction extends ConsoleApiAction { throw new ContactRequirementException( "An abuse contact visible in domain WHOIS query must be designated"); } - checkContactRegistryLockRequirements(existingContacts, updatedContacts); } private static void enforcePrimaryContactRestrictions( @@ -266,69 +264,6 @@ public class ContactAction extends ConsoleApiAction { } } - private static void checkContactRegistryLockRequirements( - ImmutableSet existingContacts, ImmutableSet updatedContacts) { - // Any contact(s) with new passwords must be allowed to set them - for (RegistrarPoc updatedContact : updatedContacts) { - if (updatedContact.isRegistryLockAllowed() - || updatedContact.isAllowedToSetRegistryLockPassword()) { - RegistrarPoc existingContact = - existingContacts.stream() - .filter( - contact -> contact.getEmailAddress().equals(updatedContact.getEmailAddress())) - .findFirst() - .orElseThrow( - () -> - new FormException( - "Cannot set registry lock password directly on new contact")); - // Can't modify registry lock email address - if (!Objects.equals( - updatedContact.getRegistryLockEmailAddress(), - existingContact.getRegistryLockEmailAddress())) { - throw new FormException("Cannot modify registryLockEmailAddress through the UI"); - } - if (updatedContact.isRegistryLockAllowed()) { - // the password must have been set before or the user was allowed to set it now - if (!existingContact.isAllowedToSetRegistryLockPassword() - && !existingContact.isRegistryLockAllowed()) { - throw new FormException("Registrar contact not allowed to set registry lock password"); - } - } - if (updatedContact.isAllowedToSetRegistryLockPassword()) { - if (!existingContact.isAllowedToSetRegistryLockPassword()) { - throw new FormException( - "Cannot modify isAllowedToSetRegistryLockPassword through the UI"); - } - } - } - } - - // Any previously-existing contacts with registry lock enabled cannot be deleted - existingContacts.stream() - .filter(RegistrarPoc::isRegistryLockAllowed) - .forEach( - contact -> { - Optional updatedContactOptional = - updatedContacts.stream() - .filter( - updatedContact -> - updatedContact.getEmailAddress().equals(contact.getEmailAddress())) - .findFirst(); - if (updatedContactOptional.isEmpty()) { - throw new FormException( - String.format( - "Cannot delete the contact %s that has registry lock enabled", - contact.getEmailAddress())); - } - if (!updatedContactOptional.get().isRegistryLockAllowed()) { - throw new FormException( - String.format( - "Cannot remove the ability to use registry lock on the contact %s", - contact.getEmailAddress())); - } - }); - } - /** * Retrieves the registrar contact whose phone number and email address is visible in domain WHOIS * query as abuse contact (if any). diff --git a/core/src/test/java/google/registry/batch/RelockDomainActionTest.java b/core/src/test/java/google/registry/batch/RelockDomainActionTest.java index f5da17777..d728e6f9b 100644 --- a/core/src/test/java/google/registry/batch/RelockDomainActionTest.java +++ b/core/src/test/java/google/registry/batch/RelockDomainActionTest.java @@ -68,7 +68,7 @@ public class RelockDomainActionTest { private static final String DOMAIN_NAME = "example.tld"; private static final String CLIENT_ID = "TheRegistrar"; - private static final String POC_ID = "marla.singer@example.com"; + private static final String LOCK_EMAIL_ADDRESS = "Marla.Singer.RegistryLock@crr.com"; private final FakeResponse response = new FakeResponse(); private final FakeClock clock = new FakeClock(DateTime.parse("2015-05-18T12:34:56Z")); @@ -94,7 +94,9 @@ public class RelockDomainActionTest { Host host = persistActiveHost("ns1.example.net"); domain = persistResource(DatabaseHelper.newDomain(DOMAIN_NAME, host)); - oldLock = domainLockUtils.administrativelyApplyLock(DOMAIN_NAME, CLIENT_ID, POC_ID, false); + oldLock = + domainLockUtils.administrativelyApplyLock( + DOMAIN_NAME, CLIENT_ID, LOCK_EMAIL_ADDRESS, false); assertThat(loadByEntity(domain).getStatusValues()) .containsAtLeastElementsIn(REGISTRY_LOCK_STATUSES); oldLock = @@ -255,9 +257,10 @@ public class RelockDomainActionTest { .setSubject("Successful re-lock of domain example.tld") .setBody( """ - The domain example.tld was successfully re-locked. + The domain example.tld was successfully re-locked. - Please contact support at support@example.com if you have any questions.""") + Please contact support at support@example.com if you have any questions.\ + """) .setRecipients( ImmutableSet.of(new InternetAddress("Marla.Singer.RegistryLock@crr.com"))) .build(); @@ -268,9 +271,10 @@ public class RelockDomainActionTest { String expectedBody = String.format( """ - There was an error when automatically re-locking example.tld. Error message: %s + There was an error when automatically re-locking example.tld. Error message: %s - Please contact support at support@example.com if you have any questions.""", + Please contact support at support@example.com if you have any questions.\ + """, exceptionMessage); assertFailureEmailWithBody( expectedBody, ImmutableSet.of(new InternetAddress("Marla.Singer.RegistryLock@crr.com"))); diff --git a/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerExtension.java b/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerExtension.java index 27c2538c7..0b7ccdfaa 100644 --- a/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerExtension.java +++ b/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerExtension.java @@ -434,11 +434,8 @@ public abstract class JpaTransactionManagerExtension .setRegistrar(makeRegistrar2()) .setName("Marla Singer") .setEmailAddress("Marla.Singer@crr.com") - .setRegistryLockEmailAddress("Marla.Singer.RegistryLock@crr.com") .setPhoneNumber("+1.2128675309") .setTypes(ImmutableSet.of(RegistrarPoc.Type.TECH)) - .setAllowedToSetRegistryLockPassword(true) - .setRegistryLockPassword("hi") .build(); } diff --git a/core/src/test/java/google/registry/schema/registrar/RegistrarPocTest.java b/core/src/test/java/google/registry/schema/registrar/RegistrarPocTest.java index 1b5d76869..27283080d 100644 --- a/core/src/test/java/google/registry/schema/registrar/RegistrarPocTest.java +++ b/core/src/test/java/google/registry/schema/registrar/RegistrarPocTest.java @@ -50,7 +50,6 @@ class RegistrarPocTest { .setRegistrar(testRegistrar) .setName("Judith Registrar") .setEmailAddress("judith.doe@example.com") - .setRegistryLockEmailAddress("judith.doe@external.com") .setPhoneNumber("+1.2125650000") .setFaxNumber("+1.2125650001") .setTypes(ImmutableSet.of(WHOIS)) diff --git a/core/src/test/java/google/registry/tools/DomainLockUtilsTest.java b/core/src/test/java/google/registry/tools/DomainLockUtilsTest.java index da456cba1..341fd3509 100644 --- a/core/src/test/java/google/registry/tools/DomainLockUtilsTest.java +++ b/core/src/test/java/google/registry/tools/DomainLockUtilsTest.java @@ -291,7 +291,7 @@ public final class DomainLockUtilsTest { .setRegistrarId("TheRegistrar") .setRepoId(domain.getRepoId()) .isSuperuser(false) - .setRegistrarPocId(POC_ID) + .setRegistryLockEmail(POC_ID) .build()); clock.advanceOneMilli(); RegistryLock resultLock = @@ -477,7 +477,7 @@ public final class DomainLockUtilsTest { .setRepoId("repoId") .setRelockDuration(standardHours(6)) .setRegistrarId("TheRegistrar") - .setRegistrarPocId("someone@example.com") + .setRegistryLockEmail("someone@example.com") .setVerificationCode("hi") .build()); domainLockUtils.enqueueDomainRelock(lock.getRelockDuration().get(), lock.getRevisionId(), 0); @@ -504,7 +504,7 @@ public final class DomainLockUtilsTest { .setDomainName("example.tld") .setRepoId("repoId") .setRegistrarId("TheRegistrar") - .setRegistrarPocId("someone@example.com") + .setRegistryLockEmail("someone@example.com") .setVerificationCode("hi") .build()); IllegalArgumentException thrown = diff --git a/core/src/test/java/google/registry/tools/RegistrarPocCommandTest.java b/core/src/test/java/google/registry/tools/RegistrarPocCommandTest.java index ad8d2b754..01e578c28 100644 --- a/core/src/test/java/google/registry/tools/RegistrarPocCommandTest.java +++ b/core/src/test/java/google/registry/tools/RegistrarPocCommandTest.java @@ -92,7 +92,6 @@ class RegistrarPocCommandTest extends CommandTestCase { "--mode=UPDATE", "--name=Judith Registrar", "--email=judith.doe@example.com", - "--registry_lock_email=judith.doe@external.com", "--phone=+1.2125650000", "--fax=+1.2125650001", "--contact_type=WHOIS", @@ -108,7 +107,6 @@ class RegistrarPocCommandTest extends CommandTestCase { .setRegistrar(registrar) .setName("Judith Registrar") .setEmailAddress("judith.doe@example.com") - .setRegistryLockEmailAddress("judith.doe@external.com") .setPhoneNumber("+1.2125650000") .setFaxNumber("+1.2125650001") .setTypes(ImmutableSet.of(WHOIS)) @@ -255,7 +253,6 @@ class RegistrarPocCommandTest extends CommandTestCase { "--mode=CREATE", "--name=Jim Doe", "--email=jim.doe@example.com", - "--registry_lock_email=jim.doe@external.com", "--contact_type=ADMIN,ABUSE", "--visible_in_whois_as_admin=true", "--visible_in_whois_as_tech=false", @@ -269,7 +266,6 @@ class RegistrarPocCommandTest extends CommandTestCase { .setRegistrar(registrar) .setName("Jim Doe") .setEmailAddress("jim.doe@example.com") - .setRegistryLockEmailAddress("jim.doe@external.com") .setTypes(ImmutableSet.of(ADMIN, ABUSE)) .setVisibleInWhoisAsAdmin(true) .setVisibleInWhoisAsTech(false) @@ -318,87 +314,6 @@ class RegistrarPocCommandTest extends CommandTestCase { assertThat(loadRegistrar("NewRegistrar").getContactsRequireSyncing()).isTrue(); } - @Test - void testCreate_setAllowedToSetRegistryLockPassword() throws Exception { - runCommandForced( - "--mode=CREATE", - "--name=Jim Doe", - "--email=jim.doe@example.com", - "--registry_lock_email=jim.doe.registry.lock@example.com", - "--allowed_to_set_registry_lock_password=true", - "NewRegistrar"); - RegistrarPoc registrarPoc = loadRegistrar("NewRegistrar").getContacts().asList().get(1); - assertThat(registrarPoc.isAllowedToSetRegistryLockPassword()).isTrue(); - registrarPoc.asBuilder().setRegistryLockPassword("foo"); - } - - @Test - void testUpdate_setAllowedToSetRegistryLockPassword() throws Exception { - Registrar registrar = loadRegistrar("NewRegistrar"); - RegistrarPoc registrarPoc = - persistResource( - new RegistrarPoc.Builder() - .setRegistrar(registrar) - .setName("Jim Doe") - .setEmailAddress("jim.doe@example.com") - .build()); - assertThat(registrarPoc.isAllowedToSetRegistryLockPassword()).isFalse(); - - // First, try (and fail) to set the password directly - assertThrows( - IllegalArgumentException.class, - () -> registrarPoc.asBuilder().setRegistryLockPassword("foo")); - - // Next, try (and fail) to allow registry lock without a registry lock email - assertThat( - assertThrows( - IllegalArgumentException.class, - () -> - runCommandForced( - "--mode=UPDATE", - "--email=jim.doe@example.com", - "--allowed_to_set_registry_lock_password=true", - "NewRegistrar"))) - .hasMessageThat() - .isEqualTo("Registry lock email must not be null if allowing registry lock access"); - - // Next, include the email and it should succeed - runCommandForced( - "--mode=UPDATE", - "--email=jim.doe@example.com", - "--registry_lock_email=jim.doe.registry.lock@example.com", - "--allowed_to_set_registry_lock_password=true", - "NewRegistrar"); - RegistrarPoc newContact = reloadResource(registrarPoc); - assertThat(newContact.isAllowedToSetRegistryLockPassword()).isTrue(); - // should be allowed to set the password now - newContact.asBuilder().setRegistryLockPassword("foo"); - } - - @Test - void testUpdate_setAllowedToSetRegistryLockPassword_removesOldPassword() throws Exception { - Registrar registrar = loadRegistrar("NewRegistrar"); - RegistrarPoc registrarPoc = - persistResource( - new RegistrarPoc.Builder() - .setRegistrar(registrar) - .setName("Jim Doe") - .setEmailAddress("jim.doe@example.com") - .setRegistryLockEmailAddress("jim.doe.registry.lock@example.com") - .setAllowedToSetRegistryLockPassword(true) - .setRegistryLockPassword("hi") - .build()); - assertThat(registrarPoc.verifyRegistryLockPassword("hi")).isTrue(); - assertThat(registrarPoc.verifyRegistryLockPassword("hello")).isFalse(); - runCommandForced( - "--mode=UPDATE", - "--email=jim.doe@example.com", - "--allowed_to_set_registry_lock_password=true", - "NewRegistrar"); - registrarPoc = reloadResource(registrarPoc); - assertThat(registrarPoc.verifyRegistryLockPassword("hi")).isFalse(); - } - @Test void testCreate_failure_badEmail() { IllegalArgumentException thrown = diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java index 4ff52cc28..f6a75b746 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java @@ -75,7 +75,8 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { Note: this code will expire in one hour. https://registrarconsole.tld/console/#/registry-lock-verify?lockVerificationCode=\ - 123456789ABCDEFGHJKLMNPQRSTUVWXY"""; + 123456789ABCDEFGHJKLMNPQRSTUVWXY\ + """; @Mock GmailClient gmailClient; private ConsoleRegistryLockAction action; @@ -112,8 +113,8 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { assertThat(response.getStatus()).isEqualTo(SC_OK); assertThat(response.getPayload()) .isEqualTo( - """ -[{"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +""" +[{"domainName":"example.test","registryLockEmail":"johndoe@theregistrar.com","lockRequestTime":\ {"creationTime":"2024-04-15T00:00:00.000Z"},"unlockRequestTime":"null","lockCompletionTime":\ "2024-04-15T00:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false}]\ """); @@ -127,7 +128,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setDomainName("expired.test") .setRegistrarId("TheRegistrar") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUVWXY") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .build(); saveRegistryLock(expiredLock); RegistryLock expiredUnlock = @@ -136,7 +137,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setDomainName("expiredunlock.test") .setRegistrarId("TheRegistrar") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUVWXY") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setLockCompletionTime(clock.nowUtc()) .setUnlockRequestTime(clock.nowUtc()) .build(); @@ -149,7 +150,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setDomainName("example.test") .setRegistrarId("TheRegistrar") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUVWXY") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setLockCompletionTime(clock.nowUtc()) .build(); clock.advanceOneMilli(); @@ -168,7 +169,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setDomainName("pending.test") .setRegistrarId("TheRegistrar") .setVerificationCode("111111111ABCDEFGHJKLMNPQRSTUVWXY") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .build(); RegistryLock incompleteUnlock = @@ -177,7 +178,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setDomainName("incompleteunlock.test") .setRegistrarId("TheRegistrar") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUVWXY") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setLockCompletionTime(clock.nowUtc()) .setUnlockRequestTime(clock.nowUtc()) .build(); @@ -187,7 +188,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setRepoId("repoId") .setDomainName("unlocked.test") .setRegistrarId("TheRegistrar") - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUUUUU") .setLockCompletionTime(clock.nowUtc()) .setUnlockRequestTime(clock.nowUtc()) @@ -206,26 +207,27 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { // locks or completed unlocks assertThat(response.getPayload()) .isEqualTo( - """ +""" [{"domainName":"adminexample.test","lockRequestTime":{"creationTime":"2024-04-16T00:00:00.001Z"},\ "unlockRequestTime":"null","lockCompletionTime":"2024-04-16T00:00:00.001Z","unlockCompletionTime":\ "null","isSuperuser":true},\ \ -{"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"domainName":"example.test","registryLockEmail":"johndoe@theregistrar.com","lockRequestTime":\ {"creationTime":"2024-04-16T00:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":\ "2024-04-16T00:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ \ -{"domainName":"expiredunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"domainName":"expiredunlock.test","registryLockEmail":"johndoe@theregistrar.com","lockRequestTime":\ {"creationTime":"2024-04-15T00:00:00.000Z"},"unlockRequestTime":"2024-04-15T00:00:00.000Z",\ "lockCompletionTime":"2024-04-15T00:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ \ -{"domainName":"incompleteunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"domainName":"incompleteunlock.test","registryLockEmail":"johndoe@theregistrar.com","lockRequestTime":\ {"creationTime":"2024-04-16T00:00:00.001Z"},"unlockRequestTime":"2024-04-16T00:00:00.001Z",\ "lockCompletionTime":"2024-04-16T00:00:00.001Z","unlockCompletionTime":"null","isSuperuser":false},\ \ -{"domainName":"pending.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"domainName":"pending.test","registryLockEmail":"johndoe@theregistrar.com","lockRequestTime":\ {"creationTime":"2024-04-16T00:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":"null",\ -"unlockCompletionTime":"null","isSuperuser":false}]"""); +"unlockCompletionTime":"null","isSuperuser":false}]\ +"""); } @Test @@ -500,7 +502,7 @@ public class ConsoleRegistryLockActionTest extends ConsoleActionBaseTestCase { .setRepoId(defaultDomain.getRepoId()) .setDomainName(defaultDomain.getDomainName()) .setRegistrarId(defaultDomain.getCurrentSponsorRegistrarId()) - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setVerificationCode("123456789ABCDEFGHJKLMNPQRSTUUUUU"); } diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java index e5a69bafa..afb3bfa68 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java @@ -187,7 +187,7 @@ public class ConsoleRegistryLockVerifyActionTest extends ConsoleActionBaseTestCa .setRepoId(defaultDomain.getRepoId()) .setDomainName(defaultDomain.getDomainName()) .setRegistrarId(defaultDomain.getCurrentSponsorRegistrarId()) - .setRegistrarPocId("johndoe@theregistrar.com") + .setRegistryLockEmail("johndoe@theregistrar.com") .setVerificationCode(DEFAULT_CODE); } diff --git a/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java b/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java index feb615c7f..c1b19c7ad 100644 --- a/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java @@ -284,39 +284,27 @@ class ContactActionTest extends ConsoleActionBaseTestCase { "Registrar New Registrar (registrarId) updated in registry unittest" + " environment") .setBody( - "The following changes were made in registry unittest environment to the" - + " registrar registrarId by admin fte@email.tld:\n" - + "\n" - + "contacts:\n" - + " ADDED:\n" - + " {id=" - + id - + ", name=Test Registrar 2," - + " emailAddress=incorrect@example.com, registrarId=registrarId," - + " registryLockEmailAddress=null, phoneNumber=+1.1234567890," - + " faxNumber=+1.1234567891, types=[TECH]," - + " visibleInWhoisAsAdmin=false, visibleInWhoisAsTech=true," - + " visibleInDomainWhoisAsAbuse=false," - + " allowedToSetRegistryLockPassword=false}\n" - + " REMOVED:\n" - + " {id=" - + id - + ", name=Test Registrar 2, emailAddress=test.registrar2@example.com," - + " registrarId=registrarId, registryLockEmailAddress=null," - + " phoneNumber=+1.1234567890, faxNumber=+1.1234567891, types=[TECH]," - + " visibleInWhoisAsAdmin=false," - + " visibleInWhoisAsTech=true, visibleInDomainWhoisAsAbuse=false," - + " allowedToSetRegistryLockPassword=false}\n" - + " FINAL CONTENTS:\n" - + " {id=" - + id - + ", name=Test Registrar 2," - + " emailAddress=incorrect@example.com, registrarId=registrarId," - + " registryLockEmailAddress=null, phoneNumber=+1.1234567890," - + " faxNumber=+1.1234567891, types=[TECH]," - + " visibleInWhoisAsAdmin=false, visibleInWhoisAsTech=true," - + " visibleInDomainWhoisAsAbuse=false," - + " allowedToSetRegistryLockPassword=false}\n") +""" +The following changes were made in registry unittest environment to the registrar registrarId \ +by admin fte@email.tld: + +contacts: + ADDED: + {id=5, name=Test Registrar 2, emailAddress=incorrect@example.com, registrarId=registrarId, \ +phoneNumber=+1.1234567890, faxNumber=+1.1234567891, types=[TECH], visibleInWhoisAsAdmin=false, \ +visibleInWhoisAsTech=true, visibleInDomainWhoisAsAbuse=false, \ +allowedToSetRegistryLockPassword=false} + REMOVED: + {id=5, name=Test Registrar 2, emailAddress=test.registrar2@example.com, \ +registrarId=registrarId, phoneNumber=+1.1234567890, faxNumber=+1.1234567891, types=[TECH], \ +visibleInWhoisAsAdmin=false, visibleInWhoisAsTech=true, visibleInDomainWhoisAsAbuse=false, \ +allowedToSetRegistryLockPassword=false} + FINAL CONTENTS: + {id=5, name=Test Registrar 2, emailAddress=incorrect@example.com, registrarId=registrarId, \ +phoneNumber=+1.1234567890, faxNumber=+1.1234567891, types=[TECH], visibleInWhoisAsAdmin=false, \ +visibleInWhoisAsTech=true, visibleInDomainWhoisAsAbuse=false, \ +allowedToSetRegistryLockPassword=false} +""") .setRecipients(ImmutableList.of(new InternetAddress("notification@test.example"))) .build()); } diff --git a/db/src/main/resources/sql/er_diagram/brief_er_diagram.html b/db/src/main/resources/sql/er_diagram/brief_er_diagram.html index 413aa9288..16ebcbcf2 100644 --- a/db/src/main/resources/sql/er_diagram/brief_er_diagram.html +++ b/db/src/main/resources/sql/er_diagram/brief_er_diagram.html @@ -257,15 +257,15 @@ td.section { generated by - SchemaCrawler 16.25.2 + SchemaCrawler 16.27.1 generated on - 2025-08-18 18:05:23 + 2025-09-05 16:11:29 last flyway file - V196__tld_expiry_access_period_enabled.sql + V197__poc_rlock_drop_not_null.sql @@ -273,2021 +273,481 @@ td.section {

 

- - SchemaCrawler_Diagram - - - generated by - SchemaCrawler 16.25.2 - generated on - 2025-08-18 18:05:23 - + SchemaCrawler_Diagram generated by SchemaCrawler 16.27.1 generated on 2025-09-05 16:11:29 - - allocationtoken_a08ccbef - - - public."AllocationToken" - - [table] - token - - text not null - domain_name - - text - redemption_domain_repo_id - - text - token_type - - text - - + allocationtoken_a08ccbef public."AllocationToken" [table] token text not null domain_name text redemption_domain_repo_id text token_type text + + - - billingevent_a57d1815 - - - public."BillingEvent" - - [table] - billing_event_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - allocation_token - - text - billing_time - - timestamptz - cancellation_matching_billing_recurrence_id - - int8 - synthetic_creation_time - - timestamptz - recurrence_history_revision_id - - int8 - - + billingevent_a57d1815 public."BillingEvent" [table] billing_event_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null allocation_token text billing_time timestamptz cancellation_matching_billing_recurrence_id int8 synthetic_creation_time timestamptz recurrence_history_revision_id int8 + + - - billingevent_a57d1815:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_billing_event_allocation_token - + billingevent_a57d1815:w->allocationtoken_a08ccbef:e fk_billing_event_allocation_token + + - - billingrecurrence_5fa2cb01 - - - public."BillingRecurrence" - - [table] - billing_recurrence_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - recurrence_end_time - - timestamptz - recurrence_time_of_year - - text - recurrence_last_expansion - - timestamptz not null - - + billingrecurrence_5fa2cb01 public."BillingRecurrence" [table] billing_recurrence_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null recurrence_end_time timestamptz recurrence_time_of_year text recurrence_last_expansion timestamptz not null + + - - billingevent_a57d1815:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_billing_event_cancellation_matching_billing_recurrence_id - + billingevent_a57d1815:w->billingrecurrence_5fa2cb01:e fk_billing_event_cancellation_matching_billing_recurrence_id + + - - registrar_6e1503e3 - - - public."Registrar" - - [table] - registrar_id - - text not null - iana_identifier - - int8 - registrar_name - - text not null - - + registrar_6e1503e3 public."Registrar" [table] registrar_id text not null iana_identifier int8 registrar_name text not null + + - - billingevent_a57d1815:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_event_registrar_id - + billingevent_a57d1815:w->registrar_6e1503e3:e fk_billing_event_registrar_id + + - - domain_6c51cffa - - - public."Domain" - - [table] - repo_id - - text not null - creation_registrar_id - - text not null - creation_time - - timestamptz not null - current_sponsor_registrar_id - - text not null - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - domain_name - - text - tld - - text - admin_contact - - text - billing_contact - - text - registrant_contact - - text - tech_contact - - text - transfer_billing_cancellation_id - - int8 - transfer_billing_event_id - - int8 - transfer_billing_recurrence_id - - int8 - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - billing_recurrence_id - - int8 - autorenew_end_time - - timestamptz - current_package_token - - text - lordn_phase - - text not null - - + domain_6c51cffa public."Domain" [table] repo_id text not null creation_registrar_id text not null creation_time timestamptz not null current_sponsor_registrar_id text not null deletion_time timestamptz last_epp_update_registrar_id text domain_name text tld text admin_contact text billing_contact text registrant_contact text tech_contact text transfer_billing_cancellation_id int8 transfer_billing_event_id int8 transfer_billing_recurrence_id int8 transfer_gaining_registrar_id text transfer_losing_registrar_id text billing_recurrence_id int8 autorenew_end_time timestamptz current_package_token text lordn_phase text not null + + - - domain_6c51cffa:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_domain_current_package_token - + domain_6c51cffa:w->allocationtoken_a08ccbef:e fk_domain_current_package_token + + - - domain_6c51cffa:w->billingevent_a57d1815:e - - - - - - - - - fk_domain_transfer_billing_event_id - + domain_6c51cffa:w->billingevent_a57d1815:e fk_domain_transfer_billing_event_id + + - - billingcancellation_6eedf614 - - - public."BillingCancellation" - - [table] - billing_cancellation_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - billing_time - - timestamptz - billing_event_id - - int8 - billing_recurrence_id - - int8 - - + billingcancellation_6eedf614 public."BillingCancellation" [table] billing_cancellation_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null billing_time timestamptz billing_event_id int8 billing_recurrence_id int8 + + - - domain_6c51cffa:w->billingcancellation_6eedf614:e - - - - - - - - - fk_domain_transfer_billing_cancellation_id - + domain_6c51cffa:w->billingcancellation_6eedf614:e fk_domain_transfer_billing_cancellation_id + + - - domain_6c51cffa:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_domain_billing_recurrence_id - + domain_6c51cffa:w->billingrecurrence_5fa2cb01:e fk_domain_billing_recurrence_id + + - - domain_6c51cffa:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_domain_transfer_billing_recurrence_id - + domain_6c51cffa:w->billingrecurrence_5fa2cb01:e fk_domain_transfer_billing_recurrence_id + + - - contact_8de8cb16 - - - public."Contact" - - [table] - repo_id - - text not null - creation_registrar_id - - text not null - creation_time - - timestamptz not null - current_sponsor_registrar_id - - text not null - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - contact_id - - text - search_name - - text - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - - + contact_8de8cb16 public."Contact" [table] repo_id text not null creation_registrar_id text not null creation_time timestamptz not null current_sponsor_registrar_id text not null deletion_time timestamptz last_epp_update_registrar_id text contact_id text search_name text transfer_gaining_registrar_id text transfer_losing_registrar_id text + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_admin_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_admin_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_billing_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_billing_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_registrant_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_registrant_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_tech_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_tech_contact + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk2jc69qyg2tv9hhnmif6oa1cx1 - + domain_6c51cffa:w->registrar_6e1503e3:e fk2jc69qyg2tv9hhnmif6oa1cx1 + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk2u3srsfbei272093m3b3xwj23 - + domain_6c51cffa:w->registrar_6e1503e3:e fk2u3srsfbei272093m3b3xwj23 + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fkjc0r9r5y1lfbt4gpbqw4wsuvq - + domain_6c51cffa:w->registrar_6e1503e3:e fkjc0r9r5y1lfbt4gpbqw4wsuvq + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_transfer_gaining_registrar_id - + domain_6c51cffa:w->registrar_6e1503e3:e fk_domain_transfer_gaining_registrar_id + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_transfer_losing_registrar_id - + domain_6c51cffa:w->registrar_6e1503e3:e fk_domain_transfer_losing_registrar_id + + - - tld_f1fa57e2 - - - public."Tld" - - [table] - tld_name - - text not null - - + tld_f1fa57e2 public."Tld" [table] tld_name text not null + + - - domain_6c51cffa:w->tld_f1fa57e2:e - - - - - - - - - fk_domain_tld - + domain_6c51cffa:w->tld_f1fa57e2:e fk_domain_tld + + - - domainhistory_a54cc226 - - - public."DomainHistory" - - [table] - history_revision_id - - int8 not null - history_registrar_id - - text - history_modification_time - - timestamptz not null - history_type - - text not null - creation_time - - timestamptz - domain_repo_id - - text not null - current_package_token - - text - - + domainhistory_a54cc226 public."DomainHistory" [table] history_revision_id int8 not null history_registrar_id text history_modification_time timestamptz not null history_type text not null creation_time timestamptz domain_repo_id text not null current_package_token text + + - - domainhistory_a54cc226:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_domain_history_current_package_token - + domainhistory_a54cc226:w->allocationtoken_a08ccbef:e fk_domain_history_current_package_token + + - - domainhistory_a54cc226:w->domain_6c51cffa:e - - - - - - - - - fk_domain_history_domain_repo_id - + domainhistory_a54cc226:w->domain_6c51cffa:e fk_domain_history_domain_repo_id + + - - domainhistory_a54cc226:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_history_registrar_id - + domainhistory_a54cc226:w->registrar_6e1503e3:e fk_domain_history_registrar_id + + - - billingcancellation_6eedf614:w->billingevent_a57d1815:e - - - - - - - - - fk_billing_cancellation_billing_event_id - + billingcancellation_6eedf614:w->billingevent_a57d1815:e fk_billing_cancellation_billing_event_id + + - - billingcancellation_6eedf614:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_billing_cancellation_billing_recurrence_id - + billingcancellation_6eedf614:w->billingrecurrence_5fa2cb01:e fk_billing_cancellation_billing_recurrence_id + + - - billingcancellation_6eedf614:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_cancellation_registrar_id - + billingcancellation_6eedf614:w->registrar_6e1503e3:e fk_billing_cancellation_registrar_id + + - - graceperiod_cd3b2e8f - - - public."GracePeriod" - - [table] - grace_period_id - - int8 not null - billing_event_id - - int8 - billing_recurrence_id - - int8 - registrar_id - - text not null - domain_repo_id - - text not null - - + graceperiod_cd3b2e8f public."GracePeriod" [table] grace_period_id int8 not null billing_event_id int8 billing_recurrence_id int8 registrar_id text not null domain_repo_id text not null + + - - graceperiod_cd3b2e8f:w->billingevent_a57d1815:e - - - - - - - - - fk_grace_period_billing_event_id - + graceperiod_cd3b2e8f:w->billingevent_a57d1815:e fk_grace_period_billing_event_id + + - - graceperiod_cd3b2e8f:w->domain_6c51cffa:e - - - - - - - - - fk_grace_period_domain_repo_id - + graceperiod_cd3b2e8f:w->domain_6c51cffa:e fk_grace_period_domain_repo_id + + - - graceperiod_cd3b2e8f:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_grace_period_billing_recurrence_id - + graceperiod_cd3b2e8f:w->billingrecurrence_5fa2cb01:e fk_grace_period_billing_recurrence_id + + - - graceperiod_cd3b2e8f:w->registrar_6e1503e3:e - - - - - - - - - fk_grace_period_registrar_id - + graceperiod_cd3b2e8f:w->registrar_6e1503e3:e fk_grace_period_registrar_id + + - - billingrecurrence_5fa2cb01:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_recurrence_registrar_id - + billingrecurrence_5fa2cb01:w->registrar_6e1503e3:e fk_billing_recurrence_registrar_id + + - - bsadomainrefresh_c8f4c45d - - - public."BsaDomainRefresh" - - [table] - job_id - - bigserial not null - - auto-incremented - - + bsadomainrefresh_c8f4c45d public."BsaDomainRefresh" [table] job_id bigserial not null auto-incremented + + - - bsadownload_98d031ce - - - public."BsaDownload" - - [table] - job_id - - bigserial not null - - auto-incremented - creation_time - - timestamptz not null - - + bsadownload_98d031ce public."BsaDownload" [table] job_id bigserial not null auto-incremented creation_time timestamptz not null + + - - bsalabel_2755e1da - - - public."BsaLabel" - - [table] - label - - text not null - - + bsalabel_2755e1da public."BsaLabel" [table] label text not null + + - - bsaunblockabledomain_b739a38 - - - public."BsaUnblockableDomain" - - [table] - label - - text not null - tld - - text not null - - + bsaunblockabledomain_b739a38 public."BsaUnblockableDomain" [table] label text not null tld text not null + + - - bsaunblockabledomain_b739a38:w->bsalabel_2755e1da:e - - - - - - - - - fkbsaunblockabledomainlabel - + bsaunblockabledomain_b739a38:w->bsalabel_2755e1da:e fkbsaunblockabledomainlabel + + - - claimsentry_105da9f1 - - - public."ClaimsEntry" - - [table] - revision_id - - int8 not null - domain_label - - text not null - - + claimsentry_105da9f1 public."ClaimsEntry" [table] revision_id int8 not null domain_label text not null + + - - claimslist_3d49bc2b - - - public."ClaimsList" - - [table] - revision_id - - bigserial not null - - auto-incremented - - + claimslist_3d49bc2b public."ClaimsList" [table] revision_id bigserial not null auto-incremented + + - - claimsentry_105da9f1:w->claimslist_3d49bc2b:e - - - - - - - - - fk6sc6at5hedffc0nhdcab6ivuq - + claimsentry_105da9f1:w->claimslist_3d49bc2b:e fk6sc6at5hedffc0nhdcab6ivuq + + - - consoleeppactionhistory_bcc2a2c6 - - - public."ConsoleEppActionHistory" - - [table] - history_revision_id - - int8 not null - repo_id - - text not null - revision_id - - int8 not null - history_acting_user - - text not null - - + consoleeppactionhistory_bcc2a2c6 public."ConsoleEppActionHistory" [table] history_revision_id int8 not null repo_id text not null revision_id int8 not null history_acting_user text not null + + - - consoleupdatehistory_5237b2aa - - - public."ConsoleUpdateHistory" - - [table] - revision_id - - int8 not null - modification_time - - timestamptz not null - type - - text not null - acting_user - - text not null - - + consoleupdatehistory_5237b2aa public."ConsoleUpdateHistory" [table] revision_id int8 not null modification_time timestamptz not null type text not null acting_user text not null + + - - user_f2216f01 - - - public."User" - - [table] - email_address - - text not null - - + user_f2216f01 public."User" [table] email_address text not null + + - - consoleupdatehistory_5237b2aa:w->user_f2216f01:e - - - - - - - - - fk_console_update_history_acting_user - + consoleupdatehistory_5237b2aa:w->user_f2216f01:e fk_console_update_history_acting_user + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk1sfyj7o7954prbn1exk7lpnoe - + contact_8de8cb16:w->registrar_6e1503e3:e fk1sfyj7o7954prbn1exk7lpnoe + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk93c185fx7chn68uv7nl6uv2s0 - + contact_8de8cb16:w->registrar_6e1503e3:e fk93c185fx7chn68uv7nl6uv2s0 + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fkmb7tdiv85863134w1wogtxrb2 - + contact_8de8cb16:w->registrar_6e1503e3:e fkmb7tdiv85863134w1wogtxrb2 + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_transfer_gaining_registrar_id - + contact_8de8cb16:w->registrar_6e1503e3:e fk_contact_transfer_gaining_registrar_id + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_transfer_losing_registrar_id - + contact_8de8cb16:w->registrar_6e1503e3:e fk_contact_transfer_losing_registrar_id + + - - contacthistory_d2964f8a - - - public."ContactHistory" - - [table] - history_revision_id - - int8 not null - history_registrar_id - - text - history_modification_time - - timestamptz not null - history_type - - text not null - creation_time - - timestamptz - contact_repo_id - - text not null - - + contacthistory_d2964f8a public."ContactHistory" [table] history_revision_id int8 not null history_registrar_id text history_modification_time timestamptz not null history_type text not null creation_time timestamptz contact_repo_id text not null + + - - contacthistory_d2964f8a:w->contact_8de8cb16:e - - - - - - - - - fk_contact_history_contact_repo_id - + contacthistory_d2964f8a:w->contact_8de8cb16:e fk_contact_history_contact_repo_id + + - - contacthistory_d2964f8a:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_history_registrar_id - + contacthistory_d2964f8a:w->registrar_6e1503e3:e fk_contact_history_registrar_id + + - - pollmessage_614a523e - - - public."PollMessage" - - [table] - poll_message_id - - int8 not null - registrar_id - - text not null - contact_repo_id - - text - contact_history_revision_id - - int8 - domain_repo_id - - text - domain_history_revision_id - - int8 - event_time - - timestamptz not null - host_repo_id - - text - host_history_revision_id - - int8 - transfer_response_gaining_registrar_id - - text - transfer_response_losing_registrar_id - - text - - + pollmessage_614a523e public."PollMessage" [table] poll_message_id int8 not null registrar_id text not null contact_repo_id text contact_history_revision_id int8 domain_repo_id text domain_history_revision_id int8 event_time timestamptz not null host_repo_id text host_history_revision_id int8 transfer_response_gaining_registrar_id text transfer_response_losing_registrar_id text + + - - pollmessage_614a523e:w->domain_6c51cffa:e - - - - - - - - - fk_poll_message_domain_repo_id - + pollmessage_614a523e:w->domain_6c51cffa:e fk_poll_message_domain_repo_id + + - - pollmessage_614a523e:w->contact_8de8cb16:e - - - - - - - - - fk_poll_message_contact_repo_id - + pollmessage_614a523e:w->contact_8de8cb16:e fk_poll_message_contact_repo_id + + - - pollmessage_614a523e:w->contacthistory_d2964f8a:e - - - - - - - - - fk_poll_message_contact_history - + pollmessage_614a523e:w->contacthistory_d2964f8a:e fk_poll_message_contact_history + + - - pollmessage_614a523e:w->contacthistory_d2964f8a:e - - - - - - - - - fk_poll_message_contact_history - + pollmessage_614a523e:w->contacthistory_d2964f8a:e fk_poll_message_contact_history + + - - host_f21b78de - - - public."Host" - - [table] - repo_id - - text not null - creation_registrar_id - - text - creation_time - - timestamptz - current_sponsor_registrar_id - - text - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - host_name - - text - superordinate_domain - - text - inet_addresses - - _text - - + host_f21b78de public."Host" [table] repo_id text not null creation_registrar_id text creation_time timestamptz current_sponsor_registrar_id text deletion_time timestamptz last_epp_update_registrar_id text host_name text superordinate_domain text inet_addresses _text + + - - pollmessage_614a523e:w->host_f21b78de:e - - - - - - - - - fk_poll_message_host_repo_id - + pollmessage_614a523e:w->host_f21b78de:e fk_poll_message_host_repo_id + + - - hosthistory_56210c2 - - - public."HostHistory" - - [table] - history_revision_id - - int8 not null - history_registrar_id - - text not null - history_modification_time - - timestamptz not null - history_type - - text not null - host_name - - text - creation_time - - timestamptz - host_repo_id - - text not null - - + hosthistory_56210c2 public."HostHistory" [table] history_revision_id int8 not null history_registrar_id text not null history_modification_time timestamptz not null history_type text not null host_name text creation_time timestamptz host_repo_id text not null + + - - pollmessage_614a523e:w->hosthistory_56210c2:e - - - - - - - - - fk_poll_message_host_history - + pollmessage_614a523e:w->hosthistory_56210c2:e fk_poll_message_host_history + + - - pollmessage_614a523e:w->hosthistory_56210c2:e - - - - - - - - - fk_poll_message_host_history - + pollmessage_614a523e:w->hosthistory_56210c2:e fk_poll_message_host_history + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_registrar_id + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_transfer_response_gaining_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_transfer_response_gaining_registrar_id + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_transfer_response_losing_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_transfer_response_losing_registrar_id + + - - cursor_6af40e8c - - - public."Cursor" - - [table] - "scope" - - text not null - type - - text not null - - + cursor_6af40e8c public."Cursor" [table] "scope" text not null type text not null + + - - delegationsignerdata_e542a872 - - - public."DelegationSignerData" - - [table] - domain_repo_id - - text not null - key_tag - - int4 not null - algorithm - - int4 not null - digest - - bytea not null - digest_type - - int4 not null - - + delegationsignerdata_e542a872 public."DelegationSignerData" [table] domain_repo_id text not null key_tag int4 not null algorithm int4 not null digest bytea not null digest_type int4 not null + + - - delegationsignerdata_e542a872:w->domain_6c51cffa:e - - - - - - - - - fktr24j9v14ph2mfuw2gsmt12kq - + delegationsignerdata_e542a872:w->domain_6c51cffa:e fktr24j9v14ph2mfuw2gsmt12kq + + - - dnsrefreshrequest_4e6affb3 - - - public."DnsRefreshRequest" - - [table] - id - - bigserial not null - - auto-incremented - request_time - - timestamptz not null - last_process_time - - timestamptz not null - - + dnsrefreshrequest_4e6affb3 public."DnsRefreshRequest" [table] id bigserial not null auto-incremented request_time timestamptz not null last_process_time timestamptz not null + + - - domainhost_1ea127c2 - - - public."DomainHost" - - [table] - domain_repo_id - - text not null - host_repo_id - - text - - + domainhost_1ea127c2 public."DomainHost" [table] domain_repo_id text not null host_repo_id text + + - - domainhost_1ea127c2:w->domain_6c51cffa:e - - - - - - - - - fkfmi7bdink53swivs390m2btxg - + domainhost_1ea127c2:w->domain_6c51cffa:e fkfmi7bdink53swivs390m2btxg + + - - domainhost_1ea127c2:w->host_f21b78de:e - - - - - - - - - fk_domainhost_host_valid - + domainhost_1ea127c2:w->host_f21b78de:e fk_domainhost_host_valid + + - - host_f21b78de:w->domain_6c51cffa:e - - - - - - - - - fk_host_superordinate_domain - + host_f21b78de:w->domain_6c51cffa:e fk_host_superordinate_domain + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_creation_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_creation_registrar_id + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_current_sponsor_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_current_sponsor_registrar_id + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_last_epp_update_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_last_epp_update_registrar_id + + - - domaindsdatahistory_995b060d - - - public."DomainDsDataHistory" - - [table] - ds_data_history_revision_id - - int8 not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text - - + domaindsdatahistory_995b060d public."DomainDsDataHistory" [table] ds_data_history_revision_id int8 not null domain_history_revision_id int8 not null domain_repo_id text + + - - domainhistoryhost_9f3f23ee - - - public."DomainHistoryHost" - - [table] - domain_history_history_revision_id - - int8 not null - host_repo_id - - text - domain_history_domain_repo_id - - text not null - - + domainhistoryhost_9f3f23ee public."DomainHistoryHost" [table] domain_history_history_revision_id int8 not null host_repo_id text domain_history_domain_repo_id text not null + + - - domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e - - - - - - - - - fka9woh3hu8gx5x0vly6bai327n - + domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e fka9woh3hu8gx5x0vly6bai327n + + - - domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e - - - - - - - - - fka9woh3hu8gx5x0vly6bai327n - + domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e fka9woh3hu8gx5x0vly6bai327n + + - - domaintransactionrecord_6e77ff61 - - - public."DomainTransactionRecord" - - [table] - id - - bigserial not null - - auto-incremented - tld - - text not null - domain_repo_id - - text - history_revision_id - - int8 - - + domaintransactionrecord_6e77ff61 public."DomainTransactionRecord" [table] id bigserial not null auto-incremented tld text not null domain_repo_id text history_revision_id int8 + + - - domaintransactionrecord_6e77ff61:w->tld_f1fa57e2:e - - - - - - - - - fk_domain_transaction_record_tld - + domaintransactionrecord_6e77ff61:w->tld_f1fa57e2:e fk_domain_transaction_record_tld + + - - featureflag_3ee43a78 - - - public."FeatureFlag" - - [table] - feature_name - - text not null - - + featureflag_3ee43a78 public."FeatureFlag" [table] feature_name text not null + + - - graceperiodhistory_40ccc1f1 - - - public."GracePeriodHistory" - - [table] - grace_period_history_revision_id - - int8 not null - domain_repo_id - - text not null - domain_history_revision_id - - int8 - - + graceperiodhistory_40ccc1f1 public."GracePeriodHistory" [table] grace_period_history_revision_id int8 not null domain_repo_id text not null domain_history_revision_id int8 + + - - hosthistory_56210c2:w->host_f21b78de:e - - - - - - - - - fk_hosthistory_host - + hosthistory_56210c2:w->host_f21b78de:e fk_hosthistory_host + + - - hosthistory_56210c2:w->registrar_6e1503e3:e - - - - - - - - - fk_history_registrar_id - + hosthistory_56210c2:w->registrar_6e1503e3:e fk_history_registrar_id + + - - lock_f21d4861 - - - public."Lock" - - [table] - resource_name - - text not null - "scope" - - text not null - - + lock_f21d4861 public."Lock" [table] resource_name text not null "scope" text not null + + - - packagepromotion_56aa33 - - - public."PackagePromotion" - - [table] - package_promotion_id - - bigserial not null - - auto-incremented - token - - text not null - - + packagepromotion_56aa33 public."PackagePromotion" [table] package_promotion_id bigserial not null auto-incremented token text not null + + - - passwordresetrequest_8484e7b1 - - - public."PasswordResetRequest" - - [table] - verification_code - - text not null - - + passwordresetrequest_8484e7b1 public."PasswordResetRequest" [table] verification_code text not null + + - - premiumentry_b0060b91 - - - public."PremiumEntry" - - [table] - revision_id - - int8 not null - domain_label - - text not null - - + premiumentry_b0060b91 public."PremiumEntry" [table] revision_id int8 not null domain_label text not null + + - - premiumlist_7c3ea68b - - - public."PremiumList" - - [table] - revision_id - - bigserial not null - - auto-incremented - name - - text not null - - + premiumlist_7c3ea68b public."PremiumList" [table] revision_id bigserial not null auto-incremented name text not null + + - - premiumentry_b0060b91:w->premiumlist_7c3ea68b:e - - - - - - - - - fko0gw90lpo1tuee56l0nb6y6g5 - + premiumentry_b0060b91:w->premiumlist_7c3ea68b:e fko0gw90lpo1tuee56l0nb6y6g5 + + - - rderevision_83396864 - - - public."RdeRevision" - - [table] - tld - - text not null - mode - - text not null - "date" - - date not null - - + rderevision_83396864 public."RdeRevision" [table] tld text not null mode text not null "date" date not null + + - - registrarpoc_ab47054d - - - public."RegistrarPoc" - - [table] - email_address - - text not null - registrar_id - - text not null - - + registrarpoc_ab47054d public."RegistrarPoc" [table] email_address text not null registrar_id text not null + + - - registrarpoc_ab47054d:w->registrar_6e1503e3:e - - - - - - - - - fk_registrar_poc_registrar_id - + registrarpoc_ab47054d:w->registrar_6e1503e3:e fk_registrar_poc_registrar_id + + - - registrarupdatehistory_8a38bed4 - - - public."RegistrarUpdateHistory" - - [table] - history_revision_id - - int8 not null - registrar_id - - text not null - history_acting_user - - text not null - - + registrarupdatehistory_8a38bed4 public."RegistrarUpdateHistory" [table] history_revision_id int8 not null registrar_id text not null history_acting_user text not null + + - - registrarupdatehistory_8a38bed4:w->registrar_6e1503e3:e - - - - - - - - - fkregistrarupdatehistoryregistrarid - + registrarupdatehistory_8a38bed4:w->registrar_6e1503e3:e fkregistrarupdatehistoryregistrarid + + - - registrarpocupdatehistory_31e5d9aa - - - public."RegistrarPocUpdateHistory" - - [table] - history_revision_id - - int8 not null - email_address - - text not null - registrar_id - - text not null - history_acting_user - - text not null - - + registrarpocupdatehistory_31e5d9aa public."RegistrarPocUpdateHistory" [table] history_revision_id int8 not null email_address text not null registrar_id text not null history_acting_user text not null + + - - registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e - - - - - - - - - fkregistrarpocupdatehistoryemailaddress - + registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e fkregistrarpocupdatehistoryemailaddress + + - - registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e - - - - - - - - - fkregistrarpocupdatehistoryemailaddress - + registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e fkregistrarpocupdatehistoryemailaddress + + - - registrylock_ac88663e - - - public."RegistryLock" - - [table] - revision_id - - bigserial not null - - auto-incremented - registrar_id - - text not null - repo_id - - text not null - verification_code - - text not null - relock_revision_id - - int8 - - + registrylock_ac88663e public."RegistryLock" [table] revision_id bigserial not null auto-incremented registrar_id text not null repo_id text not null verification_code text not null relock_revision_id int8 + + - - registrylock_ac88663e:w->registrylock_ac88663e:e - - - - - - - - - fk2lhcwpxlnqijr96irylrh1707 - + registrylock_ac88663e:w->registrylock_ac88663e:e fk2lhcwpxlnqijr96irylrh1707 + + - - reservedentry_1a7b8520 - - - public."ReservedEntry" - - [table] - revision_id - - int8 not null - domain_label - - text not null - - + reservedentry_1a7b8520 public."ReservedEntry" [table] revision_id int8 not null domain_label text not null + + - - reservedlist_b97c3f1c - - - public."ReservedList" - - [table] - revision_id - - bigserial not null - - auto-incremented - name - - text not null - - + reservedlist_b97c3f1c public."ReservedList" [table] revision_id bigserial not null auto-incremented name text not null + + - - reservedentry_1a7b8520:w->reservedlist_b97c3f1c:e - - - - - - - - - fkgq03rk0bt1hb915dnyvd3vnfc - + reservedentry_1a7b8520:w->reservedlist_b97c3f1c:e fkgq03rk0bt1hb915dnyvd3vnfc + + - - serversecret_6cc90f09 - - - public."ServerSecret" - - [table] - id - - int8 not null - - + serversecret_6cc90f09 public."ServerSecret" [table] id int8 not null + + - - signedmarkrevocationentry_99c39721 - - - public."SignedMarkRevocationEntry" - - [table] - revision_id - - int8 not null - smd_id - - text not null - - + signedmarkrevocationentry_99c39721 public."SignedMarkRevocationEntry" [table] revision_id int8 not null smd_id text not null + + - - signedmarkrevocationlist_c5d968fb - - - public."SignedMarkRevocationList" - - [table] - revision_id - - bigserial not null - - auto-incremented - - + signedmarkrevocationlist_c5d968fb public."SignedMarkRevocationList" [table] revision_id bigserial not null auto-incremented + + - - signedmarkrevocationentry_99c39721:w->signedmarkrevocationlist_c5d968fb:e - - - - - - - - - fk5ivlhvs3121yx2li5tqh54u4 - + signedmarkrevocationentry_99c39721:w->signedmarkrevocationlist_c5d968fb:e fk5ivlhvs3121yx2li5tqh54u4 + + - - spec11threatmatch_a61228a6 - - - public."Spec11ThreatMatch" - - [table] - id - - bigserial not null - - auto-incremented - check_date - - date not null - registrar_id - - text not null - tld - - text not null - - + spec11threatmatch_a61228a6 public."Spec11ThreatMatch" [table] id bigserial not null auto-incremented check_date date not null registrar_id text not null tld text not null + + - - tmchcrl_d282355 - - - public."TmchCrl" - - [table] - id - - int8 not null - - + tmchcrl_d282355 public."TmchCrl" [table] id int8 not null + + - - userupdatehistory_24efd476 - - - public."UserUpdateHistory" - - [table] - history_revision_id - - int8 not null - email_address - - text not null - history_acting_user - - text not null - + userupdatehistory_24efd476 public."UserUpdateHistory" [table] history_revision_id int8 not null email_address text not null history_acting_user text not null diff --git a/db/src/main/resources/sql/er_diagram/full_er_diagram.html b/db/src/main/resources/sql/er_diagram/full_er_diagram.html index d4e3a8d24..c540f57cb 100644 --- a/db/src/main/resources/sql/er_diagram/full_er_diagram.html +++ b/db/src/main/resources/sql/er_diagram/full_er_diagram.html @@ -257,15 +257,15 @@ td.section { generated by - SchemaCrawler 16.25.2 + SchemaCrawler 16.27.1 generated on - 2025-08-18 18:05:20 + 2025-09-05 16:11:26 last flyway file - V196__tld_expiry_access_period_enabled.sql + V197__poc_rlock_drop_not_null.sql @@ -273,3661 +273,481 @@ td.section {

 

- - SchemaCrawler_Diagram - - - generated by - SchemaCrawler 16.25.2 - generated on - 2025-08-18 18:05:20 - + SchemaCrawler_Diagram generated by SchemaCrawler 16.27.1 generated on 2025-09-05 16:11:26 - - allocationtoken_a08ccbef - - - public."AllocationToken" - - [table] - token - - text not null - update_timestamp - - timestamptz - allowed_registrar_ids - - _text - allowed_tlds - - _text - creation_time - - timestamptz not null - discount_fraction - - float8(17, 17) not null - discount_premiums - - bool not null - discount_years - - int4 not null - domain_name - - text - redemption_domain_repo_id - - text - token_status_transitions - - hstore - token_type - - text - redemption_domain_history_id - - int8 - renewal_price_behavior - - text not null - registration_behavior - - text not null - allowed_epp_actions - - _text - renewal_price_amount - - numeric(19, 2) - renewal_price_currency - - text - discount_price_amount - - numeric(19, 2) - discount_price_currency - - text - - + allocationtoken_a08ccbef public."AllocationToken" [table] token text not null update_timestamp timestamptz allowed_registrar_ids _text allowed_tlds _text creation_time timestamptz not null discount_fraction float8(17, 17) not null discount_premiums bool not null discount_years int4 not null domain_name text redemption_domain_repo_id text token_status_transitions hstore token_type text redemption_domain_history_id int8 renewal_price_behavior text not null registration_behavior text not null allowed_epp_actions _text renewal_price_amount numeric(19, 2) renewal_price_currency text discount_price_amount numeric(19, 2) discount_price_currency text + + - - billingevent_a57d1815 - - - public."BillingEvent" - - [table] - billing_event_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - flags - - _text - reason - - text not null - domain_name - - text not null - allocation_token - - text - billing_time - - timestamptz - cancellation_matching_billing_recurrence_id - - int8 - cost_amount - - numeric(19, 2) - cost_currency - - text - period_years - - int4 - synthetic_creation_time - - timestamptz - recurrence_history_revision_id - - int8 - - + billingevent_a57d1815 public."BillingEvent" [table] billing_event_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null flags _text reason text not null domain_name text not null allocation_token text billing_time timestamptz cancellation_matching_billing_recurrence_id int8 cost_amount numeric(19, 2) cost_currency text period_years int4 synthetic_creation_time timestamptz recurrence_history_revision_id int8 + + - - billingevent_a57d1815:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_billing_event_allocation_token - + billingevent_a57d1815:w->allocationtoken_a08ccbef:e fk_billing_event_allocation_token + + - - billingrecurrence_5fa2cb01 - - - public."BillingRecurrence" - - [table] - billing_recurrence_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - flags - - _text - reason - - text not null - domain_name - - text not null - recurrence_end_time - - timestamptz - recurrence_time_of_year - - text - renewal_price_behavior - - text not null - renewal_price_currency - - text - renewal_price_amount - - numeric(19, 2) - recurrence_last_expansion - - timestamptz not null - - + billingrecurrence_5fa2cb01 public."BillingRecurrence" [table] billing_recurrence_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null flags _text reason text not null domain_name text not null recurrence_end_time timestamptz recurrence_time_of_year text renewal_price_behavior text not null renewal_price_currency text renewal_price_amount numeric(19, 2) recurrence_last_expansion timestamptz not null + + - - billingevent_a57d1815:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_billing_event_cancellation_matching_billing_recurrence_id - + billingevent_a57d1815:w->billingrecurrence_5fa2cb01:e fk_billing_event_cancellation_matching_billing_recurrence_id + + - - registrar_6e1503e3 - - - public."Registrar" - - [table] - registrar_id - - text not null - allowed_tlds - - _text - billing_account_map - - hstore - block_premium_names - - bool not null - client_certificate - - text - client_certificate_hash - - text - contacts_require_syncing - - bool not null - creation_time - - timestamptz not null - drive_folder_id - - text - email_address - - text - failover_client_certificate - - text - failover_client_certificate_hash - - text - fax_number - - text - iana_identifier - - int8 - icann_referral_email - - text - i18n_address_city - - text - i18n_address_country_code - - text - i18n_address_state - - text - i18n_address_street_line1 - - text - i18n_address_street_line2 - - text - i18n_address_street_line3 - - text - i18n_address_zip - - text - ip_address_allow_list - - _text - last_certificate_update_time - - timestamptz - last_update_time - - timestamptz not null - localized_address_city - - text - localized_address_country_code - - text - localized_address_state - - text - localized_address_street_line1 - - text - localized_address_street_line2 - - text - localized_address_street_line3 - - text - localized_address_zip - - text - password_hash - - text - phone_number - - text - phone_passcode - - text - po_number - - text - rdap_base_urls - - _text - registrar_name - - text not null - registry_lock_allowed - - bool not null - password_salt - - text - state - - text - type - - text not null - url - - text - whois_server - - text - last_expiring_cert_notification_sent_date - - timestamptz - last_expiring_failover_cert_notification_sent_date - - timestamptz - last_poc_verification_date - - timestamptz - - + registrar_6e1503e3 public."Registrar" [table] registrar_id text not null allowed_tlds _text billing_account_map hstore block_premium_names bool not null client_certificate text client_certificate_hash text contacts_require_syncing bool not null creation_time timestamptz not null drive_folder_id text email_address text failover_client_certificate text failover_client_certificate_hash text fax_number text iana_identifier int8 icann_referral_email text i18n_address_city text i18n_address_country_code text i18n_address_state text i18n_address_street_line1 text i18n_address_street_line2 text i18n_address_street_line3 text i18n_address_zip text ip_address_allow_list _text last_certificate_update_time timestamptz last_update_time timestamptz not null localized_address_city text localized_address_country_code text localized_address_state text localized_address_street_line1 text localized_address_street_line2 text localized_address_street_line3 text localized_address_zip text password_hash text phone_number text phone_passcode text po_number text rdap_base_urls _text registrar_name text not null registry_lock_allowed bool not null password_salt text state text type text not null url text whois_server text last_expiring_cert_notification_sent_date timestamptz last_expiring_failover_cert_notification_sent_date timestamptz last_poc_verification_date timestamptz + + - - billingevent_a57d1815:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_event_registrar_id - + billingevent_a57d1815:w->registrar_6e1503e3:e fk_billing_event_registrar_id + + - - domain_6c51cffa - - - public."Domain" - - [table] - repo_id - - text not null - creation_registrar_id - - text not null - creation_time - - timestamptz not null - current_sponsor_registrar_id - - text not null - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - auth_info_repo_id - - text - auth_info_value - - text - domain_name - - text - idn_table_name - - text - last_transfer_time - - timestamptz - launch_notice_accepted_time - - timestamptz - launch_notice_expiration_time - - timestamptz - launch_notice_tcn_id - - text - launch_notice_validator_id - - text - registration_expiration_time - - timestamptz - smd_id - - text - subordinate_hosts - - _text - tld - - text - admin_contact - - text - billing_contact - - text - registrant_contact - - text - tech_contact - - text - transfer_poll_message_id_1 - - int8 - transfer_poll_message_id_2 - - int8 - transfer_billing_cancellation_id - - int8 - transfer_billing_event_id - - int8 - transfer_billing_recurrence_id - - int8 - transfer_autorenew_poll_message_id - - int8 - transfer_renew_period_unit - - text - transfer_renew_period_value - - int4 - transfer_client_txn_id - - text - transfer_server_txn_id - - text - transfer_registration_expiration_time - - timestamptz - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - transfer_pending_expiration_time - - timestamptz - transfer_request_time - - timestamptz - transfer_status - - text - update_timestamp - - timestamptz - billing_recurrence_id - - int8 - autorenew_poll_message_id - - int8 - deletion_poll_message_id - - int8 - autorenew_end_time - - timestamptz - transfer_autorenew_poll_message_history_id - - int8 - transfer_history_entry_id - - int8 - transfer_repo_id - - text - transfer_poll_message_id_3 - - int8 - current_package_token - - text - lordn_phase - - text not null - last_update_time_via_epp - - timestamptz - - + domain_6c51cffa public."Domain" [table] repo_id text not null creation_registrar_id text not null creation_time timestamptz not null current_sponsor_registrar_id text not null deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text auth_info_repo_id text auth_info_value text domain_name text idn_table_name text last_transfer_time timestamptz launch_notice_accepted_time timestamptz launch_notice_expiration_time timestamptz launch_notice_tcn_id text launch_notice_validator_id text registration_expiration_time timestamptz smd_id text subordinate_hosts _text tld text admin_contact text billing_contact text registrant_contact text tech_contact text transfer_poll_message_id_1 int8 transfer_poll_message_id_2 int8 transfer_billing_cancellation_id int8 transfer_billing_event_id int8 transfer_billing_recurrence_id int8 transfer_autorenew_poll_message_id int8 transfer_renew_period_unit text transfer_renew_period_value int4 transfer_client_txn_id text transfer_server_txn_id text transfer_registration_expiration_time timestamptz transfer_gaining_registrar_id text transfer_losing_registrar_id text transfer_pending_expiration_time timestamptz transfer_request_time timestamptz transfer_status text update_timestamp timestamptz billing_recurrence_id int8 autorenew_poll_message_id int8 deletion_poll_message_id int8 autorenew_end_time timestamptz transfer_autorenew_poll_message_history_id int8 transfer_history_entry_id int8 transfer_repo_id text transfer_poll_message_id_3 int8 current_package_token text lordn_phase text not null last_update_time_via_epp timestamptz + + - - domain_6c51cffa:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_domain_current_package_token - + domain_6c51cffa:w->allocationtoken_a08ccbef:e fk_domain_current_package_token + + - - domain_6c51cffa:w->billingevent_a57d1815:e - - - - - - - - - fk_domain_transfer_billing_event_id - + domain_6c51cffa:w->billingevent_a57d1815:e fk_domain_transfer_billing_event_id + + - - billingcancellation_6eedf614 - - - public."BillingCancellation" - - [table] - billing_cancellation_id - - int8 not null - registrar_id - - text not null - domain_history_revision_id - - int8 not null - domain_repo_id - - text not null - event_time - - timestamptz not null - flags - - _text - reason - - text not null - domain_name - - text not null - billing_time - - timestamptz - billing_event_id - - int8 - billing_recurrence_id - - int8 - - + billingcancellation_6eedf614 public."BillingCancellation" [table] billing_cancellation_id int8 not null registrar_id text not null domain_history_revision_id int8 not null domain_repo_id text not null event_time timestamptz not null flags _text reason text not null domain_name text not null billing_time timestamptz billing_event_id int8 billing_recurrence_id int8 + + - - domain_6c51cffa:w->billingcancellation_6eedf614:e - - - - - - - - - fk_domain_transfer_billing_cancellation_id - + domain_6c51cffa:w->billingcancellation_6eedf614:e fk_domain_transfer_billing_cancellation_id + + - - domain_6c51cffa:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_domain_billing_recurrence_id - + domain_6c51cffa:w->billingrecurrence_5fa2cb01:e fk_domain_billing_recurrence_id + + - - domain_6c51cffa:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_domain_transfer_billing_recurrence_id - + domain_6c51cffa:w->billingrecurrence_5fa2cb01:e fk_domain_transfer_billing_recurrence_id + + - - contact_8de8cb16 - - - public."Contact" - - [table] - repo_id - - text not null - creation_registrar_id - - text not null - creation_time - - timestamptz not null - current_sponsor_registrar_id - - text not null - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - auth_info_repo_id - - text - auth_info_value - - text - contact_id - - text - disclose_types_addr - - _text - disclose_show_email - - bool - disclose_show_fax - - bool - disclose_mode_flag - - bool - disclose_types_name - - _text - disclose_types_org - - _text - disclose_show_voice - - bool - email - - text - fax_phone_extension - - text - fax_phone_number - - text - addr_i18n_city - - text - addr_i18n_country_code - - text - addr_i18n_state - - text - addr_i18n_street_line1 - - text - addr_i18n_street_line2 - - text - addr_i18n_street_line3 - - text - addr_i18n_zip - - text - addr_i18n_name - - text - addr_i18n_org - - text - addr_i18n_type - - text - last_transfer_time - - timestamptz - addr_local_city - - text - addr_local_country_code - - text - addr_local_state - - text - addr_local_street_line1 - - text - addr_local_street_line2 - - text - addr_local_street_line3 - - text - addr_local_zip - - text - addr_local_name - - text - addr_local_org - - text - addr_local_type - - text - search_name - - text - voice_phone_extension - - text - voice_phone_number - - text - transfer_poll_message_id_1 - - int8 - transfer_poll_message_id_2 - - int8 - transfer_client_txn_id - - text - transfer_server_txn_id - - text - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - transfer_pending_expiration_time - - timestamptz - transfer_request_time - - timestamptz - transfer_status - - text - update_timestamp - - timestamptz - transfer_history_entry_id - - int8 - transfer_repo_id - - text - transfer_poll_message_id_3 - - int8 - last_update_time_via_epp - - timestamptz - - + contact_8de8cb16 public."Contact" [table] repo_id text not null creation_registrar_id text not null creation_time timestamptz not null current_sponsor_registrar_id text not null deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text auth_info_repo_id text auth_info_value text contact_id text disclose_types_addr _text disclose_show_email bool disclose_show_fax bool disclose_mode_flag bool disclose_types_name _text disclose_types_org _text disclose_show_voice bool email text fax_phone_extension text fax_phone_number text addr_i18n_city text addr_i18n_country_code text addr_i18n_state text addr_i18n_street_line1 text addr_i18n_street_line2 text addr_i18n_street_line3 text addr_i18n_zip text addr_i18n_name text addr_i18n_org text addr_i18n_type text last_transfer_time timestamptz addr_local_city text addr_local_country_code text addr_local_state text addr_local_street_line1 text addr_local_street_line2 text addr_local_street_line3 text addr_local_zip text addr_local_name text addr_local_org text addr_local_type text search_name text voice_phone_extension text voice_phone_number text transfer_poll_message_id_1 int8 transfer_poll_message_id_2 int8 transfer_client_txn_id text transfer_server_txn_id text transfer_gaining_registrar_id text transfer_losing_registrar_id text transfer_pending_expiration_time timestamptz transfer_request_time timestamptz transfer_status text update_timestamp timestamptz transfer_history_entry_id int8 transfer_repo_id text transfer_poll_message_id_3 int8 last_update_time_via_epp timestamptz + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_admin_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_admin_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_billing_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_billing_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_registrant_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_registrant_contact + + - - domain_6c51cffa:w->contact_8de8cb16:e - - - - - - - - - fk_domain_tech_contact - + domain_6c51cffa:w->contact_8de8cb16:e fk_domain_tech_contact + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk2jc69qyg2tv9hhnmif6oa1cx1 - + domain_6c51cffa:w->registrar_6e1503e3:e fk2jc69qyg2tv9hhnmif6oa1cx1 + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk2u3srsfbei272093m3b3xwj23 - + domain_6c51cffa:w->registrar_6e1503e3:e fk2u3srsfbei272093m3b3xwj23 + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fkjc0r9r5y1lfbt4gpbqw4wsuvq - + domain_6c51cffa:w->registrar_6e1503e3:e fkjc0r9r5y1lfbt4gpbqw4wsuvq + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_transfer_gaining_registrar_id - + domain_6c51cffa:w->registrar_6e1503e3:e fk_domain_transfer_gaining_registrar_id + + - - domain_6c51cffa:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_transfer_losing_registrar_id - + domain_6c51cffa:w->registrar_6e1503e3:e fk_domain_transfer_losing_registrar_id + + - - tld_f1fa57e2 - - - public."Tld" - - [table] - tld_name - - text not null - add_grace_period_length - - interval not null - allowed_fully_qualified_host_names - - _text - allowed_registrant_contact_ids - - _text - anchor_tenant_add_grace_period_length - - interval not null - auto_renew_grace_period_length - - interval not null - automatic_transfer_length - - interval not null - claims_period_end - - timestamptz not null - creation_time - - timestamptz not null - currency - - text not null - dns_paused - - bool not null - dns_writers - - _text not null - drive_folder_id - - text - eap_fee_schedule - - hstore not null - escrow_enabled - - bool not null - invoicing_enabled - - bool not null - lordn_username - - text - num_dns_publish_locks - - int4 not null - pending_delete_length - - interval not null - premium_list_name - - text - pricing_engine_class_name - - text - redemption_grace_period_length - - interval not null - registry_lock_or_unlock_cost_amount - - numeric(19, 2) - registry_lock_or_unlock_cost_currency - - text - renew_billing_cost_transitions - - hstore not null - renew_grace_period_length - - interval not null - reserved_list_names - - _text - restore_billing_cost_amount - - numeric(19, 2) - restore_billing_cost_currency - - text - roid_suffix - - text - server_status_change_billing_cost_amount - - numeric(19, 2) - server_status_change_billing_cost_currency - - text - tld_state_transitions - - hstore not null - tld_type - - text not null - tld_unicode - - text not null - transfer_grace_period_length - - interval not null - default_promo_tokens - - _text - dns_a_plus_aaaa_ttl - - interval - dns_ds_ttl - - interval - dns_ns_ttl - - interval - idn_tables - - _text - breakglass_mode - - bool not null - bsa_enroll_start_time - - timestamptz - create_billing_cost_transitions - - hstore not null - expiry_access_period_enabled - - bool not null - - + tld_f1fa57e2 public."Tld" [table] tld_name text not null add_grace_period_length interval not null allowed_fully_qualified_host_names _text allowed_registrant_contact_ids _text anchor_tenant_add_grace_period_length interval not null auto_renew_grace_period_length interval not null automatic_transfer_length interval not null claims_period_end timestamptz not null creation_time timestamptz not null currency text not null dns_paused bool not null dns_writers _text not null drive_folder_id text eap_fee_schedule hstore not null escrow_enabled bool not null invoicing_enabled bool not null lordn_username text num_dns_publish_locks int4 not null pending_delete_length interval not null premium_list_name text pricing_engine_class_name text redemption_grace_period_length interval not null registry_lock_or_unlock_cost_amount numeric(19, 2) registry_lock_or_unlock_cost_currency text renew_billing_cost_transitions hstore not null renew_grace_period_length interval not null reserved_list_names _text restore_billing_cost_amount numeric(19, 2) restore_billing_cost_currency text roid_suffix text server_status_change_billing_cost_amount numeric(19, 2) server_status_change_billing_cost_currency text tld_state_transitions hstore not null tld_type text not null tld_unicode text not null transfer_grace_period_length interval not null default_promo_tokens _text dns_a_plus_aaaa_ttl interval dns_ds_ttl interval dns_ns_ttl interval idn_tables _text breakglass_mode bool not null bsa_enroll_start_time timestamptz create_billing_cost_transitions hstore not null expiry_access_period_enabled bool not null + + - - domain_6c51cffa:w->tld_f1fa57e2:e - - - - - - - - - fk_domain_tld - + domain_6c51cffa:w->tld_f1fa57e2:e fk_domain_tld + + - - domainhistory_a54cc226 - - - public."DomainHistory" - - [table] - history_revision_id - - int8 not null - history_by_superuser - - bool not null - history_registrar_id - - text - history_modification_time - - timestamptz not null - history_reason - - text - history_requested_by_registrar - - bool - history_client_transaction_id - - text - history_server_transaction_id - - text - history_type - - text not null - history_xml_bytes - - bytea - admin_contact - - text - auth_info_repo_id - - text - auth_info_value - - text - billing_recurrence_id - - int8 - autorenew_poll_message_id - - int8 - billing_contact - - text - deletion_poll_message_id - - int8 - domain_name - - text - idn_table_name - - text - last_transfer_time - - timestamptz - launch_notice_accepted_time - - timestamptz - launch_notice_expiration_time - - timestamptz - launch_notice_tcn_id - - text - launch_notice_validator_id - - text - registrant_contact - - text - registration_expiration_time - - timestamptz - smd_id - - text - subordinate_hosts - - _text - tech_contact - - text - tld - - text - transfer_billing_cancellation_id - - int8 - transfer_billing_recurrence_id - - int8 - transfer_autorenew_poll_message_id - - int8 - transfer_billing_event_id - - int8 - transfer_renew_period_unit - - text - transfer_renew_period_value - - int4 - transfer_registration_expiration_time - - timestamptz - transfer_poll_message_id_1 - - int8 - transfer_poll_message_id_2 - - int8 - transfer_client_txn_id - - text - transfer_server_txn_id - - text - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - transfer_pending_expiration_time - - timestamptz - transfer_request_time - - timestamptz - transfer_status - - text - creation_registrar_id - - text - creation_time - - timestamptz - current_sponsor_registrar_id - - text - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - update_timestamp - - timestamptz - domain_repo_id - - text not null - autorenew_end_time - - timestamptz - history_other_registrar_id - - text - history_period_unit - - text - history_period_value - - int4 - autorenew_poll_message_history_id - - int8 - transfer_autorenew_poll_message_history_id - - int8 - transfer_history_entry_id - - int8 - transfer_repo_id - - text - transfer_poll_message_id_3 - - int8 - current_package_token - - text - lordn_phase - - text not null - last_update_time_via_epp - - timestamptz - - + domainhistory_a54cc226 public."DomainHistory" [table] history_revision_id int8 not null history_by_superuser bool not null history_registrar_id text history_modification_time timestamptz not null history_reason text history_requested_by_registrar bool history_client_transaction_id text history_server_transaction_id text history_type text not null history_xml_bytes bytea admin_contact text auth_info_repo_id text auth_info_value text billing_recurrence_id int8 autorenew_poll_message_id int8 billing_contact text deletion_poll_message_id int8 domain_name text idn_table_name text last_transfer_time timestamptz launch_notice_accepted_time timestamptz launch_notice_expiration_time timestamptz launch_notice_tcn_id text launch_notice_validator_id text registrant_contact text registration_expiration_time timestamptz smd_id text subordinate_hosts _text tech_contact text tld text transfer_billing_cancellation_id int8 transfer_billing_recurrence_id int8 transfer_autorenew_poll_message_id int8 transfer_billing_event_id int8 transfer_renew_period_unit text transfer_renew_period_value int4 transfer_registration_expiration_time timestamptz transfer_poll_message_id_1 int8 transfer_poll_message_id_2 int8 transfer_client_txn_id text transfer_server_txn_id text transfer_gaining_registrar_id text transfer_losing_registrar_id text transfer_pending_expiration_time timestamptz transfer_request_time timestamptz transfer_status text creation_registrar_id text creation_time timestamptz current_sponsor_registrar_id text deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text update_timestamp timestamptz domain_repo_id text not null autorenew_end_time timestamptz history_other_registrar_id text history_period_unit text history_period_value int4 autorenew_poll_message_history_id int8 transfer_autorenew_poll_message_history_id int8 transfer_history_entry_id int8 transfer_repo_id text transfer_poll_message_id_3 int8 current_package_token text lordn_phase text not null last_update_time_via_epp timestamptz + + - - domainhistory_a54cc226:w->allocationtoken_a08ccbef:e - - - - - - - - - fk_domain_history_current_package_token - + domainhistory_a54cc226:w->allocationtoken_a08ccbef:e fk_domain_history_current_package_token + + - - domainhistory_a54cc226:w->domain_6c51cffa:e - - - - - - - - - fk_domain_history_domain_repo_id - + domainhistory_a54cc226:w->domain_6c51cffa:e fk_domain_history_domain_repo_id + + - - domainhistory_a54cc226:w->registrar_6e1503e3:e - - - - - - - - - fk_domain_history_registrar_id - + domainhistory_a54cc226:w->registrar_6e1503e3:e fk_domain_history_registrar_id + + - - billingcancellation_6eedf614:w->billingevent_a57d1815:e - - - - - - - - - fk_billing_cancellation_billing_event_id - + billingcancellation_6eedf614:w->billingevent_a57d1815:e fk_billing_cancellation_billing_event_id + + - - billingcancellation_6eedf614:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_billing_cancellation_billing_recurrence_id - + billingcancellation_6eedf614:w->billingrecurrence_5fa2cb01:e fk_billing_cancellation_billing_recurrence_id + + - - billingcancellation_6eedf614:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_cancellation_registrar_id - + billingcancellation_6eedf614:w->registrar_6e1503e3:e fk_billing_cancellation_registrar_id + + - - graceperiod_cd3b2e8f - - - public."GracePeriod" - - [table] - grace_period_id - - int8 not null - billing_event_id - - int8 - billing_recurrence_id - - int8 - registrar_id - - text not null - domain_repo_id - - text not null - expiration_time - - timestamptz not null - type - - text not null - - + graceperiod_cd3b2e8f public."GracePeriod" [table] grace_period_id int8 not null billing_event_id int8 billing_recurrence_id int8 registrar_id text not null domain_repo_id text not null expiration_time timestamptz not null type text not null + + - - graceperiod_cd3b2e8f:w->billingevent_a57d1815:e - - - - - - - - - fk_grace_period_billing_event_id - + graceperiod_cd3b2e8f:w->billingevent_a57d1815:e fk_grace_period_billing_event_id + + - - graceperiod_cd3b2e8f:w->domain_6c51cffa:e - - - - - - - - - fk_grace_period_domain_repo_id - + graceperiod_cd3b2e8f:w->domain_6c51cffa:e fk_grace_period_domain_repo_id + + - - graceperiod_cd3b2e8f:w->billingrecurrence_5fa2cb01:e - - - - - - - - - fk_grace_period_billing_recurrence_id - + graceperiod_cd3b2e8f:w->billingrecurrence_5fa2cb01:e fk_grace_period_billing_recurrence_id + + - - graceperiod_cd3b2e8f:w->registrar_6e1503e3:e - - - - - - - - - fk_grace_period_registrar_id - + graceperiod_cd3b2e8f:w->registrar_6e1503e3:e fk_grace_period_registrar_id + + - - billingrecurrence_5fa2cb01:w->registrar_6e1503e3:e - - - - - - - - - fk_billing_recurrence_registrar_id - + billingrecurrence_5fa2cb01:w->registrar_6e1503e3:e fk_billing_recurrence_registrar_id + + - - bsadomainrefresh_c8f4c45d - - - public."BsaDomainRefresh" - - [table] - job_id - - bigserial not null - - auto-incremented - creation_time - - timestamptz not null - stage - - text not null - update_timestamp - - timestamptz - - + bsadomainrefresh_c8f4c45d public."BsaDomainRefresh" [table] job_id bigserial not null auto-incremented creation_time timestamptz not null stage text not null update_timestamp timestamptz + + - - bsadownload_98d031ce - - - public."BsaDownload" - - [table] - job_id - - bigserial not null - - auto-incremented - block_list_checksums - - text not null - creation_time - - timestamptz not null - stage - - text not null - update_timestamp - - timestamptz - - + bsadownload_98d031ce public."BsaDownload" [table] job_id bigserial not null auto-incremented block_list_checksums text not null creation_time timestamptz not null stage text not null update_timestamp timestamptz + + - - bsalabel_2755e1da - - - public."BsaLabel" - - [table] - label - - text not null - creation_time - - timestamptz not null - - + bsalabel_2755e1da public."BsaLabel" [table] label text not null creation_time timestamptz not null + + - - bsaunblockabledomain_b739a38 - - - public."BsaUnblockableDomain" - - [table] - label - - text not null - tld - - text not null - creation_time - - timestamptz not null - reason - - text not null - - + bsaunblockabledomain_b739a38 public."BsaUnblockableDomain" [table] label text not null tld text not null creation_time timestamptz not null reason text not null + + - - bsaunblockabledomain_b739a38:w->bsalabel_2755e1da:e - - - - - - - - - fkbsaunblockabledomainlabel - + bsaunblockabledomain_b739a38:w->bsalabel_2755e1da:e fkbsaunblockabledomainlabel + + - - claimsentry_105da9f1 - - - public."ClaimsEntry" - - [table] - revision_id - - int8 not null - claim_key - - text not null - domain_label - - text not null - - + claimsentry_105da9f1 public."ClaimsEntry" [table] revision_id int8 not null claim_key text not null domain_label text not null + + - - claimslist_3d49bc2b - - - public."ClaimsList" - - [table] - revision_id - - bigserial not null - - auto-incremented - creation_timestamp - - timestamptz not null - tmdb_generation_time - - timestamptz not null - - + claimslist_3d49bc2b public."ClaimsList" [table] revision_id bigserial not null auto-incremented creation_timestamp timestamptz not null tmdb_generation_time timestamptz not null + + - - claimsentry_105da9f1:w->claimslist_3d49bc2b:e - - - - - - - - - fk6sc6at5hedffc0nhdcab6ivuq - + claimsentry_105da9f1:w->claimslist_3d49bc2b:e fk6sc6at5hedffc0nhdcab6ivuq + + - - consoleeppactionhistory_bcc2a2c6 - - - public."ConsoleEppActionHistory" - - [table] - history_revision_id - - int8 not null - history_modification_time - - timestamptz not null - history_method - - text not null - history_request_body - - text - history_type - - text not null - history_url - - text not null - history_entry_class - - text not null - repo_id - - text not null - revision_id - - int8 not null - history_acting_user - - text not null - - + consoleeppactionhistory_bcc2a2c6 public."ConsoleEppActionHistory" [table] history_revision_id int8 not null history_modification_time timestamptz not null history_method text not null history_request_body text history_type text not null history_url text not null history_entry_class text not null repo_id text not null revision_id int8 not null history_acting_user text not null + + - - consoleupdatehistory_5237b2aa - - - public."ConsoleUpdateHistory" - - [table] - revision_id - - int8 not null - modification_time - - timestamptz not null - "method" - - text not null - type - - text not null - url - - text not null - description - - text - acting_user - - text not null - - + consoleupdatehistory_5237b2aa public."ConsoleUpdateHistory" [table] revision_id int8 not null modification_time timestamptz not null "method" text not null type text not null url text not null description text acting_user text not null + + - - user_f2216f01 - - - public."User" - - [table] - email_address - - text not null - registry_lock_password_hash - - text - registry_lock_password_salt - - text - global_role - - text not null - is_admin - - bool not null - registrar_roles - - hstore not null - update_timestamp - - timestamptz - registry_lock_email_address - - text - - + user_f2216f01 public."User" [table] email_address text not null registry_lock_password_hash text registry_lock_password_salt text global_role text not null is_admin bool not null registrar_roles hstore not null update_timestamp timestamptz registry_lock_email_address text + + - - consoleupdatehistory_5237b2aa:w->user_f2216f01:e - - - - - - - - - fk_console_update_history_acting_user - + consoleupdatehistory_5237b2aa:w->user_f2216f01:e fk_console_update_history_acting_user + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk1sfyj7o7954prbn1exk7lpnoe - + contact_8de8cb16:w->registrar_6e1503e3:e fk1sfyj7o7954prbn1exk7lpnoe + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk93c185fx7chn68uv7nl6uv2s0 - + contact_8de8cb16:w->registrar_6e1503e3:e fk93c185fx7chn68uv7nl6uv2s0 + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fkmb7tdiv85863134w1wogtxrb2 - + contact_8de8cb16:w->registrar_6e1503e3:e fkmb7tdiv85863134w1wogtxrb2 + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_transfer_gaining_registrar_id - + contact_8de8cb16:w->registrar_6e1503e3:e fk_contact_transfer_gaining_registrar_id + + - - contact_8de8cb16:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_transfer_losing_registrar_id - + contact_8de8cb16:w->registrar_6e1503e3:e fk_contact_transfer_losing_registrar_id + + - - contacthistory_d2964f8a - - - public."ContactHistory" - - [table] - history_revision_id - - int8 not null - history_by_superuser - - bool not null - history_registrar_id - - text - history_modification_time - - timestamptz not null - history_reason - - text - history_requested_by_registrar - - bool - history_client_transaction_id - - text - history_server_transaction_id - - text - history_type - - text not null - history_xml_bytes - - bytea - auth_info_repo_id - - text - auth_info_value - - text - contact_id - - text - disclose_types_addr - - _text - disclose_show_email - - bool - disclose_show_fax - - bool - disclose_mode_flag - - bool - disclose_types_name - - _text - disclose_types_org - - _text - disclose_show_voice - - bool - email - - text - fax_phone_extension - - text - fax_phone_number - - text - addr_i18n_city - - text - addr_i18n_country_code - - text - addr_i18n_state - - text - addr_i18n_street_line1 - - text - addr_i18n_street_line2 - - text - addr_i18n_street_line3 - - text - addr_i18n_zip - - text - addr_i18n_name - - text - addr_i18n_org - - text - addr_i18n_type - - text - last_transfer_time - - timestamptz - addr_local_city - - text - addr_local_country_code - - text - addr_local_state - - text - addr_local_street_line1 - - text - addr_local_street_line2 - - text - addr_local_street_line3 - - text - addr_local_zip - - text - addr_local_name - - text - addr_local_org - - text - addr_local_type - - text - search_name - - text - transfer_poll_message_id_1 - - int8 - transfer_poll_message_id_2 - - int8 - transfer_client_txn_id - - text - transfer_server_txn_id - - text - transfer_gaining_registrar_id - - text - transfer_losing_registrar_id - - text - transfer_pending_expiration_time - - timestamptz - transfer_request_time - - timestamptz - transfer_status - - text - voice_phone_extension - - text - voice_phone_number - - text - creation_registrar_id - - text - creation_time - - timestamptz - current_sponsor_registrar_id - - text - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - contact_repo_id - - text not null - update_timestamp - - timestamptz - transfer_history_entry_id - - int8 - transfer_repo_id - - text - transfer_poll_message_id_3 - - int8 - last_update_time_via_epp - - timestamptz - - + contacthistory_d2964f8a public."ContactHistory" [table] history_revision_id int8 not null history_by_superuser bool not null history_registrar_id text history_modification_time timestamptz not null history_reason text history_requested_by_registrar bool history_client_transaction_id text history_server_transaction_id text history_type text not null history_xml_bytes bytea auth_info_repo_id text auth_info_value text contact_id text disclose_types_addr _text disclose_show_email bool disclose_show_fax bool disclose_mode_flag bool disclose_types_name _text disclose_types_org _text disclose_show_voice bool email text fax_phone_extension text fax_phone_number text addr_i18n_city text addr_i18n_country_code text addr_i18n_state text addr_i18n_street_line1 text addr_i18n_street_line2 text addr_i18n_street_line3 text addr_i18n_zip text addr_i18n_name text addr_i18n_org text addr_i18n_type text last_transfer_time timestamptz addr_local_city text addr_local_country_code text addr_local_state text addr_local_street_line1 text addr_local_street_line2 text addr_local_street_line3 text addr_local_zip text addr_local_name text addr_local_org text addr_local_type text search_name text transfer_poll_message_id_1 int8 transfer_poll_message_id_2 int8 transfer_client_txn_id text transfer_server_txn_id text transfer_gaining_registrar_id text transfer_losing_registrar_id text transfer_pending_expiration_time timestamptz transfer_request_time timestamptz transfer_status text voice_phone_extension text voice_phone_number text creation_registrar_id text creation_time timestamptz current_sponsor_registrar_id text deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text contact_repo_id text not null update_timestamp timestamptz transfer_history_entry_id int8 transfer_repo_id text transfer_poll_message_id_3 int8 last_update_time_via_epp timestamptz + + - - contacthistory_d2964f8a:w->contact_8de8cb16:e - - - - - - - - - fk_contact_history_contact_repo_id - + contacthistory_d2964f8a:w->contact_8de8cb16:e fk_contact_history_contact_repo_id + + - - contacthistory_d2964f8a:w->registrar_6e1503e3:e - - - - - - - - - fk_contact_history_registrar_id - + contacthistory_d2964f8a:w->registrar_6e1503e3:e fk_contact_history_registrar_id + + - - pollmessage_614a523e - - - public."PollMessage" - - [table] - type - - text not null - poll_message_id - - int8 not null - registrar_id - - text not null - contact_repo_id - - text - contact_history_revision_id - - int8 - domain_repo_id - - text - domain_history_revision_id - - int8 - event_time - - timestamptz not null - host_repo_id - - text - host_history_revision_id - - int8 - message - - text - transfer_response_contact_id - - text - transfer_response_domain_expiration_time - - timestamptz - transfer_response_domain_name - - text - pending_action_response_action_result - - bool - pending_action_response_name_or_id - - text - pending_action_response_processed_date - - timestamptz - pending_action_response_client_txn_id - - text - pending_action_response_server_txn_id - - text - transfer_response_gaining_registrar_id - - text - transfer_response_losing_registrar_id - - text - transfer_response_pending_transfer_expiration_time - - timestamptz - transfer_response_transfer_request_time - - timestamptz - transfer_response_transfer_status - - text - autorenew_end_time - - timestamptz - autorenew_domain_name - - text - transfer_response_host_id - - text - - + pollmessage_614a523e public."PollMessage" [table] type text not null poll_message_id int8 not null registrar_id text not null contact_repo_id text contact_history_revision_id int8 domain_repo_id text domain_history_revision_id int8 event_time timestamptz not null host_repo_id text host_history_revision_id int8 message text transfer_response_contact_id text transfer_response_domain_expiration_time timestamptz transfer_response_domain_name text pending_action_response_action_result bool pending_action_response_name_or_id text pending_action_response_processed_date timestamptz pending_action_response_client_txn_id text pending_action_response_server_txn_id text transfer_response_gaining_registrar_id text transfer_response_losing_registrar_id text transfer_response_pending_transfer_expiration_time timestamptz transfer_response_transfer_request_time timestamptz transfer_response_transfer_status text autorenew_end_time timestamptz autorenew_domain_name text transfer_response_host_id text + + - - pollmessage_614a523e:w->domain_6c51cffa:e - - - - - - - - - fk_poll_message_domain_repo_id - + pollmessage_614a523e:w->domain_6c51cffa:e fk_poll_message_domain_repo_id + + - - pollmessage_614a523e:w->contact_8de8cb16:e - - - - - - - - - fk_poll_message_contact_repo_id - + pollmessage_614a523e:w->contact_8de8cb16:e fk_poll_message_contact_repo_id + + - - pollmessage_614a523e:w->contacthistory_d2964f8a:e - - - - - - - - - fk_poll_message_contact_history - + pollmessage_614a523e:w->contacthistory_d2964f8a:e fk_poll_message_contact_history + + - - pollmessage_614a523e:w->contacthistory_d2964f8a:e - - - - - - - - - fk_poll_message_contact_history - + pollmessage_614a523e:w->contacthistory_d2964f8a:e fk_poll_message_contact_history + + - - host_f21b78de - - - public."Host" - - [table] - repo_id - - text not null - creation_registrar_id - - text - creation_time - - timestamptz - current_sponsor_registrar_id - - text - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - host_name - - text - last_superordinate_change - - timestamptz - last_transfer_time - - timestamptz - superordinate_domain - - text - inet_addresses - - _text - update_timestamp - - timestamptz - transfer_poll_message_id_3 - - int8 - last_update_time_via_epp - - timestamptz - - + host_f21b78de public."Host" [table] repo_id text not null creation_registrar_id text creation_time timestamptz current_sponsor_registrar_id text deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text host_name text last_superordinate_change timestamptz last_transfer_time timestamptz superordinate_domain text inet_addresses _text update_timestamp timestamptz transfer_poll_message_id_3 int8 last_update_time_via_epp timestamptz + + - - pollmessage_614a523e:w->host_f21b78de:e - - - - - - - - - fk_poll_message_host_repo_id - + pollmessage_614a523e:w->host_f21b78de:e fk_poll_message_host_repo_id + + - - hosthistory_56210c2 - - - public."HostHistory" - - [table] - history_revision_id - - int8 not null - history_by_superuser - - bool not null - history_registrar_id - - text not null - history_modification_time - - timestamptz not null - history_reason - - text - history_requested_by_registrar - - bool - history_client_transaction_id - - text - history_server_transaction_id - - text - history_type - - text not null - history_xml_bytes - - bytea - host_name - - text - inet_addresses - - _text - last_superordinate_change - - timestamptz - last_transfer_time - - timestamptz - superordinate_domain - - text - creation_registrar_id - - text - creation_time - - timestamptz - current_sponsor_registrar_id - - text - deletion_time - - timestamptz - last_epp_update_registrar_id - - text - last_epp_update_time - - timestamptz - statuses - - _text - host_repo_id - - text not null - update_timestamp - - timestamptz - transfer_poll_message_id_3 - - int8 - last_update_time_via_epp - - timestamptz - - + hosthistory_56210c2 public."HostHistory" [table] history_revision_id int8 not null history_by_superuser bool not null history_registrar_id text not null history_modification_time timestamptz not null history_reason text history_requested_by_registrar bool history_client_transaction_id text history_server_transaction_id text history_type text not null history_xml_bytes bytea host_name text inet_addresses _text last_superordinate_change timestamptz last_transfer_time timestamptz superordinate_domain text creation_registrar_id text creation_time timestamptz current_sponsor_registrar_id text deletion_time timestamptz last_epp_update_registrar_id text last_epp_update_time timestamptz statuses _text host_repo_id text not null update_timestamp timestamptz transfer_poll_message_id_3 int8 last_update_time_via_epp timestamptz + + - - pollmessage_614a523e:w->hosthistory_56210c2:e - - - - - - - - - fk_poll_message_host_history - + pollmessage_614a523e:w->hosthistory_56210c2:e fk_poll_message_host_history + + - - pollmessage_614a523e:w->hosthistory_56210c2:e - - - - - - - - - fk_poll_message_host_history - + pollmessage_614a523e:w->hosthistory_56210c2:e fk_poll_message_host_history + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_registrar_id + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_transfer_response_gaining_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_transfer_response_gaining_registrar_id + + - - pollmessage_614a523e:w->registrar_6e1503e3:e - - - - - - - - - fk_poll_message_transfer_response_losing_registrar_id - + pollmessage_614a523e:w->registrar_6e1503e3:e fk_poll_message_transfer_response_losing_registrar_id + + - - cursor_6af40e8c - - - public."Cursor" - - [table] - "scope" - - text not null - type - - text not null - cursor_time - - timestamptz not null - last_update_time - - timestamptz not null - - + cursor_6af40e8c public."Cursor" [table] "scope" text not null type text not null cursor_time timestamptz not null last_update_time timestamptz not null + + - - delegationsignerdata_e542a872 - - - public."DelegationSignerData" - - [table] - domain_repo_id - - text not null - key_tag - - int4 not null - algorithm - - int4 not null - digest - - bytea not null - digest_type - - int4 not null - - + delegationsignerdata_e542a872 public."DelegationSignerData" [table] domain_repo_id text not null key_tag int4 not null algorithm int4 not null digest bytea not null digest_type int4 not null + + - - delegationsignerdata_e542a872:w->domain_6c51cffa:e - - - - - - - - - fktr24j9v14ph2mfuw2gsmt12kq - + delegationsignerdata_e542a872:w->domain_6c51cffa:e fktr24j9v14ph2mfuw2gsmt12kq + + - - dnsrefreshrequest_4e6affb3 - - - public."DnsRefreshRequest" - - [table] - id - - bigserial not null - - auto-incremented - name - - text not null - request_time - - timestamptz not null - tld - - text not null - type - - text not null - last_process_time - - timestamptz not null - - + dnsrefreshrequest_4e6affb3 public."DnsRefreshRequest" [table] id bigserial not null auto-incremented name text not null request_time timestamptz not null tld text not null type text not null last_process_time timestamptz not null + + - - domainhost_1ea127c2 - - - public."DomainHost" - - [table] - domain_repo_id - - text not null - host_repo_id - - text - - + domainhost_1ea127c2 public."DomainHost" [table] domain_repo_id text not null host_repo_id text + + - - domainhost_1ea127c2:w->domain_6c51cffa:e - - - - - - - - - fkfmi7bdink53swivs390m2btxg - + domainhost_1ea127c2:w->domain_6c51cffa:e fkfmi7bdink53swivs390m2btxg + + - - domainhost_1ea127c2:w->host_f21b78de:e - - - - - - - - - fk_domainhost_host_valid - + domainhost_1ea127c2:w->host_f21b78de:e fk_domainhost_host_valid + + - - host_f21b78de:w->domain_6c51cffa:e - - - - - - - - - fk_host_superordinate_domain - + host_f21b78de:w->domain_6c51cffa:e fk_host_superordinate_domain + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_creation_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_creation_registrar_id + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_current_sponsor_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_current_sponsor_registrar_id + + - - host_f21b78de:w->registrar_6e1503e3:e - - - - - - - - - fk_host_last_epp_update_registrar_id - + host_f21b78de:w->registrar_6e1503e3:e fk_host_last_epp_update_registrar_id + + - - domaindsdatahistory_995b060d - - - public."DomainDsDataHistory" - - [table] - ds_data_history_revision_id - - int8 not null - algorithm - - int4 not null - digest - - bytea not null - digest_type - - int4 not null - domain_history_revision_id - - int8 not null - key_tag - - int4 not null - domain_repo_id - - text - - + domaindsdatahistory_995b060d public."DomainDsDataHistory" [table] ds_data_history_revision_id int8 not null algorithm int4 not null digest bytea not null digest_type int4 not null domain_history_revision_id int8 not null key_tag int4 not null domain_repo_id text + + - - domainhistoryhost_9f3f23ee - - - public."DomainHistoryHost" - - [table] - domain_history_history_revision_id - - int8 not null - host_repo_id - - text - domain_history_domain_repo_id - - text not null - - + domainhistoryhost_9f3f23ee public."DomainHistoryHost" [table] domain_history_history_revision_id int8 not null host_repo_id text domain_history_domain_repo_id text not null + + - - domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e - - - - - - - - - fka9woh3hu8gx5x0vly6bai327n - + domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e fka9woh3hu8gx5x0vly6bai327n + + - - domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e - - - - - - - - - fka9woh3hu8gx5x0vly6bai327n - + domainhistoryhost_9f3f23ee:w->domainhistory_a54cc226:e fka9woh3hu8gx5x0vly6bai327n + + - - domaintransactionrecord_6e77ff61 - - - public."DomainTransactionRecord" - - [table] - id - - bigserial not null - - auto-incremented - report_amount - - int4 not null - report_field - - text not null - reporting_time - - timestamptz not null - tld - - text not null - domain_repo_id - - text - history_revision_id - - int8 - - + domaintransactionrecord_6e77ff61 public."DomainTransactionRecord" [table] id bigserial not null auto-incremented report_amount int4 not null report_field text not null reporting_time timestamptz not null tld text not null domain_repo_id text history_revision_id int8 + + - - domaintransactionrecord_6e77ff61:w->tld_f1fa57e2:e - - - - - - - - - fk_domain_transaction_record_tld - + domaintransactionrecord_6e77ff61:w->tld_f1fa57e2:e fk_domain_transaction_record_tld + + - - featureflag_3ee43a78 - - - public."FeatureFlag" - - [table] - feature_name - - text not null - status - - hstore not null - - + featureflag_3ee43a78 public."FeatureFlag" [table] feature_name text not null status hstore not null + + - - graceperiodhistory_40ccc1f1 - - - public."GracePeriodHistory" - - [table] - grace_period_history_revision_id - - int8 not null - billing_event_id - - int8 - billing_recurrence_id - - int8 - registrar_id - - text not null - domain_repo_id - - text not null - expiration_time - - timestamptz not null - type - - text not null - domain_history_revision_id - - int8 - grace_period_id - - int8 not null - - + graceperiodhistory_40ccc1f1 public."GracePeriodHistory" [table] grace_period_history_revision_id int8 not null billing_event_id int8 billing_recurrence_id int8 registrar_id text not null domain_repo_id text not null expiration_time timestamptz not null type text not null domain_history_revision_id int8 grace_period_id int8 not null + + - - hosthistory_56210c2:w->host_f21b78de:e - - - - - - - - - fk_hosthistory_host - + hosthistory_56210c2:w->host_f21b78de:e fk_hosthistory_host + + - - hosthistory_56210c2:w->registrar_6e1503e3:e - - - - - - - - - fk_history_registrar_id - + hosthistory_56210c2:w->registrar_6e1503e3:e fk_history_registrar_id + + - - lock_f21d4861 - - - public."Lock" - - [table] - resource_name - - text not null - "scope" - - text not null - acquired_time - - timestamptz not null - expiration_time - - timestamptz not null - - + lock_f21d4861 public."Lock" [table] resource_name text not null "scope" text not null acquired_time timestamptz not null expiration_time timestamptz not null + + - - packagepromotion_56aa33 - - - public."PackagePromotion" - - [table] - package_promotion_id - - bigserial not null - - auto-incremented - last_notification_sent - - timestamptz - max_creates - - int4 not null - max_domains - - int4 not null - next_billing_date - - timestamptz not null - package_price_amount - - numeric(19, 2) not null - package_price_currency - - text not null - token - - text not null - - + packagepromotion_56aa33 public."PackagePromotion" [table] package_promotion_id bigserial not null auto-incremented last_notification_sent timestamptz max_creates int4 not null max_domains int4 not null next_billing_date timestamptz not null package_price_amount numeric(19, 2) not null package_price_currency text not null token text not null + + - - passwordresetrequest_8484e7b1 - - - public."PasswordResetRequest" - - [table] - type - - text not null - request_time - - timestamptz not null - requester - - text not null - fulfillment_time - - timestamptz - destination_email - - text not null - verification_code - - text not null - registrar_id - - text not null - - + passwordresetrequest_8484e7b1 public."PasswordResetRequest" [table] type text not null request_time timestamptz not null requester text not null fulfillment_time timestamptz destination_email text not null verification_code text not null registrar_id text not null + + - - premiumentry_b0060b91 - - - public."PremiumEntry" - - [table] - revision_id - - int8 not null - price - - numeric(19, 2) not null - domain_label - - text not null - - + premiumentry_b0060b91 public."PremiumEntry" [table] revision_id int8 not null price numeric(19, 2) not null domain_label text not null + + - - premiumlist_7c3ea68b - - - public."PremiumList" - - [table] - revision_id - - bigserial not null - - auto-incremented - creation_timestamp - - timestamptz - name - - text not null - bloom_filter - - bytea not null - currency - - text not null - - + premiumlist_7c3ea68b public."PremiumList" [table] revision_id bigserial not null auto-incremented creation_timestamp timestamptz name text not null bloom_filter bytea not null currency text not null + + - - premiumentry_b0060b91:w->premiumlist_7c3ea68b:e - - - - - - - - - fko0gw90lpo1tuee56l0nb6y6g5 - + premiumentry_b0060b91:w->premiumlist_7c3ea68b:e fko0gw90lpo1tuee56l0nb6y6g5 + + - - rderevision_83396864 - - - public."RdeRevision" - - [table] - tld - - text not null - mode - - text not null - "date" - - date not null - update_timestamp - - timestamptz - revision - - int4 not null - - + rderevision_83396864 public."RdeRevision" [table] tld text not null mode text not null "date" date not null update_timestamp timestamptz revision int4 not null + + - - registrarpoc_ab47054d - - - public."RegistrarPoc" - - [table] - email_address - - text not null - allowed_to_set_registry_lock_password - - bool not null - fax_number - - text - name - - text - phone_number - - text - registry_lock_password_hash - - text - registry_lock_password_salt - - text - types - - _text - visible_in_domain_whois_as_abuse - - bool not null - visible_in_whois_as_admin - - bool not null - visible_in_whois_as_tech - - bool not null - registry_lock_email_address - - text - registrar_id - - text not null - id - - bigserial not null - - auto-incremented - - + registrarpoc_ab47054d public."RegistrarPoc" [table] email_address text not null allowed_to_set_registry_lock_password bool fax_number text name text phone_number text registry_lock_password_hash text registry_lock_password_salt text types _text visible_in_domain_whois_as_abuse bool not null visible_in_whois_as_admin bool not null visible_in_whois_as_tech bool not null registry_lock_email_address text registrar_id text not null id bigserial not null auto-incremented + + - - registrarpoc_ab47054d:w->registrar_6e1503e3:e - - - - - - - - - fk_registrar_poc_registrar_id - + registrarpoc_ab47054d:w->registrar_6e1503e3:e fk_registrar_poc_registrar_id + + - - registrarupdatehistory_8a38bed4 - - - public."RegistrarUpdateHistory" - - [table] - history_revision_id - - int8 not null - history_modification_time - - timestamptz not null - history_method - - text not null - history_request_body - - text - history_type - - text not null - history_url - - text not null - allowed_tlds - - _text - billing_account_map - - hstore - block_premium_names - - bool not null - client_certificate - - text - client_certificate_hash - - text - contacts_require_syncing - - bool not null - creation_time - - timestamptz not null - drive_folder_id - - text - email_address - - text - failover_client_certificate - - text - failover_client_certificate_hash - - text - fax_number - - text - iana_identifier - - int8 - icann_referral_email - - text - i18n_address_city - - text - i18n_address_country_code - - text - i18n_address_state - - text - i18n_address_street_line1 - - text - i18n_address_street_line2 - - text - i18n_address_street_line3 - - text - i18n_address_zip - - text - ip_address_allow_list - - _text - last_certificate_update_time - - timestamptz - last_expiring_cert_notification_sent_date - - timestamptz - last_expiring_failover_cert_notification_sent_date - - timestamptz - localized_address_city - - text - localized_address_country_code - - text - localized_address_state - - text - localized_address_street_line1 - - text - localized_address_street_line2 - - text - localized_address_street_line3 - - text - localized_address_zip - - text - password_hash - - text - phone_number - - text - phone_passcode - - text - po_number - - text - rdap_base_urls - - _text - registrar_name - - text not null - registry_lock_allowed - - bool not null - password_salt - - text - state - - text - type - - text not null - url - - text - whois_server - - text - update_timestamp - - timestamptz - registrar_id - - text not null - history_acting_user - - text not null - - + registrarupdatehistory_8a38bed4 public."RegistrarUpdateHistory" [table] history_revision_id int8 not null history_modification_time timestamptz not null history_method text not null history_request_body text history_type text not null history_url text not null allowed_tlds _text billing_account_map hstore block_premium_names bool not null client_certificate text client_certificate_hash text contacts_require_syncing bool not null creation_time timestamptz not null drive_folder_id text email_address text failover_client_certificate text failover_client_certificate_hash text fax_number text iana_identifier int8 icann_referral_email text i18n_address_city text i18n_address_country_code text i18n_address_state text i18n_address_street_line1 text i18n_address_street_line2 text i18n_address_street_line3 text i18n_address_zip text ip_address_allow_list _text last_certificate_update_time timestamptz last_expiring_cert_notification_sent_date timestamptz last_expiring_failover_cert_notification_sent_date timestamptz localized_address_city text localized_address_country_code text localized_address_state text localized_address_street_line1 text localized_address_street_line2 text localized_address_street_line3 text localized_address_zip text password_hash text phone_number text phone_passcode text po_number text rdap_base_urls _text registrar_name text not null registry_lock_allowed bool not null password_salt text state text type text not null url text whois_server text update_timestamp timestamptz registrar_id text not null history_acting_user text not null + + - - registrarupdatehistory_8a38bed4:w->registrar_6e1503e3:e - - - - - - - - - fkregistrarupdatehistoryregistrarid - + registrarupdatehistory_8a38bed4:w->registrar_6e1503e3:e fkregistrarupdatehistoryregistrarid + + - - registrarpocupdatehistory_31e5d9aa - - - public."RegistrarPocUpdateHistory" - - [table] - history_revision_id - - int8 not null - history_modification_time - - timestamptz not null - history_method - - text not null - history_request_body - - text - history_type - - text not null - history_url - - text not null - email_address - - text not null - registrar_id - - text not null - allowed_to_set_registry_lock_password - - bool not null - fax_number - - text - login_email_address - - text - name - - text - phone_number - - text - registry_lock_email_address - - text - registry_lock_password_hash - - text - registry_lock_password_salt - - text - types - - _text - visible_in_domain_whois_as_abuse - - bool not null - visible_in_whois_as_admin - - bool not null - visible_in_whois_as_tech - - bool not null - history_acting_user - - text not null - - + registrarpocupdatehistory_31e5d9aa public."RegistrarPocUpdateHistory" [table] history_revision_id int8 not null history_modification_time timestamptz not null history_method text not null history_request_body text history_type text not null history_url text not null email_address text not null registrar_id text not null allowed_to_set_registry_lock_password bool not null fax_number text login_email_address text name text phone_number text registry_lock_email_address text registry_lock_password_hash text registry_lock_password_salt text types _text visible_in_domain_whois_as_abuse bool not null visible_in_whois_as_admin bool not null visible_in_whois_as_tech bool not null history_acting_user text not null + + - - registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e - - - - - - - - - fkregistrarpocupdatehistoryemailaddress - + registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e fkregistrarpocupdatehistoryemailaddress + + - - registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e - - - - - - - - - fkregistrarpocupdatehistoryemailaddress - + registrarpocupdatehistory_31e5d9aa:w->registrarpoc_ab47054d:e fkregistrarpocupdatehistoryemailaddress + + - - registrylock_ac88663e - - - public."RegistryLock" - - [table] - revision_id - - bigserial not null - - auto-incremented - lock_completion_time - - timestamptz - lock_request_time - - timestamptz not null - domain_name - - text not null - is_superuser - - bool not null - registrar_id - - text not null - registrar_poc_id - - text - repo_id - - text not null - verification_code - - text not null - unlock_request_time - - timestamptz - unlock_completion_time - - timestamptz - last_update_time - - timestamptz not null - relock_revision_id - - int8 - relock_duration - - interval - - + registrylock_ac88663e public."RegistryLock" [table] revision_id bigserial not null auto-incremented lock_completion_time timestamptz lock_request_time timestamptz not null domain_name text not null is_superuser bool not null registrar_id text not null registrar_poc_id text repo_id text not null verification_code text not null unlock_request_time timestamptz unlock_completion_time timestamptz last_update_time timestamptz not null relock_revision_id int8 relock_duration interval + + - - registrylock_ac88663e:w->registrylock_ac88663e:e - - - - - - - - - fk2lhcwpxlnqijr96irylrh1707 - + registrylock_ac88663e:w->registrylock_ac88663e:e fk2lhcwpxlnqijr96irylrh1707 + + - - reservedentry_1a7b8520 - - - public."ReservedEntry" - - [table] - revision_id - - int8 not null - comment - - text - reservation_type - - int4 not null - domain_label - - text not null - - + reservedentry_1a7b8520 public."ReservedEntry" [table] revision_id int8 not null comment text reservation_type int4 not null domain_label text not null + + - - reservedlist_b97c3f1c - - - public."ReservedList" - - [table] - revision_id - - bigserial not null - - auto-incremented - creation_timestamp - - timestamptz not null - name - - text not null - - + reservedlist_b97c3f1c public."ReservedList" [table] revision_id bigserial not null auto-incremented creation_timestamp timestamptz not null name text not null + + - - reservedentry_1a7b8520:w->reservedlist_b97c3f1c:e - - - - - - - - - fkgq03rk0bt1hb915dnyvd3vnfc - + reservedentry_1a7b8520:w->reservedlist_b97c3f1c:e fkgq03rk0bt1hb915dnyvd3vnfc + + - - serversecret_6cc90f09 - - - public."ServerSecret" - - [table] - secret - - uuid not null - id - - int8 not null - - + serversecret_6cc90f09 public."ServerSecret" [table] secret uuid not null id int8 not null + + - - signedmarkrevocationentry_99c39721 - - - public."SignedMarkRevocationEntry" - - [table] - revision_id - - int8 not null - revocation_time - - timestamptz not null - smd_id - - text not null - - + signedmarkrevocationentry_99c39721 public."SignedMarkRevocationEntry" [table] revision_id int8 not null revocation_time timestamptz not null smd_id text not null + + - - signedmarkrevocationlist_c5d968fb - - - public."SignedMarkRevocationList" - - [table] - revision_id - - bigserial not null - - auto-incremented - creation_time - - timestamptz - - + signedmarkrevocationlist_c5d968fb public."SignedMarkRevocationList" [table] revision_id bigserial not null auto-incremented creation_time timestamptz + + - - signedmarkrevocationentry_99c39721:w->signedmarkrevocationlist_c5d968fb:e - - - - - - - - - fk5ivlhvs3121yx2li5tqh54u4 - + signedmarkrevocationentry_99c39721:w->signedmarkrevocationlist_c5d968fb:e fk5ivlhvs3121yx2li5tqh54u4 + + - - spec11threatmatch_a61228a6 - - - public."Spec11ThreatMatch" - - [table] - id - - bigserial not null - - auto-incremented - check_date - - date not null - domain_name - - text not null - domain_repo_id - - text not null - registrar_id - - text not null - threat_types - - _text not null - tld - - text not null - - + spec11threatmatch_a61228a6 public."Spec11ThreatMatch" [table] id bigserial not null auto-incremented check_date date not null domain_name text not null domain_repo_id text not null registrar_id text not null threat_types _text not null tld text not null + + - - tmchcrl_d282355 - - - public."TmchCrl" - - [table] - certificate_revocations - - text not null - update_timestamp - - timestamptz not null - url - - text not null - id - - int8 not null - - + tmchcrl_d282355 public."TmchCrl" [table] certificate_revocations text not null update_timestamp timestamptz not null url text not null id int8 not null + + - - userupdatehistory_24efd476 - - - public."UserUpdateHistory" - - [table] - history_revision_id - - int8 not null - history_modification_time - - timestamptz not null - history_method - - text not null - history_request_body - - text - history_type - - text not null - history_url - - text not null - email_address - - text not null - registry_lock_password_hash - - text - registry_lock_password_salt - - text - global_role - - text not null - is_admin - - bool not null - registrar_roles - - hstore - update_timestamp - - timestamptz - history_acting_user - - text not null - registry_lock_email_address - - text - + userupdatehistory_24efd476 public."UserUpdateHistory" [table] history_revision_id int8 not null history_modification_time timestamptz not null history_method text not null history_request_body text history_type text not null history_url text not null email_address text not null registry_lock_password_hash text registry_lock_password_salt text global_role text not null is_admin bool not null registrar_roles hstore update_timestamp timestamptz history_acting_user text not null registry_lock_email_address text @@ -11239,7 +8059,7 @@ td.section { allowed_to_set_registry_lock_password - bool not null + bool diff --git a/db/src/main/resources/sql/flyway.txt b/db/src/main/resources/sql/flyway.txt index 2bb8c4f6e..6f6d38884 100644 --- a/db/src/main/resources/sql/flyway.txt +++ b/db/src/main/resources/sql/flyway.txt @@ -194,3 +194,4 @@ V193__password_reset_request.sql V194__password_reset_request_registrar.sql V195__registrar_poc_id.sql V196__tld_expiry_access_period_enabled.sql +V197__poc_rlock_drop_not_null.sql diff --git a/db/src/main/resources/sql/flyway/V197__poc_rlock_drop_not_null.sql b/db/src/main/resources/sql/flyway/V197__poc_rlock_drop_not_null.sql new file mode 100644 index 000000000..98fc4b8b9 --- /dev/null +++ b/db/src/main/resources/sql/flyway/V197__poc_rlock_drop_not_null.sql @@ -0,0 +1,16 @@ +-- 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. + +-- In order to remove the field from the Java class it needs to be nullable +ALTER table "RegistrarPoc" ALTER column allowed_to_set_registry_lock_password DROP NOT NULL; diff --git a/db/src/main/resources/sql/schema/db-schema.sql.generated b/db/src/main/resources/sql/schema/db-schema.sql.generated index 3755f6116..92acc15b4 100644 --- a/db/src/main/resources/sql/schema/db-schema.sql.generated +++ b/db/src/main/resources/sql/schema/db-schema.sql.generated @@ -688,9 +688,6 @@ id bigint, name text, phone_number text, - registry_lock_email_address text, - registry_lock_password_hash text, - registry_lock_password_salt text, types text[], visible_in_domain_whois_as_abuse boolean not null, visible_in_whois_as_admin boolean not null, diff --git a/db/src/main/resources/sql/schema/nomulus.golden.sql b/db/src/main/resources/sql/schema/nomulus.golden.sql index a27a8031a..822abbf8e 100644 --- a/db/src/main/resources/sql/schema/nomulus.golden.sql +++ b/db/src/main/resources/sql/schema/nomulus.golden.sql @@ -1009,7 +1009,7 @@ CREATE TABLE public."Registrar" ( CREATE TABLE public."RegistrarPoc" ( email_address text NOT NULL, - allowed_to_set_registry_lock_password boolean NOT NULL, + allowed_to_set_registry_lock_password boolean, fax_number text, name text, phone_number text, diff --git a/docs/console-endpoints/console-api-swagger.json b/docs/console-endpoints/console-api-swagger.json index c7202b665..1e66afa18 100644 --- a/docs/console-endpoints/console-api-swagger.json +++ b/docs/console-endpoints/console-api-swagger.json @@ -379,9 +379,9 @@ "type": "string", "description": "Name of the domain." }, - "registrarPocId": { + "registryLockEmail": { "type": "string", - "description": "Registrar point of contact ID." + "description": "Email address of the requester." }, "lockRequestTime": { "type": "object",