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",