Skip to content
Snippets Groups Projects
Commit 950612a0 authored by srosse's avatar srosse
Browse files

OO-4794: REST add user search by external id, remove generated name

REST add a user search by external id, remove the login value of UserVO
if identity name are automatically generated
parent 6fac66d0
No related branches found
No related tags found
No related merge requests found
...@@ -38,6 +38,7 @@ import org.olat.modules.curriculum.CurriculumRoles; ...@@ -38,6 +38,7 @@ import org.olat.modules.curriculum.CurriculumRoles;
*/ */
public class SearchIdentityParams { public class SearchIdentityParams {
private String idAndExternalIds; private String idAndExternalIds;
private String externalId;
private String login; private String login;
private String searchString; private String searchString;
private Map<String, String> userProperties; private Map<String, String> userProperties;
...@@ -325,6 +326,14 @@ public class SearchIdentityParams { ...@@ -325,6 +326,14 @@ public class SearchIdentityParams {
this.idAndExternalIds = idAndExternalIds; this.idAndExternalIds = idAndExternalIds;
} }
public String getExternalId() {
return externalId;
}
public void setExternalId(String externalId) {
this.externalId = externalId;
}
public List<Integer> getExactStatusList() { public List<Integer> getExactStatusList() {
return exactStatusList; return exactStatusList;
} }
......
...@@ -170,7 +170,8 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie ...@@ -170,7 +170,8 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
|| params.hasRoles() || params.hasExcludedRoles() || params.hasRoles() || params.hasExcludedRoles()
|| params.getRepositoryEntryRole() != null || params.getBusinessGroupRole() != null || params.getCurriculumRole() != null || params.getRepositoryEntryRole() != null || params.getBusinessGroupRole() != null || params.getCurriculumRole() != null
|| params.hasOrganisations() || params.hasOrganisationParents() || params.hasOrganisations() || params.hasOrganisationParents()
|| StringHelper.containsNonWhitespace(params.getIdAndExternalIds()); || StringHelper.containsNonWhitespace(params.getIdAndExternalIds())
|| StringHelper.containsNonWhitespace(params.getExternalId());
} }
private boolean createQueryPart(SearchIdentityParams params, QueryBuilder sb, boolean needsAnd) { private boolean createQueryPart(SearchIdentityParams params, QueryBuilder sb, boolean needsAnd) {
...@@ -284,6 +285,11 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie ...@@ -284,6 +285,11 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
sb.append("ident.externalId=:idAndRefs)"); sb.append("ident.externalId=:idAndRefs)");
} }
if(StringHelper.containsNonWhitespace(params.getExternalId())) {
needsAnd = checkAnd(sb, needsAnd);
sb.append("ident.externalId=:externalId");
}
if(params.getManaged() != null) { if(params.getManaged() != null) {
needsAnd = checkAnd(sb, needsAnd); needsAnd = checkAnd(sb, needsAnd);
if(params.getManaged().booleanValue()) { if(params.getManaged().booleanValue()) {
...@@ -611,6 +617,10 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie ...@@ -611,6 +617,10 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
} }
dbq.setParameter("idAndRefs", params.getIdAndExternalIds()); dbq.setParameter("idAndRefs", params.getIdAndExternalIds());
} }
if(params.getExternalId() != null) {
dbq.setParameter("externalId", params.getExternalId());
}
} }
private boolean checkAnd(QueryBuilder sb, boolean needsAnd) { private boolean checkAnd(QueryBuilder sb, boolean needsAnd) {
......
...@@ -23,6 +23,7 @@ import java.io.File; ...@@ -23,6 +23,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -33,6 +34,7 @@ import java.util.Locale; ...@@ -33,6 +34,7 @@ import java.util.Locale;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.olat.basesecurity.BaseSecurityModule;
import org.olat.core.CoreSpringFactory; import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.translator.Translator; import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
...@@ -86,7 +88,7 @@ public class UserVOFactory { ...@@ -86,7 +88,7 @@ public class UserVOFactory {
UserVO userVO = new UserVO(); UserVO userVO = new UserVO();
User user = identity.getUser(); User user = identity.getUser();
userVO.setKey(identity.getKey()); userVO.setKey(identity.getKey());
if(identity != null) { if(identity != null && !CoreSpringFactory.getImpl(BaseSecurityModule.class).isIdentityNameAutoGenerated()) {
userVO.setLogin(identity.getName()); userVO.setLogin(identity.getName());
} }
userVO.setExternalId(identity.getExternalId()); userVO.setExternalId(identity.getExternalId());
...@@ -100,7 +102,7 @@ public class UserVOFactory { ...@@ -100,7 +102,7 @@ public class UserVOFactory {
try(InputStream input = new FileInputStream(portrait)) { try(InputStream input = new FileInputStream(portrait)) {
byte[] datas = IOUtils.toByteArray(input); byte[] datas = IOUtils.toByteArray(input);
byte[] data64 = Base64.encodeBase64(datas); byte[] data64 = Base64.encodeBase64(datas);
userVO.setPortrait(new String(data64, "UTF8")); userVO.setPortrait(new String(data64, StandardCharsets.UTF_8));
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
} }
......
...@@ -191,7 +191,7 @@ public class UserWebService { ...@@ -191,7 +191,7 @@ public class UserWebService {
@Content(mediaType = "application/xml", array = @ArraySchema(schema = @Schema(implementation = UserVO.class))) }) @Content(mediaType = "application/xml", array = @ArraySchema(schema = @Schema(implementation = UserVO.class))) })
@ApiResponse(responseCode = "401", description = "The roles of the authenticated user are not sufficient") @ApiResponse(responseCode = "401", description = "The roles of the authenticated user are not sufficient")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getUserListQuery(@QueryParam("login") String login, public Response getUserListQuery(@QueryParam("login") String login, @QueryParam("externalId") String externalId,
@QueryParam("authProvider") String authProvider, @QueryParam("authUsername") String authUsername, @QueryParam("authProvider") String authProvider, @QueryParam("authUsername") String authUsername,
@QueryParam("statusVisibleLimit") String statusVisibleLimit, @QueryParam("statusVisibleLimit") String statusVisibleLimit,
@Context UriInfo uriInfo, @Context HttpServletRequest httpRequest) { @Context UriInfo uriInfo, @Context HttpServletRequest httpRequest) {
...@@ -244,7 +244,13 @@ public class UserWebService { ...@@ -244,7 +244,13 @@ public class UserWebService {
if(isAdministrativeUser && "all".equalsIgnoreCase(statusVisibleLimit)) { if(isAdministrativeUser && "all".equalsIgnoreCase(statusVisibleLimit)) {
status = null; status = null;
} }
identities = securityManager.getIdentitiesByPowerSearch(login, userProps, true, null, authProviders, null, null, null, null, status);
SearchIdentityParams searchParams = new SearchIdentityParams(login, userProps, true,
null, authProviders, null, null, null, null, status);
if(StringHelper.containsNonWhitespace(externalId)) {
searchParams.setExternalId(externalId);
}
identities = securityManager.getIdentitiesByPowerSearch(searchParams, 0, -1);
} }
int count = 0; int count = 0;
......
...@@ -63,6 +63,7 @@ import org.junit.Assert; ...@@ -63,6 +63,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurity;
import org.olat.basesecurity.BaseSecurityModule;
import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.GroupRoles;
import org.olat.basesecurity.OrganisationRoles; import org.olat.basesecurity.OrganisationRoles;
import org.olat.basesecurity.OrganisationService; import org.olat.basesecurity.OrganisationService;
...@@ -165,6 +166,8 @@ public class UserMgmtTest extends OlatRestTestCase { ...@@ -165,6 +166,8 @@ public class UserMgmtTest extends OlatRestTestCase {
@Autowired @Autowired
private BaseSecurity securityManager; private BaseSecurity securityManager;
@Autowired @Autowired
private BaseSecurityModule securityModule;
@Autowired
private RepositoryService repositoryService; private RepositoryService repositoryService;
@Autowired @Autowired
private OrganisationService organisationService; private OrganisationService organisationService;
...@@ -360,12 +363,170 @@ public class UserMgmtTest extends OlatRestTestCase { ...@@ -360,12 +363,170 @@ public class UserMgmtTest extends OlatRestTestCase {
.queryParam("login", id.getLogin()).build(); .queryParam("login", id.getLogin()).build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method); HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode()); Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity()); List<UserVO> vos = parseUserArray(response.getEntity());
assertNotNull(vos); Assert.assertNotNull(vos);
assertEquals(1, vos.size()); Assert.assertEquals(1, vos.size());
assertEquals(id.getIdentity().getName(), vos.get(0).getLogin()); Assert.assertEquals(id.getIdentity().getKey(), vos.get(0).getKey());
Assert.assertNull(vos.get(0).getLogin());
conn.shutdown();
}
@Test
public void testFindUsersByLogin_manualIdentityName() throws IOException, URISyntaxException {
String currentIdentityNameSetting = securityModule.getIdentityName();
securityModule.setIdentityName("manual");
//there is user-rest-...
IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("u-rest-manual");
Assert.assertNotNull(id);
RestConnection conn = new RestConnection();
assertTrue(conn.login("administrator", "openolat"));
URI request = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("login", id.getLogin()).build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity());
Assert.assertNotNull(vos);
Assert.assertEquals(1, vos.size());
Assert.assertEquals(id.getIdentity().getKey(), vos.get(0).getKey());
Assert.assertEquals(id.getIdentity().getName(), vos.get(0).getLogin());
conn.shutdown();
securityModule.setIdentityName(currentIdentityNameSetting);
}
@Test
public void testFindUsersByExternalId() throws IOException, URISyntaxException {
//there is user-rest-...
IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-external-id");
Assert.assertNotNull(id);
String externalId = UUID.randomUUID().toString();
Identity identity = securityManager.setExternalId(id.getIdentity(), externalId);
dbInstance.commitAndCloseSession();
RestConnection conn = new RestConnection();
assertTrue(conn.login("administrator", "openolat"));
URI request = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("externalId", externalId)
.queryParam("statusVisibleLimit", "all")
.build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity());
Assert.assertNotNull(vos);
Assert.assertEquals(1, vos.size());
Assert.assertEquals(identity.getKey(), vos.get(0).getKey());
Assert.assertNull(vos.get(0).getLogin());
conn.shutdown();
}
@Test
public void testFindUsersByAuthusername() throws IOException, URISyntaxException {
//there is user-rest-...
IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-auth-name");
Assert.assertNotNull(id);
RestConnection conn = new RestConnection();
assertTrue(conn.login("administrator", "openolat"));
URI request = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("authProvider", "OLAT")
.queryParam("authUsername", id.getLogin())
.queryParam("statusVisibleLimit", "all")
.build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity());
Assert.assertNotNull(vos);
Assert.assertEquals(1, vos.size());
Assert.assertEquals(id.getKey(), vos.get(0).getKey());
Assert.assertNull(vos.get(0).getLogin());
conn.shutdown();
}
@Test
public void testFindUsersByAuthusernameShib() throws IOException, URISyntaxException {
//there is user-rest-...
IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-auth-name");
Assert.assertNotNull(id);
String shibIdent = UUID.randomUUID().toString();
securityManager.createAndPersistAuthentication(id.getIdentity(), "Shib", shibIdent, null, null);
dbInstance.commitAndCloseSession();
RestConnection conn = new RestConnection();
assertTrue(conn.login("administrator", "openolat"));
URI request = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("authProvider", "Shib")
.queryParam("authUsername", shibIdent)
.queryParam("statusVisibleLimit", "all")
.build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity());
Assert.assertNotNull(vos);
Assert.assertEquals(1, vos.size());
Assert.assertEquals(id.getKey(), vos.get(0).getKey());
Assert.assertNull(vos.get(0).getLogin());
// false check
URI negativeRequest = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("authProvider", "OLAT")
.queryParam("authUsername", shibIdent)
.queryParam("statusVisibleLimit", "all")
.build();
HttpGet negativeMethod = conn.createGet(negativeRequest, MediaType.APPLICATION_JSON, true);
HttpResponse negativeResponse = conn.execute(negativeMethod);
Assert.assertEquals(200, negativeResponse.getStatusLine().getStatusCode());
List<UserVO> negativeVos = parseUserArray(negativeResponse.getEntity());
Assert.assertNotNull(negativeVos);
Assert.assertTrue(negativeVos.isEmpty());
conn.shutdown();
}
@Test
public void testFindUsersByExternalId_negatif() throws IOException, URISyntaxException {
//there is user-rest-...
IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-external-id-2");
Assert.assertNotNull(id);
String externalId = UUID.randomUUID().toString();
Identity identity = securityManager.setExternalId(id.getIdentity(), externalId);
dbInstance.commitAndCloseSession();
Assert.assertNotNull(identity);
RestConnection conn = new RestConnection();
assertTrue(conn.login("administrator", "openolat"));
URI request = UriBuilder.fromUri(getContextURI()).path("users")
.queryParam("externalId", "a-non-existing-external-key")
.queryParam("statusVisibleLimit", "all")
.build();
HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
List<UserVO> vos = parseUserArray(response.getEntity());
Assert.assertNotNull(vos);
Assert.assertTrue(vos.isEmpty());
conn.shutdown(); conn.shutdown();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment