// Copyright (C) 2009 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.sshd;

import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.ProvisionException;

import org.apache.sshd.common.KeyPairProvider;
import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
import org.apache.sshd.common.util.SecurityUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

class HostKeyProvider implements Provider<KeyPairProvider> {
  private final SitePaths site;

  @Inject
  HostKeyProvider(final SitePaths site) {
    this.site = site;
  }

  @Override
  public KeyPairProvider get() {
    final File anyKey = site.ssh_key;
    final File rsaKey = site.ssh_rsa;
    final File dsaKey = site.ssh_dsa;

    final List<String> keys = new ArrayList<String>(2);
    if (rsaKey.exists()) {
      keys.add(rsaKey.getAbsolutePath());
    }
    if (dsaKey.exists()) {
      keys.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 (keys.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: " + keys + "");
    }
    return new FileKeyPairProvider(keys.toArray(new String[keys.size()]));
  }
}

@@ -958,16 +958,90 @@
 tyUtils;
+%0Aimport org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
 %0A%0Aimport
@@ -1340,19 +1340,19 @@
 al File 
-any
+obj
 Key = si
@@ -1463,17 +1463,20 @@
 String%3E 
-k
+stdK
 eys = ne
@@ -1524,33 +1524,36 @@
 ists()) %7B%0A      
-k
+stdK
 eys.add(rsaKey.g
@@ -1606,25 +1606,28 @@
 ()) %7B%0A      
-k
+stdK
 eys.add(dsaK
@@ -1664,19 +1664,19 @@
     if (
-any
+obj
 Key.exis
@@ -1683,14 +1683,26 @@
 ts()
- && !k
+) %7B%0A      if (stdK
 eys.
@@ -1724,15 +1724,174 @@
     
-// If b
+  SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider();%0A        p.setPath(objKey.getAbsolutePath());%0A        return p;%0A%0A      %7D else %7B%0A        // B
 oth 
@@ -1950,16 +1950,18 @@
 t%0A      
+  
 // shoul
@@ -2000,16 +2000,18 @@
  abort.%0A
+  
       //
@@ -2021,17 +2021,22 @@
     
-k
+  stdK
 eys.add(
 anyK
@@ -2035,11 +2035,11 @@
 add(
-any
+obj
 Key.
@@ -2060,24 +2060,26 @@
 h());%0A      
+  
 throw new Pr
@@ -2126,17 +2126,20 @@
 st: %22 + 
-k
+stdK
 eys);%0A  
@@ -2144,20 +2144,40 @@
     
+  
 %7D%0A%0A    
-if (k
+%7D else %7B%0A      if (stdK
 eys.
@@ -2187,32 +2187,34 @@
 mpty()) %7B%0A      
+  
 throw new Provis
@@ -2264,30 +2264,34 @@
 c_dir);%0A    
+  
 %7D%0A    
+ 
+ 
 if (!Securit
@@ -2323,24 +2323,26 @@
 stered()) %7B%0A
+  
       throw 
@@ -2412,16 +2412,18 @@
         
+ 
+ 
 + %22 need
@@ -2455,17 +2455,20 @@
 ys: %22 + 
-k
+stdK
 eys + %22%22
@@ -2470,26 +2470,30 @@
  + %22%22);%0A    
-%7D%0A
+  %7D%0A  
     return n
@@ -2515,20 +2515,34 @@
 rovider(
-keys
+stdKeys%0A          
 .toArray
@@ -2553,17 +2553,20 @@
  String%5B
-k
+stdK
 eys.size
@@ -2572,14 +2572,20 @@
 e()%5D));%0A
+    %7D%0A
   %7D%0A%7D%0A

Fix reading the $site_path/etc/ssh_host_key in serialized form