diff --git a/java/google/registry/model/registrar/RegistrarContact.java b/java/google/registry/model/registrar/RegistrarContact.java index 0040bfaa1..acc6c437f 100644 --- a/java/google/registry/model/registrar/RegistrarContact.java +++ b/java/google/registry/model/registrar/RegistrarContact.java @@ -123,15 +123,22 @@ public class RegistrarContact extends ImmutableObject implements Jsonifiable { String gaeUserId; /** - * Whether this contact is publicly visible in WHOIS results as an Admin contact. + * Whether this contact is publicly visible in WHOIS registrar query results as an Admin contact. */ boolean visibleInWhoisAsAdmin = false; /** - * Whether this contact is publicly visible in WHOIS results as a Technical contact. + * Whether this contact is publicly visible in WHOIS registrar query results as a Technical + * contact. */ boolean visibleInWhoisAsTech = false; + /** + * Whether this contact's phone number and email address is publicly visible in WHOIS domain query + * results as registrar abuse contact info. + */ + boolean visibleInDomainWhoisAsAbuse = false; + public static ImmutableSet typesFromCSV(String csv) { return typesFromStrings(Arrays.asList(csv.split(","))); } @@ -193,6 +200,10 @@ public class RegistrarContact extends ImmutableObject implements Jsonifiable { return visibleInWhoisAsTech; } + public boolean getVisibleInDomainWhoisAsAbuse() { + return visibleInDomainWhoisAsAbuse; + } + public String getGaeUserId() { return gaeUserId; } @@ -225,12 +236,20 @@ public class RegistrarContact extends ImmutableObject implements Jsonifiable { result.append("Fax: ").append(getFaxNumber()).append('\n'); } result.append("Types: ").append(getTypes()).append('\n'); - result.append("Visible in WHOIS as Admin contact: ") + result + .append("Visible in registrar WHOIS query as Admin contact: ") .append(getVisibleInWhoisAsAdmin() ? "Yes" : "No") .append("\n"); - result.append("Visible in WHOIS as Technical contact: ") + result + .append("Visible in registrar WHOIS query as Technical contact: ") .append(getVisibleInWhoisAsTech() ? "Yes" : "No") .append("\n"); + result + .append( + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: ") + .append(getVisibleInDomainWhoisAsAbuse() ? "Yes" : "No") + .append("\n"); if (getGaeUserId() != null) { result.append("GAE-UserID: ").append(getGaeUserId()).append('\n'); } @@ -247,6 +266,7 @@ public class RegistrarContact extends ImmutableObject implements Jsonifiable { .put("types", Joiner.on(',').join(transform(getTypes(), toStringFunction()))) .put("visibleInWhoisAsAdmin", visibleInWhoisAsAdmin) .put("visibleInWhoisAsTech", visibleInWhoisAsTech) + .put("visibleInDomainWhoisAsAbuse", visibleInDomainWhoisAsAbuse) .put("gaeUserId", gaeUserId) .build(); } @@ -311,6 +331,11 @@ public class RegistrarContact extends ImmutableObject implements Jsonifiable { return this; } + public Builder setVisibleInDomainWhoisAsAbuse(boolean visible) { + getInstance().visibleInDomainWhoisAsAbuse = visible; + return this; + } + public Builder setGaeUserId(String gaeUserId) { getInstance().gaeUserId = gaeUserId; return this; diff --git a/java/google/registry/ui/server/RegistrarFormFields.java b/java/google/registry/ui/server/RegistrarFormFields.java index 8fe53f9d2..22d670d0b 100644 --- a/java/google/registry/ui/server/RegistrarFormFields.java +++ b/java/google/registry/ui/server/RegistrarFormFields.java @@ -208,6 +208,10 @@ public final class RegistrarFormFields { FormField.named("visibleInWhoisAsTech", Boolean.class) .build(); + public static final FormField + PHONE_AND_EMAIL_VISIBLE_IN_DOMAIN_WHOIS_AS_ABUSE_FIELD = + FormField.named("visibleInDomainWhoisAsAbuse", Boolean.class).build(); + public static final FormField CONTACT_PHONE_NUMBER_FIELD = FormFields.PHONE_NUMBER.asBuilder() .build(); @@ -228,42 +232,50 @@ public final class RegistrarFormFields { .build(); public static final Function, RegistrarContact.Builder> - REGISTRAR_CONTACT_TRANSFORM = new Function, RegistrarContact.Builder>() { - @Nullable - @Override - public RegistrarContact.Builder apply(@Nullable Map args) { - if (args == null) { - return null; - } - RegistrarContact.Builder builder = new RegistrarContact.Builder(); - for (String name : CONTACT_NAME_FIELD.extractUntyped(args).asSet()) { - builder.setName(name); - } - for (String emailAddress : CONTACT_EMAIL_ADDRESS_FIELD.extractUntyped(args).asSet()) { - builder.setEmailAddress(emailAddress); - } - for (Boolean visible : - CONTACT_VISIBLE_IN_WHOIS_AS_ADMIN_FIELD.extractUntyped(args).asSet()) { - builder.setVisibleInWhoisAsAdmin(visible); - } - for (Boolean visible : - CONTACT_VISIBLE_IN_WHOIS_AS_TECH_FIELD.extractUntyped(args).asSet()) { - builder.setVisibleInWhoisAsTech(visible); - } - for (String phoneNumber : CONTACT_PHONE_NUMBER_FIELD.extractUntyped(args).asSet()) { - builder.setPhoneNumber(phoneNumber); - } - for (String faxNumber : CONTACT_FAX_NUMBER_FIELD.extractUntyped(args).asSet()) { - builder.setFaxNumber(faxNumber); - } - for (Set types : CONTACT_TYPES.extractUntyped(args).asSet()) { - builder.setTypes(types); - } - for (String gaeUserId : CONTACT_GAE_USER_ID_FIELD.extractUntyped(args).asSet()) { - builder.setGaeUserId(gaeUserId); - } - return builder; - }}; + REGISTRAR_CONTACT_TRANSFORM = + new Function, RegistrarContact.Builder>() { + @Nullable + @Override + public RegistrarContact.Builder apply(@Nullable Map args) { + if (args == null) { + return null; + } + RegistrarContact.Builder builder = new RegistrarContact.Builder(); + for (String name : CONTACT_NAME_FIELD.extractUntyped(args).asSet()) { + builder.setName(name); + } + for (String emailAddress : CONTACT_EMAIL_ADDRESS_FIELD.extractUntyped(args).asSet()) { + builder.setEmailAddress(emailAddress); + } + for (Boolean visible : + CONTACT_VISIBLE_IN_WHOIS_AS_ADMIN_FIELD.extractUntyped(args).asSet()) { + builder.setVisibleInWhoisAsAdmin(visible); + } + for (Boolean visible : + CONTACT_VISIBLE_IN_WHOIS_AS_TECH_FIELD.extractUntyped(args).asSet()) { + builder.setVisibleInWhoisAsTech(visible); + } + for (Boolean visible : + PHONE_AND_EMAIL_VISIBLE_IN_DOMAIN_WHOIS_AS_ABUSE_FIELD + .extractUntyped(args) + .asSet()) { + builder.setVisibleInDomainWhoisAsAbuse(visible); + } + for (String phoneNumber : CONTACT_PHONE_NUMBER_FIELD.extractUntyped(args).asSet()) { + builder.setPhoneNumber(phoneNumber); + } + for (String faxNumber : CONTACT_FAX_NUMBER_FIELD.extractUntyped(args).asSet()) { + builder.setFaxNumber(faxNumber); + } + for (Set types : CONTACT_TYPES.extractUntyped(args).asSet()) { + builder.setTypes(types); + } + for (String gaeUserId : CONTACT_GAE_USER_ID_FIELD.extractUntyped(args).asSet()) { + builder.setGaeUserId(gaeUserId); + } + return builder; + } + }; public static final FormField>, List> CONTACTS_FIELD = FormField.mapNamed("contacts") diff --git a/javatests/google/registry/export/sheet/SyncRegistrarsSheetTest.java b/javatests/google/registry/export/sheet/SyncRegistrarsSheetTest.java index ea01ee9f2..ed5c27aa0 100644 --- a/javatests/google/registry/export/sheet/SyncRegistrarsSheetTest.java +++ b/javatests/google/registry/export/sheet/SyncRegistrarsSheetTest.java @@ -203,49 +203,71 @@ public class SyncRegistrarsSheetTest { assertThat(row).containsEntry("state", "SUSPENDED"); assertThat(row).containsEntry("ianaIdentifier", "8"); assertThat(row).containsEntry("billingIdentifier", ""); - assertThat(row).containsEntry("primaryContacts", "" - + "Jane Doe\n" - + "contact@example.com\n" - + "Tel: +1.1234567890\n" - + "Types: [ADMIN, BILLING]\n" - + "Visible in WHOIS as Admin contact: No\n" - + "Visible in WHOIS as Technical contact: No\n" - + "\n" - + "John Doe\n" - + "john.doe@example.tld\n" - + "Tel: +1.1234567890\n" - + "Fax: +1.1234567891\n" - + "Types: [ADMIN]\n" - + "Visible in WHOIS as Admin contact: No\n" - + "Visible in WHOIS as Technical contact: Yes\n" - + "GAE-UserID: light\n"); - assertThat(row).containsEntry("techContacts", "" - + "Jane Smith\n" - + "pride@example.net\n" - + "Types: [TECH]\n" - + "Visible in WHOIS as Admin contact: No\n" - + "Visible in WHOIS as Technical contact: No\n"); + assertThat(row) + .containsEntry( + "primaryContacts", + "" + + "Jane Doe\n" + + "contact@example.com\n" + + "Tel: +1.1234567890\n" + + "Types: [ADMIN, BILLING]\n" + + "Visible in registrar WHOIS query as Admin contact: No\n" + + "Visible in registrar WHOIS query as Technical contact: No\n" + + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: No\n" + + "\n" + + "John Doe\n" + + "john.doe@example.tld\n" + + "Tel: +1.1234567890\n" + + "Fax: +1.1234567891\n" + + "Types: [ADMIN]\n" + + "Visible in registrar WHOIS query as Admin contact: No\n" + + "Visible in registrar WHOIS query as Technical contact: Yes\n" + + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: No\n" + + "GAE-UserID: light\n"); + assertThat(row) + .containsEntry( + "techContacts", + "" + + "Jane Smith\n" + + "pride@example.net\n" + + "Types: [TECH]\n" + + "Visible in registrar WHOIS query as Admin contact: No\n" + + "Visible in registrar WHOIS query as Technical contact: No\n" + + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: No\n"); assertThat(row).containsEntry("marketingContacts", ""); assertThat(row).containsEntry("abuseContacts", ""); assertThat(row).containsEntry("whoisInquiryContacts", ""); assertThat(row).containsEntry("legalContacts", ""); - assertThat(row).containsEntry("billingContacts", "" - + "Jane Doe\n" - + "contact@example.com\n" - + "Tel: +1.1234567890\n" - + "Types: [ADMIN, BILLING]\n" - + "Visible in WHOIS as Admin contact: No\n" - + "Visible in WHOIS as Technical contact: No\n"); + assertThat(row) + .containsEntry( + "billingContacts", + "" + + "Jane Doe\n" + + "contact@example.com\n" + + "Tel: +1.1234567890\n" + + "Types: [ADMIN, BILLING]\n" + + "Visible in registrar WHOIS query as Admin contact: No\n" + + "Visible in registrar WHOIS query as Technical contact: No\n" + + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: No\n"); assertThat(row).containsEntry("contactsMarkedAsWhoisAdmin", ""); - assertThat(row).containsEntry("contactsMarkedAsWhoisTech", "" - + "John Doe\n" - + "john.doe@example.tld\n" - + "Tel: +1.1234567890\n" - + "Fax: +1.1234567891\n" - + "Types: [ADMIN]\n" - + "Visible in WHOIS as Admin contact: No\n" - + "Visible in WHOIS as Technical contact: Yes\n" - + "GAE-UserID: light\n"); + assertThat(row) + .containsEntry( + "contactsMarkedAsWhoisTech", + "" + + "John Doe\n" + + "john.doe@example.tld\n" + + "Tel: +1.1234567890\n" + + "Fax: +1.1234567891\n" + + "Types: [ADMIN]\n" + + "Visible in registrar WHOIS query as Admin contact: No\n" + + "Visible in registrar WHOIS query as Technical contact: Yes\n" + + "Phone number and email visible in domain WHOIS query as " + + "Registrar Abuse contact info: No\n" + + "GAE-UserID: light\n"); assertThat(row).containsEntry("emailAddress", "nowhere@example.org"); assertThat(row).containsEntry( "address.street", "I get fallen back upon since there's no l10n addr"); diff --git a/javatests/google/registry/model/schema.txt b/javatests/google/registry/model/schema.txt index d1bcf374d..4ec26a6e9 100644 --- a/javatests/google/registry/model/schema.txt +++ b/javatests/google/registry/model/schema.txt @@ -659,6 +659,7 @@ class google.registry.model.registrar.RegistrarAddress { class google.registry.model.registrar.RegistrarContact { @Id java.lang.String emailAddress; @Parent com.googlecode.objectify.Key parent; + boolean visibleInDomainWhoisAsAbuse; boolean visibleInWhoisAsAdmin; boolean visibleInWhoisAsTech; java.lang.String faxNumber; diff --git a/javatests/google/registry/tools/RegistrarContactCommandTest.java b/javatests/google/registry/tools/RegistrarContactCommandTest.java index e70f2a55f..af7c7c940 100644 --- a/javatests/google/registry/tools/RegistrarContactCommandTest.java +++ b/javatests/google/registry/tools/RegistrarContactCommandTest.java @@ -61,8 +61,10 @@ public class RegistrarContactCommandTest extends CommandTestCase [+1.2223334444, +1.2223335555] emailAddress -> [new.registrar@example.com, thase@the.registrar] contacts -> ADDED: - {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=Extra Terrestrial, emailAddress=etphonehome@example.com, phoneNumber=null, faxNumber=null, types=[ADMIN, BILLING, TECH, WHOIS], gaeUserId=null, visibleInWhoisAsAdmin=true, visibleInWhoisAsTech=false} + {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=Extra Terrestrial, emailAddress=etphonehome@example.com, phoneNumber=null, faxNumber=null, types=[ADMIN, BILLING, TECH, WHOIS], gaeUserId=null, visibleInWhoisAsAdmin=true, visibleInWhoisAsTech=false, visibleInDomainWhoisAsAbuse=false} REMOVED: - {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=John Doe, emailAddress=johndoe@theregistrar.com, phoneNumber=+1.1234567890, faxNumber=null, types=[ADMIN], gaeUserId=31337, visibleInWhoisAsAdmin=false, visibleInWhoisAsTech=false} + {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=John Doe, emailAddress=johndoe@theregistrar.com, phoneNumber=+1.1234567890, faxNumber=null, types=[ADMIN], gaeUserId=31337, visibleInWhoisAsAdmin=false, visibleInWhoisAsTech=false, visibleInDomainWhoisAsAbuse=false} FINAL CONTENTS: - {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=Extra Terrestrial, emailAddress=etphonehome@example.com, phoneNumber=null, faxNumber=null, types=[ADMIN, BILLING, TECH, WHOIS], gaeUserId=null, visibleInWhoisAsAdmin=true, visibleInWhoisAsTech=false} + {parent=Key(EntityGroupRoot("cross-tld")/Registrar("TheRegistrar")), name=Extra Terrestrial, emailAddress=etphonehome@example.com, phoneNumber=null, faxNumber=null, types=[ADMIN, BILLING, TECH, WHOIS], gaeUserId=null, visibleInWhoisAsAdmin=true, visibleInWhoisAsTech=false, visibleInDomainWhoisAsAbuse=false}