package org.argeo.suite.people; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.security.Privilege; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.connect.people.PeopleConstants; import org.argeo.connect.people.PeopleNames; import org.argeo.connect.people.PeopleService; import org.argeo.connect.people.PeopleTypes; import org.argeo.connect.people.ResourceService; import org.argeo.connect.people.core.PeopleServiceImpl; import org.argeo.jcr.JcrUtils; import org.argeo.node.NodeConstants; import org.argeo.suite.SuiteException; /** Default implementation of an Argeo Suite specific People Backend */ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleService, PeopleConstants { private final static Log log = LogFactory.getLog(PeopleSuiteServiceImpl.class); /* DEPENDENCY INJECTION */ private Repository repository; private String workspaceName; // private UserAdminService userAdminService; public void init() { super.init(); Session adminSession = null; try { adminSession = repository.login(workspaceName); initialiseModel(adminSession); } catch (Exception e) { throw new SuiteException("Cannot initialise model", e); } finally { JcrUtils.logoutQuietly(adminSession); } } // HELPERS // TODO Hard-coded creation of default public and shared file directories // To be cleaned once first init and configuration mechanisms have been // implemented private final static String publicPath = "/public"; private final static String sharedFilePath = "/sharedFiles"; @Override protected void initialiseModel(Session adminSession) throws RepositoryException { super.initialiseModel(adminSession); JcrUtils.mkdirs(adminSession, publicPath, NodeType.NT_UNSTRUCTURED); JcrUtils.mkdirs(adminSession, sharedFilePath, NodeType.NT_FOLDER); initModelResources(adminSession); if (adminSession.hasPendingChanges()) { adminSession.save(); log.info("Repository has been initialized " + "with People's model"); configureACL(adminSession); } } // First draft of configuration of the people specific rights private void configureACL(Session session) throws RepositoryException { String memberGroupDn = "cn=" + PeopleConstants.ROLE_MEMBER + ",ou=roles,ou=node"; JcrUtils.addPrivilege(session, getBasePath(null), memberGroupDn, Privilege.JCR_ALL); JcrUtils.addPrivilege(session, "/", NodeConstants.ROLE_ADMIN, Privilege.JCR_ALL); JcrUtils.addPrivilege(session, publicPath, NodeConstants.ROLE_USER, Privilege.JCR_READ); JcrUtils.addPrivilege(session, publicPath, "anonymous", Privilege.JCR_READ); JcrUtils.addPrivilege(session, publicPath, NodeConstants.ROLE_ANONYMOUS, Privilege.JCR_READ); JcrUtils.addPrivilege(session, sharedFilePath, NodeConstants.ROLE_USER, Privilege.JCR_ALL); session.save(); log.info("Access control configured"); } /** * Initialises People resource model and optionally imports legacy resources */ protected void initModelResources(Session adminSession) throws RepositoryException { // initialisation ResourceService resourceService = getResourceService(); resourceService.initialiseResources(adminSession); // Resource resource = initResources.get("Countries"); // if (resourceService.getTagLikeResourceParent(adminSession, // PeopleConstants.RESOURCE_COUNTRY) == null // && resource != null) { // resourceService.createTagLikeResourceParent(adminSession, // PeopleConstants.RESOURCE_COUNTRY, // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE, // getBasePath(null), // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new // ArrayList()); // String EN_SHORT_NAME = "English short name (upper-lower case)"; // String ISO_CODE = "Alpha-2 code"; // new EncodedTagCsvFileParser(resourceService, adminSession, // PeopleConstants.RESOURCE_COUNTRY, ISO_CODE, // EN_SHORT_NAME).parse(resource.getInputStream(), "UTF-8"); // } // // resource = initResources.get("Languages"); // if (resourceService.getTagLikeResourceParent(adminSession, // PeopleConstants.RESOURCE_LANG) == null // && resource != null) { // resourceService.createTagLikeResourceParent(adminSession, // PeopleConstants.RESOURCE_LANG, // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE, // getBasePath(null), // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new // ArrayList()); // String EN_SHORT_NAME = "Language name"; // String ISO_CODE = "639-1"; // new EncodedTagCsvFileParser(resourceService, adminSession, // PeopleConstants.RESOURCE_LANG, ISO_CODE, // EN_SHORT_NAME).parse(resource.getInputStream(), "UTF-8"); // } // Create tag & mailing list parents if (resourceService.getTagLikeResourceParent(adminSession, PeopleConstants.RESOURCE_TAG) == null) resourceService.createTagLikeResourceParent(adminSession, PeopleConstants.RESOURCE_TAG, PeopleTypes.PEOPLE_TAG_INSTANCE, null, getBasePath(null), PeopleTypes.PEOPLE_ENTITY, PeopleNames.PEOPLE_TAGS); if (resourceService.getTagLikeResourceParent(adminSession, PeopleTypes.PEOPLE_MAILING_LIST) == null) resourceService.createTagLikeResourceParent(adminSession, null, PeopleTypes.PEOPLE_MAILING_LIST, null, getBasePath(null), PeopleTypes.PEOPLE_ENTITY, PeopleNames.PEOPLE_MAILING_LISTS); if (adminSession.hasPendingChanges()) { adminSession.save(); log.info("Resources have been added to People's model"); } } /* DEPENDENCY INJECTION */ public void setRepository(Repository repository) { this.repository = repository; } public void setWorkspaceName(String workspaceName) { this.workspaceName = workspaceName; } }