This is an automated email from the ASF dual-hosted git repository.
martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva-redback-core.git
The following commit(s) were added to refs/heads/master by this push:
new 5305aa7 Update for group REST V2 Service
5305aa7 is described below
commit 5305aa7faeb421f03ce5777b33c12b2f87417ad3
Author: Martin Stockhammer <[email protected]>
AuthorDate: Thu Jul 16 20:02:44 2020 +0200
Update for group REST V2 Service
---
.../common/ldap/ObjectNotFoundException.java | 35 +++++
.../common/ldap/role/DefaultLdapRoleMapper.java | 44 +++++-
.../redback/common/ldap/role/LdapRoleMapper.java | 7 +-
.../redback/rest/api/model/ActionStatus.java | 20 ++-
.../archiva/redback/rest/api/model/Group.java | 2 +
.../redback/rest/api/model/GroupMapping.java | 5 +
.../redback/rest/api/model/v2/GroupMapping.java | 93 +++++++++++
.../redback/rest/api/services/v2/GroupService.java | 32 +---
.../rest/services/v2/DefaultGroupService.java | 66 ++++----
.../redback/rest/services/v2/GroupServiceTest.java | 8 +-
.../rest/services/v2/NativeGroupServiceTest.java | 175 ++++++++++++++++++++-
11 files changed, 419 insertions(+), 68 deletions(-)
diff --git
a/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/ObjectNotFoundException.java
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/ObjectNotFoundException.java
new file mode 100644
index 0000000..c3932c2
--- /dev/null
+++
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/ObjectNotFoundException.java
@@ -0,0 +1,35 @@
+package org.apache.archiva.redback.common.ldap;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * @author Martin Stockhammer <[email protected]>
+ */
+public class ObjectNotFoundException extends MappingException
+{
+ public ObjectNotFoundException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+
+ public ObjectNotFoundException( String message )
+ {
+ super( message );
+ }
+}
diff --git
a/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
index afe3d5e..64f5fce 100644
---
a/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
+++
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
@@ -19,6 +19,7 @@ package org.apache.archiva.redback.common.ldap.role;
*/
import org.apache.archiva.redback.common.ldap.MappingException;
+import org.apache.archiva.redback.common.ldap.ObjectNotFoundException;
import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
import org.apache.archiva.redback.common.ldap.connection.LdapException;
import org.apache.archiva.redback.common.ldap.user.LdapUser;
@@ -275,7 +276,48 @@ public class DefaultLdapRoleMapper
}
}
- LdapGroup getGroupFromResult(SearchResult searchResult) throws
NamingException
+ @Override
+ public LdapGroup getGroupForName( DirContext context, String groupName )
throws MappingException
+ {
+ NamingEnumeration<SearchResult> namingEnumeration = null;
+ try
+ {
+
+ SearchControls searchControls = new SearchControls( );
+
+ searchControls.setDerefLinkFlag( true );
+ searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+ searchControls.setReturningAttributes( new
String[]{this.getLdapDnAttribute( ), "objectClass", groupNameAttribute,
+ ldapGroupMemberAttribute} );
+
+ StringBuilder fiBuilder = new StringBuilder("(&(objectClass="
).append( getLdapGroupClass( ) ).append(")");
+
+
+ if ( !StringUtils.isEmpty( this.groupFilter ) )
+ {
+ fiBuilder.append("(").append(this.groupFilter).append(")");
+ }
+ fiBuilder.append("(").append(this.groupNameAttribute)
+ .append("=").append(groupName).append("))");
+ namingEnumeration = context.search( getGroupsDn( ),
fiBuilder.toString(), searchControls );
+ if (namingEnumeration.hasMore()) {
+ SearchResult result = namingEnumeration.next( );
+ return getGroupFromResult( result );
+ } else {
+ throw new ObjectNotFoundException( "Group not found " +
groupName );
+ }
+ }
+ catch ( NamingException e )
+ {
+ log.error( "Naming error while searching for group {}: {}",
groupName, e.getMessage( ) );
+ throw new MappingException( "Group search failed " + e.getMessage(
), e );
+ } finally
+ {
+ closeNamingEnumeration( namingEnumeration );
+ }
+ }
+
+ private LdapGroup getGroupFromResult(SearchResult searchResult) throws
NamingException
{
LdapGroup group = new LdapGroup( searchResult.getNameInNamespace() );
Attribute attValue = searchResult.getAttributes( ).get(
groupNameAttribute );
diff --git
a/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
index 016d5f0..1ee2cfe 100644
---
a/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
+++
b/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
@@ -44,13 +44,16 @@ public interface LdapRoleMapper
throws MappingException;
/**
- * read all groups from ldap
+ * Read all groups from LDAP and return the list of group objects.
*
- * @return all LDAP groups
+ * @return all LDAP groups found in the LDAP directory
*/
List<LdapGroup> getAllGroupObjects( DirContext context )
throws MappingException;
+ LdapGroup getGroupForName( DirContext context, String groupName )
+ throws MappingException;
+
/**
* read all ldap groups then map to corresponding role (if no mapping
found group is ignored)
*
diff --git
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ActionStatus.java
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ActionStatus.java
index 9ed23bc..547187b 100644
---
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ActionStatus.java
+++
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ActionStatus.java
@@ -18,12 +18,15 @@ package org.apache.archiva.redback.rest.api.model;
* under the License.
*/
+import io.swagger.v3.oas.annotations.media.Schema;
+
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <[email protected]>
*/
-@XmlRootElement(name = "actionStatus")
+@XmlRootElement( name = "actionStatus" )
+@Schema( name = "ActionStatus", description = "Status result of a updating
action, like post, put, delete" )
public class ActionStatus
{
private boolean success = false;
@@ -31,23 +34,28 @@ public class ActionStatus
public static final ActionStatus SUCCESS = new ActionStatus( true );
public static final ActionStatus FAIL = new ActionStatus( false );
- public static ActionStatus FROM(boolean status) {
+
+ public static ActionStatus FROM( boolean status )
+ {
return status ? SUCCESS : FAIL;
}
- public ActionStatus() {
+ public ActionStatus( )
+ {
}
- public ActionStatus( boolean success) {
+ public ActionStatus( boolean success )
+ {
this.success = success;
}
- public ActionStatus(boolean success, int modifiedNumber) {
+ public ActionStatus( boolean success, int modifiedNumber )
+ {
this.success = success;
this.modifiedNumber = modifiedNumber;
}
-
+
public boolean isSuccess( )
{
return success;
diff --git
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/Group.java
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/Group.java
index 2b07e32..05d2e08 100644
---
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/Group.java
+++
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/Group.java
@@ -26,7 +26,9 @@ import java.util.ArrayList;
import java.util.List;
/**
+ * REST API Version 2 group element
* @author Martin Stockhammer <[email protected]>
+ * @since 3.0
*/
@XmlRootElement(name="group")
@Schema(name="Group", description = "Group object")
diff --git
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/GroupMapping.java
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/GroupMapping.java
index c59d2e9..b7d48c9 100644
---
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/GroupMapping.java
+++
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/GroupMapping.java
@@ -18,6 +18,8 @@ package org.apache.archiva.redback.rest.api.model;
* under the License.
*/
+import io.swagger.v3.oas.annotations.media.Schema;
+
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Collection;
@@ -28,6 +30,7 @@ import java.util.List;
* @since 2.1
*/
@XmlRootElement(name = "groupMapping")
+@Schema(name="GroupMapping", description = "List of Group to Role mappings")
public class GroupMapping
implements Serializable
{
@@ -46,6 +49,7 @@ public class GroupMapping
this.roleNames = roleNames;
}
+ @Schema(description = "The group name that is mapped")
public String getGroup()
{
return group;
@@ -56,6 +60,7 @@ public class GroupMapping
this.group = group;
}
+ @Schema(description = "The list of roles that are mapped to this group")
public Collection<String> getRoleNames()
{
return roleNames;
diff --git
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/GroupMapping.java
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/GroupMapping.java
new file mode 100644
index 0000000..d13e250
--- /dev/null
+++
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/GroupMapping.java
@@ -0,0 +1,93 @@
+package org.apache.archiva.redback.rest.api.model.v2;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Martin Stockhammer <[email protected]>
+ */
+@XmlRootElement(name="groupMapping")
+@Schema(name="GroupMap", description = "Mapping of a group to roles")
+public class GroupMapping implements Serializable
+{
+ private static final long serialVersionUID = 8327221676510149313L;
+
+ String groupName;
+ String uniqueGroupName;
+ List<String> roles;
+
+ public GroupMapping( )
+ {
+ }
+
+ public GroupMapping( String groupName, String uniqueGroupName,
List<String> roles )
+ {
+ this.groupName = groupName;
+ this.uniqueGroupName = uniqueGroupName;
+ this.roles = roles;
+ }
+
+ @Schema(description = "The name of the mapped group")
+ public String getGroupName( )
+ {
+ return groupName;
+ }
+
+ public void setGroupName( String groupName )
+ {
+ this.groupName = groupName;
+ }
+
+ @Schema(description = "The unique name of the mapped group. Dependent on
the used repository backend.")
+ public String getUniqueGroupName( )
+ {
+ return uniqueGroupName;
+ }
+
+ public void setUniqueGroupName( String uniqueGroupName )
+ {
+ this.uniqueGroupName = uniqueGroupName;
+ }
+
+ @Schema(description = "The list of role names mapped to this group")
+ public List<String> getRoles( )
+ {
+ return roles;
+ }
+
+ public void setRoles( List<String> roles )
+ {
+ this.roles = roles;
+ }
+
+ public void addRole(String role) {
+ if (roles==null) {
+ this.roles = new ArrayList<>( );
+ }
+ if (!this.roles.contains(role)) {
+ this.roles.add( role );
+ }
+ }
+}
diff --git
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/GroupService.java
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/GroupService.java
index c626085..213298c 100644
---
a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/GroupService.java
+++
b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/GroupService.java
@@ -23,15 +23,14 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import io.swagger.v3.oas.annotations.security.SecurityRequirements;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.archiva.redback.authorization.RedbackAuthorization;
import
org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.Group;
-import org.apache.archiva.redback.rest.api.model.GroupMapping;
import org.apache.archiva.redback.rest.api.model.GroupMappingUpdateRequest;
+import org.apache.archiva.redback.rest.api.model.v2.GroupMapping;
import org.apache.archiva.redback.rest.api.model.PagedResult;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
@@ -60,7 +59,7 @@ import java.util.List;
public interface GroupService
{
- public static final String DEFAULT_PAGE_LIMIT = "1000";
+ String DEFAULT_PAGE_LIMIT = "1000";
@Path( "" )
@GET
@@ -96,12 +95,12 @@ public interface GroupService
@RedbackAuthorization( permissions =
RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION )
@Operation( summary = "Adds a group mapping",
responses = {
- @ApiResponse( responseCode = "201", description = "The status of
the add action" ),
+ @ApiResponse( responseCode = "201", description = "If the group
addition was successful" ),
@ApiResponse( responseCode = "405", description = "Invalid input" )
}
)
ActionStatus addGroupMapping( @Parameter( description = "The data of the
group mapping", required = true )
- GroupMapping groupMapping )
+ GroupMapping groupMapping )
throws RedbackServiceException;
@Path( "mappings/{group}" )
@@ -111,7 +110,7 @@ public interface GroupService
@RedbackAuthorization( permissions =
RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION )
@Operation( summary = "Deletes a group mapping",
responses = {
- @ApiResponse( description = "The status of the delete action" ),
+ @ApiResponse( responseCode = "200", description = "If the status
of the delete action was successful" ),
@ApiResponse( responseCode = "404", description = "Group mapping
not found" )
}
)
@@ -126,30 +125,15 @@ public interface GroupService
@RedbackAuthorization( permissions =
RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION )
@Operation( summary = "Updates a group mapping",
responses = {
- @ApiResponse( description = "The status of the update action" ),
+ @ApiResponse( description = "If the update was successful" ),
@ApiResponse( responseCode = "404", description = "Group mapping
not found" )
}
)
ActionStatus updateGroupMapping( @Parameter( description = "The group
name", required = true )
@PathParam( "group" ) String
groupName,
- @Parameter( description = "The updated
data of the group mapping", required = true )
- GroupMapping groupMapping )
+ @Parameter( description = "The updated
role list of the group mapping", required = true )
+ List<String> roles )
throws RedbackServiceException;
- @Path( "mappings" )
- @PUT
- @Consumes( {MediaType.APPLICATION_JSON} )
- @Produces( {MediaType.APPLICATION_JSON} )
- @RedbackAuthorization( permissions =
RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION )
- @Operation( summary = "Updates multiple group mappings",
- responses = {
- @ApiResponse( description = "The status of the update action" ),
- @ApiResponse( responseCode = "405", description = "Invalid input" )
- }
- )
- ActionStatus updateGroupMapping( @Parameter( description = "The list of
group mapping updates", required = true )
- GroupMappingUpdateRequest
groupMappingUpdateRequest )
- throws RedbackServiceException;
-
}
diff --git
a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultGroupService.java
b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultGroupService.java
index 93ff99b..4d824a1 100644
---
a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultGroupService.java
+++
b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultGroupService.java
@@ -19,6 +19,7 @@ package org.apache.archiva.redback.rest.services.v2;
*/
import org.apache.archiva.redback.common.ldap.MappingException;
+import org.apache.archiva.redback.common.ldap.ObjectNotFoundException;
import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
import org.apache.archiva.redback.common.ldap.connection.LdapException;
@@ -27,8 +28,8 @@ import
org.apache.archiva.redback.common.ldap.role.LdapRoleMapper;
import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.Group;
-import org.apache.archiva.redback.rest.api.model.GroupMapping;
import org.apache.archiva.redback.rest.api.model.GroupMappingUpdateRequest;
+import org.apache.archiva.redback.rest.api.model.v2.GroupMapping;
import org.apache.archiva.redback.rest.api.model.PagedResult;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
import org.apache.archiva.redback.rest.api.services.v2.GroupService;
@@ -113,6 +114,13 @@ public class DefaultGroupService
}
}
+ /**
+ * Tries to retrieve the LDAP group for the mapping to add the unique
name. If the group cannot
+ * be found, it will set "" for the uniqueName
+ *
+ * @return the list of mapping
+ * @throws RedbackServiceException
+ */
@Override
public List<GroupMapping> getGroupMappings()
throws RedbackServiceException
@@ -123,8 +131,32 @@ public class DefaultGroupService
List<GroupMapping> ldapGroupMappings = new ArrayList<>( map.size(
) );
for ( Map.Entry<String, Collection<String>> entry : map.entrySet()
)
{
- GroupMapping ldapGroupMapping = new GroupMapping(
entry.getKey( ), new ArrayList<>( entry.getValue( ) ) );
- ldapGroupMappings.add( ldapGroupMapping );
+ String groupName = entry.getKey( );
+ DirContext context = null;
+ LdapConnection ldapConnection = null;
+ try
+ {
+ ldapConnection = ldapConnectionFactory.getConnection( );
+ context = ldapConnection.getDirContext( );
+
+ LdapGroup ldapGroup = ldapRoleMapper.getGroupForName(
context, groupName );
+ GroupMapping ldapGroupMapping = new GroupMapping(
ldapGroup.getName(), ldapGroup.getDn(), new ArrayList<>( entry.getValue( ) ) );
+ ldapGroupMappings.add( ldapGroupMapping );
+ }
+ catch ( LdapException e )
+ {
+ log.error( "Could not create ldap connection {}",
e.getMessage( ) );
+ throw new RedbackServiceException( "Error while talking to
group registry", 500 );
+ }
+ catch ( ObjectNotFoundException e ) {
+ GroupMapping ldapGroupMapping = new GroupMapping(
groupName, "", new ArrayList<>( entry.getValue( ) ) );
+ ldapGroupMappings.add( ldapGroupMapping );
+ }
+ finally
+ {
+ closeContext( context );
+ closeLdapConnection( ldapConnection );
+ }
}
return ldapGroupMappings;
@@ -142,8 +174,8 @@ public class DefaultGroupService
{
try
{
- ldapRoleMapperConfiguration.addLdapMapping(
ldapGroupMapping.getGroup(),
- new ArrayList<>(
ldapGroupMapping.getRoleNames() ) );
+ ldapRoleMapperConfiguration.addLdapMapping(
ldapGroupMapping.getGroupName(),
+ new ArrayList<>(
ldapGroupMapping.getRoles() ) );
response.setStatus( Response.Status.CREATED.getStatusCode() );
}
catch ( MappingException e )
@@ -171,7 +203,7 @@ public class DefaultGroupService
}
@Override
- public ActionStatus updateGroupMapping( String groupName, GroupMapping
groupMapping ) throws RedbackServiceException
+ public ActionStatus updateGroupMapping( String groupName, List<String>
roles ) throws RedbackServiceException
{
try
{
@@ -184,7 +216,7 @@ public class DefaultGroupService
try
{
ldapRoleMapperConfiguration.updateLdapMapping( groupName,
- new ArrayList<>( groupMapping.getRoleNames() ) );
+ roles );
return ActionStatus.SUCCESS;
}
catch ( MappingException e )
@@ -194,26 +226,6 @@ public class DefaultGroupService
}
}
- @Override
- public ActionStatus updateGroupMapping( GroupMappingUpdateRequest
groupMappingUpdateRequest )
- throws RedbackServiceException
- {
- try
- {
- for ( GroupMapping ldapGroupMapping :
groupMappingUpdateRequest.getGroupMapping() )
- {
- ldapRoleMapperConfiguration.updateLdapMapping(
ldapGroupMapping.getGroup(),
- new
ArrayList<>( ldapGroupMapping.getRoleNames() ) );
- }
- }
- catch ( MappingException e )
- {
- log.error( e.getMessage(), e );
- throw new RedbackServiceException( e.getMessage() );
- }
- return ActionStatus.SUCCESS;
- }
-
//------------------
// utils
//------------------
diff --git
a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/GroupServiceTest.java
b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/GroupServiceTest.java
index b58f6f1..64f13ab 100644
---
a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/GroupServiceTest.java
+++
b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/GroupServiceTest.java
@@ -20,7 +20,7 @@ package org.apache.archiva.redback.rest.services.v2;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import org.apache.archiva.components.apacheds.ApacheDs;
-import org.apache.archiva.redback.rest.api.model.GroupMapping;
+import org.apache.archiva.redback.rest.api.model.v2.GroupMapping;
import org.apache.archiva.redback.rest.api.services.v2.GroupService;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
@@ -348,7 +348,7 @@ public class GroupServiceTest
assertNotNull( mappings );
assertEquals( 3, mappings.size( ) );
- GroupMapping groupMapping = new GroupMapping( "ldap group",
Arrays.asList( "redback role" ) );
+ GroupMapping groupMapping = new GroupMapping( "ldap group",
"cn=ldap group,ou=archiva,ou=apache,ou=org", Arrays.asList( "redback role" ) );
service.addGroupMapping( groupMapping );
@@ -357,9 +357,9 @@ public class GroupServiceTest
assertNotNull( mappings );
assertEquals( 4, mappings.size( ) );
for (GroupMapping mapping : mappings) {
- if ( StringUtils.equals( "ldap group", mapping.getGroup( ) ) )
+ if ( StringUtils.equals( "ldap group", mapping.getGroupName( )
) )
{
- Collection<String> names = mapping.getRoleNames( );
+ Collection<String> names = mapping.getRoles( );
assertNotNull( names );
assertTrue( names.size( ) > 0 );
for (String name : names) {
diff --git
a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeGroupServiceTest.java
b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeGroupServiceTest.java
index 9def33d..6609eab 100644
---
a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeGroupServiceTest.java
+++
b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeGroupServiceTest.java
@@ -22,15 +22,19 @@ import io.restassured.http.ContentType;
import io.restassured.response.Response;
import org.apache.archiva.components.apacheds.ApacheDs;
import org.apache.archiva.redback.rest.api.model.Group;
+import org.apache.archiva.redback.rest.api.model.v2.GroupMapping;
import org.apache.archiva.redback.rest.services.BaseSetup;
import org.apache.archiva.redback.rest.services.LdapInfo;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@@ -49,9 +53,12 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import java.util.stream.Collectors;
import static io.restassured.RestAssured.given;
+import static io.restassured.http.ContentType.JSON;
import static org.junit.jupiter.api.Assertions.*;
/**
@@ -62,6 +69,7 @@ import static org.junit.jupiter.api.Assertions.*;
locations = {"classpath:/ldap-spring-test.xml"} )
@TestInstance( TestInstance.Lifecycle.PER_CLASS )
@Tag("rest-native")
+@TestMethodOrder( MethodOrderer.Random.class )
public class NativeGroupServiceTest extends AbstractNativeRestServices
{
protected String peopleSuffix;
@@ -307,7 +315,7 @@ public class NativeGroupServiceTest extends
AbstractNativeRestServices
@Test
void getGroups() {
String token = getAdminToken( );
- Response response = given( ).spec( getRequestSpec( token )
).contentType( ContentType.JSON ).when( )
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON ).when( )
.get( ).then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
List<Group> data = response.body( ).jsonPath( ).getList( "data",
Group.class );
@@ -326,7 +334,7 @@ public class NativeGroupServiceTest extends
AbstractNativeRestServices
String token = getAdminToken( );
HashMap<String, Object> params = new HashMap<>( );
params.put( "limit", Long.valueOf( 3 ) );
- Response response = given( ).spec( getRequestSpec( token )
).contentType( ContentType.JSON )
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
.param( "limit", Long.valueOf( 3 ) )
.when( )
.get( ).then( ).statusCode( 200 ).extract( ).response( );
@@ -345,11 +353,10 @@ public class NativeGroupServiceTest extends
AbstractNativeRestServices
@Test
void getGroupsWithOffset() {
String token = getAdminToken( );
- Response response = given( ).spec( getRequestSpec( token )
).contentType( ContentType.JSON )
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
.param( "offset", Long.valueOf( 2 ) )
.when( )
.get( ).then( ).statusCode( 200 ).extract( ).response( );
- System.out.println( response.print( ) );
assertNotNull( response );
List<Group> data = response.body( ).jsonPath( ).getList( "data",
Group.class );
assertNotNull( data );
@@ -363,4 +370,164 @@ public class NativeGroupServiceTest extends
AbstractNativeRestServices
}
+ @Test
+ void getGroupMapping() {
+ String token = getAdminToken( );
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .when( )
+ .get( "/mappings" )
+ .then( ).statusCode( 200 ).extract( ).response( );
+ assertNotNull( response );
+ assertEquals( 3, response.getBody( ).jsonPath( ).getList( "" ).size()
);
+
+ }
+
+ @Test
+ void addGroupMapping() {
+ String token = getAdminToken( );
+ try
+ {
+ Map<String, Object> jsonAsMap = new HashMap<>( );
+ jsonAsMap.put( "groupName", "ldap group" );
+ jsonAsMap.put( "roles", Arrays.asList( "role1", "role2" ) );
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .body( jsonAsMap )
+ .when( )
+ .post( "/mappings" )
+ .then( ).statusCode( 201 ).extract( ).response( );
+ assertNotNull( response );
+ assertTrue( response.getBody( ).jsonPath( ).getBoolean( "success"
) );
+ } finally {
+ given( ).spec( getRequestSpec( token ) ).contentType( JSON )
+ .when( )
+ .delete( "/mappings/ldap group" )
+ .then( )
+ .statusCode( 200 );
+ }
+ }
+
+ @Test
+ void addAndGetGroupMapping() {
+ String token = getAdminToken( );
+ try
+ {
+ Map<String, Object> jsonAsMap = new HashMap<>( );
+ jsonAsMap.put( "groupName", "ldap group" );
+ jsonAsMap.put( "roles", Arrays.asList( "role1", "role2" ) );
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .body( jsonAsMap )
+ .when( )
+ .post( "/mappings" )
+ .then( ).statusCode( 201 ).extract( ).response( );
+ assertNotNull( response );
+ assertTrue( response.getBody( ).jsonPath( ).getBoolean( "success"
) );
+ response = given( ).spec( getRequestSpec( token ) ).contentType(
JSON )
+ .when( )
+ .get( "/mappings" )
+ .then( ).statusCode( 200 ).extract( ).response( );
+ assertNotNull( response );
+ List<GroupMapping> resultList = response.getBody( ).jsonPath(
).getList( "", GroupMapping.class );
+ assertEquals( 4, response.getBody( ).jsonPath( ).getList( ""
).size() );
+ Optional<GroupMapping> found = resultList.stream( ).filter( map ->
map.getGroupName( ).equals( "ldap group" ) && map.getRoles( ).size( ) == 2 &&
map.getRoles( ).contains( "role1" ) ).findAny( );
+ assertTrue( found.isPresent( ) );
+ } finally {
+ given( ).spec( getRequestSpec( token ) ).contentType( JSON )
+ .when( )
+ .delete( "/mappings/ldap group" )
+ .then( )
+ .statusCode( 200 );
+ }
+ }
+
+ @Test
+ void deleteGroupMapping() {
+ String token = getAdminToken( );
+ try
+ {
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .when( )
+ .delete( "/mappings/archiva-admin" )
+ .then( )
+ .statusCode( 200 ).extract( ).response( );
+ assertTrue( response.getBody( ).jsonPath( ).getBoolean( "success"
) );
+ } finally {
+ // Put it back
+ Map<String, Object> jsonAsMap = new HashMap<>( );
+ jsonAsMap.put( "groupName", "archiva-admin" );
+ jsonAsMap.put( "roles", Arrays.asList( "System Administrator" ) );
+ given( ).spec( getRequestSpec( token ) ).contentType( JSON )
+ .body( jsonAsMap )
+ .when( )
+ .post( "/mappings" )
+ .then( ).statusCode( 201 );
+ }
+ }
+
+ @Test
+ void updateGroupMapping() {
+ String token = getAdminToken( );
+ try
+ {
+ List<String> list = Arrays.asList( "System Administrator",
"role1", "role2", "role3" );
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .when( )
+ .body(list)
+ .put( "/mappings/archiva-admin" )
+ .then( )
+ .statusCode( 200 ).extract( ).response( );
+ assertTrue( response.getBody( ).jsonPath( ).getBoolean( "success"
) );
+ } finally {
+ // Put it back
+ List<String> list = Arrays.asList( "System Administrator" );
+ given( ).spec( getRequestSpec( token ) ).contentType( JSON )
+ .body( list )
+ .when( )
+ .put( "/mappings/archiva-admin" )
+ .then( ).statusCode( 200 );
+ }
+ }
+
+ @Test
+ void updateAndGetGroupMapping() {
+ String token = getAdminToken( );
+ try
+ {
+ // The default implementation of redback uses the value from the
configuration persistently
+ // and adds the updates to the configuration.
+ List<String> list = Arrays.asList( "role1", "role2", "role3" );
+ Response response = given( ).spec( getRequestSpec( token )
).contentType( JSON )
+ .when( )
+ .body(list)
+ .put( "/mappings/archiva-admin" )
+ .then( )
+ .statusCode( 200 ).extract( ).response( );
+ assertTrue( response.getBody( ).jsonPath( ).getBoolean( "success"
) );
+
+ response = given( ).spec( getRequestSpec( token ) ).contentType(
JSON )
+ .when( )
+ .get( "/mappings" )
+ .then( ).statusCode( 200 ).extract( ).response( );
+ assertNotNull( response );
+ List<GroupMapping> resultList = response.getBody( ).jsonPath(
).getList( "", GroupMapping.class );
+ assertEquals( 3, response.getBody( ).jsonPath( ).getList( ""
).size() );
+ for (GroupMapping mapping : resultList) {
+ System.out.println( mapping.getGroupName( ) + "/" +
mapping.getUniqueGroupName( ) );
+ for (String role : mapping.getRoles( )) {
+ System.out.println( "Role " + role );
+ }
+ }
+ Optional<GroupMapping> found = resultList.stream( ).filter( map ->
map.getGroupName( ).equals( "archiva-admin" ) && map.getRoles( ).size( ) == 4
&& map.getRoles( ).contains( "role3" ) ).findAny( );
+ assertTrue( found.isPresent( ) );
+
+ } finally {
+ // Put it back
+ List<String> list = Arrays.asList( "System Administrator" );
+ given( ).spec( getRequestSpec( token ) ).contentType( JSON )
+ .body( list )
+ .when( )
+ .put( "/mappings/archiva-admin" )
+ .then( ).statusCode( 200 );
+ }
+ }
+
}