package com.constellio.app.ui.pages.profile; import com.constellio.app.entities.navigation.PageItem; import com.constellio.app.modules.rm.ConstellioRMModule; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.model.enums.DefaultTabInFolderDisplay; import com.constellio.app.modules.rm.ui.util.ConstellioAgentUtils; import com.constellio.app.modules.rm.wrappers.RMUser; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.entities.ContentVersionVO; import com.constellio.app.ui.entities.TaxonomyVO; import com.constellio.app.ui.framework.builders.TaxonomyToVOBuilder; import com.constellio.app.ui.framework.data.TaxonomyVODataProvider; import com.constellio.app.ui.pages.base.BasePresenter; import com.constellio.app.ui.pages.home.HomeView; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.security.global.AgentStatus; import com.constellio.model.entities.security.global.SolrUserCredential; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.services.configs.SystemConfigurationsManager; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.security.authentification.AuthenticationService; import com.constellio.model.services.users.UserPhotosServices; import com.constellio.model.services.users.UserPhotosServicesRuntimeException.UserPhotosServicesRuntimeException_UserHasNoPhoto; import com.constellio.model.services.users.UserServices; import com.google.common.base.Joiner; import org.apache.commons.collections.CollectionUtils; import java.io.IOException; import java.io.InputStream; import java.util.*; public class ModifyProfilePresenter extends BasePresenter<ModifyProfileView> { public static final String CHANGE_PHOTO_STREAM = "ConstellioMenuPresenter-ChangePhotoStream"; public static final String SHOW_PICTURE_STREAM = "ConstellioMenuPresenter-ShowPicture"; public static final String ADMIN = "admin"; private transient UserServices userServices; private transient AuthenticationService authenticationService; private transient RecordServices recordServices; private transient UserPhotosServices userPhotosServices; private String username; private String parameters; public ModifyProfilePresenter(ModifyProfileView view) { super(view); init(); } public List<String> getAvailableHomepageTabs() { List<String> result = new ArrayList<>(); for (PageItem tab : navigationConfig().getFragments(HomeView.TABS)) { result.add(tab.getCode()); } return result; } public void saveButtonClicked(ProfileVO profileVO) { User user = userServices.getUserInCollection(profileVO.getUsername(), view.getCollection()); user.setPhone(profileVO.getPhone()); user.setJobTitle(profileVO.getJobTitle()); user.setAddress(profileVO.getAddress()); user.setFax(profileVO.getFax()); if (profileVO.getStartTab() == null) { user.setStartTab(getDefaultStartTab()); } else { user.setStartTab(profileVO.getStartTab()); } if (profileVO.getDefaultTabInFolderDisplay() == null) { user.setDefaultTabInFolderDisplay(DefaultTabInFolderDisplay.METADATA.getCode()); } else { user.setDefaultTabInFolderDisplay(profileVO.getDefaultTabInFolderDisplay().getCode()); } user.setDefaultTaxonomy(profileVO.getDefaultTaxonomy()); user.setLoginLanguageCode(profileVO.getLoginLanguageCode()); if(isRMModuleActivated()) { user.set(RMUser.DEFAULT_ADMINISTRATIVE_UNIT, profileVO.getDefaultAdministrativeUnit()); } try { if (profileVO.getPassword() != null && profileVO.getPassword().equals(profileVO.getConfirmPassword())) { authenticationService.changePassword(profileVO.getUsername(), profileVO.getOldPassword(), profileVO.getPassword()); } recordServices.update(user.getWrappedRecord()); changePhoto(profileVO.getImage()); updateUserCredential(profileVO); view.updateUI(); } catch (RecordServicesException e) { e.printStackTrace(); return; } navigateToBackPage(); } private void updateUserCredential(final ProfileVO profileVO) { String username = profileVO.getUsername(); SolrUserCredential userCredential = (SolrUserCredential) userServices.getUserCredential(username); userCredential = (SolrUserCredential) userCredential. withFirstName(profileVO.getFirstName()) .withLastName(profileVO.getLastName()) .withEmail(profileVO.getEmail()) .withJobTitle(profileVO.getJobTitle()) .withPhone(profileVO.getPhone()) .withAddress(profileVO.getAddress()) .withFax(profileVO.getFax()); if (profileVO.getPersonalEmails() != null) { userCredential = (SolrUserCredential) userCredential.withPersonalEmails(Arrays.asList(profileVO.getPersonalEmails().split("\n"))); } boolean agentManuallyDisabled = profileVO.isAgentManuallyDisabled(); AgentStatus previousAgentStatus = userCredential.getAgentStatus(); if (previousAgentStatus == AgentStatus.MANUALLY_DISABLED && !agentManuallyDisabled) { userCredential.setAgentStatus(AgentStatus.ENABLED); } else if (previousAgentStatus != AgentStatus.MANUALLY_DISABLED && agentManuallyDisabled) { userCredential.setAgentStatus(AgentStatus.MANUALLY_DISABLED); } userServices.addUpdateUserCredential(userCredential); } private String getDefaultStartTab() { return presenterService().getSystemConfigs().getDefaultStartTab(); } void changePhoto(ContentVersionVO image) { if (image != null) { userPhotosServices.changePhoto(image.getInputStreamProvider().getInputStream(CHANGE_PHOTO_STREAM), username); } } public ProfileVO getProfileVO(String username) { UserCredential userCredential = userServices.getUserCredential(username); String firstName = userCredential.getFirstName(); String lastName = userCredential.getLastName(); String email = userCredential.getEmail(); List<String> personalEmails = userCredential.getPersonalEmails(); User user = userServices.getUserInCollection(username, view.getCollection()); String phone = user.getPhone(); String fax = user.getFax(); String jobTitle = user.getJobTitle(); String address = user.getAddress(); String loginLanguage = user.getLoginLanguageCode(); String defaultAdministrativeUnit = null; if(isRMModuleActivated()) { defaultAdministrativeUnit = user.get(RMUser.DEFAULT_ADMINISTRATIVE_UNIT); try { recordServices().getDocumentById(defaultAdministrativeUnit); } catch (Exception e) { defaultAdministrativeUnit = null; } } if (loginLanguage == null || loginLanguage.isEmpty()) { loginLanguage = view.getSessionContext().getCurrentLocale().getLanguage(); } String startTab = user.getStartTab(); if (startTab == null) { startTab = getDefaultStartTab(); } SystemConfigurationsManager systemConfigurationsManager = modelLayerFactory.getSystemConfigurationsManager(); RMConfigs rmConfigs = new RMConfigs(systemConfigurationsManager); Map<String, DefaultTabInFolderDisplay> defaultTabInFolderDisplayOptions = new HashMap<>(); for (DefaultTabInFolderDisplay retrievedDefaultTabInFolderDisplay : DefaultTabInFolderDisplay.values()) { defaultTabInFolderDisplayOptions.put(retrievedDefaultTabInFolderDisplay.getCode(), retrievedDefaultTabInFolderDisplay); } DefaultTabInFolderDisplay defaultTabInFolderDisplay = null; if (user.getDefaultTabInFolderDisplay() != null) { for (DefaultTabInFolderDisplay retrievedDefaultTabInFolderDisplay : DefaultTabInFolderDisplay.values()) { if (user.getDefaultTabInFolderDisplay().equals(retrievedDefaultTabInFolderDisplay.getCode())) { defaultTabInFolderDisplay = retrievedDefaultTabInFolderDisplay; break; } } } if (defaultTabInFolderDisplay == null) { String configDefaultTabInFolderDisplayCode = rmConfigs.getDefaultTabInFolderDisplay(); if (configDefaultTabInFolderDisplayCode != null){ defaultTabInFolderDisplay = defaultTabInFolderDisplayOptions.get(configDefaultTabInFolderDisplayCode); } } String defaultTaxonomy = user.getDefaultTaxonomy(); if (defaultTaxonomy == null) { defaultTaxonomy = presenterService().getSystemConfigs().getDefaultTaxonomy(); } SolrUserCredential userCredentials = (SolrUserCredential) userServices.getUser(username); AgentStatus agentStatus = userCredentials.getAgentStatus(); boolean agentManuallyDisabled = agentStatus == AgentStatus.MANUALLY_DISABLED; ProfileVO profileVO = newProfileVO(username, firstName, lastName, email, personalEmails, phone, fax, jobTitle, address, startTab, defaultTabInFolderDisplay, defaultTaxonomy, agentManuallyDisabled, defaultAdministrativeUnit); profileVO.setLoginLanguageCode(loginLanguage); return profileVO; } ProfileVO newProfileVO(String username, String firstName, String lastName, String email, List<String> personalEmails, String phone, String fax, String jobTitle, String address, String startTab, DefaultTabInFolderDisplay defaultTabInFolderDisplay, String defaultTaxonomy, boolean agentManuallyDisabled, String defaultAdministrativeUnit) { String personalEmailsPresentation = null; if (!CollectionUtils.isEmpty(personalEmails)) { personalEmailsPresentation = Joiner.on("\n").join(personalEmails); } return new ProfileVO(username, firstName, lastName, email, personalEmailsPresentation, phone, fax, jobTitle, address, startTab, defaultTabInFolderDisplay, defaultTaxonomy, null, null, null, agentManuallyDisabled, defaultAdministrativeUnit); } public void cancelButtonClicked() { navigateToBackPage(); } List<TaxonomyVO> getEnabledTaxonomies() { TaxonomyVODataProvider provider = newDataProvider(); return provider.getTaxonomyVOs(); } TaxonomyVODataProvider newDataProvider() { return new TaxonomyVODataProvider(newVoBuilder(), modelLayerFactory, view.getCollection(), view.getSessionContext().getCurrentUser().getUsername()); } private TaxonomyToVOBuilder newVoBuilder() { return new TaxonomyToVOBuilder(); } public InputStream newUserPhotoInputStream() { String username = getUsername(); UserPhotosServices photosServices = ConstellioFactories.getInstance().getModelLayerFactory().newUserPhotosServices(); try { return photosServices.getPhotoInputStream(username).create(SHOW_PICTURE_STREAM); } catch (UserPhotosServicesRuntimeException_UserHasNoPhoto u) { return null; } catch (IOException e) { throw new RuntimeException(e); } } public void setParameters(String parameters) { this.parameters = parameters; } public String getParameters() { return parameters; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } void navigateToBackPage() { view.navigate().to().url(parameters); } public boolean canModify() { if (username.equals(ADMIN)) { return true; } else { return userServices.canAddOrModifyUserAndGroup(); } } public boolean canModifyPassword() { UserCredential user = userServices.getUserCredential(username); return userServices.canModifyPassword(user, user); } public boolean isLDAPAuthentication() { return userServices.isLDAPAuthentication(); } @Override protected boolean hasPageAccess(String params, User user) { return true; } private void init() { userServices = modelLayerFactory.newUserServices(); authenticationService = modelLayerFactory.newAuthenticationService(); recordServices = modelLayerFactory.newRecordServices(); userPhotosServices = modelLayerFactory.newUserPhotosServices(); view.setAgentManuallyDisabledVisible(isAgentManuallyDisabledVisible()); } private boolean isAgentManuallyDisabledVisible() { UserServices userServices = modelLayerFactory.newUserServices(); SystemConfigurationsManager systemConfigurationsManager = modelLayerFactory.getSystemConfigurationsManager(); RMConfigs rmConfigs = new RMConfigs(systemConfigurationsManager); String username = view.getSessionContext().getCurrentUser().getUsername(); SolrUserCredential userCredentials = (SolrUserCredential) userServices.getUser(username); AgentStatus agentStatus = userCredentials.getAgentStatus(); if (agentStatus == AgentStatus.DISABLED && !rmConfigs.isAgentDisabledUntilFirstConnection()) { agentStatus = AgentStatus.ENABLED; } return rmConfigs.isAgentEnabled() && ConstellioAgentUtils.isAgentSupported() && agentStatus != AgentStatus.DISABLED; } private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); init(); } public List<String> getCurrentCollectionLanguagesCodes() { return modelLayerFactory.getCollectionsListManager().getCollectionLanguages(collection); } public boolean isRMModuleActivated() { return appLayerFactory.getModulesManager().isModuleEnabled(collection, new ConstellioRMModule()); } }