package com.constellio.app.ui.pages.collection; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import java.util.ArrayList; import java.util.List; import com.constellio.app.ui.entities.GlobalGroupVO; import com.constellio.app.ui.entities.MetadataSchemaVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.RecordVO.VIEW_MODE; import com.constellio.app.ui.entities.RoleVO; import com.constellio.app.ui.entities.UserCredentialVO; import com.constellio.app.ui.framework.builders.GlobalGroupToVOBuilder; import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder; import com.constellio.app.ui.framework.builders.RecordToVOBuilder; import com.constellio.app.ui.framework.builders.UserCredentialToVOBuilder; import com.constellio.app.ui.framework.components.fields.lookup.LookupField.TextInputDataProvider; import com.constellio.app.ui.framework.data.GlobalGroupVODataProvider; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.framework.data.UserCredentialVODataProvider; import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.Group; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.entities.security.Role; import com.constellio.model.entities.security.global.GlobalGroup; import com.constellio.model.entities.security.global.GlobalGroupStatus; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.logging.LoggingServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.model.services.security.roles.RolesManager; import com.constellio.model.services.users.UserServices; // After rename CollectionSecurityManagementPresenter public class ListCollectionUserPresenter extends SingleSchemaBasePresenter<ListCollectionUserView> { public ListCollectionUserPresenter(ListCollectionUserView view) { super(view, User.DEFAULT_SCHEMA); } public RecordVODataProvider getDataProvider() { List<String> metadataCodes = new ArrayList<>(); String schemaCode = getSchemaCode(); metadataCodes.add(schemaCode + "_id"); metadataCodes.add(schemaCode + "_title"); MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder().build( defaultSchema(), VIEW_MODE.TABLE, metadataCodes, view.getSessionContext()); RecordToVOBuilder voBuilder = new RecordToVOBuilder(); return new RecordVODataProvider(schemaVO, voBuilder, modelLayerFactory, view.getSessionContext()) { @Override protected LogicalSearchQuery getQuery() { return new LogicalSearchQuery() .setCondition(from(defaultSchema()).where(Schemas.LOGICALLY_DELETED_STATUS).isFalseOrNull()) .sortAsc(Schemas.TITLE); } }; } public void addButtonClicked(UserCredentialVO userCredentialVO, String roleCode) { UserServices userServices = modelLayerFactory.newUserServices(); UserCredential userCredential = userServices.getUserCredential(userCredentialVO.getUsername()); userServices.addUserToCollection(userCredential, view.getCollection()); roleUserAdditionRequested(userCredentialVO.getUsername(), roleCode); LoggingServices loggingServices = modelLayerFactory.newLoggingServices(); loggingServices.addUser(getUser(userCredentialVO.getUsername()), getCurrentUser()); view.refreshTable(); } public void displayButtonClicked(RecordVO entity) { view.navigate().to().displayCollectionUser(entity.getId()); } public void accessAuthorizationsButtonClicked(RecordVO entity) { view.navigate().to().listPrincipalAccessAuthorizations(entity.getId()); } public void deleteButtonClicked(RecordVO entity) { if (entity.getId().equals(getCurrentUserId())) { view.showErrorMessage($("ListCollectionUserView.cannotRemoveSelf")); return; } UserServices userServices = modelLayerFactory.newUserServices(); User user = coreSchemas().getUser(entity.getId()); removeRoles(user); UserCredential userCredential = userServices.getUserCredential(user.getUsername()); userServices.removeUserFromCollection(userCredential, view.getCollection()); LoggingServices loggingServices = modelLayerFactory.newLoggingServices(); loggingServices.removeUser(user.getWrappedRecord(), getCurrentUser()); view.refreshTable(); } private void removeRoles(User user) { user.setUserRoles(""); addOrUpdate(user.getWrappedRecord()); } public TextInputDataProvider<UserCredentialVO> getUserLookupProvider() { final UserCredentialVODataProvider provider = new UserCredentialVODataProvider( new UserCredentialToVOBuilder(), modelLayerFactory, null); provider.setUserCredentialVOs(provider.listActiveUserCredentialVOs()); return new TextInputDataProvider<UserCredentialVO>() { @Override public List<UserCredentialVO> getData(String text, int startIndex, int count) { provider.setFilter(text); int endIndex = Math.min(startIndex + count, provider.size()); return provider.listUserCredentialVOs().subList(startIndex, endIndex); } @Override public int size(String text) { provider.setFilter(text); return provider.size(); } @Override public User getCurrentUser() { return ListCollectionUserPresenter.this.getCurrentUser(); } @Override public void setOnlyLinkables(boolean onlyLinkables) { } @Override public ModelLayerFactory getModelLayerFactory() { return modelLayerFactory; } }; } public TextInputDataProvider<GlobalGroupVO> getGlobalGroupLookupProvider() { final GlobalGroupVODataProvider provider = new GlobalGroupVODataProvider(new GlobalGroupToVOBuilder(), modelLayerFactory, false); provider.setGlobalGroupVOs(provider.listBaseGlobalGroupsVOsWithStatus(GlobalGroupStatus.ACTIVE)); return new TextInputDataProvider<GlobalGroupVO>() { @Override public List<GlobalGroupVO> getData(String text, int startIndex, int count) { provider.setFilter(text); int endIndex = Math.min(startIndex + count, provider.size()); return provider.listGlobalGroupVOs().subList(startIndex, endIndex); } @Override public int size(String text) { provider.setFilter(text); return provider.size(); } @Override public User getCurrentUser() { return ListCollectionUserPresenter.this.getCurrentUser(); } @Override public void setOnlyLinkables(boolean onlyLinkables) { } @Override public ModelLayerFactory getModelLayerFactory() { return modelLayerFactory; } }; } public GlobalGroupVODataProvider getGlobalGroupVODataProvider() { GlobalGroupToVOBuilder voBuilder = newGlobalGroupVOBuilder(); return newGlobalGroupVODataProvider(voBuilder); } public void addGlobalGroupButtonClicked(GlobalGroupVO globalGroupVO, String roleCode) { UserServices userServices = modelLayerFactory.newUserServices(); GlobalGroup globalGroup = userServices.getGroup(globalGroupVO.getCode()); List<String> newCollections = new ArrayList<>(); newCollections.addAll(globalGroup.getUsersAutomaticallyAddedToCollections()); newCollections.add(view.getCollection()); globalGroup = globalGroup.withUsersAutomaticallyAddedToCollections(newCollections); userServices.addUpdateGlobalGroup(globalGroup); roleGroupAdditionRequested(globalGroup.getCode(), roleCode); LoggingServices loggingServices = modelLayerFactory.newLoggingServices(); loggingServices.addGroup(getGroup(globalGroupVO.getCode()), getCurrentUser()); view.refreshTable(); } public void displayGlobalGroupButtonClicked(GlobalGroupVO entity) { view.navigate().to().displayCollectionGroup(getGroupId(entity.getCode())); } public void accessAuthorizationsGlobalGroupButtonClicked(GlobalGroupVO entity) { view.navigate().to().listPrincipalAccessAuthorizations(getGroupId(entity.getCode())); } public void deleteGlobalGroupButtonClicked(GlobalGroupVO entity) { UserServices userServices = modelLayerFactory.newUserServices(); GlobalGroup globalGroup = userServices.getGroup(entity.getCode()); List<String> newCollections = new ArrayList<>(); entity.getCollections().remove(view.getCollection()); newCollections.addAll(entity.getCollections()); globalGroup = globalGroup.withUsersAutomaticallyAddedToCollections(newCollections); userServices.addUpdateGlobalGroup(globalGroup); LoggingServices loggingServices = modelLayerFactory.newLoggingServices(); loggingServices.removeGroup(getGroup(entity.getCode()), getCurrentUser()); view.refreshTable(); } GlobalGroupToVOBuilder newGlobalGroupVOBuilder() { return new GlobalGroupToVOBuilder(); } GlobalGroupVODataProvider newGlobalGroupVODataProvider(GlobalGroupToVOBuilder voBuilder) { return new GlobalGroupVODataProvider(voBuilder, modelLayerFactory, false); } String getCurrentUserId() { return getCurrentUser().getId(); } Record getUser(String username) { MetadataSchema users = schema(User.DEFAULT_SCHEMA); LogicalSearchCondition condition = from(users).where(users.getMetadata(User.USERNAME)).isEqualTo(username); return searchServices().searchSingleResult(condition); } Record getGroup(String code) { MetadataSchema groups = schema(Group.DEFAULT_SCHEMA); LogicalSearchCondition condition = from(groups).where(groups.getMetadata(Group.CODE)).isEqualTo(code); return searchServices().searchSingleResult(condition); } String getGroupId(String code) { return getGroup(code).getId(); } public void backButtonClicked() { view.navigate().to().adminModule(); } public void permissionsButtonClicked(RecordVO entity) { view.navigate().to().editCollectionUserRoles(entity.getId()); } public void permissionsGlobalGroupButtonClicked(GlobalGroupVO entity) { view.navigate().to().editCollectionGroupRoles(getGroupId(entity.getCode())); } public List<RoleVO> getRoles() { List<RoleVO> result = new ArrayList<>(); for (Role role : roleManager().getAllRoles(view.getCollection())) { result.add(new RoleVO(role.getCode(), role.getTitle(), role.getOperationPermissions())); } return result; } private RolesManager roleManager() { return modelLayerFactory.getRolesManager(); } void roleUserAdditionRequested(String username, String roleCode) { User user = userServices().getUserInCollection(username, view.getCollection()); List<String> roles = new ArrayList<>(user.getUserRoles()); if (!roles.contains(roleCode)) { roles.add(roleCode); user.setUserRoles(roles); addOrUpdate(user.getWrappedRecord()); } } void roleGroupAdditionRequested(String groupCode, String roleCode) { Group group = userServices().getGroupInCollection(groupCode, view.getCollection()); List<String> roles = new ArrayList<>(group.getRoles()); roles.add(roleCode); group.setRoles(roles); addOrUpdate(group.getWrappedRecord()); } @Override protected boolean hasPageAccess(String params, User user) { return user.has(CorePermissions.MANAGE_SECURITY).globally(); } }