aboutsummaryrefslogtreecommitdiff
path: root/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2016-11-08 15:54:33 +0300
committerGravatar Vitaly Takmazov2016-11-08 15:54:33 +0300
commit4314d834724bbb5c671e7300b7de865fe53c51fb (patch)
treeadf95198a7db90a8cb6d2cdab90935af1e612ddc /juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
parent397179619fdfa0b4b15f62437a91bd17924e7678 (diff)
reorganize structure again
Diffstat (limited to 'juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java')
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java149
1 files changed, 149 insertions, 0 deletions
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
new file mode 100644
index 00000000..0c1f3d4d
--- /dev/null
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
@@ -0,0 +1,149 @@
+package com.juick.components.s2s;
+
+import com.juick.components.XMPPServer;
+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.nio.charset.Charset;
+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;
+ XMPPServer 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(XMPPServer 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());
+ } catch (Exception e) {
+ logger.warning("tls unavailable");
+ }
+ }
+
+ 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(), Charset.forName("UTF-8"));
+ streamID = UUID.randomUUID().toString();
+ }
+}