// Copyright (C) 2009 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.gerrit.server.mail; import java.io.UnsupportedEncodingException; public class Address { public static Address parse(final String in) { final int lt = in.indexOf('<'); final int gt = in.indexOf('>'); final int at = in.indexOf("@"); if (0 <= lt && lt < gt && lt + 1 < at && at + 1 < gt) { final String email = in.substring(lt + 1, gt).trim(); final String name = in.substring(0, lt).trim(); return new Address(name.length() > 0 ? name : null, email); } if (lt < 0 && gt < 0 && 0 < at && at < in.length() - 1) { return new Address(in); } throw new IllegalArgumentException("Invalid email address: " + in); } final String name; final String email; public Address(String email) { this(null, email); } public Address(String name, String email) { this.name = name; this.email = email; } public String getName() { return name; } public String getEmail() { return email; } @Override public int hashCode() { return email.hashCode(); } @Override public boolean equals(Object other) { if (other instanceof Address) { return email.equals(((Address) other).email); } return false; } @Override public String toString() { try { return toHeaderString(); } catch (UnsupportedEncodingException e) { throw new RuntimeException("Cannot encode address", e); } } public String toHeaderString() throws UnsupportedEncodingException { if (name != null) { return quotedPhrase(name) + " <" + email + ">"; } else if (isSimple()) { return email; } return "<" + email + ">"; } private static final String MUST_QUOTE_EMAIL = "()<>,;:\\\"[]"; private static final String MUST_QUOTE_NAME = MUST_QUOTE_EMAIL + "@."; private boolean isSimple() { for (int i = 0; i < email.length(); i++) { final char c = email.charAt(i); if (c <= ' ' || 0x7F <= c || MUST_QUOTE_EMAIL.indexOf(c) != -1) { return false; } } return true; } private static String quotedPhrase(final String name) throws UnsupportedEncodingException { if (EmailHeader.needsQuotedPrintable(name)) { return EmailHeader.quotedPrintable(name); } for (int i = 0; i < name.length(); i++) { final char c = name.charAt(i); if (MUST_QUOTE_NAME.indexOf(c) != -1) { return wrapInQuotes(name); } } return name; } private static String wrapInQuotes(final String name) { final StringBuilder r = new StringBuilder(2 + name.length()); r.append('"'); for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); if (c == '"' || c == '\\') { r.append('\\'); } r.append(c); } r.append('"'); return r.toString(); } }