package com.constellio.app.ui.pages.user;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.app.ui.application.NavigatorConfigurationService;
import com.constellio.app.ui.entities.UserCredentialVO;
import com.constellio.app.ui.framework.builders.GlobalGroupToVOBuilder;
import com.constellio.app.ui.framework.builders.UserCredentialToVOBuilder;
import com.constellio.app.ui.framework.data.GlobalGroupVODataProvider;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.global.UserCredential;
import com.constellio.model.services.users.UserServices;
@SuppressWarnings("serial")
public class DisplayUserCredentialPresenter extends BasePresenter<DisplayUserCredentialView> {
private transient UserServices userServices;
private Map<String, String> paramsMap;
private String breadCrumb;
public DisplayUserCredentialPresenter(DisplayUserCredentialView view) {
super(view);
init();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init();
}
private void init() {
userServices = modelLayerFactory.newUserServices();
}
public UserCredentialVO getUserCredentialVO(String username) {
UserCredential userCredential = userServices.getUserCredential(username);
UserCredentialToVOBuilder voBuilder = newUserCredentialToVOBuilder();
return voBuilder.build(userCredential);
}
public void backButtonClicked() {
String viewNames[] = breadCrumb.split("/");
String backPage = viewNames[viewNames.length - 1];
configureBreadCrumb(backPage);
String parameters = getParameters();
if (!backPage.endsWith("/") && !parameters.startsWith("/")) {
backPage += "/";
}
view.navigate().to().url(backPage + parameters);
}
public void editButtonClicked(UserCredentialVO entity) {
paramsMap.put("username", entity.getUsername());
String parameters = getParameters(NavigatorConfigurationService.USER_DISPLAY);
view.navigate().to().editUserCredential(parameters);
}
public GlobalGroupVODataProvider getGlobalGroupVODataProvider() {
GlobalGroupToVOBuilder voBuilder = newGlobalGroupVOBuilder();
return newGlobalGroupVODataProvider(voBuilder);
}
public void displayGlobalGroupButtonClicked(String globalGroupCode, String username) {
paramsMap.put("username", username);
paramsMap.put("globalGroupCode", globalGroupCode);
String parameters = getParameters(NavigatorConfigurationService.USER_DISPLAY);
view.navigate().to().displayGlobalGroup(parameters);
}
public void editGlobalGroupButtonClicked(String globalGroupCode, String username) {
paramsMap.put("globalGroupCode", globalGroupCode);
paramsMap.put("username", username);
String parameters = getParameters(NavigatorConfigurationService.USER_DISPLAY);
view.navigate().to().editGlobalGroup(parameters);
}
public void deleteGlobalGroupButtonClicked(String username, String globalGroupCode) {
userServices.removeUserFromGlobalGroup(username, globalGroupCode);
view.refreshTable();
}
public void addGlobalGroupButtonClicked(String username, String globalGroupCode) {
List<String> newGlobalGroups = new ArrayList<>();
UserCredential userCredential = userServices.getUserCredential(username);
List<String> globalGroups = userCredential.getGlobalGroups();
newGlobalGroups.addAll(globalGroups);
newGlobalGroups.add(globalGroupCode);
userCredential = userCredential.withGlobalGroups(newGlobalGroups);
userServices.addUpdateUserCredential(userCredential);
view.refreshTable();
}
public void setParamsMap(Map<String, String> paramsMap) {
this.paramsMap = paramsMap;
}
public void setBreadCrumb(String breadCrumb) {
this.breadCrumb = breadCrumb;
}
UserCredentialToVOBuilder newUserCredentialToVOBuilder() {
return new UserCredentialToVOBuilder();
}
GlobalGroupToVOBuilder newGlobalGroupVOBuilder() {
return new GlobalGroupToVOBuilder();
}
GlobalGroupVODataProvider newGlobalGroupVODataProvider(GlobalGroupToVOBuilder voBuilder) {
return new GlobalGroupVODataProvider(voBuilder, modelLayerFactory, true);
}
private void configureBreadCrumb(String backPage) {
breadCrumb = breadCrumb.replace(backPage, "");
if (breadCrumb.endsWith("/")) {
breadCrumb = breadCrumb.substring(0, breadCrumb.length() - 1);
}
}
String getParameters() {
return getParameters("");
}
String getParameters(String viewName) {
Map<String, Object> newParamsMap = new HashMap<>();
newParamsMap.putAll(paramsMap);
if (!viewName.isEmpty()) {
viewName = "/" + viewName;
}
String parameters = ParamUtils.addParams(breadCrumb + viewName, newParamsMap);
parameters = cleanParameters(parameters);
return parameters;
}
private String cleanParameters(String parameters) {
while (parameters.contains("//")) {
parameters = parameters.replace("//", "/");
}
return parameters;
}
public boolean canAddOrModify() {
return userServices.canAddOrModifyUserAndGroup();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return userServices.has(user).globalPermissionInAnyCollection(CorePermissions.MANAGE_SYSTEM_USERS);
}
public boolean canModifyPassword(String usernameInEdition) {
UserCredential userInEdition = userServices.getUserCredential(usernameInEdition);
UserCredential currentUser = userServices.getUserCredential(view.getSessionContext().getCurrentUser().getUsername());
return userServices.canModifyPassword(userInEdition, currentUser);
}
public String getServiceKey(String username) {
String serviceKey = userServices.getUser(username).getServiceKey();
if (serviceKey == null) {
serviceKey = userServices.giveNewServiceToken(userServices.getUser(username));
}
return serviceKey;
}
public String generateToken(String username, String unitTime, int duration) {
return userServices.generateToken(username, unitTime, duration);
}
public boolean userNotLDAPSynced(String username) {
UserCredential userCredential = userServices.getUserCredential(username);
return userCredential.getDn() == null && userServices.has(userCredential).globalPermissionInAnyCollection(CorePermissions.MANAGE_SECURITY);
}
}