From ff58300004b2dfa283650bda33b29f11e2821173 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Sun, 5 Aug 2018 21:35:04 +0300 Subject: xmpp server refactoring --- .../src/main/java/com/juick/server/XMPPServer.java | 28 ++----- .../com/juick/server/xmpp/router/Handshake.java | 39 +++++++++ .../java/com/juick/server/xmpp/router/Stream.java | 20 ++++- .../server/xmpp/router/StreamComponentServer.java | 1 - .../juick/server/xmpp/router/StreamFeatures.java | 95 ++++++++++++++++++++++ .../com/juick/server/xmpp/s2s/ConnectionIn.java | 4 +- .../juick/server/xmpp/s2s/ConnectionListener.java | 3 +- .../com/juick/server/xmpp/s2s/ConnectionOut.java | 9 +- 8 files changed, 169 insertions(+), 30 deletions(-) create mode 100644 juick-server/src/main/java/com/juick/server/xmpp/router/Handshake.java create mode 100644 juick-server/src/main/java/com/juick/server/xmpp/router/StreamFeatures.java (limited to 'juick-server/src/main/java') diff --git a/juick-server/src/main/java/com/juick/server/XMPPServer.java b/juick-server/src/main/java/com/juick/server/XMPPServer.java index 9dc7bf0a..4a5d577d 100644 --- a/juick-server/src/main/java/com/juick/server/XMPPServer.java +++ b/juick-server/src/main/java/com/juick/server/XMPPServer.java @@ -17,9 +17,9 @@ package com.juick.server; +import com.juick.server.xmpp.router.StreamError; import com.juick.server.xmpp.s2s.*; import com.juick.service.UserService; -import com.juick.xmpp.extensions.StreamError; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -59,7 +59,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * @author ugnich */ @Component -public class XMPPServer implements ConnectionListener, AutoCloseable { +public class XMPPServer implements ConnectionListener { private static final Logger logger = LoggerFactory.getLogger("com.juick.server.xmpp"); private static final int TIMEOUT_MINUTES = 15; @@ -156,23 +156,6 @@ public class XMPPServer implements ConnectionListener, AutoCloseable { }); } - @Override - public void close() throws Exception { - if (listener != null && !listener.isClosed()) { - listener.close(); - } - outConnections.forEach((c, s) -> { - c.logoff(); - outConnections.remove(c); - }); - inConnections.forEach(c -> { - c.closeConnection(); - inConnections.remove(c); - }); - service.shutdown(); - logger.info("XMPP server destroyed"); - } - public void addConnectionIn(ConnectionIn c) { c.setListener(this); inConnections.add(c); @@ -443,7 +426,12 @@ public class XMPPServer implements ConnectionListener, AutoCloseable { }); } @PreDestroy - public void preDestroy() { + public void preDestroy() throws IOException { closeFlag.set(true); + if (listener != null && !listener.isClosed()) { + listener.close(); + } + service.shutdown(); + logger.info("XMPP server destroyed"); } } diff --git a/juick-server/src/main/java/com/juick/server/xmpp/router/Handshake.java b/juick-server/src/main/java/com/juick/server/xmpp/router/Handshake.java new file mode 100644 index 00000000..0bc501dd --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/xmpp/router/Handshake.java @@ -0,0 +1,39 @@ +package com.juick.server.xmpp.router; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +/** + * Created by vitalyster on 30.01.2017. + */ +public class Handshake { + private String value; + + public static Handshake parse(XmlPullParser parser) throws IOException, XmlPullParserException { + parser.next(); + Handshake handshake = new Handshake(); + handshake.setValue(XmlUtils.getTagText(parser)); + return handshake; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + StringBuilder str = new StringBuilder("").append(getValue()).append(""); + } else { + str.append("/>"); + } + return str.toString(); + } +} diff --git a/juick-server/src/main/java/com/juick/server/xmpp/router/Stream.java b/juick-server/src/main/java/com/juick/server/xmpp/router/Stream.java index 7532443c..4319bee7 100644 --- a/juick-server/src/main/java/com/juick/server/xmpp/router/Stream.java +++ b/juick-server/src/main/java/com/juick/server/xmpp/router/Stream.java @@ -45,7 +45,7 @@ public abstract class Stream { this.loggedIn = loggedIn; } - Jid from; + public Jid from; public Jid to; private InputStream is; private OutputStream os; @@ -69,7 +69,7 @@ public abstract class Stream { streamId = UUID.randomUUID().toString(); } - void restartStream() throws XmlPullParserException { + public void restartStream() throws XmlPullParserException { parser = factory.newPullParser(); parser.setInput(new InputStreamReader(is, StandardCharsets.UTF_8)); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); @@ -181,4 +181,20 @@ public abstract class Stream { public void setUpdated() { this.updated = Instant.now(); } + + public InputStream getInputStream() { + return is; + } + + public void setInputStream(InputStream is) { + this.is = is; + } + + public OutputStream getOutputStream() { + return os; + } + + public void setOutputStream(OutputStream os) { + this.os = os; + } } diff --git a/juick-server/src/main/java/com/juick/server/xmpp/router/StreamComponentServer.java b/juick-server/src/main/java/com/juick/server/xmpp/router/StreamComponentServer.java index a7759afa..a58adfc5 100644 --- a/juick-server/src/main/java/com/juick/server/xmpp/router/StreamComponentServer.java +++ b/juick-server/src/main/java/com/juick/server/xmpp/router/StreamComponentServer.java @@ -1,6 +1,5 @@ package com.juick.server.xmpp.router; -import com.juick.xmpp.extensions.Handshake; import org.apache.commons.codec.digest.DigestUtils; import org.xmlpull.v1.XmlPullParserException; import rocks.xmpp.addr.Jid; diff --git a/juick-server/src/main/java/com/juick/server/xmpp/router/StreamFeatures.java b/juick-server/src/main/java/com/juick/server/xmpp/router/StreamFeatures.java new file mode 100644 index 00000000..e8fc324f --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/xmpp/router/StreamFeatures.java @@ -0,0 +1,95 @@ +/* + * Juick + * Copyright (C) 2008-2013, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server.xmpp.router; + +import java.io.IOException; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +/** + * + * @author Ugnich Anton + */ +public class StreamFeatures { + + public static final int NOTAVAILABLE = -1; + public static final int AVAILABLE = 0; + public static final int REQUIRED = 1; + public int STARTTLS = NOTAVAILABLE; + public int ZLIB = NOTAVAILABLE; + public int PLAIN = NOTAVAILABLE; + public int DIGEST_MD5 = NOTAVAILABLE; + public int REGISTER = NOTAVAILABLE; + public int EXTERNAL = NOTAVAILABLE; + + public static StreamFeatures parse(final XmlPullParser parser) throws XmlPullParserException, IOException { + StreamFeatures features = new StreamFeatures(); + final int initial = parser.getDepth(); + while (true) { + int eventType = parser.next(); + if (eventType == XmlPullParser.START_TAG && parser.getDepth() == initial + 1) { + final String tag = parser.getName(); + final String xmlns = parser.getNamespace(); + if (tag.equals("starttls") && xmlns != null && xmlns.equals("urn:ietf:params:xml:ns:xmpp-tls")) { + features.STARTTLS = AVAILABLE; + while (parser.next() == XmlPullParser.START_TAG) { + if (parser.getName().equals("required")) { + features.STARTTLS = REQUIRED; + } else { + XmlUtils.skip(parser); + } + } + } else if (tag.equals("compression") && xmlns != null && xmlns.equals("http://jabber.org/features/compress")) { + while (parser.next() == XmlPullParser.START_TAG) { + if (parser.getName().equals("method")) { + final String method = XmlUtils.getTagText(parser).toUpperCase(); + if (method.equals("ZLIB")) { + features.ZLIB = AVAILABLE; + } + } else { + XmlUtils.skip(parser); + } + } + } else if (tag.equals("mechanisms") && xmlns != null && xmlns.equals("urn:ietf:params:xml:ns:xmpp-sasl")) { + while (parser.next() == XmlPullParser.START_TAG) { + if (parser.getName().equals("mechanism")) { + final String mechanism = XmlUtils.getTagText(parser).toUpperCase(); + if (mechanism.equals("PLAIN")) { + features.PLAIN = AVAILABLE; + } else if (mechanism.equals("DIGEST-MD5")) { + features.DIGEST_MD5 = AVAILABLE; + } else if (mechanism.equals("EXTERNAL")) { + features.EXTERNAL = AVAILABLE; + } + } else { + XmlUtils.skip(parser); + } + } + } else if (tag.equals("register") && xmlns != null && xmlns.equals("http://jabber.org/features/iq-register")) { + features.REGISTER = AVAILABLE; + XmlUtils.skip(parser); + } else { + XmlUtils.skip(parser); + } + } else if (eventType == XmlPullParser.END_TAG && parser.getDepth() == initial) { + break; + } + } + return features; + } +} diff --git a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionIn.java b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionIn.java index c635bff6..9c8e375c 100644 --- a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionIn.java +++ b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionIn.java @@ -18,8 +18,8 @@ package com.juick.server.xmpp.s2s; import com.juick.server.XMPPServer; -import com.juick.xmpp.extensions.StreamError; -import com.juick.xmpp.utils.XmlUtils; +import com.juick.server.xmpp.router.StreamError; +import com.juick.server.xmpp.router.XmlUtils; import org.apache.commons.lang3.StringUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionListener.java b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionListener.java index fde7a0e7..4c32b9ae 100644 --- a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionListener.java +++ b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionListener.java @@ -1,6 +1,7 @@ package com.juick.server.xmpp.s2s; -import com.juick.xmpp.extensions.StreamError; + +import com.juick.server.xmpp.router.StreamError; public interface ConnectionListener { boolean isTlsAvailable(); diff --git a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionOut.java b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionOut.java index 0c991553..be485ab1 100644 --- a/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionOut.java +++ b/juick-server/src/main/java/com/juick/server/xmpp/s2s/ConnectionOut.java @@ -17,11 +17,11 @@ package com.juick.server.xmpp.s2s; +import com.juick.server.xmpp.router.Stream; +import com.juick.server.xmpp.router.StreamError; +import com.juick.server.xmpp.router.StreamFeatures; +import com.juick.server.xmpp.router.XmlUtils; import com.juick.server.xmpp.s2s.util.DialbackUtils; -import com.juick.xmpp.Stream; -import com.juick.xmpp.extensions.StreamError; -import com.juick.xmpp.extensions.StreamFeatures; -import com.juick.xmpp.utils.XmlUtils; import org.apache.commons.codec.Charsets; import org.apache.commons.codec.binary.Base64; import org.apache.commons.text.RandomStringGenerator; @@ -37,6 +37,7 @@ import java.io.OutputStream; import java.net.SocketException; import java.util.UUID; +import static com.juick.server.xmpp.router.StreamNamespaces.NS_STREAM; import static com.juick.server.xmpp.s2s.Connection.NS_SASL; /** -- cgit v1.2.3