Commit 28fc8967 authored by Gaston Dombiak's avatar Gaston Dombiak Committed by gaston

Added support for user bare JID. JM-280


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@1311 b35dd754-fafc-0310-a699-88a17e54d16e
parent 79192143
...@@ -13,6 +13,8 @@ package org.jivesoftware.messenger.disco; ...@@ -13,6 +13,8 @@ package org.jivesoftware.messenger.disco;
import org.jivesoftware.messenger.forms.spi.XDataFormImpl; import org.jivesoftware.messenger.forms.spi.XDataFormImpl;
import org.jivesoftware.messenger.*; import org.jivesoftware.messenger.*;
import org.jivesoftware.messenger.user.UserManager;
import org.jivesoftware.messenger.user.UserNotFoundException;
import org.jivesoftware.messenger.handler.IQHandler; import org.jivesoftware.messenger.handler.IQHandler;
import org.jivesoftware.messenger.auth.UnauthorizedException; import org.jivesoftware.messenger.auth.UnauthorizedException;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -52,10 +54,20 @@ public class IQDiscoInfoHandler extends IQHandler { ...@@ -52,10 +54,20 @@ public class IQDiscoInfoHandler extends IQHandler {
private List serverFeatures = new ArrayList(); private List serverFeatures = new ArrayList();
private IQHandlerInfo info; private IQHandlerInfo info;
private List userIdentities = new ArrayList();
private List userFeatures = new ArrayList();
public IQDiscoInfoHandler() { public IQDiscoInfoHandler() {
super("XMPP Disco Info Handler"); super("XMPP Disco Info Handler");
info = new IQHandlerInfo("query", "http://jabber.org/protocol/disco#info"); info = new IQHandlerInfo("query", "http://jabber.org/protocol/disco#info");
serverFeatures.add("http://jabber.org/protocol/disco#info"); serverFeatures.add("http://jabber.org/protocol/disco#info");
// Initialize the user identity and features collections (optimization to avoid creating
// the same objects for each response)
Element userIdentity = DocumentHelper.createElement("identity");
userIdentity.addAttribute("category", "account");
userIdentity.addAttribute("type", "registered");
userIdentities.add(userIdentity);
userFeatures.add("http://jabber.org/protocol/disco#info");
} }
public IQHandlerInfo getInfo() { public IQHandlerInfo getInfo() {
...@@ -199,26 +211,48 @@ public class IQDiscoInfoHandler extends IQHandler { ...@@ -199,26 +211,48 @@ public class IQDiscoInfoHandler extends IQHandler {
ArrayList features = new ArrayList(); ArrayList features = new ArrayList();
public Iterator getIdentities(String name, String node, JID senderJID) { public Iterator getIdentities(String name, String node, JID senderJID) {
synchronized (identities) { if (name == null) {
if (identities.isEmpty()) { // Answer identity of the server
Element identity = DocumentHelper.createElement("identity"); synchronized (identities) {
identity.addAttribute("category", "services"); if (identities.isEmpty()) {
identity.addAttribute("name", "Messenger Server"); Element identity = DocumentHelper.createElement("identity");
identity.addAttribute("type", "jabber"); identity.addAttribute("category", "services");
identity.addAttribute("name", "Messenger Server");
identities.add(identity); identity.addAttribute("type", "jabber");
identities.add(identity);
}
} }
return identities.iterator();
}
else {
// Answer identity of a registered user.
// Note: We know that this user exists because #hasInfo returned true
return userIdentities.iterator();
} }
return identities.iterator();
} }
public Iterator getFeatures(String name, String node, JID senderJID) { public Iterator getFeatures(String name, String node, JID senderJID) {
return serverFeatures.iterator(); if (name == null) {
// Answer features of the server
return serverFeatures.iterator();
}
else {
// Answer features of the user
return userFeatures.iterator();
}
} }
public boolean hasInfo(String name, String node, JID senderJID) public boolean hasInfo(String name, String node, JID senderJID) {
throws UnauthorizedException { try {
return name == null && node == null; // True if it is an info request of the server or of a registered user. We
// now support disco of user's bare JIDs
return node == null &&
(name == null || UserManager.getInstance().getUser(name) != null);
}
catch (UserNotFoundException e) {
return false;
}
} }
public XDataFormImpl getExtendedInfo(String name, String node, JID senderJID) { public XDataFormImpl getExtendedInfo(String name, String node, JID senderJID) {
......
...@@ -11,15 +11,19 @@ ...@@ -11,15 +11,19 @@
package org.jivesoftware.messenger.disco; package org.jivesoftware.messenger.disco;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.dom4j.DocumentHelper; import org.dom4j.DocumentHelper;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.QName; import org.dom4j.QName;
import org.jivesoftware.messenger.IQHandlerInfo; import org.jivesoftware.messenger.IQHandlerInfo;
import org.jivesoftware.messenger.XMPPServer; import org.jivesoftware.messenger.XMPPServer;
import org.jivesoftware.messenger.SessionManager;
import org.jivesoftware.messenger.Session;
import org.jivesoftware.messenger.roster.RosterItem;
import org.jivesoftware.messenger.user.UserManager;
import org.jivesoftware.messenger.user.User;
import org.jivesoftware.messenger.user.UserNotFoundException;
import org.jivesoftware.messenger.handler.IQHandler; import org.jivesoftware.messenger.handler.IQHandler;
import org.jivesoftware.messenger.auth.UnauthorizedException; import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.xmpp.packet.IQ; import org.xmpp.packet.IQ;
...@@ -245,7 +249,30 @@ public class IQDiscoItemsHandler extends IQHandler implements ServerFeaturesProv ...@@ -245,7 +249,30 @@ public class IQDiscoItemsHandler extends IQHandler implements ServerFeaturesProv
private DiscoItemsProvider getServerItemsProvider() { private DiscoItemsProvider getServerItemsProvider() {
DiscoItemsProvider discoItemsProvider = new DiscoItemsProvider() { DiscoItemsProvider discoItemsProvider = new DiscoItemsProvider() {
public Iterator<Element> getItems(String name, String node, JID senderJID) { public Iterator<Element> getItems(String name, String node, JID senderJID) {
return serverItems.iterator(); if (name == null) {
return serverItems.iterator();
}
else {
List<Element> answer = new ArrayList<Element>();
try {
User user = UserManager.getInstance().getUser(name);
RosterItem item = user.getRoster().getRosterItem(senderJID);
// If the requesting entity is subscribed to the account's presence then
// answer the user's "available resources"
if (item.getSubStatus() == RosterItem.SUB_FROM ||
item.getSubStatus() == RosterItem.SUB_BOTH) {
for (Session session : SessionManager.getInstance().getSessions(name)) {
Element element = DocumentHelper.createElement("item");
element.addAttribute("jid", session.getAddress().toString());
answer.add(element);
}
}
return answer.iterator();
}
catch (UserNotFoundException e) {
return answer.iterator();
}
}
} }
}; };
return discoItemsProvider; return discoItemsProvider;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment