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