Skip to content

Commit 95cba29

Browse files
committed
allow enforcing password change for all role types and update reset pwd flow for passwordchangerequired
1 parent c7e48b7 commit 95cba29

File tree

4 files changed

+14
-16
lines changed

4 files changed

+14
-16
lines changed

server/src/main/java/com/cloud/user/AccountManagerImpl.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,8 +1587,9 @@ public UserAccount updateUser(UpdateUserCmd updateUserCmd) {
15871587
}
15881588

15891589
private void updatePasswordChangeRequired(User caller, UpdateUserCmd updateUserCmd, UserVO user) {
1590-
if (StringUtils.isNotBlank(updateUserCmd.getPassword()) && isNormalUser(user.getAccountId())) {
1591-
boolean isPasswordResetRequired = updateUserCmd.isPasswordChangeRequired();
1590+
if (StringUtils.isNotBlank(updateUserCmd.getPassword())) {
1591+
boolean isCallerSameAsUser = user.getId() == caller.getId();
1592+
boolean isPasswordResetRequired = updateUserCmd.isPasswordChangeRequired() && !isCallerSameAsUser;
15921593
// Admins only can enforce passwordChangeRequired for user
15931594
if ((isRootAdmin(caller.getAccountId()) || isDomainAdmin(caller.getAccountId()))) {
15941595
if (isPasswordResetRequired) {
@@ -1597,11 +1598,8 @@ private void updatePasswordChangeRequired(User caller, UpdateUserCmd updateUserC
15971598
}
15981599

15991600
// Remove passwordChangeRequired if user updating own pwd or admin has not enforced it
1600-
if ((caller.getId() == user.getId()) || !isPasswordResetRequired) {
1601-
UserDetailVO userDetailVO = _userDetailsDao.findDetail(user.getId(), PasswordChangeRequired);
1602-
if (userDetailVO != null) {
1603-
_userDetailsDao.removeDetail(user.getId(), PasswordChangeRequired);
1604-
}
1601+
if (isCallerSameAsUser || !isPasswordResetRequired) {
1602+
_userDetailsDao.removeDetail(user.getId(), PasswordChangeRequired);
16051603
}
16061604
}
16071605
}

server/src/main/java/org/apache/cloudstack/user/UserPasswordResetManagerImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.util.Set;
4949
import java.util.UUID;
5050

51+
import static org.apache.cloudstack.resourcedetail.UserDetailVO.PasswordChangeRequired;
5152
import static org.apache.cloudstack.resourcedetail.UserDetailVO.PasswordResetToken;
5253
import static org.apache.cloudstack.resourcedetail.UserDetailVO.PasswordResetTokenExpiryDate;
5354

@@ -247,6 +248,8 @@ void resetPassword(UserAccount userAccount, String password) {
247248

248249
userDetailsDao.removeDetail(userAccount.getId(), PasswordResetToken);
249250
userDetailsDao.removeDetail(userAccount.getId(), PasswordResetTokenExpiryDate);
251+
// remove password change required if user reset password
252+
userDetailsDao.removeDetail(userAccount.getId(), PasswordChangeRequired);
250253

251254
userDao.persist(user);
252255
}

ui/src/views/iam/ChangeUserPassword.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
v-model:value="form.confirmpassword"
5050
:placeholder="$t('label.confirmpassword.description')"/>
5151
</a-form-item>
52-
<a-form-item v-if="isAdminOrDomainAdmin() && isNormalUserResource()" name="passwordChangeRequired" ref="passwordChangeRequired">
52+
<a-form-item v-if="isAdminOrDomainAdmin() && isCallerNotSameAsUser()" name="passwordChangeRequired" ref="passwordChangeRequired">
5353
<a-checkbox v-model:checked="form.passwordChangeRequired">
5454
{{ $t('label.change.password.onlogin') }}
5555
</a-checkbox>
@@ -104,12 +104,13 @@ export default {
104104
]
105105
})
106106
},
107-
isNormalUserResource () {
108-
return ['User'].includes(this.resource.roletype)
109-
},
110107
isAdminOrDomainAdmin () {
111108
return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
112109
},
110+
isCallerNotSameAsUser () {
111+
const userId = this.$store.getters.userInfo.id
112+
return userId !== this.resource.id
113+
},
113114
isValidValueForKey (obj, key) {
114115
return key in obj && obj[key] != null
115116
},

ui/src/views/iam/ForceChangePassword.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,10 @@ export default {
167167
currentpassword: values.currentpassword
168168
}
169169
postAPI('updateUser', params).then(() => {
170-
this.$message.success(this.$t('message.success.change.password'))
170+
this.$message.success(this.$t('message.please.login.new.password'))
171171
this.isSubmitted = true
172172
}).catch(error => {
173173
console.error(error)
174-
this.$notification.error({
175-
message: 'Error',
176-
description: error.response?.data?.updateuserresponse?.errortext || 'Failed to update password'
177-
})
178174
this.$message.error(this.$t('message.error.change.password'))
179175
}).finally(() => {
180176
this.loading = false

0 commit comments

Comments
 (0)