mirror of
https://github.com/google/nomulus.git
synced 2025-05-28 16:30:12 +02:00
Make WHOIS domain query return conform to ICANN CL&D policy
ICANN's policy can be found here: https://www.icann.org/resources/pages/rdds-labeling-policy-2017-02-01-en ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=155375811
This commit is contained in:
parent
2846f9c6b9
commit
8892656722
21 changed files with 175 additions and 138 deletions
|
@ -24,6 +24,7 @@ import com.google.common.base.Function;
|
|||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.googlecode.objectify.Key;
|
||||
import google.registry.model.contact.ContactPhoneNumber;
|
||||
import google.registry.model.contact.ContactResource;
|
||||
|
@ -34,8 +35,10 @@ import google.registry.model.domain.DomainResource;
|
|||
import google.registry.model.domain.GracePeriod;
|
||||
import google.registry.model.eppcommon.StatusValue;
|
||||
import google.registry.model.registrar.Registrar;
|
||||
import google.registry.model.registrar.RegistrarContact;
|
||||
import google.registry.model.translators.EnumToAttributeAdapter.EppEnum;
|
||||
import google.registry.util.FormattingLogger;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import javax.annotation.Nullable;
|
||||
import org.joda.time.DateTime;
|
||||
|
@ -64,39 +67,60 @@ final class DomainWhoisResponse extends WhoisResponseImpl {
|
|||
@Override
|
||||
public WhoisResponseResults getResponse(final boolean preferUnicode, String disclaimer) {
|
||||
Registrar registrar = getRegistrar(domain.getCurrentSponsorClientId());
|
||||
String plaintext = new DomainEmitter()
|
||||
.emitField(
|
||||
"Domain Name", maybeFormatHostname(domain.getFullyQualifiedDomainName(), preferUnicode))
|
||||
.emitField("Domain ID", domain.getRepoId())
|
||||
.emitField("WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Referral URL", registrar.getReferralUrl())
|
||||
.emitField("Updated Date", getFormattedString(domain.getLastEppUpdateTime()))
|
||||
.emitField("Creation Date", getFormattedString(domain.getCreationTime()))
|
||||
.emitField(
|
||||
"Registry Expiry Date", getFormattedString(domain.getRegistrationExpirationTime()))
|
||||
.emitField("Sponsoring Registrar", registrar.getRegistrarName())
|
||||
.emitField(
|
||||
"Sponsoring Registrar IANA ID",
|
||||
registrar.getIanaIdentifier() == null ? null : registrar.getIanaIdentifier().toString())
|
||||
.emitStatusValues(domain.getStatusValues(), domain.getGracePeriods())
|
||||
.emitContact("Registrant", domain.getRegistrant(), preferUnicode)
|
||||
.emitContact("Admin", getContactReference(Type.ADMIN), preferUnicode)
|
||||
.emitContact("Tech", getContactReference(Type.TECH), preferUnicode)
|
||||
.emitContact("Billing", getContactReference(Type.BILLING), preferUnicode)
|
||||
.emitSet(
|
||||
"Name Server",
|
||||
domain.loadNameserverFullyQualifiedHostNames(),
|
||||
new Function<String, String>() {
|
||||
Optional<RegistrarContact> abuseContact =
|
||||
Iterables.tryFind(
|
||||
registrar.getContacts(),
|
||||
new Predicate<RegistrarContact>() {
|
||||
@Override
|
||||
public String apply(String hostName) {
|
||||
return maybeFormatHostname(hostName, preferUnicode);
|
||||
public boolean apply(@Nullable RegistrarContact contact) {
|
||||
return contact.getVisibleInDomainWhoisAsAbuse();
|
||||
}
|
||||
})
|
||||
.emitField("DNSSEC", isNullOrEmpty(domain.getDsData()) ? "unsigned" : "signedDelegation")
|
||||
.emitLastUpdated(getTimestamp())
|
||||
.emitAwipMessage()
|
||||
.emitFooter(disclaimer)
|
||||
.toString();
|
||||
});
|
||||
String plaintext =
|
||||
new DomainEmitter()
|
||||
.emitField(
|
||||
"Domain Name",
|
||||
maybeFormatHostname(domain.getFullyQualifiedDomainName(), preferUnicode))
|
||||
.emitField("Registry Domain ID", domain.getRepoId())
|
||||
.emitField("Registrar WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Registrar URL", registrar.getReferralUrl())
|
||||
.emitField("Updated Date", getFormattedString(domain.getLastEppUpdateTime()))
|
||||
.emitField("Creation Date", getFormattedString(domain.getCreationTime()))
|
||||
.emitField(
|
||||
"Registry Expiry Date", getFormattedString(domain.getRegistrationExpirationTime()))
|
||||
.emitField("Registrar", registrar.getRegistrarName())
|
||||
.emitField(
|
||||
"Registrar IANA ID",
|
||||
Objects.toString(registrar.getIanaIdentifier(), ""))
|
||||
// Email address is a required field for registrar contacts. Therefore as long as there
|
||||
// is an abuse contact, we can get an email address from it.
|
||||
.emitField(
|
||||
"Registrar Abuse Contact Email",
|
||||
abuseContact.isPresent() ? abuseContact.get().getEmailAddress() : null)
|
||||
.emitField(
|
||||
"Registrar Abuse Contact Phone",
|
||||
abuseContact.isPresent() ? abuseContact.get().getPhoneNumber() : null)
|
||||
.emitStatusValues(domain.getStatusValues(), domain.getGracePeriods())
|
||||
.emitContact("Registrant", domain.getRegistrant(), preferUnicode)
|
||||
.emitContact("Admin", getContactReference(Type.ADMIN), preferUnicode)
|
||||
.emitContact("Tech", getContactReference(Type.TECH), preferUnicode)
|
||||
.emitContact("Billing", getContactReference(Type.BILLING), preferUnicode)
|
||||
.emitSet(
|
||||
"Name Server",
|
||||
domain.loadNameserverFullyQualifiedHostNames(),
|
||||
new Function<String, String>() {
|
||||
@Override
|
||||
public String apply(String hostName) {
|
||||
return maybeFormatHostname(hostName, preferUnicode);
|
||||
}
|
||||
})
|
||||
.emitField(
|
||||
"DNSSEC", isNullOrEmpty(domain.getDsData()) ? "unsigned" : "signedDelegation")
|
||||
.emitWicfLink()
|
||||
.emitLastUpdated(getTimestamp())
|
||||
.emitAwipMessage()
|
||||
.emitFooter(disclaimer)
|
||||
.toString();
|
||||
return WhoisResponseResults.create(plaintext, 1);
|
||||
}
|
||||
|
||||
|
@ -139,7 +163,7 @@ final class DomainWhoisResponse extends WhoisResponseImpl {
|
|||
domain.getFullyQualifiedDomainName(), contact);
|
||||
return this;
|
||||
}
|
||||
emitField(contactType, "ID", contactResource.getContactId());
|
||||
emitField("Registry", contactType, "ID", contactResource.getContactId());
|
||||
PostalInfo postalInfo = chooseByUnicodePreference(
|
||||
preferUnicode,
|
||||
contactResource.getLocalizedPostalInfo(),
|
||||
|
|
|
@ -55,17 +55,20 @@ final class NameserverWhoisResponse extends WhoisResponseImpl {
|
|||
: host.getPersistedCurrentSponsorClientId();
|
||||
Registrar registrar = getRegistrar(clientId);
|
||||
emitter
|
||||
.emitField("Server Name", maybeFormatHostname(
|
||||
host.getFullyQualifiedHostName(), preferUnicode))
|
||||
.emitSet("IP Address", host.getInetAddresses(),
|
||||
.emitField(
|
||||
"Server Name", maybeFormatHostname(host.getFullyQualifiedHostName(), preferUnicode))
|
||||
.emitSet(
|
||||
"IP Address",
|
||||
host.getInetAddresses(),
|
||||
new Function<InetAddress, String>() {
|
||||
@Override
|
||||
public String apply(InetAddress addr) {
|
||||
return InetAddresses.toAddrString(addr);
|
||||
}})
|
||||
}
|
||||
})
|
||||
.emitField("Registrar", registrar.getRegistrarName())
|
||||
.emitField("WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Referral URL", registrar.getReferralUrl());
|
||||
.emitField("Registrar WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Registrar URL", registrar.getReferralUrl());
|
||||
if (i < hosts.size() - 1) {
|
||||
emitter.emitNewline();
|
||||
}
|
||||
|
|
|
@ -45,23 +45,24 @@ class RegistrarWhoisResponse extends WhoisResponseImpl {
|
|||
@Override
|
||||
public WhoisResponseResults getResponse(boolean preferUnicode, String disclaimer) {
|
||||
Set<RegistrarContact> contacts = registrar.getContacts();
|
||||
String plaintext = new RegistrarEmitter()
|
||||
.emitField("Registrar Name", registrar.getRegistrarName())
|
||||
.emitAddress(
|
||||
null,
|
||||
chooseByUnicodePreference(
|
||||
preferUnicode,
|
||||
registrar.getLocalizedAddress(),
|
||||
registrar.getInternationalizedAddress()))
|
||||
.emitPhonesAndEmail(
|
||||
registrar.getPhoneNumber(), registrar.getFaxNumber(), registrar.getEmailAddress())
|
||||
.emitField("WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Referral URL", registrar.getReferralUrl())
|
||||
.emitRegistrarContacts("Admin", contacts, AdminOrTech.ADMIN)
|
||||
.emitRegistrarContacts("Technical", contacts, AdminOrTech.TECH)
|
||||
.emitLastUpdated(getTimestamp())
|
||||
.emitFooter(disclaimer)
|
||||
.toString();
|
||||
String plaintext =
|
||||
new RegistrarEmitter()
|
||||
.emitField("Registrar", registrar.getRegistrarName())
|
||||
.emitAddress(
|
||||
null,
|
||||
chooseByUnicodePreference(
|
||||
preferUnicode,
|
||||
registrar.getLocalizedAddress(),
|
||||
registrar.getInternationalizedAddress()))
|
||||
.emitPhonesAndEmail(
|
||||
registrar.getPhoneNumber(), registrar.getFaxNumber(), registrar.getEmailAddress())
|
||||
.emitField("Registrar WHOIS Server", registrar.getWhoisServer())
|
||||
.emitField("Registrar URL", registrar.getReferralUrl())
|
||||
.emitRegistrarContacts("Admin", contacts, AdminOrTech.ADMIN)
|
||||
.emitRegistrarContacts("Technical", contacts, AdminOrTech.TECH)
|
||||
.emitLastUpdated(getTimestamp())
|
||||
.emitFooter(disclaimer)
|
||||
.toString();
|
||||
return WhoisResponseResults.create(plaintext, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -40,10 +40,10 @@ abstract class WhoisResponseImpl implements WhoisResponse {
|
|||
|
||||
/** Field name for ICANN problem reporting URL appended to all WHOIS responses. */
|
||||
private static final String ICANN_REPORTING_URL_FIELD =
|
||||
"URL of the ICANN WHOIS Data Problem Reporting System";
|
||||
"URL of the ICANN Whois Inaccuracy Complaint Form";
|
||||
|
||||
/** ICANN problem reporting URL appended to all WHOIS responses. */
|
||||
private static final String ICANN_REPORTING_URL = "http://wdprs.internic.net/";
|
||||
private static final String ICANN_REPORTING_URL = "https://www.icann.org/wicf/";
|
||||
|
||||
private static final Registrar EMPTY_REGISTRAR = new Supplier<Registrar>() {
|
||||
@Override
|
||||
|
@ -147,6 +147,12 @@ abstract class WhoisResponseImpl implements WhoisResponse {
|
|||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
/** Emit Whois Inaccuracy Complaint Form link. Only used for domain queries. */
|
||||
E emitWicfLink() {
|
||||
emitField(ICANN_REPORTING_URL_FIELD, ICANN_REPORTING_URL);
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
/** Returns raw text that should be appended to the end of ALL WHOIS responses. */
|
||||
E emitLastUpdated(DateTime timestamp) {
|
||||
// We are assuming that our WHOIS database is always completely up to date, since it's
|
||||
|
@ -160,8 +166,7 @@ abstract class WhoisResponseImpl implements WhoisResponse {
|
|||
|
||||
/** Returns raw text that should be appended to the end of ALL WHOIS responses. */
|
||||
E emitFooter(String disclaimer) {
|
||||
emitField(ICANN_REPORTING_URL_FIELD, ICANN_REPORTING_URL);
|
||||
stringBuilder.append("\r\n").append(disclaimer).append("\r\n");
|
||||
stringBuilder.append(disclaimer).append("\r\n");
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue