mirror of
https://github.com/bitwarden/server.git
synced 2025-04-05 21:18:13 -05:00
[Emergency Access] Add premium check (#1815)
This commit is contained in:
parent
0def1830af
commit
68a8092235
@ -85,8 +85,8 @@ namespace Bit.Api.Controllers
|
|||||||
throw new NotFoundException();
|
throw new NotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
var userId = _userService.GetProperUserId(User);
|
var user = await _userService.GetUserByPrincipalAsync(User);
|
||||||
await _emergencyAccessService.SaveAsync(model.ToEmergencyAccess(emergencyAccess), userId.Value);
|
await _emergencyAccessService.SaveAsync(model.ToEmergencyAccess(emergencyAccess), user);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id}")]
|
[HttpDelete("{id}")]
|
||||||
|
@ -15,7 +15,7 @@ namespace Bit.Core.Services
|
|||||||
Task DeleteAsync(Guid emergencyAccessId, Guid grantorId);
|
Task DeleteAsync(Guid emergencyAccessId, Guid grantorId);
|
||||||
Task<EmergencyAccess> ConfirmUserAsync(Guid emergencyAccessId, string key, Guid grantorId);
|
Task<EmergencyAccess> ConfirmUserAsync(Guid emergencyAccessId, string key, Guid grantorId);
|
||||||
Task<EmergencyAccessDetails> GetAsync(Guid emergencyAccessId, Guid userId);
|
Task<EmergencyAccessDetails> GetAsync(Guid emergencyAccessId, Guid userId);
|
||||||
Task SaveAsync(EmergencyAccess emergencyAccess, Guid savingUserId);
|
Task SaveAsync(EmergencyAccess emergencyAccess, User savingUser);
|
||||||
Task InitiateAsync(Guid id, User initiatingUser);
|
Task InitiateAsync(Guid id, User initiatingUser);
|
||||||
Task ApproveAsync(Guid id, User approvingUser);
|
Task ApproveAsync(Guid id, User approvingUser);
|
||||||
Task RejectAsync(Guid id, User rejectingUser);
|
Task RejectAsync(Guid id, User rejectingUser);
|
||||||
|
@ -189,9 +189,14 @@ namespace Bit.Core.Services
|
|||||||
return emergencyAccess;
|
return emergencyAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveAsync(EmergencyAccess emergencyAccess, Guid savingUserId)
|
public async Task SaveAsync(EmergencyAccess emergencyAccess, User savingUser)
|
||||||
{
|
{
|
||||||
if (emergencyAccess.GrantorId != savingUserId)
|
if (!await _userService.CanAccessPremium(savingUser))
|
||||||
|
{
|
||||||
|
throw new BadRequestException("Not a premium user.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emergencyAccess.GrantorId != savingUser.Id)
|
||||||
{
|
{
|
||||||
throw new BadRequestException("Emergency Access not valid.");
|
throw new BadRequestException("Emergency Access not valid.");
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,26 @@ namespace Bit.Core.Test.Services
|
|||||||
{
|
{
|
||||||
public class EmergencyAccessServiceTests
|
public class EmergencyAccessServiceTests
|
||||||
{
|
{
|
||||||
|
[Theory, CustomAutoData(typeof(SutProviderCustomization))]
|
||||||
|
public async Task SaveAsync_PremiumCannotUpdate(
|
||||||
|
SutProvider<EmergencyAccessService> sutProvider, User savingUser)
|
||||||
|
{
|
||||||
|
savingUser.Premium = false;
|
||||||
|
var emergencyAccess = new EmergencyAccess
|
||||||
|
{
|
||||||
|
Type = Enums.EmergencyAccessType.Takeover,
|
||||||
|
GrantorId = savingUser.Id,
|
||||||
|
};
|
||||||
|
|
||||||
|
sutProvider.GetDependency<IUserService>().GetUserByIdAsync(savingUser.Id).Returns(savingUser);
|
||||||
|
|
||||||
|
var exception = await Assert.ThrowsAsync<BadRequestException>(
|
||||||
|
() => sutProvider.Sut.SaveAsync(emergencyAccess, savingUser));
|
||||||
|
|
||||||
|
Assert.Contains("Not a premium user.", exception.Message);
|
||||||
|
await sutProvider.GetDependency<IEmergencyAccessRepository>().DidNotReceiveWithAnyArgs().ReplaceAsync(default);
|
||||||
|
}
|
||||||
|
|
||||||
[Theory, CustomAutoData(typeof(SutProviderCustomization))]
|
[Theory, CustomAutoData(typeof(SutProviderCustomization))]
|
||||||
public async Task InviteAsync_UserWithKeyConnectorCannotUseTakeover(
|
public async Task InviteAsync_UserWithKeyConnectorCannotUseTakeover(
|
||||||
SutProvider<EmergencyAccessService> sutProvider, User invitingUser, string email, int waitTime)
|
SutProvider<EmergencyAccessService> sutProvider, User invitingUser, string email, int waitTime)
|
||||||
@ -62,10 +82,12 @@ namespace Bit.Core.Test.Services
|
|||||||
GrantorId = savingUser.Id,
|
GrantorId = savingUser.Id,
|
||||||
};
|
};
|
||||||
|
|
||||||
sutProvider.GetDependency<IUserService>().GetUserByIdAsync(savingUser.Id).Returns(savingUser);
|
var userService = sutProvider.GetDependency<IUserService>();
|
||||||
|
userService.GetUserByIdAsync(savingUser.Id).Returns(savingUser);
|
||||||
|
userService.CanAccessPremium(savingUser).Returns(true);
|
||||||
|
|
||||||
var exception = await Assert.ThrowsAsync<BadRequestException>(
|
var exception = await Assert.ThrowsAsync<BadRequestException>(
|
||||||
() => sutProvider.Sut.SaveAsync(emergencyAccess, savingUser.Id));
|
() => sutProvider.Sut.SaveAsync(emergencyAccess, savingUser));
|
||||||
|
|
||||||
Assert.Contains("You cannot use Emergency Access Takeover because you are using Key Connector", exception.Message);
|
Assert.Contains("You cannot use Emergency Access Takeover because you are using Key Connector", exception.Message);
|
||||||
await sutProvider.GetDependency<IEmergencyAccessRepository>().DidNotReceiveWithAnyArgs().ReplaceAsync(default);
|
await sutProvider.GetDependency<IEmergencyAccessRepository>().DidNotReceiveWithAnyArgs().ReplaceAsync(default);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user