keycloak-aplcache

Details

diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java
index 0be38da..4df22ec 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java
@@ -52,6 +52,7 @@ import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
 import org.keycloak.models.utils.ModelToRepresentation;
+import org.keycloak.models.utils.RepresentationToModel;
 import org.keycloak.protocol.oidc.OIDCLoginProtocol;
 import org.keycloak.protocol.oidc.utils.RedirectUtils;
 import org.keycloak.provider.ProviderFactory;
@@ -169,6 +170,7 @@ public class UserResource {
             }
 
             updateUserFromRep(user, rep, attrsToRemove, realm, session, true);
+            RepresentationToModel.createCredentials(rep, session, realm, user, true);
             adminEvent.operation(OperationType.UPDATE).resourcePath(uriInfo).representation(rep).success();
 
             if (session.getTransactionManager().isActive()) {
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java
index cb8b6b3..2ea2122 100755
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java
@@ -1219,7 +1219,45 @@ public class UserTest extends AbstractAdminTest {
             switchEditUsernameAllowedOn(false);
         }
     }
-    
+
+    @Test
+    public void updateUserWithRawCredentials() {
+        UserRepresentation user = new UserRepresentation();
+        user.setUsername("user_rawpw");
+        user.setEmail("email.raw@localhost");
+
+        CredentialRepresentation rawPassword = new CredentialRepresentation();
+        rawPassword.setValue("ABCD");
+        rawPassword.setType(CredentialRepresentation.PASSWORD);
+        user.setCredentials(Arrays.asList(rawPassword));
+
+        String id = createUser(user);
+
+        CredentialModel credential = fetchCredentials("user_rawpw");
+        assertNotNull("Expecting credential", credential);
+        assertEquals(PasswordPolicy.HASH_ALGORITHM_DEFAULT, credential.getAlgorithm());
+        assertEquals(PasswordPolicy.HASH_ITERATIONS_DEFAULT, credential.getHashIterations());
+        assertNotEquals("ABCD", credential.getValue());
+        assertEquals(CredentialRepresentation.PASSWORD, credential.getType());
+
+        UserResource userResource = realm.users().get(id);
+        UserRepresentation userRep = userResource.toRepresentation();
+
+        CredentialRepresentation rawPasswordForUpdate = new CredentialRepresentation();
+        rawPasswordForUpdate.setValue("EFGH");
+        rawPasswordForUpdate.setType(CredentialRepresentation.PASSWORD);
+        userRep.setCredentials(Arrays.asList(rawPasswordForUpdate));
+
+        updateUser(userResource, userRep);
+
+        CredentialModel updatedCredential = fetchCredentials("user_rawpw");
+        assertNotNull("Expecting credential", updatedCredential);
+        assertEquals(PasswordPolicy.HASH_ALGORITHM_DEFAULT, updatedCredential.getAlgorithm());
+        assertEquals(PasswordPolicy.HASH_ITERATIONS_DEFAULT, updatedCredential.getHashIterations());
+        assertNotEquals("EFGH", updatedCredential.getValue());
+        assertEquals(CredentialRepresentation.PASSWORD, updatedCredential.getType());
+    }
+
     @Test
     public void resetUserPassword() {
         String userId = createUser("user1", "user1@localhost");