diff --git a/scim/services/src/main/java/org/keycloak/scim/services/ScimResourceTypeResource.java b/scim/services/src/main/java/org/keycloak/scim/services/ScimResourceTypeResource.java index 1a68a2037625..f7480896f44a 100644 --- a/scim/services/src/main/java/org/keycloak/scim/services/ScimResourceTypeResource.java +++ b/scim/services/src/main/java/org/keycloak/scim/services/ScimResourceTypeResource.java @@ -3,6 +3,7 @@ import java.io.InputStream; import java.time.Instant; import java.util.List; +import java.util.Set; import java.util.function.BiFunction; import java.util.stream.Stream; @@ -223,7 +224,8 @@ public Response patch(@PathParam("id") String id, PatchRequest request) { return resourceNotFound(id); } - if (!request.getSchemas().contains(Scim.PATCH_OP_CORE_SCHEMA)) { + Set schemas = request.getSchemas(); + if (schemas == null || !schemas.contains(Scim.PATCH_OP_CORE_SCHEMA)) { return invalidSyntax("No PATCH op schema provided in request"); } diff --git a/scim/tests/base/src/test/java/org/keycloak/tests/scim/tck/UserTest.java b/scim/tests/base/src/test/java/org/keycloak/tests/scim/tck/UserTest.java index cddbec8fce59..325716c62762 100644 --- a/scim/tests/base/src/test/java/org/keycloak/tests/scim/tck/UserTest.java +++ b/scim/tests/base/src/test/java/org/keycloak/tests/scim/tck/UserTest.java @@ -605,6 +605,27 @@ public void testPatchAdd() { assertEquals("Amanda", actual.getFirstName()); } + @Test + public void testPatchWithNullSchemas() { + User expected = client.users().create(createUser()); + + // a PATCH request body carrying "schemas": null deserializes the schemas set to null, + // which must yield a 400 invalidSyntax response rather than a NullPointerException + PatchRequest request = PatchRequest.create() + .add("active", "false") + .build(); + request.setSchemas(null); + + try { + client.users().patch(expected.getId(), request); + fail("should fail because the PATCH op schema is missing"); + } catch (ScimClientException sce) { + ErrorResponse error = sce.getError(); + assertNotNull(error); + assertEquals(400, error.getStatusInt()); + } + } + @Test public void testPatchReplace() { User expected = client.users().create(createUser());