diff options
author | 2016-07-31 02:34:12 +0300 | |
---|---|---|
committer | 2016-07-31 02:34:12 +0300 | |
commit | d06d53708a1f87d41b14fc87d40a7b9233b36fcb (patch) | |
tree | cbf529d736e7a3886003cdcb25fa354fef5ce701 /juick-ws/src/main/java/com/juick/ws/s2s/Connection.java | |
parent | 0c2ac00e800b2ed5f73a7abb9922b87329a077de (diff) |
move components to ws module
Diffstat (limited to 'juick-ws/src/main/java/com/juick/ws/s2s/Connection.java')
-rw-r--r-- | juick-ws/src/main/java/com/juick/ws/s2s/Connection.java | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/juick-ws/src/main/java/com/juick/ws/s2s/Connection.java b/juick-ws/src/main/java/com/juick/ws/s2s/Connection.java new file mode 100644 index 00000000..77c12d1d --- /dev/null +++ b/juick-ws/src/main/java/com/juick/ws/s2s/Connection.java @@ -0,0 +1,149 @@ +package com.juick.ws.s2s; + +import com.juick.ws.components.XMPPComponent; +import org.xmlpull.mxp1.MXParser; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.*; +import java.net.Socket; +import java.security.*; +import java.security.cert.CertificateException; +import java.util.UUID; +import java.util.logging.Logger; + +/** + * + * @author ugnich + */ +public class Connection { + + protected static final Logger logger = Logger.getLogger(Connection.class.getName()); + + public String streamID; + public long tsCreated = 0; + public long tsLocalData = 0; + public long bytesLocal = 0; + public long packetsLocal = 0; + XMPPComponent xmpp; + Socket socket; + public static final String NS_DB = "jabber:server:dialback"; + public static final String NS_TLS = "urn:ietf:params:xml:ns:xmpp-tls"; + public static final String NS_STREAM = "http://etherx.jabber.org/streams"; + XmlPullParser parser = new MXParser(); + OutputStreamWriter writer; + private boolean secured = false; + SSLContext sc; + private TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + } + }; + + + public Connection(XMPPComponent xmpp) throws XmlPullParserException, KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, KeyManagementException { + this.xmpp = xmpp; + tsCreated = System.currentTimeMillis(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + KeyStore ks = KeyStore.getInstance("JKS"); + try (InputStream ksIs = new FileInputStream(xmpp.keystore)) { + ks.load(ksIs, xmpp.keystorePassword.toCharArray()); + } + + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory + .getDefaultAlgorithm()); + kmf.init(ks, xmpp.keystorePassword.toCharArray()); + sc = SSLContext.getInstance("TLSv1.2"); + + sc.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom()); + + } + + public void logParser() { + if (streamID == null) { + return; + } + String tag = "IN: <" + parser.getName(); + for (int i = 0; i < parser.getAttributeCount(); i++) { + tag += " " + parser.getAttributeName(i) + "=\"" + parser.getAttributeValue(i) + "\""; + } + tag += ">...</" + parser.getName() + ">\n"; + logger.fine(tag); + } + + public void sendStanza(String xml) throws IOException { + if (streamID != null) { + logger.fine("OUT: " + xml + "\n"); + } + writer.write(xml); + writer.flush(); + tsLocalData = System.currentTimeMillis(); + bytesLocal += xml.length(); + packetsLocal++; + } + + public void closeConnection() { + if (streamID != null) { + logger.info(String.format("CLOSING STREAM %s", streamID)); + } + + try { + writer.write("</stream:stream>"); + } catch (Exception e) { + } + + try { + writer.close(); + } catch (Exception e) { + } + + try { + socket.close(); + } catch (Exception e) { + } + } + + static String generateDialbackKey(String to, String from, String id) throws Exception { + Mac hmacSha256 = Mac.getInstance("hmacSHA256"); + + SecretKeySpec secret_key = new SecretKeySpec("$UppPerSeCCret4".getBytes(), "SHA-256"); + hmacSha256.init(secret_key); + byte key[] = hmacSha256.doFinal((to + " " + from + " " + id).getBytes()); + + StringBuilder hexkey = new StringBuilder(); + for (int i = 0; i < key.length; i++) { + hexkey.append(Integer.toHexString(0xFF & key[i])); + } + + return hexkey.toString(); + } + + public boolean isSecured() { + return secured; + } + + public void setSecured(boolean secured) { + this.secured = secured; + } + + public void restartParser() throws XmlPullParserException, IOException { + parser = new MXParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + parser.setInput(new InputStreamReader(socket.getInputStream())); + writer = new OutputStreamWriter(socket.getOutputStream()); + streamID = UUID.randomUUID().toString(); + } +} |