LuteceUser.java
/*
* Copyright (c) 2002-2022, City of Paris
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice
* and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* License 1.0
*/
package fr.paris.lutece.portal.service.security;
import fr.paris.lutece.api.user.User;
import fr.paris.lutece.api.user.UserRole;
import fr.paris.lutece.portal.business.rbac.RBACRole;
import java.io.Serializable;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ObjectUtils;
/**
* This Interface defines all methods required for a Lutece user implementation
*/
public abstract class LuteceUser implements Principal, Serializable, Cloneable, User
{
/*
* These attribute names are derived from the Platform for Privacy Preferences 1.0 (P3P 1.0) Specification by the W3C (http://www.w3c.org/TR/P3P). The same
* attribute names are also being considered by the OASIS Web Services for Remote Portlets Technical Committee.
*/
public static final String BDATE = "user.bdate";
public static final String GENDER = "user.gender";
public static final String EMPLOYER = "user.employer";
public static final String DEPARTMENT = "user.department";
public static final String JOBTITLE = "user.jobtitle";
public static final String PREFIX = "user.name.prefix";
public static final String DATE_LAST_LOGIN = "user.lastLogin";
public static final String NAME_GIVEN = "user.name.given";
public static final String NAME_FAMILY = "user.name.family";
public static final String NAME_MIDDLE = "user.name.middle";
public static final String NAME_SUFFIX = "user.name.suffix";
public static final String NAME_NICKNAME = "user.name.nickName";
public static final String NAME_CIVILITY = "user.name.civility";
public static final String HOME_INFO_POSTAL_NAME = "user.home-info.postal.name";
public static final String HOME_INFO_POSTAL_STREET = "user.home-info.postal.street";
public static final String HOME_INFO_POSTAL_STREET_NUMBER = "user.home-info.postal.street.number";
public static final String HOME_INFO_POSTAL_STREET_SUFFIX = "user.home-info.postal.street.suffix";
public static final String HOME_INFO_POSTAL_STREET_NAME = "user.home-info.postal.street.name";
public static final String HOME_INFO_POSTAL_STREET_TYPE = "user.home-info.postal.street.type";
public static final String HOME_INFO_POSTAL_STREET_URBAN_DISTRICT = "user.home-info.postal.street.urbandistrict";
public static final String HOME_INFO_POSTAL_CITY = "user.home-info.postal.city";
public static final String HOME_INFO_POSTAL_STATEPROV = "user.home-info.postal.stateprov";
public static final String HOME_INFO_POSTAL_POSTALCODE = "user.home-info.postal.postalcode";
public static final String HOME_INFO_POSTAL_COUNTRY = "user.home-info.postal.country";
public static final String HOME_INFO_POSTAL_ORGANIZATION = "user.home-info.postal.organization";
public static final String HOME_INFO_TELECOM_TELEPHONE_INTCODE = "user.home-info.telecom.telephone.intcode";
public static final String HOME_INFO_TELECOM_TELEPHONE_LOCCODE = "user.home-info.telecom.telephone.loccode";
public static final String HOME_INFO_TELECOM_TELEPHONE_NUMBER = "user.home-info.telecom.telephone.number";
public static final String HOME_INFO_TELECOM_TELEPHONE_EXT = "user.home-info.telecom.telephone.ext";
public static final String HOME_INFO_TELECOM_TELEPHONE_COMMENT = "user.home-info.telecom.telephone.comment";
public static final String HOME_INFO_TELECOM_FAX_INT = "user.home-info.telecom.fax.intcode";
public static final String HOME_INFO_TELECOM_FAX_LOCCODE = "user.home-info.telecom.fax.loccode";
public static final String HOME_INFO_TELECOM_FAX_NUMBER = "user.home-info.telecom.fax.number";
public static final String HOME_INFO_TELECOM_FAX_EXT = "user.home-info.telecom.fax.ext";
public static final String HOME_INFO_TELECOM_FAX_COMMENT = "user.home-info.telecom.fax.comment";
public static final String HOME_INFO_TELECOM_MOBILE_INTCODE = "user.home-info.telecom.mobile.intcode";
public static final String HOME_INFO_TELECOM_MOBILE_LOCCODE = "user.home-info.telecom.mobile.loccode";
public static final String HOME_INFO_TELECOM_MOBILE_NUMBER = "user.home-info.telecom.mobile.number";
public static final String HOME_INFO_TELECOM_MOBILE_EXT = "user.home-info.telecom.mobile.ext";
public static final String HOME_INFO_TELECOM_MOBILE_COMMENT = "user.home-info.telecom.mobile.comment";
public static final String HOME_INFO_TELECOM_PAGER_INTCODE = "user.home-info.telecom.pager.intcode";
public static final String HOME_INFO_TELECOM_PAGER_LOCCODE = "user.home-info.telecom.pager.loccode";
public static final String HOME_INFO_TELECOM_PAGER_NUMBER = "user.home-info.telecom.pager.number";
public static final String HOME_INFO_TELECOM_PAGER_EXT = "user.home-info.telecom.pager.ext";
public static final String HOME_INFO_TELECOM_PAGER_COMMENT = "user.home-info.telecom.pager.comment";
public static final String HOME_INFO_ONLINE_EMAIL = "user.home-info.online.email";
public static final String HOME_INFO_ONLINE_URI = "user.home-info.online.uri";
public static final String BUSINESS_INFO_POSTAL_NAME = "user.business-info.postal.name";
public static final String BUSINESS_INFO_POSTAL_STREET = "user.business-info.postal.street";
public static final String BUSINESS_INFO_POSTAL_CITY = "user.business-info.postal.city";
public static final String BUSINESS_INFO_POSTAL_STATEPROV = "user.business-info.postal.stateprov";
public static final String BUSINESS_INFO_POSTAL_POSTALCODE = "user.business-info.postal.postalcode";
public static final String BUSINESS_INFO_POSTAL_COUNTRY = "user.business-info.postal.country";
public static final String BUSINESS_INFO_POSTAL_ORGANIZATION = "user.business-info.postal.organization";
public static final String BUSINESS_INFO_TELECOM_TELEPHONE_INTCODE = "user.business-info.telecom.telephone.intcode";
public static final String BUSINESS_INFO_TELECOM_TELEPHONE_LOCCODE = "user.business-info.telecom.telephone.loccode";
public static final String BUSINESS_INFO_TELECOM_TELEPHONE_NUMBER = "user.business-info.telecom.telephone.number";
public static final String BUSINESS_INFO_TELECOM_TELEPHONE_EXT = "user.business-info.telecom.telephone.ext";
public static final String BUSINESS_INFO_TELECOM_TELEPHONE_COMMENT = "user.business-info.telecom.telephone.comment";
public static final String BUSINESS_INFO_TELECOM_FAX_INTCODE = "user.business-info.telecom.fax.intcode";
public static final String BUSINESS_INFO_TELECOM_FAX_LOCCODE = "user.business-info.telecom.fax.loccode";
public static final String BUSINESS_INFO_TELECOM_FAX_NUMBER = "user.business-info.telecom.fax.number";
public static final String BUSINESS_INFO_TELECOM_FAX_EXT = "user.business-info.telecom.fax.ext";
public static final String BUSINESS_INFO_TELECOM_FAX_COMMENT = "user.business-info.telecom.fax.comment";
public static final String BUSINESS_INFO_TELECOM_MOBILE_INTCODE = "user.business-info.telecom.mobile.intcode";
public static final String BUSINESS_INFO_TELECOM_MOBILE_LOCCODE = "user.business-info.telecom.mobile.loccode";
public static final String BUSINESS_INFO_TELECOM_MOBILE_NUMBER = "user.business-info.telecom.mobile.number";
public static final String BUSINESS_INFO_TELECOM_MOBILE_EXT = "user.business-info.telecom.mobile.ext";
public static final String BUSINESS_INFO_TELECOM_MOBILE_COMMENT = "user.business-info.telecom.mobile.comment";
public static final String BUSINESS_INFO_TELECOM_PAGER_INTCODE = "user.business-info.telecom.pager.intcode";
public static final String BUSINESS_INFO_TELECOM_PAGER_LOCCODE = "user.business-info.telecom.pager.loccode";
public static final String BUSINESS_INFO_TELECOM_PAGER_NUMBER = "user.business-info.telecom.pager.number";
public static final String BUSINESS_INFO_TELECOM_PAGER_EXT = "user.business-info.telecom.pager.ext";
public static final String BUSINESS_INFO_TELECOM_PAGER_COMMENT = "user.business-info.telecom.pager.comment";
public static final String BUSINESS_INFO_ONLINE_EMAIL = "user.business-info.online.email";
public static final String BUSINESS_INFO_ONLINE_URI = "user.business-info.online.uri";
public static final String ANONYMOUS_USERNAME = "GUEST";
/** USER REALM TYPE **/
public static final String USER_REALM = "FRONT_OFFICE_USER";
private static final long serialVersionUID = -8733640540563208835L;
/** Map containing users info */
private Map<String, String> _mapUserInfo = new HashMap<>( );
/** User's name */
private String _strUserName;
/** User's roles */
private String [ ] _roles;
/** User's groups */
private String [ ] _groups;
/** Authentication Service */
private String _strAuthenticationService;
/** Authentication Service impl */
private LuteceAuthentication _luteceAuthenticationService;
/** Authentication Service */
private String _strAuthenticationType;
/** User's workgroups */
private List<String> _workgroups = new ArrayList<String>( );
/**
* Constructor
*
* @param strUserName
* The User Name
* @param authenticationService
* The PortalAuthentication object
*/
public LuteceUser( String strUserName, LuteceAuthentication authenticationService )
{
_strUserName = strUserName;
_strAuthenticationService = authenticationService.getAuthServiceName( );
_luteceAuthenticationService = authenticationService;
}
/**
* Gets the user info map
*
* @return The user info map
*/
public final Map<String, String> getUserInfos( )
{
return _mapUserInfo;
}
/**
* Add an user's info
*
* @param key
* The info key
* @param value
* The info value
*/
public final void setUserInfo( String key, String value )
{
_mapUserInfo.put( key, value );
}
/**
* Gets the user info value
*
* @param key
* The info key
* @return the user info value
*/
public final String getUserInfo( String key )
{
String strInfo = _mapUserInfo.get( key );
return ( strInfo == null ) ? "" : strInfo;
}
// /////////////////////////////////////////////////////////////////////////
// Principal Interface Implementation
/**
* equals implementation
*
* @param object
* The object to compare
* @return true if equal, otherwise false
*/
@Override
public boolean equals( Object object )
{
// FIXME : use LuteceUser property instead of object.toString()
return ObjectUtils.equals( this.toString( ), ObjectUtils.toString( object ) );
}
/**
* toString implementation
*
* @return The username
*/
@Override
public String toString( )
{
return _strUserName;
}
/**
* hashCode implementation
*
* @return The hashcode
*/
@Override
public int hashCode( )
{
return ( _strUserName == null ) ? 0 : _strUserName.hashCode( );
}
/**
* Return the user's name
*
* @return The username
*/
@Override
public String getName( )
{
return _strUserName;
}
// /////////////////////////////////////////////////////////////////////////
// Other user's info methods
/**
* Sets the user's name
*
* @param strName
* The User name
*/
public void setName( String strName )
{
_strUserName = strName;
}
/**
* Returns user's roles
*
* @return Returns user's roles
*/
public String [ ] getRoles( )
{
return _roles;
}
/**
* {@inheritDoc }
*/
@Override
public Map<String, UserRole> getUserRoles( )
{
Map<String, UserRole> mapRoles = new HashMap<>( );
for ( String strRole : _roles )
{
mapRoles.put( strRole, new RBACRole( strRole, strRole ) );
}
return mapRoles;
}
/**
* add user's roles
*
* @param roles
* The User roles
*/
public void addRoles( Collection<String> roles )
{
_roles = addInArray( _roles, roles );
}
/**
* Defines user's roles
*
* @param roles
* The User roles
*/
public void setRoles( Collection<String> roles )
{
_roles = getArray( roles );
}
/**
* Returns user's groups
*
* @return Returns user's groups
*/
public String [ ] getGroups( )
{
return _groups;
}
/**
* add user's groups
*
* @param groups
* The User groups
*/
public void addGroups( Collection<String> groups )
{
_groups = addInArray( _groups, groups );
}
/**
* Defines user's groups
*
* @param groups
* The User groups
*/
public void setGroups( Collection<String> groups )
{
_groups = getArray( groups );
}
/**
* Add elements of a collection into an array
*
* @param array
* the array to fill
* @param collection
* the collection containing the elements to add
* @return The new array
*/
private String [ ] addInArray( String [ ] array, Collection<String> collection )
{
String [ ] newArray;
int j = 0;
if ( array == null )
{
newArray = new String [ collection.size( )];
}
else
{
newArray = Arrays.copyOf( array, collection.size( ) + array.length );
j= array.length;
}
for ( String strItem : collection )
{
newArray [j++] = strItem;
}
return newArray;
}
/**
* Set elements of a collection in array
*
* @param collection
* the collection containing the elements to add
* @return An array
*/
private String [ ] getArray( Collection<String> collection )
{
String [ ] newArray = new String [ collection.size( )];
int j = 0;
for ( String strItem : collection )
{
newArray [j++] = strItem;
}
return newArray;
}
// //////////////////////////////////////////////////////////////////////////
// Authentication infos
/**
* Defines the authentification service that had authentified the user
*
* @param strAuthenticationService
* The authentification service
*/
public void setAuthenticationService( String strAuthenticationService )
{
_strAuthenticationService = strAuthenticationService;
}
/**
* Returns the authentification service that had authentified the user
*
* @return the authentification service that had authentified the user
*/
public String getAuthenticationService( )
{
return _strAuthenticationService;
}
/**
* Defines the authentification type that had authentified the user
*
* @param strAuthenticationType
* The authentification type
*/
public void setAuthenticationType( String strAuthenticationType )
{
_strAuthenticationType = strAuthenticationType;
}
/**
* Returns the authentification type that had authentified the user
*
* @return the authentification type that had authentified the user
*/
public String getAuthenticationType( )
{
return _strAuthenticationType;
}
/**
* "Getter method" for {@link #_luteceAuthenticationService}
*
* @return value of {@link #_luteceAuthenticationService}
*/
public LuteceAuthentication getLuteceAuthenticationService( )
{
return _luteceAuthenticationService;
}
/**
* "Setter method" for {@link #_luteceAuthenticationService}.
*
* @param authenticationService
* new value of {@link #_luteceAuthenticationService}
*/
public void setLuteceAuthenticationService( LuteceAuthentication authenticationService )
{
_luteceAuthenticationService = authenticationService;
}
/**
* {@inheritDoc}
*/
@Override
public Object clone( ) throws CloneNotSupportedException
{
return super.clone( );
}
/**
* Get the users email
*
* @return The email
*/
@Override
public String getEmail( )
{
return null;
}
/**
* {@inheritDoc}
*/
@Override
public String getAccessCode( )
{
return getName( );
}
/**
* {@inheritDoc}
*/
@Override
public String getLastName( )
{
return this.getUserInfo( LuteceUser.NAME_FAMILY );
}
/**
* {@inheritDoc}
*/
public @Override String getFirstName( )
{
return this.getUserInfo( LuteceUser.NAME_GIVEN );
}
/**
* {@inheritDoc}
*/
@Override
public List<String> getUserWorkgroups( )
{
return _workgroups;
}
/**
* {@inheritDoc}
*/
@Override
public String getRealm( )
{
return USER_REALM;
}
}