Package org.jivesoftware.openfire.net

Examples of org.jivesoftware.openfire.net.MXParser


            String domain) throws Exception {
        Element features;
        Log.debug("LocalOutgoingServerSession: OS - Indicating we want TLS to " + hostname);
        connection.deliverRawText("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");

        MXParser xpp = reader.getXPPParser();
        // Wait for the <proceed> response
        Element proceed = reader.parseDocument().getRootElement();
        if (proceed != null && proceed.getName().equals("proceed")) {
            Log.debug("LocalOutgoingServerSession: OS - Negotiating TLS with " + hostname);
            boolean needed = JiveGlobals.getBooleanProperty("xmpp.server.certificate.verify", true) &&
                    JiveGlobals.getBooleanProperty("xmpp.server.certificate.verify.chain", true) &&
                    !JiveGlobals.getBooleanProperty("xmpp.server.certificate.accept-selfsigned", false);
            connection.startTLS(true, hostname, needed ? Connection.ClientAuth.needed : Connection.ClientAuth.wanted);
            Log.debug("LocalOutgoingServerSession: OS - TLS negotiation with " + hostname + " was successful");

            // TLS negotiation was successful so initiate a new stream
            connection.deliverRawText(openingStream.toString());

            // Reset the parser to use the new secured reader
            xpp.setInput(new InputStreamReader(connection.getTLSStreamHandler().getInputStream(),
                    CHARSET));
            // Skip new stream element
            for (int eventType = xpp.getEventType(); eventType != XmlPullParser.START_TAG;) {
                eventType = xpp.next();
            }
            // Get the stream ID
            String id = xpp.getAttributeValue("", "id");
            // Get new stream features
            features = reader.parseDocument().getRootElement();
            if (features != null && (features.element("mechanisms") != null || features.element("dialback") != null)) {
                // Check if we can use stream compression
                String policyName = JiveGlobals.getProperty("xmpp.server.compression.policy",
                        Connection.CompressionPolicy.disabled.toString());
                Connection.CompressionPolicy compressionPolicy =
                        Connection.CompressionPolicy.valueOf(policyName);
                if (Connection.CompressionPolicy.optional == compressionPolicy) {
                    // Verify if the remote server supports stream compression
                    Element compression = features.element("compression");
                    if (compression != null) {
                        boolean zlibSupported = false;
                        Iterator it = compression.elementIterator("method");
                        while (it.hasNext()) {
                            Element method = (Element) it.next();
                            if ("zlib".equals(method.getTextTrim())) {
                                zlibSupported = true;
                            }
                        }
                        if (zlibSupported) {
                            // Request Stream Compression
                            connection.deliverRawText("<compress xmlns='http://jabber.org/protocol/compress'><method>zlib</method></compress>");
                            // Check if we are good to start compression
                            Element answer = reader.parseDocument().getRootElement();
                            if ("compressed".equals(answer.getName())) {
                                // Server confirmed that we can use zlib compression
                                connection.addCompression();
                                connection.startCompression();
                                Log.debug("LocalOutgoingServerSession: OS - Stream compression was successful with " + hostname);
                                // Stream compression was successful so initiate a new stream
                                connection.deliverRawText(openingStream.toString());
                                // Reset the parser to use stream compression over TLS
                                ZInputStream in = new ZInputStream(
                                        connection.getTLSStreamHandler().getInputStream());
                                in.setFlushMode(JZlib.Z_PARTIAL_FLUSH);
                                xpp.setInput(new InputStreamReader(in, CHARSET));
                                // Skip the opening stream sent by the server
                                for (int eventType = xpp.getEventType(); eventType != XmlPullParser.START_TAG;)
                                {
                                    eventType = xpp.next();
                                }
                                // Get new stream features
                                features = reader.parseDocument().getRootElement();
                                if (features == null || features.element("mechanisms") == null) {
                                    Log.debug("LocalOutgoingServerSession: OS - Error, EXTERNAL SASL was not offered by " + hostname);
                                    return null;
                                }
                            }
                            else {
                                Log.debug("LocalOutgoingServerSession: OS - Stream compression was rejected by " + hostname);
                            }
                        }
                        else {
                            Log.debug(
                                    "LocalOutgoingServerSession: OS - Stream compression found but zlib method is not supported by" +
                                            hostname);
                        }
                    }
                    else {
                        Log.debug("LocalOutgoingServerSession: OS - Stream compression not supoprted by " + hostname);
                    }
                }

                // Skip SASL EXTERNAL and use server dialback over TLS when using self-signed certificates
                boolean dialbackOffered = features.element("dialback") != null;
                if (!dialbackOffered || !connection.isUsingSelfSignedCertificate()) {
                    Iterator it = features.element("mechanisms").elementIterator();
                    while (it.hasNext()) {
                        Element mechanism = (Element) it.next();
                        if ("EXTERNAL".equals(mechanism.getTextTrim())) {
                            Log.debug("LocalOutgoingServerSession: OS - Starting EXTERNAL SASL with " + hostname);
                            if (doExternalAuthentication(domain, connection, reader)) {
                                Log.debug("LocalOutgoingServerSession: OS - EXTERNAL SASL with " + hostname + " was successful");
                                // SASL was successful so initiate a new stream
                                connection.deliverRawText(openingStream.toString());

                                // Reset the parser
                                xpp.resetInput();
                                // Skip the opening stream sent by the server
                                for (int eventType = xpp.getEventType();
                                     eventType != XmlPullParser.START_TAG;) {
                                    eventType = xpp.next();
                                }

                                // SASL authentication was successful so create new
                                // OutgoingServerSession
                                id = xpp.getAttributeValue("", "id");
                                StreamID streamID = new BasicStreamIDFactory().createStreamID(id);
                                LocalOutgoingServerSession session = new LocalOutgoingServerSession(domain,
                                        connection, new OutgoingServerSocketReader(reader), streamID);
                                connection.init(session);
                                // Set the hostname as the address of the session
View Full Code Here

TOP

Related Classes of org.jivesoftware.openfire.net.MXParser

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.