org.eclipse.aether.repository.AuthenticationDigest Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2012 Sonatype, Inc.
* 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:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.aether.repository;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.eclipse.aether.RepositorySystemSession;
/**
* A helper to calculate a fingerprint/digest for the authentication data of a repository/proxy. Such a fingerprint can
* be used to detect changes in the authentication data across JVM restarts without exposing sensitive information.
*/
public final class AuthenticationDigest
{
private final MessageDigest digest;
private final RepositorySystemSession session;
private final RemoteRepository repository;
private final Proxy proxy;
/**
* Gets the fingerprint for the authentication of the specified repository.
*
* @param session The repository system session during which the fingerprint is requested, must not be {@code null}.
* @param repository The repository whose authentication is to be fingerprinted, must not be {@code null}.
* @return The fingerprint of the repository authentication or an empty string if no authentication is configured,
* never {@code null}.
*/
public static String forRepository( RepositorySystemSession session, RemoteRepository repository )
{
String digest = "";
Authentication auth = repository.getAuthentication();
if ( auth != null )
{
AuthenticationDigest authDigest = new AuthenticationDigest( session, repository, null );
auth.digest( authDigest );
digest = authDigest.digest();
}
return digest;
}
/**
* Gets the fingerprint for the authentication of the specified repository's proxy.
*
* @param session The repository system session during which the fingerprint is requested, must not be {@code null}.
* @param repository The repository whose proxy authentication is to be fingerprinted, must not be {@code null}.
* @return The fingerprint of the proxy authentication or an empty string if no proxy is present or if no proxy
* authentication is configured, never {@code null}.
*/
public static String forProxy( RepositorySystemSession session, RemoteRepository repository )
{
String digest = "";
Proxy proxy = repository.getProxy();
if ( proxy != null )
{
Authentication auth = proxy.getAuthentication();
if ( auth != null )
{
AuthenticationDigest authDigest = new AuthenticationDigest( session, repository, proxy );
auth.digest( authDigest );
digest = authDigest.digest();
}
}
return digest;
}
private AuthenticationDigest( RepositorySystemSession session, RemoteRepository repository, Proxy proxy )
{
this.session = session;
this.repository = repository;
this.proxy = proxy;
digest = newDigest();
}
private static MessageDigest newDigest()
{
try
{
return MessageDigest.getInstance( "SHA-1" );
}
catch ( NoSuchAlgorithmException e )
{
try
{
return MessageDigest.getInstance( "MD5" );
}
catch ( NoSuchAlgorithmException ne )
{
throw new IllegalStateException( ne );
}
}
}
/**
* Gets the repository system session during which the authentication fingerprint is calculated.
*
* @return The repository system session, never {@code null}.
*/
public RepositorySystemSession getSession()
{
return session;
}
/**
* Gets the repository requiring authentication. If {@link #getProxy()} is not {@code null}, the data gathered by
* this authentication digest does not apply to the repository's host but rather the proxy.
*
* @return The repository to be contacted, never {@code null}.
*/
public RemoteRepository getRepository()
{
return repository;
}
/**
* Gets the proxy (if any) to be authenticated with.
*
* @return The proxy or {@code null} if authenticating directly with the repository's host.
*/
public Proxy getProxy()
{
return proxy;
}
/**
* Updates the digest with the specified strings.
*
* @param strings The strings to update the digest with, may be {@code null} or contain {@code null} elements.
*/
public void update( String... strings )
{
if ( strings != null )
{
for ( String string : strings )
{
if ( string != null )
{
try
{
digest.update( string.getBytes( "UTF-8" ) );
}
catch ( UnsupportedEncodingException e )
{
throw new IllegalStateException( e );
}
}
}
}
}
/**
* Updates the digest with the specified characters.
*
* @param chars The characters to update the digest with, may be {@code null}.
*/
public void update( char... chars )
{
if ( chars != null )
{
for ( char c : chars )
{
digest.update( (byte) ( c >> 8 ) );
digest.update( (byte) ( c & 0xFF ) );
}
}
}
/**
* Updates the digest with the specified bytes.
*
* @param bytes The bytes to update the digest with, may be {@code null}.
*/
public void update( byte... bytes )
{
if ( bytes != null )
{
digest.update( bytes );
}
}
private String digest()
{
byte[] bytes = digest.digest();
StringBuilder buffer = new StringBuilder( bytes.length * 2 );
for ( byte aByte : bytes )
{
int b = aByte & 0xFF;
if ( b < 0x10 )
{
buffer.append( '0' );
}
buffer.append( Integer.toHexString( b ) );
}
return buffer.toString();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy