package sd.web.models; import sd.ns.Connector; import sd.ns.ILoadBalancer; import sd.tcp.*; import com.alcidesfonseca.xmpp.*; import pt.uc.dei.sd.SecurityHelper; import java.net.*; import java.io.*; import java.util.Calendar; import java.util.GregorianCalendar; import org.json.*; public class ChatConnection extends Object{ WebHumanChannel hc = null; Socket s = null; OutChannel out = null; ClientSession session = null; String host = ""; int port = 0; Thread listener = null; GregorianCalendar lastSeen = null; public ChatConnection () { hc = new WebHumanChannel(); ping(); } public void ping() { lastSeen = new GregorianCalendar(); } public void close() { listener.interrupt(); listener = null; out.write( XMLStrings.presence_unavailable(session.getJID()) ); out.write( XMLStrings.stream_end() ); out.close(); } public boolean checkAndClose() { GregorianCalendar acceptableTime = new GregorianCalendar(); acceptableTime.add(Calendar.SECOND, -1 * sd.Config.getWebTimeOut()); if ( !hc.isOpen() || lastSeen.getTime().compareTo(acceptableTime.getTime()) < 0 ) { close(); return true; } return false; } public boolean connect(String u, String p, InetSocketAddress sa) throws java.rmi.RemoteException, sd.ns.NoServerAvailableException { port = sa.getPort(); host = sa.getHostName(); try { s = new Socket(host,port); if (host.equals("jabber.org")) { s = changeToTLS(s,host,port); } } catch (java.net.UnknownHostException e) { return false; } catch (java.io.IOException e) { return false; } out = new SocketOutChannel(s); session = new ClientSession(host,out); session.setLogin(u,p); listener = new TCPClientListener(s,session,hc); listener.start(); // starts to send out.write( XMLStrings.stream_start_to(host) ); return true; } public boolean connect(String u, String p) throws java.rmi.RemoteException, sd.ns.NoServerAvailableException { if (session != null) { hc = new WebHumanChannel(); } ILoadBalancer lb = Connector.getLoadBalancer(); InetSocketAddress sa = lb.getServer(); return connect(u,p,sa); } public void sendMessage(String to, String content) { out.write(XMLStrings.message_chat(to,content)); } public void sendPresence(String s) { out.write(XMLStrings.presence_set(s)); } public void rosterAdd(String jid) { out.write( XMLStrings.roster_item_request( session.getStanzaId() , jid ) ); out.write( XMLStrings.presence_subscribe( jid, session.getJID()) ); } public void rosterDel(String jid) { out.write( XMLStrings.roster_item_remove( session.getStanzaId() ,jid) ); out.write( XMLStrings.presence_unsubscribe( jid, session.getJID()) ); } public void rosterRequest() { out.write(XMLStrings.roster_request(session.getStanzaId())); } public void rosterAccept(String jid, Boolean a) { if ( a ) { out.write(XMLStrings.presence_subscribed(jid,session.getJID())); } else { out.write(XMLStrings.presence_unsubscribed(jid,session.getJID())); } } public JSONArray retrieveMessages() { return hc.retrieveMessages(); } public JSONArray retrieveRoster() { return hc.retrieveRoster(); } public JSONArray retrieveRequests() { return hc.getAndCleanRequests(); } public int checkLogin() { if (hc == null || session == null) return 0; return session.isLogged(); } public String getJid() { return session.getJID(); } private Socket changeToTLS(Socket s,String host, int port) { SocketOutChannel out = new SocketOutChannel(s); int r = 0; try { BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() )); out.write(XMLStrings.stream_start_to(host)); out.write(XMLStrings.start_tls()); XMLParser parser = new XMLParser(new XMPPEmptyParser()); while ( !parser.getTemp().contains("<proceed") ) { r = in.read(); parser.parseInt(r); } try { return SecurityHelper.executeTLSNegotiation(s,host,port);} catch ( java.security.NoSuchAlgorithmException e) { return s; } catch ( java.security.KeyManagementException e) { return s; } } catch (IOException e) { return s; } } }