X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.repo%2Fsrc%2Forg%2Feclipse%2Faether%2Frepository%2FAuthenticationContext.java;fp=org.argeo.slc.repo%2Fsrc%2Forg%2Feclipse%2Faether%2Frepository%2FAuthenticationContext.java;h=0000000000000000000000000000000000000000;hb=c5df8cb6e6d56113a2707fd4a75c0b912b97e4c0;hp=5b1ba2c0a88bdb86dd909cf3854468788dad35f9;hpb=e6113a28ca93a1c6bb4aa23242c9d05b63d51cae;p=gpl%2Fargeo-slc.git
diff --git a/org.argeo.slc.repo/src/org/eclipse/aether/repository/AuthenticationContext.java b/org.argeo.slc.repo/src/org/eclipse/aether/repository/AuthenticationContext.java
deleted file mode 100644
index 5b1ba2c0a..000000000
--- a/org.argeo.slc.repo/src/org/eclipse/aether/repository/AuthenticationContext.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012, 2014 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.Closeable;
-import java.io.File;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.aether.RepositorySystemSession;
-
-/**
- * A glorified map of key value pairs holding (cleartext) authentication data. Authentication contexts are used
- * internally when network operations need to access secured repositories or proxies. Each authentication context
- * manages the credentials required to access a single host. Unlike {@link Authentication} callbacks which exist for a
- * potentially long time like the duration of a repository system session, an authentication context has a supposedly
- * short lifetime and should be {@link #close() closed} as soon as the corresponding network operation has finished:
- *
- *
- * AuthenticationContext context = AuthenticationContext.forRepository( session, repository );
- * try {
- * // get credentials
- * char[] password = context.get( AuthenticationContext.PASSWORD, char[].class );
- * // perform network operation using retrieved credentials
- * ...
- * } finally {
- * // erase confidential authentication data from heap memory
- * AuthenticationContext.close( context );
- * }
- *
- *
- * The same authentication data can often be presented using different data types, e.g. a password can be presented
- * using a character array or (less securely) using a string. For ease of use, an authentication context treats the
- * following groups of data types as equivalent and converts values automatically during retrieval:
- *
- * - {@code String}, {@code char[]}
- * - {@code String}, {@code File}
- *
- * An authentication context is thread-safe.
- */
-public final class AuthenticationContext
- implements Closeable
-{
-
- /**
- * The key used to store the username. The corresponding authentication data should be of type {@link String}.
- */
- public static final String USERNAME = "username";
-
- /**
- * The key used to store the password. The corresponding authentication data should be of type {@code char[]} or
- * {@link String}.
- */
- public static final String PASSWORD = "password";
-
- /**
- * The key used to store the NTLM domain. The corresponding authentication data should be of type {@link String}.
- */
- public static final String NTLM_DOMAIN = "ntlm.domain";
-
- /**
- * The key used to store the NTML workstation. The corresponding authentication data should be of type
- * {@link String}.
- */
- public static final String NTLM_WORKSTATION = "ntlm.workstation";
-
- /**
- * The key used to store the pathname to a private key file. The corresponding authentication data should be of type
- * {@link String} or {@link File}.
- */
- public static final String PRIVATE_KEY_PATH = "privateKey.path";
-
- /**
- * The key used to store the passphrase protecting the private key. The corresponding authentication data should be
- * of type {@code char[]} or {@link String}.
- */
- public static final String PRIVATE_KEY_PASSPHRASE = "privateKey.passphrase";
-
- /**
- * The key used to store the acceptance policy for unknown host keys. The corresponding authentication data should
- * be of type {@link Boolean}. When querying this authentication data, the extra data should provide
- * {@link #HOST_KEY_REMOTE} and {@link #HOST_KEY_LOCAL}, e.g. to enable a well-founded decision of the user during
- * an interactive prompt.
- */
- public static final String HOST_KEY_ACCEPTANCE = "hostKey.acceptance";
-
- /**
- * The key used to store the fingerprint of the public key advertised by remote host. Note that this key is used to
- * query the extra data passed to {@link #get(String, Map, Class)} when getting {@link #HOST_KEY_ACCEPTANCE}, not
- * the authentication data in a context.
- */
- public static final String HOST_KEY_REMOTE = "hostKey.remote";
-
- /**
- * The key used to store the fingerprint of the public key expected from remote host as recorded in a known hosts
- * database. Note that this key is used to query the extra data passed to {@link #get(String, Map, Class)} when
- * getting {@link #HOST_KEY_ACCEPTANCE}, not the authentication data in a context.
- */
- public static final String HOST_KEY_LOCAL = "hostKey.local";
-
- /**
- * The key used to store the SSL context. The corresponding authentication data should be of type
- * {@link javax.net.ssl.SSLContext}.
- */
- public static final String SSL_CONTEXT = "ssl.context";
-
- /**
- * The key used to store the SSL hostname verifier. The corresponding authentication data should be of type
- * {@link javax.net.ssl.HostnameVerifier}.
- */
- public static final String SSL_HOSTNAME_VERIFIER = "ssl.hostnameVerifier";
-
- private final RepositorySystemSession session;
-
- private final RemoteRepository repository;
-
- private final Proxy proxy;
-
- private final Authentication auth;
-
- private final Map authData;
-
- private boolean fillingAuthData;
-
- /**
- * Gets an authentication context for the specified repository.
- *
- * @param session The repository system session during which the repository is accessed, must not be {@code null}.
- * @param repository The repository for which to create an authentication context, must not be {@code null}.
- * @return An authentication context for the repository or {@code null} if no authentication is configured for it.
- */
- public static AuthenticationContext forRepository( RepositorySystemSession session, RemoteRepository repository )
- {
- return newInstance( session, repository, null, repository.getAuthentication() );
- }
-
- /**
- * Gets an authentication context for the proxy of the specified repository.
- *
- * @param session The repository system session during which the repository is accessed, must not be {@code null}.
- * @param repository The repository for whose proxy to create an authentication context, must not be {@code null}.
- * @return An authentication context for the proxy or {@code null} if no proxy is set or no authentication is
- * configured for it.
- */
- public static AuthenticationContext forProxy( RepositorySystemSession session, RemoteRepository repository )
- {
- Proxy proxy = repository.getProxy();
- return newInstance( session, repository, proxy, ( proxy != null ) ? proxy.getAuthentication() : null );
- }
-
- private static AuthenticationContext newInstance( RepositorySystemSession session, RemoteRepository repository,
- Proxy proxy, Authentication auth )
- {
- if ( auth == null )
- {
- return null;
- }
- return new AuthenticationContext( session, repository, proxy, auth );
- }
-
- private AuthenticationContext( RepositorySystemSession session, RemoteRepository repository, Proxy proxy,
- Authentication auth )
- {
- if ( session == null )
- {
- throw new IllegalArgumentException( "repository system session missing" );
- }
- this.session = session;
- this.repository = repository;
- this.proxy = proxy;
- this.auth = auth;
- authData = new HashMap();
- }
-
- /**
- * Gets the repository system session during which the authentication happens.
- *
- * @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 context 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;
- }
-
- /**
- * Gets the authentication data for the specified key.
- *
- * @param key The key whose authentication data should be retrieved, must not be {@code null}.
- * @return The requested authentication data or {@code null} if none.
- */
- public String get( String key )
- {
- return get( key, null, String.class );
- }
-
- /**
- * Gets the authentication data for the specified key.
- *
- * @param The data type of the authentication data.
- * @param key The key whose authentication data should be retrieved, must not be {@code null}.
- * @param type The expected type of the authentication data, must not be {@code null}.
- * @return The requested authentication data or {@code null} if none or if the data doesn't match the expected type.
- */
- public T get( String key, Class type )
- {
- return get( key, null, type );
- }
-
- /**
- * Gets the authentication data for the specified key.
- *
- * @param The data type of the authentication data.
- * @param key The key whose authentication data should be retrieved, must not be {@code null}.
- * @param data Any (read-only) extra data in form of key value pairs that might be useful when getting the
- * authentication data, may be {@code null}.
- * @param type The expected type of the authentication data, must not be {@code null}.
- * @return The requested authentication data or {@code null} if none or if the data doesn't match the expected type.
- */
- public T get( String key, Map data, Class type )
- {
- if ( key == null )
- {
- throw new IllegalArgumentException( "authentication data key missing" );
- }
- Object value;
- synchronized ( authData )
- {
- value = authData.get( key );
- if ( value == null && !authData.containsKey( key ) && !fillingAuthData )
- {
- if ( auth != null )
- {
- try
- {
- fillingAuthData = true;
- auth.fill( this, key, data );
- }
- finally
- {
- fillingAuthData = false;
- }
- value = authData.get( key );
- }
- if ( value == null )
- {
- authData.put( key, value );
- }
- }
- }
-
- return convert( value, type );
- }
-
- private T convert( Object value, Class type )
- {
- if ( !type.isInstance( value ) )
- {
- if ( String.class.equals( type ) )
- {
- if ( value instanceof File )
- {
- value = ( (File) value ).getPath();
- }
- else if ( value instanceof char[] )
- {
- value = new String( (char[]) value );
- }
- }
- else if ( File.class.equals( type ) )
- {
- if ( value instanceof String )
- {
- value = new File( (String) value );
- }
- }
- else if ( char[].class.equals( type ) )
- {
- if ( value instanceof String )
- {
- value = ( (String) value ).toCharArray();
- }
- }
- }
-
- if ( type.isInstance( value ) )
- {
- return type.cast( value );
- }
-
- return null;
- }
-
- /**
- * Puts the specified authentication data into this context. This method should only be called from implementors of
- * {@link Authentication#fill(AuthenticationContext, String, Map)}. Passed in character arrays are not cloned and
- * become owned by this context, i.e. get erased when the context gets closed.
- *
- * @param key The key to associate the authentication data with, must not be {@code null}.
- * @param value The (cleartext) authentication data to store, may be {@code null}.
- */
- public void put( String key, Object value )
- {
- if ( key == null )
- {
- throw new IllegalArgumentException( "authentication data key missing" );
- }
- synchronized ( authData )
- {
- Object oldValue = authData.put( key, value );
- if ( oldValue instanceof char[] )
- {
- Arrays.fill( (char[]) oldValue, '\0' );
- }
- }
- }
-
- /**
- * Closes this authentication context and erases sensitive authentication data from heap memory. Closing an already
- * closed context has no effect.
- */
- public void close()
- {
- synchronized ( authData )
- {
- for ( Object value : authData.values() )
- {
- if ( value instanceof char[] )
- {
- Arrays.fill( (char[]) value, '\0' );
- }
- }
- authData.clear();
- }
- }
-
- /**
- * Closes the specified authentication context. This is a convenience method doing a {@code null} check before
- * calling {@link #close()} on the given context.
- *
- * @param context The authentication context to close, may be {@code null}.
- */
- public static void close( AuthenticationContext context )
- {
- if ( context != null )
- {
- context.close();
- }
- }
-
-}