mirror of
https://github.com/bitwarden/server.git
synced 2025-07-04 01:22:50 -05:00
Auth/pm 2996/add auth request data to devices response model (#5152)
fix(auth): [PM-2996] Add Pending Auth Request Data to Devices Response - New stored procedure to fetch the appropriate data. - Updated devices controller to respond with the new data. - Tests written at the controller and repository level. Resolves PM-2996
This commit is contained in:

committed by
GitHub

parent
5ae232e336
commit
cc96e35072
@ -1,5 +1,12 @@
|
||||
namespace Bit.Core.Auth.Enums;
|
||||
|
||||
/**
|
||||
* The type of auth request.
|
||||
*
|
||||
* Note:
|
||||
* Used by the Device_ReadActiveWithPendingAuthRequestsByUserId.sql stored procedure.
|
||||
* If the enum changes be aware of this reference.
|
||||
*/
|
||||
public enum AuthRequestType : byte
|
||||
{
|
||||
AuthenticateAndUnlock = 0,
|
||||
|
@ -0,0 +1,51 @@
|
||||
using Bit.Core.Auth.Models.Data;
|
||||
using Bit.Core.Auth.Utilities;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Models.Api;
|
||||
|
||||
namespace Bit.Core.Auth.Models.Api.Response;
|
||||
|
||||
public class DeviceAuthRequestResponseModel : ResponseModel
|
||||
{
|
||||
public DeviceAuthRequestResponseModel()
|
||||
: base("device") { }
|
||||
|
||||
public static DeviceAuthRequestResponseModel From(DeviceAuthDetails deviceAuthDetails)
|
||||
{
|
||||
var converted = new DeviceAuthRequestResponseModel
|
||||
{
|
||||
Id = deviceAuthDetails.Id,
|
||||
Name = deviceAuthDetails.Name,
|
||||
Type = deviceAuthDetails.Type,
|
||||
Identifier = deviceAuthDetails.Identifier,
|
||||
CreationDate = deviceAuthDetails.CreationDate,
|
||||
IsTrusted = deviceAuthDetails.IsTrusted()
|
||||
};
|
||||
|
||||
if (deviceAuthDetails.AuthRequestId != null && deviceAuthDetails.AuthRequestCreatedAt != null)
|
||||
{
|
||||
converted.DevicePendingAuthRequest = new PendingAuthRequest
|
||||
{
|
||||
Id = (Guid)deviceAuthDetails.AuthRequestId,
|
||||
CreationDate = (DateTime)deviceAuthDetails.AuthRequestCreatedAt
|
||||
};
|
||||
}
|
||||
|
||||
return converted;
|
||||
}
|
||||
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public DeviceType Type { get; set; }
|
||||
public string Identifier { get; set; }
|
||||
public DateTime CreationDate { get; set; }
|
||||
public bool IsTrusted { get; set; }
|
||||
|
||||
public PendingAuthRequest DevicePendingAuthRequest { get; set; }
|
||||
|
||||
public class PendingAuthRequest
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public DateTime CreationDate { get; set; }
|
||||
}
|
||||
}
|
81
src/Core/Auth/Models/Data/DeviceAuthDetails.cs
Normal file
81
src/Core/Auth/Models/Data/DeviceAuthDetails.cs
Normal file
@ -0,0 +1,81 @@
|
||||
using Bit.Core.Auth.Utilities;
|
||||
using Bit.Core.Entities;
|
||||
using Bit.Core.Enums;
|
||||
|
||||
namespace Bit.Core.Auth.Models.Data;
|
||||
|
||||
public class DeviceAuthDetails : Device
|
||||
{
|
||||
public bool IsTrusted { get; set; }
|
||||
public Guid? AuthRequestId { get; set; }
|
||||
public DateTime? AuthRequestCreatedAt { get; set; }
|
||||
|
||||
/**
|
||||
* Constructor for EF response.
|
||||
*/
|
||||
public DeviceAuthDetails(
|
||||
Device device,
|
||||
Guid? authRequestId,
|
||||
DateTime? authRequestCreationDate)
|
||||
{
|
||||
if (device == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(device));
|
||||
}
|
||||
|
||||
Id = device.Id;
|
||||
Name = device.Name;
|
||||
Type = device.Type;
|
||||
Identifier = device.Identifier;
|
||||
CreationDate = device.CreationDate;
|
||||
IsTrusted = device.IsTrusted();
|
||||
AuthRequestId = authRequestId;
|
||||
AuthRequestCreatedAt = authRequestCreationDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for dapper response.
|
||||
* Note: if the authRequestId or authRequestCreationDate is null it comes back as
|
||||
* an empty guid and a min value for datetime. That could change if the stored
|
||||
* procedure runs on a different kind of db.
|
||||
*/
|
||||
public DeviceAuthDetails(
|
||||
Guid id,
|
||||
Guid userId,
|
||||
string name,
|
||||
short type,
|
||||
string identifier,
|
||||
string pushToken,
|
||||
DateTime creationDate,
|
||||
DateTime revisionDate,
|
||||
string encryptedUserKey,
|
||||
string encryptedPublicKey,
|
||||
string encryptedPrivateKey,
|
||||
bool active,
|
||||
Guid authRequestId,
|
||||
DateTime authRequestCreationDate)
|
||||
{
|
||||
Id = id;
|
||||
Name = name;
|
||||
Type = (DeviceType)type;
|
||||
Identifier = identifier;
|
||||
CreationDate = creationDate;
|
||||
IsTrusted = new Device
|
||||
{
|
||||
Id = id,
|
||||
UserId = userId,
|
||||
Name = name,
|
||||
Type = (DeviceType)type,
|
||||
Identifier = identifier,
|
||||
PushToken = pushToken,
|
||||
RevisionDate = revisionDate,
|
||||
EncryptedUserKey = encryptedUserKey,
|
||||
EncryptedPublicKey = encryptedPublicKey,
|
||||
EncryptedPrivateKey = encryptedPrivateKey,
|
||||
Active = active
|
||||
}.IsTrusted();
|
||||
AuthRequestId = authRequestId != Guid.Empty ? authRequestId : null;
|
||||
AuthRequestCreatedAt =
|
||||
authRequestCreationDate != DateTime.MinValue ? authRequestCreationDate : null;
|
||||
}
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
|
||||
using Bit.Core.Auth.Entities;
|
||||
using Bit.Core.Auth.Entities;
|
||||
|
||||
namespace Bit.Core.Auth.Models.Data;
|
||||
|
||||
|
@ -23,7 +23,6 @@ namespace Bit.Core.Auth.UserFeatures.Registration.Implementations;
|
||||
|
||||
public class RegisterUserCommand : IRegisterUserCommand
|
||||
{
|
||||
|
||||
private readonly IGlobalSettings _globalSettings;
|
||||
private readonly IOrganizationUserRepository _organizationUserRepository;
|
||||
private readonly IPolicyRepository _policyRepository;
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Bit.Core.Entities;
|
||||
using Bit.Core.Auth.Models.Data;
|
||||
using Bit.Core.Entities;
|
||||
|
||||
#nullable enable
|
||||
|
||||
@ -10,5 +11,9 @@ public interface IDeviceRepository : IRepository<Device, Guid>
|
||||
Task<Device?> GetByIdentifierAsync(string identifier);
|
||||
Task<Device?> GetByIdentifierAsync(string identifier, Guid userId);
|
||||
Task<ICollection<Device>> GetManyByUserIdAsync(Guid userId);
|
||||
// DeviceAuthDetails is passed back to decouple the response model from the
|
||||
// repository in case more fields are ever added to the details response for
|
||||
// other requests.
|
||||
Task<ICollection<DeviceAuthDetails>> GetManyByUserIdWithDeviceAuth(Guid userId);
|
||||
Task ClearPushTokenAsync(Guid id);
|
||||
}
|
||||
|
@ -24,5 +24,7 @@ public interface IGlobalSettings
|
||||
IPasswordlessAuthSettings PasswordlessAuth { get; set; }
|
||||
IDomainVerificationSettings DomainVerification { get; set; }
|
||||
ILaunchDarklySettings LaunchDarkly { get; set; }
|
||||
string DatabaseProvider { get; set; }
|
||||
GlobalSettings.SqlSettings SqlServer { get; set; }
|
||||
string DevelopmentDirectory { get; set; }
|
||||
}
|
||||
|
Reference in New Issue
Block a user