public abstract class SpringLDAPConnector extends Object implements LDAPDirectory
Warning: CWD-2494: When read timeout is enabled, operations can fail randomly with "javax.naming.NamingException: LDAP response read timed out..." error message without waiting for the timeout to pass.
| Modifier and Type | Field and Description |
|---|---|
protected AttributeValuesHolder |
attributes |
protected org.springframework.ldap.core.ContextSource |
contextSource |
protected org.springframework.ldap.transaction.compensating.manager.ContextSourceTransactionManager |
contextSourceTransactionManager |
static int |
DEFAULT_PAGE_SIZE |
protected com.atlassian.event.api.EventPublisher |
eventPublisher |
protected LDAPPropertiesMapper |
ldapPropertiesMapper |
protected LDAPQueryTranslater |
ldapQueryTranslater |
protected SpringLdapTemplateWrapper |
ldapTemplate |
protected Converter |
nameConverter |
protected SearchDN |
searchDN |
| Constructor and Description |
|---|
SpringLDAPConnector(LDAPQueryTranslater ldapQueryTranslater,
com.atlassian.event.api.EventPublisher eventPublisher,
InstanceFactory instanceFactory,
LdapContextSourceProvider ldapContextSourceProvider) |
| Modifier and Type | Method and Description |
|---|---|
protected void |
addDefaultSnToUserAttributes(Attributes attrs,
String defaultSnValue)
A default install of many directory servers (inc.
|
protected void |
addDefaultValueToUserAttributesForAttribute(String attributeName,
Attributes attrs,
String defaultValue) |
Group |
addGroup(GroupTemplate group)
Adds a
group to the directory store. |
LDAPUserWithAttributes |
addUser(UserTemplate user,
PasswordCredential credential)
Adds a user to LDAP.
|
LDAPUserWithAttributes |
addUser(UserTemplateWithAttributes user,
PasswordCredential credential)
Adds a user to LDAP.
|
protected LdapName |
asLdapGroupName(String dn,
String groupName)
Convenience method to convert group DN to LdapName,
throwing a GNFE with the supplied group name if unable
to construct the LdapName.
|
protected <T extends LDAPDirectoryEntity> |
asLdapName(String dn,
String entityName,
Class<T> entityClass)
This method is required to wrap DN's into LdapNames as spring-ldap
doesn't correctly handle operations with String dn arguments.
|
protected LdapName |
asLdapUserName(String dn,
String userName)
Convenience method to convert user DN to LdapName,
throwing a GNFE with the supplied user name if unable
to construct the LdapName.
|
User |
authenticate(String name,
PasswordCredential credential)
Authenticates a
user with the directory store. |
protected ContextMapperWithRequiredAttributes<AvatarReference.BlobAvatar> |
avatarMapper() |
BoundedCount |
countDirectMembersOfGroup(String groupName,
int querySizeHint)
Count the direct members of a group in the remote directory.
|
protected static ModificationItem |
createModificationItem(String directoryAttributeName,
String oldValue,
String newValue)
This method is not suitable for generic attribute updates as it only supports single
attribute-value mappings (ie.
|
void |
expireAllPasswords()
Sets the
UserConstants.REQUIRES_PASSWORD_CHANGE attribute to true for
all users in the directory using bulk operations |
<T extends LDAPDirectoryEntity> |
findEntityByDN(String dn,
Class<T> entityClass)
Finds a directory entity (principal, group or role)
by their distinguished name.
|
protected <T extends LDAPDirectoryEntity> |
findEntityByDN(String dn,
String baseDN,
String filter,
ContextMapperWithRequiredAttributes contextMapper,
Class<T> entityClass) |
LDAPGroupWithAttributes |
findGroupByName(String name)
Finds the
group that matches the supplied name. |
protected LDAPGroupWithAttributes |
findGroupByNameAndType(String name,
GroupType groupType) |
LDAPGroupWithAttributes |
findGroupWithAttributesByName(String name)
Finds the
group that matches the supplied name. |
LDAPUserWithAttributes |
findUserByExternalId(String externalId)
Finds the user that matches the supplied
externalId. |
LDAPUserWithAttributes |
findUserByName(String name)
Finds the
user that matches the supplied name. |
LDAPUserWithAttributes |
findUserWithAttributesByName(String name)
Finds the
user that matches the supplied name. |
boolean |
getAttributeAsBoolean(String name,
boolean defaultValue) |
long |
getAttributeAsLong(String name,
long defaultValue) |
RemoteDirectory |
getAuthoritativeDirectory() |
protected Map<String,Object> |
getBaseEnvironmentProperties()
Returns the properties used to set up the Ldap ContextSource.
|
org.springframework.ldap.core.ContextSource |
getContextSource()
Exposed so that delegated directories can get a handle on the underlying LDAP context.
|
protected abstract LDAPCredentialEncoder |
getCredentialEncoder() |
protected List<AttributeMapper> |
getCustomGroupAttributeMappers()
As a minimum, this SHOULD provide an attribute mapper that maps the group members attribute (if available).
|
protected List<AttributeMapper> |
getCustomUserAttributeMappers(UserContextMapperConfig config) |
long |
getDirectoryId()
Gets the internal unique
directoryId of the directory store. |
ContextMapperWithRequiredAttributes<LDAPGroupWithAttributes> |
getGroupContextMapper(GroupType groupType,
boolean withAllAttributes)
Returns a ContextMapper ready to translate LDAP objects into Groups.
|
protected String |
getInitialGroupMemberDN()
Returns the default container member DN.
|
Set<String> |
getKeys()
Gets all the keys of the attributes.
|
LDAPPropertiesMapper |
getLdapPropertiesMapper() |
protected Attributes |
getNewGroupAttributes(Group group) |
protected void |
getNewGroupDirectorySpecificAttributes(Group group,
Attributes attributes)
Populates attributes object with directory-specific attributes.
|
protected Attributes |
getNewUserAttributes(User user,
PasswordCredential credential)
Translates the
User into LDAP attributes, in preparation for creating a new user. |
protected void |
getNewUserDirectorySpecificAttributes(User user,
Attributes attributes)
Populates attributes object with directory-specific attributes.
|
protected List<AttributeMapper> |
getRequiredCustomGroupAttributeMappers()
Returns a set of attributes which are expected to be present in all cases (ie Active Directory's objectGUID)
Due to performance reasons returning mappers for heavy attributes (such as memberships) should be avoided
|
protected SearchControls |
getSearchControls(ContextMapperWithRequiredAttributes<?> mapper,
int scope) |
SearchDN |
getSearchDN() |
AvatarReference.BlobAvatar |
getUserAvatarByName(String username,
int sizeHint)
Return an avatar, if available, for the named user.
|
protected List<ModificationItem> |
getUserModificationItems(User userTemplate,
LDAPUserWithAttributes currentUser) |
String |
getValue(String name)
Returns any value associated with the given key, returns
null if there is no value. |
Set<String> |
getValues(String name)
Get all the values associated with a given key.
|
boolean |
isEmpty() |
boolean |
isRolesDisabled()
Expose whether the directory has roles disabled.
|
protected org.springframework.ldap.core.CollectingNameClassPairCallbackHandler |
pageSearchResults(Name baseDN,
String filter,
org.springframework.ldap.core.ContextMapper contextMapper,
SearchControls searchControls,
org.springframework.ldap.core.DirContextProcessor ldapRequestControls,
int maxResults)
Performs a paged results search on an LDAP directory server searching using the LDAP paged results control
option to fetch results in chunks rather than all at once.
|
protected List<LDAPGroupWithAttributes> |
postprocessGroups(List<LDAPGroupWithAttributes> groups)
Perform any post-processing on groups.
|
void |
removeGroup(String name)
Removes the
group that matches the supplied name. |
void |
removeGroupAttributes(String groupName,
String attributeName)
Removes all the values for a single attribute key for a group.
|
void |
removeUser(String name)
Removes the
user that matches the supplied name. |
void |
removeUserAttributes(String username,
String attributeName)
Removes all the values for a single attribute key for a user.
|
Group |
renameGroup(String oldName,
String newName)
Renames a
group. |
User |
renameUser(String oldName,
String newName)
Renames a
user. |
protected <T> List<T> |
searchEntities(Name baseDN,
String filter,
ContextMapperWithRequiredAttributes<T> contextMapper,
int startIndex,
int maxResults)
Executes a search with paging if paged results is supported.
|
protected <T> List<T> |
searchEntitiesWithRequestControls(Name baseDN,
String filter,
ContextMapperWithRequiredAttributes<T> contextMapper,
SearchControls searchControls,
org.springframework.ldap.core.DirContextProcessor ldapRequestControls,
int startIndex,
int maxResults) |
<T> List<T> |
searchGroupObjects(EntityQuery<?> query,
ContextMapperWithRequiredAttributes<T> mapper) |
protected <T> List<T> |
searchGroupObjectsOfSpecifiedGroupType(EntityQuery<?> query,
ContextMapperWithRequiredAttributes<T> mapper)
This method expects that the query contains a non-null groupType in the entityDescriptor.
|
<T> List<T> |
searchGroupRelationships(MembershipQuery<T> query)
Searches for membership information.
|
protected abstract <T> Iterable<T> |
searchGroupRelationshipsWithGroupTypeSpecified(MembershipQuery<T> query)
Execute the search for group relationships given that a group of type GROUP or LEGACY_ROLE has
been specified in the EntityDescriptor for the group(s).
|
<T> List<T> |
searchGroups(EntityQuery<T> query)
Searches for
groups that match the supplied query criteria. |
<T> List<T> |
searchUserObjects(EntityQuery<?> query,
ContextMapperWithRequiredAttributes<T> mapper) |
<T> List<T> |
searchUsers(EntityQuery<T> query)
Searches for
users that match the supplied query criteria. |
void |
setAttributes(Map<String,String> attributes)
Called by the
DirectoryInstanceLoader after
constructing an InternalDirectory. |
void |
setDirectoryId(long id)
Called by the
DirectoryInstanceLoader after
constructing an InternalDirectory. |
protected void |
setLdapPropertiesMapperAttributes(Map<String,String> attributes) |
void |
storeGroupAttributes(String groupName,
Map<String,Set<String>> attributes)
Adds or updates a group's attributes with the new Map of attribute values in the directory specified by the passed in
directoryId. |
void |
storeUserAttributes(String username,
Map<String,Set<String>> attributes)
Adds or updates a user's attributes with the new Map of attribute values in the directory specified by the passed in
directoryId. |
boolean |
supportsInactiveAccounts()
Storing active/inactive flag for users in LDAP in general is currently not supported.
|
boolean |
supportsNestedGroups()
Allows us to only display nested-group related UI for directories that support it.
|
boolean |
supportsPasswordExpiration()
We don't support expiring passwords in LDAP directories (yet).
|
boolean |
supportsSettingEncryptedCredential()
If this method returns true, then calling
RemoteDirectory.updateUserCredential(String, PasswordCredential) or
RemoteDirectory.addUser(com.atlassian.crowd.model.user.UserTemplate, com.atlassian.crowd.embedded.api.PasswordCredential)
with a PasswordCredential instance where PasswordCredential.isEncryptedCredential() returns true
and the instance is not equal to PasswordCredential.NONE will succeed; otherwise, it will fail. |
void |
testConnection()
Test if a connection to the directory server can be established.
|
protected <T extends LDAPDirectoryEntity> |
typedEntityNotFoundException(String name,
Class<T> entityClass) |
Group |
updateGroup(GroupTemplate group)
Updates the
group. |
User |
updateUser(UserTemplate user)
Updates the
user. |
void |
updateUserCredential(String name,
PasswordCredential credential)
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitaddGroupToGroup, addUserToGroup, getDescriptiveName, getLocallyFilteredGroupNames, getMemberships, isGroupDirectGroupMember, isUserDirectGroupMember, removeGroupFromGroup, removeUserFromGroup, updateUserFromRemoteDirectory, userAuthenticatedpublic static final int DEFAULT_PAGE_SIZE
protected volatile AttributeValuesHolder attributes
protected volatile SpringLdapTemplateWrapper ldapTemplate
protected volatile org.springframework.ldap.core.ContextSource contextSource
protected volatile Converter nameConverter
protected volatile SearchDN searchDN
protected volatile LDAPPropertiesMapper ldapPropertiesMapper
protected volatile org.springframework.ldap.transaction.compensating.manager.ContextSourceTransactionManager contextSourceTransactionManager
protected final LDAPQueryTranslater ldapQueryTranslater
protected final com.atlassian.event.api.EventPublisher eventPublisher
public SpringLDAPConnector(LDAPQueryTranslater ldapQueryTranslater, com.atlassian.event.api.EventPublisher eventPublisher, InstanceFactory instanceFactory, LdapContextSourceProvider ldapContextSourceProvider)
public BoundedCount countDirectMembersOfGroup(String groupName, int querySizeHint) throws OperationFailedException
RemoteDirectorycountDirectMembersOfGroup in interface RemoteDirectorygroupName - the name of the group to search forquerySizeHint - hinting at the maximum number of memberships that should be counted. The directory that
implements this may choose to count less or more. This is a user provided suggestion for potential efficiency.OperationFailedException - if we failed to count the number of memberships for the provided group.public long getDirectoryId()
RemoteDirectorydirectoryId of the directory store.getDirectoryId in interface RemoteDirectorydirectoryId.public void setDirectoryId(long id)
DirectoryInstanceLoader after
constructing an InternalDirectory.setDirectoryId in interface RemoteDirectoryid - The unique id of the Directory stored in the database.public void setAttributes(Map<String,String> attributes)
DirectoryInstanceLoader after
constructing an InternalDirectory.setAttributes in interface RemoteDirectoryattributes - attributes map.protected void setLdapPropertiesMapperAttributes(Map<String,String> attributes)
public org.springframework.ldap.core.ContextSource getContextSource()
public LDAPPropertiesMapper getLdapPropertiesMapper()
public Set<String> getValues(String name)
AttributesgetValues in interface Attributesname - the key to retrieve the values forpublic String getValue(String name)
Attributesnull if there is no value.getValue in interface Attributesname - the key to retrieve the value fornull if there is no valuepublic boolean isEmpty()
isEmpty in interface Attributestrue if there are no attributespublic long getAttributeAsLong(String name, long defaultValue)
public boolean getAttributeAsBoolean(String name, boolean defaultValue)
public Set<String> getKeys()
AttributesgetKeys in interface Attributespublic SearchDN getSearchDN()
protected SearchControls getSearchControls(ContextMapperWithRequiredAttributes<?> mapper, int scope)
protected Map<String,Object> getBaseEnvironmentProperties()
protected org.springframework.ldap.core.CollectingNameClassPairCallbackHandler pageSearchResults(Name baseDN, String filter, org.springframework.ldap.core.ContextMapper contextMapper, SearchControls searchControls, org.springframework.ldap.core.DirContextProcessor ldapRequestControls, int maxResults) throws OperationFailedException
baseDN - The DN to beging the search from.filter - The search filter.contextMapper - Maps from LDAP search results into objects such as Groups.searchControls - The LDAP search scope type.ldapRequestControls - Any LDAP request controls (set to null if you do not need additional request controls for the search).maxResults - maximum number of results to return. Set to -1 if no result limiting is desired (WARNING: doing so is obviously a hazard).OperationFailedException - Search failed due to a communication error to the remote directoryprotected <T> List<T> searchEntities(Name baseDN, String filter, ContextMapperWithRequiredAttributes<T> contextMapper, int startIndex, int maxResults) throws OperationFailedException
baseDN - base DN of search.filter - encoded LDAP search filter.contextMapper - directory context to object mapper.startIndex - index to start at. Set to 0 to start from the first result.maxResults - maximum number of results to return. Set to -1 if no result limiting is desired (WARNING: doing so is obviously a hazard).OperationFailedException - a Communication error occurred when trying to talk to a remote directoryprotected <T> List<T> searchEntitiesWithRequestControls(Name baseDN, String filter, ContextMapperWithRequiredAttributes<T> contextMapper, SearchControls searchControls, org.springframework.ldap.core.DirContextProcessor ldapRequestControls, int startIndex, int maxResults) throws OperationFailedException
OperationFailedExceptionprotected static ModificationItem createModificationItem(String directoryAttributeName, String oldValue, String newValue)
directoryAttributeName - the name of the attribute in LDAP to potentially add or modify.oldValue - the value load from the LDAP directory (i.e. already processed by
DirectoryAttributeRetriever.fromSavedLDAPValue(String))newValue - the value which should be saved into LDAP (i.e. NOT processed by
DirectoryAttributeRetriever.toSaveableLDAPValue(String) yet)protected List<AttributeMapper> getCustomUserAttributeMappers(UserContextMapperConfig config)
public ContextMapperWithRequiredAttributes<LDAPGroupWithAttributes> getGroupContextMapper(GroupType groupType, boolean withAllAttributes)
groupType - the GroupTypewithAllAttributes - determines if all additional attribute mappers should be included. Some directories
may include additional attributes, which are expected to be present in all casesprotected List<AttributeMapper> getCustomGroupAttributeMappers()
protected List<AttributeMapper> getRequiredCustomGroupAttributeMappers()
public LDAPUserWithAttributes findUserByName(String name) throws UserNotFoundException, OperationFailedException
RemoteDirectoryuser that matches the supplied name.findUserByName in interface RemoteDirectoryname - the name of the user (username).UserNotFoundException - a user with the supplied name does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public LDAPUserWithAttributes findUserWithAttributesByName(String name) throws UserNotFoundException, OperationFailedException
RemoteDirectoryuser that matches the supplied name.findUserWithAttributesByName in interface RemoteDirectoryname - the name of the user (username).UserNotFoundException - a user with the supplied name does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public LDAPUserWithAttributes findUserByExternalId(String externalId) throws UserNotFoundException, OperationFailedException
RemoteDirectoryexternalId.
This is an optional method that may not be implemented on all directory types.
Currently it is implemented for LDAP and Internal directories but not Crowd directories.findUserByExternalId in interface RemoteDirectoryexternalId - the externalId of the userexternalId.UserNotFoundException - a user with the supplied externalId does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.RemoteDirectory.findUserByName(String)public <T> List<T> searchUserObjects(EntityQuery<?> query, ContextMapperWithRequiredAttributes<T> mapper) throws OperationFailedException, IllegalArgumentException
public void removeUser(String name) throws UserNotFoundException, OperationFailedException
RemoteDirectoryuser that matches the supplied name.removeUser in interface RemoteDirectoryname - The name of the user (username).UserNotFoundException - The user does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public void updateUserCredential(String name, PasswordCredential credential) throws InvalidCredentialException, UserNotFoundException, OperationFailedException
RemoteDirectoryupdateUserCredential in interface RemoteDirectoryname - The name of the user (username).credential - The new credential (password).InvalidCredentialException - The supplied credential is invalid.UserNotFoundException - The user does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.RemoteDirectory.supportsSettingEncryptedCredential()public User renameUser(String oldName, String newName) throws UserNotFoundException, InvalidUserException, OperationFailedException
RemoteDirectoryuser.renameUser in interface RemoteDirectoryoldName - name of existing user.newName - desired name of user.UserNotFoundException - if the user with the existing name does not exist.InvalidUserException - if the new username is invalid.OperationFailedException - if the underlying directory implementation failed to execute the operation.public void storeUserAttributes(String username, Map<String,Set<String>> attributes) throws UserNotFoundException, OperationFailedException
RemoteDirectorydirectoryId.
The attributes map represents new or updated attributes and does not replace existing attributes unless the key of an attribute matches the key of an existing
Attributes with values of empty sets are not added (these attributes are effectively removed).
storeUserAttributes in interface RemoteDirectoryusername - name of user to update.attributes - new or updated attributes (attributes that don't need changing should not appear in this Map).UserNotFoundException - user with supplied username does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public void removeUserAttributes(String username, String attributeName) throws UserNotFoundException, OperationFailedException
RemoteDirectoryremoveUserAttributes in interface RemoteDirectoryusername - name of the user to update.attributeName - name of attribute to remove.UserNotFoundException - user with supplied username does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.protected Attributes getNewUserAttributes(User user, PasswordCredential credential) throws InvalidCredentialException, org.springframework.ldap.NamingException
User into LDAP attributes, in preparation for creating a new user.user - The user object to translate into LDAP attributescredential - raw password.InvalidCredentialException - The password, if supplied, was invalid in some manner.org.springframework.ldap.NamingException - If the User could not be translated to an Attributesprotected void getNewUserDirectorySpecificAttributes(User user, Attributes attributes)
Overrider of this method can take advantage of the default group attributes mapping logic in {#getNewUserAttributes(User)}.
Note that the attribute values supplied here will be used raw. This entails that overrider is responsible for supplying values in a format supported by the directory. In some directory implementations, for example, a blank string ("") is considered illegal. Overrider thus would have to make sure the method does not generate a value as such.
user - (potential) source of information that needs to be added.attributes - attributes to add directory-specific information to.public LDAPUserWithAttributes addUser(UserTemplate user, PasswordCredential credential) throws InvalidUserException, InvalidCredentialException, OperationFailedException
addUser in interface RemoteDirectoryuser - template of the user to add.credential - password.InvalidUserException - if the user to create was deemed invalid by the LDAP server or already exists.InvalidCredentialException - if the password credential was deemed invalid by the password encoder.OperationFailedException - if we were unable to add the user to LDAP.RemoteDirectory.supportsSettingEncryptedCredential()public LDAPUserWithAttributes addUser(UserTemplateWithAttributes user, PasswordCredential credential) throws InvalidUserException, InvalidCredentialException, OperationFailedException
addUser in interface RemoteDirectoryuser - template of the user to add.credential - password.InvalidUserException - if the user to create was deemed invalid by the LDAP server or already exists.InvalidCredentialException - if the password credential was deemed invalid by the password encoder.OperationFailedException - if we were unable to add the user to LDAP.RemoteDirectory.supportsSettingEncryptedCredential()protected void addDefaultSnToUserAttributes(Attributes attrs, String defaultSnValue)
objectClass -> inetorgperson cn -> sn ->If a call is being made from an external system (eg JIRA), the user is created with the bare minimum of attributes, then later updated. We need to make sure to add
sn if it's not present in the
information provided.attrs - The LDAP user attributes to be checked and potentially updated.defaultSnValue - default lastname/surname valueprotected void addDefaultValueToUserAttributesForAttribute(String attributeName, Attributes attrs, String defaultValue)
public <T extends LDAPDirectoryEntity> T findEntityByDN(String dn, Class<T> entityClass) throws UserNotFoundException, GroupNotFoundException, OperationFailedException
LDAPDirectoryThe object class of an entity is used to determine the entity type.
If an object represents both a group and role, then the object is mapped to a group.
findEntityByDN in interface LDAPDirectorydn - standardised distinguished name.entityClass - class of the entity to find (either LDAPUserWithAttributes or LDAPGroupWithAttributes).UserNotFoundException - if a user
does not exist at the specified DN or the DN does not
exist in the directory. This will also be thrown if
the entity DOES exist but does not match the base DN
or object filter for the entity type.GroupNotFoundException - if a user
does not exist at the specified DN or the DN does not
exist in the directory. This will also be thrown if
the entity DOES exist but does not match the base DN
or object filter for the entity type.OperationFailedException - if underlying directory implementation failed to execute the operation.protected <T extends LDAPDirectoryEntity> RuntimeException typedEntityNotFoundException(String name, Class<T> entityClass) throws UserNotFoundException, GroupNotFoundException
protected <T extends LDAPDirectoryEntity> T findEntityByDN(String dn, String baseDN, String filter, ContextMapperWithRequiredAttributes contextMapper, Class<T> entityClass) throws UserNotFoundException, GroupNotFoundException, OperationFailedException
public User updateUser(UserTemplate user) throws UserNotFoundException, OperationFailedException
RemoteDirectoryuser.updateUser in interface RemoteDirectoryuser - The user to update.UserNotFoundException - the user does not exist in the directory store.OperationFailedException - underlying directory implementation failed to execute the operation.protected List<ModificationItem> getUserModificationItems(User userTemplate, LDAPUserWithAttributes currentUser)
public <T> List<T> searchUsers(EntityQuery<T> query) throws OperationFailedException
RemoteDirectoryusers that match the supplied query criteria.
The users will be returned in a stable order including across pagination boundaries (excluding modification).
searchUsers in interface RemoteDirectoryquery - EntityQuery for Entity.USER.List<User> or List<String> of users/usernames
matching the search criteria. An empty List will be returned
if no users matching the criteria are found.OperationFailedException - if the underlying directory implementation failed to execute the operationpublic User authenticate(String name, PasswordCredential credential) throws InvalidAuthenticationException, UserNotFoundException, OperationFailedException
RemoteDirectoryuser with the directory store.authenticate in interface RemoteDirectoryname - The name of the user (username).credential - The supplied credentials (password).InvalidAuthenticationException - Authentication with the provided credentials failed.UserNotFoundException - The user with the supplied name does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public LDAPGroupWithAttributes findGroupByName(String name) throws GroupNotFoundException, OperationFailedException
RemoteDirectorygroup that matches the supplied name.findGroupByName in interface RemoteDirectoryname - the name of the group.GroupNotFoundException - a group with the supplied name does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public LDAPGroupWithAttributes findGroupWithAttributesByName(String name) throws GroupNotFoundException, OperationFailedException
RemoteDirectorygroup that matches the supplied name.findGroupWithAttributesByName in interface RemoteDirectoryname - the name of the group.GroupNotFoundException - a group with the supplied name does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.protected LDAPGroupWithAttributes findGroupByNameAndType(String name, GroupType groupType) throws GroupNotFoundException, OperationFailedException
protected <T> List<T> searchGroupObjectsOfSpecifiedGroupType(EntityQuery<?> query, ContextMapperWithRequiredAttributes<T> mapper) throws OperationFailedException
query - search query.OperationFailedException - represents a Communication error when trying to talk to a remote directorypublic <T> List<T> searchGroupObjects(EntityQuery<?> query, ContextMapperWithRequiredAttributes<T> mapper) throws OperationFailedException
OperationFailedExceptionpublic <T> List<T> searchGroups(EntityQuery<T> query) throws OperationFailedException
RemoteDirectorygroups that match the supplied query criteria.
The groups will be returned in a stable order including across pagination boundaries (excluding modification).
searchGroups in interface RemoteDirectoryquery - EntityQuery for Entity.GROUP.List<Group> or List<String> of groups/groupnames
matching the search criteria. An empty List will be returned
if no groups matching the criteria are found.OperationFailedException - if the underlying directory implementation failed to execute the operationprotected List<LDAPGroupWithAttributes> postprocessGroups(List<LDAPGroupWithAttributes> groups) throws OperationFailedException
groups - to post-processOperationFailedException - if processing encounters a problem with the underlying directoryprotected Attributes getNewGroupAttributes(Group group) throws org.springframework.ldap.NamingException
org.springframework.ldap.NamingExceptionprotected void getNewGroupDirectorySpecificAttributes(Group group, Attributes attributes)
Overrider of this method can take advantage of the default group attributes mapping logic in {#getNewGroupAttributes(Group)}.
Note that the attribute values supplied here will be used raw. This entails that overrider is responsible for supplying values in a format supported by the directory. In some directory implementations, for example, a blank string ("") is considered illegal. Overrider thus would have to make sure the method does not generate a value as such.
group - (potential) source of information that needs to be added.attributes - attributes to add directory-specific information to.protected String getInitialGroupMemberDN()
If this method returns null or blank string, no member DN will be added.
public Group addGroup(GroupTemplate group) throws InvalidGroupException, OperationFailedException
RemoteDirectorygroup to the directory store.addGroup in interface RemoteDirectorygroup - template of the group to add.InvalidGroupException - The supplied group is invalid or it already exists in the directory.OperationFailedException - underlying directory implementation failed to execute the operation.public Group updateGroup(GroupTemplate group) throws GroupNotFoundException, OperationFailedException
RemoteDirectorygroup.updateGroup in interface RemoteDirectorygroup - The group to update.GroupNotFoundException - the group does not exist in the directory store.OperationFailedException - underlying directory implementation failed to execute the operation.public void removeGroup(String name) throws GroupNotFoundException, OperationFailedException
RemoteDirectorygroup that matches the supplied name.removeGroup in interface RemoteDirectoryname - The name of the group.GroupNotFoundException - The group does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public Group renameGroup(String oldName, String newName) throws GroupNotFoundException, InvalidGroupException, OperationFailedException
RemoteDirectorygroup.renameGroup in interface RemoteDirectoryoldName - name of existing group.newName - desired name of group.GroupNotFoundException - if the group with the existing name does not exist.InvalidGroupException - if the new group name is invalid or already exists in the directory.OperationFailedException - if the underlying directory implementation failed to execute the operation.public void storeGroupAttributes(String groupName, Map<String,Set<String>> attributes) throws GroupNotFoundException, OperationFailedException
RemoteDirectorydirectoryId.
The attributes map represents new or updated attributes and does not replace existing attributes unless the key of an attribute matches the key of an existing
Attributes with values of empty sets are not added (these attributes are effectively removed).
storeGroupAttributes in interface RemoteDirectorygroupName - name of group to update.attributes - new or updated attributes (attributes that don't need changing should not appear in this Map).GroupNotFoundException - group with supplied groupName does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public void removeGroupAttributes(String groupName, String attributeName) throws GroupNotFoundException, OperationFailedException
RemoteDirectoryremoveGroupAttributes in interface RemoteDirectorygroupName - name of the group to update.attributeName - name of attribute to remove.GroupNotFoundException - group with supplied groupName does not exist.OperationFailedException - underlying directory implementation failed to execute the operation.public <T> List<T> searchGroupRelationships(MembershipQuery<T> query) throws OperationFailedException
RemoteDirectorysearchGroupRelationships in interface RemoteDirectoryquery - query for memberships.OperationFailedException - underlying directory implementation failed to execute the operation.protected abstract <T> Iterable<T> searchGroupRelationshipsWithGroupTypeSpecified(MembershipQuery<T> query) throws OperationFailedException
query - membership query with all GroupType's not null.OperationFailedException - if the operation failed due to a communication error with the remote directory,
or if the query is invalidprotected abstract LDAPCredentialEncoder getCredentialEncoder()
public boolean supportsSettingEncryptedCredential()
RemoteDirectoryRemoteDirectory.updateUserCredential(String, PasswordCredential) or
RemoteDirectory.addUser(com.atlassian.crowd.model.user.UserTemplate, com.atlassian.crowd.embedded.api.PasswordCredential)
with a PasswordCredential instance where PasswordCredential.isEncryptedCredential() returns true
and the instance is not equal to PasswordCredential.NONE will succeed; otherwise, it will fail.supportsSettingEncryptedCredential in interface RemoteDirectorypublic boolean supportsPasswordExpiration()
supportsPasswordExpiration in interface RemoteDirectoryfalse, always.public void expireAllPasswords()
throws OperationFailedException
RemoteDirectoryUserConstants.REQUIRES_PASSWORD_CHANGE attribute to true for
all users in the directory using bulk operationsexpireAllPasswords in interface RemoteDirectoryOperationFailedExceptionpublic boolean supportsNestedGroups()
RemoteDirectorysupportsNestedGroups in interface RemoteDirectorypublic boolean isRolesDisabled()
RemoteDirectoryisRolesDisabled in interface RemoteDirectorypublic void testConnection()
throws OperationFailedException
RemoteDirectorytestConnection in interface RemoteDirectoryOperationFailedException - underlying directory implementation failed to execute the operation.protected <T extends LDAPDirectoryEntity> LdapName asLdapName(String dn, String entityName, Class<T> entityClass) throws UserNotFoundException, GroupNotFoundException
This mainly affects the escaping of slashes in DNs.
The resulting javax.naming.Name is not designed to be used for caching or comparisons, rather, it is to be used for direct calls into spring-ldap's ldapTemplate.
dn - string version of DN.entityName - used if NotFoundException needs to be thrown.entityClass - in case there is a problem converting the dn into an LdapName a NotFoundException of this type (group/user) will be thrown.
Must implement User or Group, otherwise an IllegalArgumentException will be thrown.UserNotFoundException - unable to construct LdapName for User.GroupNotFoundException - unable to construct LdapName for Group.protected LdapName asLdapGroupName(String dn, String groupName) throws GroupNotFoundException
dn - DN of the Group.groupName - for GNFE exception.GroupNotFoundException - unable to construct LdapName.protected LdapName asLdapUserName(String dn, String userName) throws UserNotFoundException
dn - DN of the User.userName - for GNFE exception.UserNotFoundException - unable to construct LdapName.public boolean supportsInactiveAccounts()
supportsInactiveAccounts in interface RemoteDirectorypublic RemoteDirectory getAuthoritativeDirectory()
getAuthoritativeDirectory in interface RemoteDirectoryprotected ContextMapperWithRequiredAttributes<AvatarReference.BlobAvatar> avatarMapper()
public AvatarReference.BlobAvatar getUserAvatarByName(String username, int sizeHint) throws OperationFailedException
RemoteDirectorygetUserAvatarByName in interface RemoteDirectorysizeHint - a hint in pixels for the context in which this will be usednull if none is availableOperationFailedExceptionCopyright © 2023 Atlassian. All rights reserved.