Merge "Merge branch 'stable-2.10' into stable-2.11" into stable-2.11
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
index 02a8eac..7e0aa1e 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -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 @@
   }
 
   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) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java
index 2683ca1..89331fd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java
@@ -16,14 +16,61 @@
 
 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);
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
index ec9f9fe..a0728e9 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
@@ -56,6 +56,9 @@
 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.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 @@
 
   private Injector createDbInjector() {
     final List<Module> modules = new ArrayList<>();
+    AbstractModule secureStore = createSecureStoreModule();
     if (sitePath != null) {
       Module sitePathModule = new AbstractModule() {
         @Override
@@ -218,13 +223,13 @@
       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 @@
       });
 
     } else {
+      modules.add(secureStore);
       modules.add(new LifecycleModule() {
         @Override
         protected void configure() {
@@ -375,4 +381,16 @@
       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));
+      }
+    };
+  }
 }