Skip to content
......@@ -13,11 +13,11 @@ import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.rap.RapClient;
import java.util.AbstractMap.SimpleEntry;
import it.inaf.ia2.gms.authn.RapClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -58,7 +58,7 @@ public class SearchService {
}
private List<SearchResponseItem> searchUsers(String query) {
return rapClient.searchUsers(query).stream()
return rapClient.getUsers(query).stream()
.map(u -> {
SearchResponseItem item = new SearchResponseItem();
item.setType(SearchResponseType.USER);
......@@ -75,22 +75,16 @@ public class SearchService {
// Select only the groups visible to the user
List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(userId);
List<Map.Entry<String, String>> groupsIdPath = new ArrayList<>();
for (GroupEntity group : allGroups) {
PermissionUtils.getGroupPermission(group, permissions).ifPresent(permission -> {
groupsIdPath.add(new SimpleEntry<>(group.getId(), group.getPath()));
});
}
Set<GroupEntity> visibleGroups = getVisibleGroups(allGroups, permissions);
List<SearchResponseItem> items = new ArrayList<>();
Map<String, List<String>> groupNames = groupNameService.getNames(groupsIdPath);
for (Map.Entry<String, String> entry : groupsIdPath) {
String groupId = entry.getKey();
Map<String, List<String>> groupNames = groupNameService.getNames(visibleGroups);
for (GroupEntity group : visibleGroups) {
SearchResponseItem item = new SearchResponseItem();
item.setType(SearchResponseType.GROUP);
item.setId(groupId);
List<String> names = groupNames.get(groupId);
item.setId(group.getId());
List<String> names = groupNames.get(group.getId());
item.setLabel(String.join(" / ", names));
items.add(item);
}
......@@ -115,7 +109,7 @@ public class SearchService {
sortByGroupCompleteName(groups);
response.setGroups(groups);
List<UserPermission> permissions = getUserPermission(targetUserId, actorPermissions);
List<UserPermission> permissions = getUserPermission(groupsManager.getRoot(), targetUserId, actorPermissions);
sortByGroupCompleteName(permissions);
response.setPermissions(permissions);
......@@ -129,15 +123,9 @@ public class SearchService {
List<GroupEntity> allGroups = membershipsDAO.getUserMemberships(targetUserId);
// Select only groups visible to the actor user
List<Map.Entry<String, String>> visibleGroupsIdPath = new ArrayList<>();
for (GroupEntity group : allGroups) {
PermissionUtils.getGroupPermission(group, actorPermissions).ifPresent(permission -> {
visibleGroupsIdPath.add(new SimpleEntry<>(group.getId(), group.getPath()));
});
}
Set<GroupEntity> visibleGroups = getVisibleGroups(allGroups, actorPermissions);
return groupNameService.getNames(visibleGroupsIdPath).entrySet().stream()
return groupNameService.getNames(visibleGroups).entrySet().stream()
.map(entry -> {
UserGroup ug = new UserGroup();
ug.setGroupId(entry.getKey());
......@@ -147,24 +135,28 @@ public class SearchService {
.collect(Collectors.toList());
}
public List<UserPermission> getUserPermission(String targetUserId, List<PermissionEntity> actorPermissions) {
private Set<GroupEntity> getVisibleGroups(List<GroupEntity> allGroups, List<PermissionEntity> permissions) {
return allGroups.stream()
.filter(g -> PermissionUtils.getGroupPermission(g, permissions).isPresent())
.collect(Collectors.toSet());
}
public List<UserPermission> getUserPermission(GroupEntity group, String targetUserId, List<PermissionEntity> actorPermissions) {
List<UserPermission> permissions = new ArrayList<>();
// Super-admin user is able to see also other user permissions
PermissionUtils.getGroupPermission(groupsManager.getRoot(), actorPermissions).ifPresent(permission -> {
PermissionUtils.getGroupPermission(group, actorPermissions).ifPresent(permission -> {
if (permission.equals(Permission.ADMIN)) {
Map<String, PermissionEntity> targetUserPermissions
= permissionsDAO.findUserPermissions(targetUserId).stream()
.collect(Collectors.toMap(PermissionEntity::getGroupId, p -> p));
List<Map.Entry<String, String>> groupsIdPath = new ArrayList<>();
for (PermissionEntity p : targetUserPermissions.values()) {
groupsIdPath.add(new SimpleEntry<>(p.getGroupId(), p.getGroupPath()));
}
Set<String> groupIds = targetUserPermissions.values().stream()
.map(p -> p.getGroupId()).collect(Collectors.toSet());
for (Map.Entry<String, List<String>> entry : groupNameService.getNames(groupsIdPath).entrySet()) {
for (Map.Entry<String, List<String>> entry : groupNameService.getNamesFromIds(groupIds).entrySet()) {
UserPermission up = new UserPermission();
up.setGroupId(entry.getKey());
up.setGroupCompleteName(entry.getValue());
......
......@@ -4,14 +4,6 @@ server.servlet.context-path=/gms
spring.main.allow-bean-definition-overriding=true
server.error.whitelabel.enabled=false
security.oauth2.client.client-id=gms
security.oauth2.client.client-secret=gms-secret
security.oauth2.client.access-token-uri=http://localhost/franco/fake-rap/token.php
security.oauth2.client.user-authorization-uri=http://localhost/franco/fake-rap/index.php
security.oauth2.resource.token-info-uri=http://localhost/franco/fake-rap/check-token.php
security.oauth2.client.scope=openid,email,profile
security.oauth2.resource.jwk.key-set-uri=http://localhost/franco/fake-rap/jwks.php
logging.level.it.inaf=TRACE
logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.jdbc=TRACE
......@@ -21,8 +13,6 @@ spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=gms
spring.datasource.password=gms
rap.ws-url=http://localhost/franco/fake-rap/get-users.php
rap.ws.basic-auth=true
support.contact.label=IA2 team
support.contact.email=ia2@inaf.it
......
client_id=gms
client_secret=gms-secret
access_token_uri=http://localhost/rap-ia2/auth/oauth2/token
user_authorization_uri=http://localhost/rap-ia2/auth/oauth2/authorize
check_token_uri=http://localhost/rap-ia2/auth/oauth2/token
jwks_uri=http://localhost/rap-ia2/auth/oidc/jwks
gms_uri=http://localhost:8082/gms/ws/jwt
client_id=
client_secret=
rap_uri=https://auth.inaf.it/auth/prod/
access_token_endpoint=accessToken/
user_authorization_endpoint=authorization/
check_token_endpoint=userInfo/
jwks_endpoint=jwks?client_name=ia2gms
rap_ws_user_endpoint=portal/SendUsers.php/user
rap_client_class=it.inaf.ia2.gms.authn.ClientDbRapClient
gms_uri=https://sso-devel.ia2.inaf.it/gms
groups_autoload=false
store_state_on_login_endpoint=true
scope=openid email profile read:rap
......@@ -63,3 +63,18 @@ CREATE TABLE invited_registration_request_group (
FOREIGN KEY (request_id) REFERENCES invited_registration_request(id),
FOREIGN KEY (group_id) REFERENCES gms_group(id)
);
CREATE VIEW group_complete_name AS
SELECT id, string_agg(name, '.') AS complete_name
FROM (
SELECT replace(name, '.', '\.') AS name, p.id
FROM gms_group g
JOIN (
SELECT UNNEST(string_to_array(path::varchar, '.')) AS rel_id, id
FROM gms_group
) AS p ON g.id = p.rel_id
ORDER BY p.id, nlevel(g.path)
) AS j GROUP BY id
UNION
SELECT id, name AS complete_name FROM gms_group WHERE id = 'ROOT'
ORDER BY complete_name;
package it.inaf.ia2.gms;
import java.security.Principal;
import javax.servlet.http.HttpServletRequest;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class GmsTestUtils {
public static void mockPrincipal(HttpServletRequest mockedServletRequest) {
mockPrincipal(mockedServletRequest, "admin_id");
}
public static void mockPrincipal(HttpServletRequest mockedServletRequest, String userId) {
Principal principal = mock(Principal.class);
when(principal.getName()).thenReturn(userId);
when(mockedServletRequest.getUserPrincipal()).thenReturn(principal);
}
}
package it.inaf.ia2.gms.authn;
import it.inaf.ia2.aa.AuthConfig;
import it.inaf.ia2.aa.UserManager;
import java.net.URI;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.ArgumentMatchers.eq;
import org.mockito.Mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ClientDbFilterTest {
@Mock
private HttpServletRequest request;
@Mock
private AuthConfig authConfig;
@Mock
private UserManager userManager;
private ClientDbFilter filter;
@Test
public void testJwksUriOverride() throws Exception {
when(authConfig.getRapBaseUri()).thenReturn("http://ia2.inaf.it");
when(authConfig.getJwksEndpoint()).thenReturn("/jwks?client_name=db0");
when(request.getSession()).thenReturn(mock(HttpSession.class));
when(request.getParameter(eq("client_db"))).thenReturn("other_db");
filter = new ClientDbFilter(authConfig, userManager);
filter.doFilter(request, mock(HttpServletResponse.class), mock(FilterChain.class));
verify(userManager).addJwksUri(eq(URI.create("http://ia2.inaf.it/jwks?client_name=other_db")));
}
}
package it.inaf.ia2.gms.authn;
import it.inaf.ia2.aa.data.User;
import it.inaf.ia2.gms.authn.RapClient;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import static org.junit.Assert.assertTrue;
......@@ -19,6 +20,9 @@ public class SessionDataTest {
@Mock
private HttpServletRequest request;
@Mock
private RapClient rapClient;
@InjectMocks
private SessionData sessionData;
......@@ -28,12 +32,12 @@ public class SessionDataTest {
HttpSession session = mock(HttpSession.class);
when(request.getSession(eq(false))).thenReturn(session);
User user = new User()
.setUserId("123")
.setUserLabel("Name Surname")
.setAccessToken("<access_token>")
.setRefreshToken("<refresh_token>")
.setExpiresIn(3600);
User user = new User();
user.setUserId("123");
user.setUserLabel("Name Surname");
user.setAccessToken("<access_token>");
user.setRefreshToken("<refresh_token>");
user.setExpiresIn(3600);
when(session.getAttribute(eq("user_data"))).thenReturn(user);
......
package it.inaf.ia2.gms.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.GmsTestUtils;
import it.inaf.ia2.gms.manager.GroupsManager;
import it.inaf.ia2.gms.manager.PermissionsManager;
import it.inaf.ia2.gms.model.GroupNode;
......@@ -14,6 +14,7 @@ import it.inaf.ia2.gms.service.GroupsService;
import it.inaf.ia2.gms.service.GroupsTreeBuilder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import org.junit.Before;
......@@ -50,7 +51,7 @@ public class GroupsControllerTest {
private GroupsService groupsService;
@Mock
private SessionData session;
private HttpServletRequest servletRequest;
@Mock
private PermissionsManager permissionsManager;
......@@ -71,6 +72,7 @@ public class GroupsControllerTest {
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
GmsTestUtils.mockPrincipal(servletRequest);
}
@Test
......@@ -104,8 +106,6 @@ public class GroupsControllerTest {
PaginatedData<GroupNode> paginatedData = new PaginatedData<>(nodes, 1, 10);
when(groupsTreeBuilder.listSubGroups(any(), any(), any())).thenReturn(paginatedData);
when(session.getUserId()).thenReturn("admin_id");
mockMvc.perform(post("/group")
.content(mapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
......
package it.inaf.ia2.gms.controller;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.GmsTestUtils;
import it.inaf.ia2.gms.manager.GroupsManager;
import it.inaf.ia2.gms.manager.InvitedRegistrationManager;
import it.inaf.ia2.gms.manager.PermissionsManager;
......@@ -13,6 +13,7 @@ import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.service.GroupsService;
import it.inaf.ia2.gms.service.GroupsTreeBuilder;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
......@@ -28,7 +29,7 @@ import org.mockito.junit.MockitoJUnitRunner;
public class GroupsTabResponseBuilderTest {
@Mock
private SessionData session;
private HttpServletRequest servletRequest;
@Mock
private GroupsManager groupsManager;
......@@ -51,7 +52,7 @@ public class GroupsTabResponseBuilderTest {
@Test
public void testGetGroupsTab() {
when(session.getUserId()).thenReturn("admin_id");
GmsTestUtils.mockPrincipal(servletRequest);
GroupEntity root = new GroupEntity();
root.setId("ROOT");
......
......@@ -4,15 +4,16 @@ import it.inaf.ia2.gms.manager.GroupsManager;
import it.inaf.ia2.gms.manager.MembershipManager;
import it.inaf.ia2.gms.manager.PermissionsManager;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.model.UserPermission;
import it.inaf.ia2.gms.model.RapUserPermission;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.MembershipEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.GroupsService;
import it.inaf.ia2.gms.service.JoinService;
import it.inaf.ia2.rap.data.RapUser;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -81,6 +82,7 @@ public class JWTWebServiceControllerTest {
@Before
public void init() {
controller.groupNameService = new GroupNameService(groupsDAO);
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
root = getRoot();
lbt = getLbtGroup();
......@@ -193,8 +195,8 @@ public class JWTWebServiceControllerTest {
when(groupsDAO.findGroupByParentAndName("", "LBT")).thenReturn(Optional.of(lbt));
when(groupsDAO.findGroupByParentAndName("lbt_id", "INAF")).thenReturn(Optional.of(inaf));
List<UserPermission> permissions = new ArrayList<>();
UserPermission up = new UserPermission();
List<RapUserPermission> permissions = new ArrayList<>();
RapUserPermission up = new RapUserPermission();
up.setUser(getRapUser());
up.setPermission(Permission.ADMIN);
permissions.add(up);
......
package it.inaf.ia2.gms.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.GmsTestUtils;
import it.inaf.ia2.gms.model.response.PaginatedData;
import it.inaf.ia2.gms.model.response.SearchResponseItem;
import it.inaf.ia2.gms.model.response.UserSearchResponse;
import it.inaf.ia2.gms.service.SearchService;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -29,7 +30,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
public class SearchControllerTest {
@Mock
private SessionData session;
private HttpServletRequest servletRequest;
@Mock
private SearchService searchService;
......@@ -44,8 +45,7 @@ public class SearchControllerTest {
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
when(session.getUserId()).thenReturn("admin_id");
GmsTestUtils.mockPrincipal(servletRequest);
}
@Test
......@@ -56,7 +56,7 @@ public class SearchControllerTest {
when(searchService.search(any(), any(), anyInt(), anyInt())).thenReturn(response);
mockMvc.perform(get("/search?query=searchText&page=1&pageSize=10")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(status().isOk());
verify(searchService, times(1)).search(eq("searchText"), eq("admin_id"), eq(1), eq(10));
......@@ -68,7 +68,7 @@ public class SearchControllerTest {
when(searchService.getUserSearchResult(any(), any())).thenReturn(new UserSearchResponse());
mockMvc.perform(get("/search/user/user_id")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(status().isOk());
verify(searchService, times(1)).getUserSearchResult(eq("admin_id"), eq("user_id"));
......
package it.inaf.ia2.gms.manager;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.model.Identity;
import it.inaf.ia2.gms.model.IdentityType;
import it.inaf.ia2.gms.GmsTestUtils;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.InvitedRegistrationDAO;
import it.inaf.ia2.gms.persistence.LoggingDAO;
import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.InvitedRegistration;
import it.inaf.ia2.gms.rap.RapClient;
import it.inaf.ia2.gms.service.PermissionsService;
import it.inaf.ia2.gms.authn.RapClient;
import it.inaf.ia2.rap.data.Identity;
import it.inaf.ia2.rap.data.IdentityType;
import it.inaf.ia2.rap.data.RapUser;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.junit.Before;
import org.junit.Test;
......@@ -51,7 +52,7 @@ public class InvitedRegistrationManagerTest {
@Mock
private RapClient rapClient;
@Mock
private SessionData sessionData;
private HttpServletRequest servletRequest;
@Mock
private LoggingDAO loggingDAO;
@Mock
......@@ -95,14 +96,14 @@ public class InvitedRegistrationManagerTest {
when(httpSession.getAttribute(eq("invited-registration"))).thenReturn(regFromToken);
when(sessionData.getUserId()).thenReturn(USER_ID);
GmsTestUtils.mockPrincipal(servletRequest, USER_ID);
RapUser user = new RapUser();
user.setId(USER_ID);
Identity identity = new Identity();
identity.setType(IdentityType.EDU_GAIN);
identity.setEmail(EMAIL);
user.setIdentities(Collections.singletonList(identity));
user.getIdentities().addAll(Collections.singletonList(identity));
when(rapClient.getUser(eq(USER_ID))).thenReturn(user);
......@@ -145,7 +146,7 @@ public class InvitedRegistrationManagerTest {
when(httpSession.getAttribute(eq("invited-registration"))).thenReturn(regFromToken);
when(sessionData.getUserId()).thenReturn(USER_ID);
GmsTestUtils.mockPrincipal(servletRequest, USER_ID);
RapUser user = new RapUser();
user.setId(USER_ID);
......
......@@ -2,17 +2,18 @@ package it.inaf.ia2.gms.manager;
import it.inaf.ia2.gms.DataSourceConfig;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.model.UserPermission;
import it.inaf.ia2.gms.model.RapUserPermission;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.LoggingDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.rap.RapClient;
import it.inaf.ia2.gms.service.PermissionsService;
import it.inaf.ia2.gms.authn.RapClient;
import it.inaf.ia2.rap.data.RapUser;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.sql.DataSource;
import static org.junit.Assert.assertEquals;
......@@ -52,7 +53,7 @@ public class PermissionsManagerIntegrationTest {
// Mock RAP client
RapUser rapUser = new RapUser();
rapUser.setId(USER_ID);
when(rapClient.getUsers(any())).thenReturn(Collections.singletonList(rapUser));
when(rapClient.getUsers(any(Set.class))).thenReturn(Collections.singletonList(rapUser));
PermissionsService permissionsService = new PermissionsService(permissionsDAO, loggingDAO);
PermissionsManager permissionsManager = new PermissionsManager(permissionsService, rapClient, loggingDAO);
......@@ -61,7 +62,7 @@ public class PermissionsManagerIntegrationTest {
// Create root
GroupEntity root = new GroupEntity();
root.setId("ROOT");
root.setName("Root");
root.setName("ROOT");
root.setPath("");
root = groupsDAO.createGroup(root);
......@@ -72,7 +73,7 @@ public class PermissionsManagerIntegrationTest {
superAdminPermission.setGroupPath(root.getPath());
permissionsDAO.createOrUpdatePermission(superAdminPermission);
List<UserPermission> permissions = permissionsManager.getAllPermissions(root);
List<RapUserPermission> permissions = permissionsManager.getAllPermissions(root);
assertEquals(1, permissions.size());
assertEquals(Permission.ADMIN, permissions.get(0).getPermission());
......
......@@ -13,7 +13,7 @@ public class UserAwareComponentTestUtil {
public static void setUser(UserAwareComponent component, String userId) {
Map<String, Object> jwtClaims = new HashMap<>();
jwtClaims.put("sub", userId);
RapPrincipal principal = new RapPrincipal(jwtClaims);
RapPrincipal principal = new RapPrincipal("token", jwtClaims);
HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getUserPrincipal()).thenReturn(principal);
ReflectionTestUtils.setField(component, "request", request);
......
......@@ -5,9 +5,11 @@ import it.inaf.ia2.gms.HooksConfig;
import it.inaf.ia2.gms.model.GroupBreadcrumb;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.service.hook.GroupsHook;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import javax.sql.DataSource;
import static org.junit.Assert.assertEquals;
......@@ -114,6 +116,15 @@ public class GroupsDAOTest {
assertTrue(optGroup.isPresent());
assertEquals(lbtInaf.getId(), optGroup.get().getId());
// Complete names
Set<String> groupIds = new HashSet<>();
groupIds.add(groups.get(0).getId());
groupIds.add(lbt.getId());
Map<String, String> completeGroupNames = dao.getGroupCompleteNamesFromId(groupIds);
assertEquals(2, completeGroupNames.size());
assertEquals("LBT", completeGroupNames.get(lbt.getId()));
assertEquals("LBT.INAF", completeGroupNames.get(groups.get(0).getId()));
// Children map
Map<String, Boolean> childrenMap = dao.getHasChildrenMap(Sets.newSet(root.getId()));
assertEquals(1, childrenMap.size());
......@@ -151,4 +162,9 @@ public class GroupsDAOTest {
private String getNewGroupId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
@Test
public void testGroupCompleteNamesEmptyInput() {
assertTrue(dao.getGroupCompleteNamesFromId(new HashSet<>()).isEmpty());
}
}
......@@ -10,9 +10,9 @@ import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.request.GroupsRequest;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.rap.RapClient;
import it.inaf.ia2.gms.service.GroupsTreeBuilder;
import it.inaf.ia2.gms.service.PermissionsService;
import it.inaf.ia2.gms.authn.RapClient;
import java.util.List;
import javax.sql.DataSource;
import static org.junit.Assert.assertEquals;
......
......@@ -4,12 +4,17 @@ import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
......@@ -27,56 +32,48 @@ public class GroupNameServiceTest {
@Test
public void getNamesTest() {
mockGroupsDAO();
GroupEntity group = new GroupEntity();
group.setName("Child\\.withDot");
group.setId("def");
group.setPath("abc.def");
List<Map.Entry<String, String>> groupsIdPath = new ArrayList<>();
groupsIdPath.add(new AbstractMap.SimpleEntry<>("def", "abc.def"));
Map<String, List<String>> names = groupNameService.getNames(groupsIdPath);
assertEquals(1, names.size());
assertEquals(2, names.get("def").size());
assertEquals("Group 1", names.get("def").get(0));
assertEquals("Group 2", names.get("def").get(1));
}
Set<GroupEntity> groups = new HashSet<>();
groups.add(group);
public void mockGroupsDAO() {
Map<String, String> daoResponse = new HashMap<>();
daoResponse.put("def", "Parent_group.Child\\.withDot");
List<GroupEntity> groups = new ArrayList<>();
when(groupsDAO.getGroupCompleteNamesFromId(any())).thenReturn(daoResponse);
GroupEntity group1 = new GroupEntity();
group1.setId("abc");
group1.setName("Group 1");
group1.setPath("abc");
groups.add(group1);
GroupEntity group2 = new GroupEntity();
group2.setId("def");
group2.setName("Group 2");
group2.setPath("abc.def");
groups.add(group2);
when(groupsDAO.findGroupsByIds(any())).thenReturn(groups);
Map<String, List<String>> names = groupNameService.getNames(groups);
assertEquals(1, names.size());
assertEquals(2, names.get("def").size());
assertEquals("Parent_group", names.get("def").get(0));
assertEquals("Child\\.withDot", names.get("def").get(1));
}
@Test
public void getRootTest() {
List<GroupEntity> groups = new ArrayList<>();
Set<String> groupIds = new HashSet<>();
groupIds.add("ROOT");
when(groupsDAO.getGroupCompleteNamesFromId(any())).thenReturn(new HashMap<>());
GroupEntity root = new GroupEntity();
root.setId("ROOT");
root.setName("Root");
root.setName("ROOT");
root.setPath("");
groups.add(root);
when(groupsDAO.findGroupsByIds(any())).thenReturn(groups);
when(groupsDAO.findGroupById(eq("ROOT")))
.thenReturn(Optional.of(root));
List<Map.Entry<String, String>> groupsIdPath = new ArrayList<>();
groupsIdPath.add(new AbstractMap.SimpleEntry<>("ROOT", ""));
Map<String, List<String>> names = groupNameService.getNames(groupsIdPath);
Map<String, List<String>> names = groupNameService.getNamesFromIds(groupIds);
assertEquals(1, names.size());
assertEquals(1, names.get("ROOT").size());
assertEquals("Root", names.get("ROOT").get(0));
assertEquals("ROOT", names.get("ROOT").get(0));
}
}
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.manager.GroupsManager;
import it.inaf.ia2.gms.model.Identity;
import it.inaf.ia2.gms.model.IdentityType;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.model.response.PaginatedData;
import it.inaf.ia2.gms.model.response.SearchResponseItem;
import it.inaf.ia2.gms.model.response.SearchResponseType;
......@@ -14,13 +11,16 @@ import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.rap.RapClient;
import it.inaf.ia2.gms.authn.RapClient;
import it.inaf.ia2.rap.data.Identity;
import it.inaf.ia2.rap.data.IdentityType;
import it.inaf.ia2.rap.data.RapUser;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
......@@ -64,18 +64,18 @@ public class SearchServiceTest {
when(groupNameService.getNames(any())).then(invocation -> {
Map<String, List<String>> result = new HashMap<>();
List<Map.Entry<String, String>> arg = invocation.getArgument(0);
for (Entry<String, String> entry : arg) {
Set<GroupEntity> arg = invocation.getArgument(0);
for (GroupEntity group : arg) {
List<String> names = new ArrayList<>();
switch (entry.getKey()) {
switch (group.getId()) {
case "ROOT":
names.add("Root");
names.add("ROOT");
break;
case "group1_id":
names.add("Group 1");
break;
}
result.put(entry.getKey(), names);
result.put(group.getId(), names);
}
return result;
});
......@@ -93,7 +93,7 @@ public class SearchServiceTest {
identity.setTypedId("user@inaf.it");
user.setIdentities(Collections.singletonList(identity));
when(rapClient.searchUsers(any())).thenReturn(Collections.singletonList(user));
when(rapClient.getUsers(any(String.class))).thenReturn(Collections.singletonList(user));
GroupEntity group1 = new GroupEntity();
group1.setId("group1_id");
......@@ -136,6 +136,11 @@ public class SearchServiceTest {
@Test
public void testGetUserSearchResult() {
Map<String, List<String>> nameResult = new HashMap<>();
nameResult.put("group1_id", Collections.singletonList("Group 1"));
when(groupNameService.getNamesFromIds(any())).thenReturn(nameResult);
GroupEntity group1 = new GroupEntity();
group1.setId("group1_id");
group1.setName("Group 1");
......@@ -164,7 +169,7 @@ public class SearchServiceTest {
GroupEntity root = new GroupEntity();
root.setId("ROOT");
root.setName("Root");
root.setName("ROOT");
root.setPath("");
when(groupsManager.getRoot()).thenReturn(root);
......