Skip to content

Commit 9ea2644

Browse files
committed
Merge pull request #126 from surevine/issue-91
Do not map non-IQ or iq[type=error] and iq[type=result] packets
2 parents 5eb18cc + 723dad6 commit 9ea2644

2 files changed

Lines changed: 178 additions & 68 deletions

File tree

src/main/java/org/buddycloud/channelserver/queue/FederatedQueueManager.java

Lines changed: 86 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class FederatedQueueManager {
3737
public static final String IDENTITY_TYPE_CHANNELS = "channels";
3838
public static final String BUDDYCLOUD_SERVER = "buddycloud-server";
3939

40-
public static final String SRV_PREFIX = "_buddycloud-server._tcp.";
40+
public static final String SRV_PREFIX = "_buddycloud-server._tcp.";
4141

4242
private int id = 1;
4343

@@ -71,13 +71,18 @@ private int getId() {
7171

7272
public void process(Packet packet) throws ComponentException {
7373

74-
logger.debug("Packet payload " + packet.toXML() + " going to federation.");
74+
logger.debug("Packet payload " + packet.toXML()
75+
+ " going to federation.");
7576

7677
String to = packet.getTo().toString();
78+
String uniqueId = packet.getID();
79+
80+
if (true == performIdMapping(packet)) {
7781

78-
String uniqueId = generateUniqueId(packet);
79-
idMap.put(uniqueId, packet.getID());
80-
packet.setID(uniqueId);
82+
uniqueId = generateUniqueId(packet);
83+
idMap.put(uniqueId, packet.getID());
84+
packet.setID(uniqueId);
85+
}
8186

8287
sentRemotePackets.put(uniqueId, packet.getFrom());
8388
try {
@@ -108,22 +113,32 @@ public void process(Packet packet) throws ComponentException {
108113
waitingStanzas.get(to).add(packet);
109114
logger.debug("Adding packet to waiting stanza list for " + to
110115
+ " (size " + waitingStanzas.get(to).size() + ")");
111-
attemptDnsDiscovery(to);
116+
attemptDnsDiscovery(to);
112117
} catch (Exception e) {
113118
logger.error(e);
114119
}
115120
}
116121

122+
private boolean performIdMapping(Packet packet) {
123+
if (false == packet.getElement().getName().equals("iq")) {
124+
return false;
125+
}
126+
IQ iq = (IQ) packet;
127+
if ((true == iq.getType().equals(IQ.Type.result))
128+
|| (true == iq.getType().equals(IQ.Type.error))) {
129+
return false;
130+
}
131+
return true;
132+
}
133+
117134
private void extractNodeDetails(Packet packet) {
118135
try {
119136
String packetXml = packet.toXML();
120137
if (!packetXml.contains("node=")) {
121138
return;
122139
}
123-
nodeMap.put(
124-
packet.getID(),
125-
packetXml.split("node=\"")[1].split("\"")[0]
126-
);
140+
nodeMap.put(packet.getID(),
141+
packetXml.split("node=\"")[1].split("\"")[0]);
127142
} catch (NullPointerException e) {
128143
logger.info("No node details found in federated packet");
129144
logger.error(e);
@@ -155,8 +170,7 @@ public void processDiscoItemsResponse(JID from, List<Element> items)
155170

156171
for (Element item : items) {
157172
Attribute name = item.attribute("name");
158-
if (name != null
159-
&& name.getStringValue().equals(BUDDYCLOUD_SERVER)) {
173+
if (name != null && name.getStringValue().equals(BUDDYCLOUD_SERVER)) {
160174
remoteChannelDiscoveryStatus.put(from.toString(), DISCOVERED);
161175
setDiscoveredServer(from.toString(), item.attributeValue("jid"));
162176
sendFederatedRequests(from.toString());
@@ -210,50 +224,54 @@ public void processDiscoInfoResponse(JID from, String id,
210224

211225
if (remoteServerItemsToProcess.get(originatingServer) < 1) {
212226
if (!discoveredServers.containsKey(originatingServer)) {
213-
sendRemoteChannelServerNotFoundErrorResponses(originatingServer);
214-
remoteChannelDiscoveryStatus.put(originatingServer,
215-
NO_CHANNEL_SERVER);
216-
waitingStanzas.remove(originatingServer);
227+
sendRemoteChannelServerNotFoundErrorResponses(originatingServer);
228+
remoteChannelDiscoveryStatus.put(originatingServer,
229+
NO_CHANNEL_SERVER);
230+
waitingStanzas.remove(originatingServer);
217231
} else {
218232
remoteChannelDiscoveryStatus.put(originatingServer, DISCOVERED);
219233
}
220234
}
221235
}
222236

223-
private boolean attemptDnsDiscovery(String originatingServer) throws ComponentException {
224-
try {
225-
String query = SRV_PREFIX + originatingServer;
226-
Record[] records = new Lookup(query, Type.SRV).run();
227-
if ((null == records) || (0 == records.length)) {
228-
logger.debug("No appropriate DNS entry found for " + originatingServer);
229-
return false;
230-
}
231-
SRVRecord record = (SRVRecord) records[0];
232-
String targetServer = record.getTarget().toString(true);
233-
setDiscoveredServer(originatingServer, targetServer);
234-
logger.info("DNS discovery complete for buddycloud server @ "
235-
+ originatingServer + " (" + targetServer + ")");
236-
remoteChannelDiscoveryStatus.put(originatingServer, DISCOVERED);
237-
sendFederatedRequests(originatingServer);
238-
return true;
239-
} catch (TextParseException e) {
240-
logger.error(e);
241-
return false;
242-
}
243-
}
237+
private boolean attemptDnsDiscovery(String originatingServer)
238+
throws ComponentException {
239+
try {
240+
String query = SRV_PREFIX + originatingServer;
241+
Record[] records = new Lookup(query, Type.SRV).run();
242+
if ((null == records) || (0 == records.length)) {
243+
logger.debug("No appropriate DNS entry found for "
244+
+ originatingServer);
245+
return false;
246+
}
247+
SRVRecord record = (SRVRecord) records[0];
248+
String targetServer = record.getTarget().toString(true);
249+
setDiscoveredServer(originatingServer, targetServer);
250+
logger.info("DNS discovery complete for buddycloud server @ "
251+
+ originatingServer + " (" + targetServer + ")");
252+
remoteChannelDiscoveryStatus.put(originatingServer, DISCOVERED);
253+
sendFederatedRequests(originatingServer);
254+
return true;
255+
} catch (TextParseException e) {
256+
logger.error(e);
257+
return false;
258+
}
259+
}
244260

245261
private void sendFederatedRequests(String originatingServer)
246262
throws ComponentException {
247263
String remoteServer = discoveredServers.get(originatingServer);
248264
List<Packet> packetsToSend = waitingStanzas.get(originatingServer);
249265
if (packetsToSend == null) {
250-
logger.trace("No queued federated packets to send to " + originatingServer);
266+
logger.trace("No queued federated packets to send to "
267+
+ originatingServer);
251268
return;
252269
}
253-
logger.trace("Catching up on federated packet sending to " + originatingServer);
270+
logger.trace("Catching up on federated packet sending to "
271+
+ originatingServer);
254272
for (Packet packet : packetsToSend) {
255273
packet.setTo(remoteServer);
256-
logger.trace(packet.toString());
274+
logger.trace(packet.toString());
257275
sendPacket(packet.createCopy());
258276
}
259277
waitingStanzas.remove(originatingServer);
@@ -294,9 +312,11 @@ public void passResponseToRequester(IQ packet) throws Exception {
294312
+ packet.getID() + ")");
295313
}
296314

297-
if (packet.getType().equals(IQ.Type.error) && !remoteChannelDiscoveryStatus.get(packet.getFrom()).equals(DISCOVERED)) {
298-
return;
299-
}
315+
if (packet.getType().equals(IQ.Type.error)
316+
&& !remoteChannelDiscoveryStatus.get(packet.getFrom()).equals(
317+
DISCOVERED)) {
318+
return;
319+
}
300320

301321
String uniqueId = packet.getID();
302322
packet.setID(idMap.get(uniqueId));
@@ -330,10 +350,10 @@ public void addChannelMap(JID server) {
330350

331351
/**
332352
* Generate a unique ID for a packet
333-
*
353+
*
334354
* Supplied packet IDs might not be unique so we use the ID and the FROM
335355
* values to create a hash which we map back to the original packet ID.
336-
*
356+
*
337357
* @param packet
338358
* @return unique ID for the packet
339359
*/
@@ -343,30 +363,31 @@ private String generateUniqueId(Packet packet) {
343363

344364
/**
345365
* Generates an MD5 hash of a supplied String
346-
*
347-
* @param message to encode
366+
*
367+
* @param message
368+
* to encode
348369
* @return MD5 Hash of supplied string
349370
*/
350-
private String generateMd5(String message) {
351-
String digest = null;
352-
try {
353-
MessageDigest md = MessageDigest.getInstance("MD5");
354-
byte[] hash = md.digest(message.getBytes("UTF-8"));
355-
356-
//converting byte array to Hexadecimal String
357-
StringBuilder sb = new StringBuilder(2*hash.length);
358-
for(byte b : hash) {
359-
sb.append(String.format("%02x", b&0xff));
360-
}
361-
362-
digest = sb.toString();
363-
} catch (UnsupportedEncodingException e) {
371+
private String generateMd5(String message) {
372+
String digest = null;
373+
try {
374+
MessageDigest md = MessageDigest.getInstance("MD5");
375+
byte[] hash = md.digest(message.getBytes("UTF-8"));
376+
377+
// converting byte array to Hexadecimal String
378+
StringBuilder sb = new StringBuilder(2 * hash.length);
379+
for (byte b : hash) {
380+
sb.append(String.format("%02x", b & 0xff));
381+
}
382+
383+
digest = sb.toString();
384+
} catch (UnsupportedEncodingException e) {
364385
logger.info("Error generating unique packet ID");
365386
logger.error(e);
366-
} catch (NoSuchAlgorithmException e) {
387+
} catch (NoSuchAlgorithmException e) {
367388
logger.info("Error generating unique packet ID");
368389
logger.error(e);
369-
}
370-
return digest;
371-
}
390+
}
391+
return digest;
392+
}
372393
}

src/test/java/org/buddycloud/channelserver/queue/FederatedQueueManagerTest.java

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.mockito.Mockito;
1818
import org.xmpp.packet.IQ;
1919
import org.xmpp.packet.JID;
20+
import org.xmpp.packet.Message;
2021
import org.xmpp.packet.Packet;
2122
import org.xmpp.packet.PacketError;
2223
import org.buddycloud.channelserver.channel.ChannelsEngineMock;
@@ -183,9 +184,6 @@ public void testOutgoingFederatedPacketsAreRoutedBackToOriginalSender() throws E
183184
Assert.assertEquals(1, channelsEngine.size());
184185
Packet redirected = channelsEngine.poll();
185186

186-
System.out.println(packet);
187-
System.out.println(redirected);
188-
189187
Assert.assertEquals(packet.getFrom(), redirected.getTo());
190188
}
191189

@@ -229,4 +227,95 @@ public void testOutgoingFederatedPacketsFromDifferentClientsUsingSameIdAreRouted
229227
Assert.assertEquals(clientOnePacket.getFrom(), clientOneRedirected.getTo());
230228
Assert.assertEquals(clientTwoPacket.getFrom(), clientTwoRedirected.getTo());
231229
}
230+
231+
@Test
232+
public void testOutgoingIqPacketsGetIdMapped() throws Exception {
233+
channelsEngine.clear();
234+
235+
String originalId = "id:12345";
236+
IQ packet = new IQ();
237+
packet.setFrom(new JID("romeo@montague.lit/street"));
238+
packet.setTo(new JID("topics.capulet.lit"));
239+
packet.setType(IQ.Type.get);
240+
packet.setID(originalId);
241+
packet.getElement().addAttribute("remote-server-discover", "false");
242+
243+
queueManager.addChannelMap(new JID("topics.capulet.lit"));
244+
245+
queueManager.process(packet.createCopy());
246+
247+
IQ packetExternal = (IQ) channelsEngine.poll();
248+
249+
Assert.assertFalse(originalId.equals(packetExternal.getID()));
250+
251+
IQ response = IQ.createResultIQ(packetExternal);
252+
queueManager.passResponseToRequester(response);
253+
254+
IQ packetInternal = (IQ) channelsEngine.poll();
255+
256+
Assert.assertTrue(originalId.equals(packetInternal.getID()));
257+
}
258+
259+
@Test
260+
public void testNonIqPacketsDoNotGetIdMapped() throws Exception {
261+
channelsEngine.clear();
262+
263+
String originalId = "id:12345";
264+
Message packet = new Message();
265+
packet.setFrom(new JID("romeo@montague.lit/street"));
266+
packet.setTo(new JID("topics.capulet.lit"));
267+
packet.getElement().addAttribute("remote-server-discover", "false");
268+
packet.setID(originalId);
269+
270+
queueManager.addChannelMap(new JID("topics.capulet.lit"));
271+
272+
queueManager.process(packet.createCopy());
273+
274+
Message packetExternal = (Message) channelsEngine.poll();
275+
276+
Assert.assertTrue(originalId.equals(packetExternal.getID()));
277+
}
278+
279+
@Test
280+
public void testIqResultPacketsDontGetIdMapped() throws Exception {
281+
channelsEngine.clear();
282+
283+
String originalId = "id:12345";
284+
IQ packet = new IQ();
285+
packet.setFrom(new JID("romeo@montague.lit/street"));
286+
packet.setTo(new JID("topics.capulet.lit"));
287+
packet.setType(IQ.Type.result);
288+
packet.setID(originalId);
289+
packet.getElement().addAttribute("remote-server-discover", "false");
290+
291+
queueManager.addChannelMap(new JID("topics.capulet.lit"));
292+
293+
queueManager.process(packet.createCopy());
294+
295+
IQ packetExternal = (IQ) channelsEngine.poll();
296+
297+
Assert.assertTrue(originalId.equals(packetExternal.getID()));
298+
}
299+
300+
301+
@Test
302+
public void testIqErrorPacketsDontGetIdMapped() throws Exception {
303+
channelsEngine.clear();
304+
305+
String originalId = "id:12345";
306+
IQ packet = new IQ();
307+
packet.setFrom(new JID("romeo@montague.lit/street"));
308+
packet.setTo(new JID("topics.capulet.lit"));
309+
packet.setType(IQ.Type.error);
310+
packet.setID(originalId);
311+
packet.getElement().addAttribute("remote-server-discover", "false");
312+
313+
queueManager.addChannelMap(new JID("topics.capulet.lit"));
314+
315+
queueManager.process(packet.createCopy());
316+
317+
IQ packetExternal = (IQ) channelsEngine.poll();
318+
319+
Assert.assertTrue(originalId.equals(packetExternal.getID()));
320+
}
232321
}

0 commit comments

Comments
 (0)