/* * Copyright (C) 2008-2017, Juick * * 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.s2s; import com.fasterxml.jackson.annotation.JsonIgnore; import com.juick.server.XMPPServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.UUID; /** * * @author ugnich */ public class Connection { protected static final Logger logger = LoggerFactory.getLogger(Connection.class); public String streamID; public Instant created; public Instant updated; public long bytesLocal = 0; public long packetsLocal = 0; XMPPServer xmpp; private 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"; XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); OutputStreamWriter writer; private boolean secured = false; public Connection(XMPPServer xmpp) throws XmlPullParserException { this.xmpp = xmpp; created = updated = Instant.now(); } 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 += ">...\n"; logger.trace(tag); } public void sendStanza(String xml) { if (streamID != null) { logger.trace("OUT: {}\n", xml); } try { writer.write(xml); writer.flush(); } catch (IOException e) { logger.error("send stanza failed", e); } updated = Instant.now(); bytesLocal += xml.length(); packetsLocal++; } public void closeConnection() { if (streamID != null) { logger.debug("closing stream {}", streamID); } try { writer.write(""); } catch (Exception e) { } try { writer.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } public boolean isSecured() { return secured; } public void setSecured(boolean secured) { this.secured = secured; } public void restartParser() throws XmlPullParserException, IOException { streamID = UUID.randomUUID().toString(); parser = factory.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new InputStreamReader(socket.getInputStream())); writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8); } @JsonIgnore public Socket getSocket() { return socket; } public void setSocket(Socket socket) { this.socket = socket; } }