mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-23 06:42:05 +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:
parent
e75f45082b
commit
c76ed51541
1 changed files with 87 additions and 16 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue