org.opencms.file.CmsUser Maven / Gradle / Ivy
Show all versions of opencms-core Show documentation
/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH & Co. KG, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.file;
import org.opencms.db.CmsUserSettings;
import org.opencms.main.CmsException;
import org.opencms.main.CmsIllegalArgumentException;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsPrincipal;
import org.opencms.security.CmsSecurityException;
import org.opencms.security.I_CmsPrincipal;
import org.opencms.util.CmsMacroResolver;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
/**
* A user principal in the OpenCms permission system.
*
* A user in OpenCms is uniquely defined by its user named returned by
* {@link #getName()}
.
*
* Basic users in OpenCms are users that can access the OpenCms Workplace.
* Moreover, the user must be created by another user with the
* {@link org.opencms.security.CmsRole#ACCOUNT_MANAGER}
role.
* These users are "content managers" that actually have write permissions in
* at last some parts of the VFS.
*
* Another possibility is to have users in a 'Guests' group.
* These users do not have access to the OpenCms Workplace.
* However, an user in a 'Guests' group can be created by every user, for example
* the "Guest" user. The main use case is that these users are used for users of
* the website that can generate their own accounts, in a "please register your
* account..." scenario.
* These user accounts can then be used to build personalized web sites.
*
* @since 6.0.0
*
* @see CmsGroup
*/
public class CmsUser extends CmsPrincipal implements Cloneable {
/** Flag indicating changed additional infos. */
public static final int FLAG_ADDITIONAL_INFOS = 4;
/** Flag indicating changed core data. */
public static final int FLAG_CORE_DATA = 8;
/** Flag indicating a changed last login date. */
public static final int FLAG_LAST_LOGIN = 2;
/** The serial version id. */
private static final long serialVersionUID = 4812858003805477345L;
/** Storage for additional user information. */
private Map m_additionalInfo;
/** The creation date. */
private long m_dateCreated;
/** The email of the user. */
private String m_email;
/** The first name of this user. */
private String m_firstname;
/** Boolean flag whether the last-login time stamp of this user was modified. */
private boolean m_isTouched;
/** The last login date of this user. */
private long m_lastlogin;
/** The last name of this user. */
private String m_lastname;
/** The password of this user. */
private String m_password;
/**
* Creates a new, empty OpenCms user principal.
*
* Mostly intended to be used with the org.opencms.workplace.tools.accounts.A_CmsEditUserDialog
.
*/
public CmsUser() {
this(
null,
"",
"",
"",
"",
"",
0,
I_CmsPrincipal.FLAG_ENABLED,
System.currentTimeMillis(),
Collections.singletonMap(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION, (Object)""));
}
/**
* Creates a new OpenCms user principal.
*
* @param id the unique id of the new user
* @param name the fully qualified name of the new user
* @param password the password of the user
* @param firstname the first name
* @param lastname the last name
* @param email the email address
* @param lastlogin time stamp
* @param flags flags
* @param dateCreated the creation date
* @param additionalInfo user related information
*/
public CmsUser(
CmsUUID id,
String name,
String password,
String firstname,
String lastname,
String email,
long lastlogin,
int flags,
long dateCreated,
Map additionalInfo) {
m_id = id;
m_name = name;
m_password = password;
m_firstname = firstname;
m_lastname = lastname;
m_email = email;
m_lastlogin = lastlogin;
m_flags = flags;
m_dateCreated = dateCreated;
if (additionalInfo != null) {
m_additionalInfo = new HashMap(additionalInfo);
} else {
m_additionalInfo = new HashMap();
}
if (m_additionalInfo.get(CmsUserSettings.ADDITIONAL_INFO_ADDRESS) == null) {
m_additionalInfo.put(CmsUserSettings.ADDITIONAL_INFO_ADDRESS, "");
}
if (m_additionalInfo.get(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION) == null) {
m_additionalInfo.put(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION, "");
}
}
/**
* Validates an email address.
*
* That means, the parameter should only be composed by digits and standard english letters, points, underscores and exact one "At" symbol.
*
* @param email the email to validate
*/
public static void checkEmail(String email) {
OpenCms.getValidationHandler().checkEmail(email);
}
/**
* Validates a zip code.
*
* That means, the parameter should only be composed by digits and standard english letters.
*
* @param zipcode the zip code to validate
*/
public static void checkZipCode(String zipcode) {
OpenCms.getValidationHandler().checkZipCode(zipcode);
}
/**
* Returns the "full" name of the given user in the format "{firstname} {lastname} ({username})"
,
* or the empty String ""
if the user is null.
*
* @param user the user to get the full name from
* @return the "full" name the user
*
* @see #getFullName()
*/
public static String getFullName(CmsUser user) {
if (user == null) {
return "";
} else {
return user.getFullName();
}
}
/**
* Checks whether the flag indicates additional info changes.
*
* @param changes the changes flags
*
* @return true
in case the additional infos changed
*/
public static boolean hasChangedAdditionalInfos(int changes) {
return (changes & FLAG_ADDITIONAL_INFOS) == FLAG_ADDITIONAL_INFOS;
}
/**
* Checks whether the flag indicates core data changes.
*
* @param changes the changes flags
*
* @return true
in case the core data changed
*/
public static boolean hasChangedCoreData(int changes) {
return (changes & FLAG_CORE_DATA) == FLAG_CORE_DATA;
}
/**
* Checks whether the flag indicates last login date changes.
*
* @param changes the changes flags
*
* @return true
in case the last login date changed
*/
public static boolean hasChangedLastLogin(int changes) {
return (changes & FLAG_LAST_LOGIN) == FLAG_LAST_LOGIN;
}
/**
* Checks if the given String starts with {@link I_CmsPrincipal#PRINCIPAL_USER} followed by a dot.
*
*
* - Works if the given String is
null
.
* - Removes white spaces around the String before the check.
*
- Also works with prefixes not being in upper case.
*
- Does not check if the user after the prefix actually exists.
*
*
* @param principalName the user name to check
*
* @return true
in case the String starts with {@link I_CmsPrincipal#PRINCIPAL_USER} followed by a dot
*/
public static boolean hasPrefix(String principalName) {
return CmsStringUtil.isNotEmptyOrWhitespaceOnly(principalName)
&& (principalName.trim().toUpperCase().startsWith(I_CmsPrincipal.PRINCIPAL_USER + "."));
}
/**
* Removes the prefix if the given String starts with {@link I_CmsPrincipal#PRINCIPAL_USER} followed by a dot.
*
*
* - Works if the given String is
null
.
* - If the given String does not start with {@link I_CmsPrincipal#PRINCIPAL_USER} followed by a dot it is returned unchanged.
*
- Removes white spaces around the user name.
*
- Also works with prefixes not being in upper case.
*
- Does not check if the user after the prefix actually exists.
*
*
* @param principalName the user name to remove the prefix from
*
* @return the given String with the prefix {@link I_CmsPrincipal#PRINCIPAL_USER} and the following dot removed
*/
public static String removePrefix(String principalName) {
String result = principalName;
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(principalName)) {
if (hasPrefix(principalName)) {
result = principalName.trim().substring(I_CmsPrincipal.PRINCIPAL_USER.length() + 1);
}
}
return result;
}
/**
* Checks if the provided user name is a valid user name and can be used as an argument value
* for {@link #setName(String)}.
*
* @param name the user name to check
*
* @throws CmsIllegalArgumentException if the check fails
*/
public void checkName(String name) throws CmsIllegalArgumentException {
OpenCms.getValidationHandler().checkUserName(name);
}
/**
* @see java.lang.Object#clone()
*/
@Override
public CmsUser clone() {
return new CmsUser(
m_id,
m_name,
m_password,
m_firstname,
m_lastname,
m_email,
m_lastlogin,
m_flags,
m_dateCreated,
new HashMap(m_additionalInfo));
}
/**
* Deletes a value from this users "additional information" storage map.
*
* @param key the additional user information to delete
*
* @see #getAdditionalInfo()
*/
public void deleteAdditionalInfo(String key) {
m_additionalInfo.remove(key);
}
/**
* Returns this users complete "additional information" storage map.
*
* The "additional information" storage map is a simple {@link java.util.Map}
* that can be used to store any key / value pairs for the user.
* Some information parts of the users address are stored in this map
* by default.
*
* @return this users complete "additional information" storage map
*/
public Map getAdditionalInfo() {
return m_additionalInfo;
}
/**
* Returns a value from this users "additional information" storage map,
* or null
if no value for the given key is available.
*
* @param key selects the value to return from the "additional information" storage map
*
* @return the selected value from this users "additional information" storage map
*
* @see #getAdditionalInfo()
*/
public Object getAdditionalInfo(String key) {
return m_additionalInfo.get(key);
}
/**
* Returns the address line of this user.
*
* @return the address line of this user
*/
public String getAddress() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_ADDRESS);
}
/**
* Returns the changes of this user compared to the previous user data.
*
* @param oldUser the old user
*
* @return the changes flags
*/
public int getChanges(CmsUser oldUser) {
int result = 0;
if (oldUser.m_lastlogin != m_lastlogin) {
result = result | FLAG_LAST_LOGIN;
}
if (!oldUser.m_additionalInfo.equals(m_additionalInfo)) {
result = result | FLAG_ADDITIONAL_INFOS;
}
if (!Objects.equals(oldUser.m_email, m_email)
|| !Objects.equals(oldUser.m_description, m_description)
|| !Objects.equals(oldUser.m_firstname, m_firstname)
|| !Objects.equals(oldUser.m_lastname, m_lastname)
|| !Objects.equals(oldUser.m_password, m_password)
|| (oldUser.m_flags != m_flags)) {
result = result | FLAG_CORE_DATA;
}
return result;
}
/**
* Returns the city information of this user.
*
* This information is stored in the "additional information" storage map
* using the key {@link CmsUserSettings#ADDITIONAL_INFO_CITY}
.
*
* @return the city information of this user
*/
public String getCity() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_CITY);
}
/**
* Returns the country information of this user.
*
* This information is stored in the "additional information" storage map
* using the key {@link CmsUserSettings#ADDITIONAL_INFO_COUNTRY}
.
*
* @return the country information of this user
*/
public String getCountry() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_COUNTRY);
}
/**
* Returns the creation date.
*
* @return the creation date
*/
public long getDateCreated() {
return m_dateCreated;
}
/**
* @see org.opencms.security.CmsPrincipal#getDescription()
*/
@Override
public String getDescription() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION);
}
/**
* Returns the description of this organizational unit.
*
* @param locale the locale
*
* @return the description of this organizational unit
*/
public String getDescription(Locale locale) {
CmsMacroResolver macroResolver = new CmsMacroResolver();
macroResolver.setMessages(org.opencms.db.generic.Messages.get().getBundle(locale));
return macroResolver.resolveMacros((String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION));
}
/**
* @see org.opencms.security.CmsPrincipal#getDisplayName(org.opencms.file.CmsObject, java.util.Locale)
*/
@Override
public String getDisplayName(CmsObject cms, Locale locale) throws CmsException {
if (OpenCms.getOrgUnitManager().getOrganizationalUnits(cms, "", true).size() > 0) {
return org.opencms.security.Messages.get().getBundle(locale).key(
org.opencms.security.Messages.GUI_PRINCIPAL_DISPLAY_NAME_2,
getFullName(),
OpenCms.getOrgUnitManager().readOrganizationalUnit(cms, getOuFqn()).getDisplayName(locale));
} else {
return getFullName();
}
}
/**
* Returns the email address of this user.
*
* @return the email address of this user
*/
public String getEmail() {
return m_email;
}
/**
* Returns the first name of this user.
*
* @return the first name of this user
*/
public String getFirstname() {
return m_firstname;
}
/**
* Returns the "full" name of the this user in the format "{firstname} {lastname} ({username})"
.
*
* @return the "full" name this user
*/
public String getFullName() {
StringBuffer buf = new StringBuffer();
String first = getFirstname();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(first)) {
buf.append(first);
buf.append(" ");
}
String last = getLastname();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(last)) {
buf.append(last);
buf.append(" ");
}
buf.append("(");
buf.append(getSimpleName());
buf.append(")");
return buf.toString();
}
/**
* Returns the institution information of this user.
*
* This information is stored in the "additional information" storage map
* using the key {@link CmsUserSettings#ADDITIONAL_INFO_INSTITUTION}
.
*
* @return the institution information of this user
*/
public String getInstitution() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_INSTITUTION);
}
/**
* Returns the time of the last login of this user.
*
* @return the time of the last login of this user
*/
public long getLastlogin() {
return m_lastlogin;
}
/**
* Returns the last name of this user.
*
* @return the last name of this user
*/
public String getLastname() {
return m_lastname;
}
/**
* Returns the encrypted user password.
*
* @return the encrypted user password
*/
public String getPassword() {
return m_password;
}
/**
* Returns the zip code information of this user.
*
* This information is stored in the "additional information" storage map
* using the key {@link CmsUserSettings#ADDITIONAL_INFO_ZIPCODE}
.
*
* @return the zip code information of this user
*/
public String getZipcode() {
return (String)getAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_ZIPCODE);
}
/**
* @see org.opencms.security.I_CmsPrincipal#isGroup()
*/
@Override
public boolean isGroup() {
return false;
}
/**
* Checks if this user is the default guest user.
*
* @return true
if this user is the default guest user
*/
public boolean isGuestUser() {
return OpenCms.getDefaultUsers().isUserGuest(getName());
}
/**
* Returns true
if this user is not able to manage itself.
*
* @return true
if this user is not able to manage itself
*/
public boolean isManaged() {
return (getFlags() & I_CmsPrincipal.FLAG_USER_MANAGED) == I_CmsPrincipal.FLAG_USER_MANAGED;
}
/**
* Returns true
if this user was touched.
*
* @return boolean true if this user was touched
*/
public boolean isTouched() {
return m_isTouched;
}
/**
* @see org.opencms.security.I_CmsPrincipal#isUser()
*/
@Override
public boolean isUser() {
return true;
}
/**
* Checks if the user is marked as webuser.
*
* @return true
if the user is marked as webuser
*/
public boolean isWebuser() {
return (getFlags() & FLAG_USER_WEBUSER) == FLAG_USER_WEBUSER;
}
/**
* Sets this users complete "additional information" storage map to the given value.
*
* @param additionalInfo the complete "additional information" map to set
*
* @see #getAdditionalInfo()
*/
public void setAdditionalInfo(Map additionalInfo) {
m_additionalInfo = additionalInfo;
}
/**
* Stores a value in this users "additional information" storage map with the given access key.
*
* @param key the key to store the value under
* @param value the value to store in the users "additional information" storage map
*
* @see #getAdditionalInfo()
*/
public void setAdditionalInfo(String key, Object value) {
if (key == null) {
throw new CmsIllegalArgumentException(
Messages.get().container(Messages.ERR_USER_ADDINFO_KEY_NULL_1, getFullName()));
}
m_additionalInfo.put(key, value);
}
/**
* Sets the address line of this user.
*
* @param address the address line to set
*/
public void setAddress(String address) {
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_ADDRESS, address);
}
/**
* Sets the city information of this user.
*
* @param city the city information to set
*/
public void setCity(String city) {
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_CITY, city);
}
/**
* Sets the country information of this user.
*
* @param country the city information to set
*/
public void setCountry(String country) {
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_COUNTRY, country);
}
/**
* @see org.opencms.security.CmsPrincipal#setDescription(java.lang.String)
*/
@Override
public void setDescription(String description) {
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_DESCRIPTION, description);
}
/**
* Sets the email address of this user.
*
* @param email the email address to set
*/
public void setEmail(String email) {
checkEmail(email);
if (email != null) {
email = email.trim();
}
m_email = email;
}
/**
* Sets the first name of this user.
*
* @param firstname the name to set
*/
public void setFirstname(String firstname) {
OpenCms.getValidationHandler().checkFirstname(firstname);
if (firstname != null) {
firstname = firstname.trim();
}
m_firstname = firstname;
}
/**
* Sets the institution information of this user.
*
* @param institution the institution information to set
*/
public void setInstitution(String institution) {
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_INSTITUTION, institution);
}
/**
* Sets the last login time stamp of this user.
*
* @param value the last login time stamp to set
*/
public void setLastlogin(long value) {
m_isTouched = true;
m_lastlogin = value;
}
/**
* Sets the last name of this user.
*
* @param lastname the name to set
*/
public void setLastname(String lastname) {
OpenCms.getValidationHandler().checkLastname(lastname);
if (lastname != null) {
lastname = lastname.trim();
}
m_lastname = lastname;
}
/**
* Sets the managed flag for this user to the given value.
*
* @param value the value to set
*/
public void setManaged(boolean value) {
if (isManaged() != value) {
setFlags(getFlags() ^ I_CmsPrincipal.FLAG_USER_MANAGED);
}
}
/**
* Sets the password of this user.
*
* @param value the password to set
*/
public void setPassword(String value) {
try {
OpenCms.getPasswordHandler().validatePassword(value);
} catch (CmsSecurityException e) {
throw new CmsIllegalArgumentException(e.getMessageContainer());
}
m_password = value;
}
/**
* Sets the zip code information of this user.
*
* @param zipcode the zip code information to set
*/
public void setZipcode(String zipcode) {
checkZipCode(zipcode);
if (zipcode != null) {
zipcode = zipcode.toUpperCase();
}
setAdditionalInfo(CmsUserSettings.ADDITIONAL_INFO_ZIPCODE, zipcode);
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer result = new StringBuffer();
result.append("[User]");
result.append(" name:");
result.append(getName());
result.append(" id:");
result.append(m_id);
result.append(" flags:");
result.append(getFlags());
result.append(" description:");
result.append(getDescription());
return result.toString();
}
/**
* Sets the "touched" status of this user to true
.
*/
public void touch() {
m_isTouched = true;
}
}