Commit 3dfc395c authored by Dave Cridland's avatar Dave Cridland

Use Openfire core Forwarded extension

This adds timestamp support to the Openfire core Forwarded packet extension,
and then uses this class in the MAM support. The API used by the Carbons
support in core is unchanged.
parent e586132d
...@@ -2,21 +2,42 @@ package org.jivesoftware.openfire.forward; ...@@ -2,21 +2,42 @@ package org.jivesoftware.openfire.forward;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.QName; import org.dom4j.QName;
import org.jivesoftware.util.XMPPDateTimeFormat;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message; import org.xmpp.packet.Message;
import org.xmpp.packet.PacketExtension; import org.xmpp.packet.PacketExtension;
import java.util.Date;
/** /**
* @author Christian Schudt * @author Christian Schudt
*/ */
public class Forwarded extends PacketExtension { public class Forwarded extends PacketExtension {
public Forwarded(Element copy, Date delay, JID delayFrom) {
super("forwarded", "urn:xmpp:forward:0");
populate(copy, delay, delayFrom);
}
public Forwarded(Message message, Date delay, JID delayFrom) {
super("forwarded", "urn:xmpp:forward:0");
Message copy = message.createCopy();
populate(copy.getElement(), delay, delayFrom);
}
public Forwarded(Element copy) {
super("forwarded", "urn:xmpp:forward:0");
populate(copy, null, null);
}
public Forwarded(Message message) { public Forwarded(Message message) {
super("forwarded", "urn:xmpp:forward:0"); super("forwarded", "urn:xmpp:forward:0");
Message copy = message.createCopy(); Message copy = message.createCopy();
populate(copy.getElement(), null, null);
}
private void populate(Element copy, Date delay, JID delayFrom) {
copy.getElement().setQName(QName.get("message", "jabber:client")); copy.setQName(QName.get("message", "jabber:client"));
for (Object element : copy.getElement().elements()) { for (Object element : copy.elements()) {
if (element instanceof Element) { if (element instanceof Element) {
Element el = (Element) element; Element el = (Element) element;
// Only set the "jabber:client" namespace if the namespace is empty (otherwise the resulting xml would look like <body xmlns=""/>) // Only set the "jabber:client" namespace if the namespace is empty (otherwise the resulting xml would look like <body xmlns=""/>)
...@@ -25,6 +46,15 @@ public class Forwarded extends PacketExtension { ...@@ -25,6 +46,15 @@ public class Forwarded extends PacketExtension {
} }
} }
} }
element.add(copy.getElement()); if (delay != null) {
Element delayInfo = element.addElement("delay", "urn:xmpp:delay");
delayInfo.addAttribute("stamp", XMPPDateTimeFormat.format(delay));
if (delayFrom != null) {
// Set the Full JID as the "from" attribute
delayInfo.addAttribute("from", delayFrom.toString());
}
element.add(delayInfo);
}
element.add(copy);
} }
} }
...@@ -9,6 +9,7 @@ import java.util.Iterator; ...@@ -9,6 +9,7 @@ import java.util.Iterator;
import org.dom4j.*; import org.dom4j.*;
import org.jivesoftware.openfire.auth.UnauthorizedException; import org.jivesoftware.openfire.auth.UnauthorizedException;
import org.jivesoftware.openfire.disco.ServerFeaturesProvider; import org.jivesoftware.openfire.disco.ServerFeaturesProvider;
import org.jivesoftware.openfire.forward.Forwarded;
import org.jivesoftware.openfire.handler.IQHandler; import org.jivesoftware.openfire.handler.IQHandler;
import org.jivesoftware.openfire.session.LocalClientSession; import org.jivesoftware.openfire.session.LocalClientSession;
import org.jivesoftware.util.XMPPDateTimeFormat; import org.jivesoftware.util.XMPPDateTimeFormat;
...@@ -16,10 +17,7 @@ import org.slf4j.Logger; ...@@ -16,10 +17,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xmpp.forms.DataForm; import org.xmpp.forms.DataForm;
import org.xmpp.forms.FormField; import org.xmpp.forms.FormField;
import org.xmpp.packet.IQ; import org.xmpp.packet.*;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.PacketError;
import com.reucon.openfire.plugin.archive.model.ArchivedMessage; import com.reucon.openfire.plugin.archive.model.ArchivedMessage;
import com.reucon.openfire.plugin.archive.xep.AbstractIQHandler; import com.reucon.openfire.plugin.archive.xep.AbstractIQHandler;
...@@ -212,34 +210,21 @@ abstract class IQQueryHandler extends AbstractIQHandler implements ...@@ -212,34 +210,21 @@ abstract class IQQueryHandler extends AbstractIQHandler implements
Message messagePacket = new Message(); Message messagePacket = new Message();
messagePacket.setTo(session.getAddress()); messagePacket.setTo(session.getAddress());
Forwarded fwd;
Element result = messagePacket.addChildElement("result", NAMESPACE);
result.addAttribute("id", archivedMessage.getId().toString());
if(queryRequest.getQueryid() != null) {
result.addAttribute("queryid", queryRequest.getQueryid());
}
Element forwarded = result.addElement("forwarded", "urn:xmpp:forward:0");
Element delay = forwarded.addElement("delay", "urn:xmpp:delay");
delay.addAttribute("stamp", XMPPDateTimeFormat.format(archivedMessage.getTime()));
Document stanza; Document stanza;
try { try {
stanza = DocumentHelper.parseText(archivedMessage.getStanza()); stanza = DocumentHelper.parseText(archivedMessage.getStanza());
if ( stanza.getRootElement().getNamespaceURI() == null || stanza.getRootElement().getNamespaceURI().isEmpty() ) fwd = new Forwarded(stanza.getRootElement(), archivedMessage.getTime(), null);
{
// OF-1132: If no 'xmlns' is set for the stanza then as per XML namespacing rules it would inherit the
// 'urn:xmpp:forward:0' namespace, which is wrong (see XEP-0297).
stanza.getRootElement().setQName( QName.get( stanza.getRootElement().getName(), "jabber:client") );
}
forwarded.add(stanza.getRootElement());
} catch (DocumentException e) { } catch (DocumentException e) {
Log.error("Failed to parse message stanza.", e); Log.error("Failed to parse message stanza.", e);
// If we can't parse stanza then we have no message to send to client, abort // If we can't parse stanza then we have no message to send to client, abort
return; return;
} }
if (fwd == null) return; // Shouldn't be possible.
messagePacket.addExtension(new Result(fwd, NAMESPACE, queryRequest.getQueryid(), archivedMessage.getId().toString()));
session.process(messagePacket); session.process(messagePacket);
} }
......
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