Skip to content

Adds support for validating idn-hostname and idn-email #775

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/networknt/schema/JsonMetaSchema.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.networknt.schema.format.DateFormat;
import com.networknt.schema.format.EmailFormat;
import com.networknt.schema.format.IdnEmailFormat;
import com.networknt.schema.format.IdnHostnameFormat;
import com.networknt.schema.format.IriFormat;
import com.networknt.schema.format.IriReferenceFormat;
import com.networknt.schema.format.PatternFormat;
Expand Down Expand Up @@ -59,6 +61,8 @@ static PatternFormat pattern(String name, String regex) {
COMMON_BUILTIN_FORMATS.add(pattern("uuid", "^\\p{XDigit}{8}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{12}$", "must be a valid RFC 4122 UUID"));
COMMON_BUILTIN_FORMATS.add(new DateFormat());
COMMON_BUILTIN_FORMATS.add(new EmailFormat());
COMMON_BUILTIN_FORMATS.add(new IdnEmailFormat());
COMMON_BUILTIN_FORMATS.add(new IdnHostnameFormat());
COMMON_BUILTIN_FORMATS.add(new IriFormat());
COMMON_BUILTIN_FORMATS.add(new IriReferenceFormat());
COMMON_BUILTIN_FORMATS.add(new RegexFormat());
Expand Down
16 changes: 1 addition & 15 deletions src/main/java/com/networknt/schema/format/EmailFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,11 @@ public class EmailFormat extends AbstractFormat {

public EmailFormat() {
super("email", "must be a valid RFC 5321 Mailbox");
this.emailValidator = new SpecialEmailValidator(true, true);
this.emailValidator = new IPv6AwareEmailValidator(true, true);
}

@Override
public boolean matches(String value) {
return this.emailValidator.isValid(value);
}

static class SpecialEmailValidator extends EmailValidator {
private static final long serialVersionUID = 1L;

public SpecialEmailValidator(boolean b, boolean c) {
super(b, c);
}

@Override
protected boolean isValidDomain(String domain) {
return super.isValidDomain(domain.startsWith("[IPv6:") ? domain.replace("IPv6:", "") : domain);
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.networknt.schema.format;

import com.networknt.org.apache.commons.validator.routines.DomainValidator;
import com.networknt.org.apache.commons.validator.routines.EmailValidator;

/**
* This is an extension of the Apache Commons Validator that correctly
* handles email addresses containing an IPv6 literal as the domain.
* <p>
* Apache's {@link EmailValidator} delegates validation of the domain to
* its {@link DomainValidator}, which is not aware that it is validating
* an email address, which has a peculiar way of representing an IPv6
* literal.
*/
class IPv6AwareEmailValidator extends EmailValidator {
private static final long serialVersionUID = 1L;

/**
* Creates a new IPv6AwareEmailValidator.
*
* @param allowLocal Should local addresses be considered valid?
* @param allowTld Should TLDs be allowed?
*/
public IPv6AwareEmailValidator(final boolean allowLocal, final boolean allowTld) {
super(allowLocal, allowTld);
}

@Override
protected boolean isValidDomain(String domain) {
return super.isValidDomain(domain.startsWith("[IPv6:") ? domain.replace("IPv6:", "") : domain);
}

}
19 changes: 19 additions & 0 deletions src/main/java/com/networknt/schema/format/IdnEmailFormat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.networknt.schema.format;

import com.networknt.org.apache.commons.validator.routines.EmailValidator;

public class IdnEmailFormat extends AbstractFormat {

private final EmailValidator emailValidator;

public IdnEmailFormat() {
super("idn-email", "must be a valid RFC 6531 Mailbox");
this.emailValidator = new IPv6AwareEmailValidator(true, true);
}

@Override
public boolean matches(String value) {
return this.emailValidator.isValid(value);
}

}
16 changes: 16 additions & 0 deletions src/main/java/com/networknt/schema/format/IdnHostnameFormat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.networknt.schema.format;

import com.networknt.schema.utils.RFC5892;

public class IdnHostnameFormat extends AbstractFormat {

public IdnHostnameFormat() {
super("idn-hostname", "must be a valid RFC 5890 internationalized hostname");
}

@Override
public boolean matches(String value) {
if (null == value || value.isEmpty()) return true;
return RFC5892.isValid(value);
}
}
Loading