/*
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors.
*
* Licensed 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.switchyard.as7.extension.services;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.switchyard.as7.extension.CommonAttributes;
import org.switchyard.as7.extension.services.SwitchYardSecurityConfigService.SecurityConfig;
import org.switchyard.common.lang.Strings;
import org.switchyard.security.context.SecurityContext;
import org.switchyard.security.crypto.PrivateCrypto;
import org.switchyard.security.crypto.PublicCrypto;
import org.switchyard.security.system.DefaultSystemSecurity;
import org.switchyard.security.system.SystemSecurity;
/**
* The SwitchYard SecurityConfig service.
*
* @author David Ward <<a href="mailto:dward@jboss.org">dward@jboss.org</a>> © 2013 Red Hat Inc.
*/
public class SwitchYardSecurityConfigService implements Service<SecurityConfig> {
/**
* Represents a SwitchYard SecurityConfig initializer service name.
*/
public static final ServiceName SERVICE_NAME = ServiceName.of("SwitchYardSecurityConfigService");
private final InjectedValue<SystemSecurity> _systemSecurity = new InjectedValue<SystemSecurity>();
private final InjectedValue<Map> _injectedValues = new InjectedValue<Map>();
private String _moduleId;
private ModelNode _model;
private SecurityConfig _securityConfig;
/**
* Constructs a SwitchYard SecurityConfig service.
*
* @param moduleId the module identifier
* @param model the Module's model operation
*/
public SwitchYardSecurityConfigService(String moduleId, ModelNode model) {
_moduleId = moduleId;
_model = model;
}
@Override
public SecurityConfig getValue() throws IllegalStateException,
IllegalArgumentException {
return _securityConfig;
}
@Override
public void start(StartContext context) throws StartException {
ModelNode propertiesModel = _model.hasDefined(CommonAttributes.PROPERTIES) ? _model.get(CommonAttributes.PROPERTIES) : null;
Properties securityProps = toProperties(propertiesModel);
_securityConfig = new SecurityConfig(securityProps);
DefaultSystemSecurity systemSecurity = (DefaultSystemSecurity)getSystemSecurity().getValue();
if (SecurityContext.class.getName().equals(_moduleId)) {
String timeoutMillis = Strings.trimToNull(securityProps.getProperty("timeoutMillis"));
if (timeoutMillis != null) {
systemSecurity.setSecurityContextTimeoutMillis(Long.valueOf(timeoutMillis));
}
}
if (PrivateCrypto.class.getName().equals(_moduleId)) {
systemSecurity.setPrivateCrypto(new PrivateCrypto(securityProps));
}
if (PublicCrypto.class.getName().equals(_moduleId)) {
systemSecurity.setPublicCrypto(new PublicCrypto(securityProps));
}
}
private Properties toProperties(ModelNode propertiesModel) {
Properties properties = new Properties();
if (propertiesModel != null) {
Set<String> names = propertiesModel.keys();
if (names != null) {
for (String name : names) {
String value = propertiesModel.get(name).asString();
if (value.startsWith(CommonAttributes.DOLLAR)) {
String key = value.substring(1);
String injectedValue = (String)_injectedValues.getValue().get(key);
if (injectedValue != null) {
properties.setProperty(name, injectedValue);
}
} else {
properties.setProperty(name, value);
}
}
}
}
return properties;
}
@Override
public void stop(StopContext context) {
}
/**
* SystemSecurity injection point.
*
* @return injected SystemSecurity
*/
public InjectedValue<SystemSecurity> getSystemSecurity() {
return _systemSecurity;
}
/**
* Injection point for injectValues.
*
* @return a map of injected values
*/
public InjectedValue<Map> getInjectedValues() {
return _injectedValues;
}
/**
* SecurityConfig.
*/
public static final class SecurityConfig {
private final Properties _properties;
/**
* Creates a new SecurityConfig with the specified properties.
* @param properties the properties
*/
public SecurityConfig(Properties properties) {
_properties = properties;
}
/**
* Gets the properties.
* @return the properties
*/
public Properties getProperties() {
return _properties;
}
}
}