52
|
1 // Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC.
|
|
2 // All rights reserved.
|
|
3 //
|
|
4 //-------------------------------------------------------------------------
|
|
5 // This file is part of the TightVNC software. Please visit our Web site:
|
|
6 //
|
|
7 // http://www.tightvnc.com/
|
|
8 //
|
|
9 // This program is free software; you can redistribute it and/or modify
|
|
10 // it under the terms of the GNU General Public License as published by
|
|
11 // the Free Software Foundation; either version 2 of the License, or
|
|
12 // (at your option) any later version.
|
|
13 //
|
|
14 // This program is distributed in the hope that it will be useful,
|
|
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17 // GNU General Public License for more details.
|
|
18 //
|
|
19 // You should have received a copy of the GNU General Public License along
|
|
20 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
22 //-------------------------------------------------------------------------
|
|
23 //
|
|
24
|
|
25 package com.glavsoft.viewer.swing;
|
|
26
|
|
27 import com.glavsoft.viewer.*;
|
|
28 import com.glavsoft.viewer.swing.ssh.SshConnectionManager;
|
|
29
|
|
30 import javax.swing.*;
|
|
31 import java.io.IOException;
|
|
32 import java.net.Socket;
|
|
33 import java.net.UnknownHostException;
|
|
34 import java.security.AccessControlException;
|
|
35 import java.util.List;
|
|
36 import java.util.concurrent.CancellationException;
|
|
37 import java.util.concurrent.ExecutionException;
|
|
38 import java.util.logging.Level;
|
|
39 import java.util.logging.Logger;
|
|
40
|
|
41
|
|
42 public class SwingNetworkConnectionWorker extends SwingWorker<Socket, String> implements NetworkConnectionWorker {
|
|
43 public static final int MAX_HOSTNAME_LENGTH_FOR_MESSAGES = 40;
|
|
44 private final JFrame parentWindow;
|
|
45 private Logger logger;
|
|
46 private boolean hasSshSupport;
|
|
47 private ConnectionParams connectionParams;
|
|
48 private ConnectionPresenter presenter;
|
|
49
|
|
50
|
|
51 public SwingNetworkConnectionWorker(JFrame parentWindow) {
|
|
52 this.parentWindow = parentWindow;
|
|
53 logger = Logger.getLogger(getClass().getName());
|
|
54 }
|
|
55
|
|
56 @Override
|
|
57 public Socket doInBackground() throws Exception {
|
|
58 String s = "<b>" +connectionParams.hostName + "</b>:" + connectionParams.getPortNumber();
|
|
59 if (connectionParams.useSsh()) {
|
|
60 s += " <i>(via ssh://" + connectionParams.sshUserName + "@" + connectionParams.sshHostName + ":" + connectionParams.getSshPortNumber() + ")</i>";
|
|
61 }
|
|
62
|
|
63 String message = "<html>Trying to connect to " + s + "</html>";
|
|
64 logger.info(message.replaceAll("<[^<>]+?>", ""));
|
|
65 publish(message);
|
|
66 int port;
|
|
67 String host;
|
|
68 if (hasSshSupport && connectionParams.useSsh()) {
|
|
69 SshConnectionManager sshConnectionManager = new SshConnectionManager(parentWindow);
|
|
70 message = "Creating SSH tunnel to " + connectionParams.sshHostName + ":" + connectionParams.getSshPortNumber();
|
|
71 logger.info(message);
|
|
72 publish(message);
|
|
73 port = sshConnectionManager.connect(connectionParams);
|
|
74 if (sshConnectionManager.isConnected() ) {
|
|
75 host = "127.0.0.1";
|
|
76 message = "SSH tunnel established: " + host + ":" + port;
|
|
77 logger.info(message);
|
|
78 publish(message);
|
|
79 } else {
|
|
80 throw new ConnectionErrorException("Could not create SSH tunnel: " + sshConnectionManager.getErrorMessage());
|
|
81 }
|
|
82 } else {
|
|
83 host = connectionParams.hostName;
|
|
84 port = connectionParams.getPortNumber();
|
|
85 }
|
|
86
|
|
87 message = "Connecting to host " + host + ":" + port + (connectionParams.useSsh() ? " (tunneled)" : "");
|
|
88 logger.info(message);
|
|
89 publish(message);
|
|
90
|
|
91 return new Socket(host, port);
|
|
92 }
|
|
93
|
|
94 private String formatHostString(String hostName) {
|
|
95 if (hostName.length() <= MAX_HOSTNAME_LENGTH_FOR_MESSAGES) {
|
|
96 return hostName;
|
|
97 } else {
|
|
98 return hostName.substring(0, MAX_HOSTNAME_LENGTH_FOR_MESSAGES) + "...";
|
|
99 }
|
|
100 }
|
|
101
|
|
102 @Override
|
|
103 protected void process(List<String> strings) { // EDT
|
|
104 String message = strings.get(strings.size() - 1); // get last
|
|
105 presenter.showMessage(message);
|
|
106 }
|
|
107
|
|
108 @Override
|
|
109 protected void done() { // EDT
|
|
110 try {
|
|
111 final Socket socket = get();
|
|
112 presenter.successfulNetworkConnection(socket);
|
|
113 } catch (CancellationException e) {
|
|
114 logger.info("Cancelled");
|
|
115 presenter.showMessage("Cancelled");
|
|
116 presenter.connectionFailed();
|
|
117 } catch (InterruptedException e) {
|
|
118 logger.info("Interrupted");
|
|
119 presenter.showMessage("Interrupted");
|
|
120 presenter.connectionFailed();
|
|
121 } catch (ExecutionException e) {
|
|
122 String errorMessage = null;
|
|
123 try {
|
|
124 throw e.getCause();
|
|
125 } catch (UnknownHostException uhe) {
|
|
126 logger.severe("Unknown host: " + connectionParams.hostName);
|
|
127 errorMessage = "Unknown host: '" + formatHostString(connectionParams.hostName) + "'";
|
|
128 } catch (IOException ioe) {
|
|
129 logger.severe("Couldn't connect to '" + connectionParams.hostName +
|
|
130 ":" + connectionParams.getPortNumber() + "':\n" + ioe.getMessage());
|
|
131 logger.log(Level.FINEST, "Couldn't connect to '" + connectionParams.hostName +
|
|
132 ":" + connectionParams.getPortNumber() + "':\n" + ioe.getMessage(), ioe);
|
|
133 errorMessage = "Couldn't connect to '" + formatHostString(connectionParams.hostName) +
|
|
134 ":" + connectionParams.getPortNumber() + "':\n" + ioe.getMessage();
|
|
135 } catch (CancelConnectionException cce) {
|
|
136 logger.severe("Cancelled: " + cce.getMessage());
|
|
137 } catch (AccessControlException ace) {
|
|
138 logger.severe("Couldn't connect to: " +
|
|
139 connectionParams.hostName + ":" + connectionParams.getPortNumber() +
|
|
140 ": " + ace.getMessage());
|
|
141 logger.log(Level.FINEST, "Couldn't connect to: " +
|
|
142 connectionParams.hostName + ":" + connectionParams.getPortNumber() +
|
|
143 ": " + ace.getMessage(), ace);
|
|
144 errorMessage = "Access control error";
|
|
145 } catch (ConnectionErrorException cee) {
|
|
146 logger.severe(cee.getMessage() + " host: " +
|
|
147 connectionParams.hostName + ":" + connectionParams.getPortNumber());
|
|
148 errorMessage = cee.getMessage() + "\nHost: " +
|
|
149 formatHostString(connectionParams.hostName) + ":" + connectionParams.getPortNumber();
|
|
150 } catch (Throwable throwable) {
|
|
151 logger.log(Level.FINEST, "Couldn't connect to '" + formatHostString(connectionParams.hostName) +
|
|
152 ":" + connectionParams.getPortNumber() + "':\n" + throwable.getMessage(), throwable);
|
|
153 errorMessage = "Couldn't connect to '" + formatHostString(connectionParams.hostName) +
|
|
154 ":" + connectionParams.getPortNumber() + "':\n" + throwable.getMessage();
|
|
155 }
|
|
156 presenter.showConnectionErrorDialog(errorMessage);
|
|
157 presenter.clearMessage();
|
|
158 presenter.connectionFailed();
|
|
159 }
|
|
160 }
|
|
161
|
|
162 @Override
|
|
163 public void setConnectionParams(ConnectionParams connectionParams) {
|
|
164 this.connectionParams = connectionParams;
|
|
165 }
|
|
166
|
|
167 @Override
|
|
168 public void setPresenter(ConnectionPresenter presenter) {
|
|
169 this.presenter = presenter;
|
|
170 }
|
|
171
|
|
172 @Override
|
|
173 public void setHasSshSupport(boolean hasSshSupport) {
|
|
174 this.hasSshSupport = hasSshSupport;
|
|
175 }
|
|
176
|
|
177 @Override
|
|
178 public boolean cancel() {
|
|
179 return super.cancel(true);
|
|
180 }
|
|
181 }
|