blob: b3f3d36d0958737fc22640448c0fd1b2d2ab49bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.net;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.geode.GemFireConfigException;
import org.apache.geode.annotations.internal.MakeNotStatic;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
public class SocketCreatorFactory {
@MakeNotStatic
private static SocketCreatorFactory instance = null;
@MakeNotStatic
private Map<SecurableCommunicationChannel, SocketCreator> socketCreators = new HashMap<>();
private DistributionConfig distributionConfig;
/**
* Here we parse the distribution distributionConfig and setup the required SocketCreators
*/
private void initializeSocketCreators(final DistributionConfig distributionConfig) {
if (distributionConfig == null) {
throw new GemFireConfigException(
"SocketCreatorFactory requires a valid distribution config.");
} else {
this.distributionConfig = distributionConfig;
}
}
private DistributionConfig getDistributionConfig() {
if (distributionConfig == null) {
throw new GemFireConfigException(
"SocketCreatorFactory requires a valid distribution config.");
}
return distributionConfig;
}
private static synchronized SocketCreatorFactory getInstance(boolean closing) {
if (instance == null && !closing) {
instance = new SocketCreatorFactory();
}
return instance;
}
private static synchronized SocketCreatorFactory getInstance() {
return getInstance(false);
}
public static SocketCreator getSocketCreatorForComponent(
final DistributionConfig distributionConfig,
final SecurableCommunicationChannel sslEnabledComponent) {
final SSLConfig sslConfigForComponent =
SSLConfigurationFactory.getSSLConfigForComponent(distributionConfig,
sslEnabledComponent);
return getInstance().getOrCreateSocketCreatorForSSLEnabledComponent(sslEnabledComponent,
sslConfigForComponent);
}
public static SocketCreator getSocketCreatorForComponent(
SecurableCommunicationChannel sslEnabledComponent) {
return getSocketCreatorForComponent(getInstance().getDistributionConfig(), sslEnabledComponent);
}
private SocketCreator getSSLSocketCreator(final SecurableCommunicationChannel sslComponent,
final SSLConfig sslConfig) {
if (sslConfig.isEnabled()) {
if (ArrayUtils.contains(getDistributionConfig().getSecurableCommunicationChannels(),
SecurableCommunicationChannel.ALL)) {
return createSSLSocketCreator(SecurableCommunicationChannel.ALL, sslConfig);
// } else if
// (ArrayUtils.contains(getDistributionConfig().getSecurableCommunicationChannels(),
// sslComponent)) {
} else {
return createSSLSocketCreator(sslComponent, sslConfig);
}
}
return createSSLSocketCreator(sslComponent, sslConfig);
}
private SocketCreator getOrCreateSocketCreatorForSSLEnabledComponent(
final SecurableCommunicationChannel sslEnabledComponent, final SSLConfig sslConfig) {
SocketCreator socketCreator = getRegisteredSocketCreatorForComponent(sslEnabledComponent);
if (socketCreator == null) {
return getSSLSocketCreator(sslEnabledComponent, sslConfig);
} else {
return socketCreator;
}
}
private SocketCreator createSSLSocketCreator(
final SecurableCommunicationChannel sslEnableComponent, final SSLConfig sslConfig) {
SocketCreator socketCreator = null;
if (sslConfig.isEnabled()) {
socketCreator = new SocketCreator(sslConfig);
registerSocketCreatorForComponent(sslEnableComponent, socketCreator);
} else {
socketCreator = getRegisteredSocketCreatorForComponent(sslEnableComponent);
if (socketCreator == null) {
socketCreator = new SocketCreator(sslConfig);
registerSocketCreatorForComponent(sslEnableComponent, socketCreator);
}
}
return socketCreator;
}
private synchronized void registerSocketCreatorForComponent(
SecurableCommunicationChannel sslEnabledComponent, SocketCreator socketCreator) {
socketCreators.put(sslEnabledComponent, socketCreator);
}
private synchronized SocketCreator getRegisteredSocketCreatorForComponent(
SecurableCommunicationChannel sslEnabledComponent) {
return socketCreators.get(sslEnabledComponent);
}
/**
* This a legacy SocketCreator initializer.
*
*
* @return SocketCreator for the defined properties
*
* @deprecated as of Geode 1.0
*/
@Deprecated
public static SocketCreator createNonDefaultInstance(final boolean useSSL,
final boolean needClientAuth, final String protocols, final String ciphers,
final Properties gfsecurityProps) {
SSLConfig sslConfig = SSLConfigurationFactory.getSSLConfigForComponent(useSSL, needClientAuth,
protocols, ciphers, gfsecurityProps, null);
return new SocketCreator(sslConfig);
}
public static void close() {
SocketCreatorFactory socketCreatorFactory = getInstance(true);
if (socketCreatorFactory != null) {
socketCreatorFactory.clearSocketCreators();
socketCreatorFactory.distributionConfig = null;
}
}
private synchronized void clearSocketCreators() {
socketCreators.clear();
}
public static SocketCreatorFactory setDistributionConfig(final DistributionConfig config) {
getInstance().initializeSocketCreators(config);
return getInstance();
}
}