/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.auth;
import javax.net.ssl.TrustManager;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.io.SVNRepository;
/**
* The <b>ISVNAuthenticationManager</b> is implemented by manager
* classes used by <b>SVNRepository</b> drivers for user authentication purposes.
*
* <p>
* When an <b>SVNRepository</b> driver is created, you should provide an
* authentication manager via a call to:
* <pre class="javacode">
* <span class="javakeyword">import</span> org.tmatesoft.svn.core.io.SVNRepository;
* <span class="javakeyword">import</span> org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
* ...
* SVNRepository repository;
* ISVNAuthenticationManager authManger;
* ...
*
* repository.setAuthenticationManager(authManager);
* ...</pre>
*
* <p>
* SVNKit provides a default authentication manager implementation - <b>org.tmatesoft.svn.core.internal.wc.DefaultSVNAuthenticationManager</b>.
* This manager has got the following features:
* <ul>
* <li> uses the auth storage from the default Subversion runtime configuration area;
* <li> may use the auth storage in the directory you specify;
* <li> uses the ssh, ssl & proxy options from the standard <i>config</i> and <i>servers</i> files;
* <li> stores credentials in the in-memory cache during runtime;
* </ul>
* You may also specify your own auth provider (<b>ISVNAuthenticationProvider</b>) to this default manager, it
* will be used along with those default ones, that implement the features listed above.
*
* <p>
* If using the https:// protocol and if no user's authentication provider implementation is set to the
* default manager, server certificates are accepted temporarily and therefore are not cached on the disk.
* To enable server CAs caching, a user should set an authentication provider implementation which
* {@link ISVNAuthenticationProvider#acceptServerAuthentication(SVNURL, String, Object, boolean) acceptServerAuthentication()}
* method must return {@link ISVNAuthenticationProvider#ACCEPTED}. That will switch on certificate on-the-disk caching.
*
* <p>
* How to get a default auth manager instance see {@link org.tmatesoft.svn.core.wc.SVNWCUtil}.
*
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
* @see org.tmatesoft.svn.core.io.SVNRepository
*/
public interface ISVNAuthenticationManager {
/**
* A simple password credential kind (<span class="javastring">"svn.simple"</span>)
*/
public static final String PASSWORD = "svn.simple";
/**
* An ssh credential kind (<span class="javastring">"svn.ssh"</span>)
*/
public static final String SSH = "svn.ssh";
/**
* An ssl credential kind (<span class="javastring">"svn.ssl.client-passphrase"</span>)
*/
public static final String SSL = "svn.ssl.client-passphrase";
/**
* A simple username credential kind (<span class="javastring">"svn.username"</span>).
* Only usernames are cached/provided matched against an appropriate
* realms (which are repository UUIDs in this case). In particular this kind is
* used in <code>file:///</code> and <code>svn+ssh://</code> access schemes.
*/
public static final String USERNAME = "svn.username";
/**
* Sets a custom authentication provider that will provide user
* credentials for authentication.
*
* @param provider an authentication provider
*/
public void setAuthenticationProvider(ISVNAuthenticationProvider provider);
/**
* Returns a proxy manager that keeps settings for that proxy
* server over which HTTP requests are send to a repository server.
*
* <p>
* A default auth manager uses proxy settings from the standard <i>servers</i>
* file.
*
* @param url a repository location that will be accessed
* over the proxy server for which a manager is needed
* @return a proxy manager
* @throws SVNException
*/
public ISVNProxyManager getProxyManager(SVNURL url) throws SVNException;
/**
* Returns a manager which handles trust data for the specified <code>url</code>.
*
* <p/>
* Note: in pre-1.2.0 versions <code>ISVNAuthenticationManager</code> used to provide <code>ISVNSSLManager</code>
* via a method <code>getSSLManager()</code> which is now replaced by this one. <code>ISVNSSLManager</code>
* is no longer used (replaced by <code>TrustManager</code>).
*
* @param url repository url
* @return trust manager
* @throws SVNException
* @since 1.2.0
*/
public TrustManager getTrustManager(SVNURL url) throws SVNException;
/**
* Retrieves the first user credential.
*
* The scheme of retrieving credentials:
* <ul>
* <li>For the first try to authenticate a user to a repository (using the
* specifed realm) an <b>SVNRepository</b> driver calls
* <b>getFirstAuthentication()</b> and sends the retrieved credential.
* <li>If the credential is accepted, it may be stored. If not, the driver
* calls {@link #getNextAuthentication(String, String, SVNURL) getNextAuthentication()}
* and sends the next credential.
* <li>If the last credential was not accepted, the driver still tries to get the next
* credential for the same realm.
* </ul>
*
* <p>
* For each credential <code>kind</code> an implementor should return a kind-specific
* credential. The following table matches kinds to proper credential classes:
*
* <table cellpadding="3" cellspacing="1" border="0" width="60%" bgcolor="#999933">
* <tr bgcolor="#ADB8D9" align="left">
* <td><b>Credential Kind</b></td>
* <td><b>Credential Class</b></td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #PASSWORD}</td><td>{@link SVNPasswordAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #SSH}</td><td>{@link SVNSSHAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #SSL}</td><td>{@link SVNSSLAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #USERNAME}</td><td>{@link SVNUserNameAuthentication}</td>
* </tr>
* </table>
*
* @param kind a credential kind
* @param realm a repository authentication realm
* @param url a repository location that is to be accessed
* @return the first try user credential
* @throws SVNException
*/
public SVNAuthentication getFirstAuthentication(String kind, String realm, SVNURL url) throws SVNException;
/**
* Retrieves the next user credential if the first try failed.
*
* The scheme of retrieving credentials:
* <ul>
* <li>For the first try to authenticate a user to a repository (using the
* specifed realm) an <b>SVNRepository</b> driver calls
* {@link #getFirstAuthentication(String, String, SVNURL) getFirstAuthentication()} and
* sends the retrieved credential.
* <li>If the credential is accepted, it may be stored. If not, the driver
* calls <b>getNextAuthentication()</b> and sends the next credential.
* <li>If the last credential was not accepted, the driver still tries to get the next
* credential for the same realm.
* </ul>
*
* <p>
* For each credential <code>kind</code> an implementor should return a kind-specific
* credential. The following table matches kinds to proper credential classes:
*
* <table cellpadding="3" cellspacing="1" border="0" width="60%" bgcolor="#999933">
* <tr bgcolor="#ADB8D9" align="left">
* <td><b>Credential Kind</b></td>
* <td><b>Credential Class</b></td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #PASSWORD}</td><td>{@link SVNPasswordAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #SSH}</td><td>{@link SVNSSHAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #SSL}</td><td>{@link SVNSSLAuthentication}</td>
* </tr>
* <tr bgcolor="#EAEAEA" align="left">
* <td>{@link #USERNAME}</td><td>{@link SVNUserNameAuthentication}</td>
* </tr>
* </table>
*
* @param kind a credential kind
* @param realm a repository authentication realm
* @param url a repository location that is to be accessed
* @return the next try user credential
* @throws SVNException
*/
public SVNAuthentication getNextAuthentication(String kind, String realm, SVNURL url) throws SVNException;
/**
* Accepts the given authentication if it was successfully accepted by a
* repository server, or not if authentication failed. As a result the
* provided credential may be cached (authentication succeeded) or deleted
* from the cache (authentication failed).
*
* @param accepted <span class="javakeyword">true</span> if
* the credential was accepted by the server,
* otherwise <span class="javakeyword">false</span>
* @param kind a credential kind ({@link #PASSWORD} or {@link #SSH} or {@link #USERNAME})
* @param realm a repository authentication realm
* @param errorMessage the reason of the authentication failure
* @param authentication a user credential to accept/drop
* @throws SVNException
*/
public void acknowledgeAuthentication(boolean accepted, String kind, String realm, SVNErrorMessage errorMessage, SVNAuthentication authentication) throws SVNException;
/**
* Sets the listener that gets invoked every time {@link #acknowledgeAuthentication(boolean, String, String, SVNErrorMessage, SVNAuthentication)}
* is called.
*/
public void setAuthenticationOutcomeListener(ISVNAuthenticationOutcomeListener listener);
/**
* Acknowledges the specified trust manager. This method is called only when a secure connection is
* successfully established with the specified <code>manager</code>.
*
* @param manager trust manager to acknowledge (one returned by {@link #getTrustManager(SVNURL)})
* @since 1.2.0
*/
public void acknowledgeTrustManager(TrustManager manager);
/**
* Checks whether client should send authentication credentials to
* a repository server not waiting for the server's challenge.
*
* <p>
* In some cases it may be necessary to send credentials beforehand,
* not waiting until the server asks to do it itself. To achieve
* such behaviour an implementor should return <span class="javakeyword">true</span>
* from this routine.
*
* @return <span class="javakeyword">true</span> if authentication
* credentials are forced to be sent;<span class="javakeyword">false</span>
* when credentials are to be sent only in response to a server challenge
*/
public boolean isAuthenticationForced();
/**
* Returns the read timeout value in milliseconds which <code>repository</code> should use in
* socket read operations. Socket read operations will block only for this amount of time.
*
* @param repository a repository access driver
* @return connection timeout value
* @since 1.2.0
*/
public int getReadTimeout(SVNRepository repository);
/**
* Returns the connection timeout value in milliseconds which <code>repository</code>
* should use in network connection operations.
*
* @param repository repository access object
* @return connection timeout value in milliseconds which will be set
* to a socket
* @since 1.2.0
*/
public int getConnectTimeout(SVNRepository repository);
}