/* | 
|
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. | 
|
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|
 * | 
|
 * This code is free software; you can redistribute it and/or modify it | 
|
 * under the terms of the GNU General Public License version 2 only, as | 
|
 * published by the Free Software Foundation.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * This code 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 | 
|
 * version 2 for more details (a copy is included in the LICENSE file that | 
|
 * accompanied this code). | 
|
 * | 
|
 * You should have received a copy of the GNU General Public License version | 
|
 * 2 along with this work; if not, write to the Free Software Foundation, | 
|
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|
 * | 
|
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package java.security;  | 
|
import java.net.URI;  | 
|
import java.util.*;  | 
|
import static java.security.KeyStore.*;  | 
|
/** | 
|
 * Configuration data that specifies the keystores in a keystore domain. | 
|
 * A keystore domain is a collection of keystores that are presented as a | 
|
 * single logical keystore. The configuration data is used during | 
|
 * {@code KeyStore} | 
|
 * {@link KeyStore#load(KeyStore.LoadStoreParameter) load} and | 
|
 * {@link KeyStore#store(KeyStore.LoadStoreParameter) store} operations. | 
|
 * <p> | 
|
 * The following syntax is supported for configuration data: | 
|
 * <pre>{@code | 
|
 *     domain <domainName> [<property> ...] { | 
|
 *         keystore <keystoreName> [<property> ...] ; | 
|
 *         ... | 
|
 *     }; | 
|
 *     ... | 
|
 * }</pre> | 
|
 * where {@code domainName} and {@code keystoreName} are identifiers | 
|
 * and {@code property} is a key/value pairing. The key and value are | 
|
 * separated by an 'equals' symbol and the value is enclosed in double | 
|
 * quotes. A property value may be either a printable string or a binary | 
|
 * string of colon-separated pairs of hexadecimal digits. Multi-valued | 
|
 * properties are represented as a comma-separated list of values, | 
|
 * enclosed in square brackets. | 
|
 * See {@link Arrays#toString(java.lang.Object[])}. | 
|
 * <p> | 
|
 * To ensure that keystore entries are uniquely identified, each | 
|
 * entry's alias is prefixed by its {@code keystoreName} followed | 
|
 * by the entry name separator and each {@code keystoreName} must be | 
|
 * unique within its domain. Entry name prefixes are omitted when | 
|
 * storing a keystore. | 
|
 * <p> | 
|
 * Properties are context-sensitive: properties that apply to | 
|
 * all the keystores in a domain are located in the domain clause, | 
|
 * and properties that apply only to a specific keystore are located | 
|
 * in that keystore's clause. | 
|
 * Unless otherwise specified, a property in a keystore clause overrides | 
|
 * a property of the same name in the domain clause. All property names | 
|
 * are case-insensitive. The following properties are supported: | 
|
 * <dl> | 
|
 * <dt> {@code keystoreType="<type>"} </dt> | 
|
 *     <dd> The keystore type. </dd> | 
|
 * <dt> {@code keystoreURI="<url>"} </dt> | 
|
 *     <dd> The keystore location. </dd> | 
|
 * <dt> {@code keystoreProviderName="<name>"} </dt> | 
|
 *     <dd> The name of the keystore's JCE provider. </dd> | 
|
 * <dt> {@code keystorePasswordEnv="<environment-variable>"} </dt> | 
|
 *     <dd> The environment variable that stores a keystore password. | 
|
 *          Alternatively, passwords may be supplied to the constructor | 
|
 *          method in a {@code Map<String, ProtectionParameter>}. </dd> | 
|
 * <dt> {@code entryNameSeparator="<separator>"} </dt> | 
|
 *     <dd> The separator between a keystore name prefix and an entry name. | 
|
 *          When specified, it applies to all the entries in a domain. | 
|
 *          Its default value is a space. </dd> | 
|
 * </dl> | 
|
 * <p> | 
|
 * For example, configuration data for a simple keystore domain | 
|
 * comprising three keystores is shown below: | 
|
 * <pre> | 
|
 * | 
|
 * domain app1 { | 
|
 *     keystore app1-truststore | 
|
 *         keystoreURI="file:///app1/etc/truststore.jks"; | 
|
 * | 
|
 *     keystore system-truststore | 
|
 *         keystoreURI="${java.home}/lib/security/cacerts"; | 
|
 * | 
|
 *     keystore app1-keystore | 
|
 *         keystoreType="PKCS12" | 
|
 *         keystoreURI="file:///app1/etc/keystore.p12"; | 
|
 * }; | 
|
 * | 
|
 * </pre> | 
|
 * @since 1.8 | 
|
*/  | 
|
public final class DomainLoadStoreParameter implements LoadStoreParameter { | 
|
private final URI configuration;  | 
|
private final Map<String,ProtectionParameter> protectionParams;  | 
|
    /** | 
|
     * Constructs a DomainLoadStoreParameter for a keystore domain with | 
|
     * the parameters used to protect keystore data. | 
|
     * | 
|
     * @param configuration identifier for the domain configuration data. | 
|
     *     The name of the target domain should be specified in the | 
|
     *     {@code java.net.URI} fragment component when it is necessary | 
|
     *     to distinguish between several domain configurations at the | 
|
     *     same location. | 
|
     * | 
|
     * @param protectionParams the map from keystore name to the parameter | 
|
     *     used to protect keystore data. | 
|
     *     A {@code java.util.Collections.EMPTY_MAP} should be used | 
|
     *     when protection parameters are not required or when they have | 
|
     *     been specified by properties in the domain configuration data. | 
|
     *     It is cloned to prevent subsequent modification. | 
|
     * | 
|
     * @exception NullPointerException if {@code configuration} or | 
|
     *     {@code protectionParams} is {@code null} | 
|
*/  | 
|
public DomainLoadStoreParameter(URI configuration,  | 
|
Map<String,ProtectionParameter> protectionParams) {  | 
|
if (configuration == null || protectionParams == null) {  | 
|
throw new NullPointerException("invalid null input");  | 
|
}  | 
|
this.configuration = configuration;  | 
|
this.protectionParams =  | 
|
Collections.unmodifiableMap(new HashMap<>(protectionParams));  | 
|
}  | 
|
    /** | 
|
     * Gets the identifier for the domain configuration data. | 
|
     * | 
|
     * @return the identifier for the configuration data | 
|
*/  | 
|
public URI getConfiguration() {  | 
|
return configuration;  | 
|
}  | 
|
    /** | 
|
     * Gets the keystore protection parameters for keystores in this | 
|
     * domain. | 
|
     * | 
|
     * @return an unmodifiable map of keystore names to protection | 
|
     *     parameters | 
|
*/  | 
|
public Map<String,ProtectionParameter> getProtectionParams() {  | 
|
return protectionParams;  | 
|
}  | 
|
    /** | 
|
     * Gets the keystore protection parameters for this domain. | 
|
     * Keystore domains do not support a protection parameter. | 
|
     * | 
|
     * @return always returns {@code null} | 
|
*/  | 
|
@Override  | 
|
public KeyStore.ProtectionParameter getProtectionParameter() {  | 
|
return null;  | 
|
}  | 
|
}  |