package com.openkm.jcr;
import java.io.File;
import java.io.IOException;
import javax.jcr.LoginException;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.api.jsr283.security.AccessControlEntry;
import org.apache.jackrabbit.api.jsr283.security.AccessControlList;
import org.apache.jackrabbit.api.jsr283.security.AccessControlManager;
import org.apache.jackrabbit.api.jsr283.security.AccessControlPolicy;
import org.apache.jackrabbit.api.jsr283.security.AccessControlPolicyIterator;
import org.apache.jackrabbit.api.jsr283.security.Privilege;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.jackrabbit.core.security.authorization.JackrabbitAccessControlList;
import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecurityTest extends TestCase {
private static Logger log = LoggerFactory.getLogger(SecurityTest.class);
public SecurityTest(String name) {
super(name);
}
public static void main(String[] args) throws Exception {
SecurityTest test = new SecurityTest("main");
test.setUp();
test.testGrant();
test.testRevoke();
test.tearDown();
}
@Override
protected void setUp() {
log.debug("setUp()");
log.debug("Delete repository: {}", Config.REPOSITORY_HOME);
FileUtils.deleteQuietly(new File(Config.REPOSITORY_HOME));
}
@Override
protected void tearDown() {
log.debug("tearDown()");
log.debug("Delete repository: {}", Config.REPOSITORY_HOME);
FileUtils.deleteQuietly(new File(Config.REPOSITORY_HOME));
}
/**
*
*/
public void testGrant() throws IOException, LoginException, RepositoryException {
log.info("testGrant()");
Repository repository = new TransientRepository(Config.REPOSITORY_CONFIG, Config.REPOSITORY_HOME);
Session sAdmin = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
Node rootNode = sAdmin.getRootNode();
Node grantedNode = rootNode.addNode("granted");
rootNode.save();
log.info("Granted node: " + grantedNode.getPath());
// User creation
UserManager userManager = ((SessionImpl) sAdmin).getUserManager();
User test = userManager.createUser("test", "test");
User testBis = (User) userManager.getAuthorizable("test");
assertEquals(test.getPrincipal(), testBis.getPrincipal());
// Grant test user
AccessControlManager acm = ((SessionImpl) sAdmin).getAccessControlManager();
AccessControlPolicyIterator acpi = acm.getApplicablePolicies(grantedNode.getPath());
while (acpi.hasNext()) {
AccessControlPolicy acp = acpi.nextAccessControlPolicy();
Privilege[] privileges = new Privilege[] { acm.privilegeFromName(Privilege.JCR_WRITE) };
printPrivileges(log, privileges);
((AccessControlList) acp).addAccessControlEntry(new PrincipalImpl("test"), privileges);
AccessControlEntry[] ace = ((AccessControlList) acp).getAccessControlEntries();
for (int i=0; i<ace.length; i++) {
log.info("AccessControlEntry: "+i);
log.info("Principal: "+ace[i].getPrincipal().getName());
printPrivileges(log, ace[i].getPrivileges());
}
acm.setPolicy(grantedNode.getPath(), acp);
}
// Apply the policy
sAdmin.save();
// Test user login
Session sessionTest = repository.login(new SimpleCredentials("test", "test".toCharArray()));
Node testRootNode = sessionTest.getRootNode();
testRootNode.getNode(grantedNode.getPath().substring(1)).addNode("my node");
testRootNode.save();
sessionTest.logout();
// Admin logout
sAdmin.logout();
}
/**
* http://n4.nabble.com/Jackrabbit-1-5-Security-td519943.html
*/
public void testRevoke() throws IOException, LoginException, RepositoryException {
log.info("testRevoke()");
Repository repository = new TransientRepository(Config.REPOSITORY_CONFIG, Config.REPOSITORY_HOME);
Session sAdmin = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
Node rootNode = sAdmin.getRootNode();
Node revokedNode = rootNode.addNode("revoked");
log.info("Revoked node: " + revokedNode.getPath());
// User creation
UserManager userManager = ((SessionImpl) sAdmin).getUserManager();
User anonymous = (User) userManager.getAuthorizable("anonymous");
// Revoke anonymous user
AccessControlManager acm = ((SessionImpl) sAdmin).getAccessControlManager();
AccessControlPolicyIterator acpi = acm.getApplicablePolicies(revokedNode.getPath());
JackrabbitAccessControlList jacl = (JackrabbitAccessControlList) acpi.nextAccessControlPolicy();
Privilege[] privileges = acm.getSupportedPrivileges(revokedNode.getPath());
printPrivileges(log, privileges);
// Also possible to set a map of restrictions
jacl.addEntry(anonymous.getPrincipal(), privileges, true);
acm.setPolicy(revokedNode.getPath(), jacl);
// Apply the policy
sAdmin.save();
// Test user login
Session sAnonymous = repository.login(new SimpleCredentials("anonymous", "anonymous".toCharArray()));
Node anonRootNode = sAnonymous.getRootNode();
anonRootNode.getNode(revokedNode.getPath().substring(1)).addNode("my node");
anonRootNode.save();
sAnonymous.logout();
// Admin logout
sAdmin.logout();
}
/**
* Modify privileges
*
* modifyPrivileges(VERSION_STORAGE_PATH, Privilege.JCR_READ, false);
*/
//private void modifyPrivileges(String path, String privilege, boolean isAllow) throws NotExecutableException, RepositoryException {
// JackrabbitAccessControlList tmpl = getPolicy(acMgr, path, testUser.getPrincipal());
// tmpl.addEntry(testUser.getPrincipal(), privilegesFromName(privilege), isAllow, getRestrictions(path));
// acMgr.setPolicy(tmpl.getPath(), tmpl);
// superuser.save();
//}
/**
* Get restrictions
*/
//private Map getRestrictions(String path) throws RepositoryException, NotExecutableException {
// if (superuser instanceof SessionImpl) {
// Map restr = new HashMap();
// restr.put(((SessionImpl) superuser).getJCRName(org.apache.jackrabbit.core.security.authorization.principalbased.ACLTemplate.P_NODE_PATH), path);
// return restr;
// } else {
// throw new NotExecutableException();
// }
//}
/**
*
*/
private void printPrivileges(Logger log, Privilege[] privileges) {
for (int i=0; i<privileges.length; i++) {
log.info("Privilege: "+privileges[i].getName()+", aggregated: "+privileges[i].isAggregate());
Privilege[] aggregates = privileges[i].getAggregatePrivileges();
for (int j=0; j<aggregates.length; j++) {
log.info("Aggregate privilege: "+aggregates[j].getName()+", aggregated: "+aggregates[j].isAggregate());
}
}
}
}