/***** BEGIN LICENSE BLOCK *****
* Version: EPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Eclipse Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/epl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2006 Ola Bini <ola@ologix.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the EPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the EPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.jruby.ext.openssl.x509store;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.jruby.ext.openssl.x509store.X509Utils.*;
/**
* Provide a dynamically-growing list of X509 error messages.
*
* @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
*/
public class X509Error {
public static String getMessage(int reason) {
switch (reason) {
case X509_R_BAD_X509_FILETYPE:
return "bad x509 filetype";
case X509_R_BASE64_DECODE_ERROR:
return "base64 decode error";
case X509_R_CANT_CHECK_DH_KEY:
return "cant check dh key";
case X509_R_CERT_ALREADY_IN_HASH_TABLE:
return "cert already in hash table";
case X509_R_ERR_ASN1_LIB:
return "err asn1 lib";
case X509_R_INVALID_DIRECTORY:
return "invalid directory";
case X509_R_INVALID_FIELD_NAME:
return "invalid field name";
case X509_R_INVALID_TRUST:
return "invalid trust";
case X509_R_KEY_TYPE_MISMATCH:
return "key type mismatch";
case X509_R_KEY_VALUES_MISMATCH:
return "key values mismatch";
case X509_R_LOADING_CERT_DIR:
return "loading cert dir";
case X509_R_LOADING_DEFAULTS:
return "loading defaults";
case X509_R_METHOD_NOT_SUPPORTED:
return "method not supported";
case X509_R_NO_CERT_SET_FOR_US_TO_VERIFY:
return "no cert set for us to verify";
case X509_R_PUBLIC_KEY_DECODE_ERROR:
return "public key decode error";
case X509_R_PUBLIC_KEY_ENCODE_ERROR:
return "public key encode error";
case X509_R_SHOULD_RETRY:
return "should retry";
case X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN:
return "unable to find parameters in chain";
case X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY:
return "unable to get certs public key";
case X509_R_UNKNOWN_KEY_TYPE:
return "unknown key type";
case X509_R_UNKNOWN_NID:
return "unknown nid";
case X509_R_UNKNOWN_PURPOSE_ID:
return "unknown purpose id";
case X509_R_UNKNOWN_TRUST_ID:
return "unknown trust id";
case X509_R_UNSUPPORTED_ALGORITHM:
return "unsupported algorithm";
case X509_R_WRONG_LOOKUP_TYPE:
return "wrong lookup type";
case X509_R_WRONG_TYPE:
return "wrong type";
default:
return "(unknown X509 error)";
}
}
private static ThreadLocal<Map<Integer, String>> errors = new ThreadLocal<Map<Integer, String>>();
public static void addError(int reason) {
getErrors().put(reason, getMessage(reason));
}
public static void clearErrors() {
synchronized (errors) {
if ( errors.get() != null ) newErrorsMap();
}
}
public static Integer getLastError() {
Map<Integer, String> errorsMap = getErrorsImpl(false);
if ( errorsMap == null || errorsMap.isEmpty() ) return null;
final Iterator<Integer> i = errorsMap.keySet().iterator();
Integer lastError = null;
while ( i.hasNext() ) lastError = i.next();
if ( lastError != null ) i.remove(); // remove last
return lastError;
}
public static String getLastErrorMessage() {
final Integer lastError = getLastError();
return lastError == null ? null : getMessage(lastError);
}
public static Map<Integer, String> getErrors() {
return getErrorsImpl(true);
}
public static Map<Integer, String> getErrorsImpl(boolean required) {
Map<Integer, String> errorsMap = errors.get();
if ( errorsMap == null && required ) {
synchronized (errors) {
errorsMap = errors.get();
if ( errorsMap == null ) errorsMap = newErrorsMap();
}
}
return errorsMap;
}
private static Map<Integer, String> newErrorsMap() {
Map<Integer, String> map = new LinkedHashMap<Integer, String>(8);
errors.set(map); return map;
}
}// Err