mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 14:22:05 +01:00
Anonymous login support, better way to get user's XMPP address.
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@2020 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
8d3e50bb9e
commit
a6e5b853e9
1 changed files with 94 additions and 22 deletions
|
@ -54,6 +54,7 @@ package org.jivesoftware.smack;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.*;
|
import org.jivesoftware.smack.packet.*;
|
||||||
import org.jivesoftware.smack.filter.*;
|
import org.jivesoftware.smack.filter.*;
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
@ -111,10 +112,10 @@ public class XMPPConnection {
|
||||||
protected Socket socket;
|
protected Socket socket;
|
||||||
|
|
||||||
String connectionID;
|
String connectionID;
|
||||||
private String username = null;
|
private String user = null;
|
||||||
private String resource = null;
|
|
||||||
private boolean connected = false;
|
private boolean connected = false;
|
||||||
private boolean authenticated = false;
|
private boolean authenticated = false;
|
||||||
|
private boolean anonymous = false;
|
||||||
|
|
||||||
private PacketWriter packetWriter;
|
private PacketWriter packetWriter;
|
||||||
private PacketReader packetReader;
|
private PacketReader packetReader;
|
||||||
|
@ -196,28 +197,17 @@ public class XMPPConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the username that was used to login or <tt>null</tt> if not logged in yet.
|
* Returns the full XMPP address of the user that is logged in to the connection or
|
||||||
|
* <tt>null</tt> if not logged in yet. An XMPP address is in the form
|
||||||
|
* username@server/resource.
|
||||||
*
|
*
|
||||||
* @return the username used to login.
|
* @return the full XMPP address of the user logged in.
|
||||||
*/
|
*/
|
||||||
public String getUsername() {
|
public String getUser() {
|
||||||
if (!isAuthenticated()) {
|
if (!isAuthenticated()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return username;
|
return user;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the resource that was used to login or <tt>null</tt> if not logged in yet.
|
|
||||||
* If no resource was used to login, the default resource "Smack" will be returned.
|
|
||||||
*
|
|
||||||
* @return the resource used to login.
|
|
||||||
*/
|
|
||||||
public String getResource() {
|
|
||||||
if (!isAuthenticated()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return resource;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,8 +246,6 @@ public class XMPPConnection {
|
||||||
if (authenticated) {
|
if (authenticated) {
|
||||||
throw new IllegalStateException("Already logged in to server.");
|
throw new IllegalStateException("Already logged in to server.");
|
||||||
}
|
}
|
||||||
this.username = username;
|
|
||||||
this.resource = resource;
|
|
||||||
// If we send an authentication packet in "get" mode with just the username,
|
// If we send an authentication packet in "get" mode with just the username,
|
||||||
// the server will return the list of authentication protocols it supports.
|
// the server will return the list of authentication protocols it supports.
|
||||||
Authentication discoveryAuth = new Authentication();
|
Authentication discoveryAuth = new Authentication();
|
||||||
|
@ -310,6 +298,17 @@ public class XMPPConnection {
|
||||||
else if (response.getType() == IQ.Type.ERROR) {
|
else if (response.getType() == IQ.Type.ERROR) {
|
||||||
throw new XMPPException(response.getError());
|
throw new XMPPException(response.getError());
|
||||||
}
|
}
|
||||||
|
// Set the user.
|
||||||
|
if (response.getTo() != null) {
|
||||||
|
this.user = response.getTo();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Authentication authResponse = (Authentication)response;
|
||||||
|
this.user = authResponse.getUsername() + "@" + this.host;
|
||||||
|
if (authResponse.getResource() != null) {
|
||||||
|
this.user += "/" + authResponse.getResource();
|
||||||
|
}
|
||||||
|
}
|
||||||
// We're done with the collector, so explicitly cancel it.
|
// We're done with the collector, so explicitly cancel it.
|
||||||
collector.cancel();
|
collector.cancel();
|
||||||
|
|
||||||
|
@ -322,6 +321,7 @@ public class XMPPConnection {
|
||||||
|
|
||||||
// Indicate that we're now authenticated.
|
// Indicate that we're now authenticated.
|
||||||
authenticated = true;
|
authenticated = true;
|
||||||
|
anonymous = false;
|
||||||
|
|
||||||
// If debugging is enabled, change the the debug window title to include the
|
// If debugging is enabled, change the the debug window title to include the
|
||||||
// name we are now logged-in as.
|
// name we are now logged-in as.
|
||||||
|
@ -334,9 +334,72 @@ public class XMPPConnection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs in to the server anonymously. Very few servers are configured to support anonymous
|
||||||
|
* authentication, so it's fairly likely logging in anonymously will fail. If anonymous login
|
||||||
|
* does succeed, your XMPP address will likely be in the form "server/123ABC" (where "123ABC" is a
|
||||||
|
* random value generated by the server).
|
||||||
|
*
|
||||||
|
* @throws XMPPException if an error occurs or anonymous logins are not supported by the server.
|
||||||
|
* @throws IllegalStateException if not connected to the server, or already logged in
|
||||||
|
* to the serrver.
|
||||||
|
*/
|
||||||
|
public synchronized void loginAnonymously() throws XMPPException {
|
||||||
|
if (!isConnected()) {
|
||||||
|
throw new IllegalStateException("Not connected to server.");
|
||||||
|
}
|
||||||
|
if (authenticated) {
|
||||||
|
throw new IllegalStateException("Already logged in to server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the authentication packet we'll send to the server.
|
||||||
|
Authentication auth = new Authentication();
|
||||||
|
|
||||||
|
PacketCollector collector = packetReader.createPacketCollector(
|
||||||
|
new PacketIDFilter(auth.getPacketID()));
|
||||||
|
// Send the packet.
|
||||||
|
packetWriter.sendPacket(auth);
|
||||||
|
// Wait up to five seconds for a response from the server.
|
||||||
|
IQ response = (IQ)collector.nextResult(5000);
|
||||||
|
if (response == null) {
|
||||||
|
throw new XMPPException("Anonymous login failed.");
|
||||||
|
}
|
||||||
|
else if (response.getType() == IQ.Type.ERROR) {
|
||||||
|
throw new XMPPException(response.getError());
|
||||||
|
}
|
||||||
|
// Set the user value.
|
||||||
|
if (response.getTo() != null) {
|
||||||
|
this.user = response.getTo();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.user = this.host + "/" + ((Authentication)response).getResource();
|
||||||
|
}
|
||||||
|
// We're done with the collector, so explicitly cancel it.
|
||||||
|
collector.cancel();
|
||||||
|
|
||||||
|
// Anonymous users can't have a roster.
|
||||||
|
roster = null;
|
||||||
|
|
||||||
|
// Set presence to online.
|
||||||
|
packetWriter.sendPacket(new Presence(Presence.Type.AVAILABLE));
|
||||||
|
|
||||||
|
// Indicate that we're now authenticated.
|
||||||
|
authenticated = true;
|
||||||
|
anonymous = true;
|
||||||
|
|
||||||
|
// If debugging is enabled, change the the debug window title to include the
|
||||||
|
// name we are now logged-in as.
|
||||||
|
if (DEBUG_ENABLED) {
|
||||||
|
String title = "Smack Debug Window -- " + getHost() + ":" + getPort();
|
||||||
|
title += "/" + StringUtils.parseResource(user);
|
||||||
|
debugFrame.setTitle(title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the roster for the user logged into the server. If the user has not yet
|
* Returns the roster for the user logged into the server. If the user has not yet
|
||||||
* logged into the server, this method will return <tt>null</tt>.
|
* logged into the server (or if the user is logged in anonymously), this method will return
|
||||||
|
* <tt>null</tt>.
|
||||||
*
|
*
|
||||||
* @return the user's roster, or <tt>null</tt> if the user has not logged in yet.
|
* @return the user's roster, or <tt>null</tt> if the user has not logged in yet.
|
||||||
*/
|
*/
|
||||||
|
@ -421,6 +484,15 @@ public class XMPPConnection {
|
||||||
return authenticated;
|
return authenticated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if currently authenticated anonymously.
|
||||||
|
*
|
||||||
|
* @return true if authenticated anonymously.
|
||||||
|
*/
|
||||||
|
public boolean isAnonymous() {
|
||||||
|
return anonymous;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the connection by setting presence to unavailable then closing the stream to
|
* Closes the connection by setting presence to unavailable then closing the stream to
|
||||||
* the XMPP server. Once a connection has been closed, it cannot be re-opened.
|
* the XMPP server. Once a connection has been closed, it cannot be re-opened.
|
||||||
|
|
Loading…
Reference in a new issue