in service/src/main/java/org/apache/fineract/cn/provisioner/internal/service/AuthenticationService.java [143:185]
public void updatePasswordPolicy(final String username, final PasswordPolicy passwordPolicy) {
try {
final Session session = this.cassandraSessionProvider.getAdminSession();
final MappingManager mappingManager = new MappingManager(session);
final Mapper<UserEntity> userEntityMapper = mappingManager.mapper(UserEntity.class);
final Statement userQuery = userEntityMapper.getQuery(username);
final ResultSet userResult = session.execute(userQuery);
final Row userRow = userResult.one();
if (userRow == null) {
this.logger.warn("Authentication attempt with unknown user: " + username);
throw ServiceException.notFound("Requested resource not found!");
}
final byte[] salt = Bytes.getArray(userRow.getBytes(2));
final int iterationCount = userRow.getInt(3);
final Mapper<ConfigEntity> configEntityMapper = mappingManager.mapper(ConfigEntity.class);
final Statement configQuery = configEntityMapper.getQuery(ProvisionerConstants.CONFIG_INTERNAL);
final ResultSet configResult = session.execute(configQuery);
final Row configRow = configResult.one();
final byte[] secret = Bytes.getArray(configRow.getBytes(1));
if (passwordPolicy.getNewPassword() != null) {
final byte[] newPasswordHash = this.hashGenerator.hash(passwordPolicy.getNewPassword(), EncodingUtils.concatenate(salt, secret), iterationCount, ProvisionerConstants.HASH_LENGTH);
final BoundStatement updateStatement = session.prepare(
"UPDATE users SET passwordWord = ?, password_reset_on = ? WHERE name = ?").bind();
updateStatement.setBytes(0, ByteBuffer.wrap(newPasswordHash));
updateStatement.setTimestamp(1, new Date());
updateStatement.setString(2, username);
session.execute(updateStatement);
}
if (passwordPolicy.getExpiresInDays() != null) {
final BoundStatement updateStatement = session.prepare(
"UPDATE users SET expires_in_days = ? WHERE name = ?").bind();
updateStatement.setInt(0, passwordPolicy.getExpiresInDays());
updateStatement.setString(1, username);
session.execute(updateStatement);
}
} catch (final Exception ex) {
this.logger.error("Error updating password policy!", ex);
throw ServiceException.internalError(ex.getMessage());
}
}