private List<CredentialEntity> getCredentialEntities(UserEntity userEntity, String credType) { List<CredentialEntity> credentialEntities = new ArrayList<CredentialEntity>(); for (CredentialEntity entity : userEntity.getCredentials()) { if (entity.getType().equals(credType)) { credentialEntities.add(entity); } } // Avoiding direct use of credSecond.getCreatedDate() - credFirst.getCreatedDate() to prevent // Integer Overflow // Orders from most recent to least recent Collections.sort( credentialEntities, new Comparator<CredentialEntity>() { public int compare(CredentialEntity credFirst, CredentialEntity credSecond) { if (credFirst.getCreatedDate() > credSecond.getCreatedDate()) { return -1; } else if (credFirst.getCreatedDate() < credSecond.getCreatedDate()) { return 1; } else { return 0; } } }); return credentialEntities; }
private CredentialEntity getCredentialEntity(UserEntity userEntity, String credType) { for (CredentialEntity entity : userEntity.getCredentials()) { if (entity.getType().equals(credType)) { return entity; } } return null; }
private void setValue(CredentialEntity credentialEntity, UserCredentialModel cred) { byte[] salt = getSalt(); int hashIterations = 1; PasswordPolicy policy = realm.getPasswordPolicy(); if (policy != null) { hashIterations = policy.getHashIterations(); if (hashIterations == -1) hashIterations = 1; } credentialEntity.setCreatedDate(Time.toMillis(Time.currentTime())); credentialEntity.setValue( new Pbkdf2PasswordEncoder(salt).encode(cred.getValue(), hashIterations)); credentialEntity.setSalt(salt); credentialEntity.setHashIterations(hashIterations); }
@Override public void updateCredential(UserCredentialModel cred) { if (cred.getType().equals(UserCredentialModel.PASSWORD)) { updatePasswordCredential(cred); } else { CredentialEntity credentialEntity = getCredentialEntity(user, cred.getType()); if (credentialEntity == null) { credentialEntity = setCredentials(user, cred); credentialEntity.setValue(cred.getValue()); user.getCredentials().add(credentialEntity); } else { credentialEntity.setValue(cred.getValue()); } } }
private void updatePasswordCredential(UserCredentialModel cred) { CredentialEntity credentialEntity = getCredentialEntity(user, cred.getType()); if (credentialEntity == null) { credentialEntity = setCredentials(user, cred); setValue(credentialEntity, cred); user.getCredentials().add(credentialEntity); } else { int expiredPasswordsPolicyValue = -1; PasswordPolicy policy = realm.getPasswordPolicy(); if (policy != null) { expiredPasswordsPolicyValue = policy.getExpiredPasswords(); } if (expiredPasswordsPolicyValue != -1) { user.getCredentials().remove(credentialEntity); credentialEntity.setType(UserCredentialModel.PASSWORD_HISTORY); user.getCredentials().add(credentialEntity); List<CredentialEntity> credentialEntities = getCredentialEntities(user, UserCredentialModel.PASSWORD_HISTORY); if (credentialEntities.size() > expiredPasswordsPolicyValue - 1) { user.getCredentials() .removeAll( credentialEntities.subList( expiredPasswordsPolicyValue - 1, credentialEntities.size())); } credentialEntity = setCredentials(user, cred); setValue(credentialEntity, cred); user.getCredentials().add(credentialEntity); } else { List<CredentialEntity> credentialEntities = getCredentialEntities(user, UserCredentialModel.PASSWORD_HISTORY); if (credentialEntities != null && credentialEntities.size() > 0) { user.getCredentials().removeAll(credentialEntities); } setValue(credentialEntity, cred); } } }
@Override public List<UserCredentialValueModel> getCredentialsDirectly() { List<CredentialEntity> credentials = new ArrayList<CredentialEntity>(user.getCredentials()); List<UserCredentialValueModel> result = new ArrayList<UserCredentialValueModel>(); for (CredentialEntity credEntity : credentials) { UserCredentialValueModel credModel = new UserCredentialValueModel(); credModel.setType(credEntity.getType()); credModel.setDevice(credEntity.getDevice()); credModel.setCreatedDate(credEntity.getCreatedDate()); credModel.setValue(credEntity.getValue()); credModel.setSalt(credEntity.getSalt()); credModel.setHashIterations(credEntity.getHashIterations()); result.add(credModel); } return result; }
@Override public void updateCredentialDirectly(UserCredentialValueModel credModel) { CredentialEntity credentialEntity = getCredentialEntity(user, credModel.getType()); if (credentialEntity == null) { credentialEntity = new CredentialEntity(); // credentialEntity.setId(KeycloakModelUtils.generateId()); credentialEntity.setType(credModel.getType()); // credentialEntity.setUser(user); credModel.setCreatedDate(credModel.getCreatedDate()); user.getCredentials().add(credentialEntity); } credentialEntity.setValue(credModel.getValue()); credentialEntity.setSalt(credModel.getSalt()); credentialEntity.setDevice(credModel.getDevice()); credentialEntity.setHashIterations(credModel.getHashIterations()); }
private CredentialEntity setCredentials(UserEntity user, UserCredentialModel cred) { CredentialEntity credentialEntity = new CredentialEntity(); credentialEntity.setType(cred.getType()); credentialEntity.setDevice(cred.getDevice()); return credentialEntity; }