Skip to content

Commit 6306a02

Browse files
author
Lloyd Watkin
committed
Update NodeViewAcl + items gathering to support 'local' access model
1 parent 0ce0235 commit 6306a02

10 files changed

Lines changed: 98 additions & 47 deletions

File tree

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public NodeThreadsGet(BlockingQueue<Packet> outQueue,
3939
setChannelManager(channelManager);
4040
setOutQueue(outQueue);
4141
}
42-
42+
4343
@Override
4444
public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm)
4545
throws Exception {
@@ -48,7 +48,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm)
4848
this.actor = actorJID;
4949
this.resultSetManagement = rsm;
5050
this.max = MAX_THREADS_TO_RETURN;
51-
51+
5252
if (actor == null) {
5353
actor = request.getFrom();
5454
}
@@ -77,13 +77,14 @@ private void addRsmElement() throws NodeStoreException {
7777
Element rsm = pubsubEl.addElement("set", NS_RSM);
7878
rsm.addElement("first", NS_RSM).setText(firstItem);
7979
rsm.addElement("last", NS_RSM).setText(lastItem);
80-
80+
8181
Integer nodeThreadCount = channelManager.countNodeThreads(node);
8282
rsm.addElement("count", NS_RSM).setText(nodeThreadCount.toString());
8383
}
8484

8585
private void getNodeThreads() throws NodeStoreException, DocumentException {
86-
ResultSet<NodeThread> nodeThreads = channelManager.getNodeThreads(node, afterId, max);
86+
ResultSet<NodeThread> nodeThreads = channelManager.getNodeThreads(node,
87+
afterId, max);
8788
this.response = IQ.createResultIQ(request);
8889
Element pubsubEl = response.getElement().addElement("pubsub",
8990
JabberPubsub.NAMESPACE_URI);
@@ -92,8 +93,8 @@ private void getNodeThreads() throws NodeStoreException, DocumentException {
9293
Element threadEl = pubsubEl.addElement("thread");
9394
threadEl.addAttribute("node", node);
9495
threadEl.addAttribute("id", nodeThread.getId());
95-
threadEl.addAttribute("updated", Conf.formatDate(
96-
nodeThread.getUpdated()));
96+
threadEl.addAttribute("updated",
97+
Conf.formatDate(nodeThread.getUpdated()));
9798
ResultSet<NodeItem> items = nodeThread.getItems();
9899
for (NodeItem item : items) {
99100
Element entry = xmlReader.read(
@@ -122,15 +123,16 @@ private boolean isValidStanza() throws NodeStoreException {
122123
}
123124
return true;
124125
}
125-
126-
private AccessModels getNodeAccessModel(Map<String, String> nodeConfiguration) {
126+
127+
private AccessModels getNodeAccessModel(
128+
Map<String, String> nodeConfiguration) {
127129
if (!nodeConfiguration.containsKey(AccessModel.FIELD_NAME)) {
128130
return AccessModels.authorize;
129131
}
130132
return AccessModels.createFromString(nodeConfiguration
131133
.get(AccessModel.FIELD_NAME));
132134
}
133-
135+
134136
private boolean userCanViewNode() throws NodeStoreException {
135137
NodeSubscription nodeSubscription = channelManager.getUserSubscription(
136138
node, actor);
@@ -144,19 +146,21 @@ private boolean userCanViewNode() throws NodeStoreException {
144146
subscription = nodeSubscription.getSubscription();
145147
}
146148
NodeViewAcl nodeViewAcl = new NodeViewAcl();
147-
Map<String, String> nodeConfiguration = channelManager.getNodeConf(node);
148-
149-
if (nodeViewAcl.canViewNode(node, affiliation, subscription,
150-
getNodeAccessModel(nodeConfiguration))) {
149+
Map<String, String> nodeConfiguration = channelManager
150+
.getNodeConf(node);
151+
152+
if (nodeViewAcl.canViewNode(node, affiliation, subscription,
153+
getNodeAccessModel(nodeConfiguration),
154+
channelManager.isLocalJID(actor))) {
151155
return true;
152156
}
153-
157+
154158
NodeAclRefuseReason reason = nodeViewAcl.getReason();
155159
createExtendedErrorReply(reason.getType(), reason.getCondition(),
156160
reason.getAdditionalErrorElement());
157161
return false;
158162
}
159-
163+
160164
private boolean parseRsmElement() throws NodeStoreException {
161165
if (resultSetManagement == null) {
162166
return true;
@@ -176,7 +180,7 @@ private boolean parseRsmElement() throws NodeStoreException {
176180
}
177181
return true;
178182
}
179-
183+
180184
@Override
181185
public boolean accept(Element elm) {
182186
return elm.getName().equals("threads");

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ private boolean userCanViewNode() throws NodeStoreException {
212212
}
213213
if (true == getNodeViewAcl().canViewNode(node,
214214
possibleExistingAffiliation, possibleExistingSubscription,
215-
getNodeAccessModel())) {
215+
getNodeAccessModel(), channelManager.isLocalJID(actor))) {
216216
return true;
217217
}
218218
NodeAclRefuseReason reason = getNodeViewAcl().getReason();

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ private boolean userCanViewNode() throws NodeStoreException {
220220
}
221221
if (true == getNodeViewAcl().canViewNode(node,
222222
possibleExistingAffiliation, possibleExistingSubscription,
223-
getNodeAccessModel())) {
223+
getNodeAccessModel(), channelManager.isLocalJID(actor))) {
224224
return true;
225225
}
226226
NodeAclRefuseReason reason = getNodeViewAcl().getReason();

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserItemsGet.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public class UserItemsGet implements PubSubElementProcessor {
4848
private SAXReader xmlReader;
4949
private Element entry;
5050
private IQ requestIq;
51-
private JID fetchersJid;
5251
private IQ reply;
5352
private Element resultSetManagement;
5453
private Element element;
@@ -60,6 +59,8 @@ public class UserItemsGet implements PubSubElementProcessor {
6059

6160
private int rsmEntriesCount;
6261

62+
private JID actor;
63+
6364
public UserItemsGet(BlockingQueue<Packet> outQueue,
6465
ChannelManager channelManager) {
6566
this.outQueue = outQueue;
@@ -104,7 +105,10 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm)
104105
isCached = channelManager.isCachedNode(node);
105106
}
106107

107-
fetchersJid = requestIq.getFrom();
108+
this.actor = actorJID;
109+
if (null == this.actor) {
110+
this.actor = requestIq.getFrom();
111+
}
108112

109113
if (!channelManager.isLocalNode(node) && !isCached) {
110114
logger.debug("Node " + node
@@ -121,10 +125,6 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm)
121125
return;
122126
}
123127

124-
if (actorJID != null) {
125-
fetchersJid = actorJID;
126-
}
127-
128128
if (!userCanViewNode()) {
129129
outQueue.put(reply);
130130
return;
@@ -278,9 +278,9 @@ private void getItems() throws Exception {
278278

279279
private boolean userCanViewNode() throws NodeStoreException {
280280
NodeSubscription nodeSubscription = channelManager.getUserSubscription(
281-
node, fetchersJid);
281+
node, actor);
282282
NodeAffiliation nodeAffiliation = channelManager.getUserAffiliation(
283-
node, fetchersJid);
283+
node, actor);
284284

285285
Affiliations possibleExistingAffiliation = Affiliations.none;
286286
Subscriptions possibleExistingSubscription = Subscriptions.none;
@@ -295,7 +295,7 @@ private boolean userCanViewNode() throws NodeStoreException {
295295
}
296296
if (getNodeViewAcl().canViewNode(node,
297297
possibleExistingAffiliation, possibleExistingSubscription,
298-
getNodeAccessModel())) {
298+
getNodeAccessModel(), channelManager.isLocalJID(actor))) {
299299
return true;
300300
}
301301
NodeAclRefuseReason reason = getNodeViewAcl().getReason();

src/main/java/org/buddycloud/channelserver/pubsub/accessmodel/AccessModels.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
public enum AccessModels {
44

5-
authorize, open, presence, roster, whitelist;
5+
authorize, open, presence, roster, whitelist, local;
66

77
public static AccessModels createFromString(String asString) {
88

@@ -16,6 +16,8 @@ public static AccessModels createFromString(String asString) {
1616
return roster;
1717
} else if ("whitelist".equals(asString)) {
1818
return whitelist;
19+
} else if ("local".equals(asString)) {
20+
return local;
1921
}
2022
return authorize;
2123
}

src/main/java/org/buddycloud/channelserver/utils/node/NodeViewAcl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public class NodeViewAcl {
2020
private NodeAclRefuseReason reasonForRefusal;
2121

2222
public boolean canViewNode(String node, Affiliations affilliation,
23-
Subscriptions subscription, AccessModels accessModel) {
23+
Subscriptions subscription, AccessModels accessModel, boolean isLocalUser) {
2424
LOGGER.trace("Being asked for access to " + node + " with properties "
25-
+ affilliation + " :: " + subscription + " :: " + accessModel);
25+
+ affilliation + " :: " + subscription + " :: " + accessModel + " :: local user (" + String.valueOf(isLocalUser) + ")");
2626
reasonForRefusal = null;
2727

2828
if (Affiliations.outcast.toString().equals(affilliation.toString())) {
@@ -37,6 +37,11 @@ public boolean canViewNode(String node, Affiliations affilliation,
3737
return privateChannelAcl(node, subscription, affilliation);
3838
} else if (accessModel.toString().equals(AccessModels.whitelist.toString())) {
3939
return whitelistAcl(node, subscription, affilliation);
40+
} else if (accessModel.toString().equals(AccessModels.local.toString())) {
41+
if (true == isLocalUser) {
42+
return openChannelAcl(node, subscription, affilliation);
43+
}
44+
return privateChannelAcl(node, subscription, affilliation);
4045
}
4146
throw new InvalidParameterException(INVALID_ACCESS_MODEL);
4247
}

src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public void setUp() throws Exception {
8888
.canViewNode(Mockito.anyString(),
8989
Mockito.any(Affiliations.class),
9090
Mockito.any(Subscriptions.class),
91-
Mockito.any(AccessModels.class));
91+
Mockito.any(AccessModels.class),
92+
Mockito.anyBoolean());
9293
}
9394

9495
@Test
@@ -158,7 +159,8 @@ public void testUserWhoCantAccessChannelGetsPermissionErrorStanzaReply()
158159
.canViewNode(Mockito.anyString(),
159160
Mockito.any(Affiliations.class),
160161
Mockito.any(Subscriptions.class),
161-
Mockito.any(AccessModels.class));
162+
Mockito.any(AccessModels.class),
163+
Mockito.anyBoolean());
162164
NodeAclRefuseReason refusalReason = new NodeAclRefuseReason(
163165
PacketError.Type.auth, PacketError.Condition.forbidden,
164166
"pending-subscription");

src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGetTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public void setUp() throws Exception {
8888
.canViewNode(Mockito.anyString(),
8989
Mockito.any(Affiliations.class),
9090
Mockito.any(Subscriptions.class),
91-
Mockito.any(AccessModels.class));
91+
Mockito.any(AccessModels.class),
92+
Mockito.anyBoolean());
9293
}
9394

9495
@Test
@@ -158,7 +159,8 @@ public void testUserWhoCantAccessChannelGetsPermissionErrorStanzaReply()
158159
.canViewNode(Mockito.anyString(),
159160
Mockito.any(Affiliations.class),
160161
Mockito.any(Subscriptions.class),
161-
Mockito.any(AccessModels.class));
162+
Mockito.any(AccessModels.class),
163+
Mockito.anyBoolean());
162164
NodeAclRefuseReason refusalReason = new NodeAclRefuseReason(
163165
PacketError.Type.auth, PacketError.Condition.forbidden,
164166
"pending-subscription");

src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserItemsGetTest.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ public void testSubscriptionIncompatibleWithItemRetrievalReturnsExpectedStanza()
152152
.canViewNode(Mockito.anyString(),
153153
Mockito.any(Affiliations.class),
154154
Mockito.any(Subscriptions.class),
155-
Mockito.any(AccessModels.class));
155+
Mockito.any(AccessModels.class),
156+
Mockito.anyBoolean());
156157
NodeAclRefuseReason refusalReason = new NodeAclRefuseReason(
157158
PacketError.Type.auth, PacketError.Condition.forbidden,
158159
"pending-subscription");
@@ -203,7 +204,8 @@ public void testStandardNodeWithNoItemsReturnsNoItems() throws Exception {
203204
.canViewNode(Mockito.anyString(),
204205
Mockito.any(Affiliations.class),
205206
Mockito.any(Subscriptions.class),
206-
Mockito.any(AccessModels.class));
207+
Mockito.any(AccessModels.class),
208+
Mockito.anyBoolean());
207209
itemsGet.setNodeViewAcl(nodeViewAclMock);
208210

209211
itemsGet.process(element, jid, request, null);
@@ -250,7 +252,8 @@ public void testSubscriptionsNodeWithNoItemsReturnsNoItems()
250252
.canViewNode(Mockito.anyString(),
251253
Mockito.any(Affiliations.class),
252254
Mockito.any(Subscriptions.class),
253-
Mockito.any(AccessModels.class));
255+
Mockito.any(AccessModels.class),
256+
Mockito.anyBoolean());
254257
itemsGet.setNodeViewAcl(nodeViewAclMock);
255258

256259
itemsGet.process(element, jid, request, null);
@@ -308,7 +311,8 @@ public void testUnparsableNodeEntryIsIgnoredInItemsResponse()
308311
.canViewNode(Mockito.anyString(),
309312
Mockito.any(Affiliations.class),
310313
Mockito.any(Subscriptions.class),
311-
Mockito.any(AccessModels.class));
314+
Mockito.any(AccessModels.class),
315+
Mockito.anyBoolean());
312316
itemsGet.setNodeViewAcl(nodeViewAclMock);
313317

314318
itemsGet.process(element, jid, request, null);
@@ -364,7 +368,8 @@ public void testPostsNodeReturnsItemsAsExpected() throws Exception {
364368
.canViewNode(Mockito.anyString(),
365369
Mockito.any(Affiliations.class),
366370
Mockito.any(Subscriptions.class),
367-
Mockito.any(AccessModels.class));
371+
Mockito.any(AccessModels.class),
372+
Mockito.anyBoolean());
368373
itemsGet.setNodeViewAcl(nodeViewAclMock);
369374

370375
itemsGet.process(element, jid, request, null);
@@ -455,7 +460,8 @@ public void testSubscriberThatHasNoSubscribersDoesNotCauseError()
455460
.canViewNode(Mockito.anyString(),
456461
Mockito.any(Affiliations.class),
457462
Mockito.any(Subscriptions.class),
458-
Mockito.any(AccessModels.class));
463+
Mockito.any(AccessModels.class),
464+
Mockito.anyBoolean());
459465
itemsGet.setNodeViewAcl(nodeViewAclMock);
460466

461467
itemsGet.process(element, jid, request, null);
@@ -536,7 +542,8 @@ public void testSubscriptionsNodeReturnsItemsAsExpected() throws Exception {
536542
.canViewNode(Mockito.anyString(),
537543
Mockito.any(Affiliations.class),
538544
Mockito.any(Subscriptions.class),
539-
Mockito.any(AccessModels.class));
545+
Mockito.any(AccessModels.class),
546+
Mockito.anyBoolean());
540547
itemsGet.setNodeViewAcl(nodeViewAclMock);
541548

542549
itemsGet.process(element, jid, request, null);

src/test/java/org/buddycloud/channelserver/utils/node/NodeViewAclTest.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ public class NodeViewAclTest extends TestCase {
2424
public void testPassingInvalidAccessModelThrowsException() {
2525

2626
try {
27-
/*acl.canViewNode(node, Affiliations.member,
28-
Subscriptions.none, "invalid-access-model");*/
27+
/*
28+
* acl.canViewNode(node, Affiliations.member, Subscriptions.none,
29+
* "invalid-access-model");
30+
*/
2931
} catch (Exception e) {
3032
assertSame(InvalidParameterException.class, e.getClass());
3133
return;
@@ -198,11 +200,32 @@ public void testNoAffiliationOnSubscribedNodeRefusesItemRetrieval() {
198200
PacketError.Type.auth, PacketError.Condition.not_authorized);
199201
}
200202

203+
@Test
204+
public void testLocalUserCanViewNodeWithLocalAccessModel() {
205+
checkForAllowedAccess(Affiliations.none, Subscriptions.none,
206+
AccessModels.local, true);
207+
}
208+
209+
@Test
210+
public void testRemoteUserCantViewNodeWithLocalAccessModel() {
211+
checkForBlockedAccess(Affiliations.none, Subscriptions.none,
212+
AccessModels.local, false, NodeViewAcl.CLOSED_NODE,
213+
PacketError.Type.auth, PacketError.Condition.forbidden);
214+
}
215+
201216
private void checkForBlockedAccess(Affiliations affiliation,
202217
Subscriptions subscription, AccessModels accessModel,
203218
String additionalError, Type type, Condition condition) {
204-
assertFalse(acl.canViewNode(node, affiliation,
205-
subscription, accessModel));
219+
checkForBlockedAccess(affiliation, subscription, accessModel, true,
220+
additionalError, type, condition);
221+
}
222+
223+
private void checkForBlockedAccess(Affiliations affiliation,
224+
Subscriptions subscription, AccessModels accessModel,
225+
boolean isLocalUser, String additionalError, Type type,
226+
Condition condition) {
227+
assertFalse(acl.canViewNode(node, affiliation, subscription,
228+
accessModel, isLocalUser));
206229
assertEquals(type, acl.getReason().getType());
207230
assertEquals(condition, acl.getReason().getCondition());
208231
assertEquals(additionalError, acl.getReason()
@@ -211,8 +234,14 @@ private void checkForBlockedAccess(Affiliations affiliation,
211234

212235
private void checkForAllowedAccess(Affiliations affiliation,
213236
Subscriptions subscription, AccessModels accessModel) {
214-
assertTrue(acl.canViewNode(node, affiliation,
215-
subscription, accessModel));
237+
checkForAllowedAccess(affiliation, subscription, accessModel, true);
238+
}
239+
240+
private void checkForAllowedAccess(Affiliations affiliation,
241+
Subscriptions subscription, AccessModels accessModel,
242+
boolean isLocalUser) {
243+
assertTrue(acl.canViewNode(node, affiliation, subscription,
244+
accessModel, isLocalUser));
216245
assertNull(acl.getReason());
217246
}
218247
}

0 commit comments

Comments
 (0)