This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit eaad70cb24c77524051b58875422e4ef28a9a997 Author: Benoit Tellier <[email protected]> AuthorDate: Thu Mar 5 11:08:52 2020 +0700 JAMES-1759 WebAdmin route to test user existence Convenient when the input of user list is super large --- .../apache/james/webadmin/routes/UserRoutes.java | 31 ++++++++++++++ .../apache/james/webadmin/service/UserService.java | 8 +--- .../james/webadmin/routes/UserRoutesTest.java | 48 ++++++++++++++++++++++ src/site/markdown/server/manage-webadmin.md | 16 ++++++++ 4 files changed, 96 insertions(+), 7 deletions(-) diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java index cd8699d..6cfcbc8 100644 --- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java +++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java @@ -27,6 +27,7 @@ import java.util.List; import javax.inject.Inject; import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.HEAD; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -38,6 +39,7 @@ import org.apache.james.rrt.api.RecipientRewriteTable; import org.apache.james.rrt.api.RecipientRewriteTableException; import org.apache.james.user.api.InvalidUsernameException; import org.apache.james.user.api.UsersRepositoryException; +import org.apache.james.webadmin.Constants; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.dto.AddUserRequest; import org.apache.james.webadmin.dto.UserResponse; @@ -106,6 +108,8 @@ public class UserRoutes implements Routes { defineDeleteUser(); defineAllowedFromHeaders(); + + defineUserExist(); } @DELETE @@ -124,6 +128,23 @@ public class UserRoutes implements Routes { service.delete(USERS + SEPARATOR + USER_NAME, this::removeUser); } + @HEAD + @Path("/{username}") + @ApiOperation(value = "Testing an user existence") + @ApiImplicitParams({ + @ApiImplicitParam(required = true, dataType = "string", name = "username", paramType = "path") + }) + @ApiResponses(value = { + @ApiResponse(code = HttpStatus.OK_200, message = "OK. User exists."), + @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid input user."), + @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "User does not exist."), + @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, + message = "Internal server error - Something went bad on the server side.") + }) + public void defineUserExist() { + service.head(USERS + SEPARATOR + USER_NAME, this::userExist); + } + @PUT @Path("/{username}") @ApiOperation(value = "Creating an user") @@ -188,6 +209,16 @@ public class UserRoutes implements Routes { } } + private String userExist(Request request, Response response) throws UsersRepositoryException { + Username username = extractUsername(request); + if (userService.userExists(username)) { + response.status(HttpStatus.OK_200); + } else { + response.status(HttpStatus.NOT_FOUND_404); + } + return Constants.EMPTY_BODY; + } + private HaltException upsertUser(Request request, Response response) throws JsonExtractException { Username username = extractUsername(request); try { diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java index a263234..35e5cb6 100644 --- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java +++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java @@ -24,7 +24,6 @@ import java.util.Optional; import java.util.stream.Stream; import javax.inject.Inject; -import javax.mail.internet.AddressException; import org.apache.james.core.Username; import org.apache.james.user.api.UsersRepository; @@ -67,12 +66,7 @@ public class UserService { } public boolean userExists(Username username) throws UsersRepositoryException { - try { - return usersRepository.contains(usersRepository.getUser(username.asMailAddress())); - } catch (AddressException e) { - LOGGER.info("Unable to parse address '%s'", username.asString(), e); - return false; - } + return usersRepository.contains(username); } private void upsert(User user, Username username, char[] password) throws UsersRepositoryException { diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java index 38b1ada..2354290 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java @@ -246,6 +246,14 @@ class UserRoutesTest { } @Test + default void headShouldReturnBadRequestWhenEmptyUserName() { + when() + .head("/") + .then() + .statusCode(HttpStatus.NOT_FOUND_404); + } + + @Test default void deleteShouldReturnBadRequestWhenUsernameIsTooLong() { when() .delete(USERNAME_WITH_DOMAIN.asString() + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." + @@ -514,6 +522,26 @@ class UserRoutesTest { } @Test + void headShouldReturnOKWhenUserExists() { + with() + .body("{\"password\":\"password\"}") + .put(USERNAME_WITH_DOMAIN.asString()); + + when() + .head(USERNAME_WITH_DOMAIN.asString()) + .then() + .statusCode(HttpStatus.OK_200); + } + + @Test + void headShouldReturnNotFoundWhenUserDoesNotExist() { + when() + .head(USERNAME_WITH_DOMAIN.asString()) + .then() + .statusCode(HttpStatus.NOT_FOUND_404); + } + + @Test void puttingWithDomainPartInUsernameTwoTimesShouldBeAllowed() { // Given with() @@ -683,6 +711,26 @@ class UserRoutesTest { } @Test + void headShouldReturnOKWhenUserExists() { + with() + .body("{\"password\":\"password\"}") + .put(USERNAME_WITHOUT_DOMAIN.asString()); + + when() + .head(USERNAME_WITHOUT_DOMAIN.asString()) + .then() + .statusCode(HttpStatus.OK_200); + } + + @Test + void headShouldReturnNotFoundWhenUserDoesNotExist() { + when() + .head(USERNAME_WITHOUT_DOMAIN.asString()) + .then() + .statusCode(HttpStatus.NOT_FOUND_404); + } + + @Test void puttingWithoutDomainPartInUsernameTwoTimesShouldBeAllowed() { // Given with() diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md index 33d7a16..0b5675f 100644 --- a/src/site/markdown/server/manage-webadmin.md +++ b/src/site/markdown/server/manage-webadmin.md @@ -297,6 +297,7 @@ Response codes: ## Administrating users - [Create a user](#Create_a_user) + - [Testing a user existence](#Testing_a_user_existence) - [Updating a user password](#Updating_a_user_password) - [Deleting a domain](#Deleting_a_user) - [Retrieving the user list](#Retrieving_the_user_list) @@ -320,6 +321,21 @@ Response codes: Note: if the user exists already, its password will be updated. +###Testing a user existence + +``` +curl -XHEAD http://ip:port/users/usernameToBeUsed +``` + +Resource name "usernameToBeUsed" represents a valid user, +hence it should match the criteria at [User Repositories documentation](/server/config-users.html) + +Response codes: + + - 200: The user exists + - 400: The user name is invalid + - 404: The user does not exist + ### Updating a user password Same than Create, but a user need to exist. --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
