Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit e3a6d8c2 authored by Joze RIHTARSIC's avatar Joze RIHTARSIC
Browse files

Pull request #97: [EDELIVERY-13367] SA report

Merge in EDELIVERY/smp from bugfix/EDELIVERY-13367-sa-domismp-it3-3.2-client-side-validation-bypass to development

* commit '5e37eb4d':
  [EDELIVERY-13367] SA report
parents b662bca7 5e37eb4d
No related branches found
No related tags found
No related merge requests found
......@@ -47,7 +47,7 @@ export class PasswordChangeDialogComponent {
let currentPasswdFormControl: UntypedFormControl = new UntypedFormControl({value: null, readonly: false},
this.securityService.getCurrentUser().casAuthenticated && this.adminUser ? null : [Validators.required]);
let newPasswdFormControl: UntypedFormControl = new UntypedFormControl({value: null, readonly: false},
[Validators.required, Validators.pattern(this.passwordValidationRegExp), equal(currentPasswdFormControl, false)]);
[Validators.required, Validators.pattern(this.passwordValidationRegExp)]);
let confirmNewPasswdFormControl: UntypedFormControl = new UntypedFormControl({value: null, readonly: false},
[Validators.required, equal(newPasswdFormControl, true)]);
......
......@@ -154,7 +154,7 @@ public enum SMPPropertyEnum {
"Password minimum complexity rules!",
OPTIONAL, NOT_ENCRYPTED, NO_RESTART_NEEDED, REGEXP),
PASSWORD_POLICY_MESSAGE("smp.passwordPolicy.validationMessage", "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character",
PASSWORD_POLICY_MESSAGE("smp.passwordPolicy.validationMessage", "Minimum length: 16 characters;Maximum length: 32 characters;At least one letter in lowercase;At least one letter in uppercase;At least one digit;At least one special character;Must not be same as existing password",
"The error message shown to the user in case the password does not follow the regex put in the domibus.passwordPolicy.pattern property",
OPTIONAL, NOT_ENCRYPTED, NO_RESTART_NEEDED, STRING),
PASSWORD_POLICY_VALID_DAYS("smp.passwordPolicy.validDays", "90", "Number of days password is valid",
......
......@@ -246,6 +246,15 @@ public class UIUserService extends UIServiceBase<DBUser, UserRO> {
CredentialType.USERNAME_PASSWORD,
CredentialTargetType.UI));
// check if new password is the same as the old one
// but allow admin to overwrite it
if (!adminUpdate
&& StringUtils.isNotBlank(dbCredential.getValue())
&& BCrypt.checkpw(password, dbCredential.getValue())) {
LOG.info(SMPLogger.SECURITY_MARKER, "Change/set password failed because 'new' password match the old password for user: [{}]", userID);
throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "PasswordChange", configurationService.getPasswordPolicyValidationMessage());
}
dbCredential.setValue(BCryptPasswordHash.hashPassword(password));
OffsetDateTime currentTime = OffsetDateTime.now();
dbCredential.setChangedOn(currentTime);
......
......@@ -250,6 +250,24 @@ class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao {
testInstance.updateUserPassword(authorizedUserId, userToUpdateId, authorizedPassword, newPassword);
}
@Test
void testUpdateUserPasswordFaileSame() {
DBUser user = TestDBUtils.createDBUserByUsername(UUID.randomUUID().toString());
DBCredential credential = TestDBUtils.createDBCredentialForUser(user, null, null, null);
credential.setValue(BCrypt.hashpw("TTTTtttt1111$$$$$", BCrypt.gensalt()));
userDao.persistFlushDetach(user);
credentialDao.persistFlushDetach(credential);
long authorizedUserId = user.getId();
long userToUpdateId = user.getId();
String authorizedPassword = "TTTTtttt1111$$$$$";
String newPassword = "TTTTtttt1111$$$$$";
SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
() -> testInstance.updateUserPassword(authorizedUserId, userToUpdateId, authorizedPassword, newPassword));
MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Must not be same as existing password"));
}
@Test
void testUpdateUserPasswordByAdminUserNotExists() {
// system admin
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment