Source for java.net.Authenticator

   1: /* Authenticator.java -- Abstract class for obtaining authentication info
   2:    Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: package java.net;
  39: 
  40: 
  41: /**
  42:   * This abstract class provides a model for obtaining authentication
  43:   * information (in the form of a username and password) required by
  44:   * some network operations (such as hitting a password protected
  45:   * web site).
  46:   * <p>
  47:   * To make use of this feature, a programmer must create a subclass
  48:   * that knows how to obtain the necessary info.  An example
  49:   * would be a class that popped up a dialog box to prompt the user.
  50:   * After creating an instance of that subclass, the static
  51:   * <code>setDefault</code> method of this class is called to set up
  52:   * that instance as the object to use on subsequent calls to obtain
  53:   * authorization.
  54:   *
  55:   * @since 1.2
  56:   *
  57:   * @author Aaron M. Renn (arenn@urbanophile.com)
  58:   * @status Believed to be JDK 1.4 complete
  59:   */
  60: public abstract class Authenticator
  61: {
  62:   /*
  63:    * Class Variables
  64:    */
  65: 
  66:   /**
  67:     * This is the default Authenticator object to use for password requests
  68:     */
  69:   private static Authenticator defaultAuthenticator;
  70: 
  71:   /*
  72:    * Instance Variables
  73:    */
  74: 
  75:   /**
  76:     * The hostname of the site requesting authentication
  77:     */
  78:   private String host;
  79: 
  80:   /**
  81:     * InternetAddress of the site requesting authentication
  82:     */
  83:   private InetAddress addr;
  84: 
  85:   /**
  86:     * The port number of the site requesting authentication
  87:     */
  88:   private int port;
  89: 
  90:   /**
  91:     * The protocol name of the site requesting authentication
  92:     */
  93:   private String protocol;
  94: 
  95:   /**
  96:     * The prompt to display to the user when requesting authentication info
  97:     */
  98:   private String prompt;
  99: 
 100:   /**
 101:     * The authentication scheme in use
 102:     */
 103:   private String scheme;
 104: 
 105:   /*
 106:    * Class Methods
 107:    */
 108: 
 109:   /**
 110:     * This method sets the default <code>Authenticator</code> object (an
 111:     * instance of a subclass of <code>Authenticator</code>) to use when
 112:     * prompting the user for
 113:     * information.  Note that this method checks to see if the caller is
 114:     * allowed to set this value (the "setDefaultAuthenticator" permission)
 115:     * and throws a <code>SecurityException</code> if it is not.
 116:     *
 117:     * @param defAuth The new default <code>Authenticator</code> object to use
 118:     *
 119:     * @exception SecurityException If the caller does not have permission
 120:     * to perform this operation
 121:     */
 122:   public static void setDefault(Authenticator defAuth)
 123:   {
 124:     SecurityManager sm = System.getSecurityManager();
 125:     if (sm != null)
 126:       sm.checkPermission(new NetPermission("setDefaultAuthenticator"));
 127: 
 128:     defaultAuthenticator = defAuth;
 129:   }
 130: 
 131:   /**
 132:     * This method is called whenever a username and password for a given
 133:     * network operation is required.  First, a security check is made to see
 134:     * if the caller has the "requestPasswordAuthentication"
 135:     * permission.  If not, the method thows an exception.  If there is no
 136:     * default <code>Authenticator</code> object, the method then returns
 137:     * <code>null</code>.  Otherwise, the default authenticators's instance
 138:     * variables are initialized and it's <code>getPasswordAuthentication</code>
 139:     * method is called to get the actual authentication information to return.
 140:     *
 141:     * @param addr The address requesting authentication
 142:     * @param port The port requesting authentication
 143:     * @param protocol The protocol requesting authentication
 144:     * @param prompt The prompt to display to the user when requesting
 145:     *        authentication info
 146:     * @param scheme The authentication scheme in use
 147:     *
 148:     * @return A <code>PasswordAuthentication</code> object with the user's
 149:     *         authentication info.
 150:     *
 151:     * @exception SecurityException If the caller does not have permission to
 152:     *         perform this operation
 153:     */
 154:   public static PasswordAuthentication requestPasswordAuthentication(InetAddress addr,
 155:                                                                      int port,
 156:                                                                      String protocol,
 157:                                                                      String prompt,
 158:                                                                      String scheme)
 159:     throws SecurityException
 160:   {
 161:     return requestPasswordAuthentication(null, addr, port, protocol, prompt,
 162:                                          scheme);
 163:   }
 164: 
 165:   /**
 166:     * This method is called whenever a username and password for a given
 167:     * network operation is required.  First, a security check is made to see
 168:     * if the caller has the "requestPasswordAuthentication"
 169:     * permission.  If not, the method thows an exception.  If there is no
 170:     * default <code>Authenticator</code> object, the method then returns
 171:     * <code>null</code>.  Otherwise, the default authenticators's instance
 172:     * variables are initialized and it's <code>getPasswordAuthentication</code>
 173:     * method is called to get the actual authentication information to return.
 174:     * This method is the preferred one as it can be used with hostname
 175:     * when addr is unknown.
 176:     *
 177:     * @param host The hostname requesting authentication
 178:     * @param addr The address requesting authentication
 179:     * @param port The port requesting authentication
 180:     * @param protocol The protocol requesting authentication
 181:     * @param prompt The prompt to display to the user when requesting
 182:     *        authentication info
 183:     * @param scheme The authentication scheme in use
 184:     *
 185:     * @return A <code>PasswordAuthentication</code> object with the user's
 186:     *         authentication info.
 187:     *
 188:     * @exception SecurityException If the caller does not have permission to
 189:     *         perform this operation
 190:     *
 191:     * @since 1.4
 192:     */
 193:   public static PasswordAuthentication requestPasswordAuthentication(String host,
 194:                                                                      InetAddress addr,
 195:                                                                      int port,
 196:                                                                      String protocol,
 197:                                                                      String prompt,
 198:                                                                      String scheme)
 199:     throws SecurityException
 200:   {
 201:     SecurityManager sm = System.getSecurityManager();
 202:     if (sm != null)
 203:       sm.checkPermission(new NetPermission("requestPasswordAuthentication"));
 204: 
 205:     if (defaultAuthenticator == null)
 206:       return null;
 207: 
 208:     defaultAuthenticator.host = host;
 209:     defaultAuthenticator.addr = addr;
 210:     defaultAuthenticator.port = port;
 211:     defaultAuthenticator.protocol = protocol;
 212:     defaultAuthenticator.prompt = prompt;
 213:     defaultAuthenticator.scheme = scheme;
 214: 
 215:     return defaultAuthenticator.getPasswordAuthentication();
 216:   }
 217: 
 218:   /*
 219:    * Constructors
 220:    */
 221: 
 222:   /**
 223:     * Default, no-argument constructor for subclasses to call.
 224:     */
 225:   public Authenticator()
 226:   {
 227:   }
 228: 
 229:   /*
 230:    * Instance Methods
 231:    */
 232: 
 233:   /**
 234:     * This method returns the address of the site that is requesting
 235:     * authentication.
 236:     *
 237:     * @return The requesting site's address
 238:     */
 239:   protected final InetAddress getRequestingSite()
 240:   {
 241:     return addr;
 242:   }
 243: 
 244:   /**
 245:    * Returns the hostname of the host or proxy requesting authorization,
 246:    * or <code>null</code> if not available.
 247:    *
 248:    * @return The name of the host requesting authentication, or
 249:    * <code>null</code> if it is not available.
 250:    *
 251:    * @since 1.4
 252:    */
 253:   protected final String getRequestingHost()
 254:   {
 255:     return host;
 256:   }
 257: 
 258:   /**
 259:     * This method returns the port of the site that is requesting
 260:     * authentication.
 261:     *
 262:     * @return The requesting port
 263:     */
 264:   protected final int getRequestingPort()
 265:   {
 266:     return port;
 267:   }
 268: 
 269:   /**
 270:     * This method returns the requesting protocol of the operation that is
 271:     * requesting authentication
 272:     *
 273:     * @return The requesting protocol
 274:     */
 275:   protected final String getRequestingProtocol()
 276:   {
 277:     return protocol;
 278:   }
 279: 
 280:   /**
 281:     * Returns the prompt that should be used when requesting authentication
 282:     * information from the user
 283:     *
 284:     * @return The user prompt
 285:     */
 286:   protected final String getRequestingPrompt()
 287:   {
 288:     return prompt;
 289:   }
 290: 
 291:   /**
 292:     * This method returns the authentication scheme in use
 293:     *
 294:     * @return The authentication scheme
 295:     */
 296:   protected final String getRequestingScheme()
 297:   {
 298:     return scheme;
 299:   }
 300: 
 301:   /**
 302:     * This method is called whenever a request for authentication is made.  It
 303:     * can call the other getXXX methods to determine the information relevant
 304:     * to this request.  Subclasses should override this method, which returns
 305:     * <code>null</code> by default.
 306:     *
 307:     * @return The <code>PasswordAuthentication</code> information
 308:     */
 309:   protected PasswordAuthentication getPasswordAuthentication()
 310:   {
 311:     return null;
 312:   }
 313: } // class Authenticator