package server; /** * * @author pquiring */ import java.io.*; import java.net.*; import javaforce.*; import javaforce.service.*; public class Service implements WebHandler { private Web web; private String base64_password; private String rdpPass; private volatile long rdp; private String cs; private int maxUsers; private boolean viewOnly; private ServerSocket ss; public void start(String webPass, String rdpPass, int maxUsers, boolean viewOnly) { if (webPass == null || rdpPass.length() == 0) { return; } this.rdpPass = rdpPass; String u_p = ":" + webPass; base64_password = new String(Base64.encode(u_p.getBytes())); this.maxUsers = maxUsers; this.viewOnly = viewOnly; web = new Web(); if (!web.start(this, 33001, true)) { JF.showError("Error", "Failed to start Web Server"); return; } } public void close() { System.out.println("RDP.close()"); disconnect(); if (web != null) { web.stop(); web = null; } if (ss != null) { try {ss.close();} catch (Exception e) {} } } public void disconnect() { if (rdp != 0) { WDS.stopServer(rdp); rdp = 0; } } private void send401(WebResponse res) { res.addCookie("WWW-Authenticate", "Basic realm=\"jfRDP\""); res.setStatus(401, "401 Auth required."); } private void noCache(WebResponse res) { res.addHeader("Cache-Control: no-cache, no-store, must-revalidate"); res.addHeader("Pragma: no-cache"); res.addHeader("Expires: 0"); } public void doGet(WebRequest req, WebResponse res) { String url = req.getURL(); if (!url.equals("/invite")) { res.setStatus(404, "404 Object not found."); return; } String auth = req.getHeader("Authorization"); if (auth == null) { send401(res); return; } //f = Basic "base64(username:password)" String f[] = auth.split(" "); if (f.length != 2 || !f[0].equals("Basic") || !f[1].equals(base64_password)) { send401(res); return; } if (rdpPass == null || rdpPass.length() == 0) { try {res.write("Server setup incomplete".getBytes());} catch (Exception e) {e.printStackTrace();} return; } if (maxUsers == 1 && rdp != 0) { WDS.stopServer(rdp); rdp = 0; } if (rdp == 0) { cs = null; new Thread() { public void run() { rdp = WDS.startServer("Viewer", "Group", rdpPass, maxUsers, viewOnly, 33002); cs = WDS.getConnectionString(rdp); WDS.runServer(rdp); } }.start(); while (cs == null) { JF.sleep(10); } cs = fixIP(cs, req.getHost()); } noCache(res); res.setContentType("text/plain"); try {res.write(cs.getBytes());} catch (Exception e) {e.printStackTrace();} System.out.println("Connection string delivered."); } public void doPost(WebRequest req, WebResponse res) { res.setStatus(500, "500 POST not supported"); } private String fixIP(String txt, String host) { XML xml = new XML(); ByteArrayInputStream bais = new ByteArrayInputStream(txt.getBytes()); xml.read(bais); //... XML.XMLTag E = xml.root; XML.XMLTag A = xml.getTag(new String[] {"E", "A"}); XML.XMLTag C = xml.getTag(new String[] {"E", "C"}); XML.XMLTag T = xml.getTag(new String[] {"E", "C", "T"}); //enumerate T's L children int cnt = T.getChildCount(); boolean gotIP4 = false; for(int i=0;i<cnt;) { XML.XMLTag l = T.getChildAt(i); String N = l.getArg("N"); if (gotIP4 || N.indexOf(":") != -1) { //IP6 - ignore it T.remove(i); cnt--; } else { //IP4 - use it but change P and H l.setArg("N", host); // l.setArg("P", "33002"); gotIP4 = true; i++; } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); xml.write(baos); return new String(baos.toByteArray()); } }