diff options
author | Kenny Root <kenny@the-b.org> | 2007-11-21 05:32:39 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2007-11-21 05:32:39 +0000 |
commit | d6764b7763e7857273b65048b4eb37a3c65efade (patch) | |
tree | 4e84d4d9327d8a8de685fd0f181208c82e1cb9ad /src/org/theb/ssh/TrileadConnectionThread.java | |
parent | 4d94be3c05a341c18396f45945d86d61ca86dec4 (diff) | |
download | connectbot-d6764b7763e7857273b65048b4eb37a3c65efade.tar.gz connectbot-d6764b7763e7857273b65048b4eb37a3c65efade.tar.bz2 connectbot-d6764b7763e7857273b65048b4eb37a3c65efade.zip |
Merging back in the jcterm branch
Diffstat (limited to 'src/org/theb/ssh/TrileadConnectionThread.java')
-rw-r--r-- | src/org/theb/ssh/TrileadConnectionThread.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/org/theb/ssh/TrileadConnectionThread.java b/src/org/theb/ssh/TrileadConnectionThread.java new file mode 100644 index 0000000..63180b0 --- /dev/null +++ b/src/org/theb/ssh/TrileadConnectionThread.java @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2007 Kenny Root (kenny at the-b.org) + * + * This file is part of Connectbot. + * + * Connectbot is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Connectbot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Connectbot. If not, see <http://www.gnu.org/licenses/>. + */ +package org.theb.ssh; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.Semaphore; + +import com.trilead.ssh2.Connection; +import com.trilead.ssh2.ConnectionMonitor; +import com.trilead.ssh2.Session; + +public class TrileadConnectionThread extends ConnectionThread { + private String hostname; + private String username; + private String password; + private int port; + + private Connection connection; + private Session session; + + private InputStream stdOut; + private OutputStream stdIn; + + private Semaphore sPass; + + protected FeedbackUI ui; + protected Terminal term; + + public TrileadConnectionThread(FeedbackUI ui, Terminal term, String hostname, String username, int port) { + super(ui, hostname, username, port); + this.ui = ui; + this.term = term; + this.hostname = hostname; + this.username = username; + this.port = port; + } + + @Override + public void finish() { + if (session != null) { + session.close(); + session = null; + } + + if (connection != null) { + connection.close(); + connection = null; + } + } + + @Override + public InputStream getReader() { + return stdOut; + } + + @Override + public OutputStream getWriter() { + return stdIn; + } + + @Override + public void run() { + connection = new Connection(hostname, port); + + connection.addConnectionMonitor((ConnectionMonitor) ui); + + ui.setWaiting(true, "Connection", "Connecting to " + hostname + "..."); + + try { + connection.connect(new InteractiveHostKeyVerifier()); + + ui.setWaiting(true, "Authenticating", "Trying to authenticate..."); + + // boolean enableKeyboardInteractive = true; + // boolean enableDSA = true; + // boolean enableRSA = true; + + while (true) { + /* + * if ((enableDSA || enableRSA ) && + * mConn.isAuthMethodAvailable(username, "publickey"); + */ + + if (connection.isAuthMethodAvailable(username, "password")) { + ui.setWaiting(true, "Authenticating", + "Trying to authenticate using password..."); + + // Set a semaphore that is unset by the returning dialog. + sPass = new Semaphore(0); + ui.askPassword(); + + // Wait for the user to answer. + sPass.acquire(); + sPass = null; + if (password == null) + continue; + + boolean res = connection.authenticateWithPassword(username, + password); + password = null; + if (res == true) + break; + + continue; + } + + throw new IOException( + "No supported authentication methods available."); + } + + ui.setWaiting(true, "Session", "Requesting shell..."); + + session = connection.openSession(); + + session.requestPTY("vt100", + term.getColumnCount(), term.getRowCount(), + term.getWidth(), term.getHeight(), + null); + + session.startShell(); + + stdIn = session.getStdin(); + // stderr = session.getStderr(); + stdOut = session.getStdout(); + + ui.setWaiting(false, null, null); + } catch (IOException e) { + ui.setWaiting(false, null, null); + return; + } catch (InterruptedException e) { + // This thread is coming to an end. Let us exit. + return; + } + + term.start(stdOut, stdIn); + } + + @Override + public void setPassword(String password) { + if (password == null) + this.password = ""; + else + this.password = password; + sPass.release(); + } +} |