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
The following commit(s) were added to refs/heads/master by this push:
new fa5f1c8484 JAMES-3893 Identity routes should not return 500 code when
invalid username (#2519)
fa5f1c8484 is described below
commit fa5f1c8484901fad629a13cb209c515717e7489a
Author: Trần Hồng Quân <[email protected]>
AuthorDate: Mon Nov 25 22:43:21 2024 +0700
JAMES-3893 Identity routes should not return 500 code when invalid username
(#2519)
---
.../integration/WebAdminServerIntegrationTest.java | 62 ++++++++++++++++++++++
.../webadmin/data/jmap/UserIdentityRoutes.java | 58 +++++++++++++++-----
2 files changed, 106 insertions(+), 14 deletions(-)
diff --git
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
index 0a8ebef450..d0349e2142 100644
---
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
+++
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
@@ -326,6 +326,68 @@ public abstract class WebAdminServerIntegrationTest {
.body("message", is("Default identity can not be found"));
}
+ @Test
+ void getIdentitiesOfInvalidUserShouldReturnBadRequest() {
+ given()
+ .get(String.format("/users/%s/identities?default=true", "John
Doe"))
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
+
+ @Test
+ void createIdentitiesForInvalidUserShouldReturnBadRequest() {
+ given()
+ .body("{\n" +
+ " \"name\": \"create name 1\",\n" +
+ " \"email\": \"[email protected]\",\n" +
+ " \"textSignature\": \"create textSignature1\",\n" +
+ " \"htmlSignature\": \"create htmlSignature1\",\n" +
+ " \"sortOrder\": 99,\n" +
+ " \"bcc\": [\n" +
+ " {\n" +
+ " \"name\": \"create bcc 1\",\n" +
+ " \"email\": \"[email protected]\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"replyTo\": [\n" +
+ " {\n" +
+ " \"name\": \"create replyTo 1\",\n" +
+ " \"email\": \"[email protected]\"\n" +
+ " }\n" +
+ " ]\n" +
+ "}")
+ .post(String.format("/users/%s/identities", "John Doe"))
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
+
+ @Test
+ void updateIdentitiesForInvalidUserShouldReturnBadRequest() {
+ given()
+ .body("{\n" +
+ " \"name\": \"create name 1\",\n" +
+ " \"email\": \"[email protected]\",\n" +
+ " \"textSignature\": \"create textSignature1\",\n" +
+ " \"htmlSignature\": \"create htmlSignature1\",\n" +
+ " \"sortOrder\": 99,\n" +
+ " \"bcc\": [\n" +
+ " {\n" +
+ " \"name\": \"create bcc 1\",\n" +
+ " \"email\": \"[email protected]\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"replyTo\": [\n" +
+ " {\n" +
+ " \"name\": \"create replyTo 1\",\n" +
+ " \"email\": \"[email protected]\"\n" +
+ " }\n" +
+ " ]\n" +
+ "}")
+
.put(String.format("/users/%s/identities/b1c924a3-5b86-44fa-a036-77825ec0e3e6",
"John Doe"))
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
+
// Immutable
@Test
void validateHealthChecksShouldReturnOk() {
diff --git
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UserIdentityRoutes.java
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UserIdentityRoutes.java
index 4be3ba89be..473318385a 100644
---
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UserIdentityRoutes.java
+++
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UserIdentityRoutes.java
@@ -42,6 +42,8 @@ import org.apache.james.webadmin.utils.ErrorResponder;
import org.apache.james.webadmin.utils.JsonTransformer;
import org.apache.james.webadmin.utils.ParametersExtractor;
import org.eclipse.jetty.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -62,6 +64,7 @@ public class UserIdentityRoutes implements Routes {
private static final String USER_NAME = ":userName";
private static final String IDENTITY_ID = ":identityId";
public static final String USERS_IDENTITY_BASE_PATH = USERS + SEPARATOR +
USER_NAME + SEPARATOR + IDENTITIES;
+ private static final Logger LOGGER =
LoggerFactory.getLogger(UserIdentityRoutes.class);
private Service service;
private final IdentityRepository identityRepository;
@@ -105,20 +108,31 @@ public class UserIdentityRoutes implements Routes {
}
private List<UserIdentity> listIdentities(Request request, Response
response) {
- Username username = extractUsername(request);
- Optional<Boolean> defaultFilter =
ParametersExtractor.extractBoolean(request, "default");
-
- List<UserIdentity> identities =
Flux.from(identityRepository.list(username))
- .map(UserIdentity::from)
- .collectList()
- .block();
-
- return defaultFilter
- .filter(FunctionalUtils.identityPredicate())
- .map(queryDefault -> getDefaultIdentity(identities)
- .map(List::of)
- .orElseThrow(() -> throw404("Default identity can not be
found")))
- .orElse(identities);
+ try {
+ Username username = extractUsername(request);
+ Optional<Boolean> defaultFilter =
ParametersExtractor.extractBoolean(request, "default");
+
+ List<UserIdentity> identities =
Flux.from(identityRepository.list(username))
+ .map(UserIdentity::from)
+ .collectList()
+ .block();
+
+ return defaultFilter
+ .filter(FunctionalUtils.identityPredicate())
+ .map(queryDefault -> getDefaultIdentity(identities)
+ .map(List::of)
+ .orElseThrow(() -> throw404("Default identity can not be
found")))
+ .orElse(identities);
+ } catch (IllegalStateException e) {
+ LOGGER.info("Invalid argument while listing identities at {}",
request.uri(), e);
+ throw ErrorResponder.builder()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+ .message("Invalid argument while listing identities")
+ .cause(e)
+ .haltError();
+ }
+
}
private HaltException createIdentity(Request request, Response response) {
@@ -134,6 +148,14 @@ public class UserIdentityRoutes implements Routes {
.message("JSON payload of the request is not valid")
.cause(e)
.haltError();
+ } catch (IllegalStateException e) {
+ LOGGER.info("Invalid argument while creating identity at {}",
request.uri(), e);
+ throw ErrorResponder.builder()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+ .message("Invalid argument while creating identity")
+ .cause(e)
+ .haltError();
}
}
@@ -156,6 +178,14 @@ public class UserIdentityRoutes implements Routes {
.haltError();
} catch (IdentityNotFoundException notFoundException) {
throw throw404(String.format("IdentityId '%s' can not be found",
identityId.id().toString()));
+ } catch (IllegalStateException e) {
+ LOGGER.info("Invalid argument while updating identity at {}",
request.uri(), e);
+ throw ErrorResponder.builder()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+ .message("Invalid argument while updating identity")
+ .cause(e)
+ .haltError();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]