/* Authenticator.java -- Abstract class for obtaining authentication info
   Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.net;


/**
  * This abstract class provides a model for obtaining authentication
  * information (in the form of a username and password) required by
  * some network operations (such as hitting a password protected
  * web site).
  * <p>
  * To make use of this feature, a programmer must create a subclass
  * that knows how to obtain the necessary info.  An example
  * would be a class that popped up a dialog box to prompt the user.
  * After creating an instance of that subclass, the static
  * <code>setDefault</code> method of this class is called to set up
  * that instance as the object to use on subsequent calls to obtain
  * authorization.
  *
  * @since 1.2
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  * @status Believed to be JDK 1.4 complete
  */
public abstract class Authenticator
{
  /*
   * Class Variables
   */

  /**
    * This is the default Authenticator object to use for password requests
    */
  private static Authenticator defaultAuthenticator;

  /*
   * Instance Variables
   */

  /**
    * The hostname of the site requesting authentication
    */
  private String host;

  /**
    * InternetAddress of the site requesting authentication
    */
  private InetAddress addr;

  /**
    * The port number of the site requesting authentication
    */
  private int port;

  /**
    * The protocol name of the site requesting authentication
    */
  private String protocol;

  /**
    * The prompt to display to the user when requesting authentication info
    */
  private String prompt;

  /**
    * The authentication scheme in use
    */
  private String scheme;

  /*
   * Class Methods
   */

  /**
    * This method sets the default <code>Authenticator</code> object (an
    * instance of a subclass of <code>Authenticator</code>) to use when
    * prompting the user for
    * information.  Note that this method checks to see if the caller is
    * allowed to set this value (the "setDefaultAuthenticator" permission)
    * and throws a <code>SecurityException</code> if it is not.
    *
    * @param defAuth The new default <code>Authenticator</code> object to use
    *
    * @exception SecurityException If the caller does not have permission
    * to perform this operation
    */
  public static void setDefault(Authenticator defAuth)
  {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null)
      sm.checkPermission(new NetPermission("setDefaultAuthenticator"));

    defaultAuthenticator = defAuth;
  }

  /**
    * This method is called whenever a username and password for a given
    * network operation is required.  First, a security check is made to see
    * if the caller has the "requestPasswordAuthentication"
    * permission.  If not, the method thows an exception.  If there is no
    * default <code>Authenticator</code> object, the method then returns
    * <code>null</code>.  Otherwise, the default authenticators's instance
    * variables are initialized and it's <code>getPasswordAuthentication</code>
    * method is called to get the actual authentication information to return.
    *
    * @param addr The address requesting authentication
    * @param port The port requesting authentication
    * @param protocol The protocol requesting authentication
    * @param prompt The prompt to display to the user when requesting
    *        authentication info
    * @param scheme The authentication scheme in use
    *
    * @return A <code>PasswordAuthentication</code> object with the user's
    *         authentication info.
    *
    * @exception SecurityException If the caller does not have permission to
    *         perform this operation
    */
  public static PasswordAuthentication requestPasswordAuthentication(InetAddress addr,
                                                                     int port,
                                                                     String protocol,
                                                                     String prompt,
                                                                     String scheme)
    throws SecurityException
  {
    return requestPasswordAuthentication(null, addr, port, protocol, prompt,
                                         scheme);
  }

  /**
    * This method is called whenever a username and password for a given
    * network operation is required.  First, a security check is made to see
    * if the caller has the "requestPasswordAuthentication"
    * permission.  If not, the method thows an exception.  If there is no
    * default <code>Authenticator</code> object, the method then returns
    * <code>null</code>.  Otherwise, the default authenticators's instance
    * variables are initialized and it's <code>getPasswordAuthentication</code>
    * method is called to get the actual authentication information to return.
    * This method is the preferred one as it can be used with hostname
    * when addr is unknown.
    *
    * @param host The hostname requesting authentication
    * @param addr The address requesting authentication
    * @param port The port requesting authentication
    * @param protocol The protocol requesting authentication
    * @param prompt The prompt to display to the user when requesting
    *        authentication info
    * @param scheme The authentication scheme in use
    *
    * @return A <code>PasswordAuthentication</code> object with the user's
    *         authentication info.
    *
    * @exception SecurityException If the caller does not have permission to
    *         perform this operation
    *
    * @since 1.4
    */
  public static PasswordAuthentication requestPasswordAuthentication(String host,
                                                                     InetAddress addr,
                                                                     int port,
                                                                     String protocol,
                                                                     String prompt,
                                                                     String scheme)
    throws SecurityException
  {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null)
      sm.checkPermission(new NetPermission("requestPasswordAuthentication"));

    if (defaultAuthenticator == null)
      return null;

    defaultAuthenticator.host = host;
    defaultAuthenticator.addr = addr;
    defaultAuthenticator.port = port;
    defaultAuthenticator.protocol = protocol;
    defaultAuthenticator.prompt = prompt;
    defaultAuthenticator.scheme = scheme;

    return defaultAuthenticator.getPasswordAuthentication();
  }

  /*
   * Constructors
   */

  /**
    * Default, no-argument constructor for subclasses to call.
    */
  public Authenticator()
  {
  }

  /*
   * Instance Methods
   */

  /**
    * This method returns the address of the site that is requesting
    * authentication.
    *
    * @return The requesting site's address
    */
  protected final InetAddress getRequestingSite()
  {
    return addr;
  }

  /**
   * Returns the hostname of the host or proxy requesting authorization,
   * or <code>null</code> if not available.
   *
   * @return The name of the host requesting authentication, or
   * <code>null</code> if it is not available.
   *
   * @since 1.4
   */
  protected final String getRequestingHost()
  {
    return host;
  }

  /**
    * This method returns the port of the site that is requesting
    * authentication.
    *
    * @return The requesting port
    */
  protected final int getRequestingPort()
  {
    return port;
  }

  /**
    * This method returns the requesting protocol of the operation that is
    * requesting authentication
    *
    * @return The requesting protocol
    */
  protected final String getRequestingProtocol()
  {
    return protocol;
  }

  /**
    * Returns the prompt that should be used when requesting authentication
    * information from the user
    *
    * @return The user prompt
    */
  protected final String getRequestingPrompt()
  {
    return prompt;
  }

  /**
    * This method returns the authentication scheme in use
    *
    * @return The authentication scheme
    */
  protected final String getRequestingScheme()
  {
    return scheme;
  }

  /**
    * This method is called whenever a request for authentication is made.  It
    * can call the other getXXX methods to determine the information relevant
    * to this request.  Subclasses should override this method, which returns
    * <code>null</code> by default.
    *
    * @return The <code>PasswordAuthentication</code> information
    */
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return null;
  }
} // class Authenticator
