blob: 682413139eb0763ad6a2c5e7e810797f0dab053e [file] [log] [blame]
/*
* 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.
* under the License.
*/
package org.apache.karaf.jaas.modules.encryption;
import org.apache.karaf.jaas.modules.Encryption;
import org.apache.karaf.jaas.modules.EncryptionService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @author iocanel
*/
public class EncryptionSupport {
private final Logger logger = LoggerFactory.getLogger(EncryptionSupport.class);
private BundleContext bundleContext;
private Encryption encryption;
private String encryptionPrefix;
private String encryptionSuffix;
protected Map<String, ?> options;
protected boolean debug;
public EncryptionSupport(Map<String, ?> options) {
this.options = options;
this.debug = Boolean.parseBoolean((String) options.get("debug"));
// the bundle context is set in the Config JaasRealm by default
this.bundleContext = (BundleContext) options.get(BundleContext.class.getName());
}
public Encryption getEncryption() {
if (encryption == null) {
Map<String, String> encOpts = new HashMap<String, String>();
for (String key : options.keySet()) {
if (key.startsWith("encryption.")) {
encOpts.put(key.substring("encryption.".length()), options.get(key).toString());
}
}
encryptionPrefix = encOpts.remove("prefix");
encryptionSuffix = encOpts.remove("suffix");
boolean enabled = Boolean.parseBoolean(encOpts.remove("enabled"));
if (!enabled) {
if (debug) {
logger.debug("Encryption is disabled.");
}
} else {
String name = encOpts.remove("name");
if (debug) {
if (name != null && name.length() > 0) {
logger.debug("Encryption is enabled. Using service " + name + " with options " + encOpts);
} else {
logger.debug("Encryption is enabled. Using options " + encOpts);
}
}
// lookup the encryption service reference
ServiceReference[] encryptionServiceReferences;
try {
encryptionServiceReferences = bundleContext.getServiceReferences(
EncryptionService.class.getName(),
name != null && name.length() > 0 ? "(name=" + name + ")" : null);
} catch (InvalidSyntaxException e) {
throw new IllegalStateException("The encryption service filter is not well formed.", e);
}
if (encryptionServiceReferences == null || encryptionServiceReferences.length == 0) {
if (name != null && name.length() > 0) {
throw new IllegalStateException("Encryption service " + name + " not found. Please check that the encryption service is correctly set up.");
} else {
throw new IllegalStateException("No encryption service found. Please install the Karaf encryption feature and check that the encryption algorithm is supported..");
}
}
Arrays.sort(encryptionServiceReferences);
for (ServiceReference ref : encryptionServiceReferences) {
try {
EncryptionService encryptionService = (EncryptionService) bundleContext.getService(ref);
if (encryptionService != null) {
try {
encryption = encryptionService.createEncryption(encOpts);
if (encryption != null) {
break;
}
} finally {
bundleContext.ungetService(ref);
}
}
} catch (IllegalStateException e) {
// continue
}
}
if (encryption == null) {
throw new IllegalStateException("No EncryptionService supporting the required options could be found.");
}
}
}
return encryption;
}
public String getEncryptionSuffix() {
return encryptionSuffix;
}
public void setEncryptionSuffix(String encryptionSuffix) {
this.encryptionSuffix = encryptionSuffix;
}
public String getEncryptionPrefix() {
return encryptionPrefix;
}
public void setEncryptionPrefix(String encryptionPrefix) {
this.encryptionPrefix = encryptionPrefix;
}
}