From 2704c19d39d838b8702da2c254d322334defce4d Mon Sep 17 00:00:00 2001 From: abmargb Date: Tue, 16 Dec 2014 09:44:58 -0300 Subject: [PATCH 01/74] Fixes #281 --- .../channelserver/db/jdbc/JDBCNodeStore.java | 28 +++++++++++++++++-- .../jdbc/dialect/Sql92NodeStoreDialect.java | 23 ++++++++++++++- .../db/jdbc/JDBCNodeStoreRecentItemsTest.java | 19 +++++++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 1806833d..67823562 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -401,7 +401,29 @@ public ResultSet getAffiliationChanges(JID user, Date startDate @Override public ResultSet getUserMemberships(JID jid) throws NodeStoreException { - return getUserMemberships(jid, false); + PreparedStatement stmt = null; + try { + stmt = conn.prepareStatement(dialect.selectUserMemberships()); + stmt.setString(1, jid.toBareJID()); + java.sql.ResultSet rs = stmt.executeQuery(); + + ArrayList result = new ArrayList(); + while (rs.next()) { + JID inviter = null; + if (null != rs.getString(6)) { + inviter = new JID(rs.getString(6)); + } + NodeMembershipImpl membership = + new NodeMembershipImpl(rs.getString(1), new JID(rs.getString(2)), new JID(rs.getString(3)), + Subscriptions.valueOf(rs.getString(4)), Affiliations.valueOf(rs.getString(5)), inviter, rs.getTimestamp(7)); + result.add(membership); + } + return new ResultSetImpl(result); + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } } @Override @@ -473,7 +495,7 @@ private static String getCollectionStatement(int collectionLength) { public ResultSet getUserMemberships(JID jid, boolean ephemeral) throws NodeStoreException { PreparedStatement stmt = null; try { - String sql = dialect.selectUserMemberships(); + String sql = dialect.selectUserMembershipsFilteredByEphemeral(); String replace = "IS NULL OR \"node_config\".\"value\" != 'true'"; if (ephemeral) { replace = "= 'true'"; @@ -1886,6 +1908,8 @@ public interface NodeStoreSQLDialect { String selectUserMemberships(); + String selectUserMembershipsFilteredByEphemeral(); + String selectUserMembershipsWithConfiguration(); String selectMembership(); diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 145a6756..22b08626 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -263,7 +263,7 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { + "ON \"subscriptions\".\"node\" = \"affiliations\".\"node\" AND \"affiliations\".\"user\" = \"subscriptions\".\"user\" " + "WHERE " + "(\"subscriptions\".\"user\" = ? AND \"subscriptions\".\"node\" = ?) " + "ORDER BY \"updated\" DESC; "; - private static final String SELECT_USER_MEMBERSHIPS = "" + "SELECT " + "CASE WHEN \"subscriptions\".\"node\" != '' " + private static final String SELECT_USER_MEMBERSHIPS_FILTERED_BY_EPHEMERAL = "" + "SELECT " + "CASE WHEN \"subscriptions\".\"node\" != '' " + "THEN \"subscriptions\".\"node\" " + "ELSE \"affiliations\".\"node\" " + "END AS \"node\"," + "CASE WHEN \"subscriptions\".\"user\" != '' " + "THEN \"subscriptions\".\"user\" " + "ELSE \"affiliations\".\"user\" " + "END AS \"user\", " + "CASE " + "WHEN \"subscriptions\".\"listener\" != '' THEN \"subscriptions\".\"listener\" " @@ -281,6 +281,22 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { + "AND (\"node_config\".\"value\" %equals%)" + "ORDER BY \"updated\" DESC; "; + private static final String SELECT_USER_MEMBERSHIPS = "" + "SELECT " + "CASE WHEN \"subscriptions\".\"node\" != '' " + + "THEN \"subscriptions\".\"node\" " + "ELSE \"affiliations\".\"node\" " + "END AS \"node\"," + "CASE WHEN \"subscriptions\".\"user\" != '' " + + "THEN \"subscriptions\".\"user\" " + "ELSE \"affiliations\".\"user\" " + "END AS \"user\", " + "CASE " + + "WHEN \"subscriptions\".\"listener\" != '' THEN \"subscriptions\".\"listener\" " + + "WHEN \"subscriptions\".\"user\" != '' THEN \"subscriptions\".\"user\" " + "ELSE \"affiliations\".\"user\" " + "END AS \"listener\", " + + "CASE WHEN \"subscriptions\".\"subscription\" != '' " + "THEN \"subscriptions\".\"subscription\" " + "ELSE 'none' " + + "END AS \"subscription\", " + "CASE WHEN \"affiliations\".\"affiliation\" != '' " + "THEN \"affiliations\".\"affiliation\" " + + "ELSE 'none' " + "END AS \"affiliation\", " + "\"subscriptions\".\"invited_by\" AS \"invited_by\"," + + "CASE WHEN \"affiliations\".\"updated\" > \"subscriptions\".\"updated\" " + "THEN \"affiliations\".\"updated\" " + + "ELSE \"subscriptions\".\"updated\" " + "END AS \"updated\" " + "FROM \"subscriptions\" " + + + "LEFT JOIN \"affiliations\" " + + "ON \"subscriptions\".\"node\" = \"affiliations\".\"node\" AND \"affiliations\".\"user\" = \"subscriptions\".\"user\" " + "WHERE " + + "(\"subscriptions\".\"user\" = ?) " + + "ORDER BY \"updated\" DESC; "; + private static final String SELECT_USER_MEMBERSHIPS_WITH_CONFIGURATION = "SELECT " + "CASE WHEN \"subscriptions\".\"node\" != '' THEN " + "\"subscriptions\".\"node\" " + @@ -692,6 +708,11 @@ public String selectMembership() { return SELECT_NODE_MEMBERSHIP; } + @Override + public String selectUserMembershipsFilteredByEphemeral() { + return SELECT_USER_MEMBERSHIPS_FILTERED_BY_EPHEMERAL; + } + @Override public String selectUserMemberships() { return SELECT_USER_MEMBERSHIPS; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRecentItemsTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRecentItemsTest.java index 53606a34..fd3528b6 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRecentItemsTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRecentItemsTest.java @@ -54,6 +54,25 @@ public void testGetRecentItemsNoSubscriptions() throws Exception { TEST_SERVER1_USER1_JID, new Date(), -1, -1, null, null, false); assertEquals(false, items.hasNext()); } + + @Test + public void testGetRecentItemsFromEphemeralNode() throws Exception { + + Date since = new Date(); + dbTester.loadData("node_1"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "buddycloud#ephemeral", "true"); + + NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(), "payload"); + store.addNodeItem(nodeItem1); + + Thread.sleep(20); + + CloseableIterator items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, -1, null, null, false); + + // 2 -> 1 on purpose results are most recent first! + assertSameNodeItem(items.next(), nodeItem1); + assertEquals(false, items.hasNext()); + } @Test public void testGetRecentItemsCanBePaged() throws Exception { From 63277e33aff577a68a328efe87233bc6c781c156 Mon Sep 17 00:00:00 2001 From: abmargb Date: Tue, 16 Dec 2014 11:22:18 -0300 Subject: [PATCH 02/74] Fixes #285 --- .../iq/namespace/pubsub/get/AffiliationsGet.java | 4 +++- .../iq/namespace/pubsub/get/SubscriptionsGet.java | 4 +++- .../iq/namespace/pubsub/get/AffiliationsGetTest.java | 9 ++++++--- .../iq/namespace/pubsub/get/SubscriptionsGetTest.java | 8 ++++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java index 6207a59b..80279b98 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java @@ -13,6 +13,8 @@ import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; +import org.dom4j.Namespace; +import org.dom4j.QName; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; @@ -121,7 +123,7 @@ private boolean getUserMemberships(Element affiliations) throws NodeStoreExcepti String ephemeralValue = request.getChildElement().element(XMLConstants.AFFILIATIONS_ELEM) - .attributeValue(XMLConstants.BUDDYCLOUD_XMLNS_PREFIX + XMLConstants.EPHEMERAL); + .attributeValue(new QName(XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS))); if ((null != ephemeralValue) && ephemeralValue.equals("true")) { ephemeral = true; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java index 6b0b9063..dc0367ea 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java @@ -12,6 +12,8 @@ import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; +import org.dom4j.Namespace; +import org.dom4j.QName; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; @@ -137,7 +139,7 @@ private boolean getUserMemberships(Element subscriptions) throws NodeStoreExcept String ephemeralValue = requestIq.getChildElement().element(XMLConstants.SUBSCRIPTIONS_ELEM) - .attributeValue(XMLConstants.BUDDYCLOUD_XMLNS_PREFIX + XMLConstants.EPHEMERAL); + .attributeValue(new QName(XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS))); if ((null != ephemeralValue) && ephemeralValue.equals("true")) { ephemeral = true; } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGetTest.java index 50cb83df..fe08228a 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGetTest.java @@ -11,7 +11,6 @@ import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; @@ -19,6 +18,8 @@ import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; +import org.dom4j.Namespace; +import org.dom4j.QName; import org.dom4j.tree.BaseElement; import org.junit.Before; import org.junit.Test; @@ -427,7 +428,8 @@ public void canRequestAffiliationsForEphemeralOnlyNodes() throws Exception { request.getElement().element(XMLConstants.PUBSUB_ELEM) .element(XMLConstants.AFFILIATIONS_ELEM); affiliations.addNamespace("bc", Buddycloud.NS); - affiliations.addAttribute("bc:ephemeral", "true"); + affiliations.addAttribute(new QName( + XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "true"); try { affiliationsGet.process(element, jid, request, null); @@ -460,7 +462,8 @@ public void providingAnIncorrectValueForEphemeralAttributeResultsInNotEphemeralG request.getElement().element(XMLConstants.PUBSUB_ELEM) .element(XMLConstants.AFFILIATIONS_ELEM); affiliations.addNamespace("bc", Buddycloud.NS); - affiliations.addAttribute("bc:ephemeral", "sure"); + affiliations.addAttribute(new QName( + XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "sure"); try { affiliationsGet.process(element, jid, request, null); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java index 2263c4df..6685797c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java @@ -17,6 +17,8 @@ import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; +import org.dom4j.Namespace; +import org.dom4j.QName; import org.dom4j.tree.BaseElement; import org.junit.Before; import org.junit.Test; @@ -218,7 +220,8 @@ public void canRequestUserSubscriptionsForEphemeralOnlyNodes() throws Exception request.getElement().element(XMLConstants.PUBSUB_ELEM) .element(XMLConstants.SUBSCRIPTIONS_ELEM); subscriptions.addNamespace("bc", Buddycloud.NS); - subscriptions.addAttribute("bc:ephemeral", "true"); + subscriptions.addAttribute(new QName( + XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "true"); try { subscriptionsGet.process(element, jid, request, null); @@ -246,7 +249,8 @@ public void providingAnIncorrectValueForEphemeralAttributeResultsInNotEphemeralG request.getElement().element(XMLConstants.PUBSUB_ELEM) .element(XMLConstants.SUBSCRIPTIONS_ELEM); subscriptions.addNamespace("bc", Buddycloud.NS); - subscriptions.addAttribute("bc:ephemeral", "sure"); + subscriptions.addAttribute(new QName( + XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "sure"); try { subscriptionsGet.process(element, jid, request, null); From 88a2093ab3ec238969a101f991db95e2a2d79a3f Mon Sep 17 00:00:00 2001 From: Ash Ward Date: Mon, 19 Jan 2015 23:01:21 +0000 Subject: [PATCH 03/74] Fixing some issues with fields hiding other fields --- .../iq/namespace/pubsub/get/SubscriptionsGet.java | 11 ++--------- .../iq/namespace/pubsub/get/items/NodeItemsGet.java | 4 +--- .../iq/namespace/pubsub/set/SubscribeSet.java | 3 +-- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java index dc0367ea..c1d3164e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java @@ -21,9 +21,6 @@ public class SubscriptionsGet extends PubSubElementProcessorAbstract { - private final BlockingQueue outQueue; - private ChannelManager channelManager; - private IQ result; private String node; private JID actorJid; @@ -31,12 +28,8 @@ public class SubscriptionsGet extends PubSubElementProcessorAbstract { private boolean ephemeral = false; public SubscriptionsGet(BlockingQueue outQueue, ChannelManager channelManager) { - this.outQueue = outQueue; - this.channelManager = channelManager; - } - - public void setChannelManager(ChannelManager dataStore) { - channelManager = dataStore; + setOutQueue(outQueue); + setChannelManager(channelManager); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 5919c6c7..23c5c119 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -36,8 +36,6 @@ public class NodeItemsGet extends PubSubElementProcessorAbstract { public static final int MAX_ITEMS_TO_RETURN = 50; - private final BlockingQueue outQueue; - private ChannelManager channelManager; private String node; private String firstItem; @@ -56,7 +54,7 @@ public class NodeItemsGet extends PubSubElementProcessorAbstract { private JID actor; public NodeItemsGet(BlockingQueue outQueue, ChannelManager channelManager) { - this.outQueue = outQueue; + setOutQueue(outQueue); setChannelManager(channelManager); this.acceptedElementName = XMLConstants.ITEMS_ELEM; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java index abdacc4e..d9dfcffe 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java @@ -45,11 +45,10 @@ public class SubscribeSet extends PubSubElementProcessorAbstract { public static final String INVALID_NODE_FORMAT = "invalid-node-format"; - private final BlockingQueue outQueue; private final ChannelManager channelManager; public SubscribeSet(BlockingQueue outQueue, ChannelManager channelManager) { - this.outQueue = outQueue; + this.setOutQueue(outQueue); this.channelManager = channelManager; acceptedElementName = XMLConstants.SUBSCRIBE_ELEM; From 0171e34078767a535ddccc7e6862a6848c48ae6b Mon Sep 17 00:00:00 2001 From: abmargb Date: Wed, 21 Jan 2015 12:44:56 -0300 Subject: [PATCH 04/74] fixes #288 --- .../PubSubElementProcessorAbstract.java | 26 +------------------ .../iq/namespace/pubsub/set/ItemDelete.java | 6 +++-- .../iq/namespace/pubsub/set/NodeCreate.java | 12 +++------ .../iq/namespace/pubsub/set/NodeDelete.java | 10 +------ .../pubsub/set/AffiliationEventTest.java | 1 - .../namespace/pubsub/set/ItemDeleteTest.java | 2 -- .../pubsub/set/NodeConfigureTest.java | 2 -- .../namespace/pubsub/set/NodeCreateTest.java | 24 +++++++++-------- .../namespace/pubsub/set/NodeDeleteTest.java | 17 +++++++----- .../iq/namespace/pubsub/set/PublishTest.java | 1 - .../pubsub/set/SubscribeSetTest.java | 1 - .../pubsub/set/SubscriptionEventTest.java | 1 - .../pubsub/set/UnsubscribeSetTest.java | 1 - 13 files changed, 33 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java index b614635e..8c5a37d8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java @@ -38,8 +38,6 @@ public abstract class PubSubElementProcessorAbstract implements PubSubElementPro protected IQ response; protected IQ request; protected JID actor; - protected String serverDomain; - protected String topicsDomain; protected String node = null; protected Helper configurationHelper; protected Map nodeConfiguration; @@ -68,17 +66,6 @@ public void setChannelManager(ChannelManager channelManager) { this.channelManager = channelManager; } - public void setServerDomain(String domain) { - serverDomain = domain; - } - - protected String getServerDomain() { - if (null == serverDomain) { - serverDomain = Configuration.getInstance().getProperty("server.domain"); - } - return serverDomain; - } - protected Collection getAdminUsers() { if (null == adminUsers) { adminUsers = Configuration.getInstance().getAdminUsers(); @@ -86,21 +73,10 @@ protected Collection getAdminUsers() { return adminUsers; } - public void setTopicsDomain(String domain) { - topicsDomain = domain; - } - public void setNode(String node) { this.node = node; } - protected String getTopicsDomain() { - if (null == topicsDomain) { - topicsDomain = Configuration.getInstance().getProperty("server.domain.topics"); - } - return topicsDomain; - } - public void setConfigurationHelper(Helper helper) { configurationHelper = helper; } @@ -200,7 +176,7 @@ private AccessModels getNodeAccessModel() { } protected boolean actorIsRegistered() { - if (actor.getDomain().equals(getServerDomain())) { + if (Configuration.getInstance().isLocalJID(actor)) { return true; } else { setErrorCondition(PacketError.Type.auth, PacketError.Condition.forbidden); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java index cf29b729..66f0876a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java @@ -97,7 +97,8 @@ private void deleteReplies() throws NodeStoreException { reply = replies.next(); channelManager.deleteNodeItemById(reply.getNodeId(), reply.getId()); - sendNotifications(node, new GlobalItemIDImpl(new JID(this.getServerDomain()), reply.getNodeId(), reply.getId())); + sendNotifications(node, new GlobalItemIDImpl(new JID( + Configuration.getInstance().getServerDomain()), reply.getNodeId(), reply.getId())); } } @@ -206,7 +207,8 @@ private boolean itemIdProvided() { if (GlobalItemIDImpl.isGlobalId(id)) { itemId = GlobalItemIDImpl.fromBuddycloudString(id); } else { - itemId = new GlobalItemIDImpl(new JID(this.getServerDomain()), node, id); + itemId = new GlobalItemIDImpl(new JID( + Configuration.getInstance().getServerDomain()), node, id); } return true; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java index a7e86c5b..11d7667e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java @@ -42,7 +42,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc if (null == actorJID) { actor = request.getFrom(); } - if (!nodePresent()) { + if (!nodePresent() || !isNodeValid()) { outQueue.put(response); return; } @@ -50,8 +50,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc makeRemoteRequest(); return; } - if ((checkNodeExists()) || (!actorIsRegistered()) || (!nodeHandledByThisServer())) { - + if ((checkNodeExists()) || (!actorIsRegistered())) { outQueue.put(response); return; } @@ -100,16 +99,11 @@ protected boolean checkNodeExists() throws NodeStoreException { return true; } - private boolean nodeHandledByThisServer() { + private boolean isNodeValid() { if (!node.matches(NODE_REG_EX)) { setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); return false; } - - if ((!node.contains("@" + getServerDomain())) && (!node.contains("@" + getTopicsDomain()))) { - setErrorCondition(PacketError.Type.modify, PacketError.Condition.not_acceptable); - return false; - } return true; } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java index 3a9779c4..1cb56d59 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java @@ -57,7 +57,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc makeRemoteRequest(); return; } - if (!checkNodeExists() || !actorIsRegistered() || !nodeHandledByThisServer() + if (!checkNodeExists() || !actorIsRegistered() || isEphemeralNode() || !actorAllowedToDelete()) { outQueue.put(response); return; @@ -137,14 +137,6 @@ private boolean actorAllowedToDelete() throws NodeStoreException { return false; } - private boolean nodeHandledByThisServer() { - if (!node.contains("@" + getServerDomain()) && !node.contains("@" + getTopicsDomain())) { - setErrorCondition(PacketError.Type.modify, PacketError.Condition.not_acceptable); - return false; - } - return true; - } - private boolean nodeValid() { if (!node.matches(NODE_REG_EX)) { setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java index 2d6483ed..5960af12 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java @@ -64,7 +64,6 @@ public void setUp() throws Exception { queue = new LinkedBlockingQueue(); event = new AffiliationEvent(queue, channelManager); request = readStanzaAsIq("/iq/pubsub/affiliation/affiliationChange.stanza"); - event.setServerDomain("shakespeare.lit"); element = new BaseElement("affiliations"); element.addAttribute("node", node); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java index bccbaa74..5dd4f6ff 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java @@ -52,8 +52,6 @@ public void setUp() throws Exception { itemDelete = new ItemDelete(queue, channelManager); request = readStanzaAsIq("/iq/pubsub/item/delete/request.stanza"); - itemDelete.setServerDomain("shakespeare.lit"); - element = new BaseElement("retract"); element.addAttribute("node", node); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java index 3e41e5e9..4a22c5f0 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java @@ -50,8 +50,6 @@ public void setUp() throws Exception { jid = new JID("juliet@shakespeare.lit"); request = readStanzaAsIq("/iq/pubsub/channel/configure/request.stanza"); - nodeConfigure.setServerDomain("shakespeare.lit"); - element = new BaseElement("create"); element.addAttribute("node", "/user/capulet@shakespeare.lit/posts"); } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java index 134b35e8..d26ff442 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java @@ -46,8 +46,6 @@ public void setUp() throws Exception { jid = new JID("juliet@shakespeare.lit"); request = readStanzaAsIq("/iq/pubsub/channel/create/request.stanza"); - nodeCreate.setServerDomain("shakespeare.lit"); - element = new BaseElement("create"); element.addAttribute("node", node); } @@ -106,6 +104,11 @@ public void testRequestingAlreadyExistingNodeReturnsErrorStanza() public void testUnauthenticatedUserCanNotCreateNode() throws Exception { JID jid = new JID("juliet@anon.shakespeare.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + nodeCreate.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); @@ -139,26 +142,24 @@ public void testInvalidlyFormattedNodeReturnsError() throws Exception { } @Test - public void testNewNodeMustBeOnADomainSupportedByCurrentServer() - throws Exception { + public void testNodeFromUnknownDomain() throws Exception { element.addAttribute("node", "/user/capulet@shakespearelit/posts"); - nodeCreate.setTopicsDomain("topics.shakespeare.lit"); - + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + nodeCreate.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.not_acceptable, error.getCondition()); + Assert.assertNull(response.getError()); + Assert.assertNotNull(response.getElement().element("pubsub").element("actor")); /** * Add this check back in once Tinder supports xmlns on standard * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, * error.getApplicationConditionNamespaceURI()); */ } - + @Test public void testchannelManagerFailureReturnsInternalServerErrorResponse() throws Exception { @@ -270,4 +271,5 @@ public void testFailingNodeConfigurationReturnsErrorStanza() * error.getApplicationConditionNamespaceURI()); */ } + } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java index 717795db..46c1bd47 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java @@ -49,7 +49,6 @@ public void setUp() throws Exception { this.queue = new LinkedBlockingQueue(); this.nodeDelete = new NodeDelete(queue, channelManager); - this.nodeDelete.setServerDomain("shakespeare.lit"); this.element = new BaseElement("delete"); Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); @@ -139,8 +138,13 @@ public void testNotRegisteredActor() throws Exception { String node = deleteEl.attributeValue("node"); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - nodeDelete.setServerDomain("fake.domain"); + + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + JID jid = new JID("juliet@anon.shakespeare.lit"); nodeDelete.process(deleteEl, jid, request, null); Packet response = queue.poll(); @@ -214,13 +218,14 @@ public void testNodeFromUnknownDomain() throws Exception { String node = deleteEl.attributeValue("node"); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + nodeDelete.process(deleteEl, jid, request, null); Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.not_acceptable, error.getCondition()); + Assert.assertNull(response.getError()); + Assert.assertNotNull(response.getElement().element("pubsub").element("actor")); } @Test diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java index 3943b22f..ef619c66 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java @@ -59,7 +59,6 @@ public void setUp() throws Exception { jid = new JID("juliet@shakespeare.lit/balcony"); request = readStanzaAsIq("/iq/pubsub/publish/request.stanza"); - publish.setServerDomain("shakespeare.lit"); publish.setChannelManager(channelManager); publish.setEntryValidator(validateEntry); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java index d8402ad0..9a1ef808 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java @@ -55,7 +55,6 @@ public void setUp() throws Exception { queue = new LinkedBlockingQueue(); subscribe = new SubscribeSet(queue, channelManager); request = readStanzaAsIq("/iq/pubsub/subscribe/request.stanza"); - subscribe.setServerDomain("shakespeare.lit"); element = new BaseElement("subscribe"); element.addAttribute("node", node); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java index 5127af38..730d5a8c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java @@ -57,7 +57,6 @@ public void setUp() throws Exception { queue = new LinkedBlockingQueue(); event = new SubscriptionEvent(queue, dataStore); request = readStanzaAsIq("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza"); - event.setServerDomain("shakespeare.lit"); element = new BaseElement("subscriptions"); element.addAttribute("node", node); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java index 96d7fa6f..8c897eba 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java @@ -55,7 +55,6 @@ public void setUp() throws Exception { queue = new LinkedBlockingQueue(); unsubscribe = new UnsubscribeSet(queue, channelManager); request = readStanzaAsIq("/iq/pubsub/unsubscribe/request.stanza"); - unsubscribe.setServerDomain("shakespeare.lit"); element = new BaseElement("unsubscribe"); element.addAttribute("node", node); From 869e45e02afea326bf49bba3e4e7c3216560d669 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Mon, 16 Mar 2015 13:43:15 +0000 Subject: [PATCH 05/74] Fix docker image ref --- manual/deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manual/deployment.md b/manual/deployment.md index e4557407..7668f538 100644 --- a/manual/deployment.md +++ b/manual/deployment.md @@ -13,7 +13,7 @@ Configuration to be set as per [configuration page](https://github.com/buddyclou ## Docker ``` -docker run -d buddycloud/channelserver +docker run -d buddycloud/channel-server ``` Configuration can be provided by mounting a data volume or via a database environment variable. See the [configuration page](https://github.com/buddycloud/buddycloud-server-java/blob/master/manual/configuration.md) for database instructions. From 30478d7308e964bcd841b35ecb6c4b2e253f5249 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Mon, 16 Mar 2015 20:50:07 +0000 Subject: [PATCH 06/74] Require a user has a subscription to change their affiliation. Fixes #295 --- .../iq/namespace/pubsub/set/AffiliationEvent.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java index 9dcc3f10..682f694f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java @@ -12,6 +12,7 @@ import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; +import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Document; @@ -199,7 +200,8 @@ private boolean subscriberHasCurrentAffiliation() throws NodeStoreException { channelManager.getNodeMembership(node, new JID(requestedAffiliationElement.attributeValue(XMLConstants.JID_ATTR))); - if (usersCurrentMembership.getAffiliation().equals(Affiliations.none)) { + if (usersCurrentMembership.getAffiliation().equals(Affiliations.none) + && usersCurrentMembership.getSubscription().equals(Subscriptions.none)) { setErrorCondition(PacketError.Type.modify, PacketError.Condition.unexpected_request); return false; } From 5a1766189414d40e305a106ef0cca73252bfc48e Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Fri, 20 Mar 2015 11:05:43 +0000 Subject: [PATCH 07/74] Added additional logging --- .../iq/namespace/pubsub/set/ItemDelete.java | 6 ++- .../namespace/pubsub/set/ItemDeleteTest.java | 37 +++++++++++++++++-- .../pubsub/item/delete/request-full-id.stanza | 10 +++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/stanzas/iq/pubsub/item/delete/request-full-id.stanza diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java index 66f0876a..cf741068 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java @@ -17,6 +17,7 @@ import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.XMLConstants; +import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.dom.DOMElement; @@ -82,7 +83,10 @@ public void process(Element elm, JID actor, IQ reqIQ, Element rsm) throws Interr setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); } catch (IllegalArgumentException e) { LOGGER.error(e); - setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); + createExtendedErrorReply( + PacketError.Type.modify, PacketError.Condition.bad_request, + "global-id-error", Buddycloud.NS_ERROR, e.getMessage() + ); } outQueue.put(response); } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java index 5dd4f6ff..3ae2f690 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java @@ -181,8 +181,9 @@ public void testProvidingEmptyItemIdReturnsError() throws Exception { } @Test - public void testItemWhichDoesntExistReturnsItemNotFoundError() + public void itemWhichDoesntExistReturnsItemNotFoundError() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( null); @@ -190,7 +191,7 @@ public void testItemWhichDoesntExistReturnsItemNotFoundError() itemDelete.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); @@ -285,12 +286,12 @@ public void testSuccessfulRequestSendsResponseStanza() throws Exception { itemDelete.process(element, jid, request, null); Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); - IQ response = (IQ) queue.poll(100, TimeUnit.MILLISECONDS); + IQ response = (IQ) queue.poll(); Assert.assertEquals(IQ.Type.result.toString(), response.getElement() .attribute("type").getValue()); // Check that no notifications are sent - Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); + Packet notification = queue.poll(); Assert.assertNull(notification); } @@ -485,4 +486,32 @@ public void requestsThreadWhenDeletingParentPost() throws Exception { notification.getElement().element("event").element("items") .element("retract").attributeValue("id")); } + + @Test + public void canDeleteItemUsingAFullItemId() throws Exception { + + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replaceAll("romeo@shakespeare.lit", + "juliet@shakespeare.lit"), "item-id"); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when( + channelManager.getNodeItem(Mockito.eq("/user/capulet@shakespeare.lit/posts"), + Mockito.eq("item-id"))).thenReturn(nodeItem); + + IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request-full-id.stanza")); + + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + + Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result.toString(), response.getElement() + .attribute("type").getValue()); + // Check that no notifications are sent + Packet notification = queue.poll(); + Assert.assertNull(notification); + } } diff --git a/src/test/resources/stanzas/iq/pubsub/item/delete/request-full-id.stanza b/src/test/resources/stanzas/iq/pubsub/item/delete/request-full-id.stanza new file mode 100644 index 00000000..f9a9fb7f --- /dev/null +++ b/src/test/resources/stanzas/iq/pubsub/item/delete/request-full-id.stanza @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file From f5edb082f2bee78c2e47672b36a44b6a4f3a264a Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 7 Apr 2015 16:49:44 +0200 Subject: [PATCH 08/74] Add parentOnly parameter for node item retrieval --- .../channelserver/channel/ChannelManagerImpl.java | 4 ++-- .../org/buddycloud/channelserver/db/NodeStore.java | 3 ++- .../channelserver/db/jdbc/JDBCNodeStore.java | 4 ++-- .../iq/namespace/pubsub/get/items/NodeItemsGet.java | 7 ++++--- .../channelserver/db/jdbc/JDBCNodeStoreTest.java | 10 +++++----- .../namespace/pubsub/get/items/NodeItemsGetTest.java | 12 ++++++------ 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index 945fa76c..f04091ec 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -113,9 +113,9 @@ public ResultSet getSubscriptionChanges(JID user, Date startDa } @Override - public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count) + public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count, boolean parentOnly) throws NodeStoreException { - return nodeStore.getNodeItems(nodeId, afterItemId, count); + return nodeStore.getNodeItems(nodeId, afterItemId, count, parentOnly); } @Override diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index d34422e2..26dfa51b 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -234,10 +234,11 @@ ResultSet getUserMembershipsWithConfiguration(J * @param afterNodeId the itemId after which to retrieve items (exclusive, based on modified * date). * @param count the maximum number of records to return. + * @param boolean whether to only retrieve parent items (i.e. no comments/replies) * @return an {@link Iterator} of the node entries. * @throws NodeStoreException */ - CloseableIterator getNodeItems(String nodeId, String afterItemId, int count) throws NodeStoreException; + CloseableIterator getNodeItems(String nodeId, String afterItemId, int count, boolean parentOnly) throws NodeStoreException; /** * Get node items between two dates diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 67823562..1e56f6e3 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -859,7 +859,7 @@ public ResultSet getNodeSubscriptionListeners() throws NodeSto } @Override - public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count) throws NodeStoreException { + public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count, boolean parentOnly) throws NodeStoreException { NodeItem afterItem = null; PreparedStatement stmt = null; @@ -1154,7 +1154,7 @@ public CloseableIterator getRecentItems(JID user, Date since, int maxP @Override public CloseableIterator getNodeItems(String nodeId) throws NodeStoreException { - return getNodeItems(nodeId, null, -1); + return getNodeItems(nodeId, null, -1, false); } @Override diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 23c5c119..8f74b1a7 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -46,6 +46,7 @@ public class NodeItemsGet extends PubSubElementProcessorAbstract { private IQ reply; private Element resultSetManagement; private Element element; + private boolean parentOnly = false; private Map nodeDetails; @@ -205,7 +206,7 @@ private void getItems() throws Exception { items.addAttribute(XMLConstants.NODE_ATTR, node); entry = null; - int totalEntriesCount = getNodeItems(items, maxItemsToReturn, afterItemId); + int totalEntriesCount = getNodeItems(items, maxItemsToReturn, afterItemId, parentOnly); if ((false == Configuration.getInstance().isLocalNode(node)) && (0 == rsmEntriesCount)) { LOGGER.debug("No results in cache for remote node, so " + "we're going federated to get more"); @@ -254,9 +255,9 @@ private AccessModels getNodeAccessModel() { /** * Get items nodes */ - private int getNodeItems(Element items, int maxItemsToReturn, String afterItemId) throws NodeStoreException { + private int getNodeItems(Element items, int maxItemsToReturn, String afterItemId, boolean parentOnly) throws NodeStoreException { - CloseableIterator itemIt = channelManager.getNodeItems(node, afterItemId, maxItemsToReturn); + CloseableIterator itemIt = channelManager.getNodeItems(node, afterItemId, maxItemsToReturn, parentOnly); rsmEntriesCount = 0; if (itemIt == null) { return 0; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index 3bbc7d6a..43096314 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -119,7 +119,7 @@ public void testGetNodeItemsWithLimits() throws Exception { dbTester.loadData("node_1"); Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM4_ID, 4); + TEST_SERVER1_NODE1_ITEM4_ID, 4, false); String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM3_ID, TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID }; @@ -163,7 +163,7 @@ public void testGetNodeItemsWithPaging() throws Exception { } CloseableIterator result = store.getNodeItems( - TEST_SERVER1_NODE1_ID, "15", 3); + TEST_SERVER1_NODE1_ID, "15", 3, false); assertEquals("Incorrect node item returned", items[14], result.next()); assertEquals("Incorrect node item returned", items[13], result.next()); @@ -176,7 +176,7 @@ public void testGetNodeItemsWithNegativeOneCountReturnsAllItems() dbTester.loadData("node_1"); Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - null, -1); + null, -1, false); String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, @@ -211,7 +211,7 @@ public void testGetNodeItemsWithNegativeOneCountReturnsAllItems() public void testGetNodeItemsWithInvalidCountThrowsException() throws Exception { store.getNodeItems(TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM1_ID, - -2); + -2, false); } @Test @@ -220,7 +220,7 @@ public void testGetNodeItemsWithUnknownItemReturnsAllItems() dbTester.loadData("node_1"); Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - "randomunknownitemid", 10); + "randomunknownitemid", 10, false); String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index 49c72018..6e752486 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -208,7 +208,7 @@ public void testStandardNodeWithNoItemsReturnsNoItems() throws Exception { Mockito.when( channelManager.getNodeItems(Mockito.anyString(), - Mockito.anyString(), Mockito.anyInt())) + Mockito.anyString(), Mockito.anyInt(), Mockito.eq(false))) .thenReturn(null); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); @@ -260,7 +260,7 @@ public void testUnparsableNodeEntryIsIgnoredInItemsResponse() Mockito.doReturn(itemList) .when(channelManager) .getNodeItems(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt()); + Mockito.anyInt(), Mockito.eq(false)); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); @@ -310,7 +310,7 @@ public void testPostsNodeReturnsItemsAsExpected() throws Exception { Mockito.doReturn(itemList) .when(channelManager) .getNodeItems(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt()); + Mockito.anyInt(), Mockito.eq(false)); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); @@ -363,7 +363,7 @@ public void testPagingAfterItem() throws Exception { itemsGet.process(element, jid, request, rsm); verify(channelManager).getNodeItems(anyString(), eq("item-id"), - anyInt()); + anyInt(), Mockito.eq(false)); } @Test @@ -380,7 +380,7 @@ public void pagingAfterItemWithPlainNodeID() throws Exception { itemsGet.process(element, jid, request, rsm); verify(channelManager).getNodeItems(anyString(), eq("item-id"), - anyInt()); + anyInt(), Mockito.eq(false)); } @Test @@ -397,7 +397,7 @@ public void pagingAfterItemWithInvalidNode() throws Exception { itemsGet.process(element, jid, request, rsm); - Packet p = queue.poll(100, TimeUnit.MILLISECONDS); + Packet p = queue.poll(); assertEquals("Error expected", "error", p.getElement().attributeValue("type")); From ea0b251b83ecdcc2457bc382e9751f2e7d567296 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 7 Apr 2015 16:59:52 +0200 Subject: [PATCH 09/74] Add parentOnly parameter to node items count method --- .../channelserver/channel/ChannelManagerImpl.java | 4 ++-- .../org/buddycloud/channelserver/db/NodeStore.java | 3 ++- .../channelserver/db/jdbc/JDBCNodeStore.java | 4 ++-- .../iq/namespace/pubsub/get/items/NodeItemsGet.java | 2 +- .../channelserver/db/jdbc/JDBCNodeStoreTest.java | 12 ++++++------ 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index f04091ec..9b5faf47 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -152,8 +152,8 @@ public CloseableIterator getNewNodeItemsForUser(JID user, Date startDa } @Override - public int countNodeItems(String nodeId) throws NodeStoreException { - return nodeStore.countNodeItems(nodeId); + public int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreException { + return nodeStore.countNodeItems(nodeId, parentOnly); } public boolean isCachedNode(String nodeId) throws NodeStoreException { diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index 26dfa51b..5c1895d4 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -340,10 +340,11 @@ CloseableIterator getRecentItems(JID user, Date since, int maxPerNode, * Retrieves the number of items within a node. * * @param nodeId the node id from which to retrieve the item count. + * @param parentOnly whether to include post item replies/comments in count * @return the entries count. * @throws NodeStoreException */ - int countNodeItems(String nodeId) throws NodeStoreException; + int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreException; /** * Retrieves a single node item by the node item id. diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 1e56f6e3..da235dfe 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1312,7 +1312,7 @@ public CloseableIterator getNewNodeItemsForUser(JID user, Date startDa } @Override - public int countNodeItems(String nodeId) throws NodeStoreException { + public int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreException { PreparedStatement selectStatement = null; try { @@ -1537,7 +1537,7 @@ public ArrayList getNodeList() throws NodeStoreException { @Override public boolean isCachedNode(String nodeId) throws NodeStoreException { - return ((this.countNodeItems(nodeId) > 0) && (true == this.isCachedNodeConfig(nodeId))); + return ((this.countNodeItems(nodeId, false) > 0) && (true == this.isCachedNodeConfig(nodeId))); } @Override diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 8f74b1a7..26354088 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -274,7 +274,7 @@ private int getNodeItems(Element items, int maxItemsToReturn, String afterItemId lastItem = nodeItem.getId(); } LOGGER.debug("Including RSM there are " + rsmEntriesCount + " items for node " + node); - return channelManager.countNodeItems(node); + return channelManager.countNodeItems(node, parentOnly); } finally { itemIt.close(); } diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index 43096314..8f1ee25b 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -255,7 +255,7 @@ public void testGetNodeItemsWithUnknownItemReturnsAllItems() public void testCountNodeItems() throws Exception { dbTester.loadData("node_1"); - int result = store.countNodeItems(TEST_SERVER1_NODE1_ID); + int result = store.countNodeItems(TEST_SERVER1_NODE1_ID, false); assertEquals("Incorrect item count", 5, result); } @@ -325,7 +325,7 @@ public void testGetNewNodeItemsForUserBetweenDatesWhenOutcast() public void testCountNodeItemsNonExistantNode() throws Exception { dbTester.loadData("node_1"); - int result = store.countNodeItems("iamanodewhichdoesntexist"); + int result = store.countNodeItems("iamanodewhichdoesntexist", false); assertEquals("Incorrect item count", 0, result); } @@ -642,9 +642,9 @@ public void testGetNodeListReturnsExpectedNodes() throws Exception { public void testPurgeNodeItemsDeletesNodeItems() throws Exception { dbTester.loadData("node_1"); - assertTrue(store.countNodeItems(TEST_SERVER1_NODE1_ID) > 0); + assertTrue(store.countNodeItems(TEST_SERVER1_NODE1_ID, false) > 0); store.purgeNodeItems(TEST_SERVER1_NODE1_ID); - assertEquals(0, store.countNodeItems(TEST_SERVER1_NODE1_ID)); + assertEquals(0, store.countNodeItems(TEST_SERVER1_NODE1_ID, false)); } @Test @@ -652,10 +652,10 @@ public void testPurgeNodeItemsDoesntDeleteItemsUnexpectedly() throws Exception { dbTester.loadData("node_1"); - int itemCount = store.countNodeItems(TEST_SERVER1_NODE1_ID); + int itemCount = store.countNodeItems(TEST_SERVER1_NODE1_ID, false); assertTrue(itemCount > 0); store.purgeNodeItems(TEST_SERVER1_NODE2_ID); // <--- NODE **2** - assertEquals(itemCount, store.countNodeItems(TEST_SERVER1_NODE1_ID)); + assertEquals(itemCount, store.countNodeItems(TEST_SERVER1_NODE1_ID, false)); } @Test From 33ab854561f68602090afc606b1f24edb3c8efd4 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 7 Apr 2015 18:18:44 +0200 Subject: [PATCH 10/74] Add tests for the addition of parentOnly to the node items get stanza --- .../pubsub/get/items/NodeItemsGet.java | 70 +++++--- .../pubsub/get/items/NodeItemsGetTest.java | 167 ++++++++++++++++-- 2 files changed, 201 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 26354088..9da2239f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -42,7 +42,6 @@ public class NodeItemsGet extends PubSubElementProcessorAbstract { private String lastItem; private SAXReader xmlReader; private Element entry; - private IQ requestIq; private IQ reply; private Element resultSetManagement; private Element element; @@ -54,6 +53,8 @@ public class NodeItemsGet extends PubSubElementProcessorAbstract { private JID actor; + private Element items; + public NodeItemsGet(BlockingQueue outQueue, ChannelManager channelManager) { setOutQueue(outQueue); setChannelManager(channelManager); @@ -67,31 +68,37 @@ public void setChannelManager(ChannelManager ds) { @Override public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exception { - node = elm.attributeValue(XMLConstants.NODE_ATTR); - requestIq = reqIQ; + request = reqIQ; + reply = IQ.createResultIQ(reqIQ); element = elm; resultSetManagement = rsm; - if (!Configuration.getInstance().isLocalJID(requestIq.getFrom())) { + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { reply.getElement().addAttribute(XMLConstants.REMOTE_SERVER_DISCOVER_ATTR, Boolean.FALSE.toString()); } - boolean isCached = channelManager.isCachedNode(node); - - this.actor = actorJID; - if (null == this.actor) { - this.actor = requestIq.getFrom(); - } - - if (!Configuration.getInstance().isLocalNode(node) && !isCached) { - LOGGER.debug("Node " + node + " is remote and not cached, off to get some data"); - - makeRemoteRequest(); - return; - } - try { + + if (!isValidStanza()) { + outQueue.put(reply); + return; + } + + boolean isCached = channelManager.isCachedNode(node); + + this.actor = actorJID; + if (null == this.actor) { + this.actor = request.getFrom(); + } + + if (!Configuration.getInstance().isLocalNode(node) && !isCached) { + LOGGER.debug("Node " + node + " is remote and not cached, off to get some data"); + + makeRemoteRequest(); + return; + } + if (!checkNodeExists()) { setErrorCondition(PacketError.Type.cancel, PacketError.Condition.item_not_found); outQueue.put(reply); @@ -113,9 +120,19 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc } catch (NodeStoreException e) { LOGGER.error(e); setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); - } + } /*catch (NullPointerException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); + }*/ outQueue.put(reply); } + + protected boolean isValidStanza() { + Element pubsub = request.getElement().element(XMLConstants.PUBSUB_ELEM); + items = pubsub.element(XMLConstants.ITEMS_ELEM); + node = items.attributeValue(XMLConstants.NODE_ATTR); + return true; + } private boolean getItem() throws Exception { NodeItem nodeItem = channelManager.getNodeItem(node, element.element(XMLConstants.ITEM_ELEM).attributeValue(XMLConstants.ID_ATTR)); @@ -138,12 +155,12 @@ private boolean getItem() throws Exception { @Override protected void makeRemoteRequest() throws InterruptedException { - requestIq.setTo(new JID(node.split("/")[2]).getDomain()); - if (null == requestIq.getElement().element(XMLConstants.PUBSUB_ELEM).element(XMLConstants.ACTOR_ELEM)) { - Element actor = requestIq.getElement().element(XMLConstants.PUBSUB_ELEM).addElement(XMLConstants.ACTOR_ELEM, Buddycloud.NS); - actor.addText(requestIq.getFrom().toBareJID()); + request.setTo(new JID(node.split("/")[2]).getDomain()); + if (null == request.getElement().element(XMLConstants.PUBSUB_ELEM).element(XMLConstants.ACTOR_ELEM)) { + Element actor = request.getElement().element(XMLConstants.PUBSUB_ELEM).addElement(XMLConstants.ACTOR_ELEM, Buddycloud.NS); + actor.addText(request.getFrom().toBareJID()); } - outQueue.put(requestIq); + outQueue.put(request); } @Override @@ -170,6 +187,11 @@ private void getItems() throws Exception { int maxItemsToReturn = MAX_ITEMS_TO_RETURN; String afterItemId = null; + String parentOnlyAttribute = request.getChildElement().element(XMLConstants.ITEMS_ELEM).attributeValue(XMLConstants.PARENT_ONLY_ATTR); + if ((null != parentOnlyAttribute) && ((Boolean.TRUE.toString().equals(parentOnlyAttribute)) || ("1".equals(parentOnlyAttribute)))) { + parentOnly = true; + } + String maxItems = element.attributeValue(XMLConstants.MAX_ITEMS_ATTR); if (maxItems != null) { diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index 6e752486..64e62e91 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -29,6 +29,7 @@ import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; +import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.NodeAclRefuseReason; import org.buddycloud.channelserver.utils.node.NodeViewAcl; import org.dom4j.Element; @@ -51,7 +52,7 @@ public class NodeItemsGetTest extends IQTestHandler { private Element element; private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/pamela@denmark.lit/posts"; + private String node = "/user/francisco@denmark.lit/posts"; private JID jid = new JID("juliet@shakespeare.lit"); private ChannelManager channelManager; private NodeViewAcl nodeViewAcl; @@ -106,10 +107,12 @@ public void testExternalNodeReturnsExpectedStanzaEarly() throws Exception { Configuration.getInstance().putProperty( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - element.addAttribute("node", "/user/user@remote-server.com/posts"); + IQ request = this.request.createCopy(); + request.getChildElement().element(XMLConstants.ITEMS_ELEM).attribute(XMLConstants.NODE_ATTR).detach(); + request.getChildElement().element(XMLConstants.ITEMS_ELEM).addAttribute(XMLConstants.NODE_ATTR, "/user/user@remote-server.com/posts"); itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Packet response = queue.poll(); Element element = response.getElement(); @@ -122,14 +125,13 @@ public void testExternalNodeReturnsExpectedStanzaEarly() throws Exception { } @Test - public void testNodeWhichDoesntExistReturnsNotFoundStanza() + public void nodeWhichDoesntExistReturnsNotFoundStanza() throws Exception { Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - element.addAttribute("node", node); itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); @@ -139,15 +141,14 @@ public void testNodeWhichDoesntExistReturnsNotFoundStanza() } @Test - public void testNodeStoreExceptionReturnsInternalServerErrorStanza() + public void nodeStoreExceptionReturnsInternalServerErrorStanza() throws Exception { - element.addAttribute("node", node); Mockito.when(channelManager.nodeExists(node)).thenThrow( NodeStoreException.class); itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); @@ -288,8 +289,6 @@ public void testUnparsableNodeEntryIsIgnoredInItemsResponse() public void testPostsNodeReturnsItemsAsExpected() throws Exception { AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -323,7 +322,7 @@ public void testPostsNodeReturnsItemsAsExpected() throws Exception { itemsGet.setNodeViewAcl(nodeViewAclMock); itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Packet response = queue.poll(); Element element = response.getElement(); Assert.assertEquals(IQ.Type.result.toString(), @@ -455,4 +454,148 @@ public void canRetrieveSingleItem() throws Exception { element.element("pubsub").element("items").element("item") .elementText("entry")); } + + @Test + public void settingParentOnlyToTrueRequestsParentOnlyItems() throws Exception { + + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + NodeItem item = Mockito.mock(NodeItem.class); + Mockito.when(item.getId()).thenReturn("id"); + Mockito.when(item.getNodeId()).thenReturn(node); + Mockito.when(item.getPayload()).thenReturn("entry text"); + NodeItem[] items = new NodeItem[2]; + items[0] = item; + items[1] = item; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + Mockito.doReturn(itemList) + .when(channelManager) + .getNodeItems(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt(), Mockito.eq(true)); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + IQ request = this.request.createCopy(); + request.getChildElement().element("items").addAttribute("parent-only", "true"); + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Assert.assertEquals(2, response.getElement().element("pubsub").element("items") + .nodeCount()); + } + + @Test + public void settingParentOnlyToOneRequestsParentOnlyItems() throws Exception { + + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + NodeItem item = Mockito.mock(NodeItem.class); + Mockito.when(item.getId()).thenReturn("id"); + Mockito.when(item.getNodeId()).thenReturn(node); + Mockito.when(item.getPayload()).thenReturn("entry text"); + NodeItem[] items = new NodeItem[2]; + items[0] = item; + items[1] = item; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + Mockito.doReturn(itemList) + .when(channelManager) + .getNodeItems(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt(), Mockito.eq(true)); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + IQ request = this.request.createCopy(); + request.getChildElement().element("items").addAttribute("parent-only", "1"); + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Assert.assertEquals(2, response.getElement().element("pubsub").element("items") + .nodeCount()); + } + + @Test + public void settingIllegalParentOnlyAttributeDoesNotRequestParentOnlyItems() throws Exception { + + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + NodeItem item = Mockito.mock(NodeItem.class); + Mockito.when(item.getId()).thenReturn("id"); + Mockito.when(item.getNodeId()).thenReturn(node); + Mockito.when(item.getPayload()).thenReturn("entry text"); + NodeItem[] items = new NodeItem[2]; + items[0] = item; + items[1] = item; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + Mockito.doReturn(itemList) + .when(channelManager) + .getNodeItems(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt(), Mockito.eq(false)); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + IQ request = this.request.createCopy(); + request.getChildElement().element("items").addAttribute("parent-only", "invalidvalue"); + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Assert.assertEquals(2, response.getElement().element("pubsub").element("items") + .nodeCount()); + } } From c0299ded13f7700eb72745fc744ba957b584b02e Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 7 Apr 2015 18:19:42 +0200 Subject: [PATCH 11/74] Reinstate the exception catching --- .../iq/namespace/pubsub/get/items/NodeItemsGet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 9da2239f..a29a5608 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -120,10 +120,10 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc } catch (NodeStoreException e) { LOGGER.error(e); setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); - } /*catch (NullPointerException e) { + } catch (NullPointerException e) { LOGGER.error(e); setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); - }*/ + } outQueue.put(reply); } From f5a0e203cb1cbfc444d03dbc7705edf2a3529b09 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 7 Apr 2015 19:15:35 +0200 Subject: [PATCH 12/74] Add tests + code for retrieving node item count for parent only --- .../channelserver/db/jdbc/JDBCNodeStore.java | 10 +++- .../jdbc/dialect/Sql92NodeStoreDialect.java | 2 +- .../db/jdbc/JDBCNodeStoreTest.java | 10 ++++ .../testing/jdbc/scripts/node_1.sql | 2 +- .../testing/jdbc/scripts/node_4.sql | 56 +++++++++++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_4.sql diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index da235dfe..f7e87c26 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1316,7 +1316,15 @@ public int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreExc PreparedStatement selectStatement = null; try { - selectStatement = conn.prepareStatement(dialect.countItemsForNode()); + String query = dialect.countItemsForNode(); + String parentOnlySubstitution = ""; + if (parentOnly) { + parentOnlySubstitution = "AND \"in_reply_to\" IS NULL"; + } + System.out.println("\n\n\n\n\n" + query.replace("%parentOnly%", parentOnlySubstitution) + " " + parentOnly); + selectStatement = conn.prepareStatement( + query.replace("%parentOnly%", parentOnlySubstitution) + ); selectStatement.setString(1, nodeId); java.sql.ResultSet rs = selectStatement.executeQuery(); diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 22b08626..fb28ad37 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -130,7 +130,7 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String SELECT_COUNT_RECENT_ITEM_PARTS = "" + "(SELECT COUNT(\"id\") " + "FROM \"items\" " + "WHERE \"node\" = ? " + "AND \"updated\" > ? " + "%parentOnly% " + "LIMIT ?)"; - private static final String COUNT_ITEMS_FOR_NODE = "SELECT COUNT(*)" + " FROM \"items\" WHERE \"node\" = ?"; + private static final String COUNT_ITEMS_FOR_NODE = "SELECT COUNT(*)" + " FROM \"items\" WHERE \"node\" = ? %parentOnly%;"; private static final String SELECT_ITEM_REPLIES = "" + "SELECT \"id\", \"node\", \"xml\", \"updated\", \"in_reply_to\", \"created\" " + "FROM \"items\" WHERE \"node\" = ? AND \"in_reply_to\" LIKE ? " + "AND \"updated\" > ? ORDER BY \"updated\" DESC"; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index 8f1ee25b..e8d4045b 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -259,6 +259,16 @@ public void testCountNodeItems() throws Exception { assertEquals("Incorrect item count", 5, result); } + + @Test + public void countNodeItemsWithNoReplies() throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_4"); + + int result = store.countNodeItems(TEST_SERVER1_NODE1_ID, true); + + assertEquals("Incorrect item count", 6, result); + } @Test public void testGetNewNodeItemsForUserBetweenDates() throws Exception { diff --git a/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_1.sql b/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_1.sql index e6236f0a..dc6fec36 100644 --- a/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_1.sql +++ b/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_1.sql @@ -111,4 +111,4 @@ INSERT INTO "items" ("node", "id", "updated", "xml") VALUES ('users/node1@server note '); - \ No newline at end of file + diff --git a/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_4.sql b/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_4.sql new file mode 100644 index 00000000..bd32dcb2 --- /dev/null +++ b/src/test/resources/org/buddycloud/channelserver/testing/jdbc/scripts/node_4.sql @@ -0,0 +1,56 @@ +INSERT INTO "items" ("node", "id", "updated", "xml", "in_reply_to") VALUES ('users/node1@server1/posts', 'a6', TIMESTAMP '2010-01-08 11:45:12', ' + 2010-01-08T11:45:12Z + + user2@server1 + user2@server1 + + Test 5 + + London, England + London + England + + + post + + note + + ', 'a1'); + +INSERT INTO "items" ("node", "id", "updated", "xml", "in_reply_to") VALUES ('users/node1@server1/posts', 'a7', TIMESTAMP '2010-01-06 22:32:12', ' + 2010-01-06T22:32:12Z + + user1@server1 + user1@server1 + + Test 2 + + Paris, France + Paris + France + + + post + + note + + ', 'a1'); + +INSERT INTO "items" ("node", "id", "updated", "xml", "in_reply_to") VALUES ('users/node1@server1/posts', 'a8', TIMESTAMP '2010-01-06 22:32:12', ' + 2010-01-06T22:32:12Z + + user1@server1 + user1@server1 + + Test 2 + + Paris, France + Paris + France + + + post + + note + + ', NULL); From 53cb9bd02609b770b673697910e8c172a4e75afb Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 07:49:47 +0200 Subject: [PATCH 13/74] Recovering from corrupt files --- .../jdbc/dialect/Sql92NodeStoreDialect.java | 4 ++-- .../pubsub/get/items/NodeItemsGetTest.java | 20 +------------------ 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index fb28ad37..6566082c 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -107,14 +107,14 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { + " FROM \"items\" WHERE \"node\" = ? AND \"id\" = ?"; private static final String SELECT_ITEMS_FOR_NODE = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" - + " FROM \"items\" WHERE \"node\" = ? ORDER BY \"updated\" DESC, \"id\" ASC"; + + " FROM \"items\" WHERE \"node\" = ? %parentOnly% ORDER BY \"updated\" DESC, \"id\" ASC"; private static final String SELECT_ITEMS_FOR_NODE_AFTER_DATE = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" + " FROM \"items\" WHERE \"node\" = ? AND ( \"updated\" > ? OR ( \"updated\" = ? AND \"id\" > ? ) )" + " ORDER BY \"updated\" ASC, \"id\" DESC"; private static final String SELECT_ITEMS_FOR_NODE_BEFORE_DATE = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" - + " FROM \"items\" WHERE \"node\" = ? AND ( \"updated\" < ? OR ( \"updated\" = ? AND \"id\" < ? ) )" + + " FROM \"items\" WHERE \"node\" = ? AND ( \"updated\" < ? OR ( \"updated\" = ? AND \"id\" < ? ) ) %parentOnly%" + " ORDER BY \"updated\" DESC, \"id\" ASC"; private static final String SELECT_ITEMS_FOR_USER_BETWEEN_DATES = "" + "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index 64e62e91..b67fc91c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -161,8 +161,6 @@ public void nodeStoreExceptionReturnsInternalServerErrorStanza() public void testSubscriptionIncompatibleWithItemRetrievalReturnsExpectedStanza() throws Exception { - element.addAttribute("node", node); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( new NodeMembershipImpl(node, jid, Subscriptions.none, @@ -197,8 +195,6 @@ public void testStandardNodeWithNoItemsReturnsNoItems() throws Exception { AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -238,8 +234,6 @@ public void testUnparsableNodeEntryIsIgnoredInItemsResponse() throws Exception { AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -347,8 +341,6 @@ public void testPagingAfterItem() throws Exception { rsm.addElement("after").setText( "tag:denmark.lit,/user/" + node + "/posts,item-id"); - element.addAttribute("node", node); - Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); @@ -372,8 +364,6 @@ public void pagingAfterItemWithPlainNodeID() throws Exception { rsm.addElement("after").setText("item-id"); - element.addAttribute("node", node); - Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); itemsGet.process(element, jid, request, rsm); @@ -423,9 +413,6 @@ public void canRetrieveSingleItem() throws Exception { String id = "12345"; String payload = "entry text"; - element.addAttribute("node", node); - element.addElement("item").addAttribute("id", id); - Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); @@ -460,8 +447,6 @@ public void settingParentOnlyToTrueRequestsParentOnlyItems() throws Exception { AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -508,8 +493,6 @@ public void settingParentOnlyToOneRequestsParentOnlyItems() throws Exception { AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -556,8 +539,6 @@ public void settingIllegalParentOnlyAttributeDoesNotRequestParentOnlyItems() thr AccessModels accessModel = AccessModels.authorize; - element.addAttribute("node", node); - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); Mockito.when(membership.getAffiliation()).thenReturn( Affiliations.member); @@ -599,3 +580,4 @@ public void settingIllegalParentOnlyAttributeDoesNotRequestParentOnlyItems() thr .nodeCount()); } } + From 61c77d12234e8b4db07ddbfdda66e19f6cf5b175 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 07:51:46 +0200 Subject: [PATCH 14/74] Remove debug --- .../java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index f7e87c26..4b27bb92 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1321,7 +1321,6 @@ public int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreExc if (parentOnly) { parentOnlySubstitution = "AND \"in_reply_to\" IS NULL"; } - System.out.println("\n\n\n\n\n" + query.replace("%parentOnly%", parentOnlySubstitution) + " " + parentOnly); selectStatement = conn.prepareStatement( query.replace("%parentOnly%", parentOnlySubstitution) ); From dc88dd3db01afec5387ed218abbb95950903e094 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 08:03:20 +0200 Subject: [PATCH 15/74] Fix database calls after corruption recovery --- .../channelserver/db/jdbc/JDBCNodeStore.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 4b27bb92..5f46dd78 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -869,16 +869,23 @@ public CloseableIterator getNodeItems(String nodeId, String afterItemI } String countSQL = ""; - if (count > -1) { countSQL = " OFFSET 0 LIMIT " + count; } else if (count < -1) { throw new IllegalArgumentException("Invalid value for parameter count: " + count); } - + + String parentOnlySubstitution = ""; + if (parentOnly) { + parentOnlySubstitution = " AND \"in_reply_to\" IS NOT NULL "; + } + + String query = null; try { if (afterItem == null) { - stmt = conn.prepareStatement(dialect.selectItemsForNode() + countSQL); + query = dialect.selectItemsForNode() + .replace("%parentOnly%", parentOnlySubstitution) + countSQL; + stmt = conn.prepareStatement(query); stmt.setString(1, nodeId); java.sql.ResultSet rs = stmt.executeQuery(); @@ -893,7 +900,9 @@ public NodeItem convertRow(java.sql.ResultSet rs) throws SQLException { } }); } else { - stmt = conn.prepareStatement(dialect.selectItemsForNodeBeforeDate() + countSQL); + query = dialect.selectItemsForNodeBeforeDate() + .replace("%parentOnly%", parentOnlySubstitution) + countSQL; + stmt = conn.prepareStatement(query); stmt.setString(1, nodeId); stmt.setTimestamp(2, new java.sql.Timestamp(afterItem.getUpdated().getTime())); stmt.setTimestamp(3, new java.sql.Timestamp(afterItem.getUpdated().getTime())); From 7cfb5ca9f336df6107f9708b08df40abee6f85a6 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 08:27:39 +0200 Subject: [PATCH 16/74] Do not rely on element argument --- .../pubsub/get/items/NodeItemsGet.java | 7 ++--- .../pubsub/get/items/NodeItemsGetTest.java | 29 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index a29a5608..5559db21 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -110,7 +110,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc return; } xmlReader = new SAXReader(); - if (element.element(XMLConstants.ITEM_ELEM) == null) { + if (null == items.element(XMLConstants.ITEM_ELEM)) { getItems(); } else { if (!getItem()) { @@ -135,8 +135,7 @@ protected boolean isValidStanza() { } private boolean getItem() throws Exception { - NodeItem nodeItem = channelManager.getNodeItem(node, element.element(XMLConstants.ITEM_ELEM).attributeValue(XMLConstants.ID_ATTR)); - + NodeItem nodeItem = channelManager.getNodeItem(node, items.element(XMLConstants.ITEM_ELEM).attributeValue(XMLConstants.ID_ATTR)); if (nodeItem == null) { if (!Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); @@ -192,7 +191,7 @@ private void getItems() throws Exception { parentOnly = true; } - String maxItems = element.attributeValue(XMLConstants.MAX_ITEMS_ATTR); + String maxItems = items.attributeValue(XMLConstants.MAX_ITEMS_ATTR); if (maxItems != null) { maxItemsToReturn = Integer.parseInt(maxItems); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index b67fc91c..f5bc78b7 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -416,29 +416,34 @@ public void canRetrieveSingleItem() throws Exception { Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); - NodeItem item = new NodeItemImpl(node, id, new Date(), payload); + NodeItem dbItem = new NodeItemImpl(node, id, new Date(), payload); Mockito.when( - channelManager.getNodeItem(Mockito.anyString(), - Mockito.anyString())).thenReturn(item); + channelManager.getNodeItem(Mockito.eq(node), + Mockito.eq(id))).thenReturn(dbItem); + IQ request = this.request.createCopy(); + Element item = request.getChildElement().element("items").addElement("item"); + item.addAttribute("id", id); + System.out.println(request.toXML()); itemsGet.process(element, jid, request, null); - Packet response = queue.poll(); + IQ response = (IQ) queue.poll(); - Element element = response.getElement(); + Element element = response.getChildElement(); + Element items = element.element("items"); - Assert.assertEquals(IQ.Type.result.toString(), - element.attributeValue("type")); - Assert.assertEquals(node, element.element("pubsub").element("items") + Assert.assertEquals(IQ.Type.result, + response.getType()); + Assert.assertEquals(node, items .attributeValue("node")); - Assert.assertEquals(1, element.element("pubsub").element("items") + Assert.assertEquals(1, items .nodeCount()); - Assert.assertEquals(node, element.element("pubsub").element("items") + Assert.assertEquals(node, items .attributeValue("node")); - Assert.assertEquals(id, element.element("pubsub").element("items") + Assert.assertEquals(id, items .element("item").attributeValue("id")); Assert.assertEquals("entry text", - element.element("pubsub").element("items").element("item") + items.element("item") .elementText("entry")); } From 1c9f37cd360e8c29a499a348beea4330c2c2c8fa Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 08:36:25 +0200 Subject: [PATCH 17/74] Whitespace --- .../iq/namespace/pubsub/get/RecentItemsGetTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java index bbb25074..2740c25f 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java @@ -375,7 +375,6 @@ public void testPagingAfterItemWithInvalidAfterId() throws Exception { public void whenRequestingParentOnlyCorrectFlagIsSetOnDatabaseRequest() throws Exception { Element rsm = new BaseElement(new QName("set", new Namespace("", "http://jabber.org/protocol/rsm"))); - element.addAttribute("node", "/user/francisco@denmark.lit/posts"); IQ request = this.request.createCopy(); From 6f93bc8eba25d4f0b6c4d1b0aeceba426a3fb96d Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 09:53:17 +0200 Subject: [PATCH 18/74] Fix substitution --- .../org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 5f46dd78..82569581 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -877,7 +877,7 @@ public CloseableIterator getNodeItems(String nodeId, String afterItemI String parentOnlySubstitution = ""; if (parentOnly) { - parentOnlySubstitution = " AND \"in_reply_to\" IS NOT NULL "; + parentOnlySubstitution = " AND \"in_reply_to\" IS NULL "; } String query = null; From 8462627acbf24d4a28ac8c33e141bc2092a52bda Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Wed, 8 Apr 2015 12:50:14 +0200 Subject: [PATCH 19/74] Send RSM element when there are no replies --- .../iq/namespace/pubsub/get/RepliesGet.java | 13 +++++---- .../namespace/pubsub/get/RepliesGetTest.java | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index 00be0e32..dd9b5db4 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -87,14 +87,15 @@ private boolean itemExists() throws NodeStoreException { } protected void addRsmElement() throws NodeStoreException { - if (null == firstItemId) { - return; - } + Element rsm = pubsub.addElement(XMLConstants.SET_ELEM); rsm.addNamespace("", NS_RSM); - rsm.addElement("first").setText(firstItemId); - rsm.addElement("last").setText(lastItemId); - rsm.addElement("count").setText(String.valueOf(channelManager.getCountNodeItemReplies(node, parentId))); + if (null != firstItemId) { + rsm.addElement("first").setText(firstItemId); + rsm.addElement("last").setText(lastItemId); + } + rsm.addElement("count").setText( + String.valueOf(channelManager.getCountNodeItemReplies(node, parentId))); } private void addReplies() throws NodeStoreException { diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java index 368ae321..e4044b0a 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java @@ -241,4 +241,32 @@ public void testRsmElementIsAddedCorrectly() throws Exception { Assert.assertEquals("4", rsmResult.elementText("last")); Assert.assertEquals(String.valueOf(TOTAL_RESULTS), rsmResult.elementText("count")); } + + @Test + public void rsmStillAddedWhenThereAreNoResults() throws Exception { + + Element rsm = request.getChildElement().addElement("set"); + rsm.addNamespace("", RepliesGet.NS_RSM); + rsm.addElement("max").setText("4"); + rsm.addElement("after").setText("1"); + + ArrayList expectedResults = new ArrayList(); + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.eq("1"), Mockito.eq(4))).thenReturn( + new ClosableIteratorImpl(expectedResults.iterator())); + + Mockito.when(channelManager.getCountNodeItemReplies(Mockito.anyString(), Mockito.anyString())).thenReturn(0); + + repliesGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Element items = response.getElement().element("pubsub").element("items"); + + Assert.assertEquals("/user/channeluser@example.com/posts", items.attributeValue("node")); + Assert.assertEquals(0, items.elements("item").size()); + + Element rsmResult = response.getElement().element("pubsub").element("set"); + Assert.assertNull(rsmResult.elementText("first")); + Assert.assertNull(rsmResult.elementText("last")); + Assert.assertEquals("0", rsmResult.elementText("count")); + } } From 6d01d4fc887177d2ee64e4fb2d1adf9a2c93c79b Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Thu, 9 Apr 2015 10:24:05 +0200 Subject: [PATCH 20/74] Add additional parameters so we can start back paging --- .../channel/ChannelManagerImpl.java | 4 ++-- .../buddycloud/channelserver/db/NodeStore.java | 2 +- .../channelserver/db/jdbc/JDBCNodeStore.java | 18 +++++++++++++----- .../db/jdbc/dialect/Sql92NodeStoreDialect.java | 2 +- .../pubsub/PubSubElementProcessorAbstract.java | 5 +++++ .../iq/namespace/pubsub/get/RepliesGet.java | 3 ++- .../iq/namespace/pubsub/set/ItemDelete.java | 2 +- .../db/jdbc/JDBCNodeStoreTest.java | 4 ++-- .../namespace/pubsub/get/RepliesGetTest.java | 8 ++++---- .../namespace/pubsub/set/ItemDeleteTest.java | 4 ++-- 10 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index 9b5faf47..f5bc5281 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -125,8 +125,8 @@ public CloseableIterator getNodeItems(String nodeId) throws NodeStoreE @Override public ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, - String afterItemId, int limit) throws NodeStoreException { - return nodeStore.getNodeItemReplies(nodeId, itemId, afterItemId, limit); + String afterItemId, boolean after, int limit) throws NodeStoreException { + return nodeStore.getNodeItemReplies(nodeId, itemId, afterItemId, after, limit); } @Override diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index 5c1895d4..47d9c029 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -268,7 +268,7 @@ ResultSet getUserMembershipsWithConfiguration(J * @return * @throws NodeStoreException */ - ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, String afterItemId, int limit) throws NodeStoreException; + ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, String rsmItemId, boolean after, int limit) throws NodeStoreException; /** * Get a count of the number of replies to an item diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 82569581..af68ffe4 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1167,16 +1167,24 @@ public CloseableIterator getNodeItems(String nodeId) throws NodeStoreE } @Override - public ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, String afterItemId, int limit) throws NodeStoreException { + public ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, String rsmItem, boolean after, int limit) throws NodeStoreException { PreparedStatement stmt = null; try { - Date since = new Date(0); - if (null != afterItemId) { - since = getNodeItem(nodeId, afterItemId).getUpdated(); + Date since = new Date(); + String afterReplacement = "<"; + if (after) { + since = new Date(0); + afterReplacement = ">"; + } + + if (null != rsmItem) { + since = getNodeItem(nodeId, rsmItem).getUpdated(); } - String query = dialect.selectItemReplies(); + String query = dialect.selectItemReplies() + .replace("%beforeAfter%", afterReplacement); + if (-1 != limit) { query += " LIMIT ?"; } diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 6566082c..aaa1177a 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -133,7 +133,7 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String COUNT_ITEMS_FOR_NODE = "SELECT COUNT(*)" + " FROM \"items\" WHERE \"node\" = ? %parentOnly%;"; private static final String SELECT_ITEM_REPLIES = "" + "SELECT \"id\", \"node\", \"xml\", \"updated\", \"in_reply_to\", \"created\" " - + "FROM \"items\" WHERE \"node\" = ? AND \"in_reply_to\" LIKE ? " + "AND \"updated\" > ? ORDER BY \"updated\" DESC"; + + "FROM \"items\" WHERE \"node\" = ? AND \"in_reply_to\" LIKE ? " + "AND \"updated\" %beforeAfter% ? ORDER BY \"updated\" DESC"; private static final String SELECT_ITEM_THREAD = "" + "SELECT \"id\", \"node\", \"xml\", \"updated\", \"in_reply_to\", \"created\" " + "FROM \"items\" WHERE \"node\" = ? " + "AND (\"in_reply_to\" LIKE ? OR \"id\" = ?) " + "AND \"updated\" > ? ORDER BY \"updated\" DESC"; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java index 8c5a37d8..b61990bc 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubElementProcessorAbstract.java @@ -47,6 +47,7 @@ public abstract class PubSubElementProcessorAbstract implements PubSubElementPro // RSM details protected int maxResults = -1; protected String afterItemId = null; + protected String beforeItemId; protected Element resultSetManagement; protected String firstItem; @@ -267,9 +268,13 @@ protected boolean parseRsmElement() throws NodeStoreException { maxResults = Integer.parseInt(max.getTextTrim()); } Element after; + Element before; if (null != (after = rsmElement.element("after"))) { afterItemId = after.getTextTrim(); } + if (null != (before = rsmElement.element("before"))) { + beforeItemId = before.getTextTrim(); + } return true; }; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index 00be0e32..08e02772 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -99,7 +99,8 @@ protected void addRsmElement() throws NodeStoreException { private void addReplies() throws NodeStoreException { - CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, maxResults); + boolean after = true; + CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, after, maxResults); NodeItem item; Element entry; Element itemElement; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java index cf741068..398054e3 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java @@ -95,7 +95,7 @@ private void deleteReplies() throws NodeStoreException { if (null != nodeItem.getInReplyTo()) { return; } - ClosableIteratorImpl replies = channelManager.getNodeItemReplies(node, itemId.getItemID(), null, -1); + ClosableIteratorImpl replies = channelManager.getNodeItemReplies(node, itemId.getItemID(), null, true, -1); NodeItem reply = null; while (replies.hasNext()) { reply = replies.next(); diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index e8d4045b..592727ee 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -391,7 +391,7 @@ public void canGetItemReplies() throws Exception { store.addNodeItem(testItem); ClosableIteratorImpl items = store.getNodeItemReplies( - TEST_SERVER1_NODE1_ID, "a5", null, -1); + TEST_SERVER1_NODE1_ID, "a5", null, true, -1); int count = 0; NodeItem item = null; @@ -421,7 +421,7 @@ public void canGetItemRepliesWithResultSetManagement() throws Exception { store.addNodeItem(testItem4); ClosableIteratorImpl items = store.getNodeItemReplies( - TEST_SERVER1_NODE1_ID, "a5", "a7", 2); + TEST_SERVER1_NODE1_ID, "a5", "a7", true, 2); int count = 0; ArrayList itemsResult = new ArrayList(); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java index 368ae321..14defbf3 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java @@ -160,7 +160,7 @@ public void testIfItemDoesNotExistErrorStanzaIsReturned() throws Exception { @Test public void testNoRepliesReturnsEmptyStanza() throws Exception { - Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt())).thenReturn( + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.eq(true), Mockito.anyInt())).thenReturn( new ClosableIteratorImpl(new ArrayList().iterator())); repliesGet.process(element, jid, request, null); @@ -178,7 +178,7 @@ public void testOutgoingStanzaFormattedAsExpected() throws Exception { expectedResults.add(new NodeItemImpl(TEST_NODE, "1", new Date(), "value1")); expectedResults.add(new NodeItemImpl(TEST_NODE, "2", new Date(), "value2")); - Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt())).thenReturn( + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.eq(true), Mockito.anyInt())).thenReturn( new ClosableIteratorImpl(expectedResults.iterator())); repliesGet.process(element, jid, request, null); @@ -198,7 +198,7 @@ public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception { expectedResults.add(new NodeItemImpl(TEST_NODE, "1", new Date(), "value1")); expectedResults.add(new NodeItemImpl(TEST_NODE, "2", new Date(), "value2")); - Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt())).thenReturn( + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.eq(true), Mockito.anyInt())).thenReturn( new ClosableIteratorImpl(expectedResults.iterator())); repliesGet.process(element, jid, request, null); @@ -225,7 +225,7 @@ public void testRsmElementIsAddedCorrectly() throws Exception { expectedResults.add(new NodeItemImpl(TEST_NODE, "3", new Date(), "value3")); expectedResults.add(new NodeItemImpl(TEST_NODE, "4", new Date(), "value4")); - Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.eq("1"), Mockito.eq(4))).thenReturn( + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.eq("1"), Mockito.eq(true), Mockito.eq(4))).thenReturn( new ClosableIteratorImpl(expectedResults.iterator())); repliesGet.process(element, jid, request, null); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java index 3ae2f690..16ddb7b5 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java @@ -396,7 +396,7 @@ public void doesNotRequestThreadWhenDealingWithReply() throws Exception { Mockito.doThrow(Exception.class) .when(channelManager) .getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), - Mockito.anyString(), Mockito.anyInt()); + Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyInt()); Mockito.doReturn(new ResultSetImpl(subscriptions)) .when(channelManager).getNodeSubscriptionListeners(node); @@ -431,7 +431,7 @@ public void requestsThreadWhenDeletingParentPost() throws Exception { Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); Mockito.when(channelManager.getNodeItemReplies(Mockito.eq(node), Mockito.eq("item-id"), - Mockito.anyString(), Mockito.eq(-1))).thenReturn(new ClosableIteratorImpl(replies + Mockito.anyString(), Mockito.anyBoolean(), Mockito.eq(-1))).thenReturn(new ClosableIteratorImpl(replies .iterator())); Mockito.doReturn(new ResultSetImpl(subscriptions)) From 02274e76d394885622ebaf099ca4fb38d4a66236 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Thu, 9 Apr 2015 10:36:25 +0200 Subject: [PATCH 21/74] Support 'before' RSM for replies --- .../channelserver/db/jdbc/JDBCNodeStore.java | 1 - .../db/jdbc/JDBCNodeStoreTest.java | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index af68ffe4..5b60ca48 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1181,7 +1181,6 @@ public ClosableIteratorImpl getNodeItemReplies(String nodeId, String i if (null != rsmItem) { since = getNodeItem(nodeId, rsmItem).getUpdated(); } - String query = dialect.selectItemReplies() .replace("%beforeAfter%", afterReplacement); diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index 592727ee..8016e5cf 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -435,6 +435,41 @@ public void canGetItemRepliesWithResultSetManagement() throws Exception { assertSameNodeItem(itemsResult.get(1), testItem1); } + @Test + public void canGetItemRepliesWithResultSetManagementPagingBackwards() throws Exception { + + dbTester.loadData("node_1"); + NodeItem testItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "a5", new Date()); + Thread.sleep(100); + NodeItem testItem2 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a7", + new Date(), "payload", "a5", new Date()); + Thread.sleep(100); + NodeItem testItem3 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a8", + new Date(), "payload", "a5", new Date()); + Thread.sleep(100); + NodeItem testItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a9", + new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); + store.addNodeItem(testItem1); + store.addNodeItem(testItem2); + store.addNodeItem(testItem3); + store.addNodeItem(testItem4); + + ClosableIteratorImpl items = store.getNodeItemReplies( + TEST_SERVER1_NODE1_ID, "a5", "a8", false, 4); + + int count = 0; + ArrayList itemsResult = new ArrayList(); + while (items.hasNext()) { + ++count; + itemsResult.add(items.next()); + + } + assertEquals(2, count); + assertSameNodeItem(itemsResult.get(0), testItem1); + assertSameNodeItem(itemsResult.get(1), testItem2); + } + @Test public void canGetCountOfItemReplies() throws Exception { dbTester.loadData("node_1"); From d1d37776abb5e5cf1e249791a09e98ae76751619 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Thu, 9 Apr 2015 10:47:36 +0200 Subject: [PATCH 22/74] Support 'before' paging in replies get --- .../iq/namespace/pubsub/get/RepliesGet.java | 6 +++++ .../namespace/pubsub/get/RepliesGetTest.java | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index 08e02772..a6524332 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -99,7 +99,13 @@ protected void addRsmElement() throws NodeStoreException { private void addReplies() throws NodeStoreException { + String rsmItem = afterItemId; boolean after = true; + if (null != beforeItemId) { + rsmItem = beforeItemId; + after = false; + } + CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, after, maxResults); NodeItem item; Element entry; diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java index 14defbf3..33f51df3 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java @@ -241,4 +241,30 @@ public void testRsmElementIsAddedCorrectly() throws Exception { Assert.assertEquals("4", rsmResult.elementText("last")); Assert.assertEquals(String.valueOf(TOTAL_RESULTS), rsmResult.elementText("count")); } + + @Test + public void providingBeforeValueInRsmElementInvokesPastItemLookup() throws Exception { + + Element rsm = request.getChildElement().addElement("set"); + rsm.addNamespace("", RepliesGet.NS_RSM); + rsm.addElement("max").setText("4"); + rsm.addElement("after").setText("1"); + rsm.addElement("before").setText("2"); + + ArrayList expectedResults = new ArrayList(); + expectedResults.add(new NodeItemImpl(TEST_NODE, "1", new Date(), "value1")); + expectedResults.add(new NodeItemImpl(TEST_NODE, "2", new Date(), "value2")); + expectedResults.add(new NodeItemImpl(TEST_NODE, "3", new Date(), "value3")); + expectedResults.add(new NodeItemImpl(TEST_NODE, "4", new Date(), "value4")); + + Mockito.when(channelManager.getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), Mockito.eq("1"), Mockito.eq(false), Mockito.eq(4))).thenReturn( + new ClosableIteratorImpl(expectedResults.iterator())); + + repliesGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Element items = response.getElement().element("pubsub").element("items"); + + Assert.assertEquals(4, items.elements("item").size()); + } } From d312cf501be82762d6555dd9ef820c514e922abc Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Thu, 9 Apr 2015 11:42:48 +0200 Subject: [PATCH 23/74] Pass rsmItem through to channel manager --- .../packetprocessor/iq/namespace/pubsub/get/RepliesGet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index a6524332..fd516a89 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -106,7 +106,7 @@ private void addReplies() throws NodeStoreException { after = false; } - CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, after, maxResults); + CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, rsmItem, after, maxResults); NodeItem item; Element entry; Element itemElement; From f0354723675f0b73221f0bbd88aaab310c51a757 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Mon, 13 Apr 2015 08:18:16 +0200 Subject: [PATCH 24/74] Call RSM method correctly --- .../iq/namespace/pubsub/get/UserItemsGet.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java index 0e0b60d9..1519aaf9 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java @@ -81,7 +81,13 @@ public void addRsmElement() throws NodeStoreException { } protected void addRecentItems() throws NodeStoreException { - CloseableIterator items = channelManager.getUserFeedItems(actor, maxAge, maxResults, afterItemId, parentOnly); + boolean after = true; + String rsmItem = afterItemId; + if (beforeItemId) { + after = false; + rsmItem = beforeItemId; + } + CloseableIterator items = channelManager.getUserFeedItems(actor, maxAge, maxResults, rsmItem, after, parentOnly); String lastNodeId = ""; Element itemsElement = null; while (items.hasNext()) { From 24972c1021f42a6835a4999e03a6dbad3bd57125 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Mon, 13 Apr 2015 08:28:52 +0200 Subject: [PATCH 25/74] Revert "Call RSM method correctly" This reverts commit f0354723675f0b73221f0bbd88aaab310c51a757. --- .../iq/namespace/pubsub/get/UserItemsGet.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java index 1519aaf9..0e0b60d9 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java @@ -81,13 +81,7 @@ public void addRsmElement() throws NodeStoreException { } protected void addRecentItems() throws NodeStoreException { - boolean after = true; - String rsmItem = afterItemId; - if (beforeItemId) { - after = false; - rsmItem = beforeItemId; - } - CloseableIterator items = channelManager.getUserFeedItems(actor, maxAge, maxResults, rsmItem, after, parentOnly); + CloseableIterator items = channelManager.getUserFeedItems(actor, maxAge, maxResults, afterItemId, parentOnly); String lastNodeId = ""; Element itemsElement = null; while (items.hasNext()) { From 3bf77b8b31680c0e93514721da367eee811745e7 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Mon, 13 Apr 2015 16:18:41 +0200 Subject: [PATCH 26/74] Log errors in search --- .../packetprocessor/iq/namespace/search/SearchSet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java index 22960131..9fb85ffe 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java @@ -60,6 +60,7 @@ public void process(IQ request) throws Exception { try { runSearch(); } catch (NodeStoreException e) { + LOGGER.error(e); sendErrorResponse(PacketError.Type.wait, PacketError.Condition.internal_server_error); return; } From 7607290b21fc9ef6f892558f9a10d51fd4538753 Mon Sep 17 00:00:00 2001 From: Dave Cridland Date: Wed, 12 Aug 2015 13:32:04 +0100 Subject: [PATCH 27/74] Use COALESCE function for thread identifiers This is an exact replacement, but in the WHERE clause this saves around 75% of the execution time, making post retrieval via RSM considerably faster. --- .../channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index aaa1177a..0d049844 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -238,9 +238,9 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String SELECT_NODE_THREADS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", " + "\"thread_id\", \"thread_updated\", \"created\" FROM \"items\"," + "(SELECT MAX(\"updated\") AS \"thread_updated\", \"thread_id\" FROM " - + "(SELECT \"updated\", " + "(CASE WHEN (\"in_reply_to\" IS NULL) THEN \"id\" ELSE \"in_reply_to\" END) AS \"thread_id\" " + + "(SELECT \"updated\", COALESCE(\"in_reply_to\",\"id\") AS \"thread_id\" " + "FROM \"items\" WHERE \"node\" = ?) AS \"_items\" " + "GROUP BY \"thread_id\" " + "HAVING MAX(\"updated\") < ? " - + "ORDER BY \"thread_updated\" DESC LIMIT ?) AS \"threads\" " + "WHERE \"in_reply_to\" = \"thread_id\" OR \"id\" = \"thread_id\" " + + "ORDER BY \"thread_updated\" DESC LIMIT ?) AS \"threads\" " + "WHERE COALESCE(\"in_reply_to\", \"id\") = \"thread_id\" " + "ORDER BY \"thread_updated\" DESC, \"updated\""; private static final String COUNT_NODE_THREADS = "SELECT COUNT(DISTINCT \"thread_id\") " From cecb3ce9ae81acff1e6a272667a65a3e6e78e24f Mon Sep 17 00:00:00 2001 From: Ian Date: Tue, 25 Aug 2015 10:19:46 +0100 Subject: [PATCH 28/74] Improve actor validation. * previous mechanism compared the end of the sender's domain with the actor's domain. This allowed a sender at notdomain.com to act as any user from domain.com or main.com etc. * Now compares the end of the sender's domain with the actor's domain prepended with a '.', this mean only a sender at a subdomain of the actor's registerd domain can act as them i.e. a component registered to the xmpp server. * Renamed getActor method to validateActor as it was not a conventional getter. --- .../pubsub/PacketProcessorAbstract.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PacketProcessorAbstract.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PacketProcessorAbstract.java index c68f61f4..70549edb 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PacketProcessorAbstract.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PacketProcessorAbstract.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.concurrent.BlockingQueue; +import org.apache.commons.lang.StringUtils; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; -import org.buddycloud.channelserver.queue.UnknownFederatedPacketException; import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; @@ -14,42 +14,39 @@ import org.dom4j.QName; import org.dom4j.dom.DOMElement; import org.xmpp.packet.IQ; +import org.xmpp.packet.IQ.Type; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.packet.IQ.Type; public abstract class PacketProcessorAbstract implements PacketProcessor { protected BlockingQueue outQueue; protected ChannelManager channelManager; protected List elementProcessors = new LinkedList(); - + protected Element pubsub; protected JID actor; - - protected void getActor(IQ reqIQ) throws InterruptedException, IllegalActorException { + + protected void validateActor(IQ reqIQ) throws InterruptedException, IllegalActorException { if (pubsub.elementText(XMLConstants.ACTOR_ELEM) == null) { return; } actor = new JID(pubsub.elementText(XMLConstants.ACTOR_ELEM).trim()); - String domain = actor.getDomain(); - - String from = reqIQ.getFrom().getDomain(); - int startPosition = from.length() - domain.length(); - if (from.substring(startPosition).equals(domain)) { + + if (StringUtils.endsWithIgnoreCase(reqIQ.getFrom().getDomain(), "." + actor.getDomain())) { return; } throw new IllegalActorException(); } - + @Override public void process(IQ reqIQ) throws Exception { pubsub = reqIQ.getChildElement(); try { - getActor(reqIQ); + validateActor(reqIQ); } catch (IllegalActorException e) { sendPolicyViolationResponse(reqIQ); return; From 7c96c3dd2955edac05b94eecc9e1527b78bd1bcc Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 14:15:23 +0200 Subject: [PATCH 29/74] testing bintray --- .travis.yml | 19 ++++++++++---- .travis/bintray.json | 61 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 .travis/bintray.json diff --git a/.travis.yml b/.travis.yml index 6d30f677..b289a442 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,17 @@ language: java jdk: - - oraclejdk7 - - openjdk6 - - openjdk7 - +- oraclejdk7 +- openjdk6 +- openjdk7 after_success: - - mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura -Dcobertura.report.format=xml +- mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura + -Dcobertura.report.format=xml +deploy: + provider: bintray + file: ".travis/bintray.json" + user: Bintray user + key: Bintray API key +env: + global: + - secure: BuWV1lQysxk2QqvccrjLAnf5eYlUdBbHAUbFLriVPVo8qcfT4uUVXu3/ywZwGX7SlWkRV33bRD3PNNORvDYpVC4boVH3vFFvLQ2hyBJS8kx6H7c5ak23X7uQ6D9M6TK5CdiVDOvhumqNwe8XSX4hS8FHO5Fow/SyioST0IMefG8= + - secure: tkAujasiCm9KFYPV3nX88YMF0ihyzxk/hLnfaVFzKV9gYRIQhpi51GAASHDoBcvHh5YE4oxd2hDcaOe4MD2AtZpRJWQtBW0WwuAzy1sk3lIaHrE3LETfrG1W81uKfXjwjsHLU+i+i2Tkl7I0oJEdrezNxah+76vpMcP0Z67iONI= diff --git a/.travis/bintray.json b/.travis/bintray.json new file mode 100644 index 00000000..9b2b3ff1 --- /dev/null +++ b/.travis/bintray.json @@ -0,0 +1,61 @@ +{ + /* Bintray package information. + In case the package already exists on Bintray, only the name, repo and subject + fields are mandatory. */ + + "package": { + "buddycloud-server-java": "auto-upload", // Bintray package name + "repo": "builds", // Bintray repository name + "subject": "buddycloud", // Bintray subject (user or organization) + "desc": "built by Travis-ci", + "website_url": "https://github.com/buddycloud/buddycloud-server-java", + "issue_tracker_url": "https://github.com/buddycloud/buddycloud-server-java/issues", + "vcs_url": "https://github.com/buddycloud/buddycloud-server-java.git", + "github_use_tag_release_notes": true, + "github_release_notes_file": "RELEASE.txt", + "licenses": ["Apache 2.0"], + "labels": ["buddycloud"], + "public_download_numbers": false, + "public_stats": false, + "attributes": [{"name": "att1", "values" : ["val1"], "type": "string"}, + {"name": "att2", "values" : [1, 2.2, 4], "type": "number"}, + {"name": "att5", "values" : ["2014-12-28T19:43:37+0100"], "type": "date"}] + }, + + /* Package version information. + In case the version already exists on Bintray, only the name fields is mandatory. */ + + "version": { + "name": "0.5", + "desc": "This is a version", + "released": "2015-01-04", + "vcs_tag": "0.5", + "attributes": [{"name": "VerAtt1", "values" : ["VerVal1"], "type": "string"}, + {"name": "VerAtt2", "values" : [1, 3.3, 5], "type": "number"}, + {"name": "VerAtt3", "values" : ["2015-01-01T19:43:37+0100"], "type": "date"}], + "gpgSign": false + }, + + /* Configure the files you would like to upload to Bintray and their upload path. + You can define one or more groups of patterns. + Each group contains three patterns: + + includePattern: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. + excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. + uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. + + In the example below, the following files are uploaded, + 1. All gem files located under build/bin/ (including sub directories), + except for files under a the do-not-deploy directory. + The files will be uploaded to Bintray under the gems folder. + 2. All files under build/docs. The files will be uploaded to Bintray under the docs folder. + + Note: Regular expressions defined as part of the includePattern and excludePattern properties must be wrapped with brackets. */ + + "files": + [ + {"includePattern": "build/bin(.*)*/(.*\.gem)", "excludePattern": ".*/do-not-deploy/.*", "uploadPattern": "gems/$2"}, + {"includePattern": "build/docs/(.*)", "uploadPattern": "docs/$1"} + ], + "publish": true +} From a6e4be25e683e7b366d470be798201e6dc697f81 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 14:17:48 +0200 Subject: [PATCH 30/74] take 2 --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b289a442..64977f95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,6 @@ after_success: deploy: provider: bintray file: ".travis/bintray.json" - user: Bintray user - key: Bintray API key env: global: - secure: BuWV1lQysxk2QqvccrjLAnf5eYlUdBbHAUbFLriVPVo8qcfT4uUVXu3/ywZwGX7SlWkRV33bRD3PNNORvDYpVC4boVH3vFFvLQ2hyBJS8kx6H7c5ak23X7uQ6D9M6TK5CdiVDOvhumqNwe8XSX4hS8FHO5Fow/SyioST0IMefG8= From 0aa5d50a50f47267a759e2061be6dd5dffe735fd Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 14:31:38 +0200 Subject: [PATCH 31/74] doh! --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 64977f95..ae6cacf6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ after_success: deploy: provider: bintray file: ".travis/bintray.json" -env: - global: - - secure: BuWV1lQysxk2QqvccrjLAnf5eYlUdBbHAUbFLriVPVo8qcfT4uUVXu3/ywZwGX7SlWkRV33bRD3PNNORvDYpVC4boVH3vFFvLQ2hyBJS8kx6H7c5ak23X7uQ6D9M6TK5CdiVDOvhumqNwe8XSX4hS8FHO5Fow/SyioST0IMefG8= - - secure: tkAujasiCm9KFYPV3nX88YMF0ihyzxk/hLnfaVFzKV9gYRIQhpi51GAASHDoBcvHh5YE4oxd2hDcaOe4MD2AtZpRJWQtBW0WwuAzy1sk3lIaHrE3LETfrG1W81uKfXjwjsHLU+i+i2Tkl7I0oJEdrezNxah+76vpMcP0Z67iONI= + user: + secure: DQvbbQjwxtBEAxt3Pi9VDkfUndU2qDKntPs7CnmO2C37XFwxsUppzMrmvbh2TpeCxnHbiemctbQIvCNKt01UDqo/oEEPAUzpQkEr78iA60yriCItTGplrkiSYxGQCfUodD/YGoCh20n98f+P6rhoFn8mzzgmm1rDlYRdysE+oII= + key: + secure: YFla+XtiAvEYBYYIisdz+fkevWzufweser+VAXqd5F5Of/LZtKuPmS2bZjSiDD1w54hfLcsmKZhC/7JnxdstU7ta3WXilgiyZpTYIK223QV43YtMKtpmzi2eyXRCFUTW+8vghfrhN7yuVMI/tBZ9t6RwguUwkGESLkCypLadZPo= From f976836db7e0edf09092d2ba68ea2c51d36f88b6 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 14:54:19 +0200 Subject: [PATCH 32/74] less doh! more deploy! --- .travis/bintray.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 9b2b3ff1..b19c6b9a 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -4,10 +4,10 @@ fields are mandatory. */ "package": { - "buddycloud-server-java": "auto-upload", // Bintray package name + "name": "buddycloud-server-java", // Bintray package name "repo": "builds", // Bintray repository name "subject": "buddycloud", // Bintray subject (user or organization) - "desc": "built by Travis-ci", + "desc": "built by Travis-CI", "website_url": "https://github.com/buddycloud/buddycloud-server-java", "issue_tracker_url": "https://github.com/buddycloud/buddycloud-server-java/issues", "vcs_url": "https://github.com/buddycloud/buddycloud-server-java.git", From 58ed1cbaa2988a8d0c0e3065109f1ac52b9e3494 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 15:16:49 +0200 Subject: [PATCH 33/74] take 400 --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ae6cacf6..071bd46f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,10 @@ jdk: after_success: - mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura -Dcobertura.report.format=xml +env: + global: + secure: y2eA9GUJrzAhB4URuvN2GS0rflVXYoUhVxj1c2FSoL81rNrTnfop6RgF/xkePzeRjPM5RFSfxx+rPV3ew7GxKi38SKFBWS0X16KEAy4hVeUU8fQN5TZsGWAs1vQBS3pafZy83p6rqgKatIPNVLsJKKO4ATvShJhldO7IlmjPgmI= + secure: 1xcCOEQSTPZN8HURZve+tLhzONJoisjjqk659k1W771NEjzAfCFUbnOksXb/323UjXp2KFBuJcWFr4+5xG51D8VNP/FxeY2Uycr8AcaUh9bgJeXqXw3XoGBm+Wlrf/RhL67s1fqs9iGXZXrjrTYQccagDdVrxBmA8XRECmkqxP4= deploy: provider: bintray file: ".travis/bintray.json" - user: - secure: DQvbbQjwxtBEAxt3Pi9VDkfUndU2qDKntPs7CnmO2C37XFwxsUppzMrmvbh2TpeCxnHbiemctbQIvCNKt01UDqo/oEEPAUzpQkEr78iA60yriCItTGplrkiSYxGQCfUodD/YGoCh20n98f+P6rhoFn8mzzgmm1rDlYRdysE+oII= - key: - secure: YFla+XtiAvEYBYYIisdz+fkevWzufweser+VAXqd5F5Of/LZtKuPmS2bZjSiDD1w54hfLcsmKZhC/7JnxdstU7ta3WXilgiyZpTYIK223QV43YtMKtpmzi2eyXRCFUTW+8vghfrhN7yuVMI/tBZ9t6RwguUwkGESLkCypLadZPo= From ec88952bc93b194dc171cca12b73ce37364eedd0 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 15:37:08 +0200 Subject: [PATCH 34/74] perhaps? --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 071bd46f..5104fc96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,10 @@ after_success: -Dcobertura.report.format=xml env: global: - secure: y2eA9GUJrzAhB4URuvN2GS0rflVXYoUhVxj1c2FSoL81rNrTnfop6RgF/xkePzeRjPM5RFSfxx+rPV3ew7GxKi38SKFBWS0X16KEAy4hVeUU8fQN5TZsGWAs1vQBS3pafZy83p6rqgKatIPNVLsJKKO4ATvShJhldO7IlmjPgmI= - secure: 1xcCOEQSTPZN8HURZve+tLhzONJoisjjqk659k1W771NEjzAfCFUbnOksXb/323UjXp2KFBuJcWFr4+5xG51D8VNP/FxeY2Uycr8AcaUh9bgJeXqXw3XoGBm+Wlrf/RhL67s1fqs9iGXZXrjrTYQccagDdVrxBmA8XRECmkqxP4= + - secure: OPka1kcKQuWnfZHzPe8bUxOHF4fPI69J9h4bPy95Omg/IrFrvGHPuhpNWRvz2GbGTu9hcN8s2POlBoFAKBk2DFJtNLgORJrll1c/N1+OWEBmfnpaxyp5V8JmcxqISJDwPA4MD5Os+ezzMN2/VXsTaImqnHd43nY4+3K8L1o4WD8= + - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= deploy: provider: bintray file: ".travis/bintray.json" + user: "$BINTRAY_USER" + key: "$BINTRAY_API_KEY" From 393fc14a4f111f128c16f641465552bb434152b4 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 15:39:57 +0200 Subject: [PATCH 35/74] use the new travis build env --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5104fc96..78282a0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +sudo: false jdk: - oraclejdk7 - openjdk6 From 9bdcbf71ab2842b5ceff8082ab218c299d3f9b74 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 16:07:06 +0200 Subject: [PATCH 36/74] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b81e4ed6..7d990bb7 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A buddycloud server written in Java, implementing the [buddycloud channels](http Note this points to the main buddycloud repository for the java server. -[![Build Status](https://travis-ci.org/buddycloud/buddycloud-server-java.png?branch=master)](https://travis-ci.org/buddycloud/buddycloud-server-java) [![Coverage Status](https://img.shields.io/coveralls/buddycloud/buddycloud-server-java.svg)](https://coveralls.io/r/buddycloud/buddycloud-server-java) +[![Build Status](https://travis-ci.org/buddycloud/buddycloud-server-java.png?branch=master)](https://travis-ci.org/buddycloud/buddycloud-server-java) [![Coverage Status](https://img.shields.io/coveralls/buddycloud/buddycloud-server-java.svg)](https://coveralls.io/r/buddycloud/buddycloud-server-java) [ ![Download](https://api.bintray.com/packages/buddycloud/builds/buddycloud-server-java/images/download.svg) ](https://bintray.com/buddycloud/builds/buddycloud-server-java/_latestVersion) # Manual pages From 6116984552d0fd98f2c39ea48aa1c6cfdbea1be4 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 16:37:18 +0200 Subject: [PATCH 37/74] Just the jar --- .travis/bintray.json | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index b19c6b9a..caf34315 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -17,22 +17,15 @@ "labels": ["buddycloud"], "public_download_numbers": false, "public_stats": false, - "attributes": [{"name": "att1", "values" : ["val1"], "type": "string"}, - {"name": "att2", "values" : [1, 2.2, 4], "type": "number"}, - {"name": "att5", "values" : ["2014-12-28T19:43:37+0100"], "type": "date"}] }, /* Package version information. In case the version already exists on Bintray, only the name fields is mandatory. */ "version": { - "name": "0.5", - "desc": "This is a version", - "released": "2015-01-04", - "vcs_tag": "0.5", - "attributes": [{"name": "VerAtt1", "values" : ["VerVal1"], "type": "string"}, - {"name": "VerAtt2", "values" : [1, 3.3, 5], "type": "number"}, - {"name": "VerAtt3", "values" : ["2015-01-01T19:43:37+0100"], "type": "date"}], + "name": "latest", + "desc": "The latest auto-build version", + "vcs_tag": "latest", "gpgSign": false }, @@ -44,18 +37,11 @@ excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. - In the example below, the following files are uploaded, - 1. All gem files located under build/bin/ (including sub directories), - except for files under a the do-not-deploy directory. - The files will be uploaded to Bintray under the gems folder. - 2. All files under build/docs. The files will be uploaded to Bintray under the docs folder. - Note: Regular expressions defined as part of the includePattern and excludePattern properties must be wrapped with brackets. */ "files": [ - {"includePattern": "build/bin(.*)*/(.*\.gem)", "excludePattern": ".*/do-not-deploy/.*", "uploadPattern": "gems/$2"}, - {"includePattern": "build/docs/(.*)", "uploadPattern": "docs/$1"} + {includePattern: “target/channelserver-*-jar-with-dependencies.jar”} ], "publish": true } From 5a3d0ac446f9c0ee08f83180631632a8f12f68ce Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 18:28:05 +0200 Subject: [PATCH 38/74] just the jar --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index caf34315..3faf64c5 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -41,7 +41,7 @@ "files": [ - {includePattern: “target/channelserver-*-jar-with-dependencies.jar”} + {includePattern: "target/channelserver-(.*)-jar-with-dependencies.jar"} ], "publish": true } From c25102b06127fb1bca8ea70036e273bb6d61702b Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 18:50:45 +0200 Subject: [PATCH 39/74] need uploadpattern too --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 3faf64c5..12567a89 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -41,7 +41,7 @@ "files": [ - {includePattern: "target/channelserver-(.*)-jar-with-dependencies.jar"} + {"includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", "uploadPattern": "channelserver-with-dependencies.jar"} ], "publish": true } From fc0d99008628041c6ab6b3b578eb96e59614a755 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Wed, 23 Sep 2015 19:04:04 +0200 Subject: [PATCH 40/74] need uploadpattern too --- .travis/bintray.json | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 12567a89..beed4a8c 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -1,8 +1,4 @@ { - /* Bintray package information. - In case the package already exists on Bintray, only the name, repo and subject - fields are mandatory. */ - "package": { "name": "buddycloud-server-java", // Bintray package name "repo": "builds", // Bintray repository name @@ -19,29 +15,20 @@ "public_stats": false, }, - /* Package version information. - In case the version already exists on Bintray, only the name fields is mandatory. */ - "version": { - "name": "latest", - "desc": "The latest auto-build version", + "name": "{name}", + "desc": "{desc}", + "released": "{date}", "vcs_tag": "latest", "gpgSign": false }, - /* Configure the files you would like to upload to Bintray and their upload path. - You can define one or more groups of patterns. - Each group contains three patterns: - - includePattern: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. - excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. - uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. - - Note: Regular expressions defined as part of the includePattern and excludePattern properties must be wrapped with brackets. */ + "files": [ + { + "includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", + "uploadPattern": "channelserver-with-dependencies.jar" + } + ], - "files": - [ - {"includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", "uploadPattern": "channelserver-with-dependencies.jar"} - ], - "publish": true + "publish": true } From 194e74518f1cdacf21b44d3c90147e0b273833fd Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Thu, 24 Sep 2015 15:44:45 +0200 Subject: [PATCH 41/74] less syntax-errors, more builds? Please? --- .travis/bintray.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index beed4a8c..fe4614c1 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -1,8 +1,8 @@ { "package": { - "name": "buddycloud-server-java", // Bintray package name - "repo": "builds", // Bintray repository name - "subject": "buddycloud", // Bintray subject (user or organization) + "name": "buddycloud-server-java", + "repo": "builds", + "subject": "buddycloud", "desc": "built by Travis-CI", "website_url": "https://github.com/buddycloud/buddycloud-server-java", "issue_tracker_url": "https://github.com/buddycloud/buddycloud-server-java/issues", From 369986277c157c9d5010ace8cf8a571db00b2020 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Thu, 24 Sep 2015 15:51:52 +0200 Subject: [PATCH 42/74] Update bintray.json --- .travis/bintray.json | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index fe4614c1..7706d77a 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -9,12 +9,15 @@ "vcs_url": "https://github.com/buddycloud/buddycloud-server-java.git", "github_use_tag_release_notes": true, "github_release_notes_file": "RELEASE.txt", - "licenses": ["Apache 2.0"], - "labels": ["buddycloud"], + "licenses": [ + "Apache 2.0" + ], + "labels": [ + "buddycloud" + ], "public_download_numbers": false, - "public_stats": false, + "public_stats": false }, - "version": { "name": "{name}", "desc": "{desc}", @@ -22,13 +25,11 @@ "vcs_tag": "latest", "gpgSign": false }, - "files": [ - { - "includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", - "uploadPattern": "channelserver-with-dependencies.jar" - } - ], - - "publish": true + { + "includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", + "uploadPattern": "channelserver-with-dependencies.jar" + } + ], + "publish": true } From e64c5b533d982b32d2702bfca2916945a226ef62 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Thu, 24 Sep 2015 16:58:07 +0200 Subject: [PATCH 43/74] Update bintray.json --- .travis/bintray.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 7706d77a..48d3f2fe 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -19,9 +19,9 @@ "public_stats": false }, "version": { - "name": "{name}", - "desc": "{desc}", - "released": "{date}", + "name": "{{name}}", + "desc": "{{desc}}", + "released": "{{date}}", "vcs_tag": "latest", "gpgSign": false }, From 1653bd6565fdc59cbe86d40c29d7e47ca5e493d8 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Thu, 24 Sep 2015 23:07:42 +0200 Subject: [PATCH 44/74] Update bintray.json --- .travis/bintray.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 48d3f2fe..baf90159 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -19,16 +19,14 @@ "public_stats": false }, "version": { - "name": "{{name}}", - "desc": "{{desc}}", - "released": "{{date}}", - "vcs_tag": "latest", + "name": "latest", + "desc": "Latest Travis-CI build", "gpgSign": false }, "files": [ { - "includePattern": "target/channelserver-(.*)-jar-with-dependencies.jar", - "uploadPattern": "channelserver-with-dependencies.jar" + "includePattern": "target/channelserver-jar-with-dependencies.jar", + "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], "publish": true From 39db75dc47c959ae54dd0c06aacee846eca3a20f Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Thu, 24 Sep 2015 23:46:21 +0200 Subject: [PATCH 45/74] Update bintray.json --- .travis/bintray.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index baf90159..289ffaab 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -9,12 +9,7 @@ "vcs_url": "https://github.com/buddycloud/buddycloud-server-java.git", "github_use_tag_release_notes": true, "github_release_notes_file": "RELEASE.txt", - "licenses": [ - "Apache 2.0" - ], - "labels": [ - "buddycloud" - ], + "licenses": ["Apache 2.0"], "public_download_numbers": false, "public_stats": false }, @@ -25,7 +20,7 @@ }, "files": [ { - "includePattern": "target/channelserver-jar-with-dependencies.jar", + "includePattern": "channelserver-jar-with-dependencies.jar", "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], From 3441a9c089554e0ba32917f0a5d1170b0acbd26c Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 11:18:17 +0200 Subject: [PATCH 46/74] @denisw's suggestion --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 78282a0e..ea209925 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ jdk: - openjdk6 - openjdk7 after_success: -- mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura +- mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura package -Dcobertura.report.format=xml env: global: From ad95167eec96a99212d940f7660d291617ad4af4 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 11:24:48 +0200 Subject: [PATCH 47/74] Update bintray.json --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 289ffaab..90cbab9b 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,7 +20,7 @@ }, "files": [ { - "includePattern": "channelserver-jar-with-dependencies.jar", + "includePattern": "(.*)/channelserver-jar-with-dependencies.jar", "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], From cf8ab4b2f2c5d3ab75e2a35b06a4ea66023562cb Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 11:48:24 +0200 Subject: [PATCH 48/74] Update .travis.yml --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index ea209925..26444526 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,3 +16,6 @@ deploy: file: ".travis/bintray.json" user: "$BINTRAY_USER" key: "$BINTRAY_API_KEY" + on: + branch: master + tags: true From b8a8209ae16daa8ba435868da4e31f06217b5860 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 12:03:16 +0200 Subject: [PATCH 49/74] testing skip_cleanup: true --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 26444526..91f32bf8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ deploy: file: ".travis/bintray.json" user: "$BINTRAY_USER" key: "$BINTRAY_API_KEY" + skip_cleanup: true on: branch: master tags: true From e247048257631d3a150ac52911579e728524fc5e Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 12:08:13 +0200 Subject: [PATCH 50/74] I really have no fucking clue what I'm doing. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 91f32bf8..ac590291 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,4 +19,3 @@ deploy: skip_cleanup: true on: branch: master - tags: true From 3fa5c22f3713d85433e2e07e8944f84d8ae64a14 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 12:35:55 +0200 Subject: [PATCH 51/74] Update bintray.json --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 90cbab9b..4a08ca6d 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,7 +20,7 @@ }, "files": [ { - "includePattern": "(.*)/channelserver-jar-with-dependencies.jar", + "includePattern": "(.*)/channelserver-(.*)-SNAPSHOT.jar", "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], From e4411277dfe709d13f48eef44599320c7e4d4a0c Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 12:49:08 +0200 Subject: [PATCH 52/74] github releases for tags. --- .travis.yml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ac590291..c0ef3f55 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,10 +12,21 @@ env: - secure: OPka1kcKQuWnfZHzPe8bUxOHF4fPI69J9h4bPy95Omg/IrFrvGHPuhpNWRvz2GbGTu9hcN8s2POlBoFAKBk2DFJtNLgORJrll1c/N1+OWEBmfnpaxyp5V8JmcxqISJDwPA4MD5Os+ezzMN2/VXsTaImqnHd43nY4+3K8L1o4WD8= - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= deploy: - provider: bintray - file: ".travis/bintray.json" - user: "$BINTRAY_USER" - key: "$BINTRAY_API_KEY" skip_cleanup: true - on: - branch: master + - provider: bintray + file: ".travis/bintray.json" + user: "$BINTRAY_USER" + key: "$BINTRAY_API_KEY" + skip_cleanup: true + on: + branch: master + - provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: + - "README.md" + - "target/" + - "mauual/" + - "postgres/" + on: + tags: true + branch: master From eb01302804f788a0f3beee54d464122e0d35d2a6 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 12:52:09 +0200 Subject: [PATCH 53/74] file syntax --- .travis.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index c0ef3f55..6f1a9782 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,19 +14,19 @@ env: deploy: skip_cleanup: true - provider: bintray - file: ".travis/bintray.json" - user: "$BINTRAY_USER" - key: "$BINTRAY_API_KEY" - skip_cleanup: true - on: - branch: master + file: ".travis/bintray.json" + user: "$BINTRAY_USER" + key: "$BINTRAY_API_KEY" + skip_cleanup: true + on: + branch: master - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: - - "README.md" - - "target/" - - "mauual/" - - "postgres/" - on: - tags: true - branch: master + api_key: "GITHUB OAUTH TOKEN" + file: + - "README.md" + - "target/" + - "mauual/" + - "postgres/" + on: + tags: true + branch: master From 32b45bcf0b05061d1e0949bdb649220f9d0a0001 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 13:23:28 +0200 Subject: [PATCH 54/74] Update .travis.yml --- .travis.yml | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f1a9782..c56bee91 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,32 +1,41 @@ language: java + +# use the container build system sudo: false + jdk: - oraclejdk7 -- openjdk6 -- openjdk7 +#- openjdk6 +#- openjdk7 + after_success: - mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura package -Dcobertura.report.format=xml + env: global: - secure: OPka1kcKQuWnfZHzPe8bUxOHF4fPI69J9h4bPy95Omg/IrFrvGHPuhpNWRvz2GbGTu9hcN8s2POlBoFAKBk2DFJtNLgORJrll1c/N1+OWEBmfnpaxyp5V8JmcxqISJDwPA4MD5Os+ezzMN2/VXsTaImqnHd43nY4+3K8L1o4WD8= - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= + +before_deploy: "tar cvfz budducloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" + deploy: +- provider: bintray skip_cleanup: true - - provider: bintray file: ".travis/bintray.json" user: "$BINTRAY_USER" key: "$BINTRAY_API_KEY" skip_cleanup: true on: - branch: master - - provider: releases - api_key: "GITHUB OAUTH TOKEN" + branch: "master" +- provider: releases + skip_cleanup: true + api_key: "GITHUB OAUTH TOKEN... to add later" file: - "README.md" - - "target/" - - "mauual/" - - "postgres/" + - "target" + - "manual" + - "postgres" on: tags: true - branch: master + branch: "master" From d6aec19e9b20a9795dcbdfd0576599b388cee98b Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 13:28:08 +0200 Subject: [PATCH 55/74] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c56bee91..23283ce2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ jdk: #- openjdk7 after_success: -- mvn -DserviceJobId=$TRAVIS_JOB_ID clean cobertura:cobertura coveralls:cobertura package +- mvn -DserviceJobId=$TRAVIS_JOB_ID cobertura:cobertura coveralls:cobertura package -Dcobertura.report.format=xml env: From 4fa94e741ab0f5bfa7cf5e5a48edd35bbdcaafc8 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 14:02:45 +0200 Subject: [PATCH 56/74] Update bintray.json --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 4a08ca6d..90cbab9b 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,7 +20,7 @@ }, "files": [ { - "includePattern": "(.*)/channelserver-(.*)-SNAPSHOT.jar", + "includePattern": "(.*)/channelserver-jar-with-dependencies.jar", "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], From 2a4c47bef70de4c7fe89f4e9a38994647c70ea57 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 14:09:32 +0200 Subject: [PATCH 57/74] Update bintray.json --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 90cbab9b..0f4afeb4 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,7 +20,7 @@ }, "files": [ { - "includePattern": "(.*)/channelserver-jar-with-dependencies.jar", + "includePattern": "(.*)jar", "uploadPattern": "channelserver-jar-with-dependencies.jar" } ], From b82a8f49ebd248e6c14ec7b02906915dc48e76aa Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 14:22:23 +0200 Subject: [PATCH 58/74] Update bintray.json --- .travis/bintray.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 0f4afeb4..4affb7ab 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,8 +20,8 @@ }, "files": [ { - "includePattern": "(.*)jar", - "uploadPattern": "channelserver-jar-with-dependencies.jar" + "includePattern": "budducloud-channel-server.tgz", + "uploadPattern": "budducloud-channel-server.tgz" } ], "publish": true From c8032bfc1db66d4f3d504d468184ce701f2fad38 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 15:26:22 +0200 Subject: [PATCH 59/74] Update .travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 23283ce2..9c7a816a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,8 +17,9 @@ env: - secure: OPka1kcKQuWnfZHzPe8bUxOHF4fPI69J9h4bPy95Omg/IrFrvGHPuhpNWRvz2GbGTu9hcN8s2POlBoFAKBk2DFJtNLgORJrll1c/N1+OWEBmfnpaxyp5V8JmcxqISJDwPA4MD5Os+ezzMN2/VXsTaImqnHd43nY4+3K8L1o4WD8= - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= -before_deploy: "tar cvfz budducloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" - +before_deploy: + - "tar cvfz budducloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" + - "shasum budducloud-channel-server.tgz > source.hashes" deploy: - provider: bintray skip_cleanup: true From c51eadcf242f8fda4bf273f1ee17788a1c2c487a Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 15:27:05 +0200 Subject: [PATCH 60/74] Update bintray.json --- .travis/bintray.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 4affb7ab..201b9860 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -21,7 +21,11 @@ "files": [ { "includePattern": "budducloud-channel-server.tgz", - "uploadPattern": "budducloud-channel-server.tgz" + "uploadPattern": "budducloud-channel-server.tgz" + }, + { + "includePattern": "source.hashes", + "uploadPattern": "source.hashes" } ], "publish": true From 53bbbf36324bbcf1592d9d169ffa7c640a56d5d3 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 15:48:14 +0200 Subject: [PATCH 61/74] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9c7a816a..bc164fe2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: before_deploy: - "tar cvfz budducloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" - - "shasum budducloud-channel-server.tgz > source.hashes" + - "shasum -a 256 budducloud-channel-server.tgz > file.hashes" deploy: - provider: bintray skip_cleanup: true From b2b0f65b5014cd6e54fb50279fd49bd0e8b774b8 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 16:04:42 +0200 Subject: [PATCH 62/74] fucketty fuck this is irritating. --- .travis/bintray.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 201b9860..35ba6e6b 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -21,11 +21,13 @@ "files": [ { "includePattern": "budducloud-channel-server.tgz", - "uploadPattern": "budducloud-channel-server.tgz" + "uploadPattern": "budducloud-channel-server.tgz", + "matrixParams": { "override": 1 } }, { "includePattern": "source.hashes", - "uploadPattern": "source.hashes" + "uploadPattern": "source.hashes", + "matrixParams": { "override": 1 } } ], "publish": true From e86deaca0253f2b12852984490e29873bf9dee26 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Fri, 25 Sep 2015 16:15:00 +0200 Subject: [PATCH 63/74] Update bintray.json --- .travis/bintray.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 35ba6e6b..56ce76e4 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -25,8 +25,8 @@ "matrixParams": { "override": 1 } }, { - "includePattern": "source.hashes", - "uploadPattern": "source.hashes", + "includePattern": "file.hashes", + "uploadPattern": "file.hashes", "matrixParams": { "override": 1 } } ], From 35e586966990fa75307558fa7afa8e6b71593c5c Mon Sep 17 00:00:00 2001 From: Ian Date: Mon, 7 Sep 2015 17:21:19 +0100 Subject: [PATCH 64/74] Test for Actor validation improvements * test with an iq originating from not-denmark domain, with actor from the denmark domain. * previously this would have been treated as valid, it is now rejected as invalid. --- .../iq/namespace/pubsub/PubSubSetTest.java | 42 +++++++++++++------ .../stanzas/iq/pubsub/spoof-actor.stanza | 9 ++++ 2 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 src/test/resources/stanzas/iq/pubsub/spoof-actor.stanza diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubSetTest.java index 192333ec..9459c183 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/PubSubSetTest.java @@ -6,17 +6,14 @@ import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.AffiliationsGet; import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.xmpp.packet.IQ; -import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.util.XMPPConstants; public class PubSubSetTest extends IQTestHandler { @@ -31,15 +28,15 @@ public void setUp() throws Exception { pubsubSet = new PubSubSet(queue, channelManager); pubsubSet.purgeElementProcessors(); } - + @Test public void returnsErrorForIllegalActor() throws Exception { IQ request = readStanzaAsIq("/iq/pubsub/bad-actor.stanza"); - + pubsubSet.process(request); Assert.assertEquals(1, queue.size()); IQ response = (IQ) queue.poll(); - + Assert.assertEquals(IQ.Type.error, response.getType()); PacketError error = response.getError(); @@ -49,24 +46,45 @@ public void returnsErrorForIllegalActor() throws Exception { Assert.assertNotNull(response.getElement().element("error").element(XMLConstants.POLICY_VIOLATION)); Assert.assertEquals(XMLConstants.INVALID_NODE, error.getApplicationConditionName()); Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); - + + } + + @Test + public void returnsErrorForSpoofActor() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/spoof-actor.stanza"); + + pubsubSet.process(request); + Assert.assertEquals(1, queue.size()); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.error, response.getType()); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertNotNull(response.getElement().element("error") + .element(XMLConstants.POLICY_VIOLATION)); + Assert.assertEquals(XMLConstants.INVALID_NODE, error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); + } @Test public void ifPacketCanNotBeProcessedShouldReceiveAFeatureNotImplementedError() throws Exception { IQ request = readStanzaAsIq("/iq/pubsub/good-actor.stanza"); - + pubsubSet.process(request); Assert.assertEquals(1, queue.size()); IQ response = (IQ) queue.poll(); - + Assert.assertEquals(IQ.Type.error, response.getType()); - + PacketError error = response.getError(); Assert.assertNotNull(error); - + Assert.assertEquals(PacketError.Type.cancel, error.getType()); Assert.assertEquals(PacketError.Condition.feature_not_implemented, error.getCondition()); } - + } \ No newline at end of file diff --git a/src/test/resources/stanzas/iq/pubsub/spoof-actor.stanza b/src/test/resources/stanzas/iq/pubsub/spoof-actor.stanza new file mode 100644 index 00000000..dfd63397 --- /dev/null +++ b/src/test/resources/stanzas/iq/pubsub/spoof-actor.stanza @@ -0,0 +1,9 @@ + + + + francisco@denmark.lit + + From d48f55c7926daf678658261840029d2acf41b315 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 11:14:24 +0200 Subject: [PATCH 65/74] Update .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bc164fe2..c046c3f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,6 @@ before_deploy: - "shasum -a 256 budducloud-channel-server.tgz > file.hashes" deploy: - provider: bintray - skip_cleanup: true file: ".travis/bintray.json" user: "$BINTRAY_USER" key: "$BINTRAY_API_KEY" From ffb3aa74fa6fe344c40bf884f0c437ec9c8bff48 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 11:46:13 +0200 Subject: [PATCH 66/74] typo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c046c3f5..fe0f5bec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ env: - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= before_deploy: - - "tar cvfz budducloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" + - "tar cvfz buddycloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" - "shasum -a 256 budducloud-channel-server.tgz > file.hashes" deploy: - provider: bintray From 59f2d9d19b3077c277cffcb6e0f6d696b43e2447 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 12:08:56 +0200 Subject: [PATCH 67/74] Update bintray.json --- .travis/bintray.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 56ce76e4..64e79355 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -15,7 +15,7 @@ }, "version": { "name": "latest", - "desc": "Latest Travis-CI build", + "desc": "Latest Travis-CI build from the master branch", "gpgSign": false }, "files": [ From 07ab0b1ebd4c9f61612959ebb06eb6fee99145ac Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 13:09:06 +0200 Subject: [PATCH 68/74] Update bintray.json --- .travis/bintray.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 64e79355..92138f02 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -1,7 +1,7 @@ { "package": { - "name": "buddycloud-server-java", - "repo": "builds", + "name": "builds", + "repo": "buddycloud-server-java", "subject": "buddycloud", "desc": "built by Travis-CI", "website_url": "https://github.com/buddycloud/buddycloud-server-java", From 8d79e22c02f4c7cf6c150800825ff1918b34347e Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 13:13:31 +0200 Subject: [PATCH 69/74] typo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fe0f5bec..6d2da50d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: before_deploy: - "tar cvfz buddycloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" - - "shasum -a 256 budducloud-channel-server.tgz > file.hashes" + - "shasum -a 256 buddycloud-channel-server.tgz > file.hashes" deploy: - provider: bintray file: ".travis/bintray.json" From fa40fc1fe001ff3df25b9f57046887389dcf89cf Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 13:48:50 +0200 Subject: [PATCH 70/74] Update bintray.json --- .travis/bintray.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 92138f02..21141bd1 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -3,7 +3,7 @@ "name": "builds", "repo": "buddycloud-server-java", "subject": "buddycloud", - "desc": "built by Travis-CI", + "desc": "master branch commits built by Travis-CI", "website_url": "https://github.com/buddycloud/buddycloud-server-java", "issue_tracker_url": "https://github.com/buddycloud/buddycloud-server-java/issues", "vcs_url": "https://github.com/buddycloud/buddycloud-server-java.git", @@ -15,13 +15,13 @@ }, "version": { "name": "latest", - "desc": "Latest Travis-CI build from the master branch", + "desc": "master branch commits built by Travis-CI", "gpgSign": false }, "files": [ { - "includePattern": "budducloud-channel-server.tgz", - "uploadPattern": "budducloud-channel-server.tgz", + "includePattern": "buddycloud-channel-server.tgz", + "uploadPattern": "buddycloud-channel-server.tgz", "matrixParams": { "override": 1 } }, { From 1705f8cf4bd331e1d43fc74f5ed0c693ec74bf30 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 13:54:22 +0200 Subject: [PATCH 71/74] Update bintray.json --- .travis/bintray.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/bintray.json b/.travis/bintray.json index 21141bd1..06059445 100644 --- a/.travis/bintray.json +++ b/.travis/bintray.json @@ -20,8 +20,8 @@ }, "files": [ { - "includePattern": "buddycloud-channel-server.tgz", - "uploadPattern": "buddycloud-channel-server.tgz", + "includePattern": "buddycloud-server-java.tgz", + "uploadPattern": "buddycloud-server-java.tgz", "matrixParams": { "override": 1 } }, { From c4f1e435a4315e4bf3844fe02894291352812070 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 13:54:53 +0200 Subject: [PATCH 72/74] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d2da50d..9d7df2c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ env: - secure: N2eLGAMFSWFHgba6i9AW7agX6sIn/fWeF6ELWceTSwUi8ZN18tQqtUgcOGnlLJZPI5mHrqyAMSynxVh81ITaaSHdqRYLMyXnq2yGEG6UC9Ptw3OPf8DgyuDG9bbvMHsEtatJPy7iA1Ltn5KpZmVOkHy+1+BEoOG2G0TyaHpJJXE= before_deploy: - - "tar cvfz buddycloud-channel-server.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" - - "shasum -a 256 buddycloud-channel-server.tgz > file.hashes" + - "tar cvfz buddycloud-server-java.tgz target/channelserver-jar-with-dependencies.jar README.md postgres manual" + - "shasum -a 256 buddycloud-server-java.tgz > file.hashes" deploy: - provider: bintray file: ".travis/bintray.json" From ed380e959db90b140b55151aa301fbc7ebf66c62 Mon Sep 17 00:00:00 2001 From: Simon Tennant Date: Mon, 19 Oct 2015 14:11:37 +0200 Subject: [PATCH 73/74] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d990bb7..69b98ec2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A buddycloud server written in Java, implementing the [buddycloud channels](http Note this points to the main buddycloud repository for the java server. -[![Build Status](https://travis-ci.org/buddycloud/buddycloud-server-java.png?branch=master)](https://travis-ci.org/buddycloud/buddycloud-server-java) [![Coverage Status](https://img.shields.io/coveralls/buddycloud/buddycloud-server-java.svg)](https://coveralls.io/r/buddycloud/buddycloud-server-java) [ ![Download](https://api.bintray.com/packages/buddycloud/builds/buddycloud-server-java/images/download.svg) ](https://bintray.com/buddycloud/builds/buddycloud-server-java/_latestVersion) +[![Build Status](https://travis-ci.org/buddycloud/buddycloud-server-java.png?branch=master)](https://travis-ci.org/buddycloud/buddycloud-server-java) [![Coverage Status](https://img.shields.io/coveralls/buddycloud/buddycloud-server-java.svg)](https://coveralls.io/r/buddycloud/buddycloud-server-java) [ ![Download](https://api.bintray.com/packages/buddycloud/buddycloud-server-java/builds/images/download.svg) ](https://bintray.com/buddycloud/buddycloud-server-java/builds/_latestVersion) # Manual pages From 04b7751fd05c001e2657345483767b2a6515c3ee Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 8 Mar 2016 12:59:16 -0500 Subject: [PATCH 74/74] Upgrade Apache Commons Collections to v3.2.2 Version 3.2.1 has a CVSS 10.0 vulnerability. That's the worst kind of vulnerability that exists. By merely existing on the classpath, this library causes the Java serialization parser for the entire JVM process to go from being a state machine to a turing machine. A turing machine with an exec() function! https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-8103 https://commons.apache.org/proper/commons-collections/security-reports.html http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/ --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 373e7652..c23cb141 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ commons-collections commons-collections - 3.2.1 + 3.2.2 nl.jqno.equalsverifier