001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * docs/licenses/cddl.txt 011 * or http://www.opensource.org/licenses/cddl1.php. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * docs/licenses/cddl.txt. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2010-2012 UnboundID Corp. 026 */ 027 package com.unboundid.directory.sdk.common.api; 028 029 030 031 import java.util.Collections; 032 import java.util.List; 033 import java.util.Map; 034 import javax.net.ssl.TrustManager; 035 036 import com.unboundid.directory.sdk.common.config.TrustManagerProviderConfig; 037 import com.unboundid.directory.sdk.common.internal.ExampleUsageProvider; 038 import com.unboundid.directory.sdk.common.internal.Reconfigurable; 039 import com.unboundid.directory.sdk.common.internal.UnboundIDExtension; 040 import com.unboundid.directory.sdk.common.types.ServerContext; 041 import com.unboundid.directory.sdk.ds.internal.DirectoryServerExtension; 042 import com.unboundid.directory.sdk.proxy.internal.DirectoryProxyServerExtension; 043 import com.unboundid.directory.sdk.sync.internal.SynchronizationServerExtension; 044 import com.unboundid.ldap.sdk.LDAPException; 045 import com.unboundid.ldap.sdk.ResultCode; 046 import com.unboundid.util.Extensible; 047 import com.unboundid.util.ThreadSafety; 048 import com.unboundid.util.ThreadSafetyLevel; 049 import com.unboundid.util.args.ArgumentException; 050 import com.unboundid.util.args.ArgumentParser; 051 052 053 054 /** 055 * This class defines an API that must be implemented by extensions which 056 * provide access to trust managers which are used to determine whether to trust 057 * a certificate that has been presented to the server. Trust managers are 058 * generally used when performing cryptographic operations, including SSL and 059 * StartTLS communication, in which a certificate is presented to the server. 060 * In such cases, the secure communication will only be allowed if the trust 061 * managers determine that the presented certificate chain is trustworthy. 062 * <BR> 063 * <H2>Configuring Trust Manager Providers</H2> 064 * In order to configure a trust manager provider created using this API, use a 065 * command like: 066 * <PRE> 067 * dsconfig create-trust-manager-provider \ 068 * --provider-name "<I>{provider-name}</I>" \ 069 * --type third-party \ 070 * --set enabled:true \ 071 * --set "extension-class:<I>{class-name}</I>" \ 072 * --set "extension-argument:<I>{name=value}</I>" 073 * </PRE> 074 * where "<I>{provider-name}</I>" is the name to use for the trust manager 075 * provider instance, "<I>{class-name}</I>" is the fully-qualified name of the 076 * Java class that extends 077 * {@code com.unboundid.directory.sdk.common.api.TrustManagerProvider}, and 078 * "<I>{name=value}</I>" represents name-value pairs for any arguments to 079 * provide to the trust manager provider. If multiple arguments should be 080 * provided to the trust manager provider, then the 081 * "<CODE>--set extension-argument:<I>{name=value}</I></CODE>" option should be 082 * provided multiple times. 083 */ 084 @Extensible() 085 @DirectoryServerExtension() 086 @DirectoryProxyServerExtension(appliesToLocalContent=true, 087 appliesToRemoteContent=false) 088 @SynchronizationServerExtension(appliesToLocalContent=true, 089 appliesToSynchronizedContent=false) 090 @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE) 091 public abstract class TrustManagerProvider 092 implements UnboundIDExtension, 093 Reconfigurable<TrustManagerProviderConfig>, 094 ExampleUsageProvider 095 { 096 /** 097 * Creates a new instance of this trust manager provider. All trust manager 098 * provider implementations must include a default constructor, but any 099 * initialization should generally be done in the 100 * {@code initializeTrustManagerProvider} method. 101 */ 102 public TrustManagerProvider() 103 { 104 // No implementation is required. 105 } 106 107 108 109 /** 110 * {@inheritDoc} 111 */ 112 public abstract String getExtensionName(); 113 114 115 116 /** 117 * {@inheritDoc} 118 */ 119 public abstract String[] getExtensionDescription(); 120 121 122 123 /** 124 * {@inheritDoc} 125 */ 126 public void defineConfigArguments(final ArgumentParser parser) 127 throws ArgumentException 128 { 129 // No arguments will be allowed by default. 130 } 131 132 133 134 /** 135 * Initializes this trust manager provider. 136 * 137 * @param serverContext A handle to the server context for the server in 138 * which this extension is running. 139 * @param config The general configuration for this trust manager 140 * provider. 141 * @param parser The argument parser which has been initialized from 142 * the configuration for this trust manager provider. 143 * 144 * @throws LDAPException If a problem occurs while initializing this 145 * trust manager provider. 146 */ 147 public void initializeTrustManagerProvider(final ServerContext serverContext, 148 final TrustManagerProviderConfig config, 149 final ArgumentParser parser) 150 throws LDAPException 151 { 152 // No initialization will be performed by default. 153 } 154 155 156 157 /** 158 * {@inheritDoc} 159 */ 160 public boolean isConfigurationAcceptable( 161 final TrustManagerProviderConfig config, 162 final ArgumentParser parser, 163 final List<String> unacceptableReasons) 164 { 165 // No extended validation will be performed by default. 166 return true; 167 } 168 169 170 171 /** 172 * {@inheritDoc} 173 */ 174 public ResultCode applyConfiguration(final TrustManagerProviderConfig config, 175 final ArgumentParser parser, 176 final List<String> adminActionsRequired, 177 final List<String> messages) 178 { 179 // By default, no configuration changes will be applied. If there are any 180 // arguments, then add an admin action message indicating that the extension 181 // needs to be restarted for any changes to take effect. 182 if (! parser.getNamedArguments().isEmpty()) 183 { 184 adminActionsRequired.add( 185 "No configuration change has actually been applied. The new " + 186 "configuration will not take effect until this trust manager " + 187 "provider is disabled and re-enabled or until the server is " + 188 "restarted."); 189 } 190 191 return ResultCode.SUCCESS; 192 } 193 194 195 196 /** 197 * Performs any cleanup which may be necessary when this trust manager 198 * provider is to be taken out of service. 199 */ 200 public void finalizeTrustManagerProvider() 201 { 202 // No implementation is required. 203 } 204 205 206 207 /** 208 * Retrieves a set of trust managers that may be used for operations within 209 * the server which may need to determine whether to trust a presented 210 * certificate chain. 211 * 212 * @return The set of trust managers that may be used for operations within 213 * the server which may need to determine whether to trust a 214 * presented certificate chain. 215 * 216 * @throws LDAPException If a problem occurs while attempting to retrieve 217 * the trust managers. 218 */ 219 public abstract TrustManager[] getTrustManagers() 220 throws LDAPException; 221 222 223 224 /** 225 * {@inheritDoc} 226 */ 227 public Map<List<String>,String> getExamplesArgumentSets() 228 { 229 return Collections.emptyMap(); 230 } 231 }