package com.constellio.model.entities.records.wrappers;
import static com.constellio.model.entities.security.Role.DELETE;
import static com.constellio.model.entities.security.Role.READ;
import static com.constellio.model.entities.security.Role.WRITE;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDateTime;
import com.constellio.data.utils.ImpossibleRuntimeException;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Role;
import com.constellio.model.entities.security.global.AuthorizationDetails;
import com.constellio.model.entities.security.global.UserCredentialStatus;
import com.constellio.model.entities.structures.MapStringListStringStructure;
import com.constellio.model.services.security.roles.Roles;
public class User extends RecordWrapper {
public static final User GOD = null;
public static final String SCHEMA_TYPE = "user";
public static final String DEFAULT_SCHEMA = SCHEMA_TYPE + "_default";
public static final String USERNAME = "username";
public static final String FIRSTNAME = "firstname";
public static final String LASTNAME = "lastname";
public static final String EMAIL = "email";
public static final String PERSONAL_EMAILS = "personalEmails";
public static final String GROUPS = "groups";
public static final String ROLES = "userroles";
public static final String ALL_ROLES = "allroles";
public static final String GROUPS_AUTHORIZATIONS = "groupsauthorizations";
public static final String ALL_USER_AUTHORIZATIONS = "alluserauthorizations";
public static final String USER_TOKENS = "usertokens";
public static final String COLLECTION_READ_ACCESS = "collectionReadAccess";
public static final String COLLECTION_WRITE_ACCESS = "collectionWriteAccess";
public static final String COLLECTION_DELETE_ACCESS = "collectionDeleteAccess";
public static final String SYSTEM_ADMIN = "systemAdmin";
public static final String ADMIN = "admin";
public static final String JOB_TITLE = "jobTitle";
public static final String PHONE = "phone";
public static final String LAST_LOGIN = "lastLogin";
public static final String LAST_IP_ADDRESS = "lastIPAddress";
public static final String START_TAB = "startTab";
public static final String DEFAULT_TAB_IN_FOLDER_DISPLAY = "defaultTabInFolderDisplay";
public static final String DEFAULT_TAXONOMY = "defaultTaxonomy";
public static final String STATUS = "status";
public static final String SIGNATURE = "signature";
public static final String LOGIN_LANGUAGE_CODE = "loginLanguageCode";
public static final String VISIBLE_TABLE_COLUMNS = "visibleTableColumns";
public static final String FAX = "fax";
public static final String ADDRESS = "address";
public static final String AGENT_ENABLED = "agentEnabled";
private transient Roles roles;
public User(Record record, MetadataSchemaTypes types, Roles roles) {
super(record, types, SCHEMA_TYPE);
this.roles = roles;
}
@Override
public RecordWrapper setTitle(String title) {
throw new UnsupportedOperationException("Title cannot be set on a user, this metadata is calculated.");
}
public static User wrapNullable(Record record, MetadataSchemaTypes types, Roles roles) {
return record == null ? null : new User(record, types, roles);
}
public String getUsername() {
return get(USERNAME);
}
public User setUsername(String username) {
set(USERNAME, username);
return this;
}
public String getJobTitle() {
return get(JOB_TITLE);
}
public User setJobTitle(String jobTitle) {
set(JOB_TITLE, jobTitle);
return this;
}
public String getPhone() {
return get(PHONE);
}
public User setPhone(String phone) {
set(PHONE, phone);
return this;
}
public String getStartTab() {
return get(START_TAB);
}
public User setStartTab(String startTab) {
set(START_TAB, startTab);
return this;
}
public String getDefaultTabInFolderDisplay() {
return get(DEFAULT_TAB_IN_FOLDER_DISPLAY);
}
public User setDefaultTabInFolderDisplay(String defaultTab) {
set(DEFAULT_TAB_IN_FOLDER_DISPLAY, defaultTab);
return this;
}
public String getDefaultTaxonomy() {
return get(DEFAULT_TAXONOMY);
}
public User setDefaultTaxonomy(String defaultTaxonomy) {
set(DEFAULT_TAXONOMY, defaultTaxonomy);
return this;
}
public String getFirstName() {
return get(FIRSTNAME);
}
public User setFirstName(String firstName) {
set(FIRSTNAME, firstName);
return this;
}
public String getLastName() {
return get(LASTNAME);
}
public User setLastName(String lastName) {
set(LASTNAME, lastName);
return this;
}
public User setLastIPAddress(String value) {
set(LAST_IP_ADDRESS, value);
return this;
}
public User setLoginLanguageCode(String loginLanguageCode) {
set(LOGIN_LANGUAGE_CODE, loginLanguageCode);
return this;
}
public String getLoginLanguageCode() {
return get(LOGIN_LANGUAGE_CODE);
}
public String getLastIPAddress() {
return get(LAST_IP_ADDRESS);
}
public User setLastLogin(LocalDateTime value) {
set(LAST_LOGIN, value);
return this;
}
public LocalDateTime getLastLogin() {
return get(LAST_LOGIN);
}
public String getEmail() {
return get(EMAIL);
}
public User setEmail(String email) {
set(EMAIL, email);
return this;
}
public List<String> getPersonalEmails() {
return get(PERSONAL_EMAILS);
}
public User setPersonalEmails(List<String> emails) {
set(PERSONAL_EMAILS, emails);
return this;
}
public List<String> getUserGroups() {
return get(GROUPS);
}
public User setUserGroups(List<String> groups) {
set(GROUPS, groups);
return this;
}
public List<String> getUserRoles() {
return getList(ROLES);
}
public User setUserRoles(List<String> roles) {
set(ROLES, roles);
return this;
}
public User setUserRoles(String roles) {
set(ROLES, asList(roles));
return this;
}
public boolean hasCollectionReadWriteOrDeleteAccess() {
return hasCollectionReadAccess() || hasCollectionWriteAccess() || hasCollectionDeleteAccess();
}
public boolean hasCollectionReadAccess() {
return getBooleanWithDefaultValue(COLLECTION_READ_ACCESS, false);
}
public User setCollectionReadAccess(boolean access) {
set(COLLECTION_READ_ACCESS, access);
return this;
}
public boolean hasCollectionWriteAccess() {
return getBooleanWithDefaultValue(COLLECTION_WRITE_ACCESS, false);
}
public User setCollectionWriteAccess(boolean access) {
set(COLLECTION_WRITE_ACCESS, access);
return this;
}
public boolean hasCollectionDeleteAccess() {
return getBooleanWithDefaultValue(COLLECTION_DELETE_ACCESS, false);
}
public User setCollectionDeleteAccess(boolean access) {
set(COLLECTION_DELETE_ACCESS, access);
return this;
}
public User setCollectionAllAccess(boolean access) {
setCollectionReadAccess(access);
setCollectionWriteAccess(access);
setCollectionDeleteAccess(access);
return this;
}
public User setSystemAdmin(boolean systemAdmin) {
set(SYSTEM_ADMIN, systemAdmin);
return this;
}
public boolean isSystemAdmin() {
return getBooleanWithDefaultValue(SYSTEM_ADMIN, false);
}
public List<String> getAllRoles() {
return get(ALL_ROLES);
}
public List<String> getGroupsAuthorizations() {
return get(GROUPS_AUTHORIZATIONS);
}
public List<String> getUserAuthorizations() {
return get(Schemas.AUTHORIZATIONS.getLocalCode());
}
public List<String> getAllUserAuthorizations() {
return get(ALL_USER_AUTHORIZATIONS);
}
public List<String> getUserTokens() {
// List<String> recordTokens = getList(USER_TOKENS);
// List<String> tokens = new ArrayList<String>(recordTokens);
// tokens.add("r_" + getId());
// tokens.add("w_" + getId());
// tokens.add("d_" + getId());
// for (String groupId : getUserGroups()) {
// tokens.add("r_" + groupId);
// tokens.add("w_" + groupId);
// tokens.add("d_" + groupId);
// }
// return tokens;
List<String> activeAuthsTokens = new ArrayList<>();
activeAuthsTokens.add("r_" + getId());
activeAuthsTokens.add("w_" + getId());
activeAuthsTokens.add("d_" + getId());
for (String groupId : getUserGroups()) {
activeAuthsTokens.add("r_" + groupId);
activeAuthsTokens.add("w_" + groupId);
activeAuthsTokens.add("d_" + groupId);
}
return activeAuthsTokens;
}
public String getCollection() {
return wrappedRecord.getCollection();
}
public UserCredentialStatus getStatus() {
return get(STATUS);
}
public User setStatus(UserCredentialStatus status) {
set(STATUS, status);
return this;
}
public String getSignature() {
return get(SIGNATURE);
}
public User setSignature(String signature) {
set(SIGNATURE, signature);
return this;
}
public boolean isVisibleTableColumnsConfiguredFor(String tableId) {
MapStringListStringStructure structure = get(VISIBLE_TABLE_COLUMNS);
return structure != null && structure.get(tableId) != null && !structure.get(tableId).isEmpty();
}
public List<String> getVisibleTableColumnsFor(String tableId) {
MapStringListStringStructure structure = get(VISIBLE_TABLE_COLUMNS);
if (structure == null) {
return new ArrayList<>();
} else {
return structure.get(tableId);
}
}
public MapStringListStringStructure getVisibleTableColumns() {
return get(VISIBLE_TABLE_COLUMNS);
}
public User setVisibleTableColumns(String tableId, List<String> columns) {
MapStringListStringStructure value = get(VISIBLE_TABLE_COLUMNS);
if (value == null) {
value = new MapStringListStringStructure();
setVisibleTableColumns(value);
}
value.put(tableId, columns);
return this;
}
public User setVisibleTableColumns(MapStringListStringStructure value) {
set(VISIBLE_TABLE_COLUMNS, value);
return this;
}
public boolean isDirty() {
return wrappedRecord.isDirty();
}
public String toString() {
return getUsername();
}
public UserPermissionsChecker hasReadAccess() {
return new AccessUserPermissionsChecker(this, true, false, false);
}
public UserPermissionsChecker hasWriteAccess() {
return new AccessUserPermissionsChecker(this, false, true, false);
}
public UserPermissionsChecker hasDeleteAccess() {
return new AccessUserPermissionsChecker(this, false, false, true);
}
public UserPermissionsChecker hasRequiredAccess(String requiredAccess) {
if (Role.READ.equals(requiredAccess)) {
return hasReadAccess();
} else if (Role.WRITE.equals(requiredAccess)) {
return hasWriteAccess();
} else if (Role.DELETE.equals(requiredAccess)) {
return hasDeleteAccess();
}
throw new ImpossibleRuntimeException("Invalid access :" + requiredAccess);
}
public UserPermissionsChecker hasWriteAndDeleteAccess() {
return new AccessUserPermissionsChecker(this, false, true, true);
}
public UserPermissionsChecker hasAllAccess(List<String> access) {
return new AccessUserPermissionsChecker(this, access.contains(READ), access.contains(WRITE), access.contains(DELETE));
}
public UserPermissionsChecker hasMetadataReadAccess() {
MetadataAccessUserPermissionsChecker checker = new MetadataAccessUserPermissionsChecker(this, types, roles);
checker.metadataRead = true;
return checker;
}
public UserPermissionsChecker hasMetadataWriteAccess() {
MetadataAccessUserPermissionsChecker checker = new MetadataAccessUserPermissionsChecker(this, types, roles);
checker.metadataWrite = true;
return checker;
}
public UserPermissionsChecker hasMetadataModificationAccess() {
MetadataAccessUserPermissionsChecker checker = new MetadataAccessUserPermissionsChecker(this, types, roles);
checker.metadataModification = true;
return checker;
}
public UserPermissionsChecker hasMetadataDeletionAccess() {
MetadataAccessUserPermissionsChecker checker = new MetadataAccessUserPermissionsChecker(this, types, roles);
checker.metadataDelete = true;
return checker;
}
public UserPermissionsChecker has(String permission) {
if (permission == null) {
return new AlwaysTrueUserPermissionsChecker(this);
} else {
RolesUserPermissionsChecker checker = new RolesUserPermissionsChecker(this, types, roles);
checker.permissions = new String[] { permission };
return checker;
}
}
public UserPermissionsChecker hasAll(List<String> permissions) {
return hasAll(permissions.toArray(new String[1]));
}
public UserPermissionsChecker hasAll(String... permissions) {
if (permissions.length == 0) {
return new AlwaysTrueUserPermissionsChecker(this);
} else {
RolesUserPermissionsChecker checker = new RolesUserPermissionsChecker(this, types, roles);
checker.permissions = permissions;
checker.anyRoles = false;
return checker;
}
}
public UserPermissionsChecker hasAny(List<String> permissions) {
return hasAny(permissions.toArray(new String[1]));
}
public UserPermissionsChecker hasAny(String... permissions) {
if (permissions.length == 0) {
return new AlwaysTrueUserPermissionsChecker(this);
} else {
RolesUserPermissionsChecker checker = new RolesUserPermissionsChecker(this, types, roles);
checker.permissions = permissions;
checker.anyRoles = true;
return checker;
}
}
public boolean hasCollectionAccess(String requiredAccess) {
if (Role.READ.equals(requiredAccess)) {
return hasCollectionReadWriteOrDeleteAccess();
} else if (Role.WRITE.equals(requiredAccess)) {
return hasCollectionWriteAccess();
} else if (Role.DELETE.equals(requiredAccess)) {
return hasCollectionDeleteAccess();
} else {
return false;
}
}
public AuthorizationDetails getAuthorizationDetail(String id) {
return roles.getSchemasRecordsServices().getSolrAuthorizationDetails(id);
}
public Roles getRolesDetails() {
return roles;
}
public String getFax() {
return get(FAX);
}
public User setFax(String fax) {
set(FAX, fax);
return this;
}
public String getAddress() {
return get(ADDRESS);
}
public User setAddress(String address) {
set(ADDRESS, address);
return this;
}
public boolean isAgentEnabled() {
return get(AGENT_ENABLED);
}
public boolean hasGlobalTypeAccess(String typeCode, String access) {
return roles.getSchemasRecordsServices().getModelLayerFactory().getSecurityTokenManager()
.hasGlobalTypeAccess(this, typeCode, access);
}
}