4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * The contents of this file are subject to the terms
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * of the Common Development and Distribution License
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * (the License). You may not use this file except in
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * compliance with the License.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * You can obtain a copy of the License at
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * https://opensso.dev.java.net/public/CDDLv1.0.html or
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * See the License for the specific language governing
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * permission and limitations under the License.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * When distributing Covered Code, include this CDDL
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Header Notice in each file and include the License file
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * If applicable, add the following below the CDDL Header,
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * with the fields enclosed by brackets [] replaced by
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * your own identifying information:
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * "Portions Copyrighted [year] [name of copyright owner]"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * $Id: EmailValidator.java,v 1.2 2008/06/25 05:44:04 qcheng Exp $
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Portions Copyrighted 2016 ForgeRock AS.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * The class <code>EmailValidator</code> is used to check if the Email address
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * is syntactically correct according to valid format defined in RFC 822. Email
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * address must contain an @ symbol as well as syntactically correct username
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * and domain information e.g. name@domain.com
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenkpublic class EmailValidator implements ServiceAttributeValidator {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Validates a set of email address.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param values
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * the set of string email address to validate
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @return true if all of the email addresses are valid; false otherwise
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Validates an email address.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param value
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * an email address
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @return true if the email address is valid; false otherwise
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk String domain = value.substring(index + 1, value.length());
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return validateName(name) && validateDomain(domain);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk StringTokenizer tok = new StringTokenizer(name, ".");
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // The character can be any ASCII character except:
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // a) ASCII control character and DEL
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // c) RFC 822 specials
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk || inValidChars.contains(character.toString())) {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk StringTokenizer tok = new StringTokenizer(domain, ".");
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk int number = domain.length() - domain.replace(".", "").length() + 1;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk private boolean isValidDomainPart(String domain) {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // subdomain can not start or end with a hyphen
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (domain.charAt(0) == '-' || domain.charAt(length - 1) == '-') {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // subdomain or "label" can not be longer than 63 chars
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (!Character.isLetter(ch) && !Character.isDigit(ch) && ch != '-')
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return false;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk private static Vector inValidChars = new Vector();
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk // RFC 822 special characters