// Copyright 2017 The Nomulus Authors. All Rights Reserved.
//
// 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 google.registry.rde;

import static java.nio.charset.StandardCharsets.UTF_8;

import com.google.appengine.api.ThreadManager;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import dagger.Module;
import dagger.Provides;
import google.registry.config.RegistryConfig.Config;
import google.registry.keyring.api.KeyModule.Key;

/** Dagger module for {@link JSch} which provides SSH/SFTP connectivity. */
@Module
public final class JSchModule {

  @Provides
  static JSch provideJSch(
      @Config("rdeSshIdentity") String identity,
      @Key("rdeSshClientPrivateKey") String privateKey,
      @Key("rdeSshClientPublicKey") String publicKey) {
    applyAppEngineKludge();
    JSch jsch = new JSch();
    try {
      jsch.addIdentity(
          identity,
          privateKey.getBytes(UTF_8),
          publicKey.getBytes(UTF_8),
          null);
    } catch (JSchException e) {
      throw new RuntimeException(e);
    }
    // TODO(b/13028224): Implement known hosts checking.
    JSch.setConfig("StrictHostKeyChecking", "no");
    return jsch;
  }

  /**
   * Overrides the threadFactory used in JSch and disable {@link Thread#setName(String)} in order to
   * ensure GAE compatibility. By default it uses the default executor, which fails under GAE. This
   * is currently a Google-specific patch that needs to be sent upstream.
   */
  private static void applyAppEngineKludge() {
    JSch.threadFactory = ThreadManager.currentRequestThreadFactory();
    JSch.useThreadNames = false;
  }
}

@@ -702,55 +702,8 @@
 8;%0A%0A
-import com.google.appengine.api.ThreadManager;%0A
 impo
@@ -727,16 +727,16 @@
 h.JSch;%0A
+
 import c
@@ -1236,36 +1236,8 @@
 ) %7B%0A
-    applyAppEngineKludge();%0A
     
@@ -1589,16 +1589,16 @@
  %22no%22);%0A
+
     retu
@@ -1613,449 +1613,7 @@
 %0A  %7D
-%0A%0A  /**%0A   * Overrides the threadFactory used in JSch and disable %7B@link Thread#setName(String)%7D in order to%0A   * ensure GAE compatibility. By default it uses the default executor, which fails under GAE. This%0A   * is currently a Google-specific patch that needs to be sent upstream.%0A   */%0A  private static void applyAppEngineKludge() %7B%0A    JSch.threadFactory = ThreadManager.currentRequestThreadFactory();%0A    JSch.useThreadNames = false;%0A  %7D
 %0A%7D%0A

Remove JSch threading hack