/* GSSException.java -- a general exception in GSS.
   Copyright (C) 2004, 2005 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.

   The documentation comments of this class are derived from the text
   of RFC 2853:  Generic Security Service API Version 2: Java Bindings.
   That document is covered under the following license notice:

Copyright (C) The Internet Society (2000).  All Rights Reserved.

This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it
or assist in its implementation may be prepared, copied, published and
distributed, in whole or in part, without restriction of any kind,
provided that the above copyright notice and this paragraph are
included on all such copies and derivative works.  However, this
document itself may not be modified in any way, such as by removing
the copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the purpose of developing
Internet standards in which case the procedures for copyrights defined
in the Internet Standards process must be followed, or as required to
translate it into languages other than English.

The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. */


package org.ietf.jgss;

import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

/**
 * This exception is thrown whenever a fatal GSS-API error occurs
 * including mechanism specific errors.  It may contain both, the major
 * and minor, GSS-API status codes.  The mechanism implementers are
 * responsible for setting appropriate minor status codes when throwing
 * this exception.  Aside from delivering the numeric error code(s) to
 * the caller, this class performs the mapping from their numeric values
 * to textual representations.  All Java GSS-API methods are declared
 * throwing this exception.
 *
 * @specnote Some of the constant values defined in this class were
 * chosen to be compatible with J2SE 1.4, and not with RFC 2853.
 */
public class GSSException extends Exception
{
  /**
   * For compatability with Sun's JDK 1.4.2 rev. 5
   */
  private static final long serialVersionUID = -2706218945227726672L;

  // Constants and fields.
  // -------------------------------------------------------------------------

  /**
   * Channel bindings mismatch error.
   * @specnote Should be 4 according to RFC 2853.
   */
  public static final int BAD_BINDINGS = 1;

  /**
   * Unsupported mechanism requested error.
   * @specnote Should be 1 according to RFC 2853.
   */
  public static final int BAD_MECH = 2;

  /**
   * Invalid name provided error.
   * @specnote Should be 2 according to RFC 2853.
   */
  public static final int BAD_NAME = 3;

  /**
   * Name of unsupported type provided error.
   * @specnote Should be 3 according to RFC 2853.
   */
  public static final int BAD_NAMETYPE = 4;

  /**
   * Invalid status code error - this is the default status value.
   */
  public static final int BAD_STATUS = 5;

  /**
   * Token had invalid integrity check error.
   */
  public static final int BAD_MIC = 6;

  /**
   * Specified security context expired error.
   * @specnote Should be 12 according to RFC 2853.
   */
  public static final int CONTEXT_EXPIRED = 7;

  /**
   * Expired credentials detected error.
   * @specnote Should be 11 according to RFC 2853.
   */
  public static final int CREDENTIALS_EXPIRED = 8;

  /**
   * Defective credential error.
   * @specnote Should be 10 according to RFC 2853.
   */
  public static final int DEFECTIVE_CREDENTIAL = 9;

  /**
   * Defective token error.
   * @specnote Should be 9 according to RFC 2853.
   */
  public static final int DEFECTIVE_TOKEN = 10;

  /**
   * General failure, unspecified at GSS-API level.
   * @specnote Should be 13 according to RFC 2853.
   */
  public static final int FAILURE = 11;

  /**
   * Invalid security context error.
   * @specnote Should be 8 according to RFC 2853.
   */
  public static final int NO_CONTEXT = 12;

  /**
   * Invalid credentials error.
   * @specnote Should be 7 according to RFC 2853.
   */
  public static final int NO_CRED = 13;

  /**
   * Unsupported QOP value error.
   */
  public static final int BAD_QOP = 14;

  /**
   * Operation unauthorized error.
   */
  public static final int UNAUTHORIZED = 15;

  /**
   * Operation unavailable error.
   */
  public static final int UNAVAILABLE = 16;

  /**
   * Duplicate credential element requested error.
   */
  public static final int DUPLICATE_ELEMENT = 17;

  /**
   * Name contains multi-mechanism elements error.
   */
  public static final int NAME_NOT_MN = 18;

  /**
   * The token was a duplicate of an earlier token.  This is a fatal error
   * code that may occur during context establishment.  It is not used to
   * indicate supplementary status values.  The MessageProp object is used
   * for that purpose.
   * @specnote Should be 20 according to RFC 2853.
   */
  public static final int DUPLICATE_TOKEN = 19;

  /**
   * The token's validity period has expired.  This is a fatal error code
   * that may occur during context establishment.  It is not used to
   * indicate supplementary status values.  The MessageProp object is used
   * for that purpose.
   * @specnote Should be 19 according to RFC 2853.
   */
  public static final int OLD_TOKEN = 20;

  /**
   * A later token has already been processed.  This is a fatal error code
   * that may occur during context establishment.  It is not used to
   * indicate supplementary status values.  The MessageProp object is used
   * for that purpose.
   */
  public static final int UNSEQ_TOKEN = 21;

  /**
   * An expected per-message token was not received.  This is a fatal
   * error code that may occur during context establishment.  It is not
   * used to indicate supplementary status values.  The MessageProp object
   * is used for that purpose.
   */
  public static final int GAP_TOKEN = 22;

  private final int major;
  private int minor;
  private String minorString;

  private ResourceBundle messages;

  // Constructors.
  // -------------------------------------------------------------------------

  /**
   * Create a new GSS exception with the given major code.
   *
   * @param major The major GSS error code.
   */
  public GSSException(int major)
  {
    this(major, 0, null);
  }

  /**
   * Create a new GSS exception with the given major and minor codes, and a
   * minor explanation string.
   *
   * @param major The major GSS error code.
   * @param minor The minor application-specific error code.
   * @param minorString An explanation of the minor error code.
   */
  public GSSException(int major, int minor, String minorString)
  {
    this.major = major;
    this.minor = minor;
    this.minorString = minorString;
    try
      {
        messages = PropertyResourceBundle.getBundle("org/ietf/jgss/MessagesBundle");
      }
    catch (Exception e)
      {
        messages = null;
      }
  }

  // Instance methods.
  // -------------------------------------------------------------------------

  /**
   * Returns the major code representing the GSS error code that caused
   * this exception to be thrown.
   *
   * @return The major error code.
   */
  public int getMajor()
  {
    return major;
  }

  /**
   * Returns the mechanism error code that caused this exception.  The
   * minor code is set by the underlying mechanism.  Value of 0 indicates
   * that mechanism error code is not set.
   *
   * @return The minor error code, or 0 if not set.
   */
  public int getMinor()
  {
    return minor;
  }

  /**
   * Returns a string explaining the GSS major error code causing this
   * exception to be thrown.
   *
   * @return The major error string.
   */
  public String getMajorString()
  {
    switch (major)
      {
      case BAD_MECH:
        return getMsg("GSSException.BAD_MECH",
                      "An unsupported mechanism was requested.");
      case BAD_NAME:
        return getMsg("GSSException.BAD_NAME",
                      "An invalid name was supplied.");
      case BAD_NAMETYPE:
        return getMsg("GSSException.BAD_NAMETYPE",
                      "A supplied name was of an unsupported type.");
      case BAD_BINDINGS:
        return getMsg("GSSException.BAD_BINDINGS",
                      "Incorrect channel bindings were supplied.");
      case BAD_STATUS:
        return getMsg("GSSException.BAD_STATUS",
                      "An invalid status code was supplied.");
      case BAD_MIC:
        return getMsg("GSSException.BAD_MIC",
                      "A token had an invalid MIC.");
      case NO_CRED:
        return getMsg("GSSException.NO_CRED",
                      "No credentials were supplied, or the credentials were "+
                      "unavailable or inaccessible.");
      case NO_CONTEXT:
        return getMsg("GSSException.NO_CONTEXT",
                      "Invalid context has been supplied.");
      case DEFECTIVE_TOKEN:
        return getMsg("GSSException.DEFECTIVE_TOKEN",
                      "A supplied token was invalid.");
      case DEFECTIVE_CREDENTIAL:
        return getMsg("GSSException.DEFECTIVE_CREDENTIAL",
                      "A supplied credential was invalid.");
      case CREDENTIALS_EXPIRED:
        return getMsg("GSSException.CREDENTIALS_EXPIRED",
                      "The referenced credentials have expired.");
      case CONTEXT_EXPIRED:
        return getMsg("GSSException.CONTEXT_EXPIRED",
                      "The context has expired.");
      case FAILURE:
        return getMsg("GSSException.FAILURE",
                      "Miscellaneous failure.");
      case BAD_QOP:
        return getMsg("GSSException.BAD_QOP",
                      "The quality-of-protection requested could not be provided.");
      case UNAUTHORIZED:
        return getMsg("GSSException.UNAUTHORIZED",
                      "The operation is forbidden by local security policy.");
      case UNAVAILABLE:
        return getMsg("GSSException.UNAVAILABLE",
                      "The operation or option is unavailable.");
      case DUPLICATE_ELEMENT:
        return getMsg("GSSException.DUPLICATE_ELEMENT",
                      "The requested credential element already exists.");
      case NAME_NOT_MN:
        return getMsg("GSSException.NAME_NOT_MN",
                      "The provided name was not a mechanism name.");
      case OLD_TOKEN:
        return getMsg("GSSException.OLD_TOKEN",
                      "The token's validity period has expired.");
      case DUPLICATE_TOKEN:
        return getMsg("GSSException.DUPLICATE_TOKEN",
                      "The token was a duplicate of an earlier version.");
      case UNSEQ_TOKEN:
        return getMsg("GSSException.UNSEQ_TOKEN",
                      "A later token has already been processed.");
      case GAP_TOKEN:
        return getMsg("GSSException.GAP_TOKEN",
                      "An expected per-message token was not received.");
      default: return "Unknown or invalid error code.";
      }
  }

  /**
   * Returns a string explaining the mechanism specific error code.
   * <code>null</code> will be returned when no mechanism error code has
   * been set.
   *
   * @return The minor error string, or <code>null</code>.
   */
  public String getMinorString()
  {
    return minorString;
  }

  /**
   * Used internally by the GSS-API implementation and the underlying
   * mechanisms to set the minor code and its textual representation.
   *
   * @param minorCode The mechanism specific error code.
   * @param message   A textual explanation of the mechanism error code.
   */
  public void setMinor(int minorCode, String message)
  {
    this.minor = minorCode;
    this.minorString = message;
  }

  /**
   * Returns a textual representation of both the major and minor status
   * codes.
   *
   * @return The textual representation.
   */
  public String toString()
  {
    return GSSException.class.getName() + ": " + getMessage();
  }

  /**
   * Returns a detailed message of this exception.  Overrides {@link
   * Throwable#getMessage()}. It is customary in Java to use this method to
   * obtain exception information.
   *
   * @return The detail message.
   */
  public String getMessage()
  {
    if (minor == 0)
      return getMajorString();
    else
      return getMajorString() + " (" + minorString + ")";
  }

  // Own methods.
  // -------------------------------------------------------------------------

  private String getMsg(String key, String defaultText)
  {
    if (messages != null)
      {
        try
          {
            return messages.getString(key);
          }
        catch (Exception e)
          {
          }
      }
    return defaultText;
  }
}
