blob: 2b94097459dd8a20ac989d34167c0fd5c8975bef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 GitHub Inc. and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
* Tasktop Technologies - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.identity.core.gravatar;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Locale;
import org.eclipse.core.runtime.IAdaptable;
/**
* Gravatar utililites.
*
* @author Kevin Sawicki (kevin@github.com)
*/
public abstract class GravatarUtils {
private static String digest(String value) {
String hashed = null;
try {
byte[] input = value.getBytes(IGravatarConstants.CHARSET);
byte[] digested = MessageDigest.getInstance(IGravatarConstants.HASH_ALGORITHM).digest(input);
hashed = new BigInteger(1, digested).toString(16);
int padding = IGravatarConstants.HASH_LENGTH - hashed.length();
if (padding > 0) {
char[] zeros = new char[padding];
Arrays.fill(zeros, '0');
hashed = new String(zeros) + hashed;
}
} catch (NoSuchAlgorithmException e) {
hashed = null;
} catch (UnsupportedEncodingException e) {
hashed = null;
}
return hashed;
}
/**
* Get hash for object by attempting to adapt it to an {@link IGravatarHashProvider} and fall back on
* {@link Object#toString()} value if adaptation fails and {@link Object#toString()} is or can be transformed into a
* valid hash.
*
* @param element
* @return hash
*/
public String getAdaptedHash(Object element) {
if (element == null) {
return null;
}
String hash = null;
IGravatarHashProvider provider = null;
if (element instanceof IGravatarHashProvider) {
provider = (IGravatarHashProvider) element;
} else if (element instanceof IAdaptable) {
provider = (IGravatarHashProvider) ((IAdaptable) element).getAdapter(IGravatarHashProvider.class);
}
if (provider != null) {
hash = provider.getGravatarHash();
} else {
String potentialHash = element.toString();
if (isValidHash(potentialHash)) {
hash = potentialHash;
} else {
hash = getHash(potentialHash);
}
}
return hash;
}
/**
* Is the specified string a valid graavatar hash?
*
* @param hash
* @return true if valid hash, false otherwise
*/
public static boolean isValidHash(String hash) {
return hash != null && hash.length() == IGravatarConstants.HASH_LENGTH
&& IGravatarConstants.HASH_PATTERN.matcher(hash).matches();
}
/**
* Get gravatar hash for specified e-mail address
*
* @param email
* @return hash
*/
public static String getHash(String email) {
String hash = null;
if (email != null) {
email = email.trim().toLowerCase(Locale.US);
if (email.length() > 0) {
hash = digest(email);
}
}
return hash;
}
public static boolean isValidEmail(String alias) {
return alias != null && alias.contains("@"); //$NON-NLS-1$
}
}