Skip to content

Commit a0dec90

Browse files
committed
RE1-T113 Set pw on first login
1 parent d8dc91f commit a0dec90

12 files changed

Lines changed: 108 additions & 3 deletions

File tree

Core/Resgrid.Model/DepartmentMember.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ public class DepartmentMember : IEntity
8080
/// </summary>
8181
public DateTime? PasswordLastSetOn { get; set; }
8282

83+
/// <summary>
84+
/// When true the user must change their password on next login.
85+
/// Set by admins when creating accounts or resetting passwords.
86+
/// Cleared automatically after the user completes the forced password change.
87+
/// </summary>
88+
public bool MustChangePassword { get; set; }
89+
8390
[NotMapped]
8491
public string TableName => "DepartmentMembers";
8592

Core/Resgrid.Services/DepartmentsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public async Task<string> GetUserIdForDeletedUserInDepartmentAsync(int departmen
289289
if (member != null)
290290
{
291291
member.IsDeleted = true;
292-
var savedMember = _departmentMembersRepository.SaveOrUpdateAsync(member, cancellationToken);
292+
await _departmentMembersRepository.SaveOrUpdateAsync(member, cancellationToken);
293293

294294
var member2 = await _departmentMembersRepository.GetDepartmentMemberByDepartmentIdAndUserIdAsync(departmentId, userIdToDelete);
295295

Core/Resgrid.Services/UsersService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public async Task<bool> DoesUserHaveAnyActiveDepartments(string userName)
9797
var user = await GetUserByNameAsync(userName);
9898
var memberships = await _departmentMembersRepository.GetAllByUserIdAsync(user.UserId);
9999

100-
return memberships.Any(x => x.IsDeleted == false);
100+
return memberships.Any(x => x.IsDeleted == false && (x.IsDisabled == null || x.IsDisabled == false));
101101
}
102102

103103
public IdentityUser GetUserById(string userId, bool bypassCache = true)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using FluentMigrator;
2+
3+
namespace Resgrid.Providers.Migrations.Migrations
4+
{
5+
[Migration(64)]
6+
public class M0064_AddingMustChangePassword : Migration
7+
{
8+
public override void Up()
9+
{
10+
Alter.Table("DepartmentMembers")
11+
.AddColumn("MustChangePassword").AsBoolean().NotNullable().WithDefaultValue(false);
12+
}
13+
14+
public override void Down()
15+
{
16+
Delete.Column("MustChangePassword").FromTable("DepartmentMembers");
17+
}
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using FluentMigrator;
2+
3+
namespace Resgrid.Providers.MigrationsPg.Migrations
4+
{
5+
[Migration(64)]
6+
public class M0064_AddingMustChangePasswordPg : Migration
7+
{
8+
public override void Up()
9+
{
10+
Alter.Table("DepartmentMembers".ToLower())
11+
.AddColumn("MustChangePassword".ToLower()).AsBoolean().NotNullable().WithDefaultValue(false);
12+
}
13+
14+
public override void Down()
15+
{
16+
Delete.Column("MustChangePassword".ToLower()).FromTable("DepartmentMembers".ToLower());
17+
}
18+
}
19+
}

Web/Resgrid.Web/Areas/User/Controllers/PersonnelController.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,16 @@ public async Task<IActionResult> AddPerson(AddPersonModel model, IFormCollection
547547

548548
await _departmentsService.AddUserToDepartmentAsync(DepartmentId, user.UserId, false, cancellationToken);
549549

550+
if (model.MustChangePasswordOnLogin)
551+
{
552+
var member = await _departmentsService.GetDepartmentMemberAsync(user.UserId, DepartmentId);
553+
if (member != null)
554+
{
555+
member.MustChangePassword = true;
556+
await _departmentsService.SaveDepartmentMemberAsync(member, cancellationToken);
557+
}
558+
}
559+
550560
var userObject = _usersService.GetUserById(user.UserId);
551561

552562
_eventAggregator.SendMessage<UserCreatedEvent>(new UserCreatedEvent() { DepartmentId = DepartmentId, Name = string.Format("{0} {1}", model.FirstName, model.LastName), User = userObject });

Web/Resgrid.Web/Areas/User/Controllers/ProfileController.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,13 @@ public async Task<IActionResult> ResetPasswordForUser(ResetPasswordForUserView
10001000
{
10011001
await _departmentSsoService.RecordPasswordChangedAsync(DepartmentId, model.UserId);
10021002

1003+
var member = await _departmentsService.GetDepartmentMemberAsync(model.UserId, DepartmentId);
1004+
if (member != null)
1005+
{
1006+
member.MustChangePassword = model.MustChangePasswordOnLogin;
1007+
await _departmentsService.SaveDepartmentMemberAsync(member);
1008+
}
1009+
10031010
if (model.EmailUser)
10041011
await _emailService.SendPasswordResetEmail(model.Email, model.Name, user.UserName, model.Password, userDepartment.Name);
10051012

Web/Resgrid.Web/Areas/User/Models/AddPersonModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,7 @@ public class AddPersonModel: BaseUserModel
6363
public string ConfirmPassword { get; set; }
6464

6565
public bool SendAccountCreationNotification { get; set; }
66+
67+
public bool MustChangePasswordOnLogin { get; set; }
6668
}
6769
}

Web/Resgrid.Web/Areas/User/Models/Profile/ResetPasswordForUserView.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,7 @@ public class ResetPasswordForUserView
2525
[Display(Name = "Confirm password")]
2626
[System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
2727
public string ConfirmPassword { get; set; }
28+
29+
public bool MustChangePasswordOnLogin { get; set; }
2830
}
2931
}

Web/Resgrid.Web/Areas/User/Views/Personnel/AddPerson.cshtml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,17 @@
185185
</div>
186186
</div>
187187

188+
<div class="form-group">
189+
<label class="col-sm-2 control-label">Require Password Change</label>
190+
<div class="col-sm-10">
191+
<div class="checkbox checkbox-primary">
192+
<input type="checkbox" class="checkbox checkbox-primary" asp-for="MustChangePasswordOnLogin">
193+
<label></label>
194+
</div>
195+
<p class="help-block">User will be required to change their password on first login.</p>
196+
</div>
197+
</div>
198+
188199
@if (!string.IsNullOrEmpty(Model.UdfFormHtml))
189200
{
190201
<div class="hr-line-dashed"></div>

0 commit comments

Comments
 (0)