jdk/src/java.base/share/classes/sun/security/provider/certpath/BuildStep.java
changeset 25859 3317bb8137f4
parent 12860 9ffbd4e43413
child 30374 2abaf49910ea
equal deleted inserted replaced
25858:836adbf7a2cd 25859:3317bb8137f4
       
     1 /*
       
     2  * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package sun.security.provider.certpath;
       
    27 
       
    28 import java.security.cert.X509Certificate;
       
    29 
       
    30 /**
       
    31  * Describes one step of a certification path build, consisting of a
       
    32  * <code>Vertex</code> state description, a certificate, a possible throwable,
       
    33  * and a result code.
       
    34  *
       
    35  * @author      Anne Anderson
       
    36  * @since       1.4
       
    37  * @see sun.security.provider.certpath.Vertex
       
    38  */
       
    39 public class BuildStep {
       
    40 
       
    41     private Vertex          vertex;
       
    42     private X509Certificate cert;
       
    43     private Throwable       throwable;
       
    44     private int             result;
       
    45 
       
    46     /**
       
    47      * result code associated with a certificate that may continue a path from
       
    48      * the current certificate.
       
    49      */
       
    50     public static final int POSSIBLE = 1;
       
    51 
       
    52     /**
       
    53      * result code associated with a certificate that was tried, but that
       
    54      * represents an unsuccessful path, so the certificate has been backed out
       
    55      * to allow backtracking to the next possible path.
       
    56      */
       
    57     public static final int BACK = 2;
       
    58 
       
    59     /**
       
    60      * result code associated with a certificate that successfully continues the
       
    61      * current path, but does not yet reach the target.
       
    62      */
       
    63     public static final int FOLLOW = 3;
       
    64 
       
    65     /**
       
    66      * result code associated with a certificate that represents the end of the
       
    67      * last possible path, where no path successfully reached the target.
       
    68      */
       
    69     public static final int FAIL = 4;
       
    70 
       
    71     /**
       
    72      * result code associated with a certificate that represents the end of a
       
    73      * path that successfully reaches the target.
       
    74      */
       
    75     public static final int SUCCEED = 5;
       
    76 
       
    77     /**
       
    78      * construct a BuildStep
       
    79      *
       
    80      * @param vtx description of the vertex at this step
       
    81      * @param res result, where result is one of POSSIBLE, BACK,
       
    82      *            FOLLOW, FAIL, SUCCEED
       
    83      */
       
    84     public BuildStep(Vertex vtx, int res) {
       
    85         vertex = vtx;
       
    86         if (vertex != null) {
       
    87             cert = vertex.getCertificate();
       
    88             throwable = vertex.getThrowable();
       
    89         }
       
    90         result = res;
       
    91     }
       
    92 
       
    93     /**
       
    94      * return vertex description for this build step
       
    95      *
       
    96      * @returns Vertex
       
    97      */
       
    98     public Vertex getVertex() {
       
    99         return vertex;
       
   100     }
       
   101 
       
   102     /**
       
   103      * return the certificate associated with this build step
       
   104      *
       
   105      * @returns X509Certificate
       
   106      */
       
   107     public X509Certificate getCertificate() {
       
   108         return cert;
       
   109     }
       
   110 
       
   111     /**
       
   112      * return string form of issuer name from certificate associated with this
       
   113      * build step
       
   114      *
       
   115      * @returns String form of issuer name or null, if no certificate.
       
   116      */
       
   117     public String getIssuerName() {
       
   118         return getIssuerName(null);
       
   119     }
       
   120 
       
   121     /**
       
   122      * return string form of issuer name from certificate associated with this
       
   123      * build step, or a default name if no certificate associated with this
       
   124      * build step, or if issuer name could not be obtained from the certificate.
       
   125      *
       
   126      * @param defaultName name to use as default if unable to return an issuer
       
   127      * name from the certificate, or if no certificate.
       
   128      * @returns String form of issuer name or defaultName, if no certificate or
       
   129      * exception received while trying to extract issuer name from certificate.
       
   130      */
       
   131     public String getIssuerName(String defaultName) {
       
   132         return (cert == null ? defaultName
       
   133                              : cert.getIssuerX500Principal().toString());
       
   134     }
       
   135 
       
   136     /**
       
   137      * return string form of subject name from certificate associated with this
       
   138      * build step.
       
   139      *
       
   140      * @returns String form of subject name or null, if no certificate.
       
   141      */
       
   142     public String getSubjectName() {
       
   143         return getSubjectName(null);
       
   144     }
       
   145 
       
   146     /**
       
   147      * return string form of subject name from certificate associated with this
       
   148      * build step, or a default name if no certificate associated with this
       
   149      * build step, or if subject name could not be obtained from the
       
   150      * certificate.
       
   151      *
       
   152      * @param defaultName name to use as default if unable to return a subject
       
   153      * name from the certificate, or if no certificate.
       
   154      * @returns String form of subject name or defaultName, if no certificate or
       
   155      * if an exception was received while attempting to extract the subject name
       
   156      * from the certificate.
       
   157      */
       
   158     public String getSubjectName(String defaultName) {
       
   159         return (cert == null ? defaultName
       
   160                              : cert.getSubjectX500Principal().toString());
       
   161     }
       
   162 
       
   163     /**
       
   164      * return the exception associated with this build step.
       
   165      *
       
   166      * @returns Throwable
       
   167      */
       
   168     public Throwable getThrowable() {
       
   169         return throwable;
       
   170     }
       
   171 
       
   172     /**
       
   173      * return the result code associated with this build step.  The result codes
       
   174      * are POSSIBLE, FOLLOW, BACK, FAIL, SUCCEED.
       
   175      *
       
   176      * @returns int result code
       
   177      */
       
   178     public int getResult() {
       
   179         return result;
       
   180     }
       
   181 
       
   182     /**
       
   183      * return a string representing the meaning of the result code associated
       
   184      * with this build step.
       
   185      *
       
   186      * @param   res    result code
       
   187      * @returns String string representing meaning of the result code
       
   188      */
       
   189     public String resultToString(int res) {
       
   190         String resultString = "";
       
   191         switch (res) {
       
   192             case POSSIBLE:
       
   193                 resultString = "Certificate to be tried.\n";
       
   194                 break;
       
   195             case BACK:
       
   196                 resultString = "Certificate backed out since path does not "
       
   197                     + "satisfy build requirements.\n";
       
   198                 break;
       
   199             case FOLLOW:
       
   200                 resultString = "Certificate satisfies conditions.\n";
       
   201                 break;
       
   202             case FAIL:
       
   203                 resultString = "Certificate backed out since path does not "
       
   204                     + "satisfy conditions.\n";
       
   205                 break;
       
   206             case SUCCEED:
       
   207                 resultString = "Certificate satisfies conditions.\n";
       
   208                 break;
       
   209             default:
       
   210                 resultString = "Internal error: Invalid step result value.\n";
       
   211         }
       
   212         return resultString;
       
   213     }
       
   214 
       
   215     /**
       
   216      * return a string representation of this build step, showing minimal
       
   217      * detail.
       
   218      *
       
   219      * @returns String
       
   220      */
       
   221     @Override
       
   222     public String toString() {
       
   223         String out = "Internal Error\n";
       
   224         switch (result) {
       
   225         case BACK:
       
   226         case FAIL:
       
   227             out = resultToString(result);
       
   228             out = out + vertex.throwableToString();
       
   229             break;
       
   230         case FOLLOW:
       
   231         case SUCCEED:
       
   232         case POSSIBLE:
       
   233             out = resultToString(result);
       
   234             break;
       
   235         default:
       
   236             out = "Internal Error: Invalid step result\n";
       
   237         }
       
   238         return out;
       
   239     }
       
   240 
       
   241     /**
       
   242      * return a string representation of this build step, showing all detail of
       
   243      * the vertex state appropriate to the result of this build step, and the
       
   244      * certificate contents.
       
   245      *
       
   246      * @returns String
       
   247      */
       
   248     public String verboseToString() {
       
   249         String out = resultToString(getResult());
       
   250         switch (result) {
       
   251         case BACK:
       
   252         case FAIL:
       
   253             out = out + vertex.throwableToString();
       
   254             break;
       
   255         case FOLLOW:
       
   256         case SUCCEED:
       
   257             out = out + vertex.moreToString();
       
   258             break;
       
   259         case POSSIBLE:
       
   260             break;
       
   261         default:
       
   262             break;
       
   263         }
       
   264         out = out + "Certificate contains:\n" + vertex.certToString();
       
   265         return out;
       
   266     }
       
   267 
       
   268     /**
       
   269      * return a string representation of this build step, including all possible
       
   270      * detail of the vertex state, but not including the certificate contents.
       
   271      *
       
   272      * @returns String
       
   273      */
       
   274     public String fullToString() {
       
   275         return resultToString(getResult()) + vertex.toString();
       
   276     }
       
   277 }