Skip to content

Commit 7907d39

Browse files
support client security root directory
1 parent 103b36e commit 7907d39

File tree

9 files changed

+173
-59
lines changed

9 files changed

+173
-59
lines changed

src/main/java/org/terracotta/tinypounder/CacheManagerBusiness.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public interface CacheManagerBusiness {
3434

3535
String retrieveHumanReadableConfiguration();
3636

37-
void initializeCacheManager(String terracottaServerUrl, String cmName, String tinyPounderDiskPersistenceLocation, String defaultOffheapResource, String diskResource);
37+
void initializeCacheManager(String terracottaServerUrl, String cmName, String tinyPounderDiskPersistenceLocation, String defaultOffheapResource, String diskResource, String securityPath);
3838

3939
boolean isCacheManagerAlive();
4040

src/main/java/org/terracotta/tinypounder/CacheManagerBusinessReflectionImpl.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import org.springframework.beans.factory.annotation.Autowired;
1919
import org.springframework.stereotype.Service;
20+
import static org.terracotta.tinypounder.CacheConfiguration.ClusterTierType.DEDICATED;
21+
import static org.terracotta.tinypounder.CacheConfiguration.ClusterTierType.SHARED;
2022

2123
import java.io.File;
2224
import java.io.IOException;
@@ -41,9 +43,6 @@
4143
import java.util.concurrent.TimeUnit;
4244
import java.util.stream.IntStream;
4345

44-
import static org.terracotta.tinypounder.CacheConfiguration.ClusterTierType.DEDICATED;
45-
import static org.terracotta.tinypounder.CacheConfiguration.ClusterTierType.SHARED;
46-
4746
@Service
4847
public class CacheManagerBusinessReflectionImpl implements CacheManagerBusiness {
4948

@@ -238,13 +237,13 @@ public String retrieveHumanReadableConfiguration() {
238237
}
239238

240239
@Override
241-
public void initializeCacheManager(String terracottaServerUrl, String cmName, String diskPersistenceLocation, String defaultOffheapResource, String serverDiskResource) {
240+
public void initializeCacheManager(String terracottaServerUrl, String cmName, String diskPersistenceLocation, String defaultOffheapResource, String serverDiskResource, String securityPath) {
242241
try {
243242
Thread.currentThread().setContextClassLoader(kitAwareClassLoaderDelegator.getUrlClassLoader());
244243
Object clusteringServiceConfigurationBuilder;
245244
if (terracottaServerUrl != null) {
246245
URI clusterUri = URI.create("terracotta://" + terracottaServerUrl + "/" + cmName);
247-
clusteringServiceConfigurationBuilder = constructClusteringServiceConfigurationBuilder(cmName, clusterUri, kitAwareClassLoaderDelegator.isEEKit(), defaultOffheapResource, serverDiskResource);
246+
clusteringServiceConfigurationBuilder = constructClusteringServiceConfigurationBuilder(cmName, clusterUri, kitAwareClassLoaderDelegator.isEEKit(), defaultOffheapResource, serverDiskResource, securityPath);
248247
} else {
249248
clusteringServiceConfigurationBuilder = null;
250249
}
@@ -329,7 +328,7 @@ private Object constructCacheManagerBuilder(Object enterpriseClusteringServiceCo
329328
return buildMethod.invoke(cacheManagerBuilder);
330329
}
331330

332-
private Object constructClusteringServiceConfigurationBuilder(String clusterTierManagerName, URI clusterUri, boolean eeKit, String defaultOffheapResource, String serverDiskResource) throws IllegalAccessException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException {
331+
private Object constructClusteringServiceConfigurationBuilder(String clusterTierManagerName, URI clusterUri, boolean eeKit, String defaultOffheapResource, String serverDiskResource, String securityPath) throws IllegalAccessException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException {
333332

334333
Class<?> memoryUnitClass = loadClass("org.ehcache.config.units.MemoryUnit");
335334
Method valueOfMethod = memoryUnitClass.getMethod("valueOf", String.class);
@@ -351,16 +350,23 @@ private Object constructClusteringServiceConfigurationBuilder(String clusterTier
351350

352351

353352
Class<?> enterpriseClusteringServiceConfigurationBuilderClass = loadClass("com.terracottatech.ehcache.clustered.client.config.builders.EnterpriseClusteringServiceConfigurationBuilder");
354-
Method enterpriseClusterMethod = enterpriseClusteringServiceConfigurationBuilderClass.getMethod("enterpriseCluster", URI.class);
353+
355354

356355
Method autoCreateMethod = enterpriseClusteringServiceConfigurationBuilderClass.getMethod("autoCreate");
357356
Method defaultServerResourceMethod = enterpriseServerSideConfigurationBuilderClass.getMethod("defaultServerResource", String.class);
358357
Method resourcePoolMethod4 = enterpriseServerSideConfigurationBuilderClass.getMethod("resourcePool", String.class, long.class, memoryUnitClass, String.class);
359358
Method resourcePoolMethod3 = enterpriseServerSideConfigurationBuilderClass.getMethod("resourcePool", String.class, long.class, memoryUnitClass);
360359
Method restartableMethod = enterpriseServerSideConfigurationBuilderClass.getMethod("restartable", String.class);
361360

361+
Object enterpriseClusteringServiceConfigurationBuilder;
362+
if (securityPath != null) {
363+
Method enterpriseClusterMethod = enterpriseClusteringServiceConfigurationBuilderClass.getMethod("enterpriseSecureCluster", URI.class, Path.class);
364+
enterpriseClusteringServiceConfigurationBuilder = enterpriseClusterMethod.invoke(null, clusterUri.resolve(clusterTierManagerName), Paths.get(securityPath));
365+
} else {
366+
Method enterpriseClusterMethod = enterpriseClusteringServiceConfigurationBuilderClass.getMethod("enterpriseCluster", URI.class);
367+
enterpriseClusteringServiceConfigurationBuilder = enterpriseClusterMethod.invoke(null, clusterUri.resolve(clusterTierManagerName));
368+
}
362369

363-
Object enterpriseClusteringServiceConfigurationBuilder = enterpriseClusterMethod.invoke(null, clusterUri.resolve(clusterTierManagerName));
364370
if (timeoutsClass != null && timeoutsInstance != null) {
365371
Method timeoutsMethod = enterpriseClusteringServiceConfigurationBuilderClass.getMethod("timeouts", timeoutsClass);
366372
enterpriseClusteringServiceConfigurationBuilder = timeoutsMethod.invoke(enterpriseClusteringServiceConfigurationBuilder, timeoutsInstance);

src/main/java/org/terracotta/tinypounder/DatasetManagerBusinessReflectionImpl.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.lang.reflect.Method;
1010
import java.math.BigInteger;
1111
import java.net.URI;
12+
import java.nio.file.Path;
13+
import java.nio.file.Paths;
1214
import java.util.ArrayList;
1315
import java.util.Arrays;
1416
import java.util.Collection;
@@ -401,17 +403,22 @@ public String getStatus() {
401403
return "AVAILABLE";
402404
}
403405

404-
public void initializeDatasetManager(String terracottaServerUrl) {
406+
public void initializeDatasetManager(String terracottaServerUrl, String securityPath) {
405407
try {
406408
Thread.currentThread().setContextClassLoader(kitAwareClassLoaderDelegator.getUrlClassLoader());
407409
initCommonObjectsAndClasses();
408410
if (terracottaServerUrl != null) {
409411
URI clusterUri = URI.create("terracotta://" + terracottaServerUrl);
410412

411-
// DatasetManager.clustered(URI.create(uri)).build()
412413
datasetManagerClass = loadClass("com.terracottatech.store.manager.DatasetManager");
413-
Method clusteredMethod = datasetManagerClass.getMethod("clustered", URI.class);
414-
Object clusteredDatasetManagerBuilder = clusteredMethod.invoke(null, clusterUri);
414+
Object clusteredDatasetManagerBuilder;
415+
if (securityPath != null) {
416+
Method clusteredMethod = datasetManagerClass.getMethod("secureClustered", URI.class, Path.class);
417+
clusteredDatasetManagerBuilder = clusteredMethod.invoke(null, clusterUri, Paths.get(securityPath));
418+
} else {
419+
Method clusteredMethod = datasetManagerClass.getMethod("clustered", URI.class);
420+
clusteredDatasetManagerBuilder = clusteredMethod.invoke(null, clusterUri);
421+
}
415422

416423
Class<?> clusteredDatasetManagerBuilderClass = loadClass("com.terracottatech.store.client.builder.datasetmanager.clustered.ClusteredDatasetManagerBuilderImpl");
417424

src/main/java/org/terracotta/tinypounder/KitAwareClassLoaderDelegator.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.nio.file.Path;
3131
import java.nio.file.Paths;
3232
import java.security.MessageDigest;
33+
import java.util.Arrays;
3334
import java.util.LinkedHashMap;
3435
import java.util.Map;
3536

@@ -134,7 +135,18 @@ public boolean isEEKit() {
134135
}
135136
}
136137

137-
public void setKitPath(String kitPath) {
138+
public boolean verifySecurityPath(String securityPath) {
139+
if (securityPath != null && !securityPath.isEmpty()) {
140+
Path path = Paths.get(securityPath);
141+
File securityDirectory = path.toFile();
142+
return securityDirectory.exists()
143+
&& securityDirectory.isDirectory()
144+
&& Arrays.stream(securityDirectory.list()).anyMatch(s -> s.contains("access-control") || s.contains("identity") || s.contains("trusted-authority"));
145+
}
146+
return false;
147+
}
148+
149+
public void setAndVerifyKitPathAndClassLoader(String kitPath) {
138150
settings.setKitPath(kitPath);
139151
if (kitPath != null && !kitPath.isEmpty()) {
140152
try {

src/main/java/org/terracotta/tinypounder/Settings.java

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ public class Settings {
2323
@Value("${kitPath}")
2424
private String kitPath;
2525

26-
@Value("${securityPath}")
27-
private String securityPath;
26+
@Value("${serverSecurityPath}")
27+
private String serverSecurityPath;
28+
29+
@Value("${clientSecurityPath}")
30+
private String clientSecurityPath;
2831

2932
@Value("${licensePath}")
3033
private String licensePath;
@@ -58,12 +61,22 @@ public void load() {
5861
}
5962
}
6063
// always prefer system props over saved config
61-
if (securityPath == null || securityPath.isEmpty()) {
62-
securityPath = properties.getProperty("securityPath");
63-
if (securityPath != null) {
64-
File folder = new File(securityPath);
64+
if (serverSecurityPath == null || serverSecurityPath.isEmpty()) {
65+
serverSecurityPath = properties.getProperty("serverSecurityPath");
66+
if (serverSecurityPath != null) {
67+
File folder = new File(serverSecurityPath);
68+
if (!folder.exists() || !folder.isDirectory()) {
69+
serverSecurityPath = null;
70+
}
71+
}
72+
}
73+
74+
if (clientSecurityPath == null || clientSecurityPath.isEmpty()) {
75+
clientSecurityPath = properties.getProperty("clientSecurityPath");
76+
if (clientSecurityPath != null) {
77+
File folder = new File(clientSecurityPath);
6578
if (!folder.exists() || !folder.isDirectory()) {
66-
securityPath = null;
79+
clientSecurityPath = null;
6780
}
6881
}
6982
}
@@ -124,8 +137,11 @@ public void save() {
124137
if (kitPath != null) {
125138
properties.setProperty("kitPath", kitPath);
126139
}
127-
if (securityPath != null) {
128-
properties.setProperty("securityPath", securityPath);
140+
if (serverSecurityPath != null) {
141+
properties.setProperty("serverSecurityPath", serverSecurityPath);
142+
}
143+
if (clientSecurityPath != null) {
144+
properties.setProperty("clientSecurityPath", clientSecurityPath);
129145
}
130146
if (licensePath != null) {
131147
properties.setProperty("licensePath", licensePath);
@@ -152,12 +168,20 @@ public void save() {
152168
}
153169
}
154170

155-
public String getSecurityPath() {
156-
return securityPath;
171+
public String getServerSecurityPath() {
172+
return serverSecurityPath;
173+
}
174+
175+
public void setServerSecurityPath(String serverSecurityPath) {
176+
this.serverSecurityPath = serverSecurityPath;
177+
}
178+
179+
public String getClientSecurityPath() {
180+
return clientSecurityPath;
157181
}
158182

159-
public void setSecurityPath(String securityPath) {
160-
this.securityPath = securityPath;
183+
public void setClientSecurityPath(String clientSecurityPath) {
184+
this.clientSecurityPath = clientSecurityPath;
161185
}
162186

163187
public String getKitPath() {

0 commit comments

Comments
 (0)