Fix reading the $site_path/etc/ssh_host_key in serialized form Change-Id: I9c3898d38fc5d2298a6863a45ff75e1512b055e3 Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java index 5e10f42..f901a77 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
@@ -22,6 +22,7 @@ import org.apache.sshd.common.KeyPairProvider; import org.apache.sshd.common.keyprovider.FileKeyPairProvider; import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import java.io.File; import java.util.ArrayList; @@ -37,33 +38,42 @@ @Override public KeyPairProvider get() { - final File anyKey = site.ssh_key; + final File objKey = site.ssh_key; final File rsaKey = site.ssh_rsa; final File dsaKey = site.ssh_dsa; - final List<String> keys = new ArrayList<String>(2); + final List<String> stdKeys = new ArrayList<String>(2); if (rsaKey.exists()) { - keys.add(rsaKey.getAbsolutePath()); + stdKeys.add(rsaKey.getAbsolutePath()); } if (dsaKey.exists()) { - keys.add(dsaKey.getAbsolutePath()); + stdKeys.add(dsaKey.getAbsolutePath()); } - if (anyKey.exists() && !keys.isEmpty()) { - // If both formats of host key exist, we don't know which format - // should be authoritative. Complain and abort. - // - keys.add(anyKey.getAbsolutePath()); - throw new ProvisionException("Multiple host keys exist: " + keys); - } + if (objKey.exists()) { + if (stdKeys.isEmpty()) { + SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider(); + p.setPath(objKey.getAbsolutePath()); + return p; - if (keys.isEmpty()) { - throw new ProvisionException("No SSH keys under " + site.etc_dir); + } else { + // Both formats of host key exist, we don't know which format + // should be authoritative. Complain and abort. + // + stdKeys.add(objKey.getAbsolutePath()); + throw new ProvisionException("Multiple host keys exist: " + stdKeys); + } + + } else { + if (stdKeys.isEmpty()) { + throw new ProvisionException("No SSH keys under " + site.etc_dir); + } + if (!SecurityUtils.isBouncyCastleRegistered()) { + throw new ProvisionException("Bouncy Castle Crypto not installed;" + + " needed to read server host keys: " + stdKeys + ""); + } + return new FileKeyPairProvider(stdKeys + .toArray(new String[stdKeys.size()])); } - if (!SecurityUtils.isBouncyCastleRegistered()) { - throw new ProvisionException("Bouncy Castle Crypto not installed;" - + " needed to read server host keys: " + keys + ""); - } - return new FileKeyPairProvider(keys.toArray(new String[keys.size()])); } }