/*
 * ====================================================================
 * 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 org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;

/**
 * The <b>SVNAuthentication</b> is the base class that represents user 
 * credentials. <b>SVNAuthentication</b> provides only a username. Other 
 * kinds of user credentials extend this base class and add their own specific 
 * information.
 * 
 * <p>
 * User credentials used by <b>SVNRepository</b> drivers to authenticate 
 * a user to a repository server, are provided to those drivers by 
 * <b>ISVNAuthenticationManager</b> implementations.
 * 
 * @version 1.3
 * @author  TMate Software Ltd.
 * @since   1.2
 * @see     SVNPasswordAuthentication
 * @see     SVNSSHAuthentication
 * @see     ISVNAuthenticationManager
 * @see     org.tmatesoft.svn.core.io.SVNRepository
 */
public class SVNAuthentication {
    
    private String myUserName;
    private boolean myIsStorageAllowed;
    private String myKind;
    private SVNURL myURL;
    private boolean myIsPartial;
    
    /**
     * Creates a username user credential object given a username.
     *  
     * @deprecated use constructor with SVNURL parameter instead
     * 
     * @param kind              a credential kind
     * @param userName          a repository account username 
     * @param storageAllowed    if <span class="javakeyword">true</span> then
     *                          this credential is allowed to be stored in the 
     *                          global auth cache, otherwise not
     */
    public SVNAuthentication(String kind, String userName, boolean storageAllowed) {
        this(kind, userName, storageAllowed, null, false);
    }

    /**
     * Creates a username user credential object given a username. 
     * 
     * @param kind              a credential kind
     * @param userName          a repository account username 
     * @param storageAllowed    if <span class="javakeyword">true</span> then
     *                          this credential is allowed to be stored in the 
     *                          global auth cache, otherwise not
     * @param url               url these credentials are applied to
     * @since 1.3.1
     */
    public SVNAuthentication(String kind, String userName, boolean storageAllowed, SVNURL url, boolean isPartial) {
        myUserName = userName;
        myIsStorageAllowed = storageAllowed;
        myKind = kind;
        myURL = url;
        myIsPartial = isPartial;
    }

    /**
     * Reurns the username. 
     * 
     * @return a repository account username
     */
    public String getUserName() {
        return myUserName;
    }
    
    /**
     * Says if this credential may be cached in the global auth cache.
     *  
     * @return <span class="javakeyword">true</span> if this credential
     *         may be stored, <span class="javakeyword">false</span> if may not
     */
    public boolean isStorageAllowed() {
        return myIsStorageAllowed;
    }

    /**
     * Says if these credentials are partial. 
     * Partial credentials could miss password\passhprase 
     * and could be used to complement missing information.  
     * 
     * @return <span class="javakeyword">true</span> if parital;
     *         otherwise <span class="javakeyword">false</span>
     * @since 1.3
     */
    public boolean isPartial() {
        return myIsPartial;
    }
    
    /**
     * Returns a credential kind for which this authentication 
     * credential is used. 
     * 
     * @return a credential kind
     */
    public String getKind() {
        return myKind;
    }

    public SVNURL getURL() {
        return myURL;
    }
    
    /**
     * Disposes sensitive data (e.g. password) stored in this object.
     * 
     * @since 1.8.9
     */
    public void dismissSensitiveData() {
    }
    
    /**
     * Creates a deep copy of this credentials object. Sensitive data (e.g. password) is copied too.
     * 
     * @since 1.8.9
     * @return copy of this object.
     */
    public SVNAuthentication copy() {
        return new SVNAuthentication(myKind, myUserName, myIsStorageAllowed, myURL, myIsPartial);
    }
    
    protected char[] copyOf(char[] source) {
        return SVNEncodingUtil.copyOf(source);

    }

}
