diff --git a/scim/src/main/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioning.java b/scim/src/main/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioning.java index 6319eac81bc..5292496cc41 100644 --- a/scim/src/main/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioning.java +++ b/scim/src/main/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioning.java @@ -96,7 +96,7 @@ public class JdbcScimUserProvisioning extends AbstractQueryable implem private final RowMapper mapper = new ScimUserRowMapper(); - private Pattern usernamePattern = Pattern.compile("[a-zA-Z0-9+\\-_.@']+"); + private Pattern usernamePattern = Pattern.compile("[a-zA-Z0-9+\\-_.@'!]+"); public JdbcScimUserProvisioning(JdbcTemplate jdbcTemplate, JdbcPagingListFactory pagingListFactory) { super(jdbcTemplate, pagingListFactory, new ScimUserRowMapper()); diff --git a/scim/src/test/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioningTests.java b/scim/src/test/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioningTests.java index c6468bf05ae..f4560f0e48d 100644 --- a/scim/src/test/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioningTests.java +++ b/scim/src/test/java/org/cloudfoundry/identity/uaa/scim/jdbc/JdbcScimUserProvisioningTests.java @@ -121,6 +121,15 @@ public void clear() throws Exception { IdentityZoneHolder.clear(); } + @Test + public void canCreateUserWithExclamationMarkInUsername() { + String userName = "jo!!@foo.com"; + ScimUser user = new ScimUser(null, userName, "Jo", "User"); + user.addEmail(userName); + ScimUser created = db.createUser(user, "j7hyqpassX"); + assertEquals(userName, created.getUserName()); + } + @Test public void canCreateUserInDefaultIdentityZone() { ScimUser user = new ScimUser(null, "jo@foo.com", "Jo", "User"); diff --git a/uaa/src/main/webapp/WEB-INF/spring/scim-endpoints.xml b/uaa/src/main/webapp/WEB-INF/spring/scim-endpoints.xml index 3e573f2f5a4..58d27610a6f 100644 --- a/uaa/src/main/webapp/WEB-INF/spring/scim-endpoints.xml +++ b/uaa/src/main/webapp/WEB-INF/spring/scim-endpoints.xml @@ -32,7 +32,7 @@ - + diff --git a/uaa/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsMockMvcTests.java b/uaa/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsMockMvcTests.java index e2c1f815751..fe30488ecb5 100644 --- a/uaa/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsMockMvcTests.java +++ b/uaa/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsMockMvcTests.java @@ -88,8 +88,10 @@ private ScimUser createUser(String token) throws Exception { } private ScimUser createUser(String token, String subdomain) throws Exception { - ScimUser user = getScimUser(); + return createUser(getScimUser(), token, subdomain); + } + private ScimUser createUser(ScimUser user, String token, String subdomain) throws Exception { byte[] requestBody = new ObjectMapper().writeValueAsBytes(user); MockHttpServletRequestBuilder post = post("/Users") .header("Authorization", "Bearer " + token) @@ -118,6 +120,15 @@ private ScimUser getScimUser() { return user; } + @Test + public void testCanCreateUserWithExclamationMark() throws Exception { + String email = "joe!!@"+generator.generate().toLowerCase()+".com"; + ScimUser user = getScimUser(); + user.setUserName(email); + user.setPrimaryEmail(email); + createUser(user, scimReadWriteToken, null); + } + @Test public void testCreateUser() throws Exception { createUser(scimReadWriteToken);