You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/03/07 11:25:48 UTC
[james-project] 11/11: JAMES-1759 WebAdmin route to test user
existence
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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org