Bind SecureStore and SecureStoreClassName in WebAppInitializer

Bug: Issue 3255
Change-Id: I71265720be581dc961d717096e44a84c6858ba55
This commit is contained in:
Dariusz Luksza
2015-03-20 20:31:34 +01:00
committed by David Pursehouse
parent c33a9108e8
commit 9eb14549a0
3 changed files with 69 additions and 22 deletions

View File

@@ -14,6 +14,7 @@
package com.google.gerrit.pgm.util;
import static com.google.gerrit.server.config.GerritServerConfigModule.getSecureStoreClassName;
import static com.google.inject.Scopes.SINGLETON;
import static com.google.inject.Stage.PRODUCTION;
@@ -188,26 +189,7 @@ public abstract class SiteProgram extends AbstractProgram {
}
protected final String getConfiguredSecureStoreClass() {
Module m = new AbstractModule() {
@Override
protected void configure() {
bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
bind(SitePaths.class);
}
};
Injector i = Guice.createInjector(m);
SitePaths site = i.getInstance(SitePaths.class);
FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
if (!cfg.getFile().exists()) {
return null;
}
try {
cfg.load();
return cfg.getString("gerrit", null, "secureStoreClass");
} catch (IOException | ConfigInvalidException e) {
throw new ProvisionException(e.getMessage(), e);
}
return getSecureStoreClassName(sitePath);
}
private String getDbType(Provider<DataSource> dsProvider) {

View File

@@ -16,14 +16,61 @@ package com.google.gerrit.server.config;
import static com.google.inject.Scopes.SINGLETON;
import com.google.gerrit.server.securestore.DefaultSecureStore;
import com.google.gerrit.server.securestore.SecureStore;
import com.google.gerrit.server.securestore.SecureStoreProvider;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.ProvisionException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import java.io.File;
import java.io.IOException;
/** Creates {@link GerritServerConfig}. */
public class GerritServerConfigModule extends AbstractModule {
public static String getSecureStoreClassName(final File sitePath) {
if (sitePath != null) {
return getSecureStoreFromGerritConfig(sitePath);
}
String secureStoreProperty = System.getProperty("gerrit.secure_store_class");
return nullToDefault(secureStoreProperty);
}
private static String getSecureStoreFromGerritConfig(final File sitePath) {
AbstractModule m = new AbstractModule() {
@Override
protected void configure() {
bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
bind(SitePaths.class);
}
};
Injector injector = Guice.createInjector(m);
SitePaths site = injector.getInstance(SitePaths.class);
FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
if (!cfg.getFile().exists()) {
return DefaultSecureStore.class.getName();
}
try {
cfg.load();
String className = cfg.getString("gerrit", null, "secureStoreClass");
return nullToDefault(className);
} catch (IOException | ConfigInvalidException e) {
throw new ProvisionException(e.getMessage(), e);
}
}
private static String nullToDefault(String className) {
return className != null ? className : DefaultSecureStore.class.getName();
}
@Override
protected void configure() {
bind(SitePaths.class);

View File

@@ -56,6 +56,9 @@ import com.google.gerrit.server.schema.DataSourceType;
import com.google.gerrit.server.schema.DatabaseModule;
import com.google.gerrit.server.schema.SchemaModule;
import com.google.gerrit.server.schema.SchemaVersionCheck;
import com.google.gerrit.server.securestore.SecureStore;
import com.google.gerrit.server.securestore.SecureStoreClassName;
import com.google.gerrit.server.securestore.SecureStoreProvider;
import com.google.gerrit.server.ssh.NoSshModule;
import com.google.gerrit.server.ssh.SshAddressesModule;
import com.google.gerrit.solr.SolrIndexModule;
@@ -74,6 +77,7 @@ import com.google.inject.name.Names;
import com.google.inject.servlet.GuiceFilter;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.spi.Message;
import com.google.inject.util.Providers;
import org.eclipse.jgit.lib.Config;
import org.slf4j.Logger;
@@ -206,6 +210,7 @@ public class WebAppInitializer extends GuiceServletContextListener
private Injector createDbInjector() {
final List<Module> modules = new ArrayList<>();
AbstractModule secureStore = createSecureStoreModule();
if (sitePath != null) {
Module sitePathModule = new AbstractModule() {
@Override
@@ -218,13 +223,13 @@ public class WebAppInitializer extends GuiceServletContextListener
Module configModule = new GerritServerConfigModule();
modules.add(configModule);
Injector cfgInjector = Guice.createInjector(sitePathModule, configModule);
Injector cfgInjector = Guice.createInjector(sitePathModule, configModule, secureStore);
Config cfg = cfgInjector.getInstance(Key.get(Config.class,
GerritServerConfig.class));
String dbType = cfg.getString("database", null, "type");
final DataSourceType dst = Guice.createInjector(new DataSourceModule(),
configModule, sitePathModule).getInstance(
configModule, sitePathModule, secureStore).getInstance(
Key.get(DataSourceType.class, Names.named(dbType.toLowerCase())));
modules.add(new LifecycleModule() {
@Override
@@ -239,6 +244,7 @@ public class WebAppInitializer extends GuiceServletContextListener
});
} else {
modules.add(secureStore);
modules.add(new LifecycleModule() {
@Override
protected void configure() {
@@ -375,4 +381,16 @@ public class WebAppInitializer extends GuiceServletContextListener
manager = null;
}
}
private AbstractModule createSecureStoreModule() {
return new AbstractModule() {
@Override
public void configure() {
String secureStoreClassName =
GerritServerConfigModule.getSecureStoreClassName(sitePath);
bind(String.class).annotatedWith(SecureStoreClassName.class).toProvider(
Providers.of(secureStoreClassName));
}
};
}
}