}
}
@Override
public void onPacketReceived(final PacketReceivedEvent event) {
final XMLPacket stanza = event.getPacket();
final String name = stanza.getTagName();
final String xmlns = stanza.getNamespace();
if (mode == SessionMode.login) {
if (("stream:features".equals(name) || "features".equals(name)) && stanza.hasChild("mechanisms", XmppNamespaces.SASL)) {
setStatus(SessionStatus.connecting);
List<String> mechanisms = Lists.newArrayList();
for (final XMLPacket mechanism : stanza.getFirstChild("mechanisms", XmppNamespaces.SASL).getChildren("mechanism")) {
mechanisms.add(mechanism.getText());
}
if (credentials.isAnoymous()) {
if (!mechanisms.contains("ANONYMOUS")) {
setStatus(SessionStatus.notAuthorized);
mode = SessionMode.offline;
connection.disconnect();
}
connection.send(XMLBuilder.create("auth", XmppNamespaces.SASL).attribute("mechanism", "ANONYMOUS").getXML());
return;
}
if (mechanisms.contains("SCRAM-SHA-1")) {
saslClient = new ScramSHA1Client(credentials);
}
else if (mechanisms.contains("PLAIN")) {
saslClient = new PlainClient(credentials);
}
else {
setStatus(SessionStatus.notAuthorized);
mode = SessionMode.offline;
connection.disconnect();
}
final String encondedAuth = Base64.toBase64(saslClient.getInitialResponse());
connection.send(XMLBuilder.create("auth", XmppNamespaces.SASL).attribute("mechanism", saslClient.getMechanismName()).text(encondedAuth).getXML());
} else if ("challenge".equals(name) && XmppNamespaces.SASL.equals(xmlns)) {
final byte[] challenge = Base64.fromBase64(stanza.getText());
try {
final String encondedAuth = Base64.toBase64(saslClient.evaluateChallenge(challenge));
connection.send(XMLBuilder.create("response", XmppNamespaces.SASL).text(encondedAuth).getXML());
} catch (SaslException e) {
setStatus(SessionStatus.notAuthorized);
mode = SessionMode.offline;
connection.disconnect();
}
} else if ("success".equals(name) && XmppNamespaces.SASL.equals(xmlns)) {
final byte[] challenge = Base64.fromBase64(stanza.getText());
if (challenge != null && challenge.length > 0) {
try {
saslClient.evaluateChallenge(challenge);
} catch (SaslException e) {
setStatus(SessionStatus.notAuthorized);