1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-12-23 02:58:00 +01:00

SMACK-385 Reuse the KeyStore in order to reduce memory usage. Extended ServerTrustManager with a 'stores' (Hash)Map that allows the reuse of an existing KeyStore. Before that, every call of KeyStore.getInstance() created a new instance which consumes about 250KiB.

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@13419 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Florian Schmaus 2013-01-31 22:31:04 +00:00 committed by flow
parent e75f45082b
commit c76ed51541

View file

@ -52,30 +52,40 @@ class ServerTrustManager implements X509TrustManager {
private String server; private String server;
private KeyStore trustStore; private KeyStore trustStore;
private static Map<KeyStoreOptions, KeyStore> stores = new HashMap<KeyStoreOptions, KeyStore>();
public ServerTrustManager(String server, ConnectionConfiguration configuration) { public ServerTrustManager(String server, ConnectionConfiguration configuration) {
this.configuration = configuration; this.configuration = configuration;
this.server = server; this.server = server;
InputStream in = null; InputStream in = null;
try { synchronized (stores) {
trustStore = KeyStore.getInstance(configuration.getTruststoreType()); KeyStoreOptions options = new KeyStoreOptions(configuration.getTruststoreType(),
in = new FileInputStream(configuration.getTruststorePath()); configuration.getTruststorePath(), configuration.getTruststorePassword());
trustStore.load(in, configuration.getTruststorePassword().toCharArray()); if (stores.containsKey(options)) {
} trustStore = stores.get(options);
catch (Exception e) { } else {
e.printStackTrace();
// Disable root CA checking
configuration.setVerifyRootCAEnabled(false);
}
finally {
if (in != null) {
try { try {
in.close(); trustStore = KeyStore.getInstance(options.getType());
} in = new FileInputStream(options.getPath());
catch (IOException ioe) { trustStore.load(in, options.getPassword().toCharArray());
// Ignore. } catch (Exception e) {
trustStore = null;
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {
// Ignore.
}
}
} }
stores.put(options, trustStore);
} }
if (trustStore == null)
// Disable root CA checking
configuration.setVerifyRootCAEnabled(false);
} }
} }
@ -256,4 +266,65 @@ class ServerTrustManager implements X509TrustManager {
return identities; return identities;
} }
private static class KeyStoreOptions {
private final String type;
private final String path;
private final String password;
public KeyStoreOptions(String type, String path, String password) {
super();
this.type = type;
this.path = path;
this.password = password;
}
public String getType() {
return type;
}
public String getPath() {
return path;
}
public String getPassword() {
return password;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((path == null) ? 0 : path.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
KeyStoreOptions other = (KeyStoreOptions) obj;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (path == null) {
if (other.path != null)
return false;
} else if (!path.equals(other.path))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
}
} }