package client;
/**
*
* @author pquiring
*/
import java.io.*;
import java.net.*;
import java.util.*;
import javax.net.ssl.*;
import javaforce.*;
public class Client extends javax.swing.JFrame {
/**
* Creates new form Client
*/
public Client() {
initComponents();
JFImage img = new JFImage();
img.load(getClass().getResourceAsStream("/jfrdp.png"));
setIconImage(img.getImage());
JF.centerWindow(this);
readConfig();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
webPassword = new javax.swing.JPasswordField();
host = new javax.swing.JTextField();
connect = new javax.swing.JButton();
error = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
rdpPassword = new javax.swing.JPasswordField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("jfRDP Client");
jLabel1.setText("Host:");
jLabel2.setText("Web Password:");
connect.setText("Connect");
connect.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
connectActionPerformed(evt);
}
});
jLabel3.setText("RDP Password:");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(connect))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel1)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(rdpPassword)
.addComponent(webPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 195, Short.MAX_VALUE)
.addComponent(host)))
.addComponent(error, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(host, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(webPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(rdpPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(error, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(connect)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void connectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectActionPerformed
writeConfig();
connect();
}//GEN-LAST:event_connectActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
JF.initHttps();
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Client().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton connect;
private javax.swing.JLabel error;
private javax.swing.JTextField host;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPasswordField rdpPassword;
private javax.swing.JPasswordField webPassword;
// End of variables declaration//GEN-END:variables
private String encodePassword() {
String pass = new String(webPassword.getPassword());
String u_p = ":" + pass;
String base64_u_p = new String(javaforce.Base64.encode(u_p.getBytes()));
return base64_u_p;
}
private void connect() {
host.setEnabled(false);
connect.setEnabled(false);
webPassword.setEnabled(false);
rdpPassword.setEnabled(false);
new Thread() {
public void run() {
connect2();
}
}.start();
}
private String errmsg;
private void connect2() {
errmsg = null;
String xml = connect_raw();
if (xml == null || xml.length() == 0) {
if (errmsg == null) errmsg = "Connection Failed";
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JF.showError("Error", errmsg);
host.setEnabled(true);
connect.setEnabled(true);
webPassword.setEnabled(true);
rdpPassword.setEnabled(true);
}
});
return;
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
dispose();
}
});
WDS.startClient(xml, "Viewer", new String(rdpPassword.getPassword()));
}
/** Connect using SSLSocket */
private String connect_raw() {
String server = host.getText();
try {
int port = 33001;
int idx = server.indexOf(":");
if (idx != -1) {
server = server.substring(0, idx);
port = Integer.valueOf(server.substring(idx+1));
}
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
}
};
// Let us create the factory where we can set some parameters for the connection
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) sc.getSocketFactory(); //this method will work with untrusted certs
Socket s = sslsocketfactory.createSocket(server, port);
s.setSoTimeout(10 * 1000);
StringBuilder sb = new StringBuilder();
sb.append("GET /invite HTTP/1.0\r\n");
sb.append("Host: " + server + "\r\n");
sb.append("Authorization: Basic " + encodePassword() + "\r\n");
sb.append("\r\n");
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
os.write(sb.toString().getBytes());
sb = new StringBuilder();
byte buf[] = new byte[1024];
String xml = null;
while (s.isConnected() || is.available() > 0) {
int read = is.read(buf);
if (read == -1) break;
if (read > 0) {
sb.append(new String(buf, 0, read));
String response = sb.toString();
idx = response.indexOf("\r\n\r\n");
if (idx == -1) continue;
String headers[] = response.substring(0, idx).split("\r\n");
idx += 4;
xml = response.substring(idx);
int length = -1;
for(int a=0;a<headers.length;a++) {
if (headers[a].startsWith("Content-Length:")) {
length = Integer.valueOf(headers[a].substring(16));
break;
}
}
if (xml.length() < length) {
xml = null;
continue;
}
break;
}
}
s.close();
return xml;
} catch (Exception e) {
e.printStackTrace();
errmsg = e.toString();
return null;
}
}
/** Connect using URLConnection : Hangs too often. */
private String connect_url() {
error.setText("");
try {
String server = host.getText();
if (server.indexOf(":") == -1) {
server = server + ":33001";
}
URL url = new URL("https://" + server + "/invite");
URLConnection conn = url.openConnection();
conn.addRequestProperty("Authorization", "Basic " + encodePassword());
//conn.setAllowUserInteraction(true);
conn.connect();
String xml = null;
if (true) {
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
while (true) {
int read = is.read(buf);
if (read == -1) break;
if (read > 0) {
baos.write(buf, 0, read);
}
}
xml = new String(baos.toByteArray());
} else {
xml = (String)conn.getContent();
}
return xml;
} catch (Exception e) {
e.printStackTrace();
error.setText(e.toString());
return null;
}
}
public void readConfig() {
try {
Properties p = new Properties();
FileInputStream fis = new FileInputStream(JF.getUserPath() + "/.jfrdp-client.cfg");
p.load(fis);
fis.close();
String lastHost = p.getProperty("lastHost");
if (lastHost != null) {
host.setText(lastHost);
}
} catch (Exception e) {
JFLog.log(e);
}
}
public void writeConfig() {
try {
Properties p = new Properties();
p.setProperty("lastHost", host.getText());
FileOutputStream fos = new FileOutputStream(JF.getUserPath() + "/.jfrdp-client.cfg");
p.store(fos, "#jfRDP-client");
fos.close();
} catch (Exception e) {
JFLog.log(e);
}
}
}