1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-11-26 00:02:06 +01:00

Improved login method.

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@1780 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Matt Tucker 2003-01-15 14:54:11 +00:00 committed by mtucker
parent 5a8e4b59c7
commit 4e8a84834f

View file

@ -53,6 +53,7 @@
package org.jivesoftware.smack; package org.jivesoftware.smack;
import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.packet.Error;
import org.jivesoftware.smack.filter.PacketIDFilter; import org.jivesoftware.smack.filter.PacketIDFilter;
import javax.swing.*; import javax.swing.*;
@ -181,9 +182,10 @@ public class XMPPConnection {
} }
/** /**
* Login to the server using the server's preferred authentication mechanism and set * Login to the server using the strongest authentication mode supported by
* our presence to available. If more than five seconds elapses without a response from * the server, then set our presence to available. If more than five seconds
* the server, or if an error occurs, a XMPPException will be thrown.<p> * elapses in each step of the authentication process without a response from
* the server, or if an error occurs, a XMPPException will be thrown.
* *
* @param username the username. * @param username the username.
* @param password the password. * @param password the password.
@ -193,15 +195,58 @@ public class XMPPConnection {
if (!isConnected()) { if (!isConnected()) {
throw new IllegalStateException("Not connected to server."); throw new IllegalStateException("Not connected to server.");
} }
Authentication auth = new Authentication(username, password, "Smack"); // If we send an authentication packet in "get" mode with just the username,
packetWriter.sendPacket(auth); // the server will return the list of authentication protocols it supports.
Authentication discoveryAuth = new Authentication();
discoveryAuth.setType(IQ.Type.GET);
discoveryAuth.setUsername(username);
packetWriter.sendPacket(discoveryAuth);
// Wait up to five seconds for a response from the server. // Wait up to five seconds for a response from the server.
PacketCollector collector = packetReader.createPacketCollector( PacketCollector collector = packetReader.createPacketCollector(
new PacketIDFilter(discoveryAuth.getPacketID()));
Authentication authTypes = (Authentication)collector.nextResult(5000);
collector.cancel();
if (authTypes == null || authTypes.getType().equals(IQ.Type.ERROR)) {
throw new XMPPException("No response from the server.");
}
// Now, create the authentication packet we'll send to the server.
Authentication auth = new Authentication();
auth.setUsername(username);
// Figure out if we should use digest or plain text authentication.
if (authTypes.getDigest() != null) {
auth.setDigest(connectionID, password);
}
else if (authTypes.getPassword() != null) {
auth.setPassword(password);
}
else {
throw new XMPPException("Server does not support compatible authentication mechanism.");
}
auth.setResource("Smack");
packetWriter.sendPacket(auth);
// Wait up to five seconds for a response from the server.
collector = packetReader.createPacketCollector(
new PacketIDFilter(auth.getPacketID())); new PacketIDFilter(auth.getPacketID()));
IQ response = (IQ)collector.nextResult(5000); IQ response = (IQ)collector.nextResult(5000);
if (response == null || response.getType() == IQ.Type.ERROR) { if (response == null) {
throw new XMPPException("Authentication failed."); throw new XMPPException("Authentication failed.");
} }
else if (response.getType() == IQ.Type.ERROR) {
if (response.getError() == null) {
throw new XMPPException("Authentication failed.");
}
else {
Error error = response.getError();
String msg = "Authentication failed -- " + error.getCode();
if (error.getMessage() != null) {
msg += ": " + error.getMessage();
}
throw new XMPPException(msg);
}
}
// We're done with the collector, so explicitly cancel it. // We're done with the collector, so explicitly cancel it.
collector.cancel(); collector.cancel();
// Set presence to online. // Set presence to online.
@ -322,7 +367,7 @@ public class XMPPConnection {
allPacketListener.start(); allPacketListener.start();
} }
// Start the packet writer. This will open a Jabber stream to the server // Start the packet writer. This will open a Jabber stream to the server
packetWriter.start(); packetWriter.startup();
// Start the packet reader. The startup() method will block until we // Start the packet reader. The startup() method will block until we
// get an opening stream packet back from server. // get an opening stream packet back from server.
packetReader.startup(); packetReader.startup();
@ -403,6 +448,7 @@ public class XMPPConnection {
public int read(char cbuf[], int off, int len) throws IOException { public int read(char cbuf[], int off, int len) throws IOException {
int count = myReader.read(cbuf, off, len); int count = myReader.read(cbuf, off, len);
if (count > 0) {
String str = new String(cbuf, off, count); String str = new String(cbuf, off, count);
receivedText1.append(str); receivedText1.append(str);
receivedText2.append(str); receivedText2.append(str);
@ -410,6 +456,7 @@ public class XMPPConnection {
receivedText1.append(NEWLINE); receivedText1.append(NEWLINE);
receivedText2.append(NEWLINE); receivedText2.append(NEWLINE);
} }
}
return count; return count;
} }