/******************************************************************************* * 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$ } }