blob: 5af7f8e9ddf6b64913b885f2885e0273381b4f6a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.security.ui;
import java.io.PrintWriter;
import java.security.Provider;
import java.security.Security;
import java.util.*;
import java.util.Map.Entry;
import org.eclipse.ui.about.ISystemSummarySection;
public class SecurityConfigurationSection implements ISystemSummarySection {
private static final String ALG_ALIAS = "Alg.Alias."; //$NON-NLS-1$
private static final String PROVIDER = "Provider."; //$NON-NLS-1$
@Override
public void write(PrintWriter writer) {
Provider[] providers = Security.getProviders();
writer.println("Providers (" + providers.length + "): ");//$NON-NLS-1$ //$NON-NLS-2$
writer.println();
for (int i = 0; i < providers.length; i++) {
appendProvider(writer, providers[i], i);
}
}
private void appendProvider(PrintWriter writer, Provider provider, int index) {
writer.println(" Provider: " + provider.getName() + ", Version: " + provider.getVersion() + ", Class: " + provider.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
writer.println(" Description: " + provider.getInfo()); //$NON-NLS-1$
ProviderService[] services = getServices(provider);
writer.println(" Services (" + services.length + "):"); //$NON-NLS-1$ //$NON-NLS-2$
for (int i = 0; i < services.length; i++) {
appendService(writer, services[i], i);
}
writer.println();
}
private void appendService(PrintWriter writer, ProviderService service, int index) {
writer.println(" Service: " + service.getType() + ", Algorithm: " + service.getAlgorithm() + ", Class: " + service.getClassName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
List<String> aliases = service.getAliases();
if (null != aliases && (0 < aliases.size())) {
writer.print(" Aliases: "); //$NON-NLS-1$
for (Iterator<String> it = aliases.iterator(); it.hasNext();) {
writer.print(it.next());
if (it.hasNext()) {
writer.print(", "); //$NON-NLS-1$
}
}
writer.println();
}
Map<String, String> attributes = service.getAttributes();
if ((null != attributes) && (0 < attributes.size())) {
writer.println(" Attributes:"); //$NON-NLS-1$
for (Entry<String, String> entry : attributes.entrySet()) {
String key = entry.getKey();
writer.print(" " + key + ": "); //$NON-NLS-1$//$NON-NLS-2$
writer.println(entry.getValue());
}
}
}
private static ProviderService[] getServices(Provider provider) {
Hashtable<String, String> serviceList = new Hashtable<>();
Hashtable<String, Hashtable<String, String>> attributeMap = new Hashtable<>(); // "type" => "Hashtable of (attribute,value) pairs"
Hashtable<String, List<String>> aliasMap = new Hashtable<>(); // "type" => "Arraylist of aliases"
for (Entry<Object, Object> entry : provider.entrySet()) {
String key = (String) entry.getKey();
// this is provider info, available off the Provider API
if (key.startsWith(PROVIDER)) {
continue;
}
// this is an alias
if (key.startsWith(ALG_ALIAS)) {
String value = key.substring(key.indexOf(ALG_ALIAS) + ALG_ALIAS.length(), key.length());
String type = (String) entry.getValue();
String algo = value.substring(0, value.indexOf('.'));
String alias = value.substring(value.indexOf('.') + 1, value.length());
List<String> aliasList = aliasMap.get(type + '.' + algo);
if (aliasList == null) {
aliasList = new ArrayList<>();
aliasList.add(alias);
aliasMap.put(type, aliasList);
} else {
aliasList.add(alias);
}
}
// this is an attribute
else if (key.indexOf(' ') > -1) {
String type = key.substring(0, key.indexOf('.'));
String algorithm = key.substring(key.indexOf('.') + 1, key.indexOf(' '));
String attribute = key.substring(key.indexOf(' ') + 1, key.length());
String value = (String) provider.get(key);
Hashtable<String, String> attributeTable = attributeMap.get(type + '.' + algorithm);
if (attributeTable == null) {
attributeTable = new Hashtable<>();
attributeTable.put(attribute, value);
attributeMap.put(type + '.' + algorithm, attributeTable);
} else {
attributeTable.put(attribute, value);
}
}
// else this is a service
else {
serviceList.put(key, (String) provider.get(key));
}
}
ProviderService[] serviceArray = new ProviderService[serviceList.size()];
int serviceCount = 0;
for (Entry<String, String> entry : serviceList.entrySet()) {
String key = entry.getKey();
String type = key.substring(0, key.indexOf('.'));
String algo = key.substring(key.indexOf('.') + 1, key.length());
String className = entry.getValue();
List<String> aliases = aliasMap.get(algo);
Hashtable<String, String> attributes = attributeMap.get(key);
serviceArray[serviceCount] = new ProviderService(type, algo, className, aliases, attributes);
serviceCount++;
}
return serviceArray;
}
private static class ProviderService {
private final String type;
private final String algorithm;
private final String className;
private final List<String> aliases;
private final Map<String, String> attributes;
public ProviderService(String type, String algorithm, String className, List<String> aliases, Map<String, String> attributes) {
this.type = type;
this.algorithm = algorithm;
this.className = className;
this.aliases = aliases;
this.attributes = attributes;
}
public String getType() {
return type;
}
public String getAlgorithm() {
return algorithm;
}
public String getClassName() {
return className;
}
public List<String> getAliases() {
return aliases;
}
public Map<String, String> getAttributes() {
return attributes;
}
}
}