Commit 6122b0a5 authored by Matt Tucker's avatar Matt Tucker Committed by matt

Refactoring work.


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@577 b35dd754-fafc-0310-a699-88a17e54d16e
parent 9d75aa0f
......@@ -12,11 +12,8 @@
package org.jivesoftware.messenger.forms.spi;
import org.jivesoftware.messenger.forms.FormField;
import org.jivesoftware.util.ConcurrentHashSet;
import java.util.*;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;
......@@ -54,7 +51,6 @@ public class XDataFormImpl {
private List fields = new ArrayList();
private List reportedFields = new ArrayList();
private List reportedItems = new ArrayList();
private Set fragments = new ConcurrentHashSet();
public XDataFormImpl() {
super();
......@@ -156,70 +152,6 @@ public class XDataFormImpl {
// Do nothing
}
public void send(XMLStreamWriter xmlSerializer, int version) throws XMLStreamException {
xmlSerializer.writeStartElement("jabber:x:data", "x");
xmlSerializer.writeNamespace("", "jabber:x:data");
if (getType() != null) {
xmlSerializer.writeAttribute("type", getType());
}
if (getTitle() != null) {
xmlSerializer.writeStartElement("jabber:x:data", "title");
xmlSerializer.writeCharacters(getTitle());
xmlSerializer.writeEndElement();
}
if (instructions.size() > 0) {
Iterator instrItr = getInstructions();
while (instrItr.hasNext()) {
xmlSerializer.writeStartElement("jabber:x:data", "instructions");
xmlSerializer.writeCharacters((String)instrItr.next());
xmlSerializer.writeEndElement();
}
}
// Append the list of fields returned from a search
if (reportedFields.size() > 0) {
xmlSerializer.writeStartElement("jabber:x:data", "reported");
Iterator fieldsItr = reportedFields.iterator();
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
field.send(xmlSerializer, version);
}
xmlSerializer.writeEndElement();
}
// Append the list of items returned from a search
// Note: each item contains a List of XFormFieldImpls
if (reportedItems.size() > 0) {
xmlSerializer.writeStartElement("jabber:x:data", "item");
Iterator itemsItr = reportedItems.iterator();
while (itemsItr.hasNext()) {
List fields = (List)itemsItr.next();
Iterator fieldsItr = fields.iterator();
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
field.send(xmlSerializer, version);
}
}
xmlSerializer.writeEndElement();
}
if (fields.size() > 0) {
Iterator fieldsItr = getFields();
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
field.send(xmlSerializer, version);
}
}
// Loop through all the values and append them to the stream writer
Iterator frags = fragments.iterator();
while (frags.hasNext()) {
XMPPFragment frag = (XMPPFragment)frags.next();
frag.send(xmlSerializer, version);
}
xmlSerializer.writeEndElement();
}
public Element asXMLElement() {
Element x = DocumentHelper.createElement(QName.get("x", "jabber:x:data"));
if (getType() != null) {
......@@ -267,64 +199,9 @@ public class XDataFormImpl {
}
}
// Loop through all the values and append them to the stream writer
/*Iterator frags = fragments.iterator();
while (frags.hasNext()){
XMPPFragment frag = (XMPPFragment) frags.next();
frag.send(xmlSerializer,version);
}*/
return x;
}
public XMPPFragment createDeepCopy() {
XDataFormImpl copy = new XDataFormImpl(type);
copy.title = this.title;
copy.instructions = (List)((ArrayList)this.instructions).clone();
Iterator fieldsIter = getFields();
while (fieldsIter.hasNext()) {
copy.addField((XFormFieldImpl) ((XFormFieldImpl) fieldsIter.next()).createDeepCopy());
}
Iterator fragmentIter = getFragments();
while (fragmentIter.hasNext()) {
copy.addFragment(((XMPPFragment)fragmentIter.next()).createDeepCopy());
}
return copy;
}
public void addFragment(XMPPFragment fragment) {
fragments.add(fragment);
}
public Iterator getFragments() {
return fragments.iterator();
}
public XMPPFragment getFragment(String name, String namespace) {
if (fragments == null) {
return null;
}
XMPPFragment frag;
for (Iterator frags = fragments.iterator(); frags.hasNext();) {
frag = (XMPPFragment)frags.next();
if (name.equals(frag.getName()) && namespace.equals(frag.getNamespace())) {
return frag;
}
}
return null;
}
public void clearFragments() {
fragments.clear();
}
public int getSize() {
// TODO Is this OK? Shouldn't we need to consider the instance variables?
return fragments.size();
}
public void parse(Element formElement) {
type = formElement.attributeValue("type");
Element titleElement = formElement.element("title");
......
......@@ -12,8 +12,6 @@
package org.jivesoftware.messenger.forms.spi;
import org.jivesoftware.messenger.forms.FormField;
import org.jivesoftware.util.ConcurrentHashSet;
import org.jivesoftware.messenger.XMPPFragment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
......@@ -29,7 +27,7 @@ import org.dom4j.Element;
*
* @author gdombiak
*/
public class XFormFieldImpl implements XMPPFragment, FormField {
public class XFormFieldImpl implements FormField {
private String description;
private boolean required = false;
......@@ -38,7 +36,6 @@ public class XFormFieldImpl implements XMPPFragment, FormField {
private String type;
private List<Option> options = new ArrayList<Option>();
private List<String> values = new ArrayList<String>();
private ConcurrentHashSet fragments = new ConcurrentHashSet();
public XFormFieldImpl() {
super();
......@@ -68,50 +65,6 @@ public class XFormFieldImpl implements XMPPFragment, FormField {
// Do nothing
}
public void send(XMLStreamWriter xmlSerializer, int version) throws XMLStreamException {
xmlSerializer.writeStartElement("jabber:x:data", "field");
if (getLabel() != null) {
xmlSerializer.writeAttribute("label", getLabel());
}
if (getVariable() != null) {
xmlSerializer.writeAttribute("var", getVariable());
}
if (getType() != null) {
xmlSerializer.writeAttribute("type", getType());
}
if (getDescription() != null) {
xmlSerializer.writeStartElement("jabber:x:data", "desc");
xmlSerializer.writeCharacters(getDescription());
xmlSerializer.writeEndElement();
}
if (isRequired()) {
xmlSerializer.writeStartElement("jabber:x:data", "required");
xmlSerializer.writeEndElement();
}
// Loop through all the values and append them to the stream writer
if (values.size() > 0) {
Iterator<String> valuesItr = getValues();
while (valuesItr.hasNext()) {
xmlSerializer.writeStartElement("jabber:x:data", "value");
xmlSerializer.writeCharacters(valuesItr.next());
xmlSerializer.writeEndElement();
}
}
// Loop through all the options and append them to the stream writer
if (options.size() > 0) {
Iterator<Option> optionsItr = getOptions();
while (optionsItr.hasNext()) {
(optionsItr.next()).send(xmlSerializer, version);
}
}
Iterator frags = fragments.iterator();
while (frags.hasNext()) {
XMPPFragment frag = (XMPPFragment)frags.next();
frag.send(xmlSerializer, version);
}
xmlSerializer.writeEndElement();
}
public Element asXMLElement() {
Element field = DocumentHelper.createElement("field");
if (getLabel() != null) {
......@@ -155,53 +108,6 @@ public class XFormFieldImpl implements XMPPFragment, FormField {
return field;
}
public XMPPFragment createDeepCopy() {
XFormFieldImpl copy = new XFormFieldImpl(variable);
copy.description = this.description;
copy.required = this.required;
copy.label = this.label;
copy.type = this.type;
copy.options = (List<Option>)((ArrayList)this.options).clone();
copy.values = (List<String>)((ArrayList)this.values).clone();
Iterator fragmentIter = getFragments();
while (fragmentIter.hasNext()) {
copy.addFragment(((XMPPFragment)fragmentIter.next()).createDeepCopy());
}
return copy;
}
public void addFragment(XMPPFragment fragment) {
fragments.add(fragment);
}
public Iterator getFragments() {
return fragments.iterator();
}
public XMPPFragment getFragment(String name, String namespace) {
if (fragments == null) {
return null;
}
XMPPFragment frag;
for (Iterator frags = fragments.iterator(); frags.hasNext();) {
frag = (XMPPFragment)frags.next();
if (name.equals(frag.getName()) && namespace.equals(frag.getNamespace())) {
return frag;
}
}
return null;
}
public void clearFragments() {
fragments.clear();
}
public int getSize() {
// TODO Is this OK? Shouldn't we need to consider the instance variables?
return fragments.size();
}
public void addValue(String value) {
if (value == null) {
value = "";
......@@ -362,4 +268,4 @@ public class XFormFieldImpl implements XMPPFragment, FormField {
return option;
}
}
}
}
\ No newline at end of file
......@@ -25,36 +25,34 @@ import java.util.List;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.PacketError;
/**
* Implements the TYPE_IQ jabber:iq:auth protocol (plain only). Clients
* use this protocol to authenticate with the server.
* A 'get' query runs an authentication probe with a given user name.
* Return the authentication form or an error indicating the user
* is not registered on the server.
* use this protocol to authenticate with the server. A 'get' query
* runs an authentication probe with a given user name. Return the
* authentication form or an error indicating the user is not
* registered on the server.<p>
*
* A 'set' query authenticates with information given in the
* authentication form. An authenticated session may reset their
* authentication information using a 'set' query.
* <p/>
*
* <h2>Assumptions</h2>
* This handler assumes that the request is addressed to the server.
* An appropriate TYPE_IQ tag matcher should be placed in front of this
* one to route TYPE_IQ requests not addressed to the server to
* another channel (probably for direct delivery to the recipient).
* <p/>
* <h2>Warning</h2>
* There should be a way of determining whether a session has
* authorization to access this feature. I'm not sure it is a good
* idea to do authorization in each handler. It would be nice if
* the framework could assert authorization policies across channels.
*
* @author Iain Shigeoka
*/
public class IQAuthHandler extends IQHandler implements IQAuthInfo {
private Element probeResponse;
// TODO: this won't work with independent servers in the same JVM
private static boolean anonymousAllowed;
private Element probeResponse;
private IQHandlerInfo info;
/**
......@@ -76,29 +74,27 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
anonymousAllowed = "true".equals(JiveGlobals.getProperty("xmpp.auth.anonymous"));
}
public synchronized IQ handleIQ(IQ packet) throws
UnauthorizedException, PacketException {
public synchronized IQ handleIQ(IQ packet) throws UnauthorizedException, PacketException {
try {
Session session = packet.getOriginatingSession();
IQ response = null;
try {
Element iq = ((XMPPDOMFragment)packet.getChildFragment()).getRootElement();
Element iq = packet.getElement();
if (IQ.GET == packet.getType()) {
if (IQ.Type.get == packet.getType()) {
String username = iq.element("username").getTextTrim();
probeResponse.element("username").setText(username);
response = packet.createResult(probeResponse);
response = IQ.createResultIQ(new IQ(probeResponse));
}
else { // set query
// Otherwise set query
else {
if (iq.elements().isEmpty()) {
// Anonymous authentication
response = anonymousLogin(session, packet);
}
else {
String username = iq.element("username").getTextTrim();
// login authentication
// Login authentication
String password = null;
if (iq.element("password") != null) {
password = iq.element("password").getTextTrim();
......@@ -120,12 +116,12 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
}
}
catch (UserNotFoundException e) {
response = packet.createResult();
response.setError(XMPPError.Code.UNAUTHORIZED);
response = IQ.createResultIQ(packet);
response.setError(PacketError.Condition.not_authorized);
}
catch (UnauthorizedException e) {
response = packet.createResult();
response.setError(XMPPError.Code.UNAUTHORIZED);
response = IQ.createResultIQ(packet);
response.setError(PacketError.Condition.not_authorized);
}
deliverer.deliver(response);
}
......@@ -135,15 +131,10 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
return null;
}
private IQ login(String username,
Element iq,
IQ packet,
IQ response,
String password,
Session session,
String digest)
throws UnauthorizedException, UserNotFoundException {
XMPPAddress jid = localServer.createJID(username, iq.element("resource").getTextTrim());
private IQ login(String username, Element iq, IQ packet, IQ response, String password,
Session session, String digest) throws UnauthorizedException, UserNotFoundException
{
JID jid = localServer.createJID(username, iq.element("resource").getTextTrim());
// If a session already exists with the requested JID, then check to see
......@@ -161,8 +152,8 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
}
}
else {
response = packet.createResult();
response.setError(XMPPError.Code.FORBIDDEN);
response = IQ.createResultIQ(packet);
response.setError(PacketError.Condition.forbidden);
}
}
catch (Exception e) {
......@@ -183,18 +174,16 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
}
else {
session.setAuthToken(token, userManager, jid.getResource());
packet.setSender(session.getAddress());
response = packet.createResult();
packet.setFrom(session.getAddress());
response = IQ.createResultIQ(packet);
}
}
return response;
}
private IQ passwordReset(String password,
IQ packet,
String username,
Session session)
throws UnauthorizedException {
private IQ passwordReset(String password, IQ packet, String username, Session session)
throws UnauthorizedException
{
IQ response;
if (password == null || password.length() == 0) {
throw new UnauthorizedException();
......@@ -202,7 +191,7 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
else {
try {
userManager.getUser(username).setPassword(password);
response = packet.createResult();
response = IQ.createResultIQ(packet);
List params = new ArrayList();
params.add(username);
params.add(session.toString());
......@@ -215,20 +204,15 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
return response;
}
private IQ anonymousLogin(Session session,
IQ packet)
throws UnauthorizedException {
IQ response;
private IQ anonymousLogin(Session session, IQ packet) throws UnauthorizedException {
IQ response = IQ.createResultIQ(packet);;
if (anonymousAllowed) {
session.setAnonymousAuth();
MetaDataFragment meta = new MetaDataFragment("jabber:iq:auth", "query");
meta.setProperty("query.resource", session.getAddress().getResource());
response = packet.createResult();
response.addFragment(meta);
Element auth = response.setChildElement("query", "jabber:iq:auth");
auth.addElement("resource").setText(session.getAddress().getResource());
}
else {
response = packet.createResult();
response.setError(XMPPError.Code.FORBIDDEN);
response.setError(PacketError.Condition.forbidden);
}
return response;
}
......@@ -257,4 +241,4 @@ public class IQAuthHandler extends IQHandler implements IQAuthInfo {
public IQHandlerInfo getInfo() {
return info;
}
}
}
\ No newline at end of file
......@@ -15,10 +15,10 @@ import org.jivesoftware.messenger.container.TrackInfo;
import org.jivesoftware.messenger.disco.ServerFeaturesProvider;
import org.jivesoftware.messenger.*;
import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.jivesoftware.messenger.user.UserNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import org.dom4j.Element;
import org.xmpp.packet.IQ;
/**
* Implements the TYPE_IQ jabber:iq:private protocol. Clients
......@@ -58,28 +58,21 @@ public class IQPrivateHandler extends IQHandler implements ServerFeaturesProvide
public IQ handleIQ(IQ packet) throws UnauthorizedException, PacketException {
IQ replyPacket = null;
try {
Element dataElement = (Element)((XMPPDOMFragment)packet.getChildFragment()).getRootElement().elementIterator().next();
if (dataElement != null) {
if (IQ.GET.equals(packet.getType())) {
replyPacket = packet.createResult();
PayloadFragment frag = new PayloadFragment("jabber:iq:private", "query");
frag.addFragment(new XMPPDOMFragment(privateStorage.get(packet.getOriginatingSession().getUsername(), dataElement)));
replyPacket.setChildFragment(frag);
}
else {
privateStorage.add(packet.getOriginatingSession().getUsername(), dataElement);
replyPacket = packet.createResult();
}
Element dataElement = packet.getChildElement();
if (dataElement != null) {
if (IQ.Type.get.equals(packet.getType())) {
replyPacket = IQ.createResultIQ(packet);
Element privateData = replyPacket.setChildElement("query", "jabber:iq:private");
privateData.add(privateStorage.get(packet.getFrom().getNode(), dataElement));
}
else {
replyPacket = packet.createResult();
PayloadFragment frag = new PayloadFragment("jabber:iq:private", "query");
replyPacket.setChildFragment(frag);
privateStorage.add(packet.getFrom().getNode(), dataElement);
replyPacket = IQ.createResultIQ(packet);
}
}
catch (UserNotFoundException e) {
throw new UnauthorizedException(e);
else {
replyPacket = IQ.createResultIQ(packet);
replyPacket.setChildElement("query", "jabber:iq:private");
}
return replyPacket;
}
......
......@@ -11,8 +11,9 @@
package org.jivesoftware.messenger.user;
import org.jivesoftware.messenger.XMPPAddress;
import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.xmpp.packet.JID;
import java.util.Iterator;
import java.util.List;
......@@ -39,7 +40,7 @@ public interface Roster {
* @param user the user object to check.
* @return true if the specified user is a member of the roster, false otherwise.
*/
public boolean isRosterItem(XMPPAddress user);
public boolean isRosterItem(JID user);
/**
* Returns an iterator of users in this roster.
......@@ -64,7 +65,7 @@ public interface Roster {
* @return The roster item associated with the user XMPPAddress
* @throws UnauthorizedException If not the user or an administrator
*/
public RosterItem getRosterItem(XMPPAddress user) throws UnauthorizedException, UserNotFoundException;
public RosterItem getRosterItem(JID user) throws UnauthorizedException, UserNotFoundException;
/**
* Create a new item to the roster. Roster items may not be created that contain the same user address
......@@ -73,7 +74,7 @@ public interface Roster {
* @param user the item to add to the roster.
* @throws UnauthorizedException if not the item or an administrator.
*/
public RosterItem createRosterItem(XMPPAddress user) throws UnauthorizedException, UserAlreadyExistsException;
public RosterItem createRosterItem(JID user) throws UnauthorizedException, UserAlreadyExistsException;
/**
* Create a new item to the roster. Roster items may not be created that contain the same user address
......@@ -85,7 +86,7 @@ public interface Roster {
* @throws UnauthorizedException if not the item or an administrator.
* @throws UserAlreadyExistsException If a roster item already exists for the given user
*/
public RosterItem createRosterItem(XMPPAddress user, String nickname, List groups) throws UnauthorizedException, UserAlreadyExistsException;
public RosterItem createRosterItem(JID user, String nickname, List groups) throws UnauthorizedException, UserAlreadyExistsException;
/**
* Create a new item to the roster based as a copy of the given item.
......@@ -114,5 +115,5 @@ public interface Roster {
* @return The roster item being removed or null if none existed
* @throws UnauthorizedException if not the user or an administrator.
*/
public RosterItem deleteRosterItem(XMPPAddress user) throws UnauthorizedException;
}
public RosterItem deleteRosterItem(JID user) throws UnauthorizedException;
}
\ No newline at end of file
......@@ -11,9 +11,9 @@
package org.jivesoftware.messenger.user;
import org.jivesoftware.messenger.XMPPAddress;
import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.jivesoftware.util.IntEnum;
import org.xmpp.packet.JID;
import java.util.List;
......@@ -163,7 +163,7 @@ public interface RosterItem {
*
* @return The address of the item
*/
public XMPPAddress getJid();
public JID getJid();
/**
* <p>Obtain the current nickname for the item.</p>
......
......@@ -12,6 +12,7 @@
package org.jivesoftware.messenger.user;
import org.jivesoftware.messenger.XMPPAddress;
import org.xmpp.packet.JID;
/**
* <p>A simple service that allows components to retrieve a roster based solely on the ID of the owner.</p>
......@@ -40,5 +41,5 @@ public interface RosterManager {
*
* @param user the user to remove his roster.
*/
void deleteRoster(XMPPAddress user);
void deleteRoster(JID user);
}
......@@ -16,7 +16,7 @@ import org.jivesoftware.util.CacheManager;
import org.jivesoftware.messenger.container.BasicModule;
import org.jivesoftware.messenger.user.*;
import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.jivesoftware.messenger.XMPPAddress;
import org.xmpp.packet.JID;
import java.util.Iterator;
......@@ -47,9 +47,9 @@ public class RosterManagerImpl extends BasicModule implements RosterManager {
return roster;
}
public void deleteRoster(XMPPAddress user) {
public void deleteRoster(JID user) {
try {
String username = user.getNamePrep();
String username = user.getNode();
// Get the roster of the deleted user
Roster roster = (Roster)CacheManager.getCache("username2roster").get(username);
if (roster == null) {
......@@ -66,7 +66,7 @@ public class RosterManagerImpl extends BasicModule implements RosterManager {
// Get the rosters that have a reference to the deleted user
RosterItemProvider rosteItemProvider = UserProviderFactory.getRosterItemProvider();
Iterator<String> usernames = rosteItemProvider.getUsernames(user.toBareStringPrep());
Iterator<String> usernames = rosteItemProvider.getUsernames(user.toBareJID());
while (usernames.hasNext()) {
username = usernames.next();
// Get the roster that has a reference to the deleted user
......
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