blob: 7701559089f503a3aac2f9f37282e08a4149b3fd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.oak.security.user;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.util.NodeUtil;
import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
import org.junit.Before;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
/**
* @since OAK 1.0
*/
public class MembershipProviderTest extends MembershipBaseTest {
@Before
public void before() throws Exception {
super.before();
}
@Test
public void testRemoveMember() throws Exception {
Group gr = createGroup();
User member = createUser();
gr.addMember(member);
assertTrue(mp.removeMember(getTree(gr), getTree(member)));
}
@Test
public void testRemoveMembers() throws Exception {
Group gr = createGroup();
User member = createUser();
Group member2 = createGroup();
gr.addMembers(member.getID(), member2.getID());
Map m = Maps.newHashMap();
m.put(getContentID(member.getID()), member.getID());
m.put(getContentID(member2.getID()), member2.getID());
Set<String> failed = mp.removeMembers(getTree(gr), m);
assertTrue(failed.isEmpty());
}
@Test
public void testRemoveNonMember() throws Exception {
assertFalse(mp.removeMember(getTree(createGroup()), getTree(getTestUser())));
}
@Test
public void testRemoveNonMembers() throws Exception {
Map<String, String> nonMemberIds = createIdMap(1, 5);
Set<String> expected = Sets.newHashSet(nonMemberIds.values());
Set<String> failed = mp.removeMembers(getTree(createGroup()), nonMemberIds);
assertEquals(expected, failed);
}
@Test
public void testAddMemberAgain() throws Exception {
Group grp = createGroup();
List<String> memberPaths = createMembers(grp, NUM_USERS);
root.commit();
Tree groupTree = root.getTree(grp.getPath());
for (String path : memberPaths) {
Tree memberTree = root.getTree(path);
assertFalse(mp.addMember(groupTree, memberTree));
}
}
@Test
public void testAddMembersAgain() throws Exception {
Group grp = createGroup();
List<String> memberPaths = createMembers(grp, NUM_USERS);
root.commit();
Map<String, String> m = new HashMap();
for (String path : memberPaths) {
Tree memberTree = root.getTree(path);
String memberId = TreeUtil.getString(memberTree, REP_AUTHORIZABLE_ID);
m.put(getContentID(memberTree), memberId);
}
Set<String> expected = Sets.newHashSet(m.values());
Set<String> failed = mp.addMembers(getTree(grp), m);
assertFalse(failed.isEmpty());
assertEquals(expected, failed);
}
@Test
public void testIsDeclaredMemberTransient() throws Exception {
Group g = createGroup();
List<String> memberPaths = createMembers(g, NUM_USERS/2);
// test declared members with transient modifications
for (String path : memberPaths) {
assertTrue(mp.isDeclaredMember(getTree(g), getTree(path)));
}
}
@Test
public void testIsDeclaredMember() throws Exception {
Group g = createGroup();
List<String> memberPaths = createMembers(g, NUM_USERS/2);
root.commit();
// test declared members after commit
for (String path : memberPaths) {
assertTrue(mp.isDeclaredMember(getTree(g), getTree(path)));
}
}
@Test
public void testIsDeclaredMemberFew() throws Exception {
Group g = createGroup();
Group m1 = createGroup();
User m2 = createUser();
g.addMembers(m1.getID(), m2.getID());
Tree groupTree = getTree(g);
// test declared members with transient modifications
assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
// ... and after commit
root.commit();
assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
}
@Test
public void testIsDeclaredMemberMissingMembersProperty() throws Exception {
Tree grTree = getTree(createGroup());
Tree memberTree = getTree(createUser());
NodeUtil memberList = new NodeUtil(grTree).addChild(REP_MEMBERS_LIST, NT_REP_MEMBER_REFERENCES_LIST);
memberList.addChild("member1", NT_REP_MEMBER_REFERENCES).setStrings(REP_MEMBERS, getContentID(memberTree));
assertTrue(mp.isDeclaredMember(grTree, memberTree));
}
@Test
public void testNotIsDeclaredMemberMissingMembersProperty() throws Exception {
Tree grTree = getTree(createGroup());
Tree memberTree = getTree(createUser());
NodeUtil memberList = new NodeUtil(grTree).addChild(REP_MEMBERS_LIST, NT_REP_MEMBER_REFERENCES_LIST);
memberList.addChild("member1", NT_REP_MEMBER_REFERENCES).setStrings(REP_MEMBERS, getContentID("another"));
assertFalse(mp.isDeclaredMember(grTree, memberTree));
}
@Test
public void testIsMemberTransient() throws Exception {
Group g = createGroup();
Group g2 = createGroup();
g.addMember(g2);
List<String> memberPaths = createMembers(g2, NUM_USERS);
Tree groupTree = getTree(g);
// test members with transient modifications
for (String path : memberPaths) {
Tree tree = getTree(path);
assertFalse(mp.isDeclaredMember(groupTree, tree));
assertTrue(mp.isMember(groupTree, tree));
}
}
@Test
public void testIsMember() throws Exception {
Group g = createGroup();
Group g2 = createGroup();
g.addMember(g2);
List<String> memberPaths = createMembers(g2, NUM_USERS/2);
root.commit();
// test members after commit
Tree groupTree = getTree(g);
for (String path : memberPaths) {
Tree tree = getTree(path);
assertFalse(mp.isDeclaredMember(groupTree, tree));
assertTrue(mp.isMember(groupTree, tree));
}
}
@Test
public void testIsMemberFew() throws Exception {
Group g = createGroup();
Group g2 = createGroup();
g.addMember(g2);
User m1 = createUser();
Group m2 = createGroup();
g2.addMember(m1);
g2.addMember(m2);
Tree groupTree = getTree(g);
// test members with transient modifications
assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
assertTrue(mp.isMember(groupTree, getTree(m1)));
assertTrue(mp.isMember(groupTree, getTree(m2)));
// ... and after commit
root.commit();
assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
assertTrue(mp.isMember(groupTree, getTree(m1)));
assertTrue(mp.isMember(groupTree, getTree(m2)));
}
@Test
public void testTransientInMembersList() throws Exception {
Group g = createGroup();
createMembers(g, NUM_USERS/2);
root.commit();
// add another transient member that will end up in the members-ref-list
User u = createUser();
g.addMember(u);
Tree groupTree = getTree(g);
Tree memberTree = getTree(u);
assertTrue(mp.isDeclaredMember(groupTree, memberTree));
assertTrue(mp.isMember(groupTree, memberTree));
assertFalse(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
assertFalse(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
root.commit();
assertTrue(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
assertTrue(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
}
@Test
public void testNoMember() throws Exception {
Tree groupTree = getTree(createGroup());
Tree notMember = getTree(createGroup());
Tree notMember2 = getTree(createUser());
assertFalse(mp.isDeclaredMember(groupTree, notMember));
assertFalse(mp.isDeclaredMember(groupTree, notMember2));
assertFalse(mp.isMember(groupTree, notMember));
assertFalse(mp.isMember(groupTree, notMember2));
root.commit();
assertFalse(mp.isDeclaredMember(groupTree, notMember));
assertFalse(mp.isDeclaredMember(groupTree, notMember2));
assertFalse(mp.isMember(groupTree, notMember));
assertFalse(mp.isMember(groupTree, notMember2));
}
@Test
public void testGetMembersWithRemoved() throws Exception {
Group g = createGroup();
Group member = createGroup();
g.addMember(member);
member.remove();
root.commit();
assertFalse(mp.getMembers(getTree(g), false).hasNext());
assertFalse(mp.getMembers(getTree(g), true).hasNext());
}
@Test
public void testGetMembersInherited() throws Exception {
Group g = createGroup();
Group member = createGroup();
g.addMember(member);
member.addMember(createUser());
root.commit();
Iterator<String> res = mp.getMembers(getTree(g), true);
assertEquals(2, Iterators.size(res));
}
@Test
public void testGetMembersWithDuplicates() throws Exception {
Group g = createGroup();
Group member = createGroup();
g.addMember(member);
User user = createUser();
member.addMember(user);
g.addMember(user);
root.commit();
Iterator<String> res = mp.getMembers(getTree(g), true);
assertEquals(2, Iterators.size(res));
}
@Test
public void testGetMembers() throws Exception {
Group g = createGroup();
Group member = createGroup();
g.addMember(member);
member.addMember(createUser());
root.commit();
Iterator<String> res = mp.getMembers(getTree(g), false);
assertEquals(1, Iterators.size(res));
}
@Test
public void testGetMembershipInherited() throws Exception {
User user = createUser();
Group g = createGroup();
Group member = createGroup();
Group member2 = createGroup();
g.addMember(member);
member.addMember(member2);
member2.addMember(user);
root.commit();
Iterator<String> res = mp.getMembership(getTree(user), true);
assertEquals(3, Iterators.size(res));
}
@Test
public void testGetMembershipWithDuplicates() throws Exception {
User user = createUser();
Group g = createGroup();
Group member = createGroup();
Group member2 = createGroup();
g.addMember(member);
g.addMember(member2);
member.addMember(member2);
member2.addMember(user);
root.commit();
Iterator<String> res = mp.getMembership(getTree(user), true);
assertEquals(3, Iterators.size(res));
}
@Test
public void testGetMembership() throws Exception {
User user = createUser();
Group g = createGroup();
Group member = createGroup();
Group member2 = createGroup();
g.addMember(member);
member.addMember(member2);
member2.addMember(user);
root.commit();
Iterator<String> res = mp.getMembership(getTree(user), false);
assertEquals(1, Iterators.size(res));
}
}