Search in sources :

Example 1 with MultiplexerPacketDeliverer

use of org.jivesoftware.openfire.multiplex.MultiplexerPacketDeliverer in project Openfire by igniterealtime.

the class LocalConnectionMultiplexerSession method createSession.

public static LocalConnectionMultiplexerSession createSession(String serverName, XmlPullParser xpp, Connection connection) throws XmlPullParserException {
    String domain = xpp.getAttributeValue("", "to");
    Log.debug("LocalConnectionMultiplexerSession: [ConMng] Starting registration of new connection manager for domain: " + domain);
    // Default answer header in case of an error
    StringBuilder sb = new StringBuilder();
    sb.append("<?xml version='1.0' encoding='");
    sb.append(CHARSET);
    sb.append("'?>");
    sb.append("<stream:stream ");
    sb.append("xmlns:stream=\"http://etherx.jabber.org/streams\" ");
    sb.append("xmlns=\"jabber:connectionmanager\" from=\"");
    sb.append(domain);
    sb.append("\" version=\"1.0\">");
    // Check that a domain was provided in the stream header
    if (domain == null) {
        Log.debug("LocalConnectionMultiplexerSession: [ConMng] Domain not specified in stanza: " + xpp.getText());
        // Include the bad-format in the response
        StreamError error = new StreamError(StreamError.Condition.bad_format);
        sb.append(error.toXML());
        connection.deliverRawText(sb.toString());
        // Close the underlying connection
        connection.close();
        return null;
    }
    // Get the requested domain
    JID address = new JID(domain);
    // Check that a secret key was configured in the server
    String secretKey = ConnectionMultiplexerManager.getDefaultSecret();
    if (secretKey == null) {
        Log.debug("LocalConnectionMultiplexerSession: [ConMng] A shared secret for connection manager was not found.");
        // Include the internal-server-error in the response
        StreamError error = new StreamError(StreamError.Condition.internal_server_error);
        sb.append(error.toXML());
        connection.deliverRawText(sb.toString());
        // Close the underlying connection
        connection.close();
        return null;
    }
    // Check that the requested subdomain is not already in use
    if (SessionManager.getInstance().getConnectionMultiplexerSession(address) != null) {
        Log.debug("LocalConnectionMultiplexerSession: [ConMng] Another connection manager is already using domain: " + domain);
        // Domain already occupied so return a conflict error and close the connection
        // Include the conflict error in the response
        StreamError error = new StreamError(StreamError.Condition.conflict);
        sb.append(error.toXML());
        connection.deliverRawText(sb.toString());
        // Close the underlying connection
        connection.close();
        return null;
    }
    // Indicate the TLS policy to use for this connection
    connection.setTlsPolicy(connection.getConfiguration().getTlsPolicy());
    // Indicate the compression policy to use for this connection
    connection.setCompressionPolicy(connection.getConfiguration().getCompressionPolicy());
    // Set the connection manager domain to use delivering a packet fails
    ((MultiplexerPacketDeliverer) connection.getPacketDeliverer()).setConnectionManagerDomain(address.getDomain());
    // Create a ConnectionMultiplexerSession for the new session originated
    // from the connection manager
    LocalConnectionMultiplexerSession session = SessionManager.getInstance().createMultiplexerSession(connection, address);
    // Set the address of the new session
    session.setAddress(address);
    connection.init(session);
    try {
        Log.debug("LocalConnectionMultiplexerSession: [ConMng] Send stream header with ID: " + session.getStreamID() + " for connection manager with domain: " + domain);
        // Build the start packet response
        sb = new StringBuilder();
        sb.append("<?xml version='1.0' encoding='");
        sb.append(CHARSET);
        sb.append("'?>");
        sb.append("<stream:stream ");
        sb.append("xmlns:stream=\"http://etherx.jabber.org/streams\" ");
        sb.append("xmlns=\"jabber:connectionmanager\" from=\"");
        sb.append(domain);
        sb.append("\" id=\"");
        sb.append(session.getStreamID().toString());
        sb.append("\" version=\"1.0\" >");
        connection.deliverRawText(sb.toString());
        // Announce stream features.
        sb = new StringBuilder(490);
        sb.append("<stream:features>");
        if (connection.getTlsPolicy() != Connection.TLSPolicy.disabled) {
            sb.append("<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\">");
            if (connection.getTlsPolicy() == Connection.TLSPolicy.required) {
                sb.append("<required/>");
            }
            sb.append("</starttls>");
        }
        // Include Stream features
        String specificFeatures = session.getAvailableStreamFeatures();
        if (specificFeatures != null) {
            sb.append(specificFeatures);
        }
        sb.append("</stream:features>");
        connection.deliverRawText(sb.toString());
        return session;
    } catch (Exception e) {
        Log.error("An error occured while creating a Connection Manager Session", e);
        // Close the underlying connection
        connection.close();
        return null;
    }
}
Also used : StreamError(org.xmpp.packet.StreamError) JID(org.xmpp.packet.JID) UnauthorizedException(org.jivesoftware.openfire.auth.UnauthorizedException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) MultiplexerPacketDeliverer(org.jivesoftware.openfire.multiplex.MultiplexerPacketDeliverer)

Aggregations

UnauthorizedException (org.jivesoftware.openfire.auth.UnauthorizedException)1 MultiplexerPacketDeliverer (org.jivesoftware.openfire.multiplex.MultiplexerPacketDeliverer)1 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)1 JID (org.xmpp.packet.JID)1 StreamError (org.xmpp.packet.StreamError)1