/** * Parses SASL authentication error packets. * * @param parser the XML parser. * @return a SASL Failure packet. * @throws Exception if an exception occurs while parsing the packet. */ public static Failure parseSASLFailure(XmlPullParser parser) throws Exception { String condition = null; boolean done = false; while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (!parser.getName().equals("failure")) { condition = parser.getName(); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("failure")) { done = true; } } } return new Failure(condition); }
/** * Parses SASL authentication error packets. * * @param parser * the XML parser. * @return a SASL Failure packet. * @throws Exception * if an exception occurs while parsing the packet. */ public static Failure parseSASLFailure(XmlPullParser parser) throws Exception { String condition = null; boolean done = false; while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (!parser.getName().equals("failure")) { condition = parser.getName(); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("failure")) { done = true; } } } return new Failure(condition); }
private void parseFailure(Element failureEl) throws Exception { if ("urn:ietf:params:xml:ns:xmpp-tls".equals(failureEl.getNamespace() .getURI())) { throw new Exception("TLS negotiation has failed"); } else if ("http://jabber.org/protocol/compress".equals(failureEl .getNamespace().getURI())) { connection.streamCompressionDenied(); } else { final Failure failure = new Failure(failureEl); processPacket(failure); connection.getSASLAuthentication().authenticationFailed( failure.getCondition()); } }
/** * Parse the received packets and notify the corresponding connection. * * @param event the BOSH client response which includes the received packet. */ public void responseReceived(BOSHMessageEvent event) { AbstractBody body = event.getBody(); if (body != null) { try { if (connection.sessionID == null) { connection.sessionID = body.getAttribute(BodyQName.create(BOSHConnection.BOSH_URI, "sid")); } if (connection.authID == null) { connection.authID = body.getAttribute(BodyQName.create(BOSHConnection.BOSH_URI, "authid")); } final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new StringReader(body.toXML())); int eventType = parser.getEventType(); do { eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("body")) { // ignore the container root element } else if (parser.getName().equals("message")) { connection.processPacket(PacketParserUtils.parseMessage(parser)); } else if (parser.getName().equals("iq")) { connection.processPacket(PacketParserUtils.parseIQ(parser, connection)); } else if (parser.getName().equals("presence")) { connection.processPacket(PacketParserUtils.parsePresence(parser)); } else if (parser.getName().equals("challenge")) { // The server is challenging the SASL authentication // made by the client final String challengeData = parser.nextText(); connection.getSASLAuthentication() .challengeReceived(challengeData); connection.processPacket(new Challenge( challengeData)); } else if (parser.getName().equals("success")) { connection.send(ComposableBody.builder() .setNamespaceDefinition("xmpp", BOSHConnection.XMPP_BOSH_NS) .setAttribute( BodyQName.createWithPrefix(BOSHConnection.XMPP_BOSH_NS, "restart", "xmpp"), "true") .setAttribute( BodyQName.create(BOSHConnection.BOSH_URI, "to"), connection.getServiceName()) .build()); connection.getSASLAuthentication().authenticated(); connection.processPacket(new Success(parser.nextText())); } else if (parser.getName().equals("features")) { parseFeatures(parser); } else if (parser.getName().equals("failure")) { if ("urn:ietf:params:xml:ns:xmpp-sasl".equals(parser.getNamespace(null))) { final Failure failure = PacketParserUtils.parseSASLFailure(parser); connection.getSASLAuthentication().authenticationFailed(); connection.processPacket(failure); } } else if (parser.getName().equals("error")) { throw new XMPPException(PacketParserUtils.parseStreamError(parser)); } } } while (eventType != XmlPullParser.END_DOCUMENT); } catch (Exception e) { if (connection.isConnected()) { connection.notifyConnectionError(e); } } } }