package com.intrbiz.bergamot.check.ssh; import java.util.function.Consumer; import com.intrbiz.util.Hash; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; public class SSHCheckContext { private final Consumer<Throwable> onError; private JSch jsch; private String password = null; public SSHCheckContext(Consumer<Throwable> onError) { this.onError = onError; this.jsch = new JSch(); } protected void applyDefaultConfiguration(Session session) { session.setConfig("StrictHostKeyChecking", "no"); } public void addIdentity(String privateKeyContents, String publicKeyContents) { try { String name = Hash.toHex(Hash.sha256(Hash.asUTF8(privateKeyContents))); this.jsch.addIdentity(name, Hash.asUTF8(privateKeyContents), Hash.asUTF8(publicKeyContents), null); } catch (JSchException e) { this.onError.accept(new SSHException(e)); } } public void setPassword(String password) { this.password = password; } public void connect(String username, String host, Consumer<SSHSession> onConnected) { this.connect(username, host, 22, onConnected); } public void connect(String username, String host, int port, Consumer<SSHSession> onConnected) { try { Session session = null; try { session = this.jsch.getSession(username, host, port); this.applyDefaultConfiguration(session); if (this.password != null) { session.setPassword(this.password); } session.connect(); onConnected.accept(new SSHSession(this.jsch, session)); } finally { if (session != null) session.disconnect(); } } catch (Throwable t) { this.onError.accept(t); } } }