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